]> CyberLeo.Net >> Repos - FreeBSD/releng/8.1.git/blob - sys/dev/nfe/if_nfe.c
Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.
[FreeBSD/releng/8.1.git] / sys / dev / nfe / if_nfe.c
1 /*      $OpenBSD: if_nfe.c,v 1.54 2006/04/07 12:38:12 jsg Exp $ */
2
3 /*-
4  * Copyright (c) 2006 Shigeaki Tagashira <shigeaki@se.hiroshima-u.ac.jp>
5  * Copyright (c) 2006 Damien Bergamini <damien.bergamini@free.fr>
6  * Copyright (c) 2005, 2006 Jonathan Gray <jsg@openbsd.org>
7  *
8  * Permission to use, copy, modify, and distribute this software for any
9  * purpose with or without fee is hereby granted, provided that the above
10  * copyright notice and this permission notice appear in all copies.
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19  */
20
21 /* Driver for NVIDIA nForce MCP Fast Ethernet and Gigabit Ethernet */
22
23 #include <sys/cdefs.h>
24 __FBSDID("$FreeBSD$");
25
26 #ifdef HAVE_KERNEL_OPTION_HEADERS
27 #include "opt_device_polling.h"
28 #endif
29
30 #include <sys/param.h>
31 #include <sys/endian.h>
32 #include <sys/systm.h>
33 #include <sys/sockio.h>
34 #include <sys/mbuf.h>
35 #include <sys/malloc.h>
36 #include <sys/module.h>
37 #include <sys/kernel.h>
38 #include <sys/queue.h>
39 #include <sys/socket.h>
40 #include <sys/sysctl.h>
41 #include <sys/taskqueue.h>
42
43 #include <net/if.h>
44 #include <net/if_arp.h>
45 #include <net/ethernet.h>
46 #include <net/if_dl.h>
47 #include <net/if_media.h>
48 #include <net/if_types.h>
49 #include <net/if_vlan_var.h>
50
51 #include <net/bpf.h>
52
53 #include <machine/bus.h>
54 #include <machine/resource.h>
55 #include <sys/bus.h>
56 #include <sys/rman.h>
57
58 #include <dev/mii/mii.h>
59 #include <dev/mii/miivar.h>
60
61 #include <dev/pci/pcireg.h>
62 #include <dev/pci/pcivar.h>
63
64 #include <dev/nfe/if_nfereg.h>
65 #include <dev/nfe/if_nfevar.h>
66
67 MODULE_DEPEND(nfe, pci, 1, 1, 1);
68 MODULE_DEPEND(nfe, ether, 1, 1, 1);
69 MODULE_DEPEND(nfe, miibus, 1, 1, 1);
70
71 /* "device miibus" required.  See GENERIC if you get errors here. */
72 #include "miibus_if.h"
73
74 static int  nfe_probe(device_t);
75 static int  nfe_attach(device_t);
76 static int  nfe_detach(device_t);
77 static int  nfe_suspend(device_t);
78 static int  nfe_resume(device_t);
79 static int nfe_shutdown(device_t);
80 static void nfe_power(struct nfe_softc *);
81 static int  nfe_miibus_readreg(device_t, int, int);
82 static int  nfe_miibus_writereg(device_t, int, int, int);
83 static void nfe_miibus_statchg(device_t);
84 static void nfe_link_task(void *, int);
85 static void nfe_set_intr(struct nfe_softc *);
86 static __inline void nfe_enable_intr(struct nfe_softc *);
87 static __inline void nfe_disable_intr(struct nfe_softc *);
88 static int  nfe_ioctl(struct ifnet *, u_long, caddr_t);
89 static void nfe_alloc_msix(struct nfe_softc *, int);
90 static int nfe_intr(void *);
91 static void nfe_int_task(void *, int);
92 static __inline void nfe_discard_rxbuf(struct nfe_softc *, int);
93 static __inline void nfe_discard_jrxbuf(struct nfe_softc *, int);
94 static int nfe_newbuf(struct nfe_softc *, int);
95 static int nfe_jnewbuf(struct nfe_softc *, int);
96 static int  nfe_rxeof(struct nfe_softc *, int, int *);
97 static int  nfe_jrxeof(struct nfe_softc *, int, int *);
98 static void nfe_txeof(struct nfe_softc *);
99 static int  nfe_encap(struct nfe_softc *, struct mbuf **);
100 static void nfe_setmulti(struct nfe_softc *);
101 static void nfe_tx_task(void *, int);
102 static void nfe_start(struct ifnet *);
103 static void nfe_watchdog(struct ifnet *);
104 static void nfe_init(void *);
105 static void nfe_init_locked(void *);
106 static void nfe_stop(struct ifnet *);
107 static int  nfe_alloc_rx_ring(struct nfe_softc *, struct nfe_rx_ring *);
108 static void nfe_alloc_jrx_ring(struct nfe_softc *, struct nfe_jrx_ring *);
109 static int  nfe_init_rx_ring(struct nfe_softc *, struct nfe_rx_ring *);
110 static int  nfe_init_jrx_ring(struct nfe_softc *, struct nfe_jrx_ring *);
111 static void nfe_free_rx_ring(struct nfe_softc *, struct nfe_rx_ring *);
112 static void nfe_free_jrx_ring(struct nfe_softc *, struct nfe_jrx_ring *);
113 static int  nfe_alloc_tx_ring(struct nfe_softc *, struct nfe_tx_ring *);
114 static void nfe_init_tx_ring(struct nfe_softc *, struct nfe_tx_ring *);
115 static void nfe_free_tx_ring(struct nfe_softc *, struct nfe_tx_ring *);
116 static int  nfe_ifmedia_upd(struct ifnet *);
117 static void nfe_ifmedia_sts(struct ifnet *, struct ifmediareq *);
118 static void nfe_tick(void *);
119 static void nfe_get_macaddr(struct nfe_softc *, uint8_t *);
120 static void nfe_set_macaddr(struct nfe_softc *, uint8_t *);
121 static void nfe_dma_map_segs(void *, bus_dma_segment_t *, int, int);
122
123 static int sysctl_int_range(SYSCTL_HANDLER_ARGS, int, int);
124 static int sysctl_hw_nfe_proc_limit(SYSCTL_HANDLER_ARGS);
125 static void nfe_sysctl_node(struct nfe_softc *);
126 static void nfe_stats_clear(struct nfe_softc *);
127 static void nfe_stats_update(struct nfe_softc *);
128
129 #ifdef NFE_DEBUG
130 static int nfedebug = 0;
131 #define DPRINTF(sc, ...)        do {                            \
132         if (nfedebug)                                           \
133                 device_printf((sc)->nfe_dev, __VA_ARGS__);      \
134 } while (0)
135 #define DPRINTFN(sc, n, ...)    do {                            \
136         if (nfedebug >= (n))                                    \
137                 device_printf((sc)->nfe_dev, __VA_ARGS__);      \
138 } while (0)
139 #else
140 #define DPRINTF(sc, ...)
141 #define DPRINTFN(sc, n, ...)
142 #endif
143
144 #define NFE_LOCK(_sc)           mtx_lock(&(_sc)->nfe_mtx)
145 #define NFE_UNLOCK(_sc)         mtx_unlock(&(_sc)->nfe_mtx)
146 #define NFE_LOCK_ASSERT(_sc)    mtx_assert(&(_sc)->nfe_mtx, MA_OWNED)
147
148 /* Tunables. */
149 static int msi_disable = 0;
150 static int msix_disable = 0;
151 static int jumbo_disable = 0;
152 TUNABLE_INT("hw.nfe.msi_disable", &msi_disable);
153 TUNABLE_INT("hw.nfe.msix_disable", &msix_disable);
154 TUNABLE_INT("hw.nfe.jumbo_disable", &jumbo_disable);
155
156 static device_method_t nfe_methods[] = {
157         /* Device interface */
158         DEVMETHOD(device_probe,         nfe_probe),
159         DEVMETHOD(device_attach,        nfe_attach),
160         DEVMETHOD(device_detach,        nfe_detach),
161         DEVMETHOD(device_suspend,       nfe_suspend),
162         DEVMETHOD(device_resume,        nfe_resume),
163         DEVMETHOD(device_shutdown,      nfe_shutdown),
164
165         /* bus interface */
166         DEVMETHOD(bus_print_child,      bus_generic_print_child),
167         DEVMETHOD(bus_driver_added,     bus_generic_driver_added),
168
169         /* MII interface */
170         DEVMETHOD(miibus_readreg,       nfe_miibus_readreg),
171         DEVMETHOD(miibus_writereg,      nfe_miibus_writereg),
172         DEVMETHOD(miibus_statchg,       nfe_miibus_statchg),
173
174         { NULL, NULL }
175 };
176
177 static driver_t nfe_driver = {
178         "nfe",
179         nfe_methods,
180         sizeof(struct nfe_softc)
181 };
182
183 static devclass_t nfe_devclass;
184
185 DRIVER_MODULE(nfe, pci, nfe_driver, nfe_devclass, 0, 0);
186 DRIVER_MODULE(miibus, nfe, miibus_driver, miibus_devclass, 0, 0);
187
188 static struct nfe_type nfe_devs[] = {
189         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE_LAN,
190             "NVIDIA nForce MCP Networking Adapter"},
191         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE2_LAN,
192             "NVIDIA nForce2 MCP2 Networking Adapter"},
193         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE2_400_LAN1,
194             "NVIDIA nForce2 400 MCP4 Networking Adapter"},
195         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE2_400_LAN2,
196             "NVIDIA nForce2 400 MCP5 Networking Adapter"},
197         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE3_LAN1,
198             "NVIDIA nForce3 MCP3 Networking Adapter"},
199         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE3_250_LAN,
200             "NVIDIA nForce3 250 MCP6 Networking Adapter"},
201         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE3_LAN4,
202             "NVIDIA nForce3 MCP7 Networking Adapter"},
203         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE4_LAN1,
204             "NVIDIA nForce4 CK804 MCP8 Networking Adapter"},
205         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE4_LAN2,
206             "NVIDIA nForce4 CK804 MCP9 Networking Adapter"},
207         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP04_LAN1,
208             "NVIDIA nForce MCP04 Networking Adapter"},          /* MCP10 */
209         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP04_LAN2,
210             "NVIDIA nForce MCP04 Networking Adapter"},          /* MCP11 */
211         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE430_LAN1,
212             "NVIDIA nForce 430 MCP12 Networking Adapter"},
213         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE430_LAN2,
214             "NVIDIA nForce 430 MCP13 Networking Adapter"},
215         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP55_LAN1,
216             "NVIDIA nForce MCP55 Networking Adapter"},
217         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP55_LAN2,
218             "NVIDIA nForce MCP55 Networking Adapter"},
219         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP61_LAN1,
220             "NVIDIA nForce MCP61 Networking Adapter"},
221         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP61_LAN2,
222             "NVIDIA nForce MCP61 Networking Adapter"},
223         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP61_LAN3,
224             "NVIDIA nForce MCP61 Networking Adapter"},
225         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP61_LAN4,
226             "NVIDIA nForce MCP61 Networking Adapter"},
227         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP65_LAN1,
228             "NVIDIA nForce MCP65 Networking Adapter"},
229         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP65_LAN2,
230             "NVIDIA nForce MCP65 Networking Adapter"},
231         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP65_LAN3,
232             "NVIDIA nForce MCP65 Networking Adapter"},
233         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP65_LAN4,
234             "NVIDIA nForce MCP65 Networking Adapter"},
235         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP67_LAN1,
236             "NVIDIA nForce MCP67 Networking Adapter"},
237         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP67_LAN2,
238             "NVIDIA nForce MCP67 Networking Adapter"},
239         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP67_LAN3,
240             "NVIDIA nForce MCP67 Networking Adapter"},
241         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP67_LAN4,
242             "NVIDIA nForce MCP67 Networking Adapter"},
243         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP73_LAN1,
244             "NVIDIA nForce MCP73 Networking Adapter"},
245         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP73_LAN2,
246             "NVIDIA nForce MCP73 Networking Adapter"},
247         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP73_LAN3,
248             "NVIDIA nForce MCP73 Networking Adapter"},
249         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP73_LAN4,
250             "NVIDIA nForce MCP73 Networking Adapter"},
251         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP77_LAN1,
252             "NVIDIA nForce MCP77 Networking Adapter"},
253         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP77_LAN2,
254             "NVIDIA nForce MCP77 Networking Adapter"},
255         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP77_LAN3,
256             "NVIDIA nForce MCP77 Networking Adapter"},
257         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP77_LAN4,
258             "NVIDIA nForce MCP77 Networking Adapter"},
259         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP79_LAN1,
260             "NVIDIA nForce MCP79 Networking Adapter"},
261         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP79_LAN2,
262             "NVIDIA nForce MCP79 Networking Adapter"},
263         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP79_LAN3,
264             "NVIDIA nForce MCP79 Networking Adapter"},
265         {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP79_LAN4,
266             "NVIDIA nForce MCP79 Networking Adapter"},
267         {0, 0, NULL}
268 };
269
270
271 /* Probe for supported hardware ID's */
272 static int
273 nfe_probe(device_t dev)
274 {
275         struct nfe_type *t;
276
277         t = nfe_devs;
278         /* Check for matching PCI DEVICE ID's */
279         while (t->name != NULL) {
280                 if ((pci_get_vendor(dev) == t->vid_id) &&
281                     (pci_get_device(dev) == t->dev_id)) {
282                         device_set_desc(dev, t->name);
283                         return (BUS_PROBE_DEFAULT);
284                 }
285                 t++;
286         }
287
288         return (ENXIO);
289 }
290
291 static void
292 nfe_alloc_msix(struct nfe_softc *sc, int count)
293 {
294         int rid;
295
296         rid = PCIR_BAR(2);
297         sc->nfe_msix_res = bus_alloc_resource_any(sc->nfe_dev, SYS_RES_MEMORY,
298             &rid, RF_ACTIVE);
299         if (sc->nfe_msix_res == NULL) {
300                 device_printf(sc->nfe_dev,
301                     "couldn't allocate MSIX table resource\n");
302                 return;
303         }
304         rid = PCIR_BAR(3);
305         sc->nfe_msix_pba_res = bus_alloc_resource_any(sc->nfe_dev,
306             SYS_RES_MEMORY, &rid, RF_ACTIVE);
307         if (sc->nfe_msix_pba_res == NULL) {
308                 device_printf(sc->nfe_dev,
309                     "couldn't allocate MSIX PBA resource\n");
310                 bus_release_resource(sc->nfe_dev, SYS_RES_MEMORY, PCIR_BAR(2),
311                     sc->nfe_msix_res);
312                 sc->nfe_msix_res = NULL;
313                 return;
314         }
315
316         if (pci_alloc_msix(sc->nfe_dev, &count) == 0) {
317                 if (count == NFE_MSI_MESSAGES) {
318                         if (bootverbose)
319                                 device_printf(sc->nfe_dev,
320                                     "Using %d MSIX messages\n", count);
321                         sc->nfe_msix = 1;
322                 } else {
323                         if (bootverbose)
324                                 device_printf(sc->nfe_dev,
325                                     "couldn't allocate MSIX\n");
326                         pci_release_msi(sc->nfe_dev);
327                         bus_release_resource(sc->nfe_dev, SYS_RES_MEMORY,
328                             PCIR_BAR(3), sc->nfe_msix_pba_res);
329                         bus_release_resource(sc->nfe_dev, SYS_RES_MEMORY,
330                             PCIR_BAR(2), sc->nfe_msix_res);
331                         sc->nfe_msix_pba_res = NULL;
332                         sc->nfe_msix_res = NULL;
333                 }
334         }
335 }
336
337 static int
338 nfe_attach(device_t dev)
339 {
340         struct nfe_softc *sc;
341         struct ifnet *ifp;
342         bus_addr_t dma_addr_max;
343         int error = 0, i, msic, reg, rid;
344
345         sc = device_get_softc(dev);
346         sc->nfe_dev = dev;
347
348         mtx_init(&sc->nfe_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
349             MTX_DEF);
350         callout_init_mtx(&sc->nfe_stat_ch, &sc->nfe_mtx, 0);
351         TASK_INIT(&sc->nfe_link_task, 0, nfe_link_task, sc);
352
353         pci_enable_busmaster(dev);
354
355         rid = PCIR_BAR(0);
356         sc->nfe_res[0] = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
357             RF_ACTIVE);
358         if (sc->nfe_res[0] == NULL) {
359                 device_printf(dev, "couldn't map memory resources\n");
360                 mtx_destroy(&sc->nfe_mtx);
361                 return (ENXIO);
362         }
363
364         if (pci_find_extcap(dev, PCIY_EXPRESS, &reg) == 0) {
365                 uint16_t v, width;
366
367                 v = pci_read_config(dev, reg + 0x08, 2);
368                 /* Change max. read request size to 4096. */
369                 v &= ~(7 << 12);
370                 v |= (5 << 12);
371                 pci_write_config(dev, reg + 0x08, v, 2);
372
373                 v = pci_read_config(dev, reg + 0x0c, 2);
374                 /* link capability */
375                 v = (v >> 4) & 0x0f;
376                 width = pci_read_config(dev, reg + 0x12, 2);
377                 /* negotiated link width */
378                 width = (width >> 4) & 0x3f;
379                 if (v != width)
380                         device_printf(sc->nfe_dev,
381                             "warning, negotiated width of link(x%d) != "
382                             "max. width of link(x%d)\n", width, v);
383         }
384
385         /* Allocate interrupt */
386         if (msix_disable == 0 || msi_disable == 0) {
387                 if (msix_disable == 0 &&
388                     (msic = pci_msix_count(dev)) == NFE_MSI_MESSAGES)
389                         nfe_alloc_msix(sc, msic);
390                 if (msi_disable == 0 && sc->nfe_msix == 0 &&
391                     (msic = pci_msi_count(dev)) == NFE_MSI_MESSAGES &&
392                     pci_alloc_msi(dev, &msic) == 0) {
393                         if (msic == NFE_MSI_MESSAGES) {
394                                 if (bootverbose)
395                                         device_printf(dev,
396                                             "Using %d MSI messages\n", msic);
397                                 sc->nfe_msi = 1;
398                         } else
399                                 pci_release_msi(dev);
400                 }
401         }
402
403         if (sc->nfe_msix == 0 && sc->nfe_msi == 0) {
404                 rid = 0;
405                 sc->nfe_irq[0] = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
406                     RF_SHAREABLE | RF_ACTIVE);
407                 if (sc->nfe_irq[0] == NULL) {
408                         device_printf(dev, "couldn't allocate IRQ resources\n");
409                         error = ENXIO;
410                         goto fail;
411                 }
412         } else {
413                 for (i = 0, rid = 1; i < NFE_MSI_MESSAGES; i++, rid++) {
414                         sc->nfe_irq[i] = bus_alloc_resource_any(dev,
415                             SYS_RES_IRQ, &rid, RF_ACTIVE);
416                         if (sc->nfe_irq[i] == NULL) {
417                                 device_printf(dev,
418                                     "couldn't allocate IRQ resources for "
419                                     "message %d\n", rid);
420                                 error = ENXIO;
421                                 goto fail;
422                         }
423                 }
424                 /* Map interrupts to vector 0. */
425                 if (sc->nfe_msix != 0) {
426                         NFE_WRITE(sc, NFE_MSIX_MAP0, 0);
427                         NFE_WRITE(sc, NFE_MSIX_MAP1, 0);
428                 } else if (sc->nfe_msi != 0) {
429                         NFE_WRITE(sc, NFE_MSI_MAP0, 0);
430                         NFE_WRITE(sc, NFE_MSI_MAP1, 0);
431                 }
432         }
433
434         /* Set IRQ status/mask register. */
435         sc->nfe_irq_status = NFE_IRQ_STATUS;
436         sc->nfe_irq_mask = NFE_IRQ_MASK;
437         sc->nfe_intrs = NFE_IRQ_WANTED;
438         sc->nfe_nointrs = 0;
439         if (sc->nfe_msix != 0) {
440                 sc->nfe_irq_status = NFE_MSIX_IRQ_STATUS;
441                 sc->nfe_nointrs = NFE_IRQ_WANTED;
442         } else if (sc->nfe_msi != 0) {
443                 sc->nfe_irq_mask = NFE_MSI_IRQ_MASK;
444                 sc->nfe_intrs = NFE_MSI_VECTOR_0_ENABLED;
445         }
446
447         sc->nfe_devid = pci_get_device(dev);
448         sc->nfe_revid = pci_get_revid(dev);
449         sc->nfe_flags = 0;
450
451         switch (sc->nfe_devid) {
452         case PCI_PRODUCT_NVIDIA_NFORCE3_LAN2:
453         case PCI_PRODUCT_NVIDIA_NFORCE3_LAN3:
454         case PCI_PRODUCT_NVIDIA_NFORCE3_LAN4:
455         case PCI_PRODUCT_NVIDIA_NFORCE3_LAN5:
456                 sc->nfe_flags |= NFE_JUMBO_SUP | NFE_HW_CSUM;
457                 break;
458         case PCI_PRODUCT_NVIDIA_MCP51_LAN1:
459         case PCI_PRODUCT_NVIDIA_MCP51_LAN2:
460                 sc->nfe_flags |= NFE_40BIT_ADDR | NFE_PWR_MGMT | NFE_MIB_V1;
461                 break;
462         case PCI_PRODUCT_NVIDIA_CK804_LAN1:
463         case PCI_PRODUCT_NVIDIA_CK804_LAN2:
464         case PCI_PRODUCT_NVIDIA_MCP04_LAN1:
465         case PCI_PRODUCT_NVIDIA_MCP04_LAN2:
466                 sc->nfe_flags |= NFE_JUMBO_SUP | NFE_40BIT_ADDR | NFE_HW_CSUM |
467                     NFE_MIB_V1;
468                 break;
469         case PCI_PRODUCT_NVIDIA_MCP55_LAN1:
470         case PCI_PRODUCT_NVIDIA_MCP55_LAN2:
471                 sc->nfe_flags |= NFE_JUMBO_SUP | NFE_40BIT_ADDR | NFE_HW_CSUM |
472                     NFE_HW_VLAN | NFE_PWR_MGMT | NFE_TX_FLOW_CTRL | NFE_MIB_V2;
473                 break;
474
475         case PCI_PRODUCT_NVIDIA_MCP61_LAN1:
476         case PCI_PRODUCT_NVIDIA_MCP61_LAN2:
477         case PCI_PRODUCT_NVIDIA_MCP61_LAN3:
478         case PCI_PRODUCT_NVIDIA_MCP61_LAN4:
479         case PCI_PRODUCT_NVIDIA_MCP67_LAN1:
480         case PCI_PRODUCT_NVIDIA_MCP67_LAN2:
481         case PCI_PRODUCT_NVIDIA_MCP67_LAN3:
482         case PCI_PRODUCT_NVIDIA_MCP67_LAN4:
483         case PCI_PRODUCT_NVIDIA_MCP73_LAN1:
484         case PCI_PRODUCT_NVIDIA_MCP73_LAN2:
485         case PCI_PRODUCT_NVIDIA_MCP73_LAN3:
486         case PCI_PRODUCT_NVIDIA_MCP73_LAN4:
487                 sc->nfe_flags |= NFE_40BIT_ADDR | NFE_PWR_MGMT |
488                     NFE_CORRECT_MACADDR | NFE_TX_FLOW_CTRL | NFE_MIB_V2;
489                 break;
490         case PCI_PRODUCT_NVIDIA_MCP77_LAN1:
491         case PCI_PRODUCT_NVIDIA_MCP77_LAN2:
492         case PCI_PRODUCT_NVIDIA_MCP77_LAN3:
493         case PCI_PRODUCT_NVIDIA_MCP77_LAN4:
494                 /* XXX flow control */
495                 sc->nfe_flags |= NFE_40BIT_ADDR | NFE_HW_CSUM | NFE_PWR_MGMT |
496                     NFE_CORRECT_MACADDR | NFE_MIB_V3;
497                 break;
498         case PCI_PRODUCT_NVIDIA_MCP79_LAN1:
499         case PCI_PRODUCT_NVIDIA_MCP79_LAN2:
500         case PCI_PRODUCT_NVIDIA_MCP79_LAN3:
501         case PCI_PRODUCT_NVIDIA_MCP79_LAN4:
502                 /* XXX flow control */
503                 sc->nfe_flags |= NFE_JUMBO_SUP | NFE_40BIT_ADDR | NFE_HW_CSUM |
504                     NFE_PWR_MGMT | NFE_CORRECT_MACADDR | NFE_MIB_V3;
505                 break;
506         case PCI_PRODUCT_NVIDIA_MCP65_LAN1:
507         case PCI_PRODUCT_NVIDIA_MCP65_LAN2:
508         case PCI_PRODUCT_NVIDIA_MCP65_LAN3:
509         case PCI_PRODUCT_NVIDIA_MCP65_LAN4:
510                 sc->nfe_flags |= NFE_JUMBO_SUP | NFE_40BIT_ADDR |
511                     NFE_PWR_MGMT | NFE_CORRECT_MACADDR | NFE_TX_FLOW_CTRL |
512                     NFE_MIB_V2;
513                 break;
514         }
515
516         nfe_power(sc);
517         /* Check for reversed ethernet address */
518         if ((NFE_READ(sc, NFE_TX_UNK) & NFE_MAC_ADDR_INORDER) != 0)
519                 sc->nfe_flags |= NFE_CORRECT_MACADDR;
520         nfe_get_macaddr(sc, sc->eaddr);
521         /*
522          * Allocate the parent bus DMA tag appropriate for PCI.
523          */
524         dma_addr_max = BUS_SPACE_MAXADDR_32BIT;
525         if ((sc->nfe_flags & NFE_40BIT_ADDR) != 0)
526                 dma_addr_max = NFE_DMA_MAXADDR;
527         error = bus_dma_tag_create(
528             bus_get_dma_tag(sc->nfe_dev),       /* parent */
529             1, 0,                               /* alignment, boundary */
530             dma_addr_max,                       /* lowaddr */
531             BUS_SPACE_MAXADDR,                  /* highaddr */
532             NULL, NULL,                         /* filter, filterarg */
533             BUS_SPACE_MAXSIZE_32BIT, 0,         /* maxsize, nsegments */
534             BUS_SPACE_MAXSIZE_32BIT,            /* maxsegsize */
535             0,                                  /* flags */
536             NULL, NULL,                         /* lockfunc, lockarg */
537             &sc->nfe_parent_tag);
538         if (error)
539                 goto fail;
540
541         ifp = sc->nfe_ifp = if_alloc(IFT_ETHER);
542         if (ifp == NULL) {
543                 device_printf(dev, "can not if_alloc()\n");
544                 error = ENOSPC;
545                 goto fail;
546         }
547         TASK_INIT(&sc->nfe_tx_task, 1, nfe_tx_task, ifp);
548
549         /*
550          * Allocate Tx and Rx rings.
551          */
552         if ((error = nfe_alloc_tx_ring(sc, &sc->txq)) != 0)
553                 goto fail;
554
555         if ((error = nfe_alloc_rx_ring(sc, &sc->rxq)) != 0)
556                 goto fail;
557
558         nfe_alloc_jrx_ring(sc, &sc->jrxq);
559         /* Create sysctl node. */
560         nfe_sysctl_node(sc);
561
562         ifp->if_softc = sc;
563         if_initname(ifp, device_get_name(dev), device_get_unit(dev));
564         ifp->if_mtu = ETHERMTU;
565         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
566         ifp->if_ioctl = nfe_ioctl;
567         ifp->if_start = nfe_start;
568         ifp->if_hwassist = 0;
569         ifp->if_capabilities = 0;
570         ifp->if_watchdog = NULL;
571         ifp->if_init = nfe_init;
572         IFQ_SET_MAXLEN(&ifp->if_snd, NFE_TX_RING_COUNT - 1);
573         ifp->if_snd.ifq_drv_maxlen = NFE_TX_RING_COUNT - 1;
574         IFQ_SET_READY(&ifp->if_snd);
575
576         if (sc->nfe_flags & NFE_HW_CSUM) {
577                 ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_TSO4;
578                 ifp->if_hwassist |= NFE_CSUM_FEATURES | CSUM_TSO;
579         }
580         ifp->if_capenable = ifp->if_capabilities;
581
582         sc->nfe_framesize = ifp->if_mtu + NFE_RX_HEADERS;
583         /* VLAN capability setup. */
584         ifp->if_capabilities |= IFCAP_VLAN_MTU;
585         if ((sc->nfe_flags & NFE_HW_VLAN) != 0) {
586                 ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING;
587                 if ((ifp->if_capabilities & IFCAP_HWCSUM) != 0)
588                         ifp->if_capabilities |= IFCAP_VLAN_HWCSUM;
589         }
590         ifp->if_capenable = ifp->if_capabilities;
591
592         /*
593          * Tell the upper layer(s) we support long frames.
594          * Must appear after the call to ether_ifattach() because
595          * ether_ifattach() sets ifi_hdrlen to the default value.
596          */
597         ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
598
599 #ifdef DEVICE_POLLING
600         ifp->if_capabilities |= IFCAP_POLLING;
601 #endif
602
603         /* Do MII setup */
604         if (mii_phy_probe(dev, &sc->nfe_miibus, nfe_ifmedia_upd,
605             nfe_ifmedia_sts)) {
606                 device_printf(dev, "MII without any phy!\n");
607                 error = ENXIO;
608                 goto fail;
609         }
610         ether_ifattach(ifp, sc->eaddr);
611
612         TASK_INIT(&sc->nfe_int_task, 0, nfe_int_task, sc);
613         sc->nfe_tq = taskqueue_create_fast("nfe_taskq", M_WAITOK,
614             taskqueue_thread_enqueue, &sc->nfe_tq);
615         taskqueue_start_threads(&sc->nfe_tq, 1, PI_NET, "%s taskq",
616             device_get_nameunit(sc->nfe_dev));
617         error = 0;
618         if (sc->nfe_msi == 0 && sc->nfe_msix == 0) {
619                 error = bus_setup_intr(dev, sc->nfe_irq[0],
620                     INTR_TYPE_NET | INTR_MPSAFE, nfe_intr, NULL, sc,
621                     &sc->nfe_intrhand[0]);
622         } else {
623                 for (i = 0; i < NFE_MSI_MESSAGES; i++) {
624                         error = bus_setup_intr(dev, sc->nfe_irq[i],
625                             INTR_TYPE_NET | INTR_MPSAFE, nfe_intr, NULL, sc,
626                             &sc->nfe_intrhand[i]);
627                         if (error != 0)
628                                 break;
629                 }
630         }
631         if (error) {
632                 device_printf(dev, "couldn't set up irq\n");
633                 taskqueue_free(sc->nfe_tq);
634                 sc->nfe_tq = NULL;
635                 ether_ifdetach(ifp);
636                 goto fail;
637         }
638
639 fail:
640         if (error)
641                 nfe_detach(dev);
642
643         return (error);
644 }
645
646
647 static int
648 nfe_detach(device_t dev)
649 {
650         struct nfe_softc *sc;
651         struct ifnet *ifp;
652         uint8_t eaddr[ETHER_ADDR_LEN];
653         int i, rid;
654
655         sc = device_get_softc(dev);
656         KASSERT(mtx_initialized(&sc->nfe_mtx), ("nfe mutex not initialized"));
657         ifp = sc->nfe_ifp;
658
659 #ifdef DEVICE_POLLING
660         if (ifp != NULL && ifp->if_capenable & IFCAP_POLLING)
661                 ether_poll_deregister(ifp);
662 #endif
663         if (device_is_attached(dev)) {
664                 NFE_LOCK(sc);
665                 nfe_stop(ifp);
666                 ifp->if_flags &= ~IFF_UP;
667                 NFE_UNLOCK(sc);
668                 callout_drain(&sc->nfe_stat_ch);
669                 taskqueue_drain(taskqueue_fast, &sc->nfe_tx_task);
670                 taskqueue_drain(taskqueue_swi, &sc->nfe_link_task);
671                 ether_ifdetach(ifp);
672         }
673
674         if (ifp) {
675                 /* restore ethernet address */
676                 if ((sc->nfe_flags & NFE_CORRECT_MACADDR) == 0) {
677                         for (i = 0; i < ETHER_ADDR_LEN; i++) {
678                                 eaddr[i] = sc->eaddr[5 - i];
679                         }
680                 } else
681                         bcopy(sc->eaddr, eaddr, ETHER_ADDR_LEN);
682                 nfe_set_macaddr(sc, eaddr);
683                 if_free(ifp);
684         }
685         if (sc->nfe_miibus)
686                 device_delete_child(dev, sc->nfe_miibus);
687         bus_generic_detach(dev);
688         if (sc->nfe_tq != NULL) {
689                 taskqueue_drain(sc->nfe_tq, &sc->nfe_int_task);
690                 taskqueue_free(sc->nfe_tq);
691                 sc->nfe_tq = NULL;
692         }
693
694         for (i = 0; i < NFE_MSI_MESSAGES; i++) {
695                 if (sc->nfe_intrhand[i] != NULL) {
696                         bus_teardown_intr(dev, sc->nfe_irq[i],
697                             sc->nfe_intrhand[i]);
698                         sc->nfe_intrhand[i] = NULL;
699                 }
700         }
701
702         if (sc->nfe_msi == 0 && sc->nfe_msix == 0) {
703                 if (sc->nfe_irq[0] != NULL)
704                         bus_release_resource(dev, SYS_RES_IRQ, 0,
705                             sc->nfe_irq[0]);
706         } else {
707                 for (i = 0, rid = 1; i < NFE_MSI_MESSAGES; i++, rid++) {
708                         if (sc->nfe_irq[i] != NULL) {
709                                 bus_release_resource(dev, SYS_RES_IRQ, rid,
710                                     sc->nfe_irq[i]);
711                                 sc->nfe_irq[i] = NULL;
712                         }
713                 }
714                 pci_release_msi(dev);
715         }
716         if (sc->nfe_msix_pba_res != NULL) {
717                 bus_release_resource(dev, SYS_RES_MEMORY, PCIR_BAR(3),
718                     sc->nfe_msix_pba_res);
719                 sc->nfe_msix_pba_res = NULL;
720         }
721         if (sc->nfe_msix_res != NULL) {
722                 bus_release_resource(dev, SYS_RES_MEMORY, PCIR_BAR(2),
723                     sc->nfe_msix_res);
724                 sc->nfe_msix_res = NULL;
725         }
726         if (sc->nfe_res[0] != NULL) {
727                 bus_release_resource(dev, SYS_RES_MEMORY, PCIR_BAR(0),
728                     sc->nfe_res[0]);
729                 sc->nfe_res[0] = NULL;
730         }
731
732         nfe_free_tx_ring(sc, &sc->txq);
733         nfe_free_rx_ring(sc, &sc->rxq);
734         nfe_free_jrx_ring(sc, &sc->jrxq);
735
736         if (sc->nfe_parent_tag) {
737                 bus_dma_tag_destroy(sc->nfe_parent_tag);
738                 sc->nfe_parent_tag = NULL;
739         }
740
741         mtx_destroy(&sc->nfe_mtx);
742
743         return (0);
744 }
745
746
747 static int
748 nfe_suspend(device_t dev)
749 {
750         struct nfe_softc *sc;
751
752         sc = device_get_softc(dev);
753
754         NFE_LOCK(sc);
755         nfe_stop(sc->nfe_ifp);
756         sc->nfe_suspended = 1;
757         NFE_UNLOCK(sc);
758
759         return (0);
760 }
761
762
763 static int
764 nfe_resume(device_t dev)
765 {
766         struct nfe_softc *sc;
767         struct ifnet *ifp;
768
769         sc = device_get_softc(dev);
770
771         NFE_LOCK(sc);
772         ifp = sc->nfe_ifp;
773         if (ifp->if_flags & IFF_UP)
774                 nfe_init_locked(sc);
775         sc->nfe_suspended = 0;
776         NFE_UNLOCK(sc);
777
778         return (0);
779 }
780
781
782 /* Take PHY/NIC out of powerdown, from Linux */
783 static void
784 nfe_power(struct nfe_softc *sc)
785 {
786         uint32_t pwr;
787
788         if ((sc->nfe_flags & NFE_PWR_MGMT) == 0)
789                 return;
790         NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_RESET | NFE_RXTX_BIT2);
791         NFE_WRITE(sc, NFE_MAC_RESET, NFE_MAC_RESET_MAGIC);
792         DELAY(100);
793         NFE_WRITE(sc, NFE_MAC_RESET, 0);
794         DELAY(100);
795         NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_BIT2);
796         pwr = NFE_READ(sc, NFE_PWR2_CTL);
797         pwr &= ~NFE_PWR2_WAKEUP_MASK;
798         if (sc->nfe_revid >= 0xa3 &&
799             (sc->nfe_devid == PCI_PRODUCT_NVIDIA_NFORCE430_LAN1 ||
800             sc->nfe_devid == PCI_PRODUCT_NVIDIA_NFORCE430_LAN2))
801                 pwr |= NFE_PWR2_REVA3;
802         NFE_WRITE(sc, NFE_PWR2_CTL, pwr);
803 }
804
805
806 static void
807 nfe_miibus_statchg(device_t dev)
808 {
809         struct nfe_softc *sc;
810
811         sc = device_get_softc(dev);
812         taskqueue_enqueue(taskqueue_swi, &sc->nfe_link_task);
813 }
814
815
816 static void
817 nfe_link_task(void *arg, int pending)
818 {
819         struct nfe_softc *sc;
820         struct mii_data *mii;
821         struct ifnet *ifp;
822         uint32_t phy, seed, misc = NFE_MISC1_MAGIC, link = NFE_MEDIA_SET;
823         uint32_t gmask, rxctl, txctl, val;
824
825         sc = (struct nfe_softc *)arg;
826
827         NFE_LOCK(sc);
828
829         mii = device_get_softc(sc->nfe_miibus);
830         ifp = sc->nfe_ifp;
831         if (mii == NULL || ifp == NULL) {
832                 NFE_UNLOCK(sc);
833                 return;
834         }
835
836         if (mii->mii_media_status & IFM_ACTIVE) {
837                 if (IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE)
838                         sc->nfe_link = 1;
839         } else
840                 sc->nfe_link = 0;
841
842         phy = NFE_READ(sc, NFE_PHY_IFACE);
843         phy &= ~(NFE_PHY_HDX | NFE_PHY_100TX | NFE_PHY_1000T);
844
845         seed = NFE_READ(sc, NFE_RNDSEED);
846         seed &= ~NFE_SEED_MASK;
847
848         if (((mii->mii_media_active & IFM_GMASK) & IFM_FDX) == 0) {
849                 phy  |= NFE_PHY_HDX;    /* half-duplex */
850                 misc |= NFE_MISC1_HDX;
851         }
852
853         switch (IFM_SUBTYPE(mii->mii_media_active)) {
854         case IFM_1000_T:        /* full-duplex only */
855                 link |= NFE_MEDIA_1000T;
856                 seed |= NFE_SEED_1000T;
857                 phy  |= NFE_PHY_1000T;
858                 break;
859         case IFM_100_TX:
860                 link |= NFE_MEDIA_100TX;
861                 seed |= NFE_SEED_100TX;
862                 phy  |= NFE_PHY_100TX;
863                 break;
864         case IFM_10_T:
865                 link |= NFE_MEDIA_10T;
866                 seed |= NFE_SEED_10T;
867                 break;
868         }
869
870         if ((phy & 0x10000000) != 0) {
871                 if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T)
872                         val = NFE_R1_MAGIC_1000;
873                 else
874                         val = NFE_R1_MAGIC_10_100;
875         } else
876                 val = NFE_R1_MAGIC_DEFAULT;
877         NFE_WRITE(sc, NFE_SETUP_R1, val);
878
879         NFE_WRITE(sc, NFE_RNDSEED, seed);       /* XXX: gigabit NICs only? */
880
881         NFE_WRITE(sc, NFE_PHY_IFACE, phy);
882         NFE_WRITE(sc, NFE_MISC1, misc);
883         NFE_WRITE(sc, NFE_LINKSPEED, link);
884
885         gmask = mii->mii_media_active & IFM_GMASK;
886         if ((gmask & IFM_FDX) != 0) {
887                 /* It seems all hardwares supports Rx pause frames. */
888                 val = NFE_READ(sc, NFE_RXFILTER);
889                 if ((gmask & IFM_FLAG0) != 0)
890                         val |= NFE_PFF_RX_PAUSE;
891                 else
892                         val &= ~NFE_PFF_RX_PAUSE;
893                 NFE_WRITE(sc, NFE_RXFILTER, val);
894                 if ((sc->nfe_flags & NFE_TX_FLOW_CTRL) != 0) {
895                         val = NFE_READ(sc, NFE_MISC1);
896                         if ((gmask & IFM_FLAG1) != 0) {
897                                 NFE_WRITE(sc, NFE_TX_PAUSE_FRAME,
898                                     NFE_TX_PAUSE_FRAME_ENABLE);
899                                 val |= NFE_MISC1_TX_PAUSE;
900                         } else {
901                                 val &= ~NFE_MISC1_TX_PAUSE;
902                                 NFE_WRITE(sc, NFE_TX_PAUSE_FRAME,
903                                     NFE_TX_PAUSE_FRAME_DISABLE);
904                         }
905                         NFE_WRITE(sc, NFE_MISC1, val);
906                 }
907         } else {
908                 /* disable rx/tx pause frames */
909                 val = NFE_READ(sc, NFE_RXFILTER);
910                 val &= ~NFE_PFF_RX_PAUSE;
911                 NFE_WRITE(sc, NFE_RXFILTER, val);
912                 if ((sc->nfe_flags & NFE_TX_FLOW_CTRL) != 0) {
913                         NFE_WRITE(sc, NFE_TX_PAUSE_FRAME,
914                             NFE_TX_PAUSE_FRAME_DISABLE);
915                         val = NFE_READ(sc, NFE_MISC1);
916                         val &= ~NFE_MISC1_TX_PAUSE;
917                         NFE_WRITE(sc, NFE_MISC1, val);
918                 }
919         }
920
921         txctl = NFE_READ(sc, NFE_TX_CTL);
922         rxctl = NFE_READ(sc, NFE_RX_CTL);
923         if (sc->nfe_link != 0 && (ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
924                 txctl |= NFE_TX_START;
925                 rxctl |= NFE_RX_START;
926         } else {
927                 txctl &= ~NFE_TX_START;
928                 rxctl &= ~NFE_RX_START;
929         }
930         NFE_WRITE(sc, NFE_TX_CTL, txctl);
931         NFE_WRITE(sc, NFE_RX_CTL, rxctl);
932
933         NFE_UNLOCK(sc);
934 }
935
936
937 static int
938 nfe_miibus_readreg(device_t dev, int phy, int reg)
939 {
940         struct nfe_softc *sc = device_get_softc(dev);
941         uint32_t val;
942         int ntries;
943
944         NFE_WRITE(sc, NFE_PHY_STATUS, 0xf);
945
946         if (NFE_READ(sc, NFE_PHY_CTL) & NFE_PHY_BUSY) {
947                 NFE_WRITE(sc, NFE_PHY_CTL, NFE_PHY_BUSY);
948                 DELAY(100);
949         }
950
951         NFE_WRITE(sc, NFE_PHY_CTL, (phy << NFE_PHYADD_SHIFT) | reg);
952
953         for (ntries = 0; ntries < NFE_TIMEOUT; ntries++) {
954                 DELAY(100);
955                 if (!(NFE_READ(sc, NFE_PHY_CTL) & NFE_PHY_BUSY))
956                         break;
957         }
958         if (ntries == NFE_TIMEOUT) {
959                 DPRINTFN(sc, 2, "timeout waiting for PHY\n");
960                 return 0;
961         }
962
963         if (NFE_READ(sc, NFE_PHY_STATUS) & NFE_PHY_ERROR) {
964                 DPRINTFN(sc, 2, "could not read PHY\n");
965                 return 0;
966         }
967
968         val = NFE_READ(sc, NFE_PHY_DATA);
969         if (val != 0xffffffff && val != 0)
970                 sc->mii_phyaddr = phy;
971
972         DPRINTFN(sc, 2, "mii read phy %d reg 0x%x ret 0x%x\n", phy, reg, val);
973
974         return (val);
975 }
976
977
978 static int
979 nfe_miibus_writereg(device_t dev, int phy, int reg, int val)
980 {
981         struct nfe_softc *sc = device_get_softc(dev);
982         uint32_t ctl;
983         int ntries;
984
985         NFE_WRITE(sc, NFE_PHY_STATUS, 0xf);
986
987         if (NFE_READ(sc, NFE_PHY_CTL) & NFE_PHY_BUSY) {
988                 NFE_WRITE(sc, NFE_PHY_CTL, NFE_PHY_BUSY);
989                 DELAY(100);
990         }
991
992         NFE_WRITE(sc, NFE_PHY_DATA, val);
993         ctl = NFE_PHY_WRITE | (phy << NFE_PHYADD_SHIFT) | reg;
994         NFE_WRITE(sc, NFE_PHY_CTL, ctl);
995
996         for (ntries = 0; ntries < NFE_TIMEOUT; ntries++) {
997                 DELAY(100);
998                 if (!(NFE_READ(sc, NFE_PHY_CTL) & NFE_PHY_BUSY))
999                         break;
1000         }
1001 #ifdef NFE_DEBUG
1002         if (nfedebug >= 2 && ntries == NFE_TIMEOUT)
1003                 device_printf(sc->nfe_dev, "could not write to PHY\n");
1004 #endif
1005         return (0);
1006 }
1007
1008 struct nfe_dmamap_arg {
1009         bus_addr_t nfe_busaddr;
1010 };
1011
1012 static int
1013 nfe_alloc_rx_ring(struct nfe_softc *sc, struct nfe_rx_ring *ring)
1014 {
1015         struct nfe_dmamap_arg ctx;
1016         struct nfe_rx_data *data;
1017         void *desc;
1018         int i, error, descsize;
1019
1020         if (sc->nfe_flags & NFE_40BIT_ADDR) {
1021                 desc = ring->desc64;
1022                 descsize = sizeof (struct nfe_desc64);
1023         } else {
1024                 desc = ring->desc32;
1025                 descsize = sizeof (struct nfe_desc32);
1026         }
1027
1028         ring->cur = ring->next = 0;
1029
1030         error = bus_dma_tag_create(sc->nfe_parent_tag,
1031             NFE_RING_ALIGN, 0,                  /* alignment, boundary */
1032             BUS_SPACE_MAXADDR,                  /* lowaddr */
1033             BUS_SPACE_MAXADDR,                  /* highaddr */
1034             NULL, NULL,                         /* filter, filterarg */
1035             NFE_RX_RING_COUNT * descsize, 1,    /* maxsize, nsegments */
1036             NFE_RX_RING_COUNT * descsize,       /* maxsegsize */
1037             0,                                  /* flags */
1038             NULL, NULL,                         /* lockfunc, lockarg */
1039             &ring->rx_desc_tag);
1040         if (error != 0) {
1041                 device_printf(sc->nfe_dev, "could not create desc DMA tag\n");
1042                 goto fail;
1043         }
1044
1045         /* allocate memory to desc */
1046         error = bus_dmamem_alloc(ring->rx_desc_tag, &desc, BUS_DMA_WAITOK |
1047             BUS_DMA_COHERENT | BUS_DMA_ZERO, &ring->rx_desc_map);
1048         if (error != 0) {
1049                 device_printf(sc->nfe_dev, "could not create desc DMA map\n");
1050                 goto fail;
1051         }
1052         if (sc->nfe_flags & NFE_40BIT_ADDR)
1053                 ring->desc64 = desc;
1054         else
1055                 ring->desc32 = desc;
1056
1057         /* map desc to device visible address space */
1058         ctx.nfe_busaddr = 0;
1059         error = bus_dmamap_load(ring->rx_desc_tag, ring->rx_desc_map, desc,
1060             NFE_RX_RING_COUNT * descsize, nfe_dma_map_segs, &ctx, 0);
1061         if (error != 0) {
1062                 device_printf(sc->nfe_dev, "could not load desc DMA map\n");
1063                 goto fail;
1064         }
1065         ring->physaddr = ctx.nfe_busaddr;
1066
1067         error = bus_dma_tag_create(sc->nfe_parent_tag,
1068             1, 0,                       /* alignment, boundary */
1069             BUS_SPACE_MAXADDR,          /* lowaddr */
1070             BUS_SPACE_MAXADDR,          /* highaddr */
1071             NULL, NULL,                 /* filter, filterarg */
1072             MCLBYTES, 1,                /* maxsize, nsegments */
1073             MCLBYTES,                   /* maxsegsize */
1074             0,                          /* flags */
1075             NULL, NULL,                 /* lockfunc, lockarg */
1076             &ring->rx_data_tag);
1077         if (error != 0) {
1078                 device_printf(sc->nfe_dev, "could not create Rx DMA tag\n");
1079                 goto fail;
1080         }
1081
1082         error = bus_dmamap_create(ring->rx_data_tag, 0, &ring->rx_spare_map);
1083         if (error != 0) {
1084                 device_printf(sc->nfe_dev,
1085                     "could not create Rx DMA spare map\n");
1086                 goto fail;
1087         }
1088
1089         /*
1090          * Pre-allocate Rx buffers and populate Rx ring.
1091          */
1092         for (i = 0; i < NFE_RX_RING_COUNT; i++) {
1093                 data = &sc->rxq.data[i];
1094                 data->rx_data_map = NULL;
1095                 data->m = NULL;
1096                 error = bus_dmamap_create(ring->rx_data_tag, 0,
1097                     &data->rx_data_map);
1098                 if (error != 0) {
1099                         device_printf(sc->nfe_dev,
1100                             "could not create Rx DMA map\n");
1101                         goto fail;
1102                 }
1103         }
1104
1105 fail:
1106         return (error);
1107 }
1108
1109
1110 static void
1111 nfe_alloc_jrx_ring(struct nfe_softc *sc, struct nfe_jrx_ring *ring)
1112 {
1113         struct nfe_dmamap_arg ctx;
1114         struct nfe_rx_data *data;
1115         void *desc;
1116         int i, error, descsize;
1117
1118         if ((sc->nfe_flags & NFE_JUMBO_SUP) == 0)
1119                 return;
1120         if (jumbo_disable != 0) {
1121                 device_printf(sc->nfe_dev, "disabling jumbo frame support\n");
1122                 sc->nfe_jumbo_disable = 1;
1123                 return;
1124         }
1125
1126         if (sc->nfe_flags & NFE_40BIT_ADDR) {
1127                 desc = ring->jdesc64;
1128                 descsize = sizeof (struct nfe_desc64);
1129         } else {
1130                 desc = ring->jdesc32;
1131                 descsize = sizeof (struct nfe_desc32);
1132         }
1133
1134         ring->jcur = ring->jnext = 0;
1135
1136         /* Create DMA tag for jumbo Rx ring. */
1137         error = bus_dma_tag_create(sc->nfe_parent_tag,
1138             NFE_RING_ALIGN, 0,                  /* alignment, boundary */
1139             BUS_SPACE_MAXADDR,                  /* lowaddr */
1140             BUS_SPACE_MAXADDR,                  /* highaddr */
1141             NULL, NULL,                         /* filter, filterarg */
1142             NFE_JUMBO_RX_RING_COUNT * descsize, /* maxsize */
1143             1,                                  /* nsegments */
1144             NFE_JUMBO_RX_RING_COUNT * descsize, /* maxsegsize */
1145             0,                                  /* flags */
1146             NULL, NULL,                         /* lockfunc, lockarg */
1147             &ring->jrx_desc_tag);
1148         if (error != 0) {
1149                 device_printf(sc->nfe_dev,
1150                     "could not create jumbo ring DMA tag\n");
1151                 goto fail;
1152         }
1153
1154         /* Create DMA tag for jumbo Rx buffers. */
1155         error = bus_dma_tag_create(sc->nfe_parent_tag,
1156             1, 0,                               /* alignment, boundary */
1157             BUS_SPACE_MAXADDR,                  /* lowaddr */
1158             BUS_SPACE_MAXADDR,                  /* highaddr */
1159             NULL, NULL,                         /* filter, filterarg */
1160             MJUM9BYTES,                         /* maxsize */
1161             1,                                  /* nsegments */
1162             MJUM9BYTES,                         /* maxsegsize */
1163             0,                                  /* flags */
1164             NULL, NULL,                         /* lockfunc, lockarg */
1165             &ring->jrx_data_tag);
1166         if (error != 0) {
1167                 device_printf(sc->nfe_dev,
1168                     "could not create jumbo Rx buffer DMA tag\n");
1169                 goto fail;
1170         }
1171
1172         /* Allocate DMA'able memory and load the DMA map for jumbo Rx ring. */
1173         error = bus_dmamem_alloc(ring->jrx_desc_tag, &desc, BUS_DMA_WAITOK |
1174             BUS_DMA_COHERENT | BUS_DMA_ZERO, &ring->jrx_desc_map);
1175         if (error != 0) {
1176                 device_printf(sc->nfe_dev,
1177                     "could not allocate DMA'able memory for jumbo Rx ring\n");
1178                 goto fail;
1179         }
1180         if (sc->nfe_flags & NFE_40BIT_ADDR)
1181                 ring->jdesc64 = desc;
1182         else
1183                 ring->jdesc32 = desc;
1184
1185         ctx.nfe_busaddr = 0;
1186         error = bus_dmamap_load(ring->jrx_desc_tag, ring->jrx_desc_map, desc,
1187             NFE_JUMBO_RX_RING_COUNT * descsize, nfe_dma_map_segs, &ctx, 0);
1188         if (error != 0) {
1189                 device_printf(sc->nfe_dev,
1190                     "could not load DMA'able memory for jumbo Rx ring\n");
1191                 goto fail;
1192         }
1193         ring->jphysaddr = ctx.nfe_busaddr;
1194
1195         /* Create DMA maps for jumbo Rx buffers. */
1196         error = bus_dmamap_create(ring->jrx_data_tag, 0, &ring->jrx_spare_map);
1197         if (error != 0) {
1198                 device_printf(sc->nfe_dev,
1199                     "could not create jumbo Rx DMA spare map\n");
1200                 goto fail;
1201         }
1202
1203         for (i = 0; i < NFE_JUMBO_RX_RING_COUNT; i++) {
1204                 data = &sc->jrxq.jdata[i];
1205                 data->rx_data_map = NULL;
1206                 data->m = NULL;
1207                 error = bus_dmamap_create(ring->jrx_data_tag, 0,
1208                     &data->rx_data_map);
1209                 if (error != 0) {
1210                         device_printf(sc->nfe_dev,
1211                             "could not create jumbo Rx DMA map\n");
1212                         goto fail;
1213                 }
1214         }
1215
1216         return;
1217
1218 fail:
1219         /*
1220          * Running without jumbo frame support is ok for most cases
1221          * so don't fail on creating dma tag/map for jumbo frame.
1222          */
1223         nfe_free_jrx_ring(sc, ring);
1224         device_printf(sc->nfe_dev, "disabling jumbo frame support due to "
1225             "resource shortage\n");
1226         sc->nfe_jumbo_disable = 1;
1227 }
1228
1229
1230 static int
1231 nfe_init_rx_ring(struct nfe_softc *sc, struct nfe_rx_ring *ring)
1232 {
1233         void *desc;
1234         size_t descsize;
1235         int i;
1236
1237         ring->cur = ring->next = 0;
1238         if (sc->nfe_flags & NFE_40BIT_ADDR) {
1239                 desc = ring->desc64;
1240                 descsize = sizeof (struct nfe_desc64);
1241         } else {
1242                 desc = ring->desc32;
1243                 descsize = sizeof (struct nfe_desc32);
1244         }
1245         bzero(desc, descsize * NFE_RX_RING_COUNT);
1246         for (i = 0; i < NFE_RX_RING_COUNT; i++) {
1247                 if (nfe_newbuf(sc, i) != 0)
1248                         return (ENOBUFS);
1249         }
1250
1251         bus_dmamap_sync(ring->rx_desc_tag, ring->rx_desc_map,
1252             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1253
1254         return (0);
1255 }
1256
1257
1258 static int
1259 nfe_init_jrx_ring(struct nfe_softc *sc, struct nfe_jrx_ring *ring)
1260 {
1261         void *desc;
1262         size_t descsize;
1263         int i;
1264
1265         ring->jcur = ring->jnext = 0;
1266         if (sc->nfe_flags & NFE_40BIT_ADDR) {
1267                 desc = ring->jdesc64;
1268                 descsize = sizeof (struct nfe_desc64);
1269         } else {
1270                 desc = ring->jdesc32;
1271                 descsize = sizeof (struct nfe_desc32);
1272         }
1273         bzero(desc, descsize * NFE_JUMBO_RX_RING_COUNT);
1274         for (i = 0; i < NFE_JUMBO_RX_RING_COUNT; i++) {
1275                 if (nfe_jnewbuf(sc, i) != 0)
1276                         return (ENOBUFS);
1277         }
1278
1279         bus_dmamap_sync(ring->jrx_desc_tag, ring->jrx_desc_map,
1280             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1281
1282         return (0);
1283 }
1284
1285
1286 static void
1287 nfe_free_rx_ring(struct nfe_softc *sc, struct nfe_rx_ring *ring)
1288 {
1289         struct nfe_rx_data *data;
1290         void *desc;
1291         int i, descsize;
1292
1293         if (sc->nfe_flags & NFE_40BIT_ADDR) {
1294                 desc = ring->desc64;
1295                 descsize = sizeof (struct nfe_desc64);
1296         } else {
1297                 desc = ring->desc32;
1298                 descsize = sizeof (struct nfe_desc32);
1299         }
1300
1301         for (i = 0; i < NFE_RX_RING_COUNT; i++) {
1302                 data = &ring->data[i];
1303                 if (data->rx_data_map != NULL) {
1304                         bus_dmamap_destroy(ring->rx_data_tag,
1305                             data->rx_data_map);
1306                         data->rx_data_map = NULL;
1307                 }
1308                 if (data->m != NULL) {
1309                         m_freem(data->m);
1310                         data->m = NULL;
1311                 }
1312         }
1313         if (ring->rx_data_tag != NULL) {
1314                 if (ring->rx_spare_map != NULL) {
1315                         bus_dmamap_destroy(ring->rx_data_tag,
1316                             ring->rx_spare_map);
1317                         ring->rx_spare_map = NULL;
1318                 }
1319                 bus_dma_tag_destroy(ring->rx_data_tag);
1320                 ring->rx_data_tag = NULL;
1321         }
1322
1323         if (desc != NULL) {
1324                 bus_dmamap_unload(ring->rx_desc_tag, ring->rx_desc_map);
1325                 bus_dmamem_free(ring->rx_desc_tag, desc, ring->rx_desc_map);
1326                 ring->desc64 = NULL;
1327                 ring->desc32 = NULL;
1328                 ring->rx_desc_map = NULL;
1329         }
1330         if (ring->rx_desc_tag != NULL) {
1331                 bus_dma_tag_destroy(ring->rx_desc_tag);
1332                 ring->rx_desc_tag = NULL;
1333         }
1334 }
1335
1336
1337 static void
1338 nfe_free_jrx_ring(struct nfe_softc *sc, struct nfe_jrx_ring *ring)
1339 {
1340         struct nfe_rx_data *data;
1341         void *desc;
1342         int i, descsize;
1343
1344         if ((sc->nfe_flags & NFE_JUMBO_SUP) == 0)
1345                 return;
1346
1347         if (sc->nfe_flags & NFE_40BIT_ADDR) {
1348                 desc = ring->jdesc64;
1349                 descsize = sizeof (struct nfe_desc64);
1350         } else {
1351                 desc = ring->jdesc32;
1352                 descsize = sizeof (struct nfe_desc32);
1353         }
1354
1355         for (i = 0; i < NFE_JUMBO_RX_RING_COUNT; i++) {
1356                 data = &ring->jdata[i];
1357                 if (data->rx_data_map != NULL) {
1358                         bus_dmamap_destroy(ring->jrx_data_tag,
1359                             data->rx_data_map);
1360                         data->rx_data_map = NULL;
1361                 }
1362                 if (data->m != NULL) {
1363                         m_freem(data->m);
1364                         data->m = NULL;
1365                 }
1366         }
1367         if (ring->jrx_data_tag != NULL) {
1368                 if (ring->jrx_spare_map != NULL) {
1369                         bus_dmamap_destroy(ring->jrx_data_tag,
1370                             ring->jrx_spare_map);
1371                         ring->jrx_spare_map = NULL;
1372                 }
1373                 bus_dma_tag_destroy(ring->jrx_data_tag);
1374                 ring->jrx_data_tag = NULL;
1375         }
1376
1377         if (desc != NULL) {
1378                 bus_dmamap_unload(ring->jrx_desc_tag, ring->jrx_desc_map);
1379                 bus_dmamem_free(ring->jrx_desc_tag, desc, ring->jrx_desc_map);
1380                 ring->jdesc64 = NULL;
1381                 ring->jdesc32 = NULL;
1382                 ring->jrx_desc_map = NULL;
1383         }
1384
1385         if (ring->jrx_desc_tag != NULL) {
1386                 bus_dma_tag_destroy(ring->jrx_desc_tag);
1387                 ring->jrx_desc_tag = NULL;
1388         }
1389 }
1390
1391
1392 static int
1393 nfe_alloc_tx_ring(struct nfe_softc *sc, struct nfe_tx_ring *ring)
1394 {
1395         struct nfe_dmamap_arg ctx;
1396         int i, error;
1397         void *desc;
1398         int descsize;
1399
1400         if (sc->nfe_flags & NFE_40BIT_ADDR) {
1401                 desc = ring->desc64;
1402                 descsize = sizeof (struct nfe_desc64);
1403         } else {
1404                 desc = ring->desc32;
1405                 descsize = sizeof (struct nfe_desc32);
1406         }
1407
1408         ring->queued = 0;
1409         ring->cur = ring->next = 0;
1410
1411         error = bus_dma_tag_create(sc->nfe_parent_tag,
1412             NFE_RING_ALIGN, 0,                  /* alignment, boundary */
1413             BUS_SPACE_MAXADDR,                  /* lowaddr */
1414             BUS_SPACE_MAXADDR,                  /* highaddr */
1415             NULL, NULL,                         /* filter, filterarg */
1416             NFE_TX_RING_COUNT * descsize, 1,    /* maxsize, nsegments */
1417             NFE_TX_RING_COUNT * descsize,       /* maxsegsize */
1418             0,                                  /* flags */
1419             NULL, NULL,                         /* lockfunc, lockarg */
1420             &ring->tx_desc_tag);
1421         if (error != 0) {
1422                 device_printf(sc->nfe_dev, "could not create desc DMA tag\n");
1423                 goto fail;
1424         }
1425
1426         error = bus_dmamem_alloc(ring->tx_desc_tag, &desc, BUS_DMA_WAITOK |
1427             BUS_DMA_COHERENT | BUS_DMA_ZERO, &ring->tx_desc_map);
1428         if (error != 0) {
1429                 device_printf(sc->nfe_dev, "could not create desc DMA map\n");
1430                 goto fail;
1431         }
1432         if (sc->nfe_flags & NFE_40BIT_ADDR)
1433                 ring->desc64 = desc;
1434         else
1435                 ring->desc32 = desc;
1436
1437         ctx.nfe_busaddr = 0;
1438         error = bus_dmamap_load(ring->tx_desc_tag, ring->tx_desc_map, desc,
1439             NFE_TX_RING_COUNT * descsize, nfe_dma_map_segs, &ctx, 0);
1440         if (error != 0) {
1441                 device_printf(sc->nfe_dev, "could not load desc DMA map\n");
1442                 goto fail;
1443         }
1444         ring->physaddr = ctx.nfe_busaddr;
1445
1446         error = bus_dma_tag_create(sc->nfe_parent_tag,
1447             1, 0,
1448             BUS_SPACE_MAXADDR,
1449             BUS_SPACE_MAXADDR,
1450             NULL, NULL,
1451             NFE_TSO_MAXSIZE,
1452             NFE_MAX_SCATTER,
1453             NFE_TSO_MAXSGSIZE,
1454             0,
1455             NULL, NULL,
1456             &ring->tx_data_tag);
1457         if (error != 0) {
1458                 device_printf(sc->nfe_dev, "could not create Tx DMA tag\n");
1459                 goto fail;
1460         }
1461
1462         for (i = 0; i < NFE_TX_RING_COUNT; i++) {
1463                 error = bus_dmamap_create(ring->tx_data_tag, 0,
1464                     &ring->data[i].tx_data_map);
1465                 if (error != 0) {
1466                         device_printf(sc->nfe_dev,
1467                             "could not create Tx DMA map\n");
1468                         goto fail;
1469                 }
1470         }
1471
1472 fail:
1473         return (error);
1474 }
1475
1476
1477 static void
1478 nfe_init_tx_ring(struct nfe_softc *sc, struct nfe_tx_ring *ring)
1479 {
1480         void *desc;
1481         size_t descsize;
1482
1483         sc->nfe_force_tx = 0;
1484         ring->queued = 0;
1485         ring->cur = ring->next = 0;
1486         if (sc->nfe_flags & NFE_40BIT_ADDR) {
1487                 desc = ring->desc64;
1488                 descsize = sizeof (struct nfe_desc64);
1489         } else {
1490                 desc = ring->desc32;
1491                 descsize = sizeof (struct nfe_desc32);
1492         }
1493         bzero(desc, descsize * NFE_TX_RING_COUNT);
1494
1495         bus_dmamap_sync(ring->tx_desc_tag, ring->tx_desc_map,
1496             BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1497 }
1498
1499
1500 static void
1501 nfe_free_tx_ring(struct nfe_softc *sc, struct nfe_tx_ring *ring)
1502 {
1503         struct nfe_tx_data *data;
1504         void *desc;
1505         int i, descsize;
1506
1507         if (sc->nfe_flags & NFE_40BIT_ADDR) {
1508                 desc = ring->desc64;
1509                 descsize = sizeof (struct nfe_desc64);
1510         } else {
1511                 desc = ring->desc32;
1512                 descsize = sizeof (struct nfe_desc32);
1513         }
1514
1515         for (i = 0; i < NFE_TX_RING_COUNT; i++) {
1516                 data = &ring->data[i];
1517
1518                 if (data->m != NULL) {
1519                         bus_dmamap_sync(ring->tx_data_tag, data->tx_data_map,
1520                             BUS_DMASYNC_POSTWRITE);
1521                         bus_dmamap_unload(ring->tx_data_tag, data->tx_data_map);
1522                         m_freem(data->m);
1523                         data->m = NULL;
1524                 }
1525                 if (data->tx_data_map != NULL) {
1526                         bus_dmamap_destroy(ring->tx_data_tag,
1527                             data->tx_data_map);
1528                         data->tx_data_map = NULL;
1529                 }
1530         }
1531
1532         if (ring->tx_data_tag != NULL) {
1533                 bus_dma_tag_destroy(ring->tx_data_tag);
1534                 ring->tx_data_tag = NULL;
1535         }
1536
1537         if (desc != NULL) {
1538                 bus_dmamap_sync(ring->tx_desc_tag, ring->tx_desc_map,
1539                     BUS_DMASYNC_POSTWRITE);
1540                 bus_dmamap_unload(ring->tx_desc_tag, ring->tx_desc_map);
1541                 bus_dmamem_free(ring->tx_desc_tag, desc, ring->tx_desc_map);
1542                 ring->desc64 = NULL;
1543                 ring->desc32 = NULL;
1544                 ring->tx_desc_map = NULL;
1545                 bus_dma_tag_destroy(ring->tx_desc_tag);
1546                 ring->tx_desc_tag = NULL;
1547         }
1548 }
1549
1550 #ifdef DEVICE_POLLING
1551 static poll_handler_t nfe_poll;
1552
1553
1554 static int
1555 nfe_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
1556 {
1557         struct nfe_softc *sc = ifp->if_softc;
1558         uint32_t r;
1559         int rx_npkts = 0;
1560
1561         NFE_LOCK(sc);
1562
1563         if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
1564                 NFE_UNLOCK(sc);
1565                 return (rx_npkts);
1566         }
1567
1568         if (sc->nfe_framesize > MCLBYTES - ETHER_HDR_LEN)
1569                 rx_npkts = nfe_jrxeof(sc, count, &rx_npkts);
1570         else
1571                 rx_npkts = nfe_rxeof(sc, count, &rx_npkts);
1572         nfe_txeof(sc);
1573         if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
1574                 taskqueue_enqueue_fast(sc->nfe_tq, &sc->nfe_tx_task);
1575
1576         if (cmd == POLL_AND_CHECK_STATUS) {
1577                 if ((r = NFE_READ(sc, sc->nfe_irq_status)) == 0) {
1578                         NFE_UNLOCK(sc);
1579                         return (rx_npkts);
1580                 }
1581                 NFE_WRITE(sc, sc->nfe_irq_status, r);
1582
1583                 if (r & NFE_IRQ_LINK) {
1584                         NFE_READ(sc, NFE_PHY_STATUS);
1585                         NFE_WRITE(sc, NFE_PHY_STATUS, 0xf);
1586                         DPRINTF(sc, "link state changed\n");
1587                 }
1588         }
1589         NFE_UNLOCK(sc);
1590         return (rx_npkts);
1591 }
1592 #endif /* DEVICE_POLLING */
1593
1594 static void
1595 nfe_set_intr(struct nfe_softc *sc)
1596 {
1597
1598         if (sc->nfe_msi != 0)
1599                 NFE_WRITE(sc, NFE_IRQ_MASK, NFE_IRQ_WANTED);
1600 }
1601
1602
1603 /* In MSIX, a write to mask reegisters behaves as XOR. */
1604 static __inline void
1605 nfe_enable_intr(struct nfe_softc *sc)
1606 {
1607
1608         if (sc->nfe_msix != 0) {
1609                 /* XXX Should have a better way to enable interrupts! */
1610                 if (NFE_READ(sc, sc->nfe_irq_mask) == 0)
1611                         NFE_WRITE(sc, sc->nfe_irq_mask, sc->nfe_intrs);
1612         } else
1613                 NFE_WRITE(sc, sc->nfe_irq_mask, sc->nfe_intrs);
1614 }
1615
1616
1617 static __inline void
1618 nfe_disable_intr(struct nfe_softc *sc)
1619 {
1620
1621         if (sc->nfe_msix != 0) {
1622                 /* XXX Should have a better way to disable interrupts! */
1623                 if (NFE_READ(sc, sc->nfe_irq_mask) != 0)
1624                         NFE_WRITE(sc, sc->nfe_irq_mask, sc->nfe_nointrs);
1625         } else
1626                 NFE_WRITE(sc, sc->nfe_irq_mask, sc->nfe_nointrs);
1627 }
1628
1629
1630 static int
1631 nfe_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
1632 {
1633         struct nfe_softc *sc;
1634         struct ifreq *ifr;
1635         struct mii_data *mii;
1636         int error, init, mask;
1637
1638         sc = ifp->if_softc;
1639         ifr = (struct ifreq *) data;
1640         error = 0;
1641         init = 0;
1642         switch (cmd) {
1643         case SIOCSIFMTU:
1644                 if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > NFE_JUMBO_MTU)
1645                         error = EINVAL;
1646                 else if (ifp->if_mtu != ifr->ifr_mtu) {
1647                         if ((((sc->nfe_flags & NFE_JUMBO_SUP) == 0) ||
1648                             (sc->nfe_jumbo_disable != 0)) &&
1649                             ifr->ifr_mtu > ETHERMTU)
1650                                 error = EINVAL;
1651                         else {
1652                                 NFE_LOCK(sc);
1653                                 ifp->if_mtu = ifr->ifr_mtu;
1654                                 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
1655                                         nfe_init_locked(sc);
1656                                 NFE_UNLOCK(sc);
1657                         }
1658                 }
1659                 break;
1660         case SIOCSIFFLAGS:
1661                 NFE_LOCK(sc);
1662                 if (ifp->if_flags & IFF_UP) {
1663                         /*
1664                          * If only the PROMISC or ALLMULTI flag changes, then
1665                          * don't do a full re-init of the chip, just update
1666                          * the Rx filter.
1667                          */
1668                         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) &&
1669                             ((ifp->if_flags ^ sc->nfe_if_flags) &
1670                              (IFF_ALLMULTI | IFF_PROMISC)) != 0)
1671                                 nfe_setmulti(sc);
1672                         else
1673                                 nfe_init_locked(sc);
1674                 } else {
1675                         if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1676                                 nfe_stop(ifp);
1677                 }
1678                 sc->nfe_if_flags = ifp->if_flags;
1679                 NFE_UNLOCK(sc);
1680                 error = 0;
1681                 break;
1682         case SIOCADDMULTI:
1683         case SIOCDELMULTI:
1684                 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
1685                         NFE_LOCK(sc);
1686                         nfe_setmulti(sc);
1687                         NFE_UNLOCK(sc);
1688                         error = 0;
1689                 }
1690                 break;
1691         case SIOCSIFMEDIA:
1692         case SIOCGIFMEDIA:
1693                 mii = device_get_softc(sc->nfe_miibus);
1694                 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd);
1695                 break;
1696         case SIOCSIFCAP:
1697                 mask = ifr->ifr_reqcap ^ ifp->if_capenable;
1698 #ifdef DEVICE_POLLING
1699                 if ((mask & IFCAP_POLLING) != 0) {
1700                         if ((ifr->ifr_reqcap & IFCAP_POLLING) != 0) {
1701                                 error = ether_poll_register(nfe_poll, ifp);
1702                                 if (error)
1703                                         break;
1704                                 NFE_LOCK(sc);
1705                                 nfe_disable_intr(sc);
1706                                 ifp->if_capenable |= IFCAP_POLLING;
1707                                 NFE_UNLOCK(sc);
1708                         } else {
1709                                 error = ether_poll_deregister(ifp);
1710                                 /* Enable interrupt even in error case */
1711                                 NFE_LOCK(sc);
1712                                 nfe_enable_intr(sc);
1713                                 ifp->if_capenable &= ~IFCAP_POLLING;
1714                                 NFE_UNLOCK(sc);
1715                         }
1716                 }
1717 #endif /* DEVICE_POLLING */
1718                 if ((sc->nfe_flags & NFE_HW_CSUM) != 0 &&
1719                     (mask & IFCAP_HWCSUM) != 0) {
1720                         ifp->if_capenable ^= IFCAP_HWCSUM;
1721                         if ((IFCAP_TXCSUM & ifp->if_capenable) != 0 &&
1722                             (IFCAP_TXCSUM & ifp->if_capabilities) != 0)
1723                                 ifp->if_hwassist |= NFE_CSUM_FEATURES;
1724                         else
1725                                 ifp->if_hwassist &= ~NFE_CSUM_FEATURES;
1726                         init++;
1727                 }
1728                 if ((sc->nfe_flags & NFE_HW_VLAN) != 0 &&
1729                     (mask & IFCAP_VLAN_HWTAGGING) != 0) {
1730                         ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
1731                         init++;
1732                 }
1733                 /*
1734                  * XXX
1735                  * It seems that VLAN stripping requires Rx checksum offload.
1736                  * Unfortunately FreeBSD has no way to disable only Rx side
1737                  * VLAN stripping. So when we know Rx checksum offload is
1738                  * disabled turn entire hardware VLAN assist off.
1739                  */
1740                 if ((sc->nfe_flags & (NFE_HW_CSUM | NFE_HW_VLAN)) ==
1741                     (NFE_HW_CSUM | NFE_HW_VLAN)) {
1742                         if ((ifp->if_capenable & IFCAP_RXCSUM) == 0)
1743                                 ifp->if_capenable &= ~IFCAP_VLAN_HWTAGGING;
1744                 }
1745
1746                 if ((sc->nfe_flags & NFE_HW_CSUM) != 0 &&
1747                     (mask & IFCAP_TSO4) != 0) {
1748                         ifp->if_capenable ^= IFCAP_TSO4;
1749                         if ((IFCAP_TSO4 & ifp->if_capenable) != 0 &&
1750                             (IFCAP_TSO4 & ifp->if_capabilities) != 0)
1751                                 ifp->if_hwassist |= CSUM_TSO;
1752                         else
1753                                 ifp->if_hwassist &= ~CSUM_TSO;
1754                 }
1755
1756                 if (init > 0 && (ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
1757                         ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
1758                         nfe_init(sc);
1759                 }
1760                 if ((sc->nfe_flags & NFE_HW_VLAN) != 0)
1761                         VLAN_CAPABILITIES(ifp);
1762                 break;
1763         default:
1764                 error = ether_ioctl(ifp, cmd, data);
1765                 break;
1766         }
1767
1768         return (error);
1769 }
1770
1771
1772 static int
1773 nfe_intr(void *arg)
1774 {
1775         struct nfe_softc *sc;
1776         uint32_t status;
1777
1778         sc = (struct nfe_softc *)arg;
1779
1780         status = NFE_READ(sc, sc->nfe_irq_status);
1781         if (status == 0 || status == 0xffffffff)
1782                 return (FILTER_STRAY);
1783         nfe_disable_intr(sc);
1784         taskqueue_enqueue_fast(sc->nfe_tq, &sc->nfe_int_task);
1785
1786         return (FILTER_HANDLED);
1787 }
1788
1789
1790 static void
1791 nfe_int_task(void *arg, int pending)
1792 {
1793         struct nfe_softc *sc = arg;
1794         struct ifnet *ifp = sc->nfe_ifp;
1795         uint32_t r;
1796         int domore;
1797
1798         NFE_LOCK(sc);
1799
1800         if ((r = NFE_READ(sc, sc->nfe_irq_status)) == 0) {
1801                 nfe_enable_intr(sc);
1802                 NFE_UNLOCK(sc);
1803                 return; /* not for us */
1804         }
1805         NFE_WRITE(sc, sc->nfe_irq_status, r);
1806
1807         DPRINTFN(sc, 5, "nfe_intr: interrupt register %x\n", r);
1808
1809 #ifdef DEVICE_POLLING
1810         if (ifp->if_capenable & IFCAP_POLLING) {
1811                 NFE_UNLOCK(sc);
1812                 return;
1813         }
1814 #endif
1815
1816         if (r & NFE_IRQ_LINK) {
1817                 NFE_READ(sc, NFE_PHY_STATUS);
1818                 NFE_WRITE(sc, NFE_PHY_STATUS, 0xf);
1819                 DPRINTF(sc, "link state changed\n");
1820         }
1821
1822         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
1823                 NFE_UNLOCK(sc);
1824                 nfe_enable_intr(sc);
1825                 return;
1826         }
1827
1828         domore = 0;
1829         /* check Rx ring */
1830         if (sc->nfe_framesize > MCLBYTES - ETHER_HDR_LEN)
1831                 domore = nfe_jrxeof(sc, sc->nfe_process_limit, NULL);
1832         else
1833                 domore = nfe_rxeof(sc, sc->nfe_process_limit, NULL);
1834         /* check Tx ring */
1835         nfe_txeof(sc);
1836
1837         if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
1838                 taskqueue_enqueue_fast(sc->nfe_tq, &sc->nfe_tx_task);
1839
1840         NFE_UNLOCK(sc);
1841
1842         if (domore || (NFE_READ(sc, sc->nfe_irq_status) != 0)) {
1843                 taskqueue_enqueue_fast(sc->nfe_tq, &sc->nfe_int_task);
1844                 return;
1845         }
1846
1847         /* Reenable interrupts. */
1848         nfe_enable_intr(sc);
1849 }
1850
1851
1852 static __inline void
1853 nfe_discard_rxbuf(struct nfe_softc *sc, int idx)
1854 {
1855         struct nfe_desc32 *desc32;
1856         struct nfe_desc64 *desc64;
1857         struct nfe_rx_data *data;
1858         struct mbuf *m;
1859
1860         data = &sc->rxq.data[idx];
1861         m = data->m;
1862
1863         if (sc->nfe_flags & NFE_40BIT_ADDR) {
1864                 desc64 = &sc->rxq.desc64[idx];
1865                 /* VLAN packet may have overwritten it. */
1866                 desc64->physaddr[0] = htole32(NFE_ADDR_HI(data->paddr));
1867                 desc64->physaddr[1] = htole32(NFE_ADDR_LO(data->paddr));
1868                 desc64->length = htole16(m->m_len);
1869                 desc64->flags = htole16(NFE_RX_READY);
1870         } else {
1871                 desc32 = &sc->rxq.desc32[idx];
1872                 desc32->length = htole16(m->m_len);
1873                 desc32->flags = htole16(NFE_RX_READY);
1874         }
1875 }
1876
1877
1878 static __inline void
1879 nfe_discard_jrxbuf(struct nfe_softc *sc, int idx)
1880 {
1881         struct nfe_desc32 *desc32;
1882         struct nfe_desc64 *desc64;
1883         struct nfe_rx_data *data;
1884         struct mbuf *m;
1885
1886         data = &sc->jrxq.jdata[idx];
1887         m = data->m;
1888
1889         if (sc->nfe_flags & NFE_40BIT_ADDR) {
1890                 desc64 = &sc->jrxq.jdesc64[idx];
1891                 /* VLAN packet may have overwritten it. */
1892                 desc64->physaddr[0] = htole32(NFE_ADDR_HI(data->paddr));
1893                 desc64->physaddr[1] = htole32(NFE_ADDR_LO(data->paddr));
1894                 desc64->length = htole16(m->m_len);
1895                 desc64->flags = htole16(NFE_RX_READY);
1896         } else {
1897                 desc32 = &sc->jrxq.jdesc32[idx];
1898                 desc32->length = htole16(m->m_len);
1899                 desc32->flags = htole16(NFE_RX_READY);
1900         }
1901 }
1902
1903
1904 static int
1905 nfe_newbuf(struct nfe_softc *sc, int idx)
1906 {
1907         struct nfe_rx_data *data;
1908         struct nfe_desc32 *desc32;
1909         struct nfe_desc64 *desc64;
1910         struct mbuf *m;
1911         bus_dma_segment_t segs[1];
1912         bus_dmamap_t map;
1913         int nsegs;
1914
1915         m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
1916         if (m == NULL)
1917                 return (ENOBUFS);
1918
1919         m->m_len = m->m_pkthdr.len = MCLBYTES;
1920         m_adj(m, ETHER_ALIGN);
1921
1922         if (bus_dmamap_load_mbuf_sg(sc->rxq.rx_data_tag, sc->rxq.rx_spare_map,
1923             m, segs, &nsegs, BUS_DMA_NOWAIT) != 0) {
1924                 m_freem(m);
1925                 return (ENOBUFS);
1926         }
1927         KASSERT(nsegs == 1, ("%s: %d segments returned!", __func__, nsegs));
1928
1929         data = &sc->rxq.data[idx];
1930         if (data->m != NULL) {
1931                 bus_dmamap_sync(sc->rxq.rx_data_tag, data->rx_data_map,
1932                     BUS_DMASYNC_POSTREAD);
1933                 bus_dmamap_unload(sc->rxq.rx_data_tag, data->rx_data_map);
1934         }
1935         map = data->rx_data_map;
1936         data->rx_data_map = sc->rxq.rx_spare_map;
1937         sc->rxq.rx_spare_map = map;
1938         bus_dmamap_sync(sc->rxq.rx_data_tag, data->rx_data_map,
1939             BUS_DMASYNC_PREREAD);
1940         data->paddr = segs[0].ds_addr;
1941         data->m = m;
1942         /* update mapping address in h/w descriptor */
1943         if (sc->nfe_flags & NFE_40BIT_ADDR) {
1944                 desc64 = &sc->rxq.desc64[idx];
1945                 desc64->physaddr[0] = htole32(NFE_ADDR_HI(segs[0].ds_addr));
1946                 desc64->physaddr[1] = htole32(NFE_ADDR_LO(segs[0].ds_addr));
1947                 desc64->length = htole16(segs[0].ds_len);
1948                 desc64->flags = htole16(NFE_RX_READY);
1949         } else {
1950                 desc32 = &sc->rxq.desc32[idx];
1951                 desc32->physaddr = htole32(NFE_ADDR_LO(segs[0].ds_addr));
1952                 desc32->length = htole16(segs[0].ds_len);
1953                 desc32->flags = htole16(NFE_RX_READY);
1954         }
1955
1956         return (0);
1957 }
1958
1959
1960 static int
1961 nfe_jnewbuf(struct nfe_softc *sc, int idx)
1962 {
1963         struct nfe_rx_data *data;
1964         struct nfe_desc32 *desc32;
1965         struct nfe_desc64 *desc64;
1966         struct mbuf *m;
1967         bus_dma_segment_t segs[1];
1968         bus_dmamap_t map;
1969         int nsegs;
1970
1971         m = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, MJUM9BYTES);
1972         if (m == NULL)
1973                 return (ENOBUFS);
1974         if ((m->m_flags & M_EXT) == 0) {
1975                 m_freem(m);
1976                 return (ENOBUFS);
1977         }
1978         m->m_pkthdr.len = m->m_len = MJUM9BYTES;
1979         m_adj(m, ETHER_ALIGN);
1980
1981         if (bus_dmamap_load_mbuf_sg(sc->jrxq.jrx_data_tag,
1982             sc->jrxq.jrx_spare_map, m, segs, &nsegs, BUS_DMA_NOWAIT) != 0) {
1983                 m_freem(m);
1984                 return (ENOBUFS);
1985         }
1986         KASSERT(nsegs == 1, ("%s: %d segments returned!", __func__, nsegs));
1987
1988         data = &sc->jrxq.jdata[idx];
1989         if (data->m != NULL) {
1990                 bus_dmamap_sync(sc->jrxq.jrx_data_tag, data->rx_data_map,
1991                     BUS_DMASYNC_POSTREAD);
1992                 bus_dmamap_unload(sc->jrxq.jrx_data_tag, data->rx_data_map);
1993         }
1994         map = data->rx_data_map;
1995         data->rx_data_map = sc->jrxq.jrx_spare_map;
1996         sc->jrxq.jrx_spare_map = map;
1997         bus_dmamap_sync(sc->jrxq.jrx_data_tag, data->rx_data_map,
1998             BUS_DMASYNC_PREREAD);
1999         data->paddr = segs[0].ds_addr;
2000         data->m = m;
2001         /* update mapping address in h/w descriptor */
2002         if (sc->nfe_flags & NFE_40BIT_ADDR) {
2003                 desc64 = &sc->jrxq.jdesc64[idx];
2004                 desc64->physaddr[0] = htole32(NFE_ADDR_HI(segs[0].ds_addr));
2005                 desc64->physaddr[1] = htole32(NFE_ADDR_LO(segs[0].ds_addr));
2006                 desc64->length = htole16(segs[0].ds_len);
2007                 desc64->flags = htole16(NFE_RX_READY);
2008         } else {
2009                 desc32 = &sc->jrxq.jdesc32[idx];
2010                 desc32->physaddr = htole32(NFE_ADDR_LO(segs[0].ds_addr));
2011                 desc32->length = htole16(segs[0].ds_len);
2012                 desc32->flags = htole16(NFE_RX_READY);
2013         }
2014
2015         return (0);
2016 }
2017
2018
2019 static int
2020 nfe_rxeof(struct nfe_softc *sc, int count, int *rx_npktsp)
2021 {
2022         struct ifnet *ifp = sc->nfe_ifp;
2023         struct nfe_desc32 *desc32;
2024         struct nfe_desc64 *desc64;
2025         struct nfe_rx_data *data;
2026         struct mbuf *m;
2027         uint16_t flags;
2028         int len, prog, rx_npkts;
2029         uint32_t vtag = 0;
2030
2031         rx_npkts = 0;
2032         NFE_LOCK_ASSERT(sc);
2033
2034         bus_dmamap_sync(sc->rxq.rx_desc_tag, sc->rxq.rx_desc_map,
2035             BUS_DMASYNC_POSTREAD);
2036
2037         for (prog = 0;;NFE_INC(sc->rxq.cur, NFE_RX_RING_COUNT), vtag = 0) {
2038                 if (count <= 0)
2039                         break;
2040                 count--;
2041
2042                 data = &sc->rxq.data[sc->rxq.cur];
2043
2044                 if (sc->nfe_flags & NFE_40BIT_ADDR) {
2045                         desc64 = &sc->rxq.desc64[sc->rxq.cur];
2046                         vtag = le32toh(desc64->physaddr[1]);
2047                         flags = le16toh(desc64->flags);
2048                         len = le16toh(desc64->length) & NFE_RX_LEN_MASK;
2049                 } else {
2050                         desc32 = &sc->rxq.desc32[sc->rxq.cur];
2051                         flags = le16toh(desc32->flags);
2052                         len = le16toh(desc32->length) & NFE_RX_LEN_MASK;
2053                 }
2054
2055                 if (flags & NFE_RX_READY)
2056                         break;
2057                 prog++;
2058                 if ((sc->nfe_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) {
2059                         if (!(flags & NFE_RX_VALID_V1)) {
2060                                 ifp->if_ierrors++;
2061                                 nfe_discard_rxbuf(sc, sc->rxq.cur);
2062                                 continue;
2063                         }
2064                         if ((flags & NFE_RX_FIXME_V1) == NFE_RX_FIXME_V1) {
2065                                 flags &= ~NFE_RX_ERROR;
2066                                 len--;  /* fix buffer length */
2067                         }
2068                 } else {
2069                         if (!(flags & NFE_RX_VALID_V2)) {
2070                                 ifp->if_ierrors++;
2071                                 nfe_discard_rxbuf(sc, sc->rxq.cur);
2072                                 continue;
2073                         }
2074
2075                         if ((flags & NFE_RX_FIXME_V2) == NFE_RX_FIXME_V2) {
2076                                 flags &= ~NFE_RX_ERROR;
2077                                 len--;  /* fix buffer length */
2078                         }
2079                 }
2080
2081                 if (flags & NFE_RX_ERROR) {
2082                         ifp->if_ierrors++;
2083                         nfe_discard_rxbuf(sc, sc->rxq.cur);
2084                         continue;
2085                 }
2086
2087                 m = data->m;
2088                 if (nfe_newbuf(sc, sc->rxq.cur) != 0) {
2089                         ifp->if_iqdrops++;
2090                         nfe_discard_rxbuf(sc, sc->rxq.cur);
2091                         continue;
2092                 }
2093
2094                 if ((vtag & NFE_RX_VTAG) != 0 &&
2095                     (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) {
2096                         m->m_pkthdr.ether_vtag = vtag & 0xffff;
2097                         m->m_flags |= M_VLANTAG;
2098                 }
2099
2100                 m->m_pkthdr.len = m->m_len = len;
2101                 m->m_pkthdr.rcvif = ifp;
2102
2103                 if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) {
2104                         if ((flags & NFE_RX_IP_CSUMOK) != 0) {
2105                                 m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
2106                                 m->m_pkthdr.csum_flags |= CSUM_IP_VALID;
2107                                 if ((flags & NFE_RX_TCP_CSUMOK) != 0 ||
2108                                     (flags & NFE_RX_UDP_CSUMOK) != 0) {
2109                                         m->m_pkthdr.csum_flags |=
2110                                             CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
2111                                         m->m_pkthdr.csum_data = 0xffff;
2112                                 }
2113                         }
2114                 }
2115
2116                 ifp->if_ipackets++;
2117
2118                 NFE_UNLOCK(sc);
2119                 (*ifp->if_input)(ifp, m);
2120                 NFE_LOCK(sc);
2121                 rx_npkts++;
2122         }
2123
2124         if (prog > 0)
2125                 bus_dmamap_sync(sc->rxq.rx_desc_tag, sc->rxq.rx_desc_map,
2126                     BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2127
2128         if (rx_npktsp != NULL)
2129                 *rx_npktsp = rx_npkts;
2130         return (count > 0 ? 0 : EAGAIN);
2131 }
2132
2133
2134 static int
2135 nfe_jrxeof(struct nfe_softc *sc, int count, int *rx_npktsp)
2136 {
2137         struct ifnet *ifp = sc->nfe_ifp;
2138         struct nfe_desc32 *desc32;
2139         struct nfe_desc64 *desc64;
2140         struct nfe_rx_data *data;
2141         struct mbuf *m;
2142         uint16_t flags;
2143         int len, prog, rx_npkts;
2144         uint32_t vtag = 0;
2145
2146         rx_npkts = 0;
2147         NFE_LOCK_ASSERT(sc);
2148
2149         bus_dmamap_sync(sc->jrxq.jrx_desc_tag, sc->jrxq.jrx_desc_map,
2150             BUS_DMASYNC_POSTREAD);
2151
2152         for (prog = 0;;NFE_INC(sc->jrxq.jcur, NFE_JUMBO_RX_RING_COUNT),
2153             vtag = 0) {
2154                 if (count <= 0)
2155                         break;
2156                 count--;
2157
2158                 data = &sc->jrxq.jdata[sc->jrxq.jcur];
2159
2160                 if (sc->nfe_flags & NFE_40BIT_ADDR) {
2161                         desc64 = &sc->jrxq.jdesc64[sc->jrxq.jcur];
2162                         vtag = le32toh(desc64->physaddr[1]);
2163                         flags = le16toh(desc64->flags);
2164                         len = le16toh(desc64->length) & NFE_RX_LEN_MASK;
2165                 } else {
2166                         desc32 = &sc->jrxq.jdesc32[sc->jrxq.jcur];
2167                         flags = le16toh(desc32->flags);
2168                         len = le16toh(desc32->length) & NFE_RX_LEN_MASK;
2169                 }
2170
2171                 if (flags & NFE_RX_READY)
2172                         break;
2173                 prog++;
2174                 if ((sc->nfe_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) {
2175                         if (!(flags & NFE_RX_VALID_V1)) {
2176                                 ifp->if_ierrors++;
2177                                 nfe_discard_jrxbuf(sc, sc->jrxq.jcur);
2178                                 continue;
2179                         }
2180                         if ((flags & NFE_RX_FIXME_V1) == NFE_RX_FIXME_V1) {
2181                                 flags &= ~NFE_RX_ERROR;
2182                                 len--;  /* fix buffer length */
2183                         }
2184                 } else {
2185                         if (!(flags & NFE_RX_VALID_V2)) {
2186                                 ifp->if_ierrors++;
2187                                 nfe_discard_jrxbuf(sc, sc->jrxq.jcur);
2188                                 continue;
2189                         }
2190
2191                         if ((flags & NFE_RX_FIXME_V2) == NFE_RX_FIXME_V2) {
2192                                 flags &= ~NFE_RX_ERROR;
2193                                 len--;  /* fix buffer length */
2194                         }
2195                 }
2196
2197                 if (flags & NFE_RX_ERROR) {
2198                         ifp->if_ierrors++;
2199                         nfe_discard_jrxbuf(sc, sc->jrxq.jcur);
2200                         continue;
2201                 }
2202
2203                 m = data->m;
2204                 if (nfe_jnewbuf(sc, sc->jrxq.jcur) != 0) {
2205                         ifp->if_iqdrops++;
2206                         nfe_discard_jrxbuf(sc, sc->jrxq.jcur);
2207                         continue;
2208                 }
2209
2210                 if ((vtag & NFE_RX_VTAG) != 0 &&
2211                     (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) {
2212                         m->m_pkthdr.ether_vtag = vtag & 0xffff;
2213                         m->m_flags |= M_VLANTAG;
2214                 }
2215
2216                 m->m_pkthdr.len = m->m_len = len;
2217                 m->m_pkthdr.rcvif = ifp;
2218
2219                 if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) {
2220                         if ((flags & NFE_RX_IP_CSUMOK) != 0) {
2221                                 m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
2222                                 m->m_pkthdr.csum_flags |= CSUM_IP_VALID;
2223                                 if ((flags & NFE_RX_TCP_CSUMOK) != 0 ||
2224                                     (flags & NFE_RX_UDP_CSUMOK) != 0) {
2225                                         m->m_pkthdr.csum_flags |=
2226                                             CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
2227                                         m->m_pkthdr.csum_data = 0xffff;
2228                                 }
2229                         }
2230                 }
2231
2232                 ifp->if_ipackets++;
2233
2234                 NFE_UNLOCK(sc);
2235                 (*ifp->if_input)(ifp, m);
2236                 NFE_LOCK(sc);
2237                 rx_npkts++;
2238         }
2239
2240         if (prog > 0)
2241                 bus_dmamap_sync(sc->jrxq.jrx_desc_tag, sc->jrxq.jrx_desc_map,
2242                     BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2243
2244         if (rx_npktsp != NULL)
2245                 *rx_npktsp = rx_npkts;
2246         return (count > 0 ? 0 : EAGAIN);
2247 }
2248
2249
2250 static void
2251 nfe_txeof(struct nfe_softc *sc)
2252 {
2253         struct ifnet *ifp = sc->nfe_ifp;
2254         struct nfe_desc32 *desc32;
2255         struct nfe_desc64 *desc64;
2256         struct nfe_tx_data *data = NULL;
2257         uint16_t flags;
2258         int cons, prog;
2259
2260         NFE_LOCK_ASSERT(sc);
2261
2262         bus_dmamap_sync(sc->txq.tx_desc_tag, sc->txq.tx_desc_map,
2263             BUS_DMASYNC_POSTREAD);
2264
2265         prog = 0;
2266         for (cons = sc->txq.next; cons != sc->txq.cur;
2267             NFE_INC(cons, NFE_TX_RING_COUNT)) {
2268                 if (sc->nfe_flags & NFE_40BIT_ADDR) {
2269                         desc64 = &sc->txq.desc64[cons];
2270                         flags = le16toh(desc64->flags);
2271                 } else {
2272                         desc32 = &sc->txq.desc32[cons];
2273                         flags = le16toh(desc32->flags);
2274                 }
2275
2276                 if (flags & NFE_TX_VALID)
2277                         break;
2278
2279                 prog++;
2280                 sc->txq.queued--;
2281                 data = &sc->txq.data[cons];
2282
2283                 if ((sc->nfe_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) {
2284                         if ((flags & NFE_TX_LASTFRAG_V1) == 0)
2285                                 continue;
2286                         if ((flags & NFE_TX_ERROR_V1) != 0) {
2287                                 device_printf(sc->nfe_dev,
2288                                     "tx v1 error 0x%4b\n", flags, NFE_V1_TXERR);
2289
2290                                 ifp->if_oerrors++;
2291                         } else
2292                                 ifp->if_opackets++;
2293                 } else {
2294                         if ((flags & NFE_TX_LASTFRAG_V2) == 0)
2295                                 continue;
2296                         if ((flags & NFE_TX_ERROR_V2) != 0) {
2297                                 device_printf(sc->nfe_dev,
2298                                     "tx v2 error 0x%4b\n", flags, NFE_V2_TXERR);
2299                                 ifp->if_oerrors++;
2300                         } else
2301                                 ifp->if_opackets++;
2302                 }
2303
2304                 /* last fragment of the mbuf chain transmitted */
2305                 KASSERT(data->m != NULL, ("%s: freeing NULL mbuf!", __func__));
2306                 bus_dmamap_sync(sc->txq.tx_data_tag, data->tx_data_map,
2307                     BUS_DMASYNC_POSTWRITE);
2308                 bus_dmamap_unload(sc->txq.tx_data_tag, data->tx_data_map);
2309                 m_freem(data->m);
2310                 data->m = NULL;
2311         }
2312
2313         if (prog > 0) {
2314                 sc->nfe_force_tx = 0;
2315                 sc->txq.next = cons;
2316                 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
2317                 if (sc->txq.queued == 0)
2318                         sc->nfe_watchdog_timer = 0;
2319         }
2320 }
2321
2322 static int
2323 nfe_encap(struct nfe_softc *sc, struct mbuf **m_head)
2324 {
2325         struct nfe_desc32 *desc32 = NULL;
2326         struct nfe_desc64 *desc64 = NULL;
2327         bus_dmamap_t map;
2328         bus_dma_segment_t segs[NFE_MAX_SCATTER];
2329         int error, i, nsegs, prod, si;
2330         uint32_t tso_segsz;
2331         uint16_t cflags, flags;
2332         struct mbuf *m;
2333
2334         prod = si = sc->txq.cur;
2335         map = sc->txq.data[prod].tx_data_map;
2336
2337         error = bus_dmamap_load_mbuf_sg(sc->txq.tx_data_tag, map, *m_head, segs,
2338             &nsegs, BUS_DMA_NOWAIT);
2339         if (error == EFBIG) {
2340                 m = m_collapse(*m_head, M_DONTWAIT, NFE_MAX_SCATTER);
2341                 if (m == NULL) {
2342                         m_freem(*m_head);
2343                         *m_head = NULL;
2344                         return (ENOBUFS);
2345                 }
2346                 *m_head = m;
2347                 error = bus_dmamap_load_mbuf_sg(sc->txq.tx_data_tag, map,
2348                     *m_head, segs, &nsegs, BUS_DMA_NOWAIT);
2349                 if (error != 0) {
2350                         m_freem(*m_head);
2351                         *m_head = NULL;
2352                         return (ENOBUFS);
2353                 }
2354         } else if (error != 0)
2355                 return (error);
2356         if (nsegs == 0) {
2357                 m_freem(*m_head);
2358                 *m_head = NULL;
2359                 return (EIO);
2360         }
2361
2362         if (sc->txq.queued + nsegs >= NFE_TX_RING_COUNT - 2) {
2363                 bus_dmamap_unload(sc->txq.tx_data_tag, map);
2364                 return (ENOBUFS);
2365         }
2366
2367         m = *m_head;
2368         cflags = flags = 0;
2369         tso_segsz = 0;
2370         if ((m->m_pkthdr.csum_flags & CSUM_TSO) != 0) {
2371                 tso_segsz = (uint32_t)m->m_pkthdr.tso_segsz <<
2372                     NFE_TX_TSO_SHIFT;
2373                 cflags &= ~(NFE_TX_IP_CSUM | NFE_TX_TCP_UDP_CSUM);
2374                 cflags |= NFE_TX_TSO;
2375         } else if ((m->m_pkthdr.csum_flags & NFE_CSUM_FEATURES) != 0) {
2376                 if ((m->m_pkthdr.csum_flags & CSUM_IP) != 0)
2377                         cflags |= NFE_TX_IP_CSUM;
2378                 if ((m->m_pkthdr.csum_flags & CSUM_TCP) != 0)
2379                         cflags |= NFE_TX_TCP_UDP_CSUM;
2380                 if ((m->m_pkthdr.csum_flags & CSUM_UDP) != 0)
2381                         cflags |= NFE_TX_TCP_UDP_CSUM;
2382         }
2383
2384         for (i = 0; i < nsegs; i++) {
2385                 if (sc->nfe_flags & NFE_40BIT_ADDR) {
2386                         desc64 = &sc->txq.desc64[prod];
2387                         desc64->physaddr[0] =
2388                             htole32(NFE_ADDR_HI(segs[i].ds_addr));
2389                         desc64->physaddr[1] =
2390                             htole32(NFE_ADDR_LO(segs[i].ds_addr));
2391                         desc64->vtag = 0;
2392                         desc64->length = htole16(segs[i].ds_len - 1);
2393                         desc64->flags = htole16(flags);
2394                 } else {
2395                         desc32 = &sc->txq.desc32[prod];
2396                         desc32->physaddr =
2397                             htole32(NFE_ADDR_LO(segs[i].ds_addr));
2398                         desc32->length = htole16(segs[i].ds_len - 1);
2399                         desc32->flags = htole16(flags);
2400                 }
2401
2402                 /*
2403                  * Setting of the valid bit in the first descriptor is
2404                  * deferred until the whole chain is fully setup.
2405                  */
2406                 flags |= NFE_TX_VALID;
2407
2408                 sc->txq.queued++;
2409                 NFE_INC(prod, NFE_TX_RING_COUNT);
2410         }
2411
2412         /*
2413          * the whole mbuf chain has been DMA mapped, fix last/first descriptor.
2414          * csum flags, vtag and TSO belong to the first fragment only.
2415          */
2416         if (sc->nfe_flags & NFE_40BIT_ADDR) {
2417                 desc64->flags |= htole16(NFE_TX_LASTFRAG_V2);
2418                 desc64 = &sc->txq.desc64[si];
2419                 if ((m->m_flags & M_VLANTAG) != 0)
2420                         desc64->vtag = htole32(NFE_TX_VTAG |
2421                             m->m_pkthdr.ether_vtag);
2422                 if (tso_segsz != 0) {
2423                         /*
2424                          * XXX
2425                          * The following indicates the descriptor element
2426                          * is a 32bit quantity.
2427                          */
2428                         desc64->length |= htole16((uint16_t)tso_segsz);
2429                         desc64->flags |= htole16(tso_segsz >> 16);
2430                 }
2431                 /*
2432                  * finally, set the valid/checksum/TSO bit in the first
2433                  * descriptor.
2434                  */
2435                 desc64->flags |= htole16(NFE_TX_VALID | cflags);
2436         } else {
2437                 if (sc->nfe_flags & NFE_JUMBO_SUP)
2438                         desc32->flags |= htole16(NFE_TX_LASTFRAG_V2);
2439                 else
2440                         desc32->flags |= htole16(NFE_TX_LASTFRAG_V1);
2441                 desc32 = &sc->txq.desc32[si];
2442                 if (tso_segsz != 0) {
2443                         /*
2444                          * XXX
2445                          * The following indicates the descriptor element
2446                          * is a 32bit quantity.
2447                          */
2448                         desc32->length |= htole16((uint16_t)tso_segsz);
2449                         desc32->flags |= htole16(tso_segsz >> 16);
2450                 }
2451                 /*
2452                  * finally, set the valid/checksum/TSO bit in the first
2453                  * descriptor.
2454                  */
2455                 desc32->flags |= htole16(NFE_TX_VALID | cflags);
2456         }
2457
2458         sc->txq.cur = prod;
2459         prod = (prod + NFE_TX_RING_COUNT - 1) % NFE_TX_RING_COUNT;
2460         sc->txq.data[si].tx_data_map = sc->txq.data[prod].tx_data_map;
2461         sc->txq.data[prod].tx_data_map = map;
2462         sc->txq.data[prod].m = m;
2463
2464         bus_dmamap_sync(sc->txq.tx_data_tag, map, BUS_DMASYNC_PREWRITE);
2465
2466         return (0);
2467 }
2468
2469
2470 static void
2471 nfe_setmulti(struct nfe_softc *sc)
2472 {
2473         struct ifnet *ifp = sc->nfe_ifp;
2474         struct ifmultiaddr *ifma;
2475         int i;
2476         uint32_t filter;
2477         uint8_t addr[ETHER_ADDR_LEN], mask[ETHER_ADDR_LEN];
2478         uint8_t etherbroadcastaddr[ETHER_ADDR_LEN] = {
2479                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
2480         };
2481
2482         NFE_LOCK_ASSERT(sc);
2483
2484         if ((ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC)) != 0) {
2485                 bzero(addr, ETHER_ADDR_LEN);
2486                 bzero(mask, ETHER_ADDR_LEN);
2487                 goto done;
2488         }
2489
2490         bcopy(etherbroadcastaddr, addr, ETHER_ADDR_LEN);
2491         bcopy(etherbroadcastaddr, mask, ETHER_ADDR_LEN);
2492
2493         if_maddr_rlock(ifp);
2494         TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
2495                 u_char *addrp;
2496
2497                 if (ifma->ifma_addr->sa_family != AF_LINK)
2498                         continue;
2499
2500                 addrp = LLADDR((struct sockaddr_dl *) ifma->ifma_addr);
2501                 for (i = 0; i < ETHER_ADDR_LEN; i++) {
2502                         u_int8_t mcaddr = addrp[i];
2503                         addr[i] &= mcaddr;
2504                         mask[i] &= ~mcaddr;
2505                 }
2506         }
2507         if_maddr_runlock(ifp);
2508
2509         for (i = 0; i < ETHER_ADDR_LEN; i++) {
2510                 mask[i] |= addr[i];
2511         }
2512
2513 done:
2514         addr[0] |= 0x01;        /* make sure multicast bit is set */
2515
2516         NFE_WRITE(sc, NFE_MULTIADDR_HI,
2517             addr[3] << 24 | addr[2] << 16 | addr[1] << 8 | addr[0]);
2518         NFE_WRITE(sc, NFE_MULTIADDR_LO,
2519             addr[5] <<  8 | addr[4]);
2520         NFE_WRITE(sc, NFE_MULTIMASK_HI,
2521             mask[3] << 24 | mask[2] << 16 | mask[1] << 8 | mask[0]);
2522         NFE_WRITE(sc, NFE_MULTIMASK_LO,
2523             mask[5] <<  8 | mask[4]);
2524
2525         filter = NFE_READ(sc, NFE_RXFILTER);
2526         filter &= NFE_PFF_RX_PAUSE;
2527         filter |= NFE_RXFILTER_MAGIC;
2528         filter |= (ifp->if_flags & IFF_PROMISC) ? NFE_PFF_PROMISC : NFE_PFF_U2M;
2529         NFE_WRITE(sc, NFE_RXFILTER, filter);
2530 }
2531
2532
2533 static void
2534 nfe_tx_task(void *arg, int pending)
2535 {
2536         struct ifnet *ifp;
2537
2538         ifp = (struct ifnet *)arg;
2539         nfe_start(ifp);
2540 }
2541
2542
2543 static void
2544 nfe_start(struct ifnet *ifp)
2545 {
2546         struct nfe_softc *sc = ifp->if_softc;
2547         struct mbuf *m0;
2548         int enq;
2549
2550         NFE_LOCK(sc);
2551
2552         if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
2553             IFF_DRV_RUNNING || sc->nfe_link == 0) {
2554                 NFE_UNLOCK(sc);
2555                 return;
2556         }
2557
2558         for (enq = 0; !IFQ_DRV_IS_EMPTY(&ifp->if_snd);) {
2559                 IFQ_DRV_DEQUEUE(&ifp->if_snd, m0);
2560                 if (m0 == NULL)
2561                         break;
2562
2563                 if (nfe_encap(sc, &m0) != 0) {
2564                         if (m0 == NULL)
2565                                 break;
2566                         IFQ_DRV_PREPEND(&ifp->if_snd, m0);
2567                         ifp->if_drv_flags |= IFF_DRV_OACTIVE;
2568                         break;
2569                 }
2570                 enq++;
2571                 ETHER_BPF_MTAP(ifp, m0);
2572         }
2573
2574         if (enq > 0) {
2575                 bus_dmamap_sync(sc->txq.tx_desc_tag, sc->txq.tx_desc_map,
2576                     BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2577
2578                 /* kick Tx */
2579                 NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_KICKTX | sc->rxtxctl);
2580
2581                 /*
2582                  * Set a timeout in case the chip goes out to lunch.
2583                  */
2584                 sc->nfe_watchdog_timer = 5;
2585         }
2586
2587         NFE_UNLOCK(sc);
2588 }
2589
2590
2591 static void
2592 nfe_watchdog(struct ifnet *ifp)
2593 {
2594         struct nfe_softc *sc = ifp->if_softc;
2595
2596         if (sc->nfe_watchdog_timer == 0 || --sc->nfe_watchdog_timer)
2597                 return;
2598
2599         /* Check if we've lost Tx completion interrupt. */
2600         nfe_txeof(sc);
2601         if (sc->txq.queued == 0) {
2602                 if_printf(ifp, "watchdog timeout (missed Tx interrupts) "
2603                     "-- recovering\n");
2604                 if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
2605                         taskqueue_enqueue_fast(sc->nfe_tq, &sc->nfe_tx_task);
2606                 return;
2607         }
2608         /* Check if we've lost start Tx command. */
2609         sc->nfe_force_tx++;
2610         if (sc->nfe_force_tx <= 3) {
2611                 /*
2612                  * If this is the case for watchdog timeout, the following
2613                  * code should go to nfe_txeof().
2614                  */
2615                 NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_KICKTX | sc->rxtxctl);
2616                 return;
2617         }
2618         sc->nfe_force_tx = 0;
2619
2620         if_printf(ifp, "watchdog timeout\n");
2621
2622         ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
2623         ifp->if_oerrors++;
2624         nfe_init_locked(sc);
2625 }
2626
2627
2628 static void
2629 nfe_init(void *xsc)
2630 {
2631         struct nfe_softc *sc = xsc;
2632
2633         NFE_LOCK(sc);
2634         nfe_init_locked(sc);
2635         NFE_UNLOCK(sc);
2636 }
2637
2638
2639 static void
2640 nfe_init_locked(void *xsc)
2641 {
2642         struct nfe_softc *sc = xsc;
2643         struct ifnet *ifp = sc->nfe_ifp;
2644         struct mii_data *mii;
2645         uint32_t val;
2646         int error;
2647
2648         NFE_LOCK_ASSERT(sc);
2649
2650         mii = device_get_softc(sc->nfe_miibus);
2651
2652         if (ifp->if_drv_flags & IFF_DRV_RUNNING)
2653                 return;
2654
2655         nfe_stop(ifp);
2656
2657         sc->nfe_framesize = ifp->if_mtu + NFE_RX_HEADERS;
2658
2659         nfe_init_tx_ring(sc, &sc->txq);
2660         if (sc->nfe_framesize > (MCLBYTES - ETHER_HDR_LEN))
2661                 error = nfe_init_jrx_ring(sc, &sc->jrxq);
2662         else
2663                 error = nfe_init_rx_ring(sc, &sc->rxq);
2664         if (error != 0) {
2665                 device_printf(sc->nfe_dev,
2666                     "initialization failed: no memory for rx buffers\n");
2667                 nfe_stop(ifp);
2668                 return;
2669         }
2670
2671         val = 0;
2672         if ((sc->nfe_flags & NFE_CORRECT_MACADDR) != 0)
2673                 val |= NFE_MAC_ADDR_INORDER;
2674         NFE_WRITE(sc, NFE_TX_UNK, val);
2675         NFE_WRITE(sc, NFE_STATUS, 0);
2676
2677         if ((sc->nfe_flags & NFE_TX_FLOW_CTRL) != 0)
2678                 NFE_WRITE(sc, NFE_TX_PAUSE_FRAME, NFE_TX_PAUSE_FRAME_DISABLE);
2679
2680         sc->rxtxctl = NFE_RXTX_BIT2;
2681         if (sc->nfe_flags & NFE_40BIT_ADDR)
2682                 sc->rxtxctl |= NFE_RXTX_V3MAGIC;
2683         else if (sc->nfe_flags & NFE_JUMBO_SUP)
2684                 sc->rxtxctl |= NFE_RXTX_V2MAGIC;
2685
2686         if ((ifp->if_capenable & IFCAP_RXCSUM) != 0)
2687                 sc->rxtxctl |= NFE_RXTX_RXCSUM;
2688         if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0)
2689                 sc->rxtxctl |= NFE_RXTX_VTAG_INSERT | NFE_RXTX_VTAG_STRIP;
2690
2691         NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_RESET | sc->rxtxctl);
2692         DELAY(10);
2693         NFE_WRITE(sc, NFE_RXTX_CTL, sc->rxtxctl);
2694
2695         if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0)
2696                 NFE_WRITE(sc, NFE_VTAG_CTL, NFE_VTAG_ENABLE);
2697         else
2698                 NFE_WRITE(sc, NFE_VTAG_CTL, 0);
2699
2700         NFE_WRITE(sc, NFE_SETUP_R6, 0);
2701
2702         /* set MAC address */
2703         nfe_set_macaddr(sc, IF_LLADDR(ifp));
2704
2705         /* tell MAC where rings are in memory */
2706         if (sc->nfe_framesize > MCLBYTES - ETHER_HDR_LEN) {
2707                 NFE_WRITE(sc, NFE_RX_RING_ADDR_HI,
2708                     NFE_ADDR_HI(sc->jrxq.jphysaddr));
2709                 NFE_WRITE(sc, NFE_RX_RING_ADDR_LO,
2710                     NFE_ADDR_LO(sc->jrxq.jphysaddr));
2711         } else {
2712                 NFE_WRITE(sc, NFE_RX_RING_ADDR_HI,
2713                     NFE_ADDR_HI(sc->rxq.physaddr));
2714                 NFE_WRITE(sc, NFE_RX_RING_ADDR_LO,
2715                     NFE_ADDR_LO(sc->rxq.physaddr));
2716         }
2717         NFE_WRITE(sc, NFE_TX_RING_ADDR_HI, NFE_ADDR_HI(sc->txq.physaddr));
2718         NFE_WRITE(sc, NFE_TX_RING_ADDR_LO, NFE_ADDR_LO(sc->txq.physaddr));
2719
2720         NFE_WRITE(sc, NFE_RING_SIZE,
2721             (NFE_RX_RING_COUNT - 1) << 16 |
2722             (NFE_TX_RING_COUNT - 1));
2723
2724         NFE_WRITE(sc, NFE_RXBUFSZ, sc->nfe_framesize);
2725
2726         /* force MAC to wakeup */
2727         val = NFE_READ(sc, NFE_PWR_STATE);
2728         if ((val & NFE_PWR_WAKEUP) == 0)
2729                 NFE_WRITE(sc, NFE_PWR_STATE, val | NFE_PWR_WAKEUP);
2730         DELAY(10);
2731         val = NFE_READ(sc, NFE_PWR_STATE);
2732         NFE_WRITE(sc, NFE_PWR_STATE, val | NFE_PWR_VALID);
2733
2734 #if 1
2735         /* configure interrupts coalescing/mitigation */
2736         NFE_WRITE(sc, NFE_IMTIMER, NFE_IM_DEFAULT);
2737 #else
2738         /* no interrupt mitigation: one interrupt per packet */
2739         NFE_WRITE(sc, NFE_IMTIMER, 970);
2740 #endif
2741
2742         NFE_WRITE(sc, NFE_SETUP_R1, NFE_R1_MAGIC_10_100);
2743         NFE_WRITE(sc, NFE_SETUP_R2, NFE_R2_MAGIC);
2744         NFE_WRITE(sc, NFE_SETUP_R6, NFE_R6_MAGIC);
2745
2746         /* update MAC knowledge of PHY; generates a NFE_IRQ_LINK interrupt */
2747         NFE_WRITE(sc, NFE_STATUS, sc->mii_phyaddr << 24 | NFE_STATUS_MAGIC);
2748
2749         NFE_WRITE(sc, NFE_SETUP_R4, NFE_R4_MAGIC);
2750         NFE_WRITE(sc, NFE_WOL_CTL, NFE_WOL_MAGIC);
2751
2752         sc->rxtxctl &= ~NFE_RXTX_BIT2;
2753         NFE_WRITE(sc, NFE_RXTX_CTL, sc->rxtxctl);
2754         DELAY(10);
2755         NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_BIT1 | sc->rxtxctl);
2756
2757         /* set Rx filter */
2758         nfe_setmulti(sc);
2759
2760         /* enable Rx */
2761         NFE_WRITE(sc, NFE_RX_CTL, NFE_RX_START);
2762
2763         /* enable Tx */
2764         NFE_WRITE(sc, NFE_TX_CTL, NFE_TX_START);
2765
2766         NFE_WRITE(sc, NFE_PHY_STATUS, 0xf);
2767
2768         /* Clear hardware stats. */
2769         nfe_stats_clear(sc);
2770
2771 #ifdef DEVICE_POLLING
2772         if (ifp->if_capenable & IFCAP_POLLING)
2773                 nfe_disable_intr(sc);
2774         else
2775 #endif
2776         nfe_set_intr(sc);
2777         nfe_enable_intr(sc); /* enable interrupts */
2778
2779         ifp->if_drv_flags |= IFF_DRV_RUNNING;
2780         ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
2781
2782         sc->nfe_link = 0;
2783         mii_mediachg(mii);
2784
2785         callout_reset(&sc->nfe_stat_ch, hz, nfe_tick, sc);
2786 }
2787
2788
2789 static void
2790 nfe_stop(struct ifnet *ifp)
2791 {
2792         struct nfe_softc *sc = ifp->if_softc;
2793         struct nfe_rx_ring *rx_ring;
2794         struct nfe_jrx_ring *jrx_ring;
2795         struct nfe_tx_ring *tx_ring;
2796         struct nfe_rx_data *rdata;
2797         struct nfe_tx_data *tdata;
2798         int i;
2799
2800         NFE_LOCK_ASSERT(sc);
2801
2802         sc->nfe_watchdog_timer = 0;
2803         ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
2804
2805         callout_stop(&sc->nfe_stat_ch);
2806
2807         /* abort Tx */
2808         NFE_WRITE(sc, NFE_TX_CTL, 0);
2809
2810         /* disable Rx */
2811         NFE_WRITE(sc, NFE_RX_CTL, 0);
2812
2813         /* disable interrupts */
2814         nfe_disable_intr(sc);
2815
2816         sc->nfe_link = 0;
2817
2818         /* free Rx and Tx mbufs still in the queues. */
2819         rx_ring = &sc->rxq;
2820         for (i = 0; i < NFE_RX_RING_COUNT; i++) {
2821                 rdata = &rx_ring->data[i];
2822                 if (rdata->m != NULL) {
2823                         bus_dmamap_sync(rx_ring->rx_data_tag,
2824                             rdata->rx_data_map, BUS_DMASYNC_POSTREAD);
2825                         bus_dmamap_unload(rx_ring->rx_data_tag,
2826                             rdata->rx_data_map);
2827                         m_freem(rdata->m);
2828                         rdata->m = NULL;
2829                 }
2830         }
2831
2832         if ((sc->nfe_flags & NFE_JUMBO_SUP) != 0) {
2833                 jrx_ring = &sc->jrxq;
2834                 for (i = 0; i < NFE_JUMBO_RX_RING_COUNT; i++) {
2835                         rdata = &jrx_ring->jdata[i];
2836                         if (rdata->m != NULL) {
2837                                 bus_dmamap_sync(jrx_ring->jrx_data_tag,
2838                                     rdata->rx_data_map, BUS_DMASYNC_POSTREAD);
2839                                 bus_dmamap_unload(jrx_ring->jrx_data_tag,
2840                                     rdata->rx_data_map);
2841                                 m_freem(rdata->m);
2842                                 rdata->m = NULL;
2843                         }
2844                 }
2845         }
2846
2847         tx_ring = &sc->txq;
2848         for (i = 0; i < NFE_RX_RING_COUNT; i++) {
2849                 tdata = &tx_ring->data[i];
2850                 if (tdata->m != NULL) {
2851                         bus_dmamap_sync(tx_ring->tx_data_tag,
2852                             tdata->tx_data_map, BUS_DMASYNC_POSTWRITE);
2853                         bus_dmamap_unload(tx_ring->tx_data_tag,
2854                             tdata->tx_data_map);
2855                         m_freem(tdata->m);
2856                         tdata->m = NULL;
2857                 }
2858         }
2859         /* Update hardware stats. */
2860         nfe_stats_update(sc);
2861 }
2862
2863
2864 static int
2865 nfe_ifmedia_upd(struct ifnet *ifp)
2866 {
2867         struct nfe_softc *sc = ifp->if_softc;
2868         struct mii_data *mii;
2869
2870         NFE_LOCK(sc);
2871         mii = device_get_softc(sc->nfe_miibus);
2872         mii_mediachg(mii);
2873         NFE_UNLOCK(sc);
2874
2875         return (0);
2876 }
2877
2878
2879 static void
2880 nfe_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
2881 {
2882         struct nfe_softc *sc;
2883         struct mii_data *mii;
2884
2885         sc = ifp->if_softc;
2886
2887         NFE_LOCK(sc);
2888         mii = device_get_softc(sc->nfe_miibus);
2889         mii_pollstat(mii);
2890         NFE_UNLOCK(sc);
2891
2892         ifmr->ifm_active = mii->mii_media_active;
2893         ifmr->ifm_status = mii->mii_media_status;
2894 }
2895
2896
2897 void
2898 nfe_tick(void *xsc)
2899 {
2900         struct nfe_softc *sc;
2901         struct mii_data *mii;
2902         struct ifnet *ifp;
2903
2904         sc = (struct nfe_softc *)xsc;
2905
2906         NFE_LOCK_ASSERT(sc);
2907
2908         ifp = sc->nfe_ifp;
2909
2910         mii = device_get_softc(sc->nfe_miibus);
2911         mii_tick(mii);
2912         nfe_stats_update(sc);
2913         nfe_watchdog(ifp);
2914         callout_reset(&sc->nfe_stat_ch, hz, nfe_tick, sc);
2915 }
2916
2917
2918 static int
2919 nfe_shutdown(device_t dev)
2920 {
2921         struct nfe_softc *sc;
2922         struct ifnet *ifp;
2923
2924         sc = device_get_softc(dev);
2925
2926         NFE_LOCK(sc);
2927         ifp = sc->nfe_ifp;
2928         nfe_stop(ifp);
2929         /* nfe_reset(sc); */
2930         NFE_UNLOCK(sc);
2931
2932         return (0);
2933 }
2934
2935
2936 static void
2937 nfe_get_macaddr(struct nfe_softc *sc, uint8_t *addr)
2938 {
2939         uint32_t val;
2940
2941         if ((sc->nfe_flags & NFE_CORRECT_MACADDR) == 0) {
2942                 val = NFE_READ(sc, NFE_MACADDR_LO);
2943                 addr[0] = (val >> 8) & 0xff;
2944                 addr[1] = (val & 0xff);
2945
2946                 val = NFE_READ(sc, NFE_MACADDR_HI);
2947                 addr[2] = (val >> 24) & 0xff;
2948                 addr[3] = (val >> 16) & 0xff;
2949                 addr[4] = (val >>  8) & 0xff;
2950                 addr[5] = (val & 0xff);
2951         } else {
2952                 val = NFE_READ(sc, NFE_MACADDR_LO);
2953                 addr[5] = (val >> 8) & 0xff;
2954                 addr[4] = (val & 0xff);
2955
2956                 val = NFE_READ(sc, NFE_MACADDR_HI);
2957                 addr[3] = (val >> 24) & 0xff;
2958                 addr[2] = (val >> 16) & 0xff;
2959                 addr[1] = (val >>  8) & 0xff;
2960                 addr[0] = (val & 0xff);
2961         }
2962 }
2963
2964
2965 static void
2966 nfe_set_macaddr(struct nfe_softc *sc, uint8_t *addr)
2967 {
2968
2969         NFE_WRITE(sc, NFE_MACADDR_LO, addr[5] <<  8 | addr[4]);
2970         NFE_WRITE(sc, NFE_MACADDR_HI, addr[3] << 24 | addr[2] << 16 |
2971             addr[1] << 8 | addr[0]);
2972 }
2973
2974
2975 /*
2976  * Map a single buffer address.
2977  */
2978
2979 static void
2980 nfe_dma_map_segs(void *arg, bus_dma_segment_t *segs, int nseg, int error)
2981 {
2982         struct nfe_dmamap_arg *ctx;
2983
2984         if (error != 0)
2985                 return;
2986
2987         KASSERT(nseg == 1, ("too many DMA segments, %d should be 1", nseg));
2988
2989         ctx = (struct nfe_dmamap_arg *)arg;
2990         ctx->nfe_busaddr = segs[0].ds_addr;
2991 }
2992
2993
2994 static int
2995 sysctl_int_range(SYSCTL_HANDLER_ARGS, int low, int high)
2996 {
2997         int error, value;
2998
2999         if (!arg1)
3000                 return (EINVAL);
3001         value = *(int *)arg1;
3002         error = sysctl_handle_int(oidp, &value, 0, req);
3003         if (error || !req->newptr)
3004                 return (error);
3005         if (value < low || value > high)
3006                 return (EINVAL);
3007         *(int *)arg1 = value;
3008
3009         return (0);
3010 }
3011
3012
3013 static int
3014 sysctl_hw_nfe_proc_limit(SYSCTL_HANDLER_ARGS)
3015 {
3016
3017         return (sysctl_int_range(oidp, arg1, arg2, req, NFE_PROC_MIN,
3018             NFE_PROC_MAX));
3019 }
3020
3021
3022 #define NFE_SYSCTL_STAT_ADD32(c, h, n, p, d)    \
3023             SYSCTL_ADD_UINT(c, h, OID_AUTO, n, CTLFLAG_RD, p, 0, d)
3024 #define NFE_SYSCTL_STAT_ADD64(c, h, n, p, d)    \
3025             SYSCTL_ADD_QUAD(c, h, OID_AUTO, n, CTLFLAG_RD, p, d)
3026
3027 static void
3028 nfe_sysctl_node(struct nfe_softc *sc)
3029 {
3030         struct sysctl_ctx_list *ctx;
3031         struct sysctl_oid_list *child, *parent;
3032         struct sysctl_oid *tree;
3033         struct nfe_hw_stats *stats;
3034         int error;
3035
3036         stats = &sc->nfe_stats;
3037         ctx = device_get_sysctl_ctx(sc->nfe_dev);
3038         child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->nfe_dev));
3039         SYSCTL_ADD_PROC(ctx, child,
3040             OID_AUTO, "process_limit", CTLTYPE_INT | CTLFLAG_RW,
3041             &sc->nfe_process_limit, 0, sysctl_hw_nfe_proc_limit, "I",
3042             "max number of Rx events to process");
3043
3044         sc->nfe_process_limit = NFE_PROC_DEFAULT;
3045         error = resource_int_value(device_get_name(sc->nfe_dev),
3046             device_get_unit(sc->nfe_dev), "process_limit",
3047             &sc->nfe_process_limit);
3048         if (error == 0) {
3049                 if (sc->nfe_process_limit < NFE_PROC_MIN ||
3050                     sc->nfe_process_limit > NFE_PROC_MAX) {
3051                         device_printf(sc->nfe_dev,
3052                             "process_limit value out of range; "
3053                             "using default: %d\n", NFE_PROC_DEFAULT);
3054                         sc->nfe_process_limit = NFE_PROC_DEFAULT;
3055                 }
3056         }
3057
3058         if ((sc->nfe_flags & (NFE_MIB_V1 | NFE_MIB_V2 | NFE_MIB_V3)) == 0)
3059                 return;
3060
3061         tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", CTLFLAG_RD,
3062             NULL, "NFE statistics");
3063         parent = SYSCTL_CHILDREN(tree);
3064
3065         /* Rx statistics. */
3066         tree = SYSCTL_ADD_NODE(ctx, parent, OID_AUTO, "rx", CTLFLAG_RD,
3067             NULL, "Rx MAC statistics");
3068         child = SYSCTL_CHILDREN(tree);
3069
3070         NFE_SYSCTL_STAT_ADD32(ctx, child, "frame_errors",
3071             &stats->rx_frame_errors, "Framing Errors");
3072         NFE_SYSCTL_STAT_ADD32(ctx, child, "extra_bytes",
3073             &stats->rx_extra_bytes, "Extra Bytes");
3074         NFE_SYSCTL_STAT_ADD32(ctx, child, "late_cols",
3075             &stats->rx_late_cols, "Late Collisions");
3076         NFE_SYSCTL_STAT_ADD32(ctx, child, "runts",
3077             &stats->rx_runts, "Runts");
3078         NFE_SYSCTL_STAT_ADD32(ctx, child, "jumbos",
3079             &stats->rx_jumbos, "Jumbos");
3080         NFE_SYSCTL_STAT_ADD32(ctx, child, "fifo_overuns",
3081             &stats->rx_fifo_overuns, "FIFO Overruns");
3082         NFE_SYSCTL_STAT_ADD32(ctx, child, "crc_errors",
3083             &stats->rx_crc_errors, "CRC Errors");
3084         NFE_SYSCTL_STAT_ADD32(ctx, child, "fae",
3085             &stats->rx_fae, "Frame Alignment Errors");
3086         NFE_SYSCTL_STAT_ADD32(ctx, child, "len_errors",
3087             &stats->rx_len_errors, "Length Errors");
3088         NFE_SYSCTL_STAT_ADD32(ctx, child, "unicast",
3089             &stats->rx_unicast, "Unicast Frames");
3090         NFE_SYSCTL_STAT_ADD32(ctx, child, "multicast",
3091             &stats->rx_multicast, "Multicast Frames");
3092         NFE_SYSCTL_STAT_ADD32(ctx, child, "broadcast",
3093             &stats->rx_broadcast, "Broadcast Frames");
3094         if ((sc->nfe_flags & NFE_MIB_V2) != 0) {
3095                 NFE_SYSCTL_STAT_ADD64(ctx, child, "octets",
3096                     &stats->rx_octets, "Octets");
3097                 NFE_SYSCTL_STAT_ADD32(ctx, child, "pause",
3098                     &stats->rx_pause, "Pause frames");
3099                 NFE_SYSCTL_STAT_ADD32(ctx, child, "drops",
3100                     &stats->rx_drops, "Drop frames");
3101         }
3102
3103         /* Tx statistics. */
3104         tree = SYSCTL_ADD_NODE(ctx, parent, OID_AUTO, "tx", CTLFLAG_RD,
3105             NULL, "Tx MAC statistics");
3106         child = SYSCTL_CHILDREN(tree);
3107         NFE_SYSCTL_STAT_ADD64(ctx, child, "octets",
3108             &stats->tx_octets, "Octets");
3109         NFE_SYSCTL_STAT_ADD32(ctx, child, "zero_rexmits",
3110             &stats->tx_zero_rexmits, "Zero Retransmits");
3111         NFE_SYSCTL_STAT_ADD32(ctx, child, "one_rexmits",
3112             &stats->tx_one_rexmits, "One Retransmits");
3113         NFE_SYSCTL_STAT_ADD32(ctx, child, "multi_rexmits",
3114             &stats->tx_multi_rexmits, "Multiple Retransmits");
3115         NFE_SYSCTL_STAT_ADD32(ctx, child, "late_cols",
3116             &stats->tx_late_cols, "Late Collisions");
3117         NFE_SYSCTL_STAT_ADD32(ctx, child, "fifo_underuns",
3118             &stats->tx_fifo_underuns, "FIFO Underruns");
3119         NFE_SYSCTL_STAT_ADD32(ctx, child, "carrier_losts",
3120             &stats->tx_carrier_losts, "Carrier Losts");
3121         NFE_SYSCTL_STAT_ADD32(ctx, child, "excess_deferrals",
3122             &stats->tx_excess_deferals, "Excess Deferrals");
3123         NFE_SYSCTL_STAT_ADD32(ctx, child, "retry_errors",
3124             &stats->tx_retry_errors, "Retry Errors");
3125         if ((sc->nfe_flags & NFE_MIB_V2) != 0) {
3126                 NFE_SYSCTL_STAT_ADD32(ctx, child, "deferrals",
3127                     &stats->tx_deferals, "Deferrals");
3128                 NFE_SYSCTL_STAT_ADD32(ctx, child, "frames",
3129                     &stats->tx_frames, "Frames");
3130                 NFE_SYSCTL_STAT_ADD32(ctx, child, "pause",
3131                     &stats->tx_pause, "Pause Frames");
3132         }
3133         if ((sc->nfe_flags & NFE_MIB_V3) != 0) {
3134                 NFE_SYSCTL_STAT_ADD32(ctx, child, "unicast",
3135                     &stats->tx_deferals, "Unicast Frames");
3136                 NFE_SYSCTL_STAT_ADD32(ctx, child, "multicast",
3137                     &stats->tx_frames, "Multicast Frames");
3138                 NFE_SYSCTL_STAT_ADD32(ctx, child, "broadcast",
3139                     &stats->tx_pause, "Broadcast Frames");
3140         }
3141 }
3142
3143 #undef NFE_SYSCTL_STAT_ADD32
3144 #undef NFE_SYSCTL_STAT_ADD64
3145
3146 static void
3147 nfe_stats_clear(struct nfe_softc *sc)
3148 {
3149         int i, mib_cnt;
3150
3151         if ((sc->nfe_flags & NFE_MIB_V1) != 0)
3152                 mib_cnt = NFE_NUM_MIB_STATV1;
3153         else if ((sc->nfe_flags & (NFE_MIB_V2 | NFE_MIB_V3)) != 0)
3154                 mib_cnt = NFE_NUM_MIB_STATV2;
3155         else
3156                 return;
3157
3158         for (i = 0; i < mib_cnt; i += sizeof(uint32_t))
3159                 NFE_READ(sc, NFE_TX_OCTET + i);
3160
3161         if ((sc->nfe_flags & NFE_MIB_V3) != 0) {
3162                 NFE_READ(sc, NFE_TX_UNICAST);
3163                 NFE_READ(sc, NFE_TX_MULTICAST);
3164                 NFE_READ(sc, NFE_TX_BROADCAST);
3165         }
3166 }
3167
3168 static void
3169 nfe_stats_update(struct nfe_softc *sc)
3170 {
3171         struct nfe_hw_stats *stats;
3172
3173         NFE_LOCK_ASSERT(sc);
3174
3175         if ((sc->nfe_flags & (NFE_MIB_V1 | NFE_MIB_V2 | NFE_MIB_V3)) == 0)
3176                 return;
3177
3178         stats = &sc->nfe_stats;
3179         stats->tx_octets += NFE_READ(sc, NFE_TX_OCTET);
3180         stats->tx_zero_rexmits += NFE_READ(sc, NFE_TX_ZERO_REXMIT);
3181         stats->tx_one_rexmits += NFE_READ(sc, NFE_TX_ONE_REXMIT);
3182         stats->tx_multi_rexmits += NFE_READ(sc, NFE_TX_MULTI_REXMIT);
3183         stats->tx_late_cols += NFE_READ(sc, NFE_TX_LATE_COL);
3184         stats->tx_fifo_underuns += NFE_READ(sc, NFE_TX_FIFO_UNDERUN);
3185         stats->tx_carrier_losts += NFE_READ(sc, NFE_TX_CARRIER_LOST);
3186         stats->tx_excess_deferals += NFE_READ(sc, NFE_TX_EXCESS_DEFERRAL);
3187         stats->tx_retry_errors += NFE_READ(sc, NFE_TX_RETRY_ERROR);
3188         stats->rx_frame_errors += NFE_READ(sc, NFE_RX_FRAME_ERROR);
3189         stats->rx_extra_bytes += NFE_READ(sc, NFE_RX_EXTRA_BYTES);
3190         stats->rx_late_cols += NFE_READ(sc, NFE_RX_LATE_COL);
3191         stats->rx_runts += NFE_READ(sc, NFE_RX_RUNT);
3192         stats->rx_jumbos += NFE_READ(sc, NFE_RX_JUMBO);
3193         stats->rx_fifo_overuns += NFE_READ(sc, NFE_RX_FIFO_OVERUN);
3194         stats->rx_crc_errors += NFE_READ(sc, NFE_RX_CRC_ERROR);
3195         stats->rx_fae += NFE_READ(sc, NFE_RX_FAE);
3196         stats->rx_len_errors += NFE_READ(sc, NFE_RX_LEN_ERROR);
3197         stats->rx_unicast += NFE_READ(sc, NFE_RX_UNICAST);
3198         stats->rx_multicast += NFE_READ(sc, NFE_RX_MULTICAST);
3199         stats->rx_broadcast += NFE_READ(sc, NFE_RX_BROADCAST);
3200
3201         if ((sc->nfe_flags & NFE_MIB_V2) != 0) {
3202                 stats->tx_deferals += NFE_READ(sc, NFE_TX_DEFERAL);
3203                 stats->tx_frames += NFE_READ(sc, NFE_TX_FRAME);
3204                 stats->rx_octets += NFE_READ(sc, NFE_RX_OCTET);
3205                 stats->tx_pause += NFE_READ(sc, NFE_TX_PAUSE);
3206                 stats->rx_pause += NFE_READ(sc, NFE_RX_PAUSE);
3207                 stats->rx_drops += NFE_READ(sc, NFE_RX_DROP);
3208         }
3209
3210         if ((sc->nfe_flags & NFE_MIB_V3) != 0) {
3211                 stats->tx_unicast += NFE_READ(sc, NFE_TX_UNICAST);
3212                 stats->tx_multicast += NFE_READ(sc, NFE_TX_MULTICAST);
3213                 stats->rx_broadcast += NFE_READ(sc, NFE_TX_BROADCAST);
3214         }
3215 }