This source file includes following definitions.
- em_probe
- em_attach
- em_power
- em_shutdown
- em_start
- em_ioctl
- em_watchdog
- em_init
- em_intr
- em_media_status
- em_media_change
- em_encap
- em_82547_move_tail_locked
- em_82547_move_tail
- em_82547_fifo_workaround
- em_82547_update_fifo_head
- em_82547_tx_fifo_reset
- em_set_promisc
- em_set_multi
- em_local_timer
- em_update_link_status
- em_stop
- em_identify_hardware
- em_allocate_pci_resources
- em_free_pci_resources
- em_hardware_init
- em_setup_interface
- em_smartspeed
- em_dma_malloc
- em_dma_free
- em_allocate_transmit_structures
- em_setup_transmit_structures
- em_initialize_transmit_unit
- em_free_transmit_structures
- em_transmit_checksum_setup
- em_txeof
- em_get_buf
- em_allocate_receive_structures
- em_setup_receive_structures
- em_initialize_receive_unit
- em_free_receive_structures
- em_rxeof
- em_receive_checksum
- em_enable_intr
- em_disable_intr
- em_is_valid_ether_addr
- em_write_pci_cfg
- em_read_pci_cfg
- em_pci_set_mwi
- em_pci_clear_mwi
- em_read_pcie_cap_reg
- em_fill_descriptors
- em_update_stats_counters
- em_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
37 #include <dev/pci/if_em.h>
38
39
40
41
42 int em_display_debug_stats = 0;
43
44
45
46
47
48 char em_driver_version[] = "6.2.9";
49
50
51
52
53 const struct pci_matchid em_devices[] = {
54 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80003ES2LAN_CPR_DPT },
55 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80003ES2LAN_SDS_DPT },
56 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80003ES2LAN_CPR_SPT },
57 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80003ES2LAN_SDS_SPT },
58 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM },
59 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM_LOM },
60 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP },
61 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LOM },
62 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LP },
63 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI },
64 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI_MOBILE },
65 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER },
66 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER_LOM },
67 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI },
68 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI_LF },
69 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI_MOBILE },
70 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82542 },
71 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_COPPER },
72 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_FIBER },
73 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_COPPER },
74 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_FIBER },
75 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_COPPER },
76 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_LOM },
77 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_COPPER },
78 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_FIBER },
79 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_COPPER },
80 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_FIBER },
81 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_SERDES },
82 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_COPPER },
83 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_FIBER },
84 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_QUAD_CPR },
85 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_COPPER },
86 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_FIBER },
87 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_PCIE },
88 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_CPR },
89 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_CPR_K },
90 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_SERDES },
91 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_2 },
92 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI },
93 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI_MOBILE },
94 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547GI },
95 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_AF },
96 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_AT },
97 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_COPPER },
98 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_FIBER },
99 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_CPR },
100 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_CPR_LP },
101 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_FBR },
102 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_SERDES },
103 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_COPPER },
104 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_FIBER },
105 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_SERDES },
106 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI },
107 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E },
108 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E_IAMT },
109 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E_PM },
110 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573L },
111 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573L_PL_1 },
112 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573L_PL_2 },
113 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573V_PM },
114 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_IGP_M_AMT },
115 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_IGP_AMT },
116 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_IGP_C },
117 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_IFE },
118 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_IFE_G },
119 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_IFE_GT },
120 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_ICH8_IGP_M }
121 };
122
123
124
125
126 int em_probe(struct device *, void *, void *);
127 void em_attach(struct device *, struct device *, void *);
128 void em_shutdown(void *);
129 int em_intr(void *);
130 void em_power(int, void *);
131 void em_start(struct ifnet *);
132 int em_ioctl(struct ifnet *, u_long, caddr_t);
133 void em_watchdog(struct ifnet *);
134 void em_init(void *);
135 void em_stop(void *);
136 void em_media_status(struct ifnet *, struct ifmediareq *);
137 int em_media_change(struct ifnet *);
138 void em_identify_hardware(struct em_softc *);
139 int em_allocate_pci_resources(struct em_softc *);
140 void em_free_pci_resources(struct em_softc *);
141 void em_local_timer(void *);
142 int em_hardware_init(struct em_softc *);
143 void em_setup_interface(struct em_softc *);
144 int em_setup_transmit_structures(struct em_softc *);
145 void em_initialize_transmit_unit(struct em_softc *);
146 int em_setup_receive_structures(struct em_softc *);
147 void em_initialize_receive_unit(struct em_softc *);
148 void em_enable_intr(struct em_softc *);
149 void em_disable_intr(struct em_softc *);
150 void em_free_transmit_structures(struct em_softc *);
151 void em_free_receive_structures(struct em_softc *);
152 void em_update_stats_counters(struct em_softc *);
153 void em_txeof(struct em_softc *);
154 int em_allocate_receive_structures(struct em_softc *);
155 int em_allocate_transmit_structures(struct em_softc *);
156 void em_rxeof(struct em_softc *, int);
157 void em_receive_checksum(struct em_softc *, struct em_rx_desc *,
158 struct mbuf *);
159 #ifdef EM_CSUM_OFFLOAD
160 void em_transmit_checksum_setup(struct em_softc *, struct mbuf *,
161 u_int32_t *, u_int32_t *);
162 #endif
163 void em_set_promisc(struct em_softc *);
164 void em_set_multi(struct em_softc *);
165 void em_print_hw_stats(struct em_softc *);
166 void em_update_link_status(struct em_softc *);
167 int em_get_buf(struct em_softc *, int);
168 int em_encap(struct em_softc *, struct mbuf *);
169 void em_smartspeed(struct em_softc *);
170 int em_82547_fifo_workaround(struct em_softc *, int);
171 void em_82547_update_fifo_head(struct em_softc *, int);
172 int em_82547_tx_fifo_reset(struct em_softc *);
173 void em_82547_move_tail(void *arg);
174 void em_82547_move_tail_locked(struct em_softc *);
175 int em_dma_malloc(struct em_softc *, bus_size_t, struct em_dma_alloc *,
176 int);
177 void em_dma_free(struct em_softc *, struct em_dma_alloc *);
178 int em_is_valid_ether_addr(u_int8_t *);
179 u_int32_t em_fill_descriptors(u_int64_t address, u_int32_t length,
180 PDESC_ARRAY desc_array);
181
182
183
184
185
186 struct cfattach em_ca = {
187 sizeof(struct em_softc), em_probe, em_attach
188 };
189
190 struct cfdriver em_cd = {
191 0, "em", DV_IFNET
192 };
193
194 static int em_smart_pwr_down = FALSE;
195
196
197
198
199
200
201
202
203
204
205 int
206 em_probe(struct device *parent, void *match, void *aux)
207 {
208 INIT_DEBUGOUT("em_probe: begin");
209
210 return (pci_matchbyid((struct pci_attach_args *)aux, em_devices,
211 sizeof(em_devices)/sizeof(em_devices[0])));
212 }
213
214
215
216
217
218
219
220
221
222
223 void
224 em_attach(struct device *parent, struct device *self, void *aux)
225 {
226 struct pci_attach_args *pa = aux;
227 struct em_softc *sc;
228 int tsize, rsize;
229
230 INIT_DEBUGOUT("em_attach: begin");
231
232 sc = (struct em_softc *)self;
233 sc->osdep.em_pa = *pa;
234
235 timeout_set(&sc->timer_handle, em_local_timer, sc);
236 timeout_set(&sc->tx_fifo_timer_handle, em_82547_move_tail, sc);
237
238
239 em_identify_hardware(sc);
240
241
242 sc->num_tx_desc = EM_MIN_TXD;
243 sc->num_rx_desc = EM_MIN_RXD;
244 sc->tx_int_delay = EM_TIDV;
245 sc->tx_abs_int_delay = EM_TADV;
246 sc->rx_int_delay = EM_RDTR;
247 sc->rx_abs_int_delay = EM_RADV;
248 sc->hw.autoneg = DO_AUTO_NEG;
249 sc->hw.wait_autoneg_complete = WAIT_FOR_AUTO_NEG_DEFAULT;
250 sc->hw.autoneg_advertised = AUTONEG_ADV_DEFAULT;
251 sc->hw.tbi_compatibility_en = TRUE;
252 sc->rx_buffer_len = EM_RXBUFFER_2048;
253
254 sc->hw.phy_init_script = 1;
255 sc->hw.phy_reset_disable = FALSE;
256
257 #ifndef EM_MASTER_SLAVE
258 sc->hw.master_slave = em_ms_hw_default;
259 #else
260 sc->hw.master_slave = EM_MASTER_SLAVE;
261 #endif
262
263
264
265
266
267 sc->hw.report_tx_early = 1;
268
269 if (em_allocate_pci_resources(sc)) {
270 printf("%s: Allocation of PCI resources failed\n",
271 sc->sc_dv.dv_xname);
272 goto err_pci;
273 }
274
275
276 em_init_eeprom_params(&sc->hw);
277
278
279
280
281
282 switch (sc->hw.mac_type) {
283 case em_82573:
284 {
285 uint16_t eeprom_data = 0;
286
287
288
289
290
291 em_read_eeprom(&sc->hw, EEPROM_INIT_3GIO_3,
292 1, &eeprom_data);
293 if (eeprom_data & EEPROM_WORD1A_ASPM_MASK) {
294 sc->hw.max_frame_size = ETHER_MAX_LEN;
295 break;
296 }
297
298 }
299 case em_82571:
300 case em_82572:
301 case em_80003es2lan:
302 sc->hw.max_frame_size = 9234;
303 break;
304 case em_ich8lan:
305
306 sc->hw.max_frame_size = ETHER_MAX_LEN;
307 break;
308 default:
309 sc->hw.max_frame_size =
310 MAX_JUMBO_FRAME_SIZE;
311 }
312
313 sc->hw.min_frame_size =
314 ETHER_MIN_LEN + ETHER_CRC_LEN;
315
316 if (sc->hw.mac_type >= em_82544)
317 tsize = EM_ROUNDUP(sc->num_tx_desc * sizeof(struct em_tx_desc),
318 EM_MAX_TXD * sizeof(struct em_tx_desc));
319 else
320 tsize = EM_ROUNDUP(sc->num_tx_desc * sizeof(struct em_tx_desc),
321 EM_MAX_TXD_82543 * sizeof(struct em_tx_desc));
322 tsize = EM_ROUNDUP(tsize, PAGE_SIZE);
323
324
325 if (em_dma_malloc(sc, tsize, &sc->txdma, BUS_DMA_NOWAIT)) {
326 printf("%s: Unable to allocate tx_desc memory\n",
327 sc->sc_dv.dv_xname);
328 goto err_tx_desc;
329 }
330 sc->tx_desc_base = (struct em_tx_desc *)sc->txdma.dma_vaddr;
331
332 rsize = EM_ROUNDUP(sc->num_rx_desc * sizeof(struct em_rx_desc),
333 EM_MAX_RXD * sizeof(struct em_rx_desc));
334 rsize = EM_ROUNDUP(rsize, PAGE_SIZE);
335
336
337 if (em_dma_malloc(sc, rsize, &sc->rxdma, BUS_DMA_NOWAIT)) {
338 printf("%s: Unable to allocate rx_desc memory\n",
339 sc->sc_dv.dv_xname);
340 goto err_rx_desc;
341 }
342 sc->rx_desc_base = (struct em_rx_desc *) sc->rxdma.dma_vaddr;
343
344
345 if (em_hardware_init(sc)) {
346 printf("%s: Unable to initialize the hardware\n",
347 sc->sc_dv.dv_xname);
348 goto err_hw_init;
349 }
350
351
352 if (em_read_mac_addr(&sc->hw) < 0) {
353 printf("%s: EEPROM read error while reading mac address\n",
354 sc->sc_dv.dv_xname);
355 goto err_mac_addr;
356 }
357
358 if (!em_is_valid_ether_addr(sc->hw.mac_addr)) {
359 printf("%s: Invalid mac address\n", sc->sc_dv.dv_xname);
360 goto err_mac_addr;
361 }
362
363 bcopy(sc->hw.mac_addr, sc->interface_data.ac_enaddr,
364 ETHER_ADDR_LEN);
365
366
367 em_setup_interface(sc);
368
369
370 em_clear_hw_cntrs(&sc->hw);
371 em_update_stats_counters(sc);
372 sc->hw.get_link_status = 1;
373 em_update_link_status(sc);
374
375 printf(", address %s\n", ether_sprintf(sc->interface_data.ac_enaddr));
376
377
378 if (em_check_phy_reset_block(&sc->hw))
379 printf("%s: PHY reset is blocked due to SOL/IDER session.\n",
380 sc->sc_dv.dv_xname);
381
382
383 em_get_bus_info(&sc->hw);
384 if (sc->hw.bus_type == em_bus_type_pcix &&
385 sc->hw.mac_type == em_82544)
386 sc->pcix_82544 = TRUE;
387 else
388 sc->pcix_82544 = FALSE;
389 INIT_DEBUGOUT("em_attach: end");
390 sc->sc_powerhook = powerhook_establish(em_power, sc);
391 sc->sc_shutdownhook = shutdownhook_establish(em_shutdown, sc);
392 return;
393
394 err_mac_addr:
395 err_hw_init:
396 em_dma_free(sc, &sc->rxdma);
397 err_rx_desc:
398 em_dma_free(sc, &sc->txdma);
399 err_tx_desc:
400 err_pci:
401 em_free_pci_resources(sc);
402 }
403
404 void
405 em_power(int why, void *arg)
406 {
407 struct em_softc *sc = (struct em_softc *)arg;
408 struct ifnet *ifp;
409
410 if (why == PWR_RESUME) {
411 ifp = &sc->interface_data.ac_if;
412 if (ifp->if_flags & IFF_UP)
413 em_init(sc);
414 }
415 }
416
417
418
419
420
421
422
423 void
424 em_shutdown(void *arg)
425 {
426 struct em_softc *sc = arg;
427
428 em_stop(sc);
429 }
430
431
432
433
434
435
436
437
438
439
440
441 void
442 em_start(struct ifnet *ifp)
443 {
444 struct mbuf *m_head;
445 struct em_softc *sc = ifp->if_softc;
446
447 if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
448 return;
449
450 if (!sc->link_active)
451 return;
452
453 for (;;) {
454 IFQ_POLL(&ifp->if_snd, m_head);
455
456 if (m_head == NULL)
457 break;
458
459 if (em_encap(sc, m_head)) {
460 ifp->if_flags |= IFF_OACTIVE;
461 break;
462 }
463
464 IFQ_DEQUEUE(&ifp->if_snd, m_head);
465
466 #if NBPFILTER > 0
467
468 if (ifp->if_bpf)
469 bpf_mtap(ifp->if_bpf, m_head, BPF_DIRECTION_OUT);
470 #endif
471
472
473 ifp->if_timer = EM_TX_TIMEOUT;
474 }
475 }
476
477
478
479
480
481
482
483
484
485
486 int
487 em_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
488 {
489 int error = 0;
490 struct ifreq *ifr = (struct ifreq *) data;
491 struct ifaddr *ifa = (struct ifaddr *)data;
492 struct em_softc *sc = ifp->if_softc;
493 int s;
494
495 s = splnet();
496
497 if ((error = ether_ioctl(ifp, &sc->interface_data, command, data)) > 0) {
498 splx(s);
499 return (error);
500 }
501
502 switch (command) {
503 case SIOCSIFADDR:
504 IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFADDR (Set Interface "
505 "Addr)");
506 if (!(ifp->if_flags & IFF_UP)) {
507 ifp->if_flags |= IFF_UP;
508 em_init(sc);
509 }
510 #ifdef INET
511 if (ifa->ifa_addr->sa_family == AF_INET)
512 arp_ifinit(&sc->interface_data, ifa);
513 #endif
514 break;
515 case SIOCSIFMTU:
516 IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFMTU (Set Interface MTU)");
517 if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ifp->if_hardmtu)
518 error = EINVAL;
519 else if (ifp->if_mtu != ifr->ifr_mtu)
520 ifp->if_mtu = ifr->ifr_mtu;
521 break;
522 case SIOCSIFFLAGS:
523 IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFFLAGS (Set Interface Flags)");
524 if (ifp->if_flags & IFF_UP) {
525
526
527
528
529
530 if ((ifp->if_flags & IFF_RUNNING) &&
531 ((ifp->if_flags ^ sc->if_flags) &
532 (IFF_ALLMULTI | IFF_PROMISC)) != 0) {
533 em_set_promisc(sc);
534 } else {
535 if (!(ifp->if_flags & IFF_RUNNING))
536 em_init(sc);
537 }
538 } else {
539 if (ifp->if_flags & IFF_RUNNING)
540 em_stop(sc);
541 }
542 sc->if_flags = ifp->if_flags;
543 break;
544 case SIOCADDMULTI:
545 case SIOCDELMULTI:
546 IOCTL_DEBUGOUT("ioctl rcv'd: SIOC(ADD|DEL)MULTI");
547 error = (command == SIOCADDMULTI)
548 ? ether_addmulti(ifr, &sc->interface_data)
549 : ether_delmulti(ifr, &sc->interface_data);
550
551 if (error == ENETRESET) {
552 if (ifp->if_flags & IFF_RUNNING) {
553 em_disable_intr(sc);
554 em_set_multi(sc);
555 if (sc->hw.mac_type == em_82542_rev2_0)
556 em_initialize_receive_unit(sc);
557 em_enable_intr(sc);
558 }
559 error = 0;
560 }
561 break;
562 case SIOCSIFMEDIA:
563
564 if (em_check_phy_reset_block(&sc->hw)) {
565 printf("%s: Media change is blocked due to SOL/IDER session.\n",
566 sc->sc_dv.dv_xname);
567 break;
568 }
569 case SIOCGIFMEDIA:
570 IOCTL_DEBUGOUT("ioctl rcv'd: SIOCxIFMEDIA (Get/Set Interface Media)");
571 error = ifmedia_ioctl(ifp, ifr, &sc->media, command);
572 break;
573 default:
574 IOCTL_DEBUGOUT1("ioctl received: UNKNOWN (0x%x)", (int)command);
575 error = ENOTTY;
576 }
577
578 splx(s);
579 return (error);
580 }
581
582
583
584
585
586
587
588
589 void
590 em_watchdog(struct ifnet *ifp)
591 {
592 struct em_softc *sc = ifp->if_softc;
593
594
595
596
597 if (E1000_READ_REG(&sc->hw, STATUS) & E1000_STATUS_TXOFF) {
598 ifp->if_timer = EM_TX_TIMEOUT;
599 return;
600 }
601
602 printf("%s: watchdog timeout -- resetting\n", sc->sc_dv.dv_xname);
603
604 em_init(sc);
605
606 sc->watchdog_events++;
607 }
608
609
610
611
612
613
614
615
616
617
618
619 void
620 em_init(void *arg)
621 {
622 struct em_softc *sc = arg;
623 struct ifnet *ifp = &sc->interface_data.ac_if;
624 uint32_t pba;
625 int s;
626
627 s = splnet();
628
629 INIT_DEBUGOUT("em_init: begin");
630
631 em_stop(sc);
632
633 if (ifp->if_flags & IFF_UP) {
634 if (sc->hw.mac_type >= em_82544)
635 sc->num_tx_desc = EM_MAX_TXD;
636 else
637 sc->num_tx_desc = EM_MAX_TXD_82543;
638 sc->num_rx_desc = EM_MAX_RXD;
639 } else {
640 sc->num_tx_desc = EM_MIN_TXD;
641 sc->num_rx_desc = EM_MIN_RXD;
642 }
643 IFQ_SET_MAXLEN(&ifp->if_snd, sc->num_tx_desc - 1);
644
645
646
647
648
649
650
651
652
653
654
655
656 switch (sc->hw.mac_type) {
657 case em_82547:
658 case em_82547_rev_2:
659 if (sc->hw.max_frame_size > EM_RXBUFFER_8192)
660 pba = E1000_PBA_22K;
661 else
662 pba = E1000_PBA_30K;
663 sc->tx_fifo_head = 0;
664 sc->tx_head_addr = pba << EM_TX_HEAD_ADDR_SHIFT;
665 sc->tx_fifo_size = (E1000_PBA_40K - pba) << EM_PBA_BYTES_SHIFT;
666 break;
667 case em_82571:
668 case em_82572:
669 case em_80003es2lan:
670 pba = E1000_PBA_32K;
671 break;
672 case em_82573:
673
674 pba = E1000_PBA_12K;
675 break;
676 case em_ich8lan:
677 pba = E1000_PBA_8K;
678 break;
679 default:
680
681 if (sc->hw.max_frame_size > EM_RXBUFFER_8192)
682 pba = E1000_PBA_40K;
683 else
684 pba = E1000_PBA_48K;
685 }
686 INIT_DEBUGOUT1("em_init: pba=%dK",pba);
687 E1000_WRITE_REG(&sc->hw, PBA, pba);
688
689
690 bcopy(sc->interface_data.ac_enaddr, sc->hw.mac_addr,
691 ETHER_ADDR_LEN);
692
693
694 if (em_hardware_init(sc)) {
695 printf("%s: Unable to initialize the hardware\n",
696 sc->sc_dv.dv_xname);
697 splx(s);
698 return;
699 }
700 em_update_link_status(sc);
701
702
703 if (em_setup_transmit_structures(sc)) {
704 printf("%s: Could not setup transmit structures\n",
705 sc->sc_dv.dv_xname);
706 em_stop(sc);
707 splx(s);
708 return;
709 }
710 em_initialize_transmit_unit(sc);
711
712
713 em_set_multi(sc);
714
715
716 if (em_setup_receive_structures(sc)) {
717 printf("%s: Could not setup receive structures\n",
718 sc->sc_dv.dv_xname);
719 em_stop(sc);
720 splx(s);
721 return;
722 }
723 em_initialize_receive_unit(sc);
724
725
726 em_set_promisc(sc);
727
728 ifp->if_flags |= IFF_RUNNING;
729 ifp->if_flags &= ~IFF_OACTIVE;
730
731 timeout_add(&sc->timer_handle, hz);
732 em_clear_hw_cntrs(&sc->hw);
733 em_enable_intr(sc);
734
735
736 sc->hw.phy_reset_disable = TRUE;
737
738 splx(s);
739 }
740
741
742
743
744
745
746 int
747 em_intr(void *arg)
748 {
749 struct em_softc *sc = arg;
750 struct ifnet *ifp;
751 u_int32_t reg_icr, test_icr;
752 int claimed = 0;
753
754 ifp = &sc->interface_data.ac_if;
755
756 for (;;) {
757 test_icr = reg_icr = E1000_READ_REG(&sc->hw, ICR);
758 if (sc->hw.mac_type >= em_82571)
759 test_icr = (reg_icr & E1000_ICR_INT_ASSERTED);
760 if (!test_icr)
761 break;
762
763 claimed = 1;
764
765 if (ifp->if_flags & IFF_RUNNING) {
766 em_rxeof(sc, -1);
767 em_txeof(sc);
768 }
769
770
771 if (reg_icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) {
772 timeout_del(&sc->timer_handle);
773 sc->hw.get_link_status = 1;
774 em_check_for_link(&sc->hw);
775 em_update_link_status(sc);
776 timeout_add(&sc->timer_handle, hz);
777 }
778
779 if (reg_icr & E1000_ICR_RXO)
780 sc->rx_overruns++;
781 }
782
783 if (ifp->if_flags & IFF_RUNNING && !IFQ_IS_EMPTY(&ifp->if_snd))
784 em_start(ifp);
785
786 return (claimed);
787 }
788
789
790
791
792
793
794
795
796
797 void
798 em_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
799 {
800 struct em_softc *sc = ifp->if_softc;
801 u_char fiber_type = IFM_1000_SX;
802 u_int16_t ar, lpar, gsr;
803
804 INIT_DEBUGOUT("em_media_status: begin");
805
806 em_check_for_link(&sc->hw);
807 em_update_link_status(sc);
808
809 ifmr->ifm_status = IFM_AVALID;
810 ifmr->ifm_active = IFM_ETHER;
811
812 if (!sc->link_active) {
813 ifmr->ifm_active |= IFM_NONE;
814 return;
815 }
816
817 ifmr->ifm_status |= IFM_ACTIVE;
818
819 if (sc->hw.media_type == em_media_type_fiber ||
820 sc->hw.media_type == em_media_type_internal_serdes) {
821 if (sc->hw.mac_type == em_82545)
822 fiber_type = IFM_1000_LX;
823 ifmr->ifm_active |= fiber_type | IFM_FDX;
824 } else {
825 switch (sc->link_speed) {
826 case 10:
827 ifmr->ifm_active |= IFM_10_T;
828 break;
829 case 100:
830 ifmr->ifm_active |= IFM_100_TX;
831 break;
832 case 1000:
833 ifmr->ifm_active |= IFM_1000_T;
834 break;
835 }
836
837 if (sc->link_duplex == FULL_DUPLEX)
838 ifmr->ifm_active |= IFM_FDX;
839 else
840 ifmr->ifm_active |= IFM_HDX;
841
842 if (ifmr->ifm_active & IFM_FDX) {
843 em_read_phy_reg(&sc->hw, PHY_AUTONEG_ADV, &ar);
844 em_read_phy_reg(&sc->hw, PHY_LP_ABILITY, &lpar);
845
846 if ((ar & NWAY_AR_PAUSE) && (lpar & NWAY_LPAR_PAUSE))
847 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_TXPAUSE |
848 IFM_ETH_RXPAUSE;
849 else if (!(ar & NWAY_AR_PAUSE) && (ar & NWAY_AR_ASM_DIR) &&
850 (lpar & NWAY_LPAR_PAUSE) && (lpar & NWAY_LPAR_ASM_DIR))
851 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_TXPAUSE;
852 else if ((ar & NWAY_AR_PAUSE) && (ar & NWAY_AR_ASM_DIR) &&
853 !(lpar & NWAY_LPAR_PAUSE) && (lpar & NWAY_LPAR_ASM_DIR))
854 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE;
855 }
856
857 if (IFM_SUBTYPE(ifmr->ifm_active) == IFM_1000_T) {
858 em_read_phy_reg(&sc->hw, PHY_1000T_STATUS, &gsr);
859 if (gsr & SR_1000T_MS_CONFIG_RES)
860 ifmr->ifm_active |= IFM_ETH_MASTER;
861 }
862 }
863 }
864
865
866
867
868
869
870
871
872
873 int
874 em_media_change(struct ifnet *ifp)
875 {
876 struct em_softc *sc = ifp->if_softc;
877 struct ifmedia *ifm = &sc->media;
878
879 INIT_DEBUGOUT("em_media_change: begin");
880
881 if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
882 return (EINVAL);
883
884 switch (IFM_SUBTYPE(ifm->ifm_media)) {
885 case IFM_AUTO:
886 sc->hw.autoneg = DO_AUTO_NEG;
887 sc->hw.autoneg_advertised = AUTONEG_ADV_DEFAULT;
888 break;
889 case IFM_1000_LX:
890 case IFM_1000_SX:
891 case IFM_1000_T:
892 sc->hw.autoneg = DO_AUTO_NEG;
893 sc->hw.autoneg_advertised = ADVERTISE_1000_FULL;
894 break;
895 case IFM_100_TX:
896 sc->hw.autoneg = FALSE;
897 sc->hw.autoneg_advertised = 0;
898 if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
899 sc->hw.forced_speed_duplex = em_100_full;
900 else
901 sc->hw.forced_speed_duplex = em_100_half;
902 break;
903 case IFM_10_T:
904 sc->hw.autoneg = FALSE;
905 sc->hw.autoneg_advertised = 0;
906 if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
907 sc->hw.forced_speed_duplex = em_10_full;
908 else
909 sc->hw.forced_speed_duplex = em_10_half;
910 break;
911 default:
912 printf("%s: Unsupported media type\n", sc->sc_dv.dv_xname);
913 }
914
915
916
917
918
919 sc->hw.phy_reset_disable = FALSE;
920
921 em_init(sc);
922
923 return (0);
924 }
925
926
927
928
929
930
931
932 int
933 em_encap(struct em_softc *sc, struct mbuf *m_head)
934 {
935 u_int32_t txd_upper;
936 u_int32_t txd_lower, txd_used = 0, txd_saved = 0;
937 int i, j, first, error = 0, last = 0;
938 bus_dmamap_t map;
939
940
941 DESC_ARRAY desc_array;
942 u_int32_t array_elements;
943 u_int32_t counter;
944
945 struct em_buffer *tx_buffer, *tx_buffer_mapped;
946 struct em_tx_desc *current_tx_desc = NULL;
947
948
949
950
951
952 if (sc->num_tx_desc_avail <= EM_TX_CLEANUP_THRESHOLD) {
953 em_txeof(sc);
954
955 if (sc->num_tx_desc_avail <= EM_TX_OP_THRESHOLD) {
956 sc->no_tx_desc_avail1++;
957 return (ENOBUFS);
958 }
959 }
960
961
962
963
964
965
966
967
968
969 first = sc->next_avail_tx_desc;
970 tx_buffer = &sc->tx_buffer_area[first];
971 tx_buffer_mapped = tx_buffer;
972 map = tx_buffer->map;
973
974 error = bus_dmamap_load_mbuf(sc->txtag, map, m_head, BUS_DMA_NOWAIT);
975 if (error != 0) {
976 sc->no_tx_dma_setup++;
977 return (error);
978 }
979 EM_KASSERT(map->dm_nsegs!= 0, ("em_encap: empty packet"));
980
981 if (map->dm_nsegs > sc->num_tx_desc_avail - 2)
982 goto fail;
983
984 #ifdef EM_CSUM_OFFLOAD
985 if (sc->hw.mac_type >= em_82543)
986 em_transmit_checksum_setup(sc, m_head, &txd_upper, &txd_lower);
987 else
988 txd_upper = txd_lower = 0;
989 #else
990 txd_upper = txd_lower = 0;
991 #endif
992
993 i = sc->next_avail_tx_desc;
994 if (sc->pcix_82544)
995 txd_saved = i;
996
997 for (j = 0; j < map->dm_nsegs; j++) {
998
999 if (sc->pcix_82544) {
1000
1001
1002
1003
1004 array_elements = em_fill_descriptors(map->dm_segs[j].ds_addr,
1005 map->dm_segs[j].ds_len,
1006 &desc_array);
1007 for (counter = 0; counter < array_elements; counter++) {
1008 if (txd_used == sc->num_tx_desc_avail) {
1009 sc->next_avail_tx_desc = txd_saved;
1010 goto fail;
1011 }
1012 tx_buffer = &sc->tx_buffer_area[i];
1013 current_tx_desc = &sc->tx_desc_base[i];
1014 current_tx_desc->buffer_addr = htole64(
1015 desc_array.descriptor[counter].address);
1016 current_tx_desc->lower.data = htole32(
1017 (sc->txd_cmd | txd_lower |
1018 (u_int16_t)desc_array.descriptor[counter].length));
1019 current_tx_desc->upper.data = htole32((txd_upper));
1020 last = i;
1021 if (++i == sc->num_tx_desc)
1022 i = 0;
1023
1024 tx_buffer->m_head = NULL;
1025 tx_buffer->next_eop = -1;
1026 txd_used++;
1027 }
1028 } else {
1029 tx_buffer = &sc->tx_buffer_area[i];
1030 current_tx_desc = &sc->tx_desc_base[i];
1031
1032 current_tx_desc->buffer_addr = htole64(map->dm_segs[j].ds_addr);
1033 current_tx_desc->lower.data = htole32(
1034 sc->txd_cmd | txd_lower | map->dm_segs[j].ds_len);
1035 current_tx_desc->upper.data = htole32(txd_upper);
1036 last = i;
1037 if (++i == sc->num_tx_desc)
1038 i = 0;
1039
1040 tx_buffer->m_head = NULL;
1041 tx_buffer->next_eop = -1;
1042 }
1043 }
1044
1045 sc->next_avail_tx_desc = i;
1046 if (sc->pcix_82544)
1047 sc->num_tx_desc_avail -= txd_used;
1048 else
1049 sc->num_tx_desc_avail -= map->dm_nsegs;
1050
1051 tx_buffer->m_head = m_head;
1052 tx_buffer_mapped->map = tx_buffer->map;
1053 tx_buffer->map = map;
1054 bus_dmamap_sync(sc->txtag, map, 0, map->dm_mapsize,
1055 BUS_DMASYNC_PREWRITE);
1056
1057
1058
1059
1060
1061
1062 current_tx_desc->lower.data |=
1063 htole32(E1000_TXD_CMD_EOP | E1000_TXD_CMD_RS);
1064
1065
1066
1067
1068
1069 tx_buffer = &sc->tx_buffer_area[first];
1070 tx_buffer->next_eop = last;
1071
1072
1073
1074
1075
1076
1077 bus_dmamap_sync(sc->txdma.dma_tag, sc->txdma.dma_map, 0,
1078 sc->txdma.dma_map->dm_mapsize,
1079 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1080 if (sc->hw.mac_type == em_82547 &&
1081 sc->link_duplex == HALF_DUPLEX) {
1082 em_82547_move_tail_locked(sc);
1083 } else {
1084 E1000_WRITE_REG(&sc->hw, TDT, i);
1085 if (sc->hw.mac_type == em_82547)
1086 em_82547_update_fifo_head(sc, m_head->m_pkthdr.len);
1087 }
1088
1089 return (0);
1090
1091 fail:
1092 sc->no_tx_desc_avail2++;
1093 bus_dmamap_unload(sc->txtag, map);
1094 return (ENOBUFS);
1095 }
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105 void
1106 em_82547_move_tail_locked(struct em_softc *sc)
1107 {
1108 uint16_t hw_tdt;
1109 uint16_t sw_tdt;
1110 struct em_tx_desc *tx_desc;
1111 uint16_t length = 0;
1112 boolean_t eop = 0;
1113
1114 hw_tdt = E1000_READ_REG(&sc->hw, TDT);
1115 sw_tdt = sc->next_avail_tx_desc;
1116
1117 while (hw_tdt != sw_tdt) {
1118 tx_desc = &sc->tx_desc_base[hw_tdt];
1119 length += tx_desc->lower.flags.length;
1120 eop = tx_desc->lower.data & E1000_TXD_CMD_EOP;
1121 if (++hw_tdt == sc->num_tx_desc)
1122 hw_tdt = 0;
1123
1124 if (eop) {
1125 if (em_82547_fifo_workaround(sc, length)) {
1126 sc->tx_fifo_wrk_cnt++;
1127 timeout_add(&sc->tx_fifo_timer_handle, 1);
1128 break;
1129 }
1130 E1000_WRITE_REG(&sc->hw, TDT, hw_tdt);
1131 em_82547_update_fifo_head(sc, length);
1132 length = 0;
1133 }
1134 }
1135 }
1136
1137 void
1138 em_82547_move_tail(void *arg)
1139 {
1140 struct em_softc *sc = arg;
1141 int s;
1142
1143 s = splnet();
1144 em_82547_move_tail_locked(sc);
1145 splx(s);
1146 }
1147
1148 int
1149 em_82547_fifo_workaround(struct em_softc *sc, int len)
1150 {
1151 int fifo_space, fifo_pkt_len;
1152
1153 fifo_pkt_len = EM_ROUNDUP(len + EM_FIFO_HDR, EM_FIFO_HDR);
1154
1155 if (sc->link_duplex == HALF_DUPLEX) {
1156 fifo_space = sc->tx_fifo_size - sc->tx_fifo_head;
1157
1158 if (fifo_pkt_len >= (EM_82547_PKT_THRESH + fifo_space)) {
1159 if (em_82547_tx_fifo_reset(sc))
1160 return (0);
1161 else
1162 return (1);
1163 }
1164 }
1165
1166 return (0);
1167 }
1168
1169 void
1170 em_82547_update_fifo_head(struct em_softc *sc, int len)
1171 {
1172 int fifo_pkt_len = EM_ROUNDUP(len + EM_FIFO_HDR, EM_FIFO_HDR);
1173
1174
1175 sc->tx_fifo_head += fifo_pkt_len;
1176 if (sc->tx_fifo_head >= sc->tx_fifo_size)
1177 sc->tx_fifo_head -= sc->tx_fifo_size;
1178 }
1179
1180 int
1181 em_82547_tx_fifo_reset(struct em_softc *sc)
1182 {
1183 uint32_t tctl;
1184
1185 if ((E1000_READ_REG(&sc->hw, TDT) ==
1186 E1000_READ_REG(&sc->hw, TDH)) &&
1187 (E1000_READ_REG(&sc->hw, TDFT) ==
1188 E1000_READ_REG(&sc->hw, TDFH)) &&
1189 (E1000_READ_REG(&sc->hw, TDFTS) ==
1190 E1000_READ_REG(&sc->hw, TDFHS)) &&
1191 (E1000_READ_REG(&sc->hw, TDFPC) == 0)) {
1192
1193
1194 tctl = E1000_READ_REG(&sc->hw, TCTL);
1195 E1000_WRITE_REG(&sc->hw, TCTL, tctl & ~E1000_TCTL_EN);
1196
1197
1198 E1000_WRITE_REG(&sc->hw, TDFT, sc->tx_head_addr);
1199 E1000_WRITE_REG(&sc->hw, TDFH, sc->tx_head_addr);
1200 E1000_WRITE_REG(&sc->hw, TDFTS, sc->tx_head_addr);
1201 E1000_WRITE_REG(&sc->hw, TDFHS, sc->tx_head_addr);
1202
1203
1204 E1000_WRITE_REG(&sc->hw, TCTL, tctl);
1205 E1000_WRITE_FLUSH(&sc->hw);
1206
1207 sc->tx_fifo_head = 0;
1208 sc->tx_fifo_reset_cnt++;
1209
1210 return (TRUE);
1211 } else
1212 return (FALSE);
1213 }
1214
1215 void
1216 em_set_promisc(struct em_softc *sc)
1217 {
1218 u_int32_t reg_rctl;
1219 struct ifnet *ifp = &sc->interface_data.ac_if;
1220
1221 reg_rctl = E1000_READ_REG(&sc->hw, RCTL);
1222
1223 if (ifp->if_flags & IFF_PROMISC) {
1224 reg_rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
1225 } else if (ifp->if_flags & IFF_ALLMULTI) {
1226 reg_rctl |= E1000_RCTL_MPE;
1227 reg_rctl &= ~E1000_RCTL_UPE;
1228 } else {
1229 reg_rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE);
1230 }
1231 E1000_WRITE_REG(&sc->hw, RCTL, reg_rctl);
1232 }
1233
1234
1235
1236
1237
1238
1239
1240
1241 void
1242 em_set_multi(struct em_softc *sc)
1243 {
1244 u_int32_t reg_rctl = 0;
1245 u_int8_t mta[MAX_NUM_MULTICAST_ADDRESSES * ETH_LENGTH_OF_ADDRESS];
1246 int mcnt = 0;
1247 struct ifnet *ifp = &sc->interface_data.ac_if;
1248 struct arpcom *ac = &sc->interface_data;
1249 struct ether_multi *enm;
1250 struct ether_multistep step;
1251
1252 IOCTL_DEBUGOUT("em_set_multi: begin");
1253
1254 if (sc->hw.mac_type == em_82542_rev2_0) {
1255 reg_rctl = E1000_READ_REG(&sc->hw, RCTL);
1256 if (sc->hw.pci_cmd_word & CMD_MEM_WRT_INVALIDATE)
1257 em_pci_clear_mwi(&sc->hw);
1258 reg_rctl |= E1000_RCTL_RST;
1259 E1000_WRITE_REG(&sc->hw, RCTL, reg_rctl);
1260 msec_delay(5);
1261 }
1262 ETHER_FIRST_MULTI(step, ac, enm);
1263 while (enm != NULL) {
1264 if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
1265 ifp->if_flags |= IFF_ALLMULTI;
1266 mcnt = MAX_NUM_MULTICAST_ADDRESSES;
1267 }
1268 if (mcnt == MAX_NUM_MULTICAST_ADDRESSES)
1269 break;
1270 bcopy(enm->enm_addrlo, &mta[mcnt*ETH_LENGTH_OF_ADDRESS],
1271 ETH_LENGTH_OF_ADDRESS);
1272 mcnt++;
1273 ETHER_NEXT_MULTI(step, enm);
1274 }
1275
1276 if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES) {
1277 reg_rctl = E1000_READ_REG(&sc->hw, RCTL);
1278 reg_rctl |= E1000_RCTL_MPE;
1279 E1000_WRITE_REG(&sc->hw, RCTL, reg_rctl);
1280 } else
1281 em_mc_addr_list_update(&sc->hw, mta, mcnt, 0, 1);
1282
1283 if (sc->hw.mac_type == em_82542_rev2_0) {
1284 reg_rctl = E1000_READ_REG(&sc->hw, RCTL);
1285 reg_rctl &= ~E1000_RCTL_RST;
1286 E1000_WRITE_REG(&sc->hw, RCTL, reg_rctl);
1287 msec_delay(5);
1288 if (sc->hw.pci_cmd_word & CMD_MEM_WRT_INVALIDATE)
1289 em_pci_set_mwi(&sc->hw);
1290 }
1291 }
1292
1293
1294
1295
1296
1297
1298
1299
1300 void
1301 em_local_timer(void *arg)
1302 {
1303 struct ifnet *ifp;
1304 struct em_softc *sc = arg;
1305 int s;
1306
1307 ifp = &sc->interface_data.ac_if;
1308
1309 s = splnet();
1310
1311 em_check_for_link(&sc->hw);
1312 em_update_link_status(sc);
1313 em_update_stats_counters(sc);
1314 if (em_display_debug_stats && ifp->if_flags & IFF_RUNNING)
1315 em_print_hw_stats(sc);
1316 em_smartspeed(sc);
1317
1318 timeout_add(&sc->timer_handle, hz);
1319
1320 splx(s);
1321 }
1322
1323 void
1324 em_update_link_status(struct em_softc *sc)
1325 {
1326 struct ifnet *ifp = &sc->interface_data.ac_if;
1327
1328 if (E1000_READ_REG(&sc->hw, STATUS) & E1000_STATUS_LU) {
1329 if (sc->link_active == 0) {
1330 em_get_speed_and_duplex(&sc->hw,
1331 &sc->link_speed,
1332 &sc->link_duplex);
1333
1334 if ((sc->link_speed == SPEED_1000) &&
1335 ((sc->hw.mac_type == em_82571) ||
1336 (sc->hw.mac_type == em_82572))) {
1337 int tarc0;
1338
1339 tarc0 = E1000_READ_REG(&sc->hw, TARC0);
1340 tarc0 |= SPEED_MODE_BIT;
1341 E1000_WRITE_REG(&sc->hw, TARC0, tarc0);
1342 }
1343 sc->link_active = 1;
1344 sc->smartspeed = 0;
1345 ifp->if_baudrate = sc->link_speed * 1000000;
1346 if (sc->link_duplex == FULL_DUPLEX)
1347 ifp->if_link_state = LINK_STATE_FULL_DUPLEX;
1348 else if (sc->link_duplex == HALF_DUPLEX)
1349 ifp->if_link_state = LINK_STATE_HALF_DUPLEX;
1350 else
1351 ifp->if_link_state = LINK_STATE_UP;
1352 if_link_state_change(ifp);
1353 }
1354 } else {
1355 if (sc->link_active == 1) {
1356 ifp->if_baudrate = sc->link_speed = 0;
1357 sc->link_duplex = 0;
1358 sc->link_active = 0;
1359 ifp->if_link_state = LINK_STATE_DOWN;
1360 if_link_state_change(ifp);
1361 }
1362 }
1363 }
1364
1365
1366
1367
1368
1369
1370
1371
1372 void
1373 em_stop(void *arg)
1374 {
1375 struct ifnet *ifp;
1376 struct em_softc *sc = arg;
1377 ifp = &sc->interface_data.ac_if;
1378
1379 INIT_DEBUGOUT("em_stop: begin");
1380 em_disable_intr(sc);
1381 em_reset_hw(&sc->hw);
1382 timeout_del(&sc->timer_handle);
1383 timeout_del(&sc->tx_fifo_timer_handle);
1384
1385
1386 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
1387
1388 em_free_transmit_structures(sc);
1389 em_free_receive_structures(sc);
1390 }
1391
1392
1393
1394
1395
1396
1397 void
1398 em_identify_hardware(struct em_softc *sc)
1399 {
1400 u_int32_t reg;
1401 struct pci_attach_args *pa = &sc->osdep.em_pa;
1402
1403
1404 sc->hw.pci_cmd_word = pci_conf_read(pa->pa_pc, pa->pa_tag,
1405 PCI_COMMAND_STATUS_REG);
1406
1407
1408 sc->hw.vendor_id = PCI_VENDOR(pa->pa_id);
1409 sc->hw.device_id = PCI_PRODUCT(pa->pa_id);
1410
1411 reg = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG);
1412 sc->hw.revision_id = PCI_REVISION(reg);
1413
1414 reg = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
1415 sc->hw.subsystem_vendor_id = PCI_VENDOR(reg);
1416 sc->hw.subsystem_id = PCI_PRODUCT(reg);
1417
1418
1419 if (em_set_mac_type(&sc->hw))
1420 printf("%s: Unknown MAC Type\n", sc->sc_dv.dv_xname);
1421
1422 if (sc->hw.mac_type == em_82541 ||
1423 sc->hw.mac_type == em_82541_rev_2 ||
1424 sc->hw.mac_type == em_82547 ||
1425 sc->hw.mac_type == em_82547_rev_2)
1426 sc->hw.phy_init_script = TRUE;
1427 }
1428
1429 int
1430 em_allocate_pci_resources(struct em_softc *sc)
1431 {
1432 int val, rid;
1433 pci_intr_handle_t ih;
1434 const char *intrstr = NULL;
1435 struct pci_attach_args *pa = &sc->osdep.em_pa;
1436 pci_chipset_tag_t pc = pa->pa_pc;
1437
1438 val = pci_conf_read(pa->pa_pc, pa->pa_tag, EM_MMBA);
1439 if (PCI_MAPREG_TYPE(val) != PCI_MAPREG_TYPE_MEM) {
1440 printf(": mmba is not mem space\n");
1441 return (ENXIO);
1442 }
1443 if (pci_mapreg_map(pa, EM_MMBA, PCI_MAPREG_MEM_TYPE(val), 0,
1444 &sc->osdep.mem_bus_space_tag, &sc->osdep.mem_bus_space_handle,
1445 &sc->osdep.em_membase, &sc->osdep.em_memsize, 0)) {
1446 printf(": cannot find mem space\n");
1447 return (ENXIO);
1448 }
1449
1450 if (sc->hw.mac_type > em_82543) {
1451
1452 for (rid = PCI_MAPREG_START; rid < PCI_MAPREG_END;) {
1453 val = pci_conf_read(pa->pa_pc, pa->pa_tag, rid);
1454 if (PCI_MAPREG_TYPE(val) == PCI_MAPREG_TYPE_IO) {
1455 sc->io_rid = rid;
1456 break;
1457 }
1458 rid += 4;
1459 if (PCI_MAPREG_MEM_TYPE(val) ==
1460 PCI_MAPREG_MEM_TYPE_64BIT)
1461 rid += 4;
1462 }
1463
1464 if (pci_mapreg_map(pa, rid, PCI_MAPREG_TYPE_IO, 0,
1465 &sc->osdep.io_bus_space_tag, &sc->osdep.io_bus_space_handle,
1466 &sc->osdep.em_iobase, &sc->osdep.em_iosize, 0)) {
1467 printf(": cannot find i/o space\n");
1468 return (ENXIO);
1469 }
1470
1471 sc->hw.io_base = 0;
1472 }
1473
1474
1475 if (sc->hw.mac_type == em_ich8lan) {
1476 val = pci_conf_read(pa->pa_pc, pa->pa_tag, EM_FLASH);
1477 if (PCI_MAPREG_TYPE(val) != PCI_MAPREG_TYPE_MEM) {
1478 printf(": flash is not mem space\n");
1479 return (ENXIO);
1480 }
1481
1482 if (pci_mapreg_map(pa, EM_FLASH, PCI_MAPREG_MEM_TYPE(val), 0,
1483 &sc->osdep.flash_bus_space_tag, &sc->osdep.flash_bus_space_handle,
1484 &sc->osdep.em_flashbase, &sc->osdep.em_flashsize, 0)) {
1485 printf(": cannot find mem space\n");
1486 return (ENXIO);
1487 }
1488 }
1489
1490 if (pci_intr_map(pa, &ih)) {
1491 printf(": couldn't map interrupt\n");
1492 return (ENXIO);
1493 }
1494
1495 sc->hw.back = &sc->osdep;
1496
1497 intrstr = pci_intr_string(pc, ih);
1498 sc->sc_intrhand = pci_intr_establish(pc, ih, IPL_NET, em_intr, sc,
1499 sc->sc_dv.dv_xname);
1500 if (sc->sc_intrhand == NULL) {
1501 printf(": couldn't establish interrupt");
1502 if (intrstr != NULL)
1503 printf(" at %s", intrstr);
1504 printf("\n");
1505 return (ENXIO);
1506 }
1507 printf(": %s", intrstr);
1508
1509 return (0);
1510 }
1511
1512 void
1513 em_free_pci_resources(struct em_softc *sc)
1514 {
1515 struct pci_attach_args *pa = &sc->osdep.em_pa;
1516 pci_chipset_tag_t pc = pa->pa_pc;
1517
1518 if (sc->sc_intrhand)
1519 pci_intr_disestablish(pc, sc->sc_intrhand);
1520 sc->sc_intrhand = 0;
1521
1522 if (sc->osdep.em_flashbase)
1523 bus_space_unmap(sc->osdep.flash_bus_space_tag, sc->osdep.flash_bus_space_handle,
1524 sc->osdep.em_flashsize);
1525 sc->osdep.em_flashbase = 0;
1526
1527 if (sc->osdep.em_iobase)
1528 bus_space_unmap(sc->osdep.io_bus_space_tag, sc->osdep.io_bus_space_handle,
1529 sc->osdep.em_iosize);
1530 sc->osdep.em_iobase = 0;
1531
1532 if (sc->osdep.em_membase)
1533 bus_space_unmap(sc->osdep.mem_bus_space_tag, sc->osdep.mem_bus_space_handle,
1534 sc->osdep.em_memsize);
1535 sc->osdep.em_membase = 0;
1536 }
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546 int
1547 em_hardware_init(struct em_softc *sc)
1548 {
1549 u_int16_t rx_buffer_size;
1550
1551 INIT_DEBUGOUT("em_hardware_init: begin");
1552
1553 em_reset_hw(&sc->hw);
1554
1555
1556 sc->tx_fifo_head = 0;
1557
1558
1559 if (em_validate_eeprom_checksum(&sc->hw) < 0) {
1560
1561
1562
1563
1564
1565 if (em_validate_eeprom_checksum(&sc->hw) < 0) {
1566 printf("%s: The EEPROM Checksum Is Not Valid\n",
1567 sc->sc_dv.dv_xname);
1568 return (EIO);
1569 }
1570 }
1571
1572 if (em_read_part_num(&sc->hw, &(sc->part_num)) < 0) {
1573 printf("%s: EEPROM read error while reading part number\n",
1574 sc->sc_dv.dv_xname);
1575 return (EIO);
1576 }
1577
1578
1579 if (!em_smart_pwr_down &&
1580 (sc->hw.mac_type == em_82571 ||
1581 sc->hw.mac_type == em_82572)) {
1582 uint16_t phy_tmp = 0;
1583
1584
1585 em_read_phy_reg(&sc->hw, IGP02E1000_PHY_POWER_MGMT, &phy_tmp);
1586 phy_tmp &= ~IGP02E1000_PM_SPD;
1587 em_write_phy_reg(&sc->hw, IGP02E1000_PHY_POWER_MGMT, phy_tmp);
1588 }
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604 rx_buffer_size = ((E1000_READ_REG(&sc->hw, PBA) & 0xffff) << 10 );
1605
1606 sc->hw.fc_high_water = rx_buffer_size -
1607 EM_ROUNDUP(sc->hw.max_frame_size, 1024);
1608 sc->hw.fc_low_water = sc->hw.fc_high_water - 1500;
1609 if (sc->hw.mac_type == em_80003es2lan)
1610 sc->hw.fc_pause_time = 0xFFFF;
1611 else
1612 sc->hw.fc_pause_time = 1000;
1613 sc->hw.fc_send_xon = TRUE;
1614 sc->hw.fc = E1000_FC_FULL;
1615
1616 if (em_init_hw(&sc->hw) < 0) {
1617 printf("%s: Hardware Initialization Failed",
1618 sc->sc_dv.dv_xname);
1619 return (EIO);
1620 }
1621
1622 em_check_for_link(&sc->hw);
1623
1624 return (0);
1625 }
1626
1627
1628
1629
1630
1631
1632 void
1633 em_setup_interface(struct em_softc *sc)
1634 {
1635 struct ifnet *ifp;
1636 u_char fiber_type = IFM_1000_SX;
1637
1638 INIT_DEBUGOUT("em_setup_interface: begin");
1639
1640 ifp = &sc->interface_data.ac_if;
1641 strlcpy(ifp->if_xname, sc->sc_dv.dv_xname, IFNAMSIZ);
1642 ifp->if_softc = sc;
1643 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1644 ifp->if_ioctl = em_ioctl;
1645 ifp->if_start = em_start;
1646 ifp->if_watchdog = em_watchdog;
1647 ifp->if_hardmtu =
1648 sc->hw.max_frame_size - ETHER_HDR_LEN - ETHER_CRC_LEN;
1649 IFQ_SET_MAXLEN(&ifp->if_snd, sc->num_tx_desc - 1);
1650 IFQ_SET_READY(&ifp->if_snd);
1651
1652 ifp->if_capabilities = IFCAP_VLAN_MTU;
1653
1654 #ifdef EM_CSUM_OFFLOAD
1655 if (sc->hw.mac_type >= em_82543)
1656 ifp->if_capabilities |= IFCAP_CSUM_TCPv4|IFCAP_CSUM_UDPv4;
1657 #endif
1658
1659
1660
1661
1662
1663 ifmedia_init(&sc->media, IFM_IMASK, em_media_change,
1664 em_media_status);
1665 if (sc->hw.media_type == em_media_type_fiber ||
1666 sc->hw.media_type == em_media_type_internal_serdes) {
1667 if (sc->hw.mac_type == em_82545)
1668 fiber_type = IFM_1000_LX;
1669 ifmedia_add(&sc->media, IFM_ETHER | fiber_type | IFM_FDX,
1670 0, NULL);
1671 ifmedia_add(&sc->media, IFM_ETHER | fiber_type,
1672 0, NULL);
1673 } else {
1674 ifmedia_add(&sc->media, IFM_ETHER | IFM_10_T, 0, NULL);
1675 ifmedia_add(&sc->media, IFM_ETHER | IFM_10_T | IFM_FDX,
1676 0, NULL);
1677 ifmedia_add(&sc->media, IFM_ETHER | IFM_100_TX,
1678 0, NULL);
1679 ifmedia_add(&sc->media, IFM_ETHER | IFM_100_TX | IFM_FDX,
1680 0, NULL);
1681 if (sc->hw.phy_type != em_phy_ife) {
1682 ifmedia_add(&sc->media, IFM_ETHER | IFM_1000_T | IFM_FDX,
1683 0, NULL);
1684 ifmedia_add(&sc->media, IFM_ETHER | IFM_1000_T, 0, NULL);
1685 }
1686 }
1687 ifmedia_add(&sc->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1688 ifmedia_set(&sc->media, IFM_ETHER | IFM_AUTO);
1689
1690 if_attach(ifp);
1691 ether_ifattach(ifp);
1692 }
1693
1694
1695
1696
1697
1698
1699
1700 void
1701 em_smartspeed(struct em_softc *sc)
1702 {
1703 uint16_t phy_tmp;
1704
1705 if (sc->link_active || (sc->hw.phy_type != em_phy_igp) ||
1706 !sc->hw.autoneg || !(sc->hw.autoneg_advertised & ADVERTISE_1000_FULL))
1707 return;
1708
1709 if (sc->smartspeed == 0) {
1710
1711
1712 em_read_phy_reg(&sc->hw, PHY_1000T_STATUS, &phy_tmp);
1713 if (!(phy_tmp & SR_1000T_MS_CONFIG_FAULT))
1714 return;
1715 em_read_phy_reg(&sc->hw, PHY_1000T_STATUS, &phy_tmp);
1716 if (phy_tmp & SR_1000T_MS_CONFIG_FAULT) {
1717 em_read_phy_reg(&sc->hw, PHY_1000T_CTRL,
1718 &phy_tmp);
1719 if (phy_tmp & CR_1000T_MS_ENABLE) {
1720 phy_tmp &= ~CR_1000T_MS_ENABLE;
1721 em_write_phy_reg(&sc->hw,
1722 PHY_1000T_CTRL, phy_tmp);
1723 sc->smartspeed++;
1724 if (sc->hw.autoneg &&
1725 !em_phy_setup_autoneg(&sc->hw) &&
1726 !em_read_phy_reg(&sc->hw, PHY_CTRL,
1727 &phy_tmp)) {
1728 phy_tmp |= (MII_CR_AUTO_NEG_EN |
1729 MII_CR_RESTART_AUTO_NEG);
1730 em_write_phy_reg(&sc->hw,
1731 PHY_CTRL, phy_tmp);
1732 }
1733 }
1734 }
1735 return;
1736 } else if (sc->smartspeed == EM_SMARTSPEED_DOWNSHIFT) {
1737
1738 em_read_phy_reg(&sc->hw, PHY_1000T_CTRL, &phy_tmp);
1739 phy_tmp |= CR_1000T_MS_ENABLE;
1740 em_write_phy_reg(&sc->hw, PHY_1000T_CTRL, phy_tmp);
1741 if (sc->hw.autoneg &&
1742 !em_phy_setup_autoneg(&sc->hw) &&
1743 !em_read_phy_reg(&sc->hw, PHY_CTRL, &phy_tmp)) {
1744 phy_tmp |= (MII_CR_AUTO_NEG_EN |
1745 MII_CR_RESTART_AUTO_NEG);
1746 em_write_phy_reg(&sc->hw, PHY_CTRL, phy_tmp);
1747 }
1748 }
1749
1750 if (sc->smartspeed++ == EM_SMARTSPEED_MAX)
1751 sc->smartspeed = 0;
1752 }
1753
1754
1755
1756
1757 int
1758 em_dma_malloc(struct em_softc *sc, bus_size_t size,
1759 struct em_dma_alloc *dma, int mapflags)
1760 {
1761 int r;
1762
1763 dma->dma_tag = sc->osdep.em_pa.pa_dmat;
1764 r = bus_dmamap_create(dma->dma_tag, size, 1,
1765 size, 0, BUS_DMA_NOWAIT, &dma->dma_map);
1766 if (r != 0) {
1767 printf("%s: em_dma_malloc: bus_dmamap_create failed; "
1768 "error %u\n", sc->sc_dv.dv_xname, r);
1769 goto fail_0;
1770 }
1771
1772 r = bus_dmamem_alloc(dma->dma_tag, size, PAGE_SIZE, 0, &dma->dma_seg,
1773 1, &dma->dma_nseg, BUS_DMA_NOWAIT);
1774 if (r != 0) {
1775 printf("%s: em_dma_malloc: bus_dmammem_alloc failed; "
1776 "size %lu, error %d\n", sc->sc_dv.dv_xname,
1777 (unsigned long)size, r);
1778 goto fail_1;
1779 }
1780
1781 r = bus_dmamem_map(dma->dma_tag, &dma->dma_seg, dma->dma_nseg, size,
1782 &dma->dma_vaddr, BUS_DMA_NOWAIT);
1783 if (r != 0) {
1784 printf("%s: em_dma_malloc: bus_dmammem_map failed; "
1785 "size %lu, error %d\n", sc->sc_dv.dv_xname,
1786 (unsigned long)size, r);
1787 goto fail_2;
1788 }
1789
1790 r = bus_dmamap_load(sc->osdep.em_pa.pa_dmat, dma->dma_map,
1791 dma->dma_vaddr,
1792 size,
1793 NULL,
1794 mapflags | BUS_DMA_NOWAIT);
1795 if (r != 0) {
1796 printf("%s: em_dma_malloc: bus_dmamap_load failed; "
1797 "error %u\n", sc->sc_dv.dv_xname, r);
1798 goto fail_3;
1799 }
1800
1801 dma->dma_size = size;
1802 return (0);
1803
1804 fail_3:
1805 bus_dmamem_unmap(dma->dma_tag, dma->dma_vaddr, size);
1806 fail_2:
1807 bus_dmamem_free(dma->dma_tag, &dma->dma_seg, dma->dma_nseg);
1808 fail_1:
1809 bus_dmamap_destroy(dma->dma_tag, dma->dma_map);
1810 fail_0:
1811 dma->dma_map = NULL;
1812 dma->dma_tag = NULL;
1813
1814 return (r);
1815 }
1816
1817 void
1818 em_dma_free(struct em_softc *sc, struct em_dma_alloc *dma)
1819 {
1820 if (dma->dma_tag == NULL)
1821 return;
1822
1823 if (dma->dma_map != NULL) {
1824 bus_dmamap_sync(dma->dma_tag, dma->dma_map, 0,
1825 dma->dma_map->dm_mapsize,
1826 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
1827 bus_dmamap_unload(dma->dma_tag, dma->dma_map);
1828 bus_dmamem_unmap(dma->dma_tag, dma->dma_vaddr, dma->dma_size);
1829 bus_dmamem_free(dma->dma_tag, &dma->dma_seg, dma->dma_nseg);
1830 bus_dmamap_destroy(dma->dma_tag, dma->dma_map);
1831 }
1832 dma->dma_tag = NULL;
1833 }
1834
1835
1836
1837
1838
1839
1840
1841 int
1842 em_allocate_transmit_structures(struct em_softc *sc)
1843 {
1844 if (!(sc->tx_buffer_area =
1845 (struct em_buffer *) malloc(sizeof(struct em_buffer) *
1846 sc->num_tx_desc, M_DEVBUF,
1847 M_NOWAIT))) {
1848 printf("%s: Unable to allocate tx_buffer memory\n",
1849 sc->sc_dv.dv_xname);
1850 return (ENOMEM);
1851 }
1852
1853 bzero(sc->tx_buffer_area,
1854 sizeof(struct em_buffer) * sc->num_tx_desc);
1855
1856 return (0);
1857 }
1858
1859
1860
1861
1862
1863
1864 int
1865 em_setup_transmit_structures(struct em_softc *sc)
1866 {
1867 struct em_buffer *tx_buffer;
1868 int error, i;
1869
1870 if ((error = em_allocate_transmit_structures(sc)) != 0)
1871 goto fail;
1872
1873 bzero((void *) sc->tx_desc_base,
1874 (sizeof(struct em_tx_desc)) * sc->num_tx_desc);
1875
1876 sc->txtag = sc->osdep.em_pa.pa_dmat;
1877
1878 tx_buffer = sc->tx_buffer_area;
1879 for (i = 0; i < sc->num_tx_desc; i++) {
1880 error = bus_dmamap_create(sc->txtag, MAX_JUMBO_FRAME_SIZE,
1881 EM_MAX_SCATTER, MAX_JUMBO_FRAME_SIZE, 0,
1882 BUS_DMA_NOWAIT, &tx_buffer->map);
1883 if (error != 0) {
1884 printf("%s: Unable to create TX DMA map\n",
1885 sc->sc_dv.dv_xname);
1886 goto fail;
1887 }
1888 tx_buffer++;
1889 }
1890
1891 sc->next_avail_tx_desc = 0;
1892 sc->next_tx_to_clean = 0;
1893
1894
1895 sc->num_tx_desc_avail = sc->num_tx_desc;
1896
1897
1898 sc->active_checksum_context = OFFLOAD_NONE;
1899 bus_dmamap_sync(sc->txdma.dma_tag, sc->txdma.dma_map, 0,
1900 sc->txdma.dma_size, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1901
1902 return (0);
1903
1904 fail:
1905 em_free_transmit_structures(sc);
1906 return (error);
1907 }
1908
1909
1910
1911
1912
1913
1914 void
1915 em_initialize_transmit_unit(struct em_softc *sc)
1916 {
1917 u_int32_t reg_tctl, reg_tipg = 0;
1918 u_int64_t bus_addr;
1919
1920 INIT_DEBUGOUT("em_initialize_transmit_unit: begin");
1921
1922
1923 bus_addr = sc->txdma.dma_map->dm_segs[0].ds_addr;
1924 E1000_WRITE_REG(&sc->hw, TDLEN,
1925 sc->num_tx_desc *
1926 sizeof(struct em_tx_desc));
1927 E1000_WRITE_REG(&sc->hw, TDBAH, (u_int32_t)(bus_addr >> 32));
1928 E1000_WRITE_REG(&sc->hw, TDBAL, (u_int32_t)bus_addr);
1929
1930
1931 E1000_WRITE_REG(&sc->hw, TDT, 0);
1932 E1000_WRITE_REG(&sc->hw, TDH, 0);
1933
1934 HW_DEBUGOUT2("Base = %x, Length = %x\n",
1935 E1000_READ_REG(&sc->hw, TDBAL),
1936 E1000_READ_REG(&sc->hw, TDLEN));
1937
1938
1939 switch (sc->hw.mac_type) {
1940 case em_82542_rev2_0:
1941 case em_82542_rev2_1:
1942 reg_tipg = DEFAULT_82542_TIPG_IPGT;
1943 reg_tipg |= DEFAULT_82542_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT;
1944 reg_tipg |= DEFAULT_82542_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT;
1945 break;
1946 case em_80003es2lan:
1947 reg_tipg = DEFAULT_82543_TIPG_IPGR1;
1948 reg_tipg |= DEFAULT_80003ES2LAN_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT;
1949 break;
1950 default:
1951 if (sc->hw.media_type == em_media_type_fiber ||
1952 sc->hw.media_type == em_media_type_internal_serdes)
1953 reg_tipg = DEFAULT_82543_TIPG_IPGT_FIBER;
1954 else
1955 reg_tipg = DEFAULT_82543_TIPG_IPGT_COPPER;
1956 reg_tipg |= DEFAULT_82543_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT;
1957 reg_tipg |= DEFAULT_82543_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT;
1958 }
1959
1960 E1000_WRITE_REG(&sc->hw, TIPG, reg_tipg);
1961 E1000_WRITE_REG(&sc->hw, TIDV, sc->tx_int_delay);
1962 if (sc->hw.mac_type >= em_82540)
1963 E1000_WRITE_REG(&sc->hw, TADV, sc->tx_abs_int_delay);
1964
1965
1966 reg_tctl = E1000_TCTL_PSP | E1000_TCTL_EN |
1967 (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
1968 if (sc->hw.mac_type >= em_82571)
1969 reg_tctl |= E1000_TCTL_MULR;
1970 if (sc->link_duplex == FULL_DUPLEX)
1971 reg_tctl |= E1000_FDX_COLLISION_DISTANCE << E1000_COLD_SHIFT;
1972 else
1973 reg_tctl |= E1000_HDX_COLLISION_DISTANCE << E1000_COLD_SHIFT;
1974
1975 E1000_WRITE_REG(&sc->hw, TCTL, reg_tctl);
1976
1977
1978 sc->txd_cmd = E1000_TXD_CMD_IFCS;
1979
1980 if (sc->tx_int_delay > 0)
1981 sc->txd_cmd |= E1000_TXD_CMD_IDE;
1982 }
1983
1984
1985
1986
1987
1988
1989 void
1990 em_free_transmit_structures(struct em_softc *sc)
1991 {
1992 struct em_buffer *tx_buffer;
1993 int i;
1994
1995 INIT_DEBUGOUT("free_transmit_structures: begin");
1996
1997 if (sc->tx_buffer_area != NULL) {
1998 tx_buffer = sc->tx_buffer_area;
1999 for (i = 0; i < sc->num_tx_desc; i++, tx_buffer++) {
2000 if (tx_buffer->map != NULL &&
2001 tx_buffer->map->dm_nsegs > 0) {
2002 bus_dmamap_sync(sc->txtag, tx_buffer->map,
2003 0, tx_buffer->map->dm_mapsize,
2004 BUS_DMASYNC_POSTWRITE);
2005 bus_dmamap_unload(sc->txtag,
2006 tx_buffer->map);
2007 }
2008 if (tx_buffer->m_head != NULL) {
2009 m_freem(tx_buffer->m_head);
2010 tx_buffer->m_head = NULL;
2011 }
2012 if (tx_buffer->map != NULL) {
2013 bus_dmamap_destroy(sc->txtag,
2014 tx_buffer->map);
2015 tx_buffer->map = NULL;
2016 }
2017 }
2018 }
2019 if (sc->tx_buffer_area != NULL) {
2020 free(sc->tx_buffer_area, M_DEVBUF);
2021 sc->tx_buffer_area = NULL;
2022 }
2023 if (sc->txtag != NULL)
2024 sc->txtag = NULL;
2025 }
2026
2027 #ifdef EM_CSUM_OFFLOAD
2028
2029
2030
2031
2032
2033
2034
2035 void
2036 em_transmit_checksum_setup(struct em_softc *sc, struct mbuf *mp,
2037 u_int32_t *txd_upper, u_int32_t *txd_lower)
2038 {
2039 struct em_context_desc *TXD;
2040 struct em_buffer *tx_buffer;
2041 int curr_txd;
2042
2043 if (mp->m_pkthdr.csum_flags) {
2044 if (mp->m_pkthdr.csum_flags & M_TCPV4_CSUM_OUT) {
2045 *txd_upper = E1000_TXD_POPTS_TXSM << 8;
2046 *txd_lower = E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
2047 if (sc->active_checksum_context == OFFLOAD_TCP_IP)
2048 return;
2049 else
2050 sc->active_checksum_context = OFFLOAD_TCP_IP;
2051 } else if (mp->m_pkthdr.csum_flags & M_UDPV4_CSUM_OUT) {
2052 *txd_upper = E1000_TXD_POPTS_TXSM << 8;
2053 *txd_lower = E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
2054 if (sc->active_checksum_context == OFFLOAD_UDP_IP)
2055 return;
2056 else
2057 sc->active_checksum_context = OFFLOAD_UDP_IP;
2058 } else {
2059 *txd_upper = 0;
2060 *txd_lower = 0;
2061 return;
2062 }
2063 } else {
2064 *txd_upper = 0;
2065 *txd_lower = 0;
2066 return;
2067 }
2068
2069
2070
2071
2072 curr_txd = sc->next_avail_tx_desc;
2073 tx_buffer = &sc->tx_buffer_area[curr_txd];
2074 TXD = (struct em_context_desc *) &sc->tx_desc_base[curr_txd];
2075
2076 TXD->lower_setup.ip_fields.ipcss = ETHER_HDR_LEN;
2077 TXD->lower_setup.ip_fields.ipcso =
2078 ETHER_HDR_LEN + offsetof(struct ip, ip_sum);
2079 TXD->lower_setup.ip_fields.ipcse =
2080 htole16(ETHER_HDR_LEN + sizeof(struct ip) - 1);
2081
2082 TXD->upper_setup.tcp_fields.tucss =
2083 ETHER_HDR_LEN + sizeof(struct ip);
2084 TXD->upper_setup.tcp_fields.tucse = htole16(0);
2085
2086 if (sc->active_checksum_context == OFFLOAD_TCP_IP) {
2087 TXD->upper_setup.tcp_fields.tucso =
2088 ETHER_HDR_LEN + sizeof(struct ip) +
2089 offsetof(struct tcphdr, th_sum);
2090 } else if (sc->active_checksum_context == OFFLOAD_UDP_IP) {
2091 TXD->upper_setup.tcp_fields.tucso =
2092 ETHER_HDR_LEN + sizeof(struct ip) +
2093 offsetof(struct udphdr, uh_sum);
2094 }
2095
2096 TXD->tcp_seg_setup.data = htole32(0);
2097 TXD->cmd_and_length = htole32(sc->txd_cmd | E1000_TXD_CMD_DEXT);
2098
2099 tx_buffer->m_head = NULL;
2100 tx_buffer->next_eop = -1;
2101
2102 if (++curr_txd == sc->num_tx_desc)
2103 curr_txd = 0;
2104
2105 sc->num_tx_desc_avail--;
2106 sc->next_avail_tx_desc = curr_txd;
2107 }
2108 #endif
2109
2110
2111
2112
2113
2114
2115
2116
2117 void
2118 em_txeof(struct em_softc *sc)
2119 {
2120 int first, last, done, num_avail;
2121 struct em_buffer *tx_buffer;
2122 struct em_tx_desc *tx_desc, *eop_desc;
2123 struct ifnet *ifp = &sc->interface_data.ac_if;
2124
2125 if (sc->num_tx_desc_avail == sc->num_tx_desc)
2126 return;
2127
2128 num_avail = sc->num_tx_desc_avail;
2129 first = sc->next_tx_to_clean;
2130 tx_desc = &sc->tx_desc_base[first];
2131 tx_buffer = &sc->tx_buffer_area[first];
2132 last = tx_buffer->next_eop;
2133 eop_desc = &sc->tx_desc_base[last];
2134
2135
2136
2137
2138
2139
2140
2141 if (++last == sc->num_tx_desc)
2142 last = 0;
2143 done = last;
2144
2145 bus_dmamap_sync(sc->txdma.dma_tag, sc->txdma.dma_map, 0,
2146 sc->txdma.dma_map->dm_mapsize, BUS_DMASYNC_POSTREAD);
2147 while (eop_desc->upper.fields.status & E1000_TXD_STAT_DD) {
2148
2149 while (first != done) {
2150 tx_desc->upper.data = 0;
2151 tx_desc->lower.data = 0;
2152 num_avail++;
2153
2154 if (tx_buffer->m_head != NULL) {
2155 ifp->if_opackets++;
2156 if (tx_buffer->map->dm_nsegs > 0) {
2157 bus_dmamap_sync(sc->txtag,
2158 tx_buffer->map, 0,
2159 tx_buffer->map->dm_mapsize,
2160 BUS_DMASYNC_POSTWRITE);
2161 bus_dmamap_unload(sc->txtag,
2162 tx_buffer->map);
2163 }
2164 m_freem(tx_buffer->m_head);
2165 tx_buffer->m_head = NULL;
2166 }
2167 tx_buffer->next_eop = -1;
2168
2169 if (++first == sc->num_tx_desc)
2170 first = 0;
2171
2172 tx_buffer = &sc->tx_buffer_area[first];
2173 tx_desc = &sc->tx_desc_base[first];
2174 }
2175
2176 last = tx_buffer->next_eop;
2177 if (last != -1) {
2178 eop_desc = &sc->tx_desc_base[last];
2179
2180 if (++last == sc->num_tx_desc)
2181 last = 0;
2182 done = last;
2183 } else
2184 break;
2185 }
2186 bus_dmamap_sync(sc->txdma.dma_tag, sc->txdma.dma_map, 0,
2187 sc->txdma.dma_map->dm_mapsize,
2188 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2189
2190 sc->next_tx_to_clean = first;
2191
2192
2193
2194
2195
2196
2197
2198 if (num_avail > EM_TX_CLEANUP_THRESHOLD) {
2199 ifp->if_flags &= ~IFF_OACTIVE;
2200
2201 if (num_avail == sc->num_tx_desc)
2202 ifp->if_timer = 0;
2203
2204 else if (num_avail != sc->num_tx_desc_avail)
2205 ifp->if_timer = EM_TX_TIMEOUT;
2206 }
2207 sc->num_tx_desc_avail = num_avail;
2208 }
2209
2210
2211
2212
2213
2214
2215 int
2216 em_get_buf(struct em_softc *sc, int i)
2217 {
2218 struct mbuf *m;
2219 bus_dmamap_t map;
2220 struct em_buffer *rx_buffer;
2221 int error;
2222
2223 MGETHDR(m, M_DONTWAIT, MT_DATA);
2224 if (m == NULL) {
2225 sc->mbuf_alloc_failed++;
2226 return (ENOBUFS);
2227 }
2228 MCLGET(m, M_DONTWAIT);
2229 if ((m->m_flags & M_EXT) == 0) {
2230 m_freem(m);
2231 sc->mbuf_cluster_failed++;
2232 return (ENOBUFS);
2233 }
2234 m->m_len = m->m_pkthdr.len = MCLBYTES;
2235
2236 if (sc->hw.max_frame_size <= (MCLBYTES - ETHER_ALIGN))
2237 m_adj(m, ETHER_ALIGN);
2238
2239
2240
2241
2242
2243 error = bus_dmamap_load_mbuf(sc->rxtag, sc->rx_sparemap,
2244 m, BUS_DMA_NOWAIT);
2245 if (error) {
2246 m_free(m);
2247 return (error);
2248 }
2249
2250 rx_buffer = &sc->rx_buffer_area[i];
2251 if (rx_buffer->m_head != NULL)
2252 bus_dmamap_unload(sc->rxtag, rx_buffer->map);
2253
2254 map = rx_buffer->map;
2255 rx_buffer->map = sc->rx_sparemap;
2256 sc->rx_sparemap = map;
2257
2258 bus_dmamap_sync(sc->rxtag, rx_buffer->map, 0,
2259 rx_buffer->map->dm_mapsize, BUS_DMASYNC_PREREAD);
2260
2261 rx_buffer->m_head = m;
2262
2263 sc->rx_desc_base[i].buffer_addr = htole64(rx_buffer->map->dm_segs[0].ds_addr);
2264
2265 return (0);
2266 }
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276 int
2277 em_allocate_receive_structures(struct em_softc *sc)
2278 {
2279 int i, error;
2280 struct em_buffer *rx_buffer;
2281
2282 if (!(sc->rx_buffer_area =
2283 (struct em_buffer *) malloc(sizeof(struct em_buffer) *
2284 sc->num_rx_desc, M_DEVBUF,
2285 M_NOWAIT))) {
2286 printf("%s: Unable to allocate rx_buffer memory\n",
2287 sc->sc_dv.dv_xname);
2288 return (ENOMEM);
2289 }
2290
2291 bzero(sc->rx_buffer_area,
2292 sizeof(struct em_buffer) * sc->num_rx_desc);
2293
2294 sc->rxtag = sc->osdep.em_pa.pa_dmat;
2295
2296 error = bus_dmamap_create(sc->rxtag, MCLBYTES, 1, MCLBYTES,
2297 0, BUS_DMA_NOWAIT, &sc->rx_sparemap);
2298 if (error != 0) {
2299 printf("%s: em_allocate_receive_structures: "
2300 "bus_dmamap_create failed; error %u\n",
2301 sc->sc_dv.dv_xname, error);
2302 goto fail;
2303 }
2304
2305 rx_buffer = sc->rx_buffer_area;
2306 for (i = 0; i < sc->num_rx_desc; i++, rx_buffer++) {
2307 error = bus_dmamap_create(sc->rxtag, MCLBYTES, 1,
2308 MCLBYTES, 0, BUS_DMA_NOWAIT,
2309 &rx_buffer->map);
2310 if (error != 0) {
2311 printf("%s: em_allocate_receive_structures: "
2312 "bus_dmamap_create failed; error %u\n",
2313 sc->sc_dv.dv_xname, error);
2314 goto fail;
2315 }
2316 }
2317
2318 for (i = 0; i < sc->num_rx_desc; i++) {
2319 error = em_get_buf(sc, i);
2320 if (error != 0)
2321 goto fail;
2322 }
2323 bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map, 0,
2324 sc->rxdma.dma_map->dm_mapsize,
2325 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2326
2327 return (0);
2328
2329 fail:
2330 em_free_receive_structures(sc);
2331 return (error);
2332 }
2333
2334
2335
2336
2337
2338
2339 int
2340 em_setup_receive_structures(struct em_softc *sc)
2341 {
2342 bzero((void *) sc->rx_desc_base,
2343 (sizeof(struct em_rx_desc)) * sc->num_rx_desc);
2344
2345 if (em_allocate_receive_structures(sc))
2346 return (ENOMEM);
2347
2348
2349 sc->next_rx_desc_to_check = 0;
2350 return (0);
2351 }
2352
2353
2354
2355
2356
2357
2358 void
2359 em_initialize_receive_unit(struct em_softc *sc)
2360 {
2361 u_int32_t reg_rctl;
2362 u_int32_t reg_rxcsum;
2363 struct ifnet *ifp;
2364 u_int64_t bus_addr;
2365
2366 INIT_DEBUGOUT("em_initialize_receive_unit: begin");
2367 ifp = &sc->interface_data.ac_if;
2368
2369
2370 E1000_WRITE_REG(&sc->hw, RCTL, 0);
2371
2372
2373 E1000_WRITE_REG(&sc->hw, RDTR,
2374 sc->rx_int_delay | E1000_RDT_FPDB);
2375
2376 if (sc->hw.mac_type >= em_82540) {
2377 E1000_WRITE_REG(&sc->hw, RADV, sc->rx_abs_int_delay);
2378
2379
2380
2381 E1000_WRITE_REG(&sc->hw, ITR, DEFAULT_ITR);
2382 }
2383
2384
2385 bus_addr = sc->rxdma.dma_map->dm_segs[0].ds_addr;
2386 E1000_WRITE_REG(&sc->hw, RDLEN, sc->num_rx_desc *
2387 sizeof(struct em_rx_desc));
2388 E1000_WRITE_REG(&sc->hw, RDBAH, (u_int32_t)(bus_addr >> 32));
2389 E1000_WRITE_REG(&sc->hw, RDBAL, (u_int32_t)bus_addr);
2390
2391
2392 reg_rctl = E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_LBM_NO |
2393 E1000_RCTL_RDMTS_HALF |
2394 (sc->hw.mc_filter_type << E1000_RCTL_MO_SHIFT);
2395
2396 if (sc->hw.tbi_compatibility_on == TRUE)
2397 reg_rctl |= E1000_RCTL_SBP;
2398
2399 switch (sc->rx_buffer_len) {
2400 default:
2401 case EM_RXBUFFER_2048:
2402 reg_rctl |= E1000_RCTL_SZ_2048;
2403 break;
2404 case EM_RXBUFFER_4096:
2405 reg_rctl |= E1000_RCTL_SZ_4096|E1000_RCTL_BSEX|E1000_RCTL_LPE;
2406 break;
2407 case EM_RXBUFFER_8192:
2408 reg_rctl |= E1000_RCTL_SZ_8192|E1000_RCTL_BSEX|E1000_RCTL_LPE;
2409 break;
2410 case EM_RXBUFFER_16384:
2411 reg_rctl |= E1000_RCTL_SZ_16384|E1000_RCTL_BSEX|E1000_RCTL_LPE;
2412 break;
2413 }
2414
2415 if (sc->hw.max_frame_size != ETHER_MAX_LEN)
2416 reg_rctl |= E1000_RCTL_LPE;
2417
2418
2419 if (sc->hw.mac_type >= em_82543) {
2420 reg_rxcsum = E1000_READ_REG(&sc->hw, RXCSUM);
2421 reg_rxcsum |= (E1000_RXCSUM_IPOFL | E1000_RXCSUM_TUOFL);
2422 E1000_WRITE_REG(&sc->hw, RXCSUM, reg_rxcsum);
2423 }
2424
2425
2426 E1000_WRITE_REG(&sc->hw, RCTL, reg_rctl);
2427
2428
2429 E1000_WRITE_REG(&sc->hw, RDH, 0);
2430 E1000_WRITE_REG(&sc->hw, RDT, sc->num_rx_desc - 1);
2431 }
2432
2433
2434
2435
2436
2437
2438 void
2439 em_free_receive_structures(struct em_softc *sc)
2440 {
2441 struct em_buffer *rx_buffer;
2442 int i;
2443
2444 INIT_DEBUGOUT("free_receive_structures: begin");
2445
2446 if (sc->rx_sparemap) {
2447 bus_dmamap_destroy(sc->rxtag, sc->rx_sparemap);
2448 sc->rx_sparemap = NULL;
2449 }
2450 if (sc->rx_buffer_area != NULL) {
2451 rx_buffer = sc->rx_buffer_area;
2452 for (i = 0; i < sc->num_rx_desc; i++, rx_buffer++) {
2453 if (rx_buffer->map != NULL &&
2454 rx_buffer->map->dm_nsegs > 0) {
2455 bus_dmamap_sync(sc->rxtag, rx_buffer->map,
2456 0, rx_buffer->map->dm_mapsize,
2457 BUS_DMASYNC_POSTREAD);
2458 bus_dmamap_unload(sc->rxtag,
2459 rx_buffer->map);
2460 }
2461 if (rx_buffer->m_head != NULL) {
2462 m_freem(rx_buffer->m_head);
2463 rx_buffer->m_head = NULL;
2464 }
2465 if (rx_buffer->map != NULL) {
2466 bus_dmamap_destroy(sc->rxtag,
2467 rx_buffer->map);
2468 rx_buffer->map = NULL;
2469 }
2470 }
2471 }
2472 if (sc->rx_buffer_area != NULL) {
2473 free(sc->rx_buffer_area, M_DEVBUF);
2474 sc->rx_buffer_area = NULL;
2475 }
2476 if (sc->rxtag != NULL)
2477 sc->rxtag = NULL;
2478 }
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490 void
2491 em_rxeof(struct em_softc *sc, int count)
2492 {
2493 struct ifnet *ifp;
2494 struct mbuf *mp;
2495 u_int8_t accept_frame = 0;
2496 u_int8_t eop = 0;
2497 u_int16_t len, desc_len, prev_len_adj;
2498 int i;
2499
2500
2501 struct em_rx_desc *current_desc;
2502 u_int8_t status;
2503
2504 ifp = &sc->interface_data.ac_if;
2505 i = sc->next_rx_desc_to_check;
2506 current_desc = &sc->rx_desc_base[i];
2507 bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map, 0,
2508 sc->rxdma.dma_map->dm_mapsize, BUS_DMASYNC_POSTREAD);
2509
2510 if (!((current_desc->status) & E1000_RXD_STAT_DD))
2511 return;
2512
2513 while ((current_desc->status & E1000_RXD_STAT_DD) &&
2514 (count != 0) &&
2515 (ifp->if_flags & IFF_RUNNING)) {
2516 struct mbuf *m = NULL;
2517
2518 mp = sc->rx_buffer_area[i].m_head;
2519
2520
2521
2522
2523 bus_dmamap_sync(sc->rxtag, sc->rx_buffer_area[i].map,
2524 0, sc->rx_buffer_area[i].map->dm_mapsize,
2525 BUS_DMASYNC_POSTREAD);
2526
2527 accept_frame = 1;
2528 prev_len_adj = 0;
2529 desc_len = letoh16(current_desc->length);
2530 status = current_desc->status;
2531 if (status & E1000_RXD_STAT_EOP) {
2532 count--;
2533 eop = 1;
2534 if (desc_len < ETHER_CRC_LEN) {
2535 len = 0;
2536 prev_len_adj = ETHER_CRC_LEN - desc_len;
2537 } else
2538 len = desc_len - ETHER_CRC_LEN;
2539 } else {
2540 eop = 0;
2541 len = desc_len;
2542 }
2543
2544 if (current_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK) {
2545 u_int8_t last_byte;
2546 u_int32_t pkt_len = desc_len;
2547
2548 if (sc->fmp != NULL)
2549 pkt_len += sc->fmp->m_pkthdr.len;
2550
2551 last_byte = *(mtod(mp, caddr_t) + desc_len - 1);
2552 if (TBI_ACCEPT(&sc->hw, status, current_desc->errors,
2553 pkt_len, last_byte)) {
2554 em_tbi_adjust_stats(&sc->hw,
2555 &sc->stats,
2556 pkt_len,
2557 sc->hw.mac_addr);
2558 if (len > 0)
2559 len--;
2560 } else
2561 accept_frame = 0;
2562 }
2563
2564 if (accept_frame) {
2565 if (em_get_buf(sc, i) != 0) {
2566 sc->dropped_pkts++;
2567 goto discard;
2568 }
2569
2570
2571 mp->m_len = len;
2572
2573 #ifdef __STRICT_ALIGNMENT
2574
2575
2576
2577
2578
2579
2580 if (sc->hw.max_frame_size > (MCLBYTES - ETHER_ALIGN)) {
2581 unsigned char tmp_align_buf[ETHER_ALIGN];
2582 int tmp_align_buf_len = 0;
2583
2584 if (prev_len_adj > sc->align_buf_len)
2585 prev_len_adj -= sc->align_buf_len;
2586 else
2587 prev_len_adj = 0;
2588
2589 if (mp->m_len > (MCLBYTES - ETHER_ALIGN)) {
2590 bcopy(mp->m_data +
2591 (MCLBYTES - ETHER_ALIGN),
2592 &tmp_align_buf,
2593 ETHER_ALIGN);
2594 tmp_align_buf_len = mp->m_len -
2595 (MCLBYTES - ETHER_ALIGN);
2596 mp->m_len -= ETHER_ALIGN;
2597 }
2598
2599 if (mp->m_len) {
2600 bcopy(mp->m_data,
2601 mp->m_data + ETHER_ALIGN,
2602 mp->m_len);
2603 if (!sc->align_buf_len)
2604 mp->m_data += ETHER_ALIGN;
2605 }
2606
2607 if (sc->align_buf_len) {
2608 mp->m_len += sc->align_buf_len;
2609 bcopy(&sc->align_buf,
2610 mp->m_data,
2611 sc->align_buf_len);
2612 }
2613
2614 if (tmp_align_buf_len)
2615 bcopy(&tmp_align_buf,
2616 &sc->align_buf,
2617 tmp_align_buf_len);
2618 sc->align_buf_len = tmp_align_buf_len;
2619 }
2620 #endif
2621
2622 if (sc->fmp == NULL) {
2623 mp->m_pkthdr.len = mp->m_len;
2624 sc->fmp = mp;
2625 sc->lmp = mp;
2626 } else {
2627
2628 mp->m_flags &= ~M_PKTHDR;
2629
2630
2631
2632
2633 if (prev_len_adj > 0) {
2634 sc->lmp->m_len -= prev_len_adj;
2635 sc->fmp->m_pkthdr.len -= prev_len_adj;
2636 }
2637 sc->lmp->m_next = mp;
2638 sc->lmp = sc->lmp->m_next;
2639 sc->fmp->m_pkthdr.len += mp->m_len;
2640 }
2641
2642 if (eop) {
2643 sc->fmp->m_pkthdr.rcvif = ifp;
2644 ifp->if_ipackets++;
2645 em_receive_checksum(sc, current_desc,
2646 sc->fmp);
2647 m = sc->fmp;
2648 sc->fmp = NULL;
2649 sc->lmp = NULL;
2650 }
2651 } else {
2652 sc->dropped_pkts++;
2653 discard:
2654
2655 mp = sc->rx_buffer_area[i].m_head;
2656 mp->m_len = mp->m_pkthdr.len = MCLBYTES;
2657 mp->m_data = mp->m_ext.ext_buf;
2658 mp->m_next = NULL;
2659 if (sc->hw.max_frame_size <= (MCLBYTES - ETHER_ALIGN))
2660 m_adj(mp, ETHER_ALIGN);
2661 if (sc->fmp != NULL) {
2662 m_freem(sc->fmp);
2663 sc->fmp = NULL;
2664 sc->lmp = NULL;
2665 }
2666 m = NULL;
2667 }
2668
2669
2670 current_desc->status = 0;
2671 bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map, 0,
2672 sc->rxdma.dma_map->dm_mapsize,
2673 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2674
2675
2676 if (++i == sc->num_rx_desc)
2677 i = 0;
2678 if (m != NULL) {
2679 sc->next_rx_desc_to_check = i;
2680
2681 #if NBPFILTER > 0
2682
2683
2684
2685
2686 if (ifp->if_bpf)
2687 bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN);
2688 #endif
2689
2690 ether_input_mbuf(ifp, m);
2691
2692 i = sc->next_rx_desc_to_check;
2693 }
2694 current_desc = &sc->rx_desc_base[i];
2695 }
2696 sc->next_rx_desc_to_check = i;
2697
2698
2699 if (--i < 0)
2700 i = sc->num_rx_desc - 1;
2701 E1000_WRITE_REG(&sc->hw, RDT, i);
2702 }
2703
2704
2705
2706
2707
2708
2709
2710
2711 void
2712 em_receive_checksum(struct em_softc *sc, struct em_rx_desc *rx_desc,
2713 struct mbuf *mp)
2714 {
2715
2716 if ((sc->hw.mac_type < em_82543) ||
2717
2718 (rx_desc->status & E1000_RXD_STAT_IXSM)) {
2719 mp->m_pkthdr.csum_flags = 0;
2720 return;
2721 }
2722
2723 if (rx_desc->status & E1000_RXD_STAT_IPCS) {
2724
2725 if (!(rx_desc->errors & E1000_RXD_ERR_IPE)) {
2726
2727 mp->m_pkthdr.csum_flags = M_IPV4_CSUM_IN_OK;
2728
2729 } else
2730 mp->m_pkthdr.csum_flags = 0;
2731 }
2732
2733 if (rx_desc->status & E1000_RXD_STAT_TCPCS) {
2734
2735 if (!(rx_desc->errors & E1000_RXD_ERR_TCPE))
2736 mp->m_pkthdr.csum_flags |=
2737 M_TCP_CSUM_IN_OK | M_UDP_CSUM_IN_OK;
2738 }
2739 }
2740
2741 void
2742 em_enable_intr(struct em_softc *sc)
2743 {
2744 E1000_WRITE_REG(&sc->hw, IMS, (IMS_ENABLE_MASK));
2745 }
2746
2747 void
2748 em_disable_intr(struct em_softc *sc)
2749 {
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759 if (sc->hw.mac_type == em_82542_rev2_0)
2760 E1000_WRITE_REG(&sc->hw, IMC, (0xffffffff & ~E1000_IMC_RXSEQ));
2761 else
2762 E1000_WRITE_REG(&sc->hw, IMC, 0xffffffff);
2763 }
2764
2765 int
2766 em_is_valid_ether_addr(u_int8_t *addr)
2767 {
2768 const char zero_addr[6] = { 0, 0, 0, 0, 0, 0 };
2769
2770 if ((addr[0] & 1) || (!bcmp(addr, zero_addr, ETHER_ADDR_LEN)))
2771 return (FALSE);
2772
2773 return (TRUE);
2774 }
2775
2776 void
2777 em_write_pci_cfg(struct em_hw *hw, uint32_t reg, uint16_t *value)
2778 {
2779 struct pci_attach_args *pa = &((struct em_osdep *)hw->back)->em_pa;
2780 pci_chipset_tag_t pc = pa->pa_pc;
2781
2782 pci_conf_write(pc, pa->pa_tag, reg, *value);
2783 }
2784
2785 void
2786 em_read_pci_cfg(struct em_hw *hw, uint32_t reg, uint16_t *value)
2787 {
2788 struct pci_attach_args *pa = &((struct em_osdep *)hw->back)->em_pa;
2789 pci_chipset_tag_t pc = pa->pa_pc;
2790 *value = pci_conf_read(pc, pa->pa_tag, reg);
2791 }
2792
2793 void
2794 em_pci_set_mwi(struct em_hw *hw)
2795 {
2796 struct pci_attach_args *pa = &((struct em_osdep *)hw->back)->em_pa;
2797 pci_chipset_tag_t pc = pa->pa_pc;
2798
2799 pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
2800 (hw->pci_cmd_word | CMD_MEM_WRT_INVALIDATE));
2801 }
2802
2803 void
2804 em_pci_clear_mwi(struct em_hw *hw)
2805 {
2806 struct pci_attach_args *pa = &((struct em_osdep *)hw->back)->em_pa;
2807 pci_chipset_tag_t pc = pa->pa_pc;
2808
2809 pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
2810 (hw->pci_cmd_word & ~CMD_MEM_WRT_INVALIDATE));
2811 }
2812
2813 int32_t
2814 em_read_pcie_cap_reg(struct em_hw *hw, uint32_t reg, uint16_t *value)
2815 {
2816 struct pci_attach_args *pa = &((struct em_osdep *)hw->back)->em_pa;
2817 int32_t rc;
2818 u_int16_t pectl;
2819
2820
2821 if (pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_PCIEXPRESS,
2822 NULL, NULL) != 0) {
2823 em_read_pci_cfg(hw, reg + 0x12, value);
2824
2825 em_read_pci_cfg(hw, reg + 0x8, &pectl);
2826 pectl = (pectl & ~0x7000) | (5 << 12);
2827 em_write_pci_cfg(hw, reg + 0x8, &pectl);
2828 rc = 0;
2829 } else
2830 rc = -1;
2831
2832 return (rc);
2833 }
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853 u_int32_t
2854 em_fill_descriptors(u_int64_t address, u_int32_t length,
2855 PDESC_ARRAY desc_array)
2856 {
2857
2858
2859 u_int32_t safe_terminator;
2860 if (length <= 4) {
2861 desc_array->descriptor[0].address = address;
2862 desc_array->descriptor[0].length = length;
2863 desc_array->elements = 1;
2864 return desc_array->elements;
2865 }
2866 safe_terminator = (u_int32_t)((((u_int32_t)address & 0x7) + (length & 0xF)) & 0xF);
2867
2868 if (safe_terminator == 0 ||
2869 (safe_terminator > 4 &&
2870 safe_terminator < 9) ||
2871 (safe_terminator > 0xC &&
2872 safe_terminator <= 0xF)) {
2873 desc_array->descriptor[0].address = address;
2874 desc_array->descriptor[0].length = length;
2875 desc_array->elements = 1;
2876 return desc_array->elements;
2877 }
2878
2879 desc_array->descriptor[0].address = address;
2880 desc_array->descriptor[0].length = length - 4;
2881 desc_array->descriptor[1].address = address + (length - 4);
2882 desc_array->descriptor[1].length = 4;
2883 desc_array->elements = 2;
2884 return desc_array->elements;
2885 }
2886
2887
2888
2889
2890
2891
2892 void
2893 em_update_stats_counters(struct em_softc *sc)
2894 {
2895 struct ifnet *ifp;
2896
2897 if (sc->hw.media_type == em_media_type_copper ||
2898 (E1000_READ_REG(&sc->hw, STATUS) & E1000_STATUS_LU)) {
2899 sc->stats.symerrs += E1000_READ_REG(&sc->hw, SYMERRS);
2900 sc->stats.sec += E1000_READ_REG(&sc->hw, SEC);
2901 }
2902 sc->stats.crcerrs += E1000_READ_REG(&sc->hw, CRCERRS);
2903 sc->stats.mpc += E1000_READ_REG(&sc->hw, MPC);
2904 sc->stats.scc += E1000_READ_REG(&sc->hw, SCC);
2905 sc->stats.ecol += E1000_READ_REG(&sc->hw, ECOL);
2906
2907 sc->stats.mcc += E1000_READ_REG(&sc->hw, MCC);
2908 sc->stats.latecol += E1000_READ_REG(&sc->hw, LATECOL);
2909 sc->stats.colc += E1000_READ_REG(&sc->hw, COLC);
2910 sc->stats.dc += E1000_READ_REG(&sc->hw, DC);
2911 sc->stats.rlec += E1000_READ_REG(&sc->hw, RLEC);
2912 sc->stats.xonrxc += E1000_READ_REG(&sc->hw, XONRXC);
2913 sc->stats.xontxc += E1000_READ_REG(&sc->hw, XONTXC);
2914 sc->stats.xoffrxc += E1000_READ_REG(&sc->hw, XOFFRXC);
2915 sc->stats.xofftxc += E1000_READ_REG(&sc->hw, XOFFTXC);
2916 sc->stats.fcruc += E1000_READ_REG(&sc->hw, FCRUC);
2917 sc->stats.prc64 += E1000_READ_REG(&sc->hw, PRC64);
2918 sc->stats.prc127 += E1000_READ_REG(&sc->hw, PRC127);
2919 sc->stats.prc255 += E1000_READ_REG(&sc->hw, PRC255);
2920 sc->stats.prc511 += E1000_READ_REG(&sc->hw, PRC511);
2921 sc->stats.prc1023 += E1000_READ_REG(&sc->hw, PRC1023);
2922 sc->stats.prc1522 += E1000_READ_REG(&sc->hw, PRC1522);
2923 sc->stats.gprc += E1000_READ_REG(&sc->hw, GPRC);
2924 sc->stats.bprc += E1000_READ_REG(&sc->hw, BPRC);
2925 sc->stats.mprc += E1000_READ_REG(&sc->hw, MPRC);
2926 sc->stats.gptc += E1000_READ_REG(&sc->hw, GPTC);
2927
2928
2929
2930
2931 sc->stats.gorcl += E1000_READ_REG(&sc->hw, GORCL);
2932 sc->stats.gorch += E1000_READ_REG(&sc->hw, GORCH);
2933 sc->stats.gotcl += E1000_READ_REG(&sc->hw, GOTCL);
2934 sc->stats.gotch += E1000_READ_REG(&sc->hw, GOTCH);
2935
2936 sc->stats.rnbc += E1000_READ_REG(&sc->hw, RNBC);
2937 sc->stats.ruc += E1000_READ_REG(&sc->hw, RUC);
2938 sc->stats.rfc += E1000_READ_REG(&sc->hw, RFC);
2939 sc->stats.roc += E1000_READ_REG(&sc->hw, ROC);
2940 sc->stats.rjc += E1000_READ_REG(&sc->hw, RJC);
2941
2942 sc->stats.torl += E1000_READ_REG(&sc->hw, TORL);
2943 sc->stats.torh += E1000_READ_REG(&sc->hw, TORH);
2944 sc->stats.totl += E1000_READ_REG(&sc->hw, TOTL);
2945 sc->stats.toth += E1000_READ_REG(&sc->hw, TOTH);
2946
2947 sc->stats.tpr += E1000_READ_REG(&sc->hw, TPR);
2948 sc->stats.tpt += E1000_READ_REG(&sc->hw, TPT);
2949 sc->stats.ptc64 += E1000_READ_REG(&sc->hw, PTC64);
2950 sc->stats.ptc127 += E1000_READ_REG(&sc->hw, PTC127);
2951 sc->stats.ptc255 += E1000_READ_REG(&sc->hw, PTC255);
2952 sc->stats.ptc511 += E1000_READ_REG(&sc->hw, PTC511);
2953 sc->stats.ptc1023 += E1000_READ_REG(&sc->hw, PTC1023);
2954 sc->stats.ptc1522 += E1000_READ_REG(&sc->hw, PTC1522);
2955 sc->stats.mptc += E1000_READ_REG(&sc->hw, MPTC);
2956 sc->stats.bptc += E1000_READ_REG(&sc->hw, BPTC);
2957
2958 if (sc->hw.mac_type >= em_82543) {
2959 sc->stats.algnerrc +=
2960 E1000_READ_REG(&sc->hw, ALGNERRC);
2961 sc->stats.rxerrc +=
2962 E1000_READ_REG(&sc->hw, RXERRC);
2963 sc->stats.tncrs +=
2964 E1000_READ_REG(&sc->hw, TNCRS);
2965 sc->stats.cexterr +=
2966 E1000_READ_REG(&sc->hw, CEXTERR);
2967 sc->stats.tsctc +=
2968 E1000_READ_REG(&sc->hw, TSCTC);
2969 sc->stats.tsctfc +=
2970 E1000_READ_REG(&sc->hw, TSCTFC);
2971 }
2972 ifp = &sc->interface_data.ac_if;
2973
2974
2975 ifp->if_collisions = sc->stats.colc;
2976
2977
2978 ifp->if_ierrors =
2979 sc->dropped_pkts +
2980 sc->stats.rxerrc +
2981 sc->stats.crcerrs +
2982 sc->stats.algnerrc +
2983 sc->stats.ruc + sc->stats.roc +
2984 sc->stats.mpc + sc->stats.cexterr +
2985 sc->rx_overruns;
2986
2987
2988 ifp->if_oerrors = sc->stats.ecol + sc->stats.latecol +
2989 sc->watchdog_events;
2990 }
2991
2992
2993
2994
2995
2996
2997
2998
2999 void
3000 em_print_hw_stats(struct em_softc *sc)
3001 {
3002 const char * const unit = sc->sc_dv.dv_xname;
3003
3004 printf("%s: Excessive collisions = %lld\n", unit,
3005 (long long)sc->stats.ecol);
3006 printf("%s: Symbol errors = %lld\n", unit,
3007 (long long)sc->stats.symerrs);
3008 printf("%s: Sequence errors = %lld\n", unit,
3009 (long long)sc->stats.sec);
3010 printf("%s: Defer count = %lld\n", unit,
3011 (long long)sc->stats.dc);
3012
3013 printf("%s: Missed Packets = %lld\n", unit,
3014 (long long)sc->stats.mpc);
3015 printf("%s: Receive No Buffers = %lld\n", unit,
3016 (long long)sc->stats.rnbc);
3017
3018 printf("%s: Receive Length Errors = %lld\n", unit,
3019 ((long long)sc->stats.roc +
3020 (long long)sc->stats.ruc));
3021 printf("%s: Receive errors = %lld\n", unit,
3022 (long long)sc->stats.rxerrc);
3023 printf("%s: Crc errors = %lld\n", unit,
3024 (long long)sc->stats.crcerrs);
3025 printf("%s: Alignment errors = %lld\n", unit,
3026 (long long)sc->stats.algnerrc);
3027 printf("%s: Carrier extension errors = %lld\n", unit,
3028 (long long)sc->stats.cexterr);
3029
3030 printf("%s: RX overruns = %ld\n", unit,
3031 sc->rx_overruns);
3032 printf("%s: watchdog timeouts = %ld\n", unit,
3033 sc->watchdog_events);
3034
3035 printf("%s: XON Rcvd = %lld\n", unit,
3036 (long long)sc->stats.xonrxc);
3037 printf("%s: XON Xmtd = %lld\n", unit,
3038 (long long)sc->stats.xontxc);
3039 printf("%s: XOFF Rcvd = %lld\n", unit,
3040 (long long)sc->stats.xoffrxc);
3041 printf("%s: XOFF Xmtd = %lld\n", unit,
3042 (long long)sc->stats.xofftxc);
3043
3044 printf("%s: Good Packets Rcvd = %lld\n", unit,
3045 (long long)sc->stats.gprc);
3046 printf("%s: Good Packets Xmtd = %lld\n", unit,
3047 (long long)sc->stats.gptc);
3048 }