This source file includes following definitions.
- ixgb_probe
- ixgb_attach
- ixgb_power
- ixgb_shutdown
- ixgb_start
- ixgb_ioctl
- ixgb_watchdog
- ixgb_init
- ixgb_intr
- ixgb_media_status
- ixgb_media_change
- ixgb_encap
- ixgb_set_promisc
- ixgb_set_multi
- ixgb_local_timer
- ixgb_update_link_status
- ixgb_stop
- ixgb_identify_hardware
- ixgb_allocate_pci_resources
- ixgb_free_pci_resources
- ixgb_hardware_init
- ixgb_setup_interface
- ixgb_dma_malloc
- ixgb_dma_free
- ixgb_allocate_transmit_structures
- ixgb_setup_transmit_structures
- ixgb_initialize_transmit_unit
- ixgb_free_transmit_structures
- ixgb_transmit_checksum_setup
- ixgb_txeof
- ixgb_get_buf
- ixgb_allocate_receive_structures
- ixgb_setup_receive_structures
- ixgb_initialize_receive_unit
- ixgb_free_receive_structures
- ixgb_rxeof
- ixgb_receive_checksum
- ixgb_enable_intr
- ixgb_disable_intr
- ixgb_write_pci_cfg
- ixgb_update_stats_counters
- ixgb_print_hw_stats
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 #include <dev/pci/if_ixgb.h>
37
38
39
40
41 int ixgb_display_debug_stats = 0;
42
43
44
45
46
47 char ixgb_driver_version[] = "6.1.0";
48
49
50
51
52
53 const struct pci_matchid ixgb_devices[] = {
54 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82597EX },
55 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82597EX_SR },
56 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82597EX_LR },
57 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82597EX_CX4 },
58 };
59
60
61
62
63 int ixgb_probe(struct device *, void *, void *);
64 void ixgb_attach(struct device *, struct device *, void *);
65 void ixgb_shutdown(void *);
66 int ixgb_intr(void *);
67 void ixgb_power(int, void *);
68 void ixgb_start(struct ifnet *);
69 int ixgb_ioctl(struct ifnet *, u_long, caddr_t);
70 void ixgb_watchdog(struct ifnet *);
71 void ixgb_init(void *);
72 void ixgb_stop(void *);
73 void ixgb_media_status(struct ifnet *, struct ifmediareq *);
74 int ixgb_media_change(struct ifnet *);
75 void ixgb_identify_hardware(struct ixgb_softc *);
76 int ixgb_allocate_pci_resources(struct ixgb_softc *);
77 void ixgb_free_pci_resources(struct ixgb_softc *);
78 void ixgb_local_timer(void *);
79 int ixgb_hardware_init(struct ixgb_softc *);
80 void ixgb_setup_interface(struct ixgb_softc *);
81 int ixgb_setup_transmit_structures(struct ixgb_softc *);
82 void ixgb_initialize_transmit_unit(struct ixgb_softc *);
83 int ixgb_setup_receive_structures(struct ixgb_softc *);
84 void ixgb_initialize_receive_unit(struct ixgb_softc *);
85 void ixgb_enable_intr(struct ixgb_softc *);
86 void ixgb_disable_intr(struct ixgb_softc *);
87 void ixgb_free_transmit_structures(struct ixgb_softc *);
88 void ixgb_free_receive_structures(struct ixgb_softc *);
89 void ixgb_update_stats_counters(struct ixgb_softc *);
90 void ixgb_txeof(struct ixgb_softc *);
91 int ixgb_allocate_receive_structures(struct ixgb_softc *);
92 int ixgb_allocate_transmit_structures(struct ixgb_softc *);
93 void ixgb_rxeof(struct ixgb_softc *, int);
94 void
95 ixgb_receive_checksum(struct ixgb_softc *,
96 struct ixgb_rx_desc * rx_desc,
97 struct mbuf *);
98 void
99 ixgb_transmit_checksum_setup(struct ixgb_softc *,
100 struct mbuf *,
101 u_int8_t *);
102 void ixgb_set_promisc(struct ixgb_softc *);
103 void ixgb_set_multi(struct ixgb_softc *);
104 void ixgb_print_hw_stats(struct ixgb_softc *);
105 void ixgb_update_link_status(struct ixgb_softc *);
106 int
107 ixgb_get_buf(struct ixgb_softc *, int i,
108 struct mbuf *);
109 int ixgb_encap(struct ixgb_softc *, struct mbuf *);
110 int
111 ixgb_dma_malloc(struct ixgb_softc *, bus_size_t,
112 struct ixgb_dma_alloc *, int);
113 void ixgb_dma_free(struct ixgb_softc *, struct ixgb_dma_alloc *);
114
115
116
117
118
119 struct cfattach ixgb_ca = {
120 sizeof(struct ixgb_softc), ixgb_probe, ixgb_attach
121 };
122
123 struct cfdriver ixgb_cd = {
124 0, "ixgb", DV_IFNET
125 };
126
127
128 #define RXDCTL_PTHRESH_DEFAULT 0
129 #define RXDCTL_HTHRESH_DEFAULT 0
130
131
132 #define RXDCTL_WTHRESH_DEFAULT 0
133
134
135
136
137
138
139
140
141
142
143
144 int
145 ixgb_probe(struct device *parent, void *match, void *aux)
146 {
147 INIT_DEBUGOUT("ixgb_probe: begin");
148
149 return (pci_matchbyid((struct pci_attach_args *)aux, ixgb_devices,
150 sizeof(ixgb_devices)/sizeof(ixgb_devices[0])));
151 }
152
153
154
155
156
157
158
159
160
161
162 void
163 ixgb_attach(struct device *parent, struct device *self, void *aux)
164 {
165 struct pci_attach_args *pa = aux;
166 struct ixgb_softc *sc;
167 int tsize, rsize;
168
169 INIT_DEBUGOUT("ixgb_attach: begin");
170
171 sc = (struct ixgb_softc *)self;
172 sc->osdep.ixgb_pa = *pa;
173
174 timeout_set(&sc->timer_handle, ixgb_local_timer, sc);
175
176
177 ixgb_identify_hardware(sc);
178
179
180 sc->num_tx_desc = IXGB_MAX_TXD;
181 sc->num_rx_desc = IXGB_MAX_RXD;
182 sc->tx_int_delay = TIDV;
183 sc->rx_int_delay = RDTR;
184 sc->rx_buffer_len = IXGB_RXBUFFER_2048;
185
186
187
188
189
190 sc->hw.fc.high_water = FCRTH;
191 sc->hw.fc.low_water = FCRTL;
192 sc->hw.fc.pause_time = FCPAUSE;
193 sc->hw.fc.send_xon = TRUE;
194 sc->hw.fc.type = FLOW_CONTROL;
195
196
197 sc->hw.max_frame_size = IXGB_MAX_JUMBO_FRAME_SIZE;
198
199 if (ixgb_allocate_pci_resources(sc)) {
200 printf("%s: Allocation of PCI resources failed\n",
201 sc->sc_dv.dv_xname);
202 goto err_pci;
203 }
204
205 tsize = IXGB_ROUNDUP(sc->num_tx_desc * sizeof(struct ixgb_tx_desc),
206 IXGB_MAX_TXD * sizeof(struct ixgb_tx_desc));
207 tsize = IXGB_ROUNDUP(tsize, PAGE_SIZE);
208
209
210 if (ixgb_dma_malloc(sc, tsize, &sc->txdma, BUS_DMA_NOWAIT)) {
211 printf("%s: Unable to allocate TxDescriptor memory\n",
212 sc->sc_dv.dv_xname);
213 goto err_tx_desc;
214 }
215 sc->tx_desc_base = (struct ixgb_tx_desc *) sc->txdma.dma_vaddr;
216
217 rsize = IXGB_ROUNDUP(sc->num_rx_desc * sizeof(struct ixgb_rx_desc),
218 IXGB_MAX_RXD * sizeof(struct ixgb_rx_desc));
219 rsize = IXGB_ROUNDUP(rsize, PAGE_SIZE);
220
221
222 if (ixgb_dma_malloc(sc, rsize, &sc->rxdma, BUS_DMA_NOWAIT)) {
223 printf("%s: Unable to allocate rx_desc memory\n",
224 sc->sc_dv.dv_xname);
225 goto err_rx_desc;
226 }
227 sc->rx_desc_base = (struct ixgb_rx_desc *) sc->rxdma.dma_vaddr;
228
229
230 if (ixgb_hardware_init(sc)) {
231 printf("%s: Unable to initialize the hardware\n",
232 sc->sc_dv.dv_xname);
233 goto err_hw_init;
234 }
235
236
237 ixgb_setup_interface(sc);
238
239
240 ixgb_clear_hw_cntrs(&sc->hw);
241 ixgb_update_stats_counters(sc);
242 ixgb_update_link_status(sc);
243
244 printf(", address %s\n", ether_sprintf(sc->interface_data.ac_enaddr));
245
246 INIT_DEBUGOUT("ixgb_attach: end");
247 sc->sc_powerhook = powerhook_establish(ixgb_power, sc);
248 sc->sc_shutdownhook = shutdownhook_establish(ixgb_shutdown, sc);
249 return;
250
251 err_hw_init:
252 ixgb_dma_free(sc, &sc->rxdma);
253 err_rx_desc:
254 ixgb_dma_free(sc, &sc->txdma);
255 err_tx_desc:
256 err_pci:
257 ixgb_free_pci_resources(sc);
258 }
259
260 void
261 ixgb_power(int why, void *arg)
262 {
263 struct ixgb_softc *sc = (struct ixgb_softc *)arg;
264 struct ifnet *ifp;
265
266 if (why == PWR_RESUME) {
267 ifp = &sc->interface_data.ac_if;
268 if (ifp->if_flags & IFF_UP)
269 ixgb_init(sc);
270 }
271 }
272
273
274
275
276
277
278
279 void
280 ixgb_shutdown(void *arg)
281 {
282 struct ixgb_softc *sc = arg;
283
284 ixgb_stop(sc);
285 }
286
287
288
289
290
291
292
293
294
295
296
297 void
298 ixgb_start(struct ifnet *ifp)
299 {
300 struct mbuf *m_head;
301 struct ixgb_softc *sc = ifp->if_softc;
302
303 if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
304 return;
305
306 if (!sc->link_active)
307 return;
308
309 for (;;) {
310 IFQ_POLL(&ifp->if_snd, m_head);
311
312 if (m_head == NULL)
313 break;
314
315 if (ixgb_encap(sc, m_head)) {
316 ifp->if_flags |= IFF_OACTIVE;
317 break;
318 }
319
320 IFQ_DEQUEUE(&ifp->if_snd, m_head);
321
322 #if NBPFILTER > 0
323
324 if (ifp->if_bpf)
325 bpf_mtap(ifp->if_bpf, m_head, BPF_DIRECTION_OUT);
326 #endif
327
328
329 ifp->if_timer = IXGB_TX_TIMEOUT;
330 }
331 }
332
333
334
335
336
337
338
339
340
341
342 int
343 ixgb_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
344 {
345 int s, error = 0;
346 struct ifreq *ifr = (struct ifreq *) data;
347 struct ifaddr *ifa = (struct ifaddr *)data;
348 struct ixgb_softc *sc = ifp->if_softc;
349
350 s = splnet();
351
352 if ((error = ether_ioctl(ifp, &sc->interface_data, command, data)) > 0) {
353 splx(s);
354 return (error);
355 }
356
357 switch (command) {
358 case SIOCSIFADDR:
359 IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFADDR (Set Interface "
360 "Addr)");
361 ifp->if_flags |= IFF_UP;
362 if (!(ifp->if_flags & IFF_RUNNING))
363 ixgb_init(sc);
364 #ifdef INET
365 if (ifa->ifa_addr->sa_family == AF_INET)
366 arp_ifinit(&sc->interface_data, ifa);
367 #endif
368 break;
369 case SIOCSIFMTU:
370 IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFMTU (Set Interface MTU)");
371 if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ifp->if_hardmtu)
372 error = EINVAL;
373 else if (ifp->if_mtu != ifr->ifr_mtu)
374 ifp->if_mtu = ifr->ifr_mtu;
375 break;
376 case SIOCSIFFLAGS:
377 IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFFLAGS (Set Interface Flags)");
378 if (ifp->if_flags & IFF_UP) {
379
380
381
382
383
384 if ((ifp->if_flags & IFF_RUNNING) &&
385 ((ifp->if_flags ^ sc->if_flags) &
386 (IFF_ALLMULTI | IFF_PROMISC)) != 0) {
387 ixgb_set_promisc(sc);
388 } else {
389 if (!(ifp->if_flags & IFF_RUNNING))
390 ixgb_init(sc);
391 }
392 } else {
393 if (ifp->if_flags & IFF_RUNNING)
394 ixgb_stop(sc);
395 }
396 sc->if_flags = ifp->if_flags;
397 break;
398 case SIOCADDMULTI:
399 case SIOCDELMULTI:
400 IOCTL_DEBUGOUT("ioctl rcv'd: SIOC(ADD|DEL)MULTI");
401 error = (command == SIOCADDMULTI)
402 ? ether_addmulti(ifr, &sc->interface_data)
403 : ether_delmulti(ifr, &sc->interface_data);
404
405 if (error == ENETRESET) {
406 if (ifp->if_flags & IFF_RUNNING) {
407 ixgb_disable_intr(sc);
408 ixgb_set_multi(sc);
409 ixgb_enable_intr(sc);
410 }
411 error = 0;
412 }
413 break;
414 case SIOCSIFMEDIA:
415 case SIOCGIFMEDIA:
416 IOCTL_DEBUGOUT("ioctl rcv'd: SIOCxIFMEDIA (Get/Set Interface Media)");
417 error = ifmedia_ioctl(ifp, ifr, &sc->media, command);
418 break;
419 default:
420 IOCTL_DEBUGOUT1("ioctl received: UNKNOWN (0x%X)\n", (int)command);
421 error = ENOTTY;
422 }
423
424 splx(s);
425 return (error);
426 }
427
428
429
430
431
432
433
434
435 void
436 ixgb_watchdog(struct ifnet * ifp)
437 {
438 struct ixgb_softc *sc = ifp->if_softc;
439
440
441
442
443
444 if (IXGB_READ_REG(&sc->hw, STATUS) & IXGB_STATUS_TXOFF) {
445 ifp->if_timer = IXGB_TX_TIMEOUT;
446 return;
447 }
448
449 printf("%s: watchdog timeout -- resetting\n", sc->sc_dv.dv_xname);
450
451 ixgb_init(sc);
452
453 sc->watchdog_events++;
454 }
455
456
457
458
459
460
461
462
463
464
465
466 void
467 ixgb_init(void *arg)
468 {
469 struct ixgb_softc *sc = arg;
470 struct ifnet *ifp = &sc->interface_data.ac_if;
471 uint32_t temp_reg;
472 int s;
473
474 INIT_DEBUGOUT("ixgb_init: begin");
475
476 s = splnet();
477
478 ixgb_stop(sc);
479
480
481 bcopy(sc->interface_data.ac_enaddr, sc->hw.curr_mac_addr,
482 IXGB_ETH_LENGTH_OF_ADDRESS);
483
484
485 if (ixgb_hardware_init(sc)) {
486 printf("%s: Unable to initialize the hardware\n",
487 sc->sc_dv.dv_xname);
488 splx(s);
489 return;
490 }
491
492
493 if (ixgb_setup_transmit_structures(sc)) {
494 printf("%s: Could not setup transmit structures\n",
495 sc->sc_dv.dv_xname);
496 ixgb_stop(sc);
497 splx(s);
498 return;
499 }
500 ixgb_initialize_transmit_unit(sc);
501
502
503 ixgb_set_multi(sc);
504
505
506 if (ixgb_setup_receive_structures(sc)) {
507 printf("%s: Could not setup receive structures\n",
508 sc->sc_dv.dv_xname);
509 ixgb_stop(sc);
510 splx(s);
511 return;
512 }
513 ixgb_initialize_receive_unit(sc);
514
515
516 ixgb_set_promisc(sc);
517
518 ifp->if_flags |= IFF_RUNNING;
519 ifp->if_flags &= ~IFF_OACTIVE;
520
521
522 IXGB_WRITE_REG(&sc->hw, MFRMS,
523 sc->hw.max_frame_size << IXGB_MFRMS_SHIFT);
524 temp_reg = IXGB_READ_REG(&sc->hw, CTRL0);
525 temp_reg |= IXGB_CTRL0_JFE;
526 IXGB_WRITE_REG(&sc->hw, CTRL0, temp_reg);
527
528 timeout_add(&sc->timer_handle, hz);
529 ixgb_clear_hw_cntrs(&sc->hw);
530 ixgb_enable_intr(sc);
531
532 splx(s);
533 }
534
535
536
537
538
539
540
541 int
542 ixgb_intr(void *arg)
543 {
544 struct ixgb_softc *sc = arg;
545 struct ifnet *ifp;
546 u_int32_t reg_icr;
547 boolean_t rxdmt0 = FALSE;
548 int claimed = 0;
549
550 ifp = &sc->interface_data.ac_if;
551
552 for (;;) {
553 reg_icr = IXGB_READ_REG(&sc->hw, ICR);
554 if (reg_icr == 0)
555 break;
556
557 claimed = 1;
558
559 if (reg_icr & IXGB_INT_RXDMT0)
560 rxdmt0 = TRUE;
561
562 if (ifp->if_flags & IFF_RUNNING) {
563 ixgb_rxeof(sc, -1);
564 ixgb_txeof(sc);
565 }
566
567
568 if (reg_icr & (IXGB_INT_RXSEQ | IXGB_INT_LSC)) {
569 timeout_del(&sc->timer_handle);
570 ixgb_check_for_link(&sc->hw);
571 ixgb_update_link_status(sc);
572 timeout_add(&sc->timer_handle, hz);
573 }
574
575 if (rxdmt0 && sc->raidc) {
576 IXGB_WRITE_REG(&sc->hw, IMC, IXGB_INT_RXDMT0);
577 IXGB_WRITE_REG(&sc->hw, IMS, IXGB_INT_RXDMT0);
578 }
579 }
580
581 if (ifp->if_flags & IFF_RUNNING && !IFQ_IS_EMPTY(&ifp->if_snd))
582 ixgb_start(ifp);
583
584 return (claimed);
585 }
586
587
588
589
590
591
592
593
594
595
596 void
597 ixgb_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
598 {
599 struct ixgb_softc *sc = ifp->if_softc;
600
601 INIT_DEBUGOUT("ixgb_media_status: begin");
602
603 ixgb_check_for_link(&sc->hw);
604 ixgb_update_link_status(sc);
605
606 ifmr->ifm_status = IFM_AVALID;
607 ifmr->ifm_active = IFM_ETHER;
608
609 if (!sc->hw.link_up) {
610 ifmr->ifm_active |= IFM_NONE;
611 return;
612 }
613
614 ifmr->ifm_status |= IFM_ACTIVE;
615 if ((sc->hw.phy_type == ixgb_phy_type_g6104) ||
616 (sc->hw.phy_type == ixgb_phy_type_txn17401))
617 ifmr->ifm_active |= IFM_10G_LR | IFM_FDX;
618 else
619 ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
620
621 return;
622 }
623
624
625
626
627
628
629
630
631
632 int
633 ixgb_media_change(struct ifnet * ifp)
634 {
635 struct ixgb_softc *sc = ifp->if_softc;
636 struct ifmedia *ifm = &sc->media;
637
638 INIT_DEBUGOUT("ixgb_media_change: begin");
639
640 if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
641 return (EINVAL);
642
643 return (0);
644 }
645
646
647
648
649
650
651
652
653 int
654 ixgb_encap(struct ixgb_softc *sc, struct mbuf *m_head)
655 {
656 u_int8_t txd_popts;
657 int i, j, error = 0;
658 bus_dmamap_t map;
659
660 struct ixgb_buffer *tx_buffer;
661 struct ixgb_tx_desc *current_tx_desc = NULL;
662
663
664
665
666
667 if (sc->num_tx_desc_avail <= IXGB_TX_CLEANUP_THRESHOLD) {
668 ixgb_txeof(sc);
669
670 if (sc->num_tx_desc_avail <= IXGB_TX_CLEANUP_THRESHOLD) {
671 sc->no_tx_desc_avail1++;
672 return (ENOBUFS);
673 }
674 }
675
676
677
678
679 tx_buffer = &sc->tx_buffer_area[sc->next_avail_tx_desc];
680 map = tx_buffer->map;
681
682 error = bus_dmamap_load_mbuf(sc->txtag, map,
683 m_head, BUS_DMA_NOWAIT);
684 if (error != 0) {
685 sc->no_tx_dma_setup++;
686 return (error);
687 }
688 IXGB_KASSERT(map->dm_nsegs != 0, ("ixgb_encap: empty packet"));
689
690 if (map->dm_nsegs > sc->num_tx_desc_avail)
691 goto fail;
692
693 #ifdef IXGB_CSUM_OFFLOAD
694 ixgb_transmit_checksum_setup(sc, m_head, &txd_popts);
695 #else
696 txd_popts = 0;
697 #endif
698
699 i = sc->next_avail_tx_desc;
700 for (j = 0; j < map->dm_nsegs; j++) {
701 tx_buffer = &sc->tx_buffer_area[i];
702 current_tx_desc = &sc->tx_desc_base[i];
703
704 current_tx_desc->buff_addr = htole64(map->dm_segs[j].ds_addr);
705 current_tx_desc->cmd_type_len = htole32((sc->txd_cmd | map->dm_segs[j].ds_len));
706 current_tx_desc->popts = txd_popts;
707 if (++i == sc->num_tx_desc)
708 i = 0;
709
710 tx_buffer->m_head = NULL;
711 }
712
713 sc->num_tx_desc_avail -= map->dm_nsegs;
714 sc->next_avail_tx_desc = i;
715
716 tx_buffer->m_head = m_head;
717 bus_dmamap_sync(sc->txtag, map, 0, map->dm_mapsize,
718 BUS_DMASYNC_PREWRITE);
719
720
721
722
723 current_tx_desc->cmd_type_len |= htole32(IXGB_TX_DESC_CMD_EOP);
724
725
726
727
728
729 bus_dmamap_sync(sc->txdma.dma_tag, sc->txdma.dma_map, 0,
730 sc->txdma.dma_map->dm_mapsize,
731 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
732 IXGB_WRITE_REG(&sc->hw, TDT, i);
733
734 return (0);
735
736 fail:
737 sc->no_tx_desc_avail2++;
738 bus_dmamap_unload(sc->txtag, map);
739 return (ENOBUFS);
740 }
741
742 void
743 ixgb_set_promisc(struct ixgb_softc *sc)
744 {
745
746 u_int32_t reg_rctl;
747 struct ifnet *ifp = &sc->interface_data.ac_if;
748
749 reg_rctl = IXGB_READ_REG(&sc->hw, RCTL);
750
751 if (ifp->if_flags & IFF_PROMISC) {
752 reg_rctl |= (IXGB_RCTL_UPE | IXGB_RCTL_MPE);
753 } else if (ifp->if_flags & IFF_ALLMULTI) {
754 reg_rctl |= IXGB_RCTL_MPE;
755 reg_rctl &= ~IXGB_RCTL_UPE;
756 } else {
757 reg_rctl &= ~(IXGB_RCTL_UPE | IXGB_RCTL_MPE);
758 }
759 IXGB_WRITE_REG(&sc->hw, RCTL, reg_rctl);
760 }
761
762
763
764
765
766
767
768
769 void
770 ixgb_set_multi(struct ixgb_softc *sc)
771 {
772 u_int32_t reg_rctl = 0;
773 u_int8_t mta[MAX_NUM_MULTICAST_ADDRESSES * IXGB_ETH_LENGTH_OF_ADDRESS];
774 int mcnt = 0;
775 struct ifnet *ifp = &sc->interface_data.ac_if;
776 struct arpcom *ac = &sc->interface_data;
777 struct ether_multi *enm;
778 struct ether_multistep step;
779
780 IOCTL_DEBUGOUT("ixgb_set_multi: begin");
781
782 ETHER_FIRST_MULTI(step, ac, enm);
783 while (enm != NULL) {
784 if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
785 ifp->if_flags |= IFF_ALLMULTI;
786 mcnt = MAX_NUM_MULTICAST_ADDRESSES;
787 }
788 if (mcnt == MAX_NUM_MULTICAST_ADDRESSES)
789 break;
790 bcopy(enm->enm_addrlo, &mta[mcnt*IXGB_ETH_LENGTH_OF_ADDRESS],
791 IXGB_ETH_LENGTH_OF_ADDRESS);
792 mcnt++;
793 ETHER_NEXT_MULTI(step, enm);
794 }
795
796 if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES) {
797 reg_rctl = IXGB_READ_REG(&sc->hw, RCTL);
798 reg_rctl |= IXGB_RCTL_MPE;
799 IXGB_WRITE_REG(&sc->hw, RCTL, reg_rctl);
800 } else
801 ixgb_mc_addr_list_update(&sc->hw, mta, mcnt, 0);
802 }
803
804
805
806
807
808
809
810
811
812 void
813 ixgb_local_timer(void *arg)
814 {
815 struct ifnet *ifp;
816 struct ixgb_softc *sc = arg;
817 int s;
818
819 ifp = &sc->interface_data.ac_if;
820
821 s = splnet();
822
823 ixgb_check_for_link(&sc->hw);
824 ixgb_update_link_status(sc);
825 ixgb_update_stats_counters(sc);
826 if (ixgb_display_debug_stats && ifp->if_flags & IFF_RUNNING)
827 ixgb_print_hw_stats(sc);
828
829 timeout_add(&sc->timer_handle, hz);
830
831 splx(s);
832 }
833
834 void
835 ixgb_update_link_status(struct ixgb_softc *sc)
836 {
837 struct ifnet *ifp = &sc->interface_data.ac_if;
838
839 if (sc->hw.link_up) {
840 if (!sc->link_active) {
841 ifp->if_baudrate = 1000000000;
842 sc->link_active = 1;
843 ifp->if_link_state = LINK_STATE_FULL_DUPLEX;
844 if_link_state_change(ifp);
845 }
846 } else {
847 if (sc->link_active) {
848 ifp->if_baudrate = 0;
849 sc->link_active = 0;
850 ifp->if_link_state = LINK_STATE_DOWN;
851 if_link_state_change(ifp);
852 }
853 }
854 }
855
856
857
858
859
860
861
862
863 void
864 ixgb_stop(void *arg)
865 {
866 struct ifnet *ifp;
867 struct ixgb_softc *sc = arg;
868 ifp = &sc->interface_data.ac_if;
869
870 INIT_DEBUGOUT("ixgb_stop: begin\n");
871 ixgb_disable_intr(sc);
872 sc->hw.adapter_stopped = FALSE;
873 ixgb_adapter_stop(&sc->hw);
874 timeout_del(&sc->timer_handle);
875
876
877 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
878
879 ixgb_free_transmit_structures(sc);
880 ixgb_free_receive_structures(sc);
881 }
882
883
884
885
886
887
888
889 void
890 ixgb_identify_hardware(struct ixgb_softc *sc)
891 {
892 u_int32_t reg;
893 struct pci_attach_args *pa = &sc->osdep.ixgb_pa;
894
895
896 sc->hw.pci_cmd_word = pci_conf_read(pa->pa_pc, pa->pa_tag,
897 PCI_COMMAND_STATUS_REG);
898
899
900 sc->hw.vendor_id = PCI_VENDOR(pa->pa_id);
901 sc->hw.device_id = PCI_PRODUCT(pa->pa_id);
902
903 reg = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG);
904 sc->hw.revision_id = PCI_REVISION(reg);
905
906 reg = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
907 sc->hw.subsystem_vendor_id = PCI_VENDOR(reg);
908 sc->hw.subsystem_id = PCI_PRODUCT(reg);
909
910
911 switch (sc->hw.device_id) {
912 case IXGB_DEVICE_ID_82597EX:
913 case IXGB_DEVICE_ID_82597EX_SR:
914 case IXGB_DEVICE_ID_82597EX_LR:
915 case IXGB_DEVICE_ID_82597EX_CX4:
916 sc->hw.mac_type = ixgb_82597;
917 break;
918 default:
919 INIT_DEBUGOUT1("Unknown device if 0x%x", sc->hw.device_id);
920 printf("%s: unsupported device id 0x%x\n",
921 sc->sc_dv.dv_xname, sc->hw.device_id);
922 }
923 }
924
925 int
926 ixgb_allocate_pci_resources(struct ixgb_softc *sc)
927
928 {
929 int val;
930 pci_intr_handle_t ih;
931 const char *intrstr = NULL;
932 struct pci_attach_args *pa = &sc->osdep.ixgb_pa;
933 pci_chipset_tag_t pc = pa->pa_pc;
934
935 val = pci_conf_read(pa->pa_pc, pa->pa_tag, IXGB_MMBA);
936 if (PCI_MAPREG_TYPE(val) != PCI_MAPREG_TYPE_MEM) {
937 printf(": mmba is not mem space\n");
938 return (ENXIO);
939 }
940 if (pci_mapreg_map(pa, IXGB_MMBA, PCI_MAPREG_MEM_TYPE(val), 0,
941 &sc->osdep.mem_bus_space_tag, &sc->osdep.mem_bus_space_handle,
942 &sc->osdep.ixgb_membase, &sc->osdep.ixgb_memsize, 0)) {
943 printf(": cannot find mem space\n");
944 return (ENXIO);
945 }
946
947 if (pci_intr_map(pa, &ih)) {
948 printf(": couldn't map interrupt\n");
949 return (ENXIO);
950 }
951
952 sc->hw.back = &sc->osdep;
953
954 intrstr = pci_intr_string(pc, ih);
955 sc->sc_intrhand = pci_intr_establish(pc, ih, IPL_NET, ixgb_intr, sc,
956 sc->sc_dv.dv_xname);
957 if (sc->sc_intrhand == NULL) {
958 printf(": couldn't establish interrupt");
959 if (intrstr != NULL)
960 printf(" at %s", intrstr);
961 printf("\n");
962 return (ENXIO);
963 }
964 printf(": %s", intrstr);
965
966 return (0);
967 }
968
969 void
970 ixgb_free_pci_resources(struct ixgb_softc *sc)
971 {
972 struct pci_attach_args *pa = &sc->osdep.ixgb_pa;
973 pci_chipset_tag_t pc = pa->pa_pc;
974
975 if (sc->sc_intrhand)
976 pci_intr_disestablish(pc, sc->sc_intrhand);
977 sc->sc_intrhand = 0;
978
979 if (sc->osdep.ixgb_membase)
980 bus_space_unmap(sc->osdep.mem_bus_space_tag, sc->osdep.mem_bus_space_handle,
981 sc->osdep.ixgb_memsize);
982 sc->osdep.ixgb_membase = 0;
983 }
984
985
986
987
988
989
990
991
992
993 int
994 ixgb_hardware_init(struct ixgb_softc *sc)
995 {
996
997 sc->hw.adapter_stopped = FALSE;
998 ixgb_adapter_stop(&sc->hw);
999
1000
1001 if (!ixgb_validate_eeprom_checksum(&sc->hw)) {
1002 printf("%s: The EEPROM Checksum Is Not Valid\n",
1003 sc->sc_dv.dv_xname);
1004 return (EIO);
1005 }
1006 if (!ixgb_init_hw(&sc->hw)) {
1007 printf("%s: Hardware Initialization Failed",
1008 sc->sc_dv.dv_xname);
1009 return (EIO);
1010 }
1011 bcopy(sc->hw.curr_mac_addr, sc->interface_data.ac_enaddr,
1012 IXGB_ETH_LENGTH_OF_ADDRESS);
1013
1014 return (0);
1015 }
1016
1017
1018
1019
1020
1021
1022 void
1023 ixgb_setup_interface(struct ixgb_softc *sc)
1024 {
1025 struct ifnet *ifp;
1026 INIT_DEBUGOUT("ixgb_setup_interface: begin");
1027
1028 ifp = &sc->interface_data.ac_if;
1029 strlcpy(ifp->if_xname, sc->sc_dv.dv_xname, IFNAMSIZ);
1030
1031 ifp->if_softc = sc;
1032 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1033 ifp->if_ioctl = ixgb_ioctl;
1034 ifp->if_start = ixgb_start;
1035 ifp->if_watchdog = ixgb_watchdog;
1036 ifp->if_hardmtu =
1037 IXGB_MAX_JUMBO_FRAME_SIZE - ETHER_HDR_LEN - ETHER_CRC_LEN;
1038 IFQ_SET_MAXLEN(&ifp->if_snd, sc->num_tx_desc - 1);
1039 IFQ_SET_READY(&ifp->if_snd);
1040
1041 ifp->if_capabilities = IFCAP_VLAN_MTU;
1042
1043 #ifdef IXGB_CSUM_OFFLOAD
1044 ifp->if_capabilities |= IFCAP_CSUM_TCPv4|IFCAP_CSUM_UDPv4;
1045 #endif
1046
1047
1048
1049
1050
1051 ifmedia_init(&sc->media, IFM_IMASK, ixgb_media_change,
1052 ixgb_media_status);
1053 if ((sc->hw.phy_type == ixgb_phy_type_g6104) ||
1054 (sc->hw.phy_type == ixgb_phy_type_txn17401)) {
1055 ifmedia_add(&sc->media, IFM_ETHER | IFM_10G_LR |
1056 IFM_FDX, 0, NULL);
1057 } else {
1058 ifmedia_add(&sc->media, IFM_ETHER | IFM_10G_SR |
1059 IFM_FDX, 0, NULL);
1060 }
1061 ifmedia_add(&sc->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1062 ifmedia_set(&sc->media, IFM_ETHER | IFM_AUTO);
1063
1064 if_attach(ifp);
1065 ether_ifattach(ifp);
1066 }
1067
1068
1069
1070
1071 int
1072 ixgb_dma_malloc(struct ixgb_softc *sc, bus_size_t size,
1073 struct ixgb_dma_alloc * dma, int mapflags)
1074 {
1075 int r;
1076
1077 dma->dma_tag = sc->osdep.ixgb_pa.pa_dmat;
1078 r = bus_dmamap_create(dma->dma_tag, size, 1,
1079 size, 0, BUS_DMA_NOWAIT, &dma->dma_map);
1080 if (r != 0) {
1081 printf("%s: ixgb_dma_malloc: bus_dmamap_create failed; "
1082 "error %u\n", sc->sc_dv.dv_xname, r);
1083 goto fail_0;
1084 }
1085
1086 r = bus_dmamem_alloc(dma->dma_tag, size, PAGE_SIZE, 0, &dma->dma_seg,
1087 1, &dma->dma_nseg, BUS_DMA_NOWAIT);
1088 if (r != 0) {
1089 printf("%s: ixgb_dma_malloc: bus_dmammem_alloc failed; "
1090 "size %lu, error %d\n", sc->sc_dv.dv_xname,
1091 (unsigned long)size, r);
1092 goto fail_1;
1093 }
1094
1095 r = bus_dmamem_map(dma->dma_tag, &dma->dma_seg, dma->dma_nseg, size,
1096 &dma->dma_vaddr, BUS_DMA_NOWAIT);
1097 if (r != 0) {
1098 printf("%s: ixgb_dma_malloc: bus_dmammem_map failed; "
1099 "size %lu, error %d\n", sc->sc_dv.dv_xname,
1100 (unsigned long)size, r);
1101 goto fail_2;
1102 }
1103
1104 r = bus_dmamap_load(sc->osdep.ixgb_pa.pa_dmat, dma->dma_map,
1105 dma->dma_vaddr,
1106 size,
1107 NULL,
1108 mapflags | BUS_DMA_NOWAIT);
1109 if (r != 0) {
1110 printf("%s: ixgb_dma_malloc: bus_dmamap_load failed; "
1111 "error %u\n", sc->sc_dv.dv_xname, r);
1112 goto fail_3;
1113 }
1114
1115 dma->dma_size = size;
1116 return (0);
1117
1118 fail_3:
1119 bus_dmamem_unmap(dma->dma_tag, dma->dma_vaddr, size);
1120 fail_2:
1121 bus_dmamem_free(dma->dma_tag, &dma->dma_seg, dma->dma_nseg);
1122 fail_1:
1123 bus_dmamap_destroy(dma->dma_tag, dma->dma_map);
1124 fail_0:
1125 dma->dma_map = NULL;
1126 dma->dma_tag = NULL;
1127
1128 return (r);
1129 }
1130
1131 void
1132 ixgb_dma_free(struct ixgb_softc *sc, struct ixgb_dma_alloc *dma)
1133 {
1134 if (dma->dma_tag == NULL)
1135 return;
1136
1137 if (dma->dma_map != NULL) {
1138 bus_dmamap_sync(dma->dma_tag, dma->dma_map, 0,
1139 dma->dma_map->dm_mapsize,
1140 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
1141 bus_dmamap_unload(dma->dma_tag, dma->dma_map);
1142 bus_dmamem_unmap(dma->dma_tag, dma->dma_vaddr, dma->dma_size);
1143 bus_dmamem_free(dma->dma_tag, &dma->dma_seg, dma->dma_nseg);
1144 bus_dmamap_destroy(dma->dma_tag, dma->dma_map);
1145 }
1146 }
1147
1148
1149
1150
1151
1152
1153
1154 int
1155 ixgb_allocate_transmit_structures(struct ixgb_softc *sc)
1156 {
1157 if (!(sc->tx_buffer_area =
1158 (struct ixgb_buffer *) malloc(sizeof(struct ixgb_buffer) *
1159 sc->num_tx_desc, M_DEVBUF,
1160 M_NOWAIT))) {
1161 printf("%s: Unable to allocate tx_buffer memory\n",
1162 sc->sc_dv.dv_xname);
1163 return (ENOMEM);
1164 }
1165 bzero(sc->tx_buffer_area,
1166 sizeof(struct ixgb_buffer) * sc->num_tx_desc);
1167
1168 return (0);
1169 }
1170
1171
1172
1173
1174
1175
1176 int
1177 ixgb_setup_transmit_structures(struct ixgb_softc *sc)
1178 {
1179 struct ixgb_buffer *tx_buffer;
1180 int error, i;
1181
1182 if ((error = ixgb_allocate_transmit_structures(sc)) != 0)
1183 goto fail;
1184
1185 bzero((void *)sc->tx_desc_base,
1186 (sizeof(struct ixgb_tx_desc)) * sc->num_tx_desc);
1187
1188 sc->txtag = sc->osdep.ixgb_pa.pa_dmat;
1189
1190 tx_buffer = sc->tx_buffer_area;
1191 for (i = 0; i < sc->num_tx_desc; i++) {
1192 error = bus_dmamap_create(sc->txtag, IXGB_MAX_JUMBO_FRAME_SIZE,
1193 IXGB_MAX_SCATTER, IXGB_MAX_JUMBO_FRAME_SIZE, 0,
1194 BUS_DMA_NOWAIT, &tx_buffer->map);
1195 if (error != 0) {
1196 printf("%s: Unable to create TX DMA map\n",
1197 sc->sc_dv.dv_xname);
1198 goto fail;
1199 }
1200 tx_buffer++;
1201 }
1202
1203 sc->next_avail_tx_desc = 0;
1204 sc->oldest_used_tx_desc = 0;
1205
1206
1207 sc->num_tx_desc_avail = sc->num_tx_desc;
1208
1209
1210 sc->active_checksum_context = OFFLOAD_NONE;
1211 bus_dmamap_sync(sc->txdma.dma_tag, sc->txdma.dma_map, 0,
1212 sc->txdma.dma_size, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1213
1214 return (0);
1215
1216 fail:
1217 ixgb_free_transmit_structures(sc);
1218 return (error);
1219 }
1220
1221
1222
1223
1224
1225
1226 void
1227 ixgb_initialize_transmit_unit(struct ixgb_softc *sc)
1228 {
1229 u_int32_t reg_tctl;
1230 u_int64_t bus_addr;
1231
1232
1233 bus_addr = sc->txdma.dma_map->dm_segs[0].ds_addr;
1234 IXGB_WRITE_REG(&sc->hw, TDBAL, (u_int32_t)bus_addr);
1235 IXGB_WRITE_REG(&sc->hw, TDBAH, (u_int32_t)(bus_addr >> 32));
1236 IXGB_WRITE_REG(&sc->hw, TDLEN,
1237 sc->num_tx_desc *
1238 sizeof(struct ixgb_tx_desc));
1239
1240
1241 IXGB_WRITE_REG(&sc->hw, TDH, 0);
1242 IXGB_WRITE_REG(&sc->hw, TDT, 0);
1243
1244 HW_DEBUGOUT2("Base = %x, Length = %x\n",
1245 IXGB_READ_REG(&sc->hw, TDBAL),
1246 IXGB_READ_REG(&sc->hw, TDLEN));
1247
1248 IXGB_WRITE_REG(&sc->hw, TIDV, sc->tx_int_delay);
1249
1250
1251 reg_tctl = IXGB_READ_REG(&sc->hw, TCTL);
1252 reg_tctl = IXGB_TCTL_TCE | IXGB_TCTL_TXEN | IXGB_TCTL_TPDE;
1253 IXGB_WRITE_REG(&sc->hw, TCTL, reg_tctl);
1254
1255
1256 sc->txd_cmd = IXGB_TX_DESC_TYPE | IXGB_TX_DESC_CMD_RS;
1257
1258 if (sc->tx_int_delay > 0)
1259 sc->txd_cmd |= IXGB_TX_DESC_CMD_IDE;
1260 }
1261
1262
1263
1264
1265
1266
1267 void
1268 ixgb_free_transmit_structures(struct ixgb_softc *sc)
1269 {
1270 struct ixgb_buffer *tx_buffer;
1271 int i;
1272
1273 INIT_DEBUGOUT("free_transmit_structures: begin");
1274
1275 if (sc->tx_buffer_area != NULL) {
1276 tx_buffer = sc->tx_buffer_area;
1277 for (i = 0; i < sc->num_tx_desc; i++, tx_buffer++) {
1278 if (tx_buffer->map != NULL &&
1279 tx_buffer->map->dm_nsegs > 0) {
1280 bus_dmamap_sync(sc->txtag, tx_buffer->map,
1281 0, tx_buffer->map->dm_mapsize,
1282 BUS_DMASYNC_POSTWRITE);
1283 bus_dmamap_unload(sc->txtag,
1284 tx_buffer->map);
1285 }
1286
1287 if (tx_buffer->m_head != NULL) {
1288 m_freem(tx_buffer->m_head);
1289 tx_buffer->m_head = NULL;
1290 }
1291 if (tx_buffer->map != NULL) {
1292 bus_dmamap_destroy(sc->txtag,
1293 tx_buffer->map);
1294 tx_buffer->map = NULL;
1295 }
1296 }
1297 }
1298 if (sc->tx_buffer_area != NULL) {
1299 free(sc->tx_buffer_area, M_DEVBUF);
1300 sc->tx_buffer_area = NULL;
1301 }
1302 if (sc->txtag != NULL) {
1303 sc->txtag = NULL;
1304 }
1305 }
1306
1307
1308
1309
1310
1311
1312
1313
1314 void
1315 ixgb_transmit_checksum_setup(struct ixgb_softc *sc,
1316 struct mbuf *mp,
1317 u_int8_t *txd_popts)
1318 {
1319 struct ixgb_context_desc *TXD;
1320 struct ixgb_buffer *tx_buffer;
1321 int curr_txd;
1322
1323 if (mp->m_pkthdr.csum_flags) {
1324
1325 if (mp->m_pkthdr.csum_flags & M_TCPV4_CSUM_OUT) {
1326 *txd_popts = IXGB_TX_DESC_POPTS_TXSM;
1327 if (sc->active_checksum_context == OFFLOAD_TCP_IP)
1328 return;
1329 else
1330 sc->active_checksum_context = OFFLOAD_TCP_IP;
1331
1332 } else if (mp->m_pkthdr.csum_flags & M_UDPV4_CSUM_OUT) {
1333 *txd_popts = IXGB_TX_DESC_POPTS_TXSM;
1334 if (sc->active_checksum_context == OFFLOAD_UDP_IP)
1335 return;
1336 else
1337 sc->active_checksum_context = OFFLOAD_UDP_IP;
1338 } else {
1339 *txd_popts = 0;
1340 return;
1341 }
1342 } else {
1343 *txd_popts = 0;
1344 return;
1345 }
1346
1347
1348
1349
1350
1351 curr_txd = sc->next_avail_tx_desc;
1352 tx_buffer = &sc->tx_buffer_area[curr_txd];
1353 TXD = (struct ixgb_context_desc *) & sc->tx_desc_base[curr_txd];
1354
1355 TXD->tucss = ENET_HEADER_SIZE + sizeof(struct ip);
1356 TXD->tucse = 0;
1357
1358 TXD->mss = 0;
1359
1360 if (sc->active_checksum_context == OFFLOAD_TCP_IP) {
1361 TXD->tucso =
1362 ENET_HEADER_SIZE + sizeof(struct ip) +
1363 offsetof(struct tcphdr, th_sum);
1364 } else if (sc->active_checksum_context == OFFLOAD_UDP_IP) {
1365 TXD->tucso =
1366 ENET_HEADER_SIZE + sizeof(struct ip) +
1367 offsetof(struct udphdr, uh_sum);
1368 }
1369 TXD->cmd_type_len = htole32(IXGB_CONTEXT_DESC_CMD_TCP |
1370 IXGB_TX_DESC_CMD_RS | IXGB_CONTEXT_DESC_CMD_IDE);
1371
1372 tx_buffer->m_head = NULL;
1373
1374 if (++curr_txd == sc->num_tx_desc)
1375 curr_txd = 0;
1376
1377 sc->num_tx_desc_avail--;
1378 sc->next_avail_tx_desc = curr_txd;
1379 }
1380
1381
1382
1383
1384
1385
1386
1387
1388 void
1389 ixgb_txeof(struct ixgb_softc *sc)
1390 {
1391 int i, num_avail;
1392 struct ixgb_buffer *tx_buffer;
1393 struct ixgb_tx_desc *tx_desc;
1394 struct ifnet *ifp = &sc->interface_data.ac_if;
1395
1396 if (sc->num_tx_desc_avail == sc->num_tx_desc)
1397 return;
1398
1399 num_avail = sc->num_tx_desc_avail;
1400 i = sc->oldest_used_tx_desc;
1401
1402 tx_buffer = &sc->tx_buffer_area[i];
1403 tx_desc = &sc->tx_desc_base[i];
1404
1405 bus_dmamap_sync(sc->txdma.dma_tag, sc->txdma.dma_map, 0,
1406 sc->txdma.dma_map->dm_mapsize, BUS_DMASYNC_POSTREAD);
1407 while (tx_desc->status & IXGB_TX_DESC_STATUS_DD) {
1408
1409 tx_desc->status = 0;
1410 num_avail++;
1411
1412 if (tx_buffer->m_head != NULL) {
1413 ifp->if_opackets++;
1414
1415 if (tx_buffer->map->dm_nsegs > 0) {
1416 bus_dmamap_sync(sc->txtag, tx_buffer->map,
1417 0, tx_buffer->map->dm_mapsize,
1418 BUS_DMASYNC_POSTWRITE);
1419 bus_dmamap_unload(sc->txtag, tx_buffer->map);
1420 }
1421
1422 m_freem(tx_buffer->m_head);
1423 tx_buffer->m_head = NULL;
1424 }
1425 if (++i == sc->num_tx_desc)
1426 i = 0;
1427
1428 tx_buffer = &sc->tx_buffer_area[i];
1429 tx_desc = &sc->tx_desc_base[i];
1430 }
1431 bus_dmamap_sync(sc->txdma.dma_tag, sc->txdma.dma_map, 0,
1432 sc->txdma.dma_map->dm_mapsize,
1433 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1434
1435 sc->oldest_used_tx_desc = i;
1436
1437
1438
1439
1440
1441
1442
1443 if (num_avail > IXGB_TX_CLEANUP_THRESHOLD) {
1444 ifp->if_flags &= ~IFF_OACTIVE;
1445
1446 if (num_avail == sc->num_tx_desc)
1447 ifp->if_timer = 0;
1448
1449 else if (num_avail != sc->num_tx_desc_avail)
1450 ifp->if_timer = IXGB_TX_TIMEOUT;
1451 }
1452 sc->num_tx_desc_avail = num_avail;
1453 }
1454
1455
1456
1457
1458
1459
1460
1461 int
1462 ixgb_get_buf(struct ixgb_softc *sc, int i,
1463 struct mbuf *nmp)
1464 {
1465 struct mbuf *mp = nmp;
1466 struct ixgb_buffer *rx_buffer;
1467 struct ifnet *ifp;
1468 int error;
1469
1470 ifp = &sc->interface_data.ac_if;
1471
1472 if (mp == NULL) {
1473 MGETHDR(mp, M_DONTWAIT, MT_DATA);
1474 if (mp == NULL) {
1475 sc->mbuf_alloc_failed++;
1476 return (ENOBUFS);
1477 }
1478 MCLGET(mp, M_DONTWAIT);
1479 if ((mp->m_flags & M_EXT) == 0) {
1480 m_freem(mp);
1481 sc->mbuf_cluster_failed++;
1482 return (ENOBUFS);
1483 }
1484 mp->m_len = mp->m_pkthdr.len = MCLBYTES;
1485 } else {
1486 mp->m_len = mp->m_pkthdr.len = MCLBYTES;
1487 mp->m_data = mp->m_ext.ext_buf;
1488 mp->m_next = NULL;
1489 }
1490
1491 if (sc->hw.max_frame_size <= (MCLBYTES - ETHER_ALIGN))
1492 m_adj(mp, ETHER_ALIGN);
1493
1494 rx_buffer = &sc->rx_buffer_area[i];
1495
1496
1497
1498
1499
1500 error = bus_dmamap_load_mbuf(sc->rxtag, rx_buffer->map,
1501 mp, BUS_DMA_NOWAIT);
1502 if (error) {
1503 m_free(mp);
1504 return (error);
1505 }
1506 rx_buffer->m_head = mp;
1507 sc->rx_desc_base[i].buff_addr = htole64(rx_buffer->map->dm_segs[0].ds_addr);
1508 bus_dmamap_sync(sc->rxtag, rx_buffer->map, 0,
1509 rx_buffer->map->dm_mapsize, BUS_DMASYNC_PREREAD);
1510
1511 return (0);
1512 }
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522 int
1523 ixgb_allocate_receive_structures(struct ixgb_softc *sc)
1524 {
1525 int i, error;
1526 struct ixgb_buffer *rx_buffer;
1527
1528 if (!(sc->rx_buffer_area =
1529 (struct ixgb_buffer *) malloc(sizeof(struct ixgb_buffer) *
1530 sc->num_rx_desc, M_DEVBUF,
1531 M_NOWAIT))) {
1532 printf("%s: Unable to allocate rx_buffer memory\n",
1533 sc->sc_dv.dv_xname);
1534 return (ENOMEM);
1535 }
1536
1537 bzero(sc->rx_buffer_area,
1538 sizeof(struct ixgb_buffer) * sc->num_rx_desc);
1539
1540 sc->rxtag = sc->osdep.ixgb_pa.pa_dmat;
1541
1542 rx_buffer = sc->rx_buffer_area;
1543 for (i = 0; i < sc->num_rx_desc; i++, rx_buffer++) {
1544 error = bus_dmamap_create(sc->rxtag, MCLBYTES, 1,
1545 MCLBYTES, 0, BUS_DMA_NOWAIT,
1546 &rx_buffer->map);
1547 if (error != 0) {
1548 printf("%s: ixgb_allocate_receive_structures: "
1549 "bus_dmamap_create failed; error %u\n",
1550 sc->sc_dv.dv_xname, error);
1551 goto fail;
1552 }
1553 }
1554
1555 for (i = 0; i < sc->num_rx_desc; i++) {
1556 error = ixgb_get_buf(sc, i, NULL);
1557 if (error != 0)
1558 goto fail;
1559 }
1560 bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map, 0,
1561 sc->rxdma.dma_map->dm_mapsize,
1562 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1563
1564 return (0);
1565
1566 fail:
1567 ixgb_free_receive_structures(sc);
1568 return (error);
1569 }
1570
1571
1572
1573
1574
1575
1576 int
1577 ixgb_setup_receive_structures(struct ixgb_softc *sc)
1578 {
1579 bzero((void *)sc->rx_desc_base,
1580 (sizeof(struct ixgb_rx_desc)) * sc->num_rx_desc);
1581
1582 if (ixgb_allocate_receive_structures(sc))
1583 return (ENOMEM);
1584
1585
1586 sc->next_rx_desc_to_check = 0;
1587 sc->next_rx_desc_to_use = 0;
1588 return (0);
1589 }
1590
1591
1592
1593
1594
1595
1596 void
1597 ixgb_initialize_receive_unit(struct ixgb_softc *sc)
1598 {
1599 u_int32_t reg_rctl;
1600 u_int32_t reg_rxcsum;
1601 u_int32_t reg_rxdctl;
1602 struct ifnet *ifp;
1603 u_int64_t bus_addr;
1604
1605 ifp = &sc->interface_data.ac_if;
1606
1607
1608
1609
1610
1611 reg_rctl = IXGB_READ_REG(&sc->hw, RCTL);
1612 IXGB_WRITE_REG(&sc->hw, RCTL, reg_rctl & ~IXGB_RCTL_RXEN);
1613
1614
1615 IXGB_WRITE_REG(&sc->hw, RDTR,
1616 sc->rx_int_delay);
1617
1618
1619 bus_addr = sc->rxdma.dma_map->dm_segs[0].ds_addr;
1620 IXGB_WRITE_REG(&sc->hw, RDBAL, (u_int32_t)bus_addr);
1621 IXGB_WRITE_REG(&sc->hw, RDBAH, (u_int32_t)(bus_addr >> 32));
1622 IXGB_WRITE_REG(&sc->hw, RDLEN, sc->num_rx_desc *
1623 sizeof(struct ixgb_rx_desc));
1624
1625
1626 IXGB_WRITE_REG(&sc->hw, RDH, 0);
1627
1628 IXGB_WRITE_REG(&sc->hw, RDT, sc->num_rx_desc - 1);
1629
1630 reg_rxdctl = RXDCTL_WTHRESH_DEFAULT << IXGB_RXDCTL_WTHRESH_SHIFT
1631 | RXDCTL_HTHRESH_DEFAULT << IXGB_RXDCTL_HTHRESH_SHIFT
1632 | RXDCTL_PTHRESH_DEFAULT << IXGB_RXDCTL_PTHRESH_SHIFT;
1633 IXGB_WRITE_REG(&sc->hw, RXDCTL, reg_rxdctl);
1634
1635 sc->raidc = 1;
1636 if (sc->raidc) {
1637 uint32_t raidc;
1638 uint8_t poll_threshold;
1639 #define IXGB_RAIDC_POLL_DEFAULT 120
1640
1641 poll_threshold = ((sc->num_rx_desc - 1) >> 3);
1642 poll_threshold >>= 1;
1643 poll_threshold &= 0x3F;
1644 raidc = IXGB_RAIDC_EN | IXGB_RAIDC_RXT_GATE |
1645 (IXGB_RAIDC_POLL_DEFAULT << IXGB_RAIDC_POLL_SHIFT) |
1646 (sc->rx_int_delay << IXGB_RAIDC_DELAY_SHIFT) |
1647 poll_threshold;
1648 IXGB_WRITE_REG(&sc->hw, RAIDC, raidc);
1649 }
1650
1651
1652 reg_rxcsum = IXGB_READ_REG(&sc->hw, RXCSUM);
1653 reg_rxcsum |= IXGB_RXCSUM_TUOFL;
1654 IXGB_WRITE_REG(&sc->hw, RXCSUM, reg_rxcsum);
1655
1656
1657 reg_rctl = IXGB_READ_REG(&sc->hw, RCTL);
1658 reg_rctl &= ~(3 << IXGB_RCTL_MO_SHIFT);
1659 reg_rctl |= IXGB_RCTL_BAM | IXGB_RCTL_RDMTS_1_2 | IXGB_RCTL_SECRC |
1660 IXGB_RCTL_CFF |
1661 (sc->hw.mc_filter_type << IXGB_RCTL_MO_SHIFT);
1662
1663 switch (sc->rx_buffer_len) {
1664 default:
1665 case IXGB_RXBUFFER_2048:
1666 reg_rctl |= IXGB_RCTL_BSIZE_2048;
1667 break;
1668 case IXGB_RXBUFFER_4096:
1669 reg_rctl |= IXGB_RCTL_BSIZE_4096;
1670 break;
1671 case IXGB_RXBUFFER_8192:
1672 reg_rctl |= IXGB_RCTL_BSIZE_8192;
1673 break;
1674 case IXGB_RXBUFFER_16384:
1675 reg_rctl |= IXGB_RCTL_BSIZE_16384;
1676 break;
1677 }
1678
1679 reg_rctl |= IXGB_RCTL_RXEN;
1680
1681
1682 IXGB_WRITE_REG(&sc->hw, RCTL, reg_rctl);
1683 }
1684
1685
1686
1687
1688
1689
1690 void
1691 ixgb_free_receive_structures(struct ixgb_softc *sc)
1692 {
1693 struct ixgb_buffer *rx_buffer;
1694 int i;
1695
1696 INIT_DEBUGOUT("free_receive_structures: begin");
1697
1698 if (sc->rx_buffer_area != NULL) {
1699 rx_buffer = sc->rx_buffer_area;
1700 for (i = 0; i < sc->num_rx_desc; i++, rx_buffer++) {
1701 if (rx_buffer->map != NULL &&
1702 rx_buffer->map->dm_nsegs > 0) {
1703 bus_dmamap_sync(sc->rxtag, rx_buffer->map,
1704 0, rx_buffer->map->dm_mapsize,
1705 BUS_DMASYNC_POSTREAD);
1706 bus_dmamap_unload(sc->rxtag,
1707 rx_buffer->map);
1708 }
1709 if (rx_buffer->m_head != NULL) {
1710 m_freem(rx_buffer->m_head);
1711 rx_buffer->m_head = NULL;
1712 }
1713 if (rx_buffer->map != NULL) {
1714 bus_dmamap_destroy(sc->rxtag,
1715 rx_buffer->map);
1716 rx_buffer->map = NULL;
1717 }
1718 }
1719 }
1720 if (sc->rx_buffer_area != NULL) {
1721 free(sc->rx_buffer_area, M_DEVBUF);
1722 sc->rx_buffer_area = NULL;
1723 }
1724 if (sc->rxtag != NULL)
1725 sc->rxtag = NULL;
1726 }
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738 void
1739 ixgb_rxeof(struct ixgb_softc *sc, int count)
1740 {
1741 struct ifnet *ifp;
1742 struct mbuf *mp;
1743 int eop = 0;
1744 int len;
1745 u_int8_t accept_frame = 0;
1746 int i;
1747 int next_to_use = 0;
1748 int eop_desc;
1749
1750
1751 struct ixgb_rx_desc *current_desc;
1752
1753 ifp = &sc->interface_data.ac_if;
1754 i = sc->next_rx_desc_to_check;
1755 next_to_use = sc->next_rx_desc_to_use;
1756 eop_desc = sc->next_rx_desc_to_check;
1757 current_desc = &sc->rx_desc_base[i];
1758 bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map, 0,
1759 sc->rxdma.dma_map->dm_mapsize, BUS_DMASYNC_POSTREAD);
1760
1761 if (!((current_desc->status) & IXGB_RX_DESC_STATUS_DD))
1762 return;
1763
1764 while ((current_desc->status & IXGB_RX_DESC_STATUS_DD) &&
1765 (count != 0) &&
1766 (ifp->if_flags & IFF_RUNNING)) {
1767
1768 mp = sc->rx_buffer_area[i].m_head;
1769 bus_dmamap_sync(sc->rxtag, sc->rx_buffer_area[i].map,
1770 0, sc->rx_buffer_area[i].map->dm_mapsize,
1771 BUS_DMASYNC_POSTREAD);
1772 bus_dmamap_unload(sc->rxtag, sc->rx_buffer_area[i].map);
1773
1774 accept_frame = 1;
1775 if (current_desc->status & IXGB_RX_DESC_STATUS_EOP) {
1776 count--;
1777 eop = 1;
1778 } else {
1779 eop = 0;
1780 }
1781 len = current_desc->length;
1782
1783 if (current_desc->errors & (IXGB_RX_DESC_ERRORS_CE |
1784 IXGB_RX_DESC_ERRORS_SE | IXGB_RX_DESC_ERRORS_P |
1785 IXGB_RX_DESC_ERRORS_RXE))
1786 accept_frame = 0;
1787 if (accept_frame) {
1788
1789
1790 mp->m_len = len;
1791
1792 if (sc->fmp == NULL) {
1793 mp->m_pkthdr.len = len;
1794 sc->fmp = mp;
1795 sc->lmp = mp;
1796 } else {
1797
1798 mp->m_flags &= ~M_PKTHDR;
1799 sc->lmp->m_next = mp;
1800 sc->lmp = sc->lmp->m_next;
1801 sc->fmp->m_pkthdr.len += len;
1802 }
1803
1804 if (eop) {
1805 eop_desc = i;
1806 sc->fmp->m_pkthdr.rcvif = ifp;
1807 ifp->if_ipackets++;
1808
1809 #if NBPFILTER > 0
1810
1811
1812
1813
1814 if (ifp->if_bpf)
1815 bpf_mtap(ifp->if_bpf, sc->fmp,
1816 BPF_DIRECTION_IN);
1817 #endif
1818
1819 ixgb_receive_checksum(sc, current_desc,
1820 sc->fmp);
1821 ether_input_mbuf(ifp, sc->fmp);
1822 sc->fmp = NULL;
1823 sc->lmp = NULL;
1824 }
1825 sc->rx_buffer_area[i].m_head = NULL;
1826 } else {
1827 sc->dropped_pkts++;
1828 if (sc->fmp != NULL)
1829 m_freem(sc->fmp);
1830 sc->fmp = NULL;
1831 sc->lmp = NULL;
1832 }
1833
1834
1835 current_desc->status = 0;
1836 bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map, 0,
1837 sc->rxdma.dma_map->dm_mapsize,
1838 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1839
1840
1841 if (++i == sc->num_rx_desc) {
1842 i = 0;
1843 current_desc = sc->rx_desc_base;
1844 } else
1845 current_desc++;
1846 }
1847 sc->next_rx_desc_to_check = i;
1848
1849 if (--i < 0)
1850 i = (sc->num_rx_desc - 1);
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864 if (eop_desc != i) {
1865 if (++eop_desc == sc->num_rx_desc)
1866 eop_desc = 0;
1867 i = eop_desc;
1868 }
1869
1870 while (next_to_use != i) {
1871 current_desc = &sc->rx_desc_base[next_to_use];
1872 if ((current_desc->errors & (IXGB_RX_DESC_ERRORS_CE |
1873 IXGB_RX_DESC_ERRORS_SE | IXGB_RX_DESC_ERRORS_P |
1874 IXGB_RX_DESC_ERRORS_RXE))) {
1875 mp = sc->rx_buffer_area[next_to_use].m_head;
1876 ixgb_get_buf(sc, next_to_use, mp);
1877 } else {
1878 if (ixgb_get_buf(sc, next_to_use, NULL) == ENOBUFS)
1879 break;
1880 }
1881
1882 if (++next_to_use == sc->num_rx_desc)
1883 next_to_use = 0;
1884 }
1885 sc->next_rx_desc_to_use = next_to_use;
1886 if (--next_to_use < 0)
1887 next_to_use = (sc->num_rx_desc - 1);
1888
1889 IXGB_WRITE_REG(&sc->hw, RDT, next_to_use);
1890 }
1891
1892
1893
1894
1895
1896
1897
1898
1899 void
1900 ixgb_receive_checksum(struct ixgb_softc *sc,
1901 struct ixgb_rx_desc *rx_desc,
1902 struct mbuf *mp)
1903 {
1904 if (rx_desc->status & IXGB_RX_DESC_STATUS_IXSM) {
1905 mp->m_pkthdr.csum_flags = 0;
1906 return;
1907 }
1908
1909 if (rx_desc->status & IXGB_RX_DESC_STATUS_IPCS) {
1910
1911 if (!(rx_desc->errors & IXGB_RX_DESC_ERRORS_IPE)) {
1912
1913 mp->m_pkthdr.csum_flags = M_IPV4_CSUM_IN_OK;
1914
1915 } else {
1916 mp->m_pkthdr.csum_flags = 0;
1917 }
1918 }
1919 if (rx_desc->status & IXGB_RX_DESC_STATUS_TCPCS) {
1920
1921 if (!(rx_desc->errors & IXGB_RX_DESC_ERRORS_TCPE)) {
1922 mp->m_pkthdr.csum_flags |=
1923 M_TCP_CSUM_IN_OK | M_UDP_CSUM_IN_OK;
1924 }
1925 }
1926 }
1927
1928 void
1929 ixgb_enable_intr(struct ixgb_softc *sc)
1930 {
1931 IXGB_WRITE_REG(&sc->hw, IMS, (IXGB_INT_RXT0 | IXGB_INT_TXDW |
1932 IXGB_INT_RXDMT0 | IXGB_INT_LSC | IXGB_INT_RXO));
1933 }
1934
1935 void
1936 ixgb_disable_intr(struct ixgb_softc *sc)
1937 {
1938 IXGB_WRITE_REG(&sc->hw, IMC, ~0);
1939 }
1940
1941 void
1942 ixgb_write_pci_cfg(struct ixgb_hw *hw,
1943 uint32_t reg,
1944 uint16_t *value)
1945 {
1946 struct pci_attach_args *pa = &((struct ixgb_osdep *)hw->back)->ixgb_pa;
1947 pci_chipset_tag_t pc = pa->pa_pc;
1948
1949 pci_conf_write(pc, pa->pa_tag, reg, *value);
1950 }
1951
1952
1953
1954
1955
1956
1957 void
1958 ixgb_update_stats_counters(struct ixgb_softc *sc)
1959 {
1960 struct ifnet *ifp;
1961
1962 sc->stats.crcerrs += IXGB_READ_REG(&sc->hw, CRCERRS);
1963 sc->stats.gprcl += IXGB_READ_REG(&sc->hw, GPRCL);
1964 sc->stats.gprch += IXGB_READ_REG(&sc->hw, GPRCH);
1965 sc->stats.gorcl += IXGB_READ_REG(&sc->hw, GORCL);
1966 sc->stats.gorch += IXGB_READ_REG(&sc->hw, GORCH);
1967 sc->stats.bprcl += IXGB_READ_REG(&sc->hw, BPRCL);
1968 sc->stats.bprch += IXGB_READ_REG(&sc->hw, BPRCH);
1969 sc->stats.mprcl += IXGB_READ_REG(&sc->hw, MPRCL);
1970 sc->stats.mprch += IXGB_READ_REG(&sc->hw, MPRCH);
1971 sc->stats.roc += IXGB_READ_REG(&sc->hw, ROC);
1972
1973 sc->stats.mpc += IXGB_READ_REG(&sc->hw, MPC);
1974 sc->stats.dc += IXGB_READ_REG(&sc->hw, DC);
1975 sc->stats.rlec += IXGB_READ_REG(&sc->hw, RLEC);
1976 sc->stats.xonrxc += IXGB_READ_REG(&sc->hw, XONRXC);
1977 sc->stats.xontxc += IXGB_READ_REG(&sc->hw, XONTXC);
1978 sc->stats.xoffrxc += IXGB_READ_REG(&sc->hw, XOFFRXC);
1979 sc->stats.xofftxc += IXGB_READ_REG(&sc->hw, XOFFTXC);
1980 sc->stats.gptcl += IXGB_READ_REG(&sc->hw, GPTCL);
1981 sc->stats.gptch += IXGB_READ_REG(&sc->hw, GPTCH);
1982 sc->stats.gotcl += IXGB_READ_REG(&sc->hw, GOTCL);
1983 sc->stats.gotch += IXGB_READ_REG(&sc->hw, GOTCH);
1984 sc->stats.ruc += IXGB_READ_REG(&sc->hw, RUC);
1985 sc->stats.rfc += IXGB_READ_REG(&sc->hw, RFC);
1986 sc->stats.rjc += IXGB_READ_REG(&sc->hw, RJC);
1987 sc->stats.torl += IXGB_READ_REG(&sc->hw, TORL);
1988 sc->stats.torh += IXGB_READ_REG(&sc->hw, TORH);
1989 sc->stats.totl += IXGB_READ_REG(&sc->hw, TOTL);
1990 sc->stats.toth += IXGB_READ_REG(&sc->hw, TOTH);
1991 sc->stats.tprl += IXGB_READ_REG(&sc->hw, TPRL);
1992 sc->stats.tprh += IXGB_READ_REG(&sc->hw, TPRH);
1993 sc->stats.tptl += IXGB_READ_REG(&sc->hw, TPTL);
1994 sc->stats.tpth += IXGB_READ_REG(&sc->hw, TPTH);
1995 sc->stats.plt64c += IXGB_READ_REG(&sc->hw, PLT64C);
1996 sc->stats.mptcl += IXGB_READ_REG(&sc->hw, MPTCL);
1997 sc->stats.mptch += IXGB_READ_REG(&sc->hw, MPTCH);
1998 sc->stats.bptcl += IXGB_READ_REG(&sc->hw, BPTCL);
1999 sc->stats.bptch += IXGB_READ_REG(&sc->hw, BPTCH);
2000
2001 sc->stats.uprcl += IXGB_READ_REG(&sc->hw, UPRCL);
2002 sc->stats.uprch += IXGB_READ_REG(&sc->hw, UPRCH);
2003 sc->stats.vprcl += IXGB_READ_REG(&sc->hw, VPRCL);
2004 sc->stats.vprch += IXGB_READ_REG(&sc->hw, VPRCH);
2005 sc->stats.jprcl += IXGB_READ_REG(&sc->hw, JPRCL);
2006 sc->stats.jprch += IXGB_READ_REG(&sc->hw, JPRCH);
2007 sc->stats.rnbc += IXGB_READ_REG(&sc->hw, RNBC);
2008 sc->stats.icbc += IXGB_READ_REG(&sc->hw, ICBC);
2009 sc->stats.ecbc += IXGB_READ_REG(&sc->hw, ECBC);
2010 sc->stats.uptcl += IXGB_READ_REG(&sc->hw, UPTCL);
2011 sc->stats.uptch += IXGB_READ_REG(&sc->hw, UPTCH);
2012 sc->stats.vptcl += IXGB_READ_REG(&sc->hw, VPTCL);
2013 sc->stats.vptch += IXGB_READ_REG(&sc->hw, VPTCH);
2014 sc->stats.jptcl += IXGB_READ_REG(&sc->hw, JPTCL);
2015 sc->stats.jptch += IXGB_READ_REG(&sc->hw, JPTCH);
2016 sc->stats.tsctc += IXGB_READ_REG(&sc->hw, TSCTC);
2017 sc->stats.tsctfc += IXGB_READ_REG(&sc->hw, TSCTFC);
2018 sc->stats.ibic += IXGB_READ_REG(&sc->hw, IBIC);
2019 sc->stats.lfc += IXGB_READ_REG(&sc->hw, LFC);
2020 sc->stats.pfrc += IXGB_READ_REG(&sc->hw, PFRC);
2021 sc->stats.pftc += IXGB_READ_REG(&sc->hw, PFTC);
2022 sc->stats.mcfrc += IXGB_READ_REG(&sc->hw, MCFRC);
2023
2024 ifp = &sc->interface_data.ac_if;
2025
2026
2027 ifp->if_collisions = 0;
2028
2029
2030 ifp->if_ierrors =
2031 sc->dropped_pkts +
2032 sc->stats.crcerrs +
2033 sc->stats.rnbc +
2034 sc->stats.mpc +
2035 sc->stats.rlec;
2036
2037
2038 ifp->if_oerrors =
2039 sc->watchdog_events;
2040 }
2041
2042
2043
2044
2045
2046
2047
2048
2049 void
2050 ixgb_print_hw_stats(struct ixgb_softc *sc)
2051 {
2052 char buf_speed[100], buf_type[100];
2053 ixgb_bus_speed bus_speed;
2054 ixgb_bus_type bus_type;
2055 const char * const unit = sc->sc_dv.dv_xname;
2056
2057 bus_speed = sc->hw.bus.speed;
2058 bus_type = sc->hw.bus.type;
2059 snprintf(buf_speed, sizeof(buf_speed),
2060 bus_speed == ixgb_bus_speed_33 ? "33MHz" :
2061 bus_speed == ixgb_bus_speed_66 ? "66MHz" :
2062 bus_speed == ixgb_bus_speed_100 ? "100MHz" :
2063 bus_speed == ixgb_bus_speed_133 ? "133MHz" :
2064 "UNKNOWN");
2065 printf("%s: PCI_Bus_Speed = %s\n", unit,
2066 buf_speed);
2067
2068 snprintf(buf_type, sizeof(buf_type),
2069 bus_type == ixgb_bus_type_pci ? "PCI" :
2070 bus_type == ixgb_bus_type_pcix ? "PCI-X" :
2071 "UNKNOWN");
2072 printf("%s: PCI_Bus_Type = %s\n", unit,
2073 buf_type);
2074
2075 printf("%s: Tx Descriptors not Avail1 = %ld\n", unit,
2076 sc->no_tx_desc_avail1);
2077 printf("%s: Tx Descriptors not Avail2 = %ld\n", unit,
2078 sc->no_tx_desc_avail2);
2079 printf("%s: Std Mbuf Failed = %ld\n", unit,
2080 sc->mbuf_alloc_failed);
2081 printf("%s: Std Cluster Failed = %ld\n", unit,
2082 sc->mbuf_cluster_failed);
2083
2084 printf("%s: Defer count = %lld\n", unit,
2085 (long long)sc->stats.dc);
2086 printf("%s: Missed Packets = %lld\n", unit,
2087 (long long)sc->stats.mpc);
2088 printf("%s: Receive No Buffers = %lld\n", unit,
2089 (long long)sc->stats.rnbc);
2090 printf("%s: Receive length errors = %lld\n", unit,
2091 (long long)sc->stats.rlec);
2092 printf("%s: Crc errors = %lld\n", unit,
2093 (long long)sc->stats.crcerrs);
2094 printf("%s: Driver dropped packets = %ld\n", unit,
2095 sc->dropped_pkts);
2096
2097 printf("%s: XON Rcvd = %lld\n", unit,
2098 (long long)sc->stats.xonrxc);
2099 printf("%s: XON Xmtd = %lld\n", unit,
2100 (long long)sc->stats.xontxc);
2101 printf("%s: XOFF Rcvd = %lld\n", unit,
2102 (long long)sc->stats.xoffrxc);
2103 printf("%s: XOFF Xmtd = %lld\n", unit,
2104 (long long)sc->stats.xofftxc);
2105
2106 printf("%s: Good Packets Rcvd = %lld\n", unit,
2107 (long long)sc->stats.gprcl);
2108 printf("%s: Good Packets Xmtd = %lld\n", unit,
2109 (long long)sc->stats.gptcl);
2110
2111 printf("%s: Jumbo frames recvd = %lld\n", unit,
2112 (long long)sc->stats.jprcl);
2113 printf("%s: Jumbo frames Xmtd = %lld\n", unit,
2114 (long long)sc->stats.jptcl);
2115 }