]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - sys/dev/nfe/if_nfe.c
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.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);
97 static int  nfe_jrxeof(struct nfe_softc *, 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             PAGE_SIZE, 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 void
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
1560         NFE_LOCK(sc);
1561
1562         if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
1563                 NFE_UNLOCK(sc);
1564                 return;
1565         }
1566
1567         if (sc->nfe_framesize > MCLBYTES - ETHER_HDR_LEN)
1568                 nfe_jrxeof(sc, count);
1569         else
1570                 nfe_rxeof(sc, count);
1571         nfe_txeof(sc);
1572         if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
1573                 taskqueue_enqueue_fast(sc->nfe_tq, &sc->nfe_tx_task);
1574
1575         if (cmd == POLL_AND_CHECK_STATUS) {
1576                 if ((r = NFE_READ(sc, sc->nfe_irq_status)) == 0) {
1577                         NFE_UNLOCK(sc);
1578                         return;
1579                 }
1580                 NFE_WRITE(sc, sc->nfe_irq_status, r);
1581
1582                 if (r & NFE_IRQ_LINK) {
1583                         NFE_READ(sc, NFE_PHY_STATUS);
1584                         NFE_WRITE(sc, NFE_PHY_STATUS, 0xf);
1585                         DPRINTF(sc, "link state changed\n");
1586                 }
1587         }
1588         NFE_UNLOCK(sc);
1589 }
1590 #endif /* DEVICE_POLLING */
1591
1592 static void
1593 nfe_set_intr(struct nfe_softc *sc)
1594 {
1595
1596         if (sc->nfe_msi != 0)
1597                 NFE_WRITE(sc, NFE_IRQ_MASK, NFE_IRQ_WANTED);
1598 }
1599
1600
1601 /* In MSIX, a write to mask reegisters behaves as XOR. */
1602 static __inline void
1603 nfe_enable_intr(struct nfe_softc *sc)
1604 {
1605
1606         if (sc->nfe_msix != 0) {
1607                 /* XXX Should have a better way to enable interrupts! */
1608                 if (NFE_READ(sc, sc->nfe_irq_mask) == 0)
1609                         NFE_WRITE(sc, sc->nfe_irq_mask, sc->nfe_intrs);
1610         } else
1611                 NFE_WRITE(sc, sc->nfe_irq_mask, sc->nfe_intrs);
1612 }
1613
1614
1615 static __inline void
1616 nfe_disable_intr(struct nfe_softc *sc)
1617 {
1618
1619         if (sc->nfe_msix != 0) {
1620                 /* XXX Should have a better way to disable interrupts! */
1621                 if (NFE_READ(sc, sc->nfe_irq_mask) != 0)
1622                         NFE_WRITE(sc, sc->nfe_irq_mask, sc->nfe_nointrs);
1623         } else
1624                 NFE_WRITE(sc, sc->nfe_irq_mask, sc->nfe_nointrs);
1625 }
1626
1627
1628 static int
1629 nfe_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
1630 {
1631         struct nfe_softc *sc;
1632         struct ifreq *ifr;
1633         struct mii_data *mii;
1634         int error, init, mask;
1635
1636         sc = ifp->if_softc;
1637         ifr = (struct ifreq *) data;
1638         error = 0;
1639         init = 0;
1640         switch (cmd) {
1641         case SIOCSIFMTU:
1642                 if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > NFE_JUMBO_MTU)
1643                         error = EINVAL;
1644                 else if (ifp->if_mtu != ifr->ifr_mtu) {
1645                         if ((((sc->nfe_flags & NFE_JUMBO_SUP) == 0) ||
1646                             (sc->nfe_jumbo_disable != 0)) &&
1647                             ifr->ifr_mtu > ETHERMTU)
1648                                 error = EINVAL;
1649                         else {
1650                                 NFE_LOCK(sc);
1651                                 ifp->if_mtu = ifr->ifr_mtu;
1652                                 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
1653                                         nfe_init_locked(sc);
1654                                 NFE_UNLOCK(sc);
1655                         }
1656                 }
1657                 break;
1658         case SIOCSIFFLAGS:
1659                 NFE_LOCK(sc);
1660                 if (ifp->if_flags & IFF_UP) {
1661                         /*
1662                          * If only the PROMISC or ALLMULTI flag changes, then
1663                          * don't do a full re-init of the chip, just update
1664                          * the Rx filter.
1665                          */
1666                         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) &&
1667                             ((ifp->if_flags ^ sc->nfe_if_flags) &
1668                              (IFF_ALLMULTI | IFF_PROMISC)) != 0)
1669                                 nfe_setmulti(sc);
1670                         else
1671                                 nfe_init_locked(sc);
1672                 } else {
1673                         if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1674                                 nfe_stop(ifp);
1675                 }
1676                 sc->nfe_if_flags = ifp->if_flags;
1677                 NFE_UNLOCK(sc);
1678                 error = 0;
1679                 break;
1680         case SIOCADDMULTI:
1681         case SIOCDELMULTI:
1682                 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
1683                         NFE_LOCK(sc);
1684                         nfe_setmulti(sc);
1685                         NFE_UNLOCK(sc);
1686                         error = 0;
1687                 }
1688                 break;
1689         case SIOCSIFMEDIA:
1690         case SIOCGIFMEDIA:
1691                 mii = device_get_softc(sc->nfe_miibus);
1692                 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd);
1693                 break;
1694         case SIOCSIFCAP:
1695                 mask = ifr->ifr_reqcap ^ ifp->if_capenable;
1696 #ifdef DEVICE_POLLING
1697                 if ((mask & IFCAP_POLLING) != 0) {
1698                         if ((ifr->ifr_reqcap & IFCAP_POLLING) != 0) {
1699                                 error = ether_poll_register(nfe_poll, ifp);
1700                                 if (error)
1701                                         break;
1702                                 NFE_LOCK(sc);
1703                                 nfe_disable_intr(sc);
1704                                 ifp->if_capenable |= IFCAP_POLLING;
1705                                 NFE_UNLOCK(sc);
1706                         } else {
1707                                 error = ether_poll_deregister(ifp);
1708                                 /* Enable interrupt even in error case */
1709                                 NFE_LOCK(sc);
1710                                 nfe_enable_intr(sc);
1711                                 ifp->if_capenable &= ~IFCAP_POLLING;
1712                                 NFE_UNLOCK(sc);
1713                         }
1714                 }
1715 #endif /* DEVICE_POLLING */
1716                 if ((sc->nfe_flags & NFE_HW_CSUM) != 0 &&
1717                     (mask & IFCAP_HWCSUM) != 0) {
1718                         ifp->if_capenable ^= IFCAP_HWCSUM;
1719                         if ((IFCAP_TXCSUM & ifp->if_capenable) != 0 &&
1720                             (IFCAP_TXCSUM & ifp->if_capabilities) != 0)
1721                                 ifp->if_hwassist |= NFE_CSUM_FEATURES;
1722                         else
1723                                 ifp->if_hwassist &= ~NFE_CSUM_FEATURES;
1724                         init++;
1725                 }
1726                 if ((sc->nfe_flags & NFE_HW_VLAN) != 0 &&
1727                     (mask & IFCAP_VLAN_HWTAGGING) != 0) {
1728                         ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
1729                         init++;
1730                 }
1731                 /*
1732                  * XXX
1733                  * It seems that VLAN stripping requires Rx checksum offload.
1734                  * Unfortunately FreeBSD has no way to disable only Rx side
1735                  * VLAN stripping. So when we know Rx checksum offload is
1736                  * disabled turn entire hardware VLAN assist off.
1737                  */
1738                 if ((sc->nfe_flags & (NFE_HW_CSUM | NFE_HW_VLAN)) ==
1739                     (NFE_HW_CSUM | NFE_HW_VLAN)) {
1740                         if ((ifp->if_capenable & IFCAP_RXCSUM) == 0)
1741                                 ifp->if_capenable &= ~IFCAP_VLAN_HWTAGGING;
1742                 }
1743
1744                 if ((sc->nfe_flags & NFE_HW_CSUM) != 0 &&
1745                     (mask & IFCAP_TSO4) != 0) {
1746                         ifp->if_capenable ^= IFCAP_TSO4;
1747                         if ((IFCAP_TSO4 & ifp->if_capenable) != 0 &&
1748                             (IFCAP_TSO4 & ifp->if_capabilities) != 0)
1749                                 ifp->if_hwassist |= CSUM_TSO;
1750                         else
1751                                 ifp->if_hwassist &= ~CSUM_TSO;
1752                 }
1753
1754                 if (init > 0 && (ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
1755                         ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
1756                         nfe_init(sc);
1757                 }
1758                 if ((sc->nfe_flags & NFE_HW_VLAN) != 0)
1759                         VLAN_CAPABILITIES(ifp);
1760                 break;
1761         default:
1762                 error = ether_ioctl(ifp, cmd, data);
1763                 break;
1764         }
1765
1766         return (error);
1767 }
1768
1769
1770 static int
1771 nfe_intr(void *arg)
1772 {
1773         struct nfe_softc *sc;
1774         uint32_t status;
1775
1776         sc = (struct nfe_softc *)arg;
1777
1778         status = NFE_READ(sc, sc->nfe_irq_status);
1779         if (status == 0 || status == 0xffffffff)
1780                 return (FILTER_STRAY);
1781         nfe_disable_intr(sc);
1782         taskqueue_enqueue_fast(sc->nfe_tq, &sc->nfe_int_task);
1783
1784         return (FILTER_HANDLED);
1785 }
1786
1787
1788 static void
1789 nfe_int_task(void *arg, int pending)
1790 {
1791         struct nfe_softc *sc = arg;
1792         struct ifnet *ifp = sc->nfe_ifp;
1793         uint32_t r;
1794         int domore;
1795
1796         NFE_LOCK(sc);
1797
1798         if ((r = NFE_READ(sc, sc->nfe_irq_status)) == 0) {
1799                 nfe_enable_intr(sc);
1800                 NFE_UNLOCK(sc);
1801                 return; /* not for us */
1802         }
1803         NFE_WRITE(sc, sc->nfe_irq_status, r);
1804
1805         DPRINTFN(sc, 5, "nfe_intr: interrupt register %x\n", r);
1806
1807 #ifdef DEVICE_POLLING
1808         if (ifp->if_capenable & IFCAP_POLLING) {
1809                 NFE_UNLOCK(sc);
1810                 return;
1811         }
1812 #endif
1813
1814         if (r & NFE_IRQ_LINK) {
1815                 NFE_READ(sc, NFE_PHY_STATUS);
1816                 NFE_WRITE(sc, NFE_PHY_STATUS, 0xf);
1817                 DPRINTF(sc, "link state changed\n");
1818         }
1819
1820         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
1821                 NFE_UNLOCK(sc);
1822                 nfe_enable_intr(sc);
1823                 return;
1824         }
1825
1826         domore = 0;
1827         /* check Rx ring */
1828         if (sc->nfe_framesize > MCLBYTES - ETHER_HDR_LEN)
1829                 domore = nfe_jrxeof(sc, sc->nfe_process_limit);
1830         else
1831                 domore = nfe_rxeof(sc, sc->nfe_process_limit);
1832         /* check Tx ring */
1833         nfe_txeof(sc);
1834
1835         if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
1836                 taskqueue_enqueue_fast(sc->nfe_tq, &sc->nfe_tx_task);
1837
1838         NFE_UNLOCK(sc);
1839
1840         if (domore || (NFE_READ(sc, sc->nfe_irq_status) != 0)) {
1841                 taskqueue_enqueue_fast(sc->nfe_tq, &sc->nfe_int_task);
1842                 return;
1843         }
1844
1845         /* Reenable interrupts. */
1846         nfe_enable_intr(sc);
1847 }
1848
1849
1850 static __inline void
1851 nfe_discard_rxbuf(struct nfe_softc *sc, int idx)
1852 {
1853         struct nfe_desc32 *desc32;
1854         struct nfe_desc64 *desc64;
1855         struct nfe_rx_data *data;
1856         struct mbuf *m;
1857
1858         data = &sc->rxq.data[idx];
1859         m = data->m;
1860
1861         if (sc->nfe_flags & NFE_40BIT_ADDR) {
1862                 desc64 = &sc->rxq.desc64[idx];
1863                 /* VLAN packet may have overwritten it. */
1864                 desc64->physaddr[0] = htole32(NFE_ADDR_HI(data->paddr));
1865                 desc64->physaddr[1] = htole32(NFE_ADDR_LO(data->paddr));
1866                 desc64->length = htole16(m->m_len);
1867                 desc64->flags = htole16(NFE_RX_READY);
1868         } else {
1869                 desc32 = &sc->rxq.desc32[idx];
1870                 desc32->length = htole16(m->m_len);
1871                 desc32->flags = htole16(NFE_RX_READY);
1872         }
1873 }
1874
1875
1876 static __inline void
1877 nfe_discard_jrxbuf(struct nfe_softc *sc, int idx)
1878 {
1879         struct nfe_desc32 *desc32;
1880         struct nfe_desc64 *desc64;
1881         struct nfe_rx_data *data;
1882         struct mbuf *m;
1883
1884         data = &sc->jrxq.jdata[idx];
1885         m = data->m;
1886
1887         if (sc->nfe_flags & NFE_40BIT_ADDR) {
1888                 desc64 = &sc->jrxq.jdesc64[idx];
1889                 /* VLAN packet may have overwritten it. */
1890                 desc64->physaddr[0] = htole32(NFE_ADDR_HI(data->paddr));
1891                 desc64->physaddr[1] = htole32(NFE_ADDR_LO(data->paddr));
1892                 desc64->length = htole16(m->m_len);
1893                 desc64->flags = htole16(NFE_RX_READY);
1894         } else {
1895                 desc32 = &sc->jrxq.jdesc32[idx];
1896                 desc32->length = htole16(m->m_len);
1897                 desc32->flags = htole16(NFE_RX_READY);
1898         }
1899 }
1900
1901
1902 static int
1903 nfe_newbuf(struct nfe_softc *sc, int idx)
1904 {
1905         struct nfe_rx_data *data;
1906         struct nfe_desc32 *desc32;
1907         struct nfe_desc64 *desc64;
1908         struct mbuf *m;
1909         bus_dma_segment_t segs[1];
1910         bus_dmamap_t map;
1911         int nsegs;
1912
1913         m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
1914         if (m == NULL)
1915                 return (ENOBUFS);
1916
1917         m->m_len = m->m_pkthdr.len = MCLBYTES;
1918         m_adj(m, ETHER_ALIGN);
1919
1920         if (bus_dmamap_load_mbuf_sg(sc->rxq.rx_data_tag, sc->rxq.rx_spare_map,
1921             m, segs, &nsegs, BUS_DMA_NOWAIT) != 0) {
1922                 m_freem(m);
1923                 return (ENOBUFS);
1924         }
1925         KASSERT(nsegs == 1, ("%s: %d segments returned!", __func__, nsegs));
1926
1927         data = &sc->rxq.data[idx];
1928         if (data->m != NULL) {
1929                 bus_dmamap_sync(sc->rxq.rx_data_tag, data->rx_data_map,
1930                     BUS_DMASYNC_POSTREAD);
1931                 bus_dmamap_unload(sc->rxq.rx_data_tag, data->rx_data_map);
1932         }
1933         map = data->rx_data_map;
1934         data->rx_data_map = sc->rxq.rx_spare_map;
1935         sc->rxq.rx_spare_map = map;
1936         bus_dmamap_sync(sc->rxq.rx_data_tag, data->rx_data_map,
1937             BUS_DMASYNC_PREREAD);
1938         data->paddr = segs[0].ds_addr;
1939         data->m = m;
1940         /* update mapping address in h/w descriptor */
1941         if (sc->nfe_flags & NFE_40BIT_ADDR) {
1942                 desc64 = &sc->rxq.desc64[idx];
1943                 desc64->physaddr[0] = htole32(NFE_ADDR_HI(segs[0].ds_addr));
1944                 desc64->physaddr[1] = htole32(NFE_ADDR_LO(segs[0].ds_addr));
1945                 desc64->length = htole16(segs[0].ds_len);
1946                 desc64->flags = htole16(NFE_RX_READY);
1947         } else {
1948                 desc32 = &sc->rxq.desc32[idx];
1949                 desc32->physaddr = htole32(NFE_ADDR_LO(segs[0].ds_addr));
1950                 desc32->length = htole16(segs[0].ds_len);
1951                 desc32->flags = htole16(NFE_RX_READY);
1952         }
1953
1954         return (0);
1955 }
1956
1957
1958 static int
1959 nfe_jnewbuf(struct nfe_softc *sc, int idx)
1960 {
1961         struct nfe_rx_data *data;
1962         struct nfe_desc32 *desc32;
1963         struct nfe_desc64 *desc64;
1964         struct mbuf *m;
1965         bus_dma_segment_t segs[1];
1966         bus_dmamap_t map;
1967         int nsegs;
1968
1969         m = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, MJUM9BYTES);
1970         if (m == NULL)
1971                 return (ENOBUFS);
1972         if ((m->m_flags & M_EXT) == 0) {
1973                 m_freem(m);
1974                 return (ENOBUFS);
1975         }
1976         m->m_pkthdr.len = m->m_len = MJUM9BYTES;
1977         m_adj(m, ETHER_ALIGN);
1978
1979         if (bus_dmamap_load_mbuf_sg(sc->jrxq.jrx_data_tag,
1980             sc->jrxq.jrx_spare_map, m, segs, &nsegs, BUS_DMA_NOWAIT) != 0) {
1981                 m_freem(m);
1982                 return (ENOBUFS);
1983         }
1984         KASSERT(nsegs == 1, ("%s: %d segments returned!", __func__, nsegs));
1985
1986         data = &sc->jrxq.jdata[idx];
1987         if (data->m != NULL) {
1988                 bus_dmamap_sync(sc->jrxq.jrx_data_tag, data->rx_data_map,
1989                     BUS_DMASYNC_POSTREAD);
1990                 bus_dmamap_unload(sc->jrxq.jrx_data_tag, data->rx_data_map);
1991         }
1992         map = data->rx_data_map;
1993         data->rx_data_map = sc->jrxq.jrx_spare_map;
1994         sc->jrxq.jrx_spare_map = map;
1995         bus_dmamap_sync(sc->jrxq.jrx_data_tag, data->rx_data_map,
1996             BUS_DMASYNC_PREREAD);
1997         data->paddr = segs[0].ds_addr;
1998         data->m = m;
1999         /* update mapping address in h/w descriptor */
2000         if (sc->nfe_flags & NFE_40BIT_ADDR) {
2001                 desc64 = &sc->jrxq.jdesc64[idx];
2002                 desc64->physaddr[0] = htole32(NFE_ADDR_HI(segs[0].ds_addr));
2003                 desc64->physaddr[1] = htole32(NFE_ADDR_LO(segs[0].ds_addr));
2004                 desc64->length = htole16(segs[0].ds_len);
2005                 desc64->flags = htole16(NFE_RX_READY);
2006         } else {
2007                 desc32 = &sc->jrxq.jdesc32[idx];
2008                 desc32->physaddr = htole32(NFE_ADDR_LO(segs[0].ds_addr));
2009                 desc32->length = htole16(segs[0].ds_len);
2010                 desc32->flags = htole16(NFE_RX_READY);
2011         }
2012
2013         return (0);
2014 }
2015
2016
2017 static int
2018 nfe_rxeof(struct nfe_softc *sc, int count)
2019 {
2020         struct ifnet *ifp = sc->nfe_ifp;
2021         struct nfe_desc32 *desc32;
2022         struct nfe_desc64 *desc64;
2023         struct nfe_rx_data *data;
2024         struct mbuf *m;
2025         uint16_t flags;
2026         int len, prog;
2027         uint32_t vtag = 0;
2028
2029         NFE_LOCK_ASSERT(sc);
2030
2031         bus_dmamap_sync(sc->rxq.rx_desc_tag, sc->rxq.rx_desc_map,
2032             BUS_DMASYNC_POSTREAD);
2033
2034         for (prog = 0;;NFE_INC(sc->rxq.cur, NFE_RX_RING_COUNT), vtag = 0) {
2035                 if (count <= 0)
2036                         break;
2037                 count--;
2038
2039                 data = &sc->rxq.data[sc->rxq.cur];
2040
2041                 if (sc->nfe_flags & NFE_40BIT_ADDR) {
2042                         desc64 = &sc->rxq.desc64[sc->rxq.cur];
2043                         vtag = le32toh(desc64->physaddr[1]);
2044                         flags = le16toh(desc64->flags);
2045                         len = le16toh(desc64->length) & NFE_RX_LEN_MASK;
2046                 } else {
2047                         desc32 = &sc->rxq.desc32[sc->rxq.cur];
2048                         flags = le16toh(desc32->flags);
2049                         len = le16toh(desc32->length) & NFE_RX_LEN_MASK;
2050                 }
2051
2052                 if (flags & NFE_RX_READY)
2053                         break;
2054                 prog++;
2055                 if ((sc->nfe_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) {
2056                         if (!(flags & NFE_RX_VALID_V1)) {
2057                                 ifp->if_ierrors++;
2058                                 nfe_discard_rxbuf(sc, sc->rxq.cur);
2059                                 continue;
2060                         }
2061                         if ((flags & NFE_RX_FIXME_V1) == NFE_RX_FIXME_V1) {
2062                                 flags &= ~NFE_RX_ERROR;
2063                                 len--;  /* fix buffer length */
2064                         }
2065                 } else {
2066                         if (!(flags & NFE_RX_VALID_V2)) {
2067                                 ifp->if_ierrors++;
2068                                 nfe_discard_rxbuf(sc, sc->rxq.cur);
2069                                 continue;
2070                         }
2071
2072                         if ((flags & NFE_RX_FIXME_V2) == NFE_RX_FIXME_V2) {
2073                                 flags &= ~NFE_RX_ERROR;
2074                                 len--;  /* fix buffer length */
2075                         }
2076                 }
2077
2078                 if (flags & NFE_RX_ERROR) {
2079                         ifp->if_ierrors++;
2080                         nfe_discard_rxbuf(sc, sc->rxq.cur);
2081                         continue;
2082                 }
2083
2084                 m = data->m;
2085                 if (nfe_newbuf(sc, sc->rxq.cur) != 0) {
2086                         ifp->if_iqdrops++;
2087                         nfe_discard_rxbuf(sc, sc->rxq.cur);
2088                         continue;
2089                 }
2090
2091                 if ((vtag & NFE_RX_VTAG) != 0 &&
2092                     (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) {
2093                         m->m_pkthdr.ether_vtag = vtag & 0xffff;
2094                         m->m_flags |= M_VLANTAG;
2095                 }
2096
2097                 m->m_pkthdr.len = m->m_len = len;
2098                 m->m_pkthdr.rcvif = ifp;
2099
2100                 if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) {
2101                         if ((flags & NFE_RX_IP_CSUMOK) != 0) {
2102                                 m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
2103                                 m->m_pkthdr.csum_flags |= CSUM_IP_VALID;
2104                                 if ((flags & NFE_RX_TCP_CSUMOK) != 0 ||
2105                                     (flags & NFE_RX_UDP_CSUMOK) != 0) {
2106                                         m->m_pkthdr.csum_flags |=
2107                                             CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
2108                                         m->m_pkthdr.csum_data = 0xffff;
2109                                 }
2110                         }
2111                 }
2112
2113                 ifp->if_ipackets++;
2114
2115                 NFE_UNLOCK(sc);
2116                 (*ifp->if_input)(ifp, m);
2117                 NFE_LOCK(sc);
2118         }
2119
2120         if (prog > 0)
2121                 bus_dmamap_sync(sc->rxq.rx_desc_tag, sc->rxq.rx_desc_map,
2122                     BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2123
2124         return (count > 0 ? 0 : EAGAIN);
2125 }
2126
2127
2128 static int
2129 nfe_jrxeof(struct nfe_softc *sc, int count)
2130 {
2131         struct ifnet *ifp = sc->nfe_ifp;
2132         struct nfe_desc32 *desc32;
2133         struct nfe_desc64 *desc64;
2134         struct nfe_rx_data *data;
2135         struct mbuf *m;
2136         uint16_t flags;
2137         int len, prog;
2138         uint32_t vtag = 0;
2139
2140         NFE_LOCK_ASSERT(sc);
2141
2142         bus_dmamap_sync(sc->jrxq.jrx_desc_tag, sc->jrxq.jrx_desc_map,
2143             BUS_DMASYNC_POSTREAD);
2144
2145         for (prog = 0;;NFE_INC(sc->jrxq.jcur, NFE_JUMBO_RX_RING_COUNT),
2146             vtag = 0) {
2147                 if (count <= 0)
2148                         break;
2149                 count--;
2150
2151                 data = &sc->jrxq.jdata[sc->jrxq.jcur];
2152
2153                 if (sc->nfe_flags & NFE_40BIT_ADDR) {
2154                         desc64 = &sc->jrxq.jdesc64[sc->jrxq.jcur];
2155                         vtag = le32toh(desc64->physaddr[1]);
2156                         flags = le16toh(desc64->flags);
2157                         len = le16toh(desc64->length) & NFE_RX_LEN_MASK;
2158                 } else {
2159                         desc32 = &sc->jrxq.jdesc32[sc->jrxq.jcur];
2160                         flags = le16toh(desc32->flags);
2161                         len = le16toh(desc32->length) & NFE_RX_LEN_MASK;
2162                 }
2163
2164                 if (flags & NFE_RX_READY)
2165                         break;
2166                 prog++;
2167                 if ((sc->nfe_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) {
2168                         if (!(flags & NFE_RX_VALID_V1)) {
2169                                 ifp->if_ierrors++;
2170                                 nfe_discard_jrxbuf(sc, sc->jrxq.jcur);
2171                                 continue;
2172                         }
2173                         if ((flags & NFE_RX_FIXME_V1) == NFE_RX_FIXME_V1) {
2174                                 flags &= ~NFE_RX_ERROR;
2175                                 len--;  /* fix buffer length */
2176                         }
2177                 } else {
2178                         if (!(flags & NFE_RX_VALID_V2)) {
2179                                 ifp->if_ierrors++;
2180                                 nfe_discard_jrxbuf(sc, sc->jrxq.jcur);
2181                                 continue;
2182                         }
2183
2184                         if ((flags & NFE_RX_FIXME_V2) == NFE_RX_FIXME_V2) {
2185                                 flags &= ~NFE_RX_ERROR;
2186                                 len--;  /* fix buffer length */
2187                         }
2188                 }
2189
2190                 if (flags & NFE_RX_ERROR) {
2191                         ifp->if_ierrors++;
2192                         nfe_discard_jrxbuf(sc, sc->jrxq.jcur);
2193                         continue;
2194                 }
2195
2196                 m = data->m;
2197                 if (nfe_jnewbuf(sc, sc->jrxq.jcur) != 0) {
2198                         ifp->if_iqdrops++;
2199                         nfe_discard_jrxbuf(sc, sc->jrxq.jcur);
2200                         continue;
2201                 }
2202
2203                 if ((vtag & NFE_RX_VTAG) != 0 &&
2204                     (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) {
2205                         m->m_pkthdr.ether_vtag = vtag & 0xffff;
2206                         m->m_flags |= M_VLANTAG;
2207                 }
2208
2209                 m->m_pkthdr.len = m->m_len = len;
2210                 m->m_pkthdr.rcvif = ifp;
2211
2212                 if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) {
2213                         if ((flags & NFE_RX_IP_CSUMOK) != 0) {
2214                                 m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
2215                                 m->m_pkthdr.csum_flags |= CSUM_IP_VALID;
2216                                 if ((flags & NFE_RX_TCP_CSUMOK) != 0 ||
2217                                     (flags & NFE_RX_UDP_CSUMOK) != 0) {
2218                                         m->m_pkthdr.csum_flags |=
2219                                             CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
2220                                         m->m_pkthdr.csum_data = 0xffff;
2221                                 }
2222                         }
2223                 }
2224
2225                 ifp->if_ipackets++;
2226
2227                 NFE_UNLOCK(sc);
2228                 (*ifp->if_input)(ifp, m);
2229                 NFE_LOCK(sc);
2230         }
2231
2232         if (prog > 0)
2233                 bus_dmamap_sync(sc->jrxq.jrx_desc_tag, sc->jrxq.jrx_desc_map,
2234                     BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2235
2236         return (count > 0 ? 0 : EAGAIN);
2237 }
2238
2239
2240 static void
2241 nfe_txeof(struct nfe_softc *sc)
2242 {
2243         struct ifnet *ifp = sc->nfe_ifp;
2244         struct nfe_desc32 *desc32;
2245         struct nfe_desc64 *desc64;
2246         struct nfe_tx_data *data = NULL;
2247         uint16_t flags;
2248         int cons, prog;
2249
2250         NFE_LOCK_ASSERT(sc);
2251
2252         bus_dmamap_sync(sc->txq.tx_desc_tag, sc->txq.tx_desc_map,
2253             BUS_DMASYNC_POSTREAD);
2254
2255         prog = 0;
2256         for (cons = sc->txq.next; cons != sc->txq.cur;
2257             NFE_INC(cons, NFE_TX_RING_COUNT)) {
2258                 if (sc->nfe_flags & NFE_40BIT_ADDR) {
2259                         desc64 = &sc->txq.desc64[cons];
2260                         flags = le16toh(desc64->flags);
2261                 } else {
2262                         desc32 = &sc->txq.desc32[cons];
2263                         flags = le16toh(desc32->flags);
2264                 }
2265
2266                 if (flags & NFE_TX_VALID)
2267                         break;
2268
2269                 prog++;
2270                 sc->txq.queued--;
2271                 data = &sc->txq.data[cons];
2272
2273                 if ((sc->nfe_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) {
2274                         if ((flags & NFE_TX_LASTFRAG_V1) == 0)
2275                                 continue;
2276                         if ((flags & NFE_TX_ERROR_V1) != 0) {
2277                                 device_printf(sc->nfe_dev,
2278                                     "tx v1 error 0x%4b\n", flags, NFE_V1_TXERR);
2279
2280                                 ifp->if_oerrors++;
2281                         } else
2282                                 ifp->if_opackets++;
2283                 } else {
2284                         if ((flags & NFE_TX_LASTFRAG_V2) == 0)
2285                                 continue;
2286                         if ((flags & NFE_TX_ERROR_V2) != 0) {
2287                                 device_printf(sc->nfe_dev,
2288                                     "tx v2 error 0x%4b\n", flags, NFE_V2_TXERR);
2289                                 ifp->if_oerrors++;
2290                         } else
2291                                 ifp->if_opackets++;
2292                 }
2293
2294                 /* last fragment of the mbuf chain transmitted */
2295                 KASSERT(data->m != NULL, ("%s: freeing NULL mbuf!", __func__));
2296                 bus_dmamap_sync(sc->txq.tx_data_tag, data->tx_data_map,
2297                     BUS_DMASYNC_POSTWRITE);
2298                 bus_dmamap_unload(sc->txq.tx_data_tag, data->tx_data_map);
2299                 m_freem(data->m);
2300                 data->m = NULL;
2301         }
2302
2303         if (prog > 0) {
2304                 sc->nfe_force_tx = 0;
2305                 sc->txq.next = cons;
2306                 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
2307                 if (sc->txq.queued == 0)
2308                         sc->nfe_watchdog_timer = 0;
2309         }
2310 }
2311
2312 static int
2313 nfe_encap(struct nfe_softc *sc, struct mbuf **m_head)
2314 {
2315         struct nfe_desc32 *desc32 = NULL;
2316         struct nfe_desc64 *desc64 = NULL;
2317         bus_dmamap_t map;
2318         bus_dma_segment_t segs[NFE_MAX_SCATTER];
2319         int error, i, nsegs, prod, si;
2320         uint32_t tso_segsz;
2321         uint16_t cflags, flags;
2322         struct mbuf *m;
2323
2324         prod = si = sc->txq.cur;
2325         map = sc->txq.data[prod].tx_data_map;
2326
2327         error = bus_dmamap_load_mbuf_sg(sc->txq.tx_data_tag, map, *m_head, segs,
2328             &nsegs, BUS_DMA_NOWAIT);
2329         if (error == EFBIG) {
2330                 m = m_collapse(*m_head, M_DONTWAIT, NFE_MAX_SCATTER);
2331                 if (m == NULL) {
2332                         m_freem(*m_head);
2333                         *m_head = NULL;
2334                         return (ENOBUFS);
2335                 }
2336                 *m_head = m;
2337                 error = bus_dmamap_load_mbuf_sg(sc->txq.tx_data_tag, map,
2338                     *m_head, segs, &nsegs, BUS_DMA_NOWAIT);
2339                 if (error != 0) {
2340                         m_freem(*m_head);
2341                         *m_head = NULL;
2342                         return (ENOBUFS);
2343                 }
2344         } else if (error != 0)
2345                 return (error);
2346         if (nsegs == 0) {
2347                 m_freem(*m_head);
2348                 *m_head = NULL;
2349                 return (EIO);
2350         }
2351
2352         if (sc->txq.queued + nsegs >= NFE_TX_RING_COUNT - 2) {
2353                 bus_dmamap_unload(sc->txq.tx_data_tag, map);
2354                 return (ENOBUFS);
2355         }
2356
2357         m = *m_head;
2358         cflags = flags = 0;
2359         tso_segsz = 0;
2360         if ((m->m_pkthdr.csum_flags & NFE_CSUM_FEATURES) != 0) {
2361                 if ((m->m_pkthdr.csum_flags & CSUM_IP) != 0)
2362                         cflags |= NFE_TX_IP_CSUM;
2363                 if ((m->m_pkthdr.csum_flags & CSUM_TCP) != 0)
2364                         cflags |= NFE_TX_TCP_UDP_CSUM;
2365                 if ((m->m_pkthdr.csum_flags & CSUM_UDP) != 0)
2366                         cflags |= NFE_TX_TCP_UDP_CSUM;
2367         }
2368         if ((m->m_pkthdr.csum_flags & CSUM_TSO) != 0) {
2369                 tso_segsz = (uint32_t)m->m_pkthdr.tso_segsz <<
2370                     NFE_TX_TSO_SHIFT;
2371                 cflags &= ~(NFE_TX_IP_CSUM | NFE_TX_TCP_UDP_CSUM);
2372                 cflags |= NFE_TX_TSO;
2373         }
2374
2375         for (i = 0; i < nsegs; i++) {
2376                 if (sc->nfe_flags & NFE_40BIT_ADDR) {
2377                         desc64 = &sc->txq.desc64[prod];
2378                         desc64->physaddr[0] =
2379                             htole32(NFE_ADDR_HI(segs[i].ds_addr));
2380                         desc64->physaddr[1] =
2381                             htole32(NFE_ADDR_LO(segs[i].ds_addr));
2382                         desc64->vtag = 0;
2383                         desc64->length = htole16(segs[i].ds_len - 1);
2384                         desc64->flags = htole16(flags);
2385                 } else {
2386                         desc32 = &sc->txq.desc32[prod];
2387                         desc32->physaddr =
2388                             htole32(NFE_ADDR_LO(segs[i].ds_addr));
2389                         desc32->length = htole16(segs[i].ds_len - 1);
2390                         desc32->flags = htole16(flags);
2391                 }
2392
2393                 /*
2394                  * Setting of the valid bit in the first descriptor is
2395                  * deferred until the whole chain is fully setup.
2396                  */
2397                 flags |= NFE_TX_VALID;
2398
2399                 sc->txq.queued++;
2400                 NFE_INC(prod, NFE_TX_RING_COUNT);
2401         }
2402
2403         /*
2404          * the whole mbuf chain has been DMA mapped, fix last/first descriptor.
2405          * csum flags, vtag and TSO belong to the first fragment only.
2406          */
2407         if (sc->nfe_flags & NFE_40BIT_ADDR) {
2408                 desc64->flags |= htole16(NFE_TX_LASTFRAG_V2);
2409                 desc64 = &sc->txq.desc64[si];
2410                 if ((m->m_flags & M_VLANTAG) != 0)
2411                         desc64->vtag = htole32(NFE_TX_VTAG |
2412                             m->m_pkthdr.ether_vtag);
2413                 if (tso_segsz != 0) {
2414                         /*
2415                          * XXX
2416                          * The following indicates the descriptor element
2417                          * is a 32bit quantity.
2418                          */
2419                         desc64->length |= htole16((uint16_t)tso_segsz);
2420                         desc64->flags |= htole16(tso_segsz >> 16);
2421                 }
2422                 /*
2423                  * finally, set the valid/checksum/TSO bit in the first
2424                  * descriptor.
2425                  */
2426                 desc64->flags |= htole16(NFE_TX_VALID | cflags);
2427         } else {
2428                 if (sc->nfe_flags & NFE_JUMBO_SUP)
2429                         desc32->flags |= htole16(NFE_TX_LASTFRAG_V2);
2430                 else
2431                         desc32->flags |= htole16(NFE_TX_LASTFRAG_V1);
2432                 desc32 = &sc->txq.desc32[si];
2433                 if (tso_segsz != 0) {
2434                         /*
2435                          * XXX
2436                          * The following indicates the descriptor element
2437                          * is a 32bit quantity.
2438                          */
2439                         desc32->length |= htole16((uint16_t)tso_segsz);
2440                         desc32->flags |= htole16(tso_segsz >> 16);
2441                 }
2442                 /*
2443                  * finally, set the valid/checksum/TSO bit in the first
2444                  * descriptor.
2445                  */
2446                 desc32->flags |= htole16(NFE_TX_VALID | cflags);
2447         }
2448
2449         sc->txq.cur = prod;
2450         prod = (prod + NFE_TX_RING_COUNT - 1) % NFE_TX_RING_COUNT;
2451         sc->txq.data[si].tx_data_map = sc->txq.data[prod].tx_data_map;
2452         sc->txq.data[prod].tx_data_map = map;
2453         sc->txq.data[prod].m = m;
2454
2455         bus_dmamap_sync(sc->txq.tx_data_tag, map, BUS_DMASYNC_PREWRITE);
2456
2457         return (0);
2458 }
2459
2460
2461 static void
2462 nfe_setmulti(struct nfe_softc *sc)
2463 {
2464         struct ifnet *ifp = sc->nfe_ifp;
2465         struct ifmultiaddr *ifma;
2466         int i;
2467         uint32_t filter;
2468         uint8_t addr[ETHER_ADDR_LEN], mask[ETHER_ADDR_LEN];
2469         uint8_t etherbroadcastaddr[ETHER_ADDR_LEN] = {
2470                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
2471         };
2472
2473         NFE_LOCK_ASSERT(sc);
2474
2475         if ((ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC)) != 0) {
2476                 bzero(addr, ETHER_ADDR_LEN);
2477                 bzero(mask, ETHER_ADDR_LEN);
2478                 goto done;
2479         }
2480
2481         bcopy(etherbroadcastaddr, addr, ETHER_ADDR_LEN);
2482         bcopy(etherbroadcastaddr, mask, ETHER_ADDR_LEN);
2483
2484         IF_ADDR_LOCK(ifp);
2485         TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
2486                 u_char *addrp;
2487
2488                 if (ifma->ifma_addr->sa_family != AF_LINK)
2489                         continue;
2490
2491                 addrp = LLADDR((struct sockaddr_dl *) ifma->ifma_addr);
2492                 for (i = 0; i < ETHER_ADDR_LEN; i++) {
2493                         u_int8_t mcaddr = addrp[i];
2494                         addr[i] &= mcaddr;
2495                         mask[i] &= ~mcaddr;
2496                 }
2497         }
2498         IF_ADDR_UNLOCK(ifp);
2499
2500         for (i = 0; i < ETHER_ADDR_LEN; i++) {
2501                 mask[i] |= addr[i];
2502         }
2503
2504 done:
2505         addr[0] |= 0x01;        /* make sure multicast bit is set */
2506
2507         NFE_WRITE(sc, NFE_MULTIADDR_HI,
2508             addr[3] << 24 | addr[2] << 16 | addr[1] << 8 | addr[0]);
2509         NFE_WRITE(sc, NFE_MULTIADDR_LO,
2510             addr[5] <<  8 | addr[4]);
2511         NFE_WRITE(sc, NFE_MULTIMASK_HI,
2512             mask[3] << 24 | mask[2] << 16 | mask[1] << 8 | mask[0]);
2513         NFE_WRITE(sc, NFE_MULTIMASK_LO,
2514             mask[5] <<  8 | mask[4]);
2515
2516         filter = NFE_READ(sc, NFE_RXFILTER);
2517         filter &= NFE_PFF_RX_PAUSE;
2518         filter |= NFE_RXFILTER_MAGIC;
2519         filter |= (ifp->if_flags & IFF_PROMISC) ? NFE_PFF_PROMISC : NFE_PFF_U2M;
2520         NFE_WRITE(sc, NFE_RXFILTER, filter);
2521 }
2522
2523
2524 static void
2525 nfe_tx_task(void *arg, int pending)
2526 {
2527         struct ifnet *ifp;
2528
2529         ifp = (struct ifnet *)arg;
2530         nfe_start(ifp);
2531 }
2532
2533
2534 static void
2535 nfe_start(struct ifnet *ifp)
2536 {
2537         struct nfe_softc *sc = ifp->if_softc;
2538         struct mbuf *m0;
2539         int enq;
2540
2541         NFE_LOCK(sc);
2542
2543         if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
2544             IFF_DRV_RUNNING || sc->nfe_link == 0) {
2545                 NFE_UNLOCK(sc);
2546                 return;
2547         }
2548
2549         for (enq = 0; !IFQ_DRV_IS_EMPTY(&ifp->if_snd);) {
2550                 IFQ_DRV_DEQUEUE(&ifp->if_snd, m0);
2551                 if (m0 == NULL)
2552                         break;
2553
2554                 if (nfe_encap(sc, &m0) != 0) {
2555                         if (m0 == NULL)
2556                                 break;
2557                         IFQ_DRV_PREPEND(&ifp->if_snd, m0);
2558                         ifp->if_drv_flags |= IFF_DRV_OACTIVE;
2559                         break;
2560                 }
2561                 enq++;
2562                 ETHER_BPF_MTAP(ifp, m0);
2563         }
2564
2565         if (enq > 0) {
2566                 bus_dmamap_sync(sc->txq.tx_desc_tag, sc->txq.tx_desc_map,
2567                     BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2568
2569                 /* kick Tx */
2570                 NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_KICKTX | sc->rxtxctl);
2571
2572                 /*
2573                  * Set a timeout in case the chip goes out to lunch.
2574                  */
2575                 sc->nfe_watchdog_timer = 5;
2576         }
2577
2578         NFE_UNLOCK(sc);
2579 }
2580
2581
2582 static void
2583 nfe_watchdog(struct ifnet *ifp)
2584 {
2585         struct nfe_softc *sc = ifp->if_softc;
2586
2587         if (sc->nfe_watchdog_timer == 0 || --sc->nfe_watchdog_timer)
2588                 return;
2589
2590         /* Check if we've lost Tx completion interrupt. */
2591         nfe_txeof(sc);
2592         if (sc->txq.queued == 0) {
2593                 if_printf(ifp, "watchdog timeout (missed Tx interrupts) "
2594                     "-- recovering\n");
2595                 if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
2596                         taskqueue_enqueue_fast(sc->nfe_tq, &sc->nfe_tx_task);
2597                 return;
2598         }
2599         /* Check if we've lost start Tx command. */
2600         sc->nfe_force_tx++;
2601         if (sc->nfe_force_tx <= 3) {
2602                 /*
2603                  * If this is the case for watchdog timeout, the following
2604                  * code should go to nfe_txeof().
2605                  */
2606                 NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_KICKTX | sc->rxtxctl);
2607                 return;
2608         }
2609         sc->nfe_force_tx = 0;
2610
2611         if_printf(ifp, "watchdog timeout\n");
2612
2613         ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
2614         ifp->if_oerrors++;
2615         nfe_init_locked(sc);
2616 }
2617
2618
2619 static void
2620 nfe_init(void *xsc)
2621 {
2622         struct nfe_softc *sc = xsc;
2623
2624         NFE_LOCK(sc);
2625         nfe_init_locked(sc);
2626         NFE_UNLOCK(sc);
2627 }
2628
2629
2630 static void
2631 nfe_init_locked(void *xsc)
2632 {
2633         struct nfe_softc *sc = xsc;
2634         struct ifnet *ifp = sc->nfe_ifp;
2635         struct mii_data *mii;
2636         uint32_t val;
2637         int error;
2638
2639         NFE_LOCK_ASSERT(sc);
2640
2641         mii = device_get_softc(sc->nfe_miibus);
2642
2643         if (ifp->if_drv_flags & IFF_DRV_RUNNING)
2644                 return;
2645
2646         nfe_stop(ifp);
2647
2648         sc->nfe_framesize = ifp->if_mtu + NFE_RX_HEADERS;
2649
2650         nfe_init_tx_ring(sc, &sc->txq);
2651         if (sc->nfe_framesize > (MCLBYTES - ETHER_HDR_LEN))
2652                 error = nfe_init_jrx_ring(sc, &sc->jrxq);
2653         else
2654                 error = nfe_init_rx_ring(sc, &sc->rxq);
2655         if (error != 0) {
2656                 device_printf(sc->nfe_dev,
2657                     "initialization failed: no memory for rx buffers\n");
2658                 nfe_stop(ifp);
2659                 return;
2660         }
2661
2662         val = 0;
2663         if ((sc->nfe_flags & NFE_CORRECT_MACADDR) != 0)
2664                 val |= NFE_MAC_ADDR_INORDER;
2665         NFE_WRITE(sc, NFE_TX_UNK, val);
2666         NFE_WRITE(sc, NFE_STATUS, 0);
2667
2668         if ((sc->nfe_flags & NFE_TX_FLOW_CTRL) != 0)
2669                 NFE_WRITE(sc, NFE_TX_PAUSE_FRAME, NFE_TX_PAUSE_FRAME_DISABLE);
2670
2671         sc->rxtxctl = NFE_RXTX_BIT2;
2672         if (sc->nfe_flags & NFE_40BIT_ADDR)
2673                 sc->rxtxctl |= NFE_RXTX_V3MAGIC;
2674         else if (sc->nfe_flags & NFE_JUMBO_SUP)
2675                 sc->rxtxctl |= NFE_RXTX_V2MAGIC;
2676
2677         if ((ifp->if_capenable & IFCAP_RXCSUM) != 0)
2678                 sc->rxtxctl |= NFE_RXTX_RXCSUM;
2679         if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0)
2680                 sc->rxtxctl |= NFE_RXTX_VTAG_INSERT | NFE_RXTX_VTAG_STRIP;
2681
2682         NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_RESET | sc->rxtxctl);
2683         DELAY(10);
2684         NFE_WRITE(sc, NFE_RXTX_CTL, sc->rxtxctl);
2685
2686         if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0)
2687                 NFE_WRITE(sc, NFE_VTAG_CTL, NFE_VTAG_ENABLE);
2688         else
2689                 NFE_WRITE(sc, NFE_VTAG_CTL, 0);
2690
2691         NFE_WRITE(sc, NFE_SETUP_R6, 0);
2692
2693         /* set MAC address */
2694         nfe_set_macaddr(sc, IF_LLADDR(ifp));
2695
2696         /* tell MAC where rings are in memory */
2697         if (sc->nfe_framesize > MCLBYTES - ETHER_HDR_LEN) {
2698                 NFE_WRITE(sc, NFE_RX_RING_ADDR_HI,
2699                     NFE_ADDR_HI(sc->jrxq.jphysaddr));
2700                 NFE_WRITE(sc, NFE_RX_RING_ADDR_LO,
2701                     NFE_ADDR_LO(sc->jrxq.jphysaddr));
2702         } else {
2703                 NFE_WRITE(sc, NFE_RX_RING_ADDR_HI,
2704                     NFE_ADDR_HI(sc->rxq.physaddr));
2705                 NFE_WRITE(sc, NFE_RX_RING_ADDR_LO,
2706                     NFE_ADDR_LO(sc->rxq.physaddr));
2707         }
2708         NFE_WRITE(sc, NFE_TX_RING_ADDR_HI, NFE_ADDR_HI(sc->txq.physaddr));
2709         NFE_WRITE(sc, NFE_TX_RING_ADDR_LO, NFE_ADDR_LO(sc->txq.physaddr));
2710
2711         NFE_WRITE(sc, NFE_RING_SIZE,
2712             (NFE_RX_RING_COUNT - 1) << 16 |
2713             (NFE_TX_RING_COUNT - 1));
2714
2715         NFE_WRITE(sc, NFE_RXBUFSZ, sc->nfe_framesize);
2716
2717         /* force MAC to wakeup */
2718         val = NFE_READ(sc, NFE_PWR_STATE);
2719         if ((val & NFE_PWR_WAKEUP) == 0)
2720                 NFE_WRITE(sc, NFE_PWR_STATE, val | NFE_PWR_WAKEUP);
2721         DELAY(10);
2722         val = NFE_READ(sc, NFE_PWR_STATE);
2723         NFE_WRITE(sc, NFE_PWR_STATE, val | NFE_PWR_VALID);
2724
2725 #if 1
2726         /* configure interrupts coalescing/mitigation */
2727         NFE_WRITE(sc, NFE_IMTIMER, NFE_IM_DEFAULT);
2728 #else
2729         /* no interrupt mitigation: one interrupt per packet */
2730         NFE_WRITE(sc, NFE_IMTIMER, 970);
2731 #endif
2732
2733         NFE_WRITE(sc, NFE_SETUP_R1, NFE_R1_MAGIC_10_100);
2734         NFE_WRITE(sc, NFE_SETUP_R2, NFE_R2_MAGIC);
2735         NFE_WRITE(sc, NFE_SETUP_R6, NFE_R6_MAGIC);
2736
2737         /* update MAC knowledge of PHY; generates a NFE_IRQ_LINK interrupt */
2738         NFE_WRITE(sc, NFE_STATUS, sc->mii_phyaddr << 24 | NFE_STATUS_MAGIC);
2739
2740         NFE_WRITE(sc, NFE_SETUP_R4, NFE_R4_MAGIC);
2741         NFE_WRITE(sc, NFE_WOL_CTL, NFE_WOL_MAGIC);
2742
2743         sc->rxtxctl &= ~NFE_RXTX_BIT2;
2744         NFE_WRITE(sc, NFE_RXTX_CTL, sc->rxtxctl);
2745         DELAY(10);
2746         NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_BIT1 | sc->rxtxctl);
2747
2748         /* set Rx filter */
2749         nfe_setmulti(sc);
2750
2751         /* enable Rx */
2752         NFE_WRITE(sc, NFE_RX_CTL, NFE_RX_START);
2753
2754         /* enable Tx */
2755         NFE_WRITE(sc, NFE_TX_CTL, NFE_TX_START);
2756
2757         NFE_WRITE(sc, NFE_PHY_STATUS, 0xf);
2758
2759         /* Clear hardware stats. */
2760         nfe_stats_clear(sc);
2761
2762 #ifdef DEVICE_POLLING
2763         if (ifp->if_capenable & IFCAP_POLLING)
2764                 nfe_disable_intr(sc);
2765         else
2766 #endif
2767         nfe_set_intr(sc);
2768         nfe_enable_intr(sc); /* enable interrupts */
2769
2770         ifp->if_drv_flags |= IFF_DRV_RUNNING;
2771         ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
2772
2773         sc->nfe_link = 0;
2774         mii_mediachg(mii);
2775
2776         callout_reset(&sc->nfe_stat_ch, hz, nfe_tick, sc);
2777 }
2778
2779
2780 static void
2781 nfe_stop(struct ifnet *ifp)
2782 {
2783         struct nfe_softc *sc = ifp->if_softc;
2784         struct nfe_rx_ring *rx_ring;
2785         struct nfe_jrx_ring *jrx_ring;
2786         struct nfe_tx_ring *tx_ring;
2787         struct nfe_rx_data *rdata;
2788         struct nfe_tx_data *tdata;
2789         int i;
2790
2791         NFE_LOCK_ASSERT(sc);
2792
2793         sc->nfe_watchdog_timer = 0;
2794         ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
2795
2796         callout_stop(&sc->nfe_stat_ch);
2797
2798         /* abort Tx */
2799         NFE_WRITE(sc, NFE_TX_CTL, 0);
2800
2801         /* disable Rx */
2802         NFE_WRITE(sc, NFE_RX_CTL, 0);
2803
2804         /* disable interrupts */
2805         nfe_disable_intr(sc);
2806
2807         sc->nfe_link = 0;
2808
2809         /* free Rx and Tx mbufs still in the queues. */
2810         rx_ring = &sc->rxq;
2811         for (i = 0; i < NFE_RX_RING_COUNT; i++) {
2812                 rdata = &rx_ring->data[i];
2813                 if (rdata->m != NULL) {
2814                         bus_dmamap_sync(rx_ring->rx_data_tag,
2815                             rdata->rx_data_map, BUS_DMASYNC_POSTREAD);
2816                         bus_dmamap_unload(rx_ring->rx_data_tag,
2817                             rdata->rx_data_map);
2818                         m_freem(rdata->m);
2819                         rdata->m = NULL;
2820                 }
2821         }
2822
2823         if ((sc->nfe_flags & NFE_JUMBO_SUP) != 0) {
2824                 jrx_ring = &sc->jrxq;
2825                 for (i = 0; i < NFE_JUMBO_RX_RING_COUNT; i++) {
2826                         rdata = &jrx_ring->jdata[i];
2827                         if (rdata->m != NULL) {
2828                                 bus_dmamap_sync(jrx_ring->jrx_data_tag,
2829                                     rdata->rx_data_map, BUS_DMASYNC_POSTREAD);
2830                                 bus_dmamap_unload(jrx_ring->jrx_data_tag,
2831                                     rdata->rx_data_map);
2832                                 m_freem(rdata->m);
2833                                 rdata->m = NULL;
2834                         }
2835                 }
2836         }
2837
2838         tx_ring = &sc->txq;
2839         for (i = 0; i < NFE_RX_RING_COUNT; i++) {
2840                 tdata = &tx_ring->data[i];
2841                 if (tdata->m != NULL) {
2842                         bus_dmamap_sync(tx_ring->tx_data_tag,
2843                             tdata->tx_data_map, BUS_DMASYNC_POSTWRITE);
2844                         bus_dmamap_unload(tx_ring->tx_data_tag,
2845                             tdata->tx_data_map);
2846                         m_freem(tdata->m);
2847                         tdata->m = NULL;
2848                 }
2849         }
2850         /* Update hardware stats. */
2851         nfe_stats_update(sc);
2852 }
2853
2854
2855 static int
2856 nfe_ifmedia_upd(struct ifnet *ifp)
2857 {
2858         struct nfe_softc *sc = ifp->if_softc;
2859         struct mii_data *mii;
2860
2861         NFE_LOCK(sc);
2862         mii = device_get_softc(sc->nfe_miibus);
2863         mii_mediachg(mii);
2864         NFE_UNLOCK(sc);
2865
2866         return (0);
2867 }
2868
2869
2870 static void
2871 nfe_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
2872 {
2873         struct nfe_softc *sc;
2874         struct mii_data *mii;
2875
2876         sc = ifp->if_softc;
2877
2878         NFE_LOCK(sc);
2879         mii = device_get_softc(sc->nfe_miibus);
2880         mii_pollstat(mii);
2881         NFE_UNLOCK(sc);
2882
2883         ifmr->ifm_active = mii->mii_media_active;
2884         ifmr->ifm_status = mii->mii_media_status;
2885 }
2886
2887
2888 void
2889 nfe_tick(void *xsc)
2890 {
2891         struct nfe_softc *sc;
2892         struct mii_data *mii;
2893         struct ifnet *ifp;
2894
2895         sc = (struct nfe_softc *)xsc;
2896
2897         NFE_LOCK_ASSERT(sc);
2898
2899         ifp = sc->nfe_ifp;
2900
2901         mii = device_get_softc(sc->nfe_miibus);
2902         mii_tick(mii);
2903         nfe_stats_update(sc);
2904         nfe_watchdog(ifp);
2905         callout_reset(&sc->nfe_stat_ch, hz, nfe_tick, sc);
2906 }
2907
2908
2909 static int
2910 nfe_shutdown(device_t dev)
2911 {
2912         struct nfe_softc *sc;
2913         struct ifnet *ifp;
2914
2915         sc = device_get_softc(dev);
2916
2917         NFE_LOCK(sc);
2918         ifp = sc->nfe_ifp;
2919         nfe_stop(ifp);
2920         /* nfe_reset(sc); */
2921         NFE_UNLOCK(sc);
2922
2923         return (0);
2924 }
2925
2926
2927 static void
2928 nfe_get_macaddr(struct nfe_softc *sc, uint8_t *addr)
2929 {
2930         uint32_t val;
2931
2932         if ((sc->nfe_flags & NFE_CORRECT_MACADDR) == 0) {
2933                 val = NFE_READ(sc, NFE_MACADDR_LO);
2934                 addr[0] = (val >> 8) & 0xff;
2935                 addr[1] = (val & 0xff);
2936
2937                 val = NFE_READ(sc, NFE_MACADDR_HI);
2938                 addr[2] = (val >> 24) & 0xff;
2939                 addr[3] = (val >> 16) & 0xff;
2940                 addr[4] = (val >>  8) & 0xff;
2941                 addr[5] = (val & 0xff);
2942         } else {
2943                 val = NFE_READ(sc, NFE_MACADDR_LO);
2944                 addr[5] = (val >> 8) & 0xff;
2945                 addr[4] = (val & 0xff);
2946
2947                 val = NFE_READ(sc, NFE_MACADDR_HI);
2948                 addr[3] = (val >> 24) & 0xff;
2949                 addr[2] = (val >> 16) & 0xff;
2950                 addr[1] = (val >>  8) & 0xff;
2951                 addr[0] = (val & 0xff);
2952         }
2953 }
2954
2955
2956 static void
2957 nfe_set_macaddr(struct nfe_softc *sc, uint8_t *addr)
2958 {
2959
2960         NFE_WRITE(sc, NFE_MACADDR_LO, addr[5] <<  8 | addr[4]);
2961         NFE_WRITE(sc, NFE_MACADDR_HI, addr[3] << 24 | addr[2] << 16 |
2962             addr[1] << 8 | addr[0]);
2963 }
2964
2965
2966 /*
2967  * Map a single buffer address.
2968  */
2969
2970 static void
2971 nfe_dma_map_segs(void *arg, bus_dma_segment_t *segs, int nseg, int error)
2972 {
2973         struct nfe_dmamap_arg *ctx;
2974
2975         if (error != 0)
2976                 return;
2977
2978         KASSERT(nseg == 1, ("too many DMA segments, %d should be 1", nseg));
2979
2980         ctx = (struct nfe_dmamap_arg *)arg;
2981         ctx->nfe_busaddr = segs[0].ds_addr;
2982 }
2983
2984
2985 static int
2986 sysctl_int_range(SYSCTL_HANDLER_ARGS, int low, int high)
2987 {
2988         int error, value;
2989
2990         if (!arg1)
2991                 return (EINVAL);
2992         value = *(int *)arg1;
2993         error = sysctl_handle_int(oidp, &value, 0, req);
2994         if (error || !req->newptr)
2995                 return (error);
2996         if (value < low || value > high)
2997                 return (EINVAL);
2998         *(int *)arg1 = value;
2999
3000         return (0);
3001 }
3002
3003
3004 static int
3005 sysctl_hw_nfe_proc_limit(SYSCTL_HANDLER_ARGS)
3006 {
3007
3008         return (sysctl_int_range(oidp, arg1, arg2, req, NFE_PROC_MIN,
3009             NFE_PROC_MAX));
3010 }
3011
3012
3013 #define NFE_SYSCTL_STAT_ADD32(c, h, n, p, d)    \
3014             SYSCTL_ADD_UINT(c, h, OID_AUTO, n, CTLFLAG_RD, p, 0, d)
3015 #define NFE_SYSCTL_STAT_ADD64(c, h, n, p, d)    \
3016             SYSCTL_ADD_ULONG(c, h, OID_AUTO, n, CTLFLAG_RD, p, d)
3017
3018 static void
3019 nfe_sysctl_node(struct nfe_softc *sc)
3020 {
3021         struct sysctl_ctx_list *ctx;
3022         struct sysctl_oid_list *child, *parent;
3023         struct sysctl_oid *tree;
3024         struct nfe_hw_stats *stats;
3025         int error;
3026
3027         stats = &sc->nfe_stats;
3028         ctx = device_get_sysctl_ctx(sc->nfe_dev);
3029         child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->nfe_dev));
3030         SYSCTL_ADD_PROC(ctx, child,
3031             OID_AUTO, "process_limit", CTLTYPE_INT | CTLFLAG_RW,
3032             &sc->nfe_process_limit, 0, sysctl_hw_nfe_proc_limit, "I",
3033             "max number of Rx events to process");
3034
3035         sc->nfe_process_limit = NFE_PROC_DEFAULT;
3036         error = resource_int_value(device_get_name(sc->nfe_dev),
3037             device_get_unit(sc->nfe_dev), "process_limit",
3038             &sc->nfe_process_limit);
3039         if (error == 0) {
3040                 if (sc->nfe_process_limit < NFE_PROC_MIN ||
3041                     sc->nfe_process_limit > NFE_PROC_MAX) {
3042                         device_printf(sc->nfe_dev,
3043                             "process_limit value out of range; "
3044                             "using default: %d\n", NFE_PROC_DEFAULT);
3045                         sc->nfe_process_limit = NFE_PROC_DEFAULT;
3046                 }
3047         }
3048
3049         if ((sc->nfe_flags & (NFE_MIB_V1 | NFE_MIB_V2 | NFE_MIB_V3)) == 0)
3050                 return;
3051
3052         tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", CTLFLAG_RD,
3053             NULL, "NFE statistics");
3054         parent = SYSCTL_CHILDREN(tree);
3055
3056         /* Rx statistics. */
3057         tree = SYSCTL_ADD_NODE(ctx, parent, OID_AUTO, "rx", CTLFLAG_RD,
3058             NULL, "Rx MAC statistics");
3059         child = SYSCTL_CHILDREN(tree);
3060
3061         NFE_SYSCTL_STAT_ADD32(ctx, child, "frame_errors",
3062             &stats->rx_frame_errors, "Framing Errors");
3063         NFE_SYSCTL_STAT_ADD32(ctx, child, "extra_bytes",
3064             &stats->rx_extra_bytes, "Extra Bytes");
3065         NFE_SYSCTL_STAT_ADD32(ctx, child, "late_cols",
3066             &stats->rx_late_cols, "Late Collisions");
3067         NFE_SYSCTL_STAT_ADD32(ctx, child, "runts",
3068             &stats->rx_runts, "Runts");
3069         NFE_SYSCTL_STAT_ADD32(ctx, child, "jumbos",
3070             &stats->rx_jumbos, "Jumbos");
3071         NFE_SYSCTL_STAT_ADD32(ctx, child, "fifo_overuns",
3072             &stats->rx_fifo_overuns, "FIFO Overruns");
3073         NFE_SYSCTL_STAT_ADD32(ctx, child, "crc_errors",
3074             &stats->rx_crc_errors, "CRC Errors");
3075         NFE_SYSCTL_STAT_ADD32(ctx, child, "fae",
3076             &stats->rx_fae, "Frame Alignment Errors");
3077         NFE_SYSCTL_STAT_ADD32(ctx, child, "len_errors",
3078             &stats->rx_len_errors, "Length Errors");
3079         NFE_SYSCTL_STAT_ADD32(ctx, child, "unicast",
3080             &stats->rx_unicast, "Unicast Frames");
3081         NFE_SYSCTL_STAT_ADD32(ctx, child, "multicast",
3082             &stats->rx_multicast, "Multicast Frames");
3083         NFE_SYSCTL_STAT_ADD32(ctx, child, "broadcast",
3084             &stats->rx_broadcast, "Broadcast Frames");
3085         if ((sc->nfe_flags & NFE_MIB_V2) != 0) {
3086                 NFE_SYSCTL_STAT_ADD64(ctx, child, "octets",
3087                     &stats->rx_octets, "Octets");
3088                 NFE_SYSCTL_STAT_ADD32(ctx, child, "pause",
3089                     &stats->rx_pause, "Pause frames");
3090                 NFE_SYSCTL_STAT_ADD32(ctx, child, "drops",
3091                     &stats->rx_drops, "Drop frames");
3092         }
3093
3094         /* Tx statistics. */
3095         tree = SYSCTL_ADD_NODE(ctx, parent, OID_AUTO, "tx", CTLFLAG_RD,
3096             NULL, "Tx MAC statistics");
3097         child = SYSCTL_CHILDREN(tree);
3098         NFE_SYSCTL_STAT_ADD64(ctx, child, "octets",
3099             &stats->tx_octets, "Octets");
3100         NFE_SYSCTL_STAT_ADD32(ctx, child, "zero_rexmits",
3101             &stats->tx_zero_rexmits, "Zero Retransmits");
3102         NFE_SYSCTL_STAT_ADD32(ctx, child, "one_rexmits",
3103             &stats->tx_one_rexmits, "One Retransmits");
3104         NFE_SYSCTL_STAT_ADD32(ctx, child, "multi_rexmits",
3105             &stats->tx_multi_rexmits, "Multiple Retransmits");
3106         NFE_SYSCTL_STAT_ADD32(ctx, child, "late_cols",
3107             &stats->tx_late_cols, "Late Collisions");
3108         NFE_SYSCTL_STAT_ADD32(ctx, child, "fifo_underuns",
3109             &stats->tx_fifo_underuns, "FIFO Underruns");
3110         NFE_SYSCTL_STAT_ADD32(ctx, child, "carrier_losts",
3111             &stats->tx_carrier_losts, "Carrier Losts");
3112         NFE_SYSCTL_STAT_ADD32(ctx, child, "excess_deferrals",
3113             &stats->tx_excess_deferals, "Excess Deferrals");
3114         NFE_SYSCTL_STAT_ADD32(ctx, child, "retry_errors",
3115             &stats->tx_retry_errors, "Retry Errors");
3116         if ((sc->nfe_flags & NFE_MIB_V2) != 0) {
3117                 NFE_SYSCTL_STAT_ADD32(ctx, child, "deferrals",
3118                     &stats->tx_deferals, "Deferrals");
3119                 NFE_SYSCTL_STAT_ADD32(ctx, child, "frames",
3120                     &stats->tx_frames, "Frames");
3121                 NFE_SYSCTL_STAT_ADD32(ctx, child, "pause",
3122                     &stats->tx_pause, "Pause Frames");
3123         }
3124         if ((sc->nfe_flags & NFE_MIB_V3) != 0) {
3125                 NFE_SYSCTL_STAT_ADD32(ctx, child, "unicast",
3126                     &stats->tx_deferals, "Unicast Frames");
3127                 NFE_SYSCTL_STAT_ADD32(ctx, child, "multicast",
3128                     &stats->tx_frames, "Multicast Frames");
3129                 NFE_SYSCTL_STAT_ADD32(ctx, child, "broadcast",
3130                     &stats->tx_pause, "Broadcast Frames");
3131         }
3132 }
3133
3134 #undef NFE_SYSCTL_STAT_ADD32
3135 #undef NFE_SYSCTL_STAT_ADD64
3136
3137 static void
3138 nfe_stats_clear(struct nfe_softc *sc)
3139 {
3140         int i, mib_cnt;
3141
3142         if ((sc->nfe_flags & NFE_MIB_V1) != 0)
3143                 mib_cnt = NFE_NUM_MIB_STATV1;
3144         else if ((sc->nfe_flags & (NFE_MIB_V2 | NFE_MIB_V3)) != 0)
3145                 mib_cnt = NFE_NUM_MIB_STATV2;
3146         else
3147                 return;
3148
3149         for (i = 0; i < mib_cnt; i += sizeof(uint32_t))
3150                 NFE_READ(sc, NFE_TX_OCTET + i);
3151
3152         if ((sc->nfe_flags & NFE_MIB_V3) != 0) {
3153                 NFE_READ(sc, NFE_TX_UNICAST);
3154                 NFE_READ(sc, NFE_TX_MULTICAST);
3155                 NFE_READ(sc, NFE_TX_BROADCAST);
3156         }
3157 }
3158
3159 static void
3160 nfe_stats_update(struct nfe_softc *sc)
3161 {
3162         struct nfe_hw_stats *stats;
3163
3164         NFE_LOCK_ASSERT(sc);
3165
3166         if ((sc->nfe_flags & (NFE_MIB_V1 | NFE_MIB_V2 | NFE_MIB_V3)) == 0)
3167                 return;
3168
3169         stats = &sc->nfe_stats;
3170         stats->tx_octets += NFE_READ(sc, NFE_TX_OCTET);
3171         stats->tx_zero_rexmits += NFE_READ(sc, NFE_TX_ZERO_REXMIT);
3172         stats->tx_one_rexmits += NFE_READ(sc, NFE_TX_ONE_REXMIT);
3173         stats->tx_multi_rexmits += NFE_READ(sc, NFE_TX_MULTI_REXMIT);
3174         stats->tx_late_cols += NFE_READ(sc, NFE_TX_LATE_COL);
3175         stats->tx_fifo_underuns += NFE_READ(sc, NFE_TX_FIFO_UNDERUN);
3176         stats->tx_carrier_losts += NFE_READ(sc, NFE_TX_CARRIER_LOST);
3177         stats->tx_excess_deferals += NFE_READ(sc, NFE_TX_EXCESS_DEFERRAL);
3178         stats->tx_retry_errors += NFE_READ(sc, NFE_TX_RETRY_ERROR);
3179         stats->rx_frame_errors += NFE_READ(sc, NFE_RX_FRAME_ERROR);
3180         stats->rx_extra_bytes += NFE_READ(sc, NFE_RX_EXTRA_BYTES);
3181         stats->rx_late_cols += NFE_READ(sc, NFE_RX_LATE_COL);
3182         stats->rx_runts += NFE_READ(sc, NFE_RX_RUNT);
3183         stats->rx_jumbos += NFE_READ(sc, NFE_RX_JUMBO);
3184         stats->rx_fifo_overuns += NFE_READ(sc, NFE_RX_FIFO_OVERUN);
3185         stats->rx_crc_errors += NFE_READ(sc, NFE_RX_CRC_ERROR);
3186         stats->rx_fae += NFE_READ(sc, NFE_RX_FAE);
3187         stats->rx_len_errors += NFE_READ(sc, NFE_RX_LEN_ERROR);
3188         stats->rx_unicast += NFE_READ(sc, NFE_RX_UNICAST);
3189         stats->rx_multicast += NFE_READ(sc, NFE_RX_MULTICAST);
3190         stats->rx_broadcast += NFE_READ(sc, NFE_RX_BROADCAST);
3191
3192         if ((sc->nfe_flags & NFE_MIB_V2) != 0) {
3193                 stats->tx_deferals += NFE_READ(sc, NFE_TX_DEFERAL);
3194                 stats->tx_frames += NFE_READ(sc, NFE_TX_FRAME);
3195                 stats->rx_octets += NFE_READ(sc, NFE_RX_OCTET);
3196                 stats->tx_pause += NFE_READ(sc, NFE_TX_PAUSE);
3197                 stats->rx_pause += NFE_READ(sc, NFE_RX_PAUSE);
3198                 stats->rx_drops += NFE_READ(sc, NFE_RX_DROP);
3199         }
3200
3201         if ((sc->nfe_flags & NFE_MIB_V3) != 0) {
3202                 stats->tx_unicast += NFE_READ(sc, NFE_TX_UNICAST);
3203                 stats->tx_multicast += NFE_READ(sc, NFE_TX_MULTICAST);
3204                 stats->rx_broadcast += NFE_READ(sc, NFE_TX_BROADCAST);
3205         }
3206 }