888b680c5ad09db72f36779116d46755b1482b96
[dragonfly.git] / sys / dev / netif / ae / if_ae.c
1 /*-
2  * Copyright (c) 2008 Stanislav Sedov <stas@FreeBSD.org>.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  *
25  * Driver for Attansic Technology Corp. L2 FastEthernet adapter.
26  *
27  * This driver is heavily based on age(4) Attansic L1 driver by Pyun YongHyeon.
28  *
29  * $FreeBSD: src/sys/dev/ae/if_ae.c,v 1.1.2.3.2.1 2009/04/15 03:14:26 kensmith Exp $
30  */
31
32 #include <sys/param.h>
33 #include <sys/endian.h>
34 #include <sys/kernel.h>
35 #include <sys/bus.h>
36 #include <sys/interrupt.h>
37 #include <sys/malloc.h>
38 #include <sys/proc.h>
39 #include <sys/rman.h>
40 #include <sys/serialize.h>
41 #include <sys/socket.h>
42 #include <sys/sockio.h>
43 #include <sys/sysctl.h>
44
45 #include <net/ethernet.h>
46 #include <net/if.h>
47 #include <net/bpf.h>
48 #include <net/if_arp.h>
49 #include <net/if_dl.h>
50 #include <net/if_media.h>
51 #include <net/ifq_var.h>
52 #include <net/vlan/if_vlan_var.h>
53 #include <net/vlan/if_vlan_ether.h>
54
55 #include <bus/pci/pcireg.h>
56 #include <bus/pci/pcivar.h>
57 #include "pcidevs.h"
58
59 #include <dev/netif/mii_layer/miivar.h>
60
61 #include <dev/netif/ae/if_aereg.h>
62 #include <dev/netif/ae/if_aevar.h>
63
64 /* "device miibus" required.  See GENERIC if you get errors here. */
65 #include "miibus_if.h"
66
67 /*
68  * Devices supported by this driver.
69  */
70 static const struct ae_dev {
71         uint16_t        ae_vendorid;
72         uint16_t        ae_deviceid;
73         const char      *ae_name;
74 } ae_devs[] = {
75         { VENDORID_ATTANSIC, DEVICEID_ATTANSIC_L2,
76             "Attansic Technology Corp, L2 Fast Ethernet" },
77         /* Required last entry */
78         { 0, 0, NULL }
79 };
80
81
82 static int      ae_probe(device_t);
83 static int      ae_attach(device_t);
84 static int      ae_detach(device_t);
85 static int      ae_shutdown(device_t);
86 static int      ae_suspend(device_t);
87 static int      ae_resume(device_t);
88 static int      ae_miibus_readreg(device_t, int, int);
89 static int      ae_miibus_writereg(device_t, int, int, int);
90 static void     ae_miibus_statchg(device_t);
91
92 static int      ae_mediachange(struct ifnet *);
93 static void     ae_mediastatus(struct ifnet *, struct ifmediareq *);
94 static void     ae_init(void *);
95 static void     ae_start(struct ifnet *, struct ifaltq_subque *);
96 static int      ae_ioctl(struct ifnet *, u_long, caddr_t, struct ucred *);
97 static void     ae_watchdog(struct ifnet *);
98 static void     ae_stop(struct ae_softc *);
99 static void     ae_tick(void *);
100
101 static void     ae_intr(void *);
102 static void     ae_tx_intr(struct ae_softc *);
103 static void     ae_rx_intr(struct ae_softc *);
104 static int      ae_rxeof(struct ae_softc *, struct ae_rxd *);
105
106 static int      ae_encap(struct ae_softc *, struct mbuf **);
107 static void     ae_sysctl_node(struct ae_softc *);
108 static void     ae_phy_reset(struct ae_softc *);
109 static int      ae_reset(struct ae_softc *);
110 static void     ae_pcie_init(struct ae_softc *);
111 static void     ae_get_eaddr(struct ae_softc *);
112 static void     ae_dma_free(struct ae_softc *);
113 static int      ae_dma_alloc(struct ae_softc *);
114 static void     ae_mac_config(struct ae_softc *);
115 static void     ae_stop_rxmac(struct ae_softc *);
116 static void     ae_stop_txmac(struct ae_softc *);
117 static void     ae_rxfilter(struct ae_softc *);
118 static void     ae_rxvlan(struct ae_softc *);
119 static void     ae_update_stats_rx(uint16_t, struct ae_stats *);
120 static void     ae_update_stats_tx(uint16_t, struct ae_stats *);
121 static void     ae_powersave_disable(struct ae_softc *);
122 static void     ae_powersave_enable(struct ae_softc *);
123
124 static device_method_t ae_methods[] = {
125         /* Device interface. */
126         DEVMETHOD(device_probe,         ae_probe),
127         DEVMETHOD(device_attach,        ae_attach),
128         DEVMETHOD(device_detach,        ae_detach),
129         DEVMETHOD(device_shutdown,      ae_shutdown),
130         DEVMETHOD(device_suspend,       ae_suspend),
131         DEVMETHOD(device_resume,        ae_resume),
132         
133         /* Bus interface. */
134         DEVMETHOD(bus_print_child,      bus_generic_print_child),
135         DEVMETHOD(bus_driver_added,     bus_generic_driver_added),
136         
137         /* MII interface. */
138         DEVMETHOD(miibus_readreg,       ae_miibus_readreg),
139         DEVMETHOD(miibus_writereg,      ae_miibus_writereg),
140         DEVMETHOD(miibus_statchg,       ae_miibus_statchg),
141         { NULL, NULL }
142 };
143
144 static driver_t ae_driver = {
145         "ae",
146         ae_methods,
147         sizeof(struct ae_softc)
148 };
149
150 static devclass_t ae_devclass;
151 DECLARE_DUMMY_MODULE(if_ae);
152 MODULE_DEPEND(if_ae, miibus, 1, 1, 1);
153 DRIVER_MODULE(if_ae, pci, ae_driver, ae_devclass, NULL, NULL);
154 DRIVER_MODULE(miibus, ae, miibus_driver, miibus_devclass, NULL, NULL);
155
156 /* Register access macros. */
157 #define AE_WRITE_4(_sc, reg, val)       \
158         bus_space_write_4((_sc)->ae_mem_bt, (_sc)->ae_mem_bh, (reg), (val))
159 #define AE_WRITE_2(_sc, reg, val)       \
160         bus_space_write_2((_sc)->ae_mem_bt, (_sc)->ae_mem_bh, (reg), (val))
161 #define AE_WRITE_1(_sc, reg, val)       \
162         bus_space_write_1((_sc)->ae_mem_bt, (_sc)->ae_mem_bh, (reg), (val))
163 #define AE_READ_4(_sc, reg)             \
164         bus_space_read_4((_sc)->ae_mem_bt, (_sc)->ae_mem_bh, (reg))
165 #define AE_READ_2(_sc, reg)             \
166         bus_space_read_2((_sc)->ae_mem_bt, (_sc)->ae_mem_bh, (reg))
167 #define AE_READ_1(_sc, reg)             \
168         bus_space_read_1((_sc)->ae_mem_bt, (_sc)->ae_mem_bh, (reg))
169
170 #define AE_PHY_READ(sc, reg)            \
171         ae_miibus_readreg(sc->ae_dev, 0, reg)
172 #define AE_PHY_WRITE(sc, reg, val)      \
173         ae_miibus_writereg(sc->ae_dev, 0, reg, val)
174 #define AE_CHECK_EADDR_VALID(eaddr)     \
175         ((eaddr[0] == 0 && eaddr[1] == 0) || \
176          (eaddr[0] == 0xffffffff && eaddr[1] == 0xffff))
177 #define AE_RXD_VLAN(vtag) \
178         (((vtag) >> 4) | (((vtag) & 0x07) << 13) | (((vtag) & 0x08) << 9))
179 #define AE_TXD_VLAN(vtag) \
180         (((vtag) << 4) | (((vtag) >> 13) & 0x07) | (((vtag) >> 9) & 0x08))
181
182 /*
183  * ae statistics.
184  */
185 #define STATS_ENTRY(node, desc, field) \
186         { node, desc, offsetof(struct ae_stats, field) }
187 struct {
188         const char      *node;
189         const char      *desc;
190         intptr_t        offset;
191 } ae_stats_tx[] = {
192         STATS_ENTRY("bcast", "broadcast frames", tx_bcast),
193         STATS_ENTRY("mcast", "multicast frames", tx_mcast),
194         STATS_ENTRY("pause", "PAUSE frames", tx_pause),
195         STATS_ENTRY("control", "control frames", tx_ctrl),
196         STATS_ENTRY("defers", "deferrals occuried", tx_defer),
197         STATS_ENTRY("exc_defers", "excessive deferrals occuried", tx_excdefer),
198         STATS_ENTRY("singlecols", "single collisions occuried", tx_singlecol),
199         STATS_ENTRY("multicols", "multiple collisions occuried", tx_multicol),
200         STATS_ENTRY("latecols", "late collisions occuried", tx_latecol),
201         STATS_ENTRY("aborts", "transmit aborts due collisions", tx_abortcol),
202         STATS_ENTRY("underruns", "Tx FIFO underruns", tx_underrun)
203 }, ae_stats_rx[] = {
204         STATS_ENTRY("bcast", "broadcast frames", rx_bcast),
205         STATS_ENTRY("mcast", "multicast frames", rx_mcast),
206         STATS_ENTRY("pause", "PAUSE frames", rx_pause),
207         STATS_ENTRY("control", "control frames", rx_ctrl),
208         STATS_ENTRY("crc_errors", "frames with CRC errors", rx_crcerr),
209         STATS_ENTRY("code_errors", "frames with invalid opcode", rx_codeerr),
210         STATS_ENTRY("runt", "runt frames", rx_runt),
211         STATS_ENTRY("frag", "fragmented frames", rx_frag),
212         STATS_ENTRY("align_errors", "frames with alignment errors", rx_align),
213         STATS_ENTRY("truncated", "frames truncated due to Rx FIFO inderrun",
214             rx_trunc)
215 };
216 #define AE_STATS_RX_LEN NELEM(ae_stats_rx)
217 #define AE_STATS_TX_LEN NELEM(ae_stats_tx)
218
219 static void
220 ae_stop(struct ae_softc *sc)
221 {
222         struct ifnet *ifp = &sc->arpcom.ac_if;
223         int i;
224
225         ASSERT_SERIALIZED(ifp->if_serializer);
226
227         ifp->if_flags &= ~IFF_RUNNING;
228         ifq_clr_oactive(&ifp->if_snd);
229         ifp->if_timer = 0;
230
231         sc->ae_flags &= ~AE_FLAG_LINK;
232         callout_stop(&sc->ae_tick_ch);
233
234         /*
235          * Clear and disable interrupts.
236          */
237         AE_WRITE_4(sc, AE_IMR_REG, 0);
238         AE_WRITE_4(sc, AE_ISR_REG, 0xffffffff);
239
240         /*
241          * Stop Rx/Tx MACs.
242          */
243         ae_stop_txmac(sc);
244         ae_stop_rxmac(sc);
245
246         /*
247          * Stop DMA engines.
248          */
249         AE_WRITE_1(sc, AE_DMAREAD_REG, ~AE_DMAREAD_EN);
250         AE_WRITE_1(sc, AE_DMAWRITE_REG, ~AE_DMAWRITE_EN);
251
252         /*
253          * Wait for everything to enter idle state.
254          */
255         for (i = 0; i < AE_IDLE_TIMEOUT; i++) {
256                 if (AE_READ_4(sc, AE_IDLE_REG) == 0)
257                         break;
258                 DELAY(100);
259         }
260         if (i == AE_IDLE_TIMEOUT)
261                 if_printf(ifp, "could not enter idle state in stop.\n");
262 }
263
264 static void
265 ae_stop_rxmac(struct ae_softc *sc)
266 {
267         uint32_t val;
268         int i;
269
270         /*
271          * Stop Rx MAC engine.
272          */
273         val = AE_READ_4(sc, AE_MAC_REG);
274         if ((val & AE_MAC_RX_EN) != 0) {
275                 val &= ~AE_MAC_RX_EN;
276                 AE_WRITE_4(sc, AE_MAC_REG, val);
277         }
278
279         /*
280          * Stop Rx DMA engine.
281          */
282         if (AE_READ_1(sc, AE_DMAWRITE_REG) == AE_DMAWRITE_EN)
283                 AE_WRITE_1(sc, AE_DMAWRITE_REG, 0);
284
285         /*
286          * Wait for IDLE state.
287          */
288         for (i = 0; i < AE_IDLE_TIMEOUT; i--) {
289                 val = AE_READ_4(sc, AE_IDLE_REG);
290                 if ((val & (AE_IDLE_RXMAC | AE_IDLE_DMAWRITE)) == 0)
291                         break;
292                 DELAY(100);
293         }
294         if (i == AE_IDLE_TIMEOUT) {
295                 if_printf(&sc->arpcom.ac_if,
296                           "timed out while stopping Rx MAC.\n");
297         }
298 }
299
300 static void
301 ae_stop_txmac(struct ae_softc *sc)
302 {
303         uint32_t val;
304         int i;
305
306         /*
307          * Stop Tx MAC engine.
308          */
309         val = AE_READ_4(sc, AE_MAC_REG);
310         if ((val & AE_MAC_TX_EN) != 0) {
311                 val &= ~AE_MAC_TX_EN;
312                 AE_WRITE_4(sc, AE_MAC_REG, val);
313         }
314
315         /*
316          * Stop Tx DMA engine.
317          */
318         if (AE_READ_1(sc, AE_DMAREAD_REG) == AE_DMAREAD_EN)
319                 AE_WRITE_1(sc, AE_DMAREAD_REG, 0);
320
321         /*
322          * Wait for IDLE state.
323          */
324         for (i = 0; i < AE_IDLE_TIMEOUT; i--) {
325                 val = AE_READ_4(sc, AE_IDLE_REG);
326                 if ((val & (AE_IDLE_TXMAC | AE_IDLE_DMAREAD)) == 0)
327                         break;
328                 DELAY(100);
329         }
330         if (i == AE_IDLE_TIMEOUT) {
331                 if_printf(&sc->arpcom.ac_if,
332                           "timed out while stopping Tx MAC.\n");
333         }
334 }
335
336 /*
337  * Callback from MII layer when media changes.
338  */
339 static void
340 ae_miibus_statchg(device_t dev)
341 {
342         struct ae_softc *sc = device_get_softc(dev);
343         struct ifnet *ifp = &sc->arpcom.ac_if;
344         struct mii_data *mii;
345         uint32_t val;
346
347         ASSERT_SERIALIZED(ifp->if_serializer);
348
349         if ((ifp->if_flags & IFF_RUNNING) == 0)
350                 return;
351
352         mii = device_get_softc(sc->ae_miibus);
353         sc->ae_flags &= ~AE_FLAG_LINK;
354         if ((mii->mii_media_status & IFM_AVALID) != 0) {
355                 switch (IFM_SUBTYPE(mii->mii_media_active)) {
356                 case IFM_10_T:
357                 case IFM_100_TX:
358                         sc->ae_flags |= AE_FLAG_LINK;
359                         break;
360                 default:
361                         break;
362                 }
363         }
364
365         /* Stop Rx/Tx MACs. */
366         ae_stop_rxmac(sc);
367         ae_stop_txmac(sc);
368
369         /* Program MACs with resolved speed/duplex/flow-control. */
370         if ((sc->ae_flags & AE_FLAG_LINK) != 0) {
371                 ae_mac_config(sc);
372
373                 /*
374                  * Restart DMA engines.
375                  */
376                 AE_WRITE_1(sc, AE_DMAREAD_REG, AE_DMAREAD_EN);
377                 AE_WRITE_1(sc, AE_DMAWRITE_REG, AE_DMAWRITE_EN);
378
379                 /*
380                  * Enable Rx and Tx MACs.
381                  */
382                 val = AE_READ_4(sc, AE_MAC_REG);
383                 val |= AE_MAC_TX_EN | AE_MAC_RX_EN;
384                 AE_WRITE_4(sc, AE_MAC_REG, val);
385         }
386 }
387
388 static void
389 ae_sysctl_node(struct ae_softc *sc)
390 {
391         struct sysctl_ctx_list *ctx;
392         struct sysctl_oid *root, *stats, *stats_rx, *stats_tx;
393         struct ae_stats *ae_stats;
394         unsigned int i;
395
396         ae_stats = &sc->stats;
397         sysctl_ctx_init(&sc->ae_sysctl_ctx);
398         sc->ae_sysctl_tree = SYSCTL_ADD_NODE(&sc->ae_sysctl_ctx,
399                                 SYSCTL_STATIC_CHILDREN(_hw), OID_AUTO,
400                                 device_get_nameunit(sc->ae_dev),
401                                 CTLFLAG_RD, 0, "");
402         if (sc->ae_sysctl_tree == NULL) {
403                 device_printf(sc->ae_dev, "can't add sysctl node\n");
404                 return;
405         }
406         ctx = &sc->ae_sysctl_ctx;
407         root = sc->ae_sysctl_tree;
408
409         stats = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(root), OID_AUTO, "stats",
410             CTLFLAG_RD, NULL, "ae statistics");
411         if (stats == NULL) {
412                 device_printf(sc->ae_dev, "can't add stats sysctl node\n");
413                 return;
414         }
415
416         /*
417          * Receiver statistcics.
418          */
419         stats_rx = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, "rx",
420             CTLFLAG_RD, NULL, "Rx MAC statistics");
421         if (stats_rx != NULL) {
422                 for (i = 0; i < AE_STATS_RX_LEN; i++) {
423                         SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(stats_rx),
424                             OID_AUTO, ae_stats_rx[i].node, CTLFLAG_RD,
425                             (char *)ae_stats + ae_stats_rx[i].offset, 0,
426                             ae_stats_rx[i].desc);
427                 }
428         }
429
430         /*
431          * Transmitter statistcics.
432          */
433         stats_tx = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, "tx",
434             CTLFLAG_RD, NULL, "Tx MAC statistics");
435         if (stats_tx != NULL) {
436                 for (i = 0; i < AE_STATS_TX_LEN; i++) {
437                         SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(stats_tx),
438                             OID_AUTO, ae_stats_tx[i].node, CTLFLAG_RD,
439                             (char *)ae_stats + ae_stats_tx[i].offset, 0,
440                             ae_stats_tx[i].desc);
441                 }
442         }
443 }
444
445 static int
446 ae_miibus_readreg(device_t dev, int phy, int reg)
447 {
448         struct ae_softc *sc = device_get_softc(dev);
449         uint32_t val;
450         int i;
451
452         /*
453          * Locking is done in upper layers.
454          */
455         if (phy != sc->ae_phyaddr)
456                 return (0);
457         val = ((reg << AE_MDIO_REGADDR_SHIFT) & AE_MDIO_REGADDR_MASK) |
458             AE_MDIO_START | AE_MDIO_READ | AE_MDIO_SUP_PREAMBLE |
459             ((AE_MDIO_CLK_25_4 << AE_MDIO_CLK_SHIFT) & AE_MDIO_CLK_MASK);
460         AE_WRITE_4(sc, AE_MDIO_REG, val);
461
462         /*
463          * Wait for operation to complete.
464          */
465         for (i = 0; i < AE_MDIO_TIMEOUT; i++) {
466                 DELAY(2);
467                 val = AE_READ_4(sc, AE_MDIO_REG);
468                 if ((val & (AE_MDIO_START | AE_MDIO_BUSY)) == 0)
469                         break;
470         }
471         if (i == AE_MDIO_TIMEOUT) {
472                 device_printf(sc->ae_dev, "phy read timeout: %d.\n", reg);
473                 return (0);
474         }
475         return ((val << AE_MDIO_DATA_SHIFT) & AE_MDIO_DATA_MASK);
476 }
477
478 static int
479 ae_miibus_writereg(device_t dev, int phy, int reg, int val)
480 {
481         struct ae_softc *sc = device_get_softc(dev);
482         uint32_t aereg;
483         int i;
484
485         /*
486          * Locking is done in upper layers.
487          */
488         if (phy != sc->ae_phyaddr)
489                 return (0);
490         aereg = ((reg << AE_MDIO_REGADDR_SHIFT) & AE_MDIO_REGADDR_MASK) |
491             AE_MDIO_START | AE_MDIO_SUP_PREAMBLE |
492             ((AE_MDIO_CLK_25_4 << AE_MDIO_CLK_SHIFT) & AE_MDIO_CLK_MASK) |
493             ((val << AE_MDIO_DATA_SHIFT) & AE_MDIO_DATA_MASK);
494         AE_WRITE_4(sc, AE_MDIO_REG, aereg);
495
496         /*
497          * Wait for operation to complete.
498          */
499         for (i = 0; i < AE_MDIO_TIMEOUT; i++) {
500                 DELAY(2);
501                 aereg = AE_READ_4(sc, AE_MDIO_REG);
502                 if ((aereg & (AE_MDIO_START | AE_MDIO_BUSY)) == 0)
503                         break;
504         }
505         if (i == AE_MDIO_TIMEOUT)
506                 device_printf(sc->ae_dev, "phy write timeout: %d.\n", reg);
507         return (0);
508 }
509
510 static int
511 ae_probe(device_t dev)
512 {
513         uint16_t vendor, devid;
514         const struct ae_dev *sp;
515
516         vendor = pci_get_vendor(dev);
517         devid = pci_get_device(dev);
518         for (sp = ae_devs; sp->ae_name != NULL; sp++) {
519                 if (vendor == sp->ae_vendorid &&
520                     devid == sp->ae_deviceid) {
521                         device_set_desc(dev, sp->ae_name);
522                         return (0);
523                 }
524         }
525         return (ENXIO);
526 }
527
528 static int
529 ae_dma_alloc(struct ae_softc *sc)
530 {
531         bus_addr_t busaddr;
532         int error;
533
534         /*
535          * Create parent DMA tag.
536          */
537         error = bus_dma_tag_create(NULL, 1, 0,
538                                    BUS_SPACE_MAXADDR_32BIT,
539                                    BUS_SPACE_MAXADDR,
540                                    NULL, NULL,
541                                    BUS_SPACE_MAXSIZE_32BIT,
542                                    0,
543                                    BUS_SPACE_MAXSIZE_32BIT,
544                                    0, &sc->dma_parent_tag);
545         if (error) {
546                 device_printf(sc->ae_dev, "could not creare parent DMA tag.\n");
547                 return (error);
548         }
549
550         /*
551          * Create DMA stuffs for TxD.
552          */
553         sc->txd_base = bus_dmamem_coherent_any(sc->dma_parent_tag, 4,
554                         AE_TXD_BUFSIZE_DEFAULT, BUS_DMA_WAITOK | BUS_DMA_ZERO,
555                         &sc->dma_txd_tag, &sc->dma_txd_map,
556                         &sc->dma_txd_busaddr);
557         if (sc->txd_base == NULL) {
558                 device_printf(sc->ae_dev, "could not creare TxD DMA stuffs.\n");
559                 return ENOMEM;
560         }
561
562         /*
563          * Create DMA stuffs for TxS.
564          */
565         sc->txs_base = bus_dmamem_coherent_any(sc->dma_parent_tag, 4,
566                         AE_TXS_COUNT_DEFAULT * 4, BUS_DMA_WAITOK | BUS_DMA_ZERO,
567                         &sc->dma_txs_tag, &sc->dma_txs_map,
568                         &sc->dma_txs_busaddr);
569         if (sc->txs_base == NULL) {
570                 device_printf(sc->ae_dev, "could not creare TxS DMA stuffs.\n");
571                 return ENOMEM;
572         }
573
574         /*
575          * Create DMA stuffs for RxD.
576          */
577         sc->rxd_base_dma = bus_dmamem_coherent_any(sc->dma_parent_tag, 128,
578                                 AE_RXD_COUNT_DEFAULT * 1536 + 120,
579                                 BUS_DMA_WAITOK | BUS_DMA_ZERO,
580                                 &sc->dma_rxd_tag, &sc->dma_rxd_map,
581                                 &busaddr);
582         if (sc->rxd_base_dma == NULL) {
583                 device_printf(sc->ae_dev, "could not creare RxD DMA stuffs.\n");
584                 return ENOMEM;
585         }
586         sc->dma_rxd_busaddr = busaddr + 120;
587         sc->rxd_base = (struct ae_rxd *)(sc->rxd_base_dma + 120);
588
589         return (0);
590 }
591
592 static void
593 ae_mac_config(struct ae_softc *sc)
594 {
595         struct mii_data *mii;
596         uint32_t val;
597
598         mii = device_get_softc(sc->ae_miibus);
599         val = AE_READ_4(sc, AE_MAC_REG);
600         val &= ~AE_MAC_FULL_DUPLEX;
601         /* XXX disable AE_MAC_TX_FLOW_EN? */
602         if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0)
603                 val |= AE_MAC_FULL_DUPLEX;
604         AE_WRITE_4(sc, AE_MAC_REG, val);
605 }
606
607 static int
608 ae_rxeof(struct ae_softc *sc, struct ae_rxd *rxd)
609 {
610         struct ifnet *ifp = &sc->arpcom.ac_if;
611         struct mbuf *m;
612         unsigned int size;
613         uint16_t flags;
614
615         flags = le16toh(rxd->flags);
616 #ifdef AE_DEBUG
617         if_printf(ifp, "Rx interrupt occuried.\n");
618 #endif
619         size = le16toh(rxd->len) - ETHER_CRC_LEN;
620         if (size < (ETHER_MIN_LEN - ETHER_CRC_LEN -
621                     sizeof(struct ether_vlan_header))) {
622                 if_printf(ifp, "Runt frame received.");
623                 return (EIO);
624         }
625
626         m = m_devget(&rxd->data[0], size, ETHER_ALIGN, ifp, NULL);
627         if (m == NULL)
628                 return (ENOBUFS);
629
630         if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) &&
631             (flags & AE_RXD_HAS_VLAN)) {
632                 m->m_pkthdr.ether_vlantag = AE_RXD_VLAN(le16toh(rxd->vlan));
633                 m->m_flags |= M_VLANTAG;
634         }
635         ifp->if_input(ifp, m);
636
637         return (0);
638 }
639
640 static void
641 ae_rx_intr(struct ae_softc *sc)
642 {
643         struct ifnet *ifp = &sc->arpcom.ac_if;
644         struct ae_rxd *rxd;
645         uint16_t flags;
646         int error;
647
648         /*
649          * Syncronize DMA buffers.
650          */
651         bus_dmamap_sync(sc->dma_rxd_tag, sc->dma_rxd_map,
652                         BUS_DMASYNC_POSTREAD);
653         for (;;) {
654                 rxd = (struct ae_rxd *)(sc->rxd_base + sc->rxd_cur);
655
656                 flags = le16toh(rxd->flags);
657                 if ((flags & AE_RXD_UPDATE) == 0)
658                         break;
659                 rxd->flags = htole16(flags & ~AE_RXD_UPDATE);
660
661                 /* Update stats. */
662                 ae_update_stats_rx(flags, &sc->stats);
663
664                 /*
665                  * Update position index.
666                  */
667                 sc->rxd_cur = (sc->rxd_cur + 1) % AE_RXD_COUNT_DEFAULT;
668                 if ((flags & AE_RXD_SUCCESS) == 0) {
669                         IFNET_STAT_INC(ifp, ierrors, 1);
670                         continue;
671                 }
672
673                 error = ae_rxeof(sc, rxd);
674                 if (error)
675                         IFNET_STAT_INC(ifp, ierrors, 1);
676                 else
677                         IFNET_STAT_INC(ifp, ipackets, 1);
678         }
679
680         /* Update Rx index. */
681         AE_WRITE_2(sc, AE_MB_RXD_IDX_REG, sc->rxd_cur);
682 }
683
684 static void
685 ae_tx_intr(struct ae_softc *sc)
686 {
687         struct ifnet *ifp = &sc->arpcom.ac_if;
688         struct ae_txd *txd;
689         struct ae_txs *txs;
690         uint16_t flags;
691
692         /*
693          * Syncronize DMA buffers.
694          */
695         bus_dmamap_sync(sc->dma_txd_tag, sc->dma_txd_map, BUS_DMASYNC_POSTREAD);
696         bus_dmamap_sync(sc->dma_txs_tag, sc->dma_txs_map, BUS_DMASYNC_POSTREAD);
697
698         for (;;) {
699                 txs = sc->txs_base + sc->txs_ack;
700
701                 flags = le16toh(txs->flags);
702                 if ((flags & AE_TXS_UPDATE) == 0)
703                         break;
704                 txs->flags = htole16(flags & ~AE_TXS_UPDATE);
705
706                 /* Update stats. */
707                 ae_update_stats_tx(flags, &sc->stats);
708
709                 /*
710                  * Update TxS position.
711                  */
712                 sc->txs_ack = (sc->txs_ack + 1) % AE_TXS_COUNT_DEFAULT;
713                 sc->ae_flags |= AE_FLAG_TXAVAIL;
714                 txd = (struct ae_txd *)(sc->txd_base + sc->txd_ack);
715                 if (txs->len != txd->len) {
716                         device_printf(sc->ae_dev, "Size mismatch: "
717                                 "TxS:%d TxD:%d\n",
718                                 le16toh(txs->len), le16toh(txd->len));
719                 }
720
721                 /*
722                  * Move txd ack and align on 4-byte boundary.
723                  */
724                 sc->txd_ack = ((sc->txd_ack + le16toh(txd->len) + 4 + 3) & ~3) %
725                     AE_TXD_BUFSIZE_DEFAULT;
726                 if ((flags & AE_TXS_SUCCESS) != 0)
727                         IFNET_STAT_INC(ifp, opackets, 1);
728                 else
729                         IFNET_STAT_INC(ifp, oerrors, 1);
730                 sc->tx_inproc--;
731         }
732
733         if (sc->tx_inproc < 0) {
734                 /* XXX assert? */
735                 if_printf(ifp, "Received stray Tx interrupt(s).\n");
736                 sc->tx_inproc = 0;
737         }
738         if (sc->tx_inproc == 0)
739                 ifp->if_timer = 0;      /* Unarm watchdog. */
740         if (sc->ae_flags & AE_FLAG_TXAVAIL) {
741                 ifq_clr_oactive(&ifp->if_snd);
742                 if (!ifq_is_empty(&ifp->if_snd))
743 #ifdef foo
744                         ae_intr(sc);
745 #else
746                         if_devstart(ifp);
747 #endif
748         }
749
750         /*
751          * Syncronize DMA buffers.
752          */
753         bus_dmamap_sync(sc->dma_txd_tag, sc->dma_txd_map, BUS_DMASYNC_PREWRITE);
754         bus_dmamap_sync(sc->dma_txs_tag, sc->dma_txs_map, BUS_DMASYNC_PREWRITE);
755 }
756
757 static void
758 ae_intr(void *xsc)
759 {
760         struct ae_softc *sc = xsc;
761         struct ifnet *ifp = &sc->arpcom.ac_if;
762         uint32_t val;
763
764         ASSERT_SERIALIZED(ifp->if_serializer);
765
766         val = AE_READ_4(sc, AE_ISR_REG);
767         if (val == 0 || (val & AE_IMR_DEFAULT) == 0)
768                 return;
769
770 #ifdef foo
771         AE_WRITE_4(sc, AE_ISR_REG, AE_ISR_DISABLE);
772 #endif
773
774         /* Read interrupt status. */
775         val = AE_READ_4(sc, AE_ISR_REG);
776
777         /* Clear interrupts and disable them. */
778         AE_WRITE_4(sc, AE_ISR_REG, val | AE_ISR_DISABLE);
779
780         if (ifp->if_flags & IFF_RUNNING) {
781                 if (val & (AE_ISR_DMAR_TIMEOUT |
782                            AE_ISR_DMAW_TIMEOUT |
783                            AE_ISR_PHY_LINKDOWN)) {
784                         ae_init(sc);
785                 }
786                 if (val & AE_ISR_TX_EVENT)
787                         ae_tx_intr(sc);
788                 if (val & AE_ISR_RX_EVENT)
789                         ae_rx_intr(sc);
790         }
791
792         /* Re-enable interrupts. */
793         AE_WRITE_4(sc, AE_ISR_REG, 0);
794 }
795
796 static void
797 ae_init(void *xsc)
798 {
799         struct ae_softc *sc = xsc;
800         struct ifnet *ifp = &sc->arpcom.ac_if;
801         struct mii_data *mii;
802         uint8_t eaddr[ETHER_ADDR_LEN];
803         uint32_t val;
804         bus_addr_t addr;
805
806         ASSERT_SERIALIZED(ifp->if_serializer);
807
808         mii = device_get_softc(sc->ae_miibus);
809         ae_stop(sc);
810         ae_reset(sc);
811         ae_pcie_init(sc);
812         ae_powersave_disable(sc);
813
814         /*
815          * Clear and disable interrupts.
816          */
817         AE_WRITE_4(sc, AE_ISR_REG, 0xffffffff);
818
819         /*
820          * Set the MAC address.
821          */
822         bcopy(IF_LLADDR(ifp), eaddr, ETHER_ADDR_LEN);
823         val = eaddr[2] << 24 | eaddr[3] << 16 | eaddr[4] << 8 | eaddr[5];
824         AE_WRITE_4(sc, AE_EADDR0_REG, val);
825         val = eaddr[0] << 8 | eaddr[1];
826         AE_WRITE_4(sc, AE_EADDR1_REG, val);
827
828         /*
829          * Set ring buffers base addresses.
830          */
831         addr = sc->dma_rxd_busaddr;
832         AE_WRITE_4(sc, AE_DESC_ADDR_HI_REG, BUS_ADDR_HI(addr));
833         AE_WRITE_4(sc, AE_RXD_ADDR_LO_REG, BUS_ADDR_LO(addr));
834         addr = sc->dma_txd_busaddr;
835         AE_WRITE_4(sc, AE_TXD_ADDR_LO_REG, BUS_ADDR_LO(addr));
836         addr = sc->dma_txs_busaddr;
837         AE_WRITE_4(sc, AE_TXS_ADDR_LO_REG, BUS_ADDR_LO(addr));
838
839         /*
840          * Configure ring buffers sizes.
841          */
842         AE_WRITE_2(sc, AE_RXD_COUNT_REG, AE_RXD_COUNT_DEFAULT);
843         AE_WRITE_2(sc, AE_TXD_BUFSIZE_REG, AE_TXD_BUFSIZE_DEFAULT / 4);
844         AE_WRITE_2(sc, AE_TXS_COUNT_REG, AE_TXS_COUNT_DEFAULT);
845
846         /*
847          * Configure interframe gap parameters.
848          */
849         val = ((AE_IFG_TXIPG_DEFAULT << AE_IFG_TXIPG_SHIFT) &
850             AE_IFG_TXIPG_MASK) |
851             ((AE_IFG_RXIPG_DEFAULT << AE_IFG_RXIPG_SHIFT) &
852             AE_IFG_RXIPG_MASK) |
853             ((AE_IFG_IPGR1_DEFAULT << AE_IFG_IPGR1_SHIFT) &
854             AE_IFG_IPGR1_MASK) |
855             ((AE_IFG_IPGR2_DEFAULT << AE_IFG_IPGR2_SHIFT) &
856             AE_IFG_IPGR2_MASK);
857         AE_WRITE_4(sc, AE_IFG_REG, val);
858
859         /*
860          * Configure half-duplex operation.
861          */
862         val = ((AE_HDPX_LCOL_DEFAULT << AE_HDPX_LCOL_SHIFT) &
863             AE_HDPX_LCOL_MASK) |
864             ((AE_HDPX_RETRY_DEFAULT << AE_HDPX_RETRY_SHIFT) &
865             AE_HDPX_RETRY_MASK) |
866             ((AE_HDPX_ABEBT_DEFAULT << AE_HDPX_ABEBT_SHIFT) &
867             AE_HDPX_ABEBT_MASK) |
868             ((AE_HDPX_JAMIPG_DEFAULT << AE_HDPX_JAMIPG_SHIFT) &
869             AE_HDPX_JAMIPG_MASK) | AE_HDPX_EXC_EN;
870         AE_WRITE_4(sc, AE_HDPX_REG, val);
871
872         /*
873          * Configure interrupt moderate timer.
874          */
875         AE_WRITE_2(sc, AE_IMT_REG, AE_IMT_DEFAULT);
876         val = AE_READ_4(sc, AE_MASTER_REG);
877         val |= AE_MASTER_IMT_EN;
878         AE_WRITE_4(sc, AE_MASTER_REG, val);
879
880         /*
881          * Configure interrupt clearing timer.
882          */
883         AE_WRITE_2(sc, AE_ICT_REG, AE_ICT_DEFAULT);
884
885         /*
886          * Configure MTU.
887          */
888         val = ifp->if_mtu + ETHER_HDR_LEN + sizeof(struct ether_vlan_header) +
889             ETHER_CRC_LEN;
890         AE_WRITE_2(sc, AE_MTU_REG, val);
891
892         /*
893          * Configure cut-through threshold.
894          */
895         AE_WRITE_4(sc, AE_CUT_THRESH_REG, AE_CUT_THRESH_DEFAULT);
896
897         /*
898          * Configure flow control.
899          */
900         AE_WRITE_2(sc, AE_FLOW_THRESH_HI_REG, (AE_RXD_COUNT_DEFAULT / 8) * 7);
901         AE_WRITE_2(sc, AE_FLOW_THRESH_LO_REG, (AE_RXD_COUNT_MIN / 8) >
902             (AE_RXD_COUNT_DEFAULT / 12) ? (AE_RXD_COUNT_MIN / 8) :
903             (AE_RXD_COUNT_DEFAULT / 12));
904
905         /*
906          * Init mailboxes.
907          */
908         sc->txd_cur = sc->rxd_cur = 0;
909         sc->txs_ack = sc->txd_ack = 0;
910         sc->rxd_cur = 0;
911         AE_WRITE_2(sc, AE_MB_TXD_IDX_REG, sc->txd_cur);
912         AE_WRITE_2(sc, AE_MB_RXD_IDX_REG, sc->rxd_cur);
913         sc->tx_inproc = 0;
914         sc->ae_flags |= AE_FLAG_TXAVAIL; /* Free Tx's available. */
915
916         /*
917          * Enable DMA.
918          */
919         AE_WRITE_1(sc, AE_DMAREAD_REG, AE_DMAREAD_EN);
920         AE_WRITE_1(sc, AE_DMAWRITE_REG, AE_DMAWRITE_EN);
921
922         /*
923          * Check if everything is OK.
924          */
925         val = AE_READ_4(sc, AE_ISR_REG);
926         if ((val & AE_ISR_PHY_LINKDOWN) != 0) {
927                 device_printf(sc->ae_dev, "Initialization failed.\n");
928                 return;
929         }
930
931         /*
932          * Clear interrupt status.
933          */
934         AE_WRITE_4(sc, AE_ISR_REG, 0x3fffffff);
935         AE_WRITE_4(sc, AE_ISR_REG, 0x0);
936
937         /*
938          * Enable interrupts.
939          */
940         val = AE_READ_4(sc, AE_MASTER_REG);
941         AE_WRITE_4(sc, AE_MASTER_REG, val | AE_MASTER_MANUAL_INT);
942         AE_WRITE_4(sc, AE_IMR_REG, AE_IMR_DEFAULT);
943
944         /*
945          * Disable WOL.
946          */
947         AE_WRITE_4(sc, AE_WOL_REG, 0);
948
949         /*
950          * Configure MAC.
951          */
952         val = AE_MAC_TX_CRC_EN | AE_MAC_TX_AUTOPAD |
953             AE_MAC_FULL_DUPLEX | AE_MAC_CLK_PHY |
954             AE_MAC_TX_FLOW_EN | AE_MAC_RX_FLOW_EN |
955             ((AE_HALFBUF_DEFAULT << AE_HALFBUF_SHIFT) & AE_HALFBUF_MASK) |
956             ((AE_MAC_PREAMBLE_DEFAULT << AE_MAC_PREAMBLE_SHIFT) &
957             AE_MAC_PREAMBLE_MASK);
958         AE_WRITE_4(sc, AE_MAC_REG, val);
959
960         /*
961          * Configure Rx MAC.
962          */
963         ae_rxfilter(sc);
964         ae_rxvlan(sc);
965
966         /*
967          * Enable Tx/Rx.
968          */
969         val = AE_READ_4(sc, AE_MAC_REG);
970         AE_WRITE_4(sc, AE_MAC_REG, val | AE_MAC_TX_EN | AE_MAC_RX_EN);
971
972         sc->ae_flags &= ~AE_FLAG_LINK;
973         mii_mediachg(mii);      /* Switch to the current media. */
974
975         callout_reset(&sc->ae_tick_ch, hz, ae_tick, sc);
976         ifp->if_flags |= IFF_RUNNING;
977         ifq_clr_oactive(&ifp->if_snd);
978 }
979
980 static void
981 ae_watchdog(struct ifnet *ifp)
982 {
983         struct ae_softc *sc = ifp->if_softc;
984
985         ASSERT_SERIALIZED(ifp->if_serializer);
986
987         if ((sc->ae_flags & AE_FLAG_LINK) == 0)
988                 if_printf(ifp, "watchdog timeout (missed link).\n");
989         else
990                 if_printf(ifp, "watchdog timeout - resetting.\n");
991         IFNET_STAT_INC(ifp, oerrors, 1);
992
993         ae_init(sc);
994         if (!ifq_is_empty(&ifp->if_snd))
995                 if_devstart(ifp);
996 }
997
998 static void
999 ae_tick(void *xsc)
1000 {
1001         struct ae_softc *sc = xsc;
1002         struct ifnet *ifp = &sc->arpcom.ac_if;
1003         struct mii_data *mii = device_get_softc(sc->ae_miibus);
1004
1005         lwkt_serialize_enter(ifp->if_serializer);
1006         mii_tick(mii);
1007         callout_reset(&sc->ae_tick_ch, hz, ae_tick, sc);
1008         lwkt_serialize_exit(ifp->if_serializer);
1009 }
1010
1011 static void
1012 ae_rxvlan(struct ae_softc *sc)
1013 {
1014         struct ifnet *ifp = &sc->arpcom.ac_if;
1015         uint32_t val;
1016
1017         val = AE_READ_4(sc, AE_MAC_REG);
1018         val &= ~AE_MAC_RMVLAN_EN;
1019         if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING)
1020                 val |= AE_MAC_RMVLAN_EN;
1021         AE_WRITE_4(sc, AE_MAC_REG, val);
1022 }
1023
1024 static void
1025 ae_rxfilter(struct ae_softc *sc)
1026 {
1027         struct ifnet *ifp = &sc->arpcom.ac_if;
1028         struct ifmultiaddr *ifma;
1029         uint32_t crc;
1030         uint32_t mchash[2];
1031         uint32_t rxcfg;
1032
1033         rxcfg = AE_READ_4(sc, AE_MAC_REG);
1034         rxcfg &= ~(AE_MAC_MCAST_EN | AE_MAC_BCAST_EN | AE_MAC_PROMISC_EN);
1035         rxcfg |= AE_MAC_BCAST_EN;
1036         if (ifp->if_flags & IFF_PROMISC)
1037                 rxcfg |= AE_MAC_PROMISC_EN;
1038         if (ifp->if_flags & IFF_ALLMULTI)
1039                 rxcfg |= AE_MAC_MCAST_EN;
1040
1041         /*
1042          * Wipe old settings.
1043          */
1044         AE_WRITE_4(sc, AE_REG_MHT0, 0);
1045         AE_WRITE_4(sc, AE_REG_MHT1, 0);
1046         if (ifp->if_flags & (IFF_PROMISC | IFF_ALLMULTI)) {
1047                 AE_WRITE_4(sc, AE_REG_MHT0, 0xffffffff);
1048                 AE_WRITE_4(sc, AE_REG_MHT1, 0xffffffff);
1049                 AE_WRITE_4(sc, AE_MAC_REG, rxcfg);
1050                 return;
1051         }
1052
1053         /*
1054          * Load multicast tables.
1055          */
1056         bzero(mchash, sizeof(mchash));
1057         TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1058                 if (ifma->ifma_addr->sa_family != AF_LINK)
1059                         continue;
1060                 crc = ether_crc32_le(LLADDR((struct sockaddr_dl *)
1061                         ifma->ifma_addr), ETHER_ADDR_LEN);
1062                 mchash[crc >> 31] |= 1 << ((crc >> 26) & 0x1f);
1063         }
1064         AE_WRITE_4(sc, AE_REG_MHT0, mchash[0]);
1065         AE_WRITE_4(sc, AE_REG_MHT1, mchash[1]);
1066         AE_WRITE_4(sc, AE_MAC_REG, rxcfg);
1067 }
1068
1069 static unsigned int
1070 ae_tx_avail_size(struct ae_softc *sc)
1071 {
1072         unsigned int avail;
1073
1074         if (sc->txd_cur >= sc->txd_ack)
1075                 avail = AE_TXD_BUFSIZE_DEFAULT - (sc->txd_cur - sc->txd_ack);
1076         else
1077                 avail = sc->txd_ack - sc->txd_cur;
1078         return (avail - 4);     /* 4-byte header. */
1079 }
1080
1081 static int
1082 ae_encap(struct ae_softc *sc, struct mbuf **m_head)
1083 {
1084         struct mbuf *m0;
1085         struct ae_txd *hdr;
1086         unsigned int to_end;
1087         uint16_t len;
1088
1089         M_ASSERTPKTHDR((*m_head));
1090         m0 = *m_head;
1091         len = m0->m_pkthdr.len;
1092         if ((sc->ae_flags & AE_FLAG_TXAVAIL) == 0 ||
1093             ae_tx_avail_size(sc) < len) {
1094 #ifdef AE_DEBUG
1095                 if_printf(sc->ifp, "No free Tx available.\n");
1096 #endif
1097                 return ENOBUFS;
1098         }
1099
1100         hdr = (struct ae_txd *)(sc->txd_base + sc->txd_cur);
1101         bzero(hdr, sizeof(*hdr));
1102
1103         /* Header size. */
1104         sc->txd_cur = (sc->txd_cur + 4) % AE_TXD_BUFSIZE_DEFAULT;
1105
1106         /* Space available to the end of the ring */
1107         to_end = AE_TXD_BUFSIZE_DEFAULT - sc->txd_cur;
1108
1109         if (to_end >= len) {
1110                 m_copydata(m0, 0, len, (caddr_t)(sc->txd_base + sc->txd_cur));
1111         } else {
1112                 m_copydata(m0, 0, to_end, (caddr_t)(sc->txd_base +
1113                     sc->txd_cur));
1114                 m_copydata(m0, to_end, len - to_end, (caddr_t)sc->txd_base);
1115         }
1116
1117         /*
1118          * Set TxD flags and parameters.
1119          */
1120         if ((m0->m_flags & M_VLANTAG) != 0) {
1121                 hdr->vlan = htole16(AE_TXD_VLAN(m0->m_pkthdr.ether_vlantag));
1122                 hdr->len = htole16(len | AE_TXD_INSERT_VTAG);
1123         } else {
1124                 hdr->len = htole16(len);
1125         }
1126
1127         /*
1128          * Set current TxD position and round up to a 4-byte boundary.
1129          */
1130         sc->txd_cur = ((sc->txd_cur + len + 3) & ~3) % AE_TXD_BUFSIZE_DEFAULT;
1131         if (sc->txd_cur == sc->txd_ack)
1132                 sc->ae_flags &= ~AE_FLAG_TXAVAIL;
1133 #ifdef AE_DEBUG
1134         if_printf(sc->ifp, "New txd_cur = %d.\n", sc->txd_cur);
1135 #endif
1136
1137         /*
1138          * Update TxS position and check if there are empty TxS available.
1139          */
1140         sc->txs_base[sc->txs_cur].flags &= ~htole16(AE_TXS_UPDATE);
1141         sc->txs_cur = (sc->txs_cur + 1) % AE_TXS_COUNT_DEFAULT;
1142         if (sc->txs_cur == sc->txs_ack)
1143                 sc->ae_flags &= ~AE_FLAG_TXAVAIL;
1144
1145         /*
1146          * Synchronize DMA memory.
1147          */
1148         bus_dmamap_sync(sc->dma_txd_tag, sc->dma_txd_map, BUS_DMASYNC_PREWRITE);
1149         bus_dmamap_sync(sc->dma_txs_tag, sc->dma_txs_map, BUS_DMASYNC_PREWRITE);
1150
1151         return (0);
1152 }
1153
1154 static void
1155 ae_start(struct ifnet *ifp, struct ifaltq_subque *ifsq)
1156 {
1157         struct ae_softc *sc = ifp->if_softc;
1158         int error, trans;
1159
1160         ASSERT_ALTQ_SQ_DEFAULT(ifp, ifsq);
1161         ASSERT_SERIALIZED(ifp->if_serializer);
1162
1163 #ifdef AE_DEBUG
1164         if_printf(ifp, "Start called.\n");
1165 #endif
1166         if ((sc->ae_flags & AE_FLAG_LINK) == 0) {
1167                 ifq_purge(&ifp->if_snd);
1168                 return;
1169         }
1170         if ((ifp->if_flags & IFF_RUNNING) == 0 || ifq_is_oactive(&ifp->if_snd))
1171                 return;
1172
1173         trans = 0;
1174         while (!ifq_is_empty(&ifp->if_snd)) {
1175                 struct mbuf *m0;
1176
1177                 m0 = ifq_dequeue(&ifp->if_snd);
1178                 if (m0 == NULL)
1179                         break;  /* Nothing to do. */
1180
1181                 error = ae_encap(sc, &m0);
1182                 if (error != 0) {
1183                         if (m0 != NULL) {
1184                                 ifq_prepend(&ifp->if_snd, m0);
1185                                 ifq_set_oactive(&ifp->if_snd);
1186 #ifdef AE_DEBUG
1187                                 if_printf(ifp, "Setting OACTIVE.\n");
1188 #endif
1189                         }
1190                         break;
1191                 }
1192                 trans = 1;
1193                 sc->tx_inproc++;
1194
1195                 /* Bounce a copy of the frame to BPF. */
1196                 ETHER_BPF_MTAP(ifp, m0);
1197                 m_freem(m0);
1198         }
1199         if (trans) {    /* Something was dequeued. */
1200                 AE_WRITE_2(sc, AE_MB_TXD_IDX_REG, sc->txd_cur / 4);
1201                 ifp->if_timer = AE_TX_TIMEOUT; /* Load watchdog. */
1202 #ifdef AE_DEBUG
1203                 if_printf(ifp, "%d packets dequeued.\n", count);
1204                 if_printf(ifp, "Tx pos now is %d.\n", sc->txd_cur);
1205 #endif
1206         }
1207 }
1208
1209 static int
1210 ae_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
1211 {
1212         struct ae_softc *sc = ifp->if_softc;
1213         struct ifreq *ifr;
1214         struct mii_data *mii;
1215         int error = 0, mask;
1216
1217         ASSERT_SERIALIZED(ifp->if_serializer);
1218
1219         ifr = (struct ifreq *)data;
1220         switch (cmd) {
1221         case SIOCSIFFLAGS:
1222                 if (ifp->if_flags & IFF_UP) {
1223                         if (ifp->if_flags & IFF_RUNNING) {
1224                                 if (((ifp->if_flags ^ sc->ae_if_flags)
1225                                     & (IFF_PROMISC | IFF_ALLMULTI)) != 0)
1226                                         ae_rxfilter(sc);
1227                         } else {
1228                                 ae_init(sc);
1229                         }
1230                 } else {
1231                         if (ifp->if_flags & IFF_RUNNING)
1232                                 ae_stop(sc);
1233                 }
1234                 sc->ae_if_flags = ifp->if_flags;
1235                 break;
1236
1237         case SIOCADDMULTI:
1238         case SIOCDELMULTI:
1239                 if (ifp->if_flags & IFF_RUNNING)
1240                         ae_rxfilter(sc);
1241                 break;
1242
1243         case SIOCSIFMEDIA:
1244         case SIOCGIFMEDIA:
1245                 mii = device_get_softc(sc->ae_miibus);
1246                 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd);
1247                 break;
1248
1249         case SIOCSIFCAP:
1250                 mask = ifr->ifr_reqcap ^ ifp->if_capenable;
1251                 if (mask & IFCAP_VLAN_HWTAGGING) {
1252                         ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
1253                         ae_rxvlan(sc);
1254                 }
1255                 break;
1256
1257         default:
1258                 error = ether_ioctl(ifp, cmd, data);
1259                 break;
1260         }
1261         return (error);
1262 }
1263
1264 static int
1265 ae_attach(device_t dev)
1266 {
1267         struct ae_softc *sc = device_get_softc(dev);
1268         struct ifnet *ifp = &sc->arpcom.ac_if;
1269         int error = 0;
1270
1271         sc->ae_dev = dev;
1272         if_initname(ifp, device_get_name(dev), device_get_unit(dev));
1273         callout_init(&sc->ae_tick_ch);
1274
1275         /* Enable bus mastering */
1276         pci_enable_busmaster(dev);
1277
1278         /*
1279          * Allocate memory mapped IO
1280          */
1281         sc->ae_mem_rid = PCIR_BAR(0);
1282         sc->ae_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
1283                                                 &sc->ae_mem_rid, RF_ACTIVE);
1284         if (sc->ae_mem_res == NULL) {
1285                 device_printf(dev, "can't allocate IO memory\n");
1286                 return ENXIO;
1287         }
1288         sc->ae_mem_bt = rman_get_bustag(sc->ae_mem_res);
1289         sc->ae_mem_bh = rman_get_bushandle(sc->ae_mem_res);
1290
1291         /*
1292          * Allocate IRQ
1293          */
1294         sc->ae_irq_rid = 0;
1295         sc->ae_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ,
1296                                                 &sc->ae_irq_rid,
1297                                                 RF_SHAREABLE | RF_ACTIVE);
1298         if (sc->ae_irq_res == NULL) {
1299                 device_printf(dev, "can't allocate irq\n");
1300                 error = ENXIO;
1301                 goto fail;
1302         }
1303
1304         /* Set PHY address. */
1305         sc->ae_phyaddr = AE_PHYADDR_DEFAULT;
1306
1307         /* Create sysctl tree */
1308         ae_sysctl_node(sc);
1309
1310         /* Reset PHY. */
1311         ae_phy_reset(sc);
1312
1313         /*
1314          * Reset the ethernet controller.
1315          */
1316         ae_reset(sc);
1317         ae_pcie_init(sc);
1318
1319         /*
1320          * Get PCI and chip id/revision.
1321          */
1322         sc->ae_rev = pci_get_revid(dev);
1323         sc->ae_chip_rev =
1324         (AE_READ_4(sc, AE_MASTER_REG) >> AE_MASTER_REVNUM_SHIFT) &
1325         AE_MASTER_REVNUM_MASK;
1326         if (bootverbose) {
1327                 device_printf(dev, "PCI device revision : 0x%04x\n", sc->ae_rev);
1328                 device_printf(dev, "Chip id/revision : 0x%04x\n",
1329                     sc->ae_chip_rev);
1330         }
1331
1332         /*
1333          * XXX
1334          * Unintialized hardware returns an invalid chip id/revision
1335          * as well as 0xFFFFFFFF for Tx/Rx fifo length. It seems that
1336          * unplugged cable results in putting hardware into automatic
1337          * power down mode which in turn returns invalld chip revision.
1338          */
1339         if (sc->ae_chip_rev == 0xFFFF) {
1340                 device_printf(dev,"invalid chip revision : 0x%04x -- "
1341                     "not initialized?\n", sc->ae_chip_rev);
1342                 error = ENXIO;
1343                 goto fail;
1344         }
1345 #if 0
1346         /* Get DMA parameters from PCIe device control register. */
1347         pcie_ptr = pci_get_pciecap_ptr(dev);
1348         if (pcie_ptr) {
1349                 uint16_t devctl;
1350                 sc->ae_flags |= AE_FLAG_PCIE;
1351                 devctl = pci_read_config(dev, pcie_ptr + PCIER_DEVCTRL, 2);
1352                 /* Max read request size. */
1353                 sc->ae_dma_rd_burst = ((devctl >> 12) & 0x07) <<
1354                     DMA_CFG_RD_BURST_SHIFT;
1355                 /* Max payload size. */
1356                 sc->ae_dma_wr_burst = ((devctl >> 5) & 0x07) <<
1357                     DMA_CFG_WR_BURST_SHIFT;
1358                 if (bootverbose) {
1359                         device_printf(dev, "Read request size : %d bytes.\n",
1360                             128 << ((devctl >> 12) & 0x07));
1361                         device_printf(dev, "TLP payload size : %d bytes.\n",
1362                             128 << ((devctl >> 5) & 0x07));
1363                 }
1364         } else {
1365                 sc->ae_dma_rd_burst = DMA_CFG_RD_BURST_128;
1366                 sc->ae_dma_wr_burst = DMA_CFG_WR_BURST_128;
1367         }
1368 #endif
1369
1370         /* Create DMA stuffs */
1371         error = ae_dma_alloc(sc);
1372         if (error)
1373                 goto fail;
1374
1375         /* Load station address. */
1376         ae_get_eaddr(sc);
1377
1378         ifp->if_softc = sc;
1379         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1380         ifp->if_ioctl = ae_ioctl;
1381         ifp->if_start = ae_start;
1382         ifp->if_init = ae_init;
1383         ifp->if_watchdog = ae_watchdog;
1384         ifq_set_maxlen(&ifp->if_snd, IFQ_MAXLEN - 1);
1385         ifq_set_ready(&ifp->if_snd);
1386         ifp->if_capabilities = IFCAP_VLAN_MTU |
1387                                IFCAP_VLAN_HWTAGGING;
1388         ifp->if_hwassist = 0;
1389         ifp->if_capenable = ifp->if_capabilities;
1390
1391         /* Set up MII bus. */
1392         error = mii_phy_probe(dev, &sc->ae_miibus,
1393                               ae_mediachange, ae_mediastatus);
1394         if (error) {
1395                 device_printf(dev, "no PHY found!\n");
1396                 goto fail;
1397         }
1398         ether_ifattach(ifp, sc->ae_eaddr, NULL);
1399
1400         /* Tell the upper layer(s) we support long frames. */
1401         ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
1402
1403         ifq_set_cpuid(&ifp->if_snd, rman_get_cpuid(sc->ae_irq_res));
1404
1405         error = bus_setup_intr(dev, sc->ae_irq_res, INTR_MPSAFE, ae_intr, sc,
1406                                &sc->ae_irq_handle, ifp->if_serializer);
1407         if (error) {
1408                 device_printf(dev, "could not set up interrupt handler.\n");
1409                 ether_ifdetach(ifp);
1410                 goto fail;
1411         }
1412         return 0;
1413 fail:
1414         ae_detach(dev);
1415         return (error);
1416 }
1417
1418 static int
1419 ae_detach(device_t dev)
1420 {
1421         struct ae_softc *sc = device_get_softc(dev);
1422
1423         if (device_is_attached(dev)) {
1424                 struct ifnet *ifp = &sc->arpcom.ac_if;
1425
1426                 lwkt_serialize_enter(ifp->if_serializer);
1427                 sc->ae_flags |= AE_FLAG_DETACH;
1428                 ae_stop(sc);
1429                 bus_teardown_intr(dev, sc->ae_irq_res, sc->ae_irq_handle);
1430                 lwkt_serialize_exit(ifp->if_serializer);
1431
1432                 ether_ifdetach(ifp);
1433         }
1434
1435         if (sc->ae_miibus != NULL)
1436                 device_delete_child(dev, sc->ae_miibus);
1437         bus_generic_detach(dev);
1438
1439         if (sc->ae_irq_res != NULL) {
1440                 bus_release_resource(dev, SYS_RES_IRQ, sc->ae_irq_rid,
1441                                      sc->ae_irq_res);
1442         }
1443         if (sc->ae_mem_res != NULL) {
1444                 bus_release_resource(dev, SYS_RES_MEMORY, sc->ae_mem_rid,
1445                                      sc->ae_mem_res);
1446         }
1447
1448         if (sc->ae_sysctl_tree != NULL)
1449                 sysctl_ctx_free(&sc->ae_sysctl_ctx);
1450
1451         ae_dma_free(sc);
1452
1453         return (0);
1454 }
1455
1456 static void
1457 ae_dma_free(struct ae_softc *sc)
1458 {
1459         if (sc->dma_txd_tag != NULL) {
1460                 bus_dmamap_unload(sc->dma_txd_tag, sc->dma_txd_map);
1461                 bus_dmamem_free(sc->dma_txd_tag, sc->txd_base,
1462                     sc->dma_txd_map);
1463                 bus_dma_tag_destroy(sc->dma_txd_tag);
1464         }
1465         if (sc->dma_txs_tag != NULL) {
1466                 bus_dmamap_unload(sc->dma_txs_tag, sc->dma_txs_map);
1467                 bus_dmamem_free(sc->dma_txs_tag, sc->txs_base,
1468                     sc->dma_txs_map);
1469                 bus_dma_tag_destroy(sc->dma_txs_tag);
1470         }
1471         if (sc->dma_rxd_tag != NULL) {
1472                 bus_dmamap_unload(sc->dma_rxd_tag, sc->dma_rxd_map);
1473                 bus_dmamem_free(sc->dma_rxd_tag,
1474                     sc->rxd_base_dma, sc->dma_rxd_map);
1475                 bus_dma_tag_destroy(sc->dma_rxd_tag);
1476         }
1477         if (sc->dma_parent_tag != NULL)
1478                 bus_dma_tag_destroy(sc->dma_parent_tag);
1479 }
1480
1481 static void
1482 ae_pcie_init(struct ae_softc *sc)
1483 {
1484         AE_WRITE_4(sc, AE_PCIE_LTSSM_TESTMODE_REG,
1485                    AE_PCIE_LTSSM_TESTMODE_DEFAULT);
1486         AE_WRITE_4(sc, AE_PCIE_DLL_TX_CTRL_REG,
1487                    AE_PCIE_DLL_TX_CTRL_DEFAULT);
1488 }
1489
1490 static void
1491 ae_phy_reset(struct ae_softc *sc)
1492 {
1493         AE_WRITE_4(sc, AE_PHY_ENABLE_REG, AE_PHY_ENABLE);
1494         DELAY(1000);    /* XXX: pause(9) ? */
1495 }
1496
1497 static int
1498 ae_reset(struct ae_softc *sc)
1499 {
1500         int i;
1501
1502         /*
1503          * Issue a soft reset.
1504          */
1505         AE_WRITE_4(sc, AE_MASTER_REG, AE_MASTER_SOFT_RESET);
1506         bus_space_barrier(sc->ae_mem_bt, sc->ae_mem_bh, AE_MASTER_REG, 4,
1507             BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
1508
1509         /*
1510          * Wait for reset to complete.
1511          */
1512         for (i = 0; i < AE_RESET_TIMEOUT; i++) {
1513                 if ((AE_READ_4(sc, AE_MASTER_REG) & AE_MASTER_SOFT_RESET) == 0)
1514                         break;
1515                 DELAY(10);
1516         }
1517         if (i == AE_RESET_TIMEOUT) {
1518                 device_printf(sc->ae_dev, "reset timeout.\n");
1519                 return (ENXIO);
1520         }
1521
1522         /*
1523          * Wait for everything to enter idle state.
1524          */
1525         for (i = 0; i < AE_IDLE_TIMEOUT; i++) {
1526                 if (AE_READ_4(sc, AE_IDLE_REG) == 0)
1527                         break;
1528                 DELAY(100);
1529         }
1530         if (i == AE_IDLE_TIMEOUT) {
1531                 device_printf(sc->ae_dev, "could not enter idle state.\n");
1532                 return (ENXIO);
1533         }
1534         return (0);
1535 }
1536
1537 static int
1538 ae_check_eeprom_present(struct ae_softc *sc, int *vpdc)
1539 {
1540         int error;
1541         uint32_t val;
1542
1543         /*
1544          * Not sure why, but Linux does this.
1545          */
1546         val = AE_READ_4(sc, AE_SPICTL_REG);
1547         if ((val & AE_SPICTL_VPD_EN) != 0) {
1548                 val &= ~AE_SPICTL_VPD_EN;
1549                 AE_WRITE_4(sc, AE_SPICTL_REG, val);
1550         }
1551         error = pci_find_extcap(sc->ae_dev, PCIY_VPD, vpdc);
1552         return (error);
1553 }
1554
1555 static int
1556 ae_vpd_read_word(struct ae_softc *sc, int reg, uint32_t *word)
1557 {
1558         uint32_t val;
1559         int i;
1560
1561         AE_WRITE_4(sc, AE_VPD_DATA_REG, 0);     /* Clear register value. */
1562
1563         /*
1564          * VPD registers start at offset 0x100. Read them.
1565          */
1566         val = 0x100 + reg * 4;
1567         AE_WRITE_4(sc, AE_VPD_CAP_REG, (val << AE_VPD_CAP_ADDR_SHIFT) &
1568             AE_VPD_CAP_ADDR_MASK);
1569         for (i = 0; i < AE_VPD_TIMEOUT; i++) {
1570                 DELAY(2000);
1571                 val = AE_READ_4(sc, AE_VPD_CAP_REG);
1572                 if ((val & AE_VPD_CAP_DONE) != 0)
1573                         break;
1574         }
1575         if (i == AE_VPD_TIMEOUT) {
1576                 device_printf(sc->ae_dev, "timeout reading VPD register %d.\n",
1577                     reg);
1578                 return (ETIMEDOUT);
1579         }
1580         *word = AE_READ_4(sc, AE_VPD_DATA_REG);
1581         return (0);
1582 }
1583
1584 static int
1585 ae_get_vpd_eaddr(struct ae_softc *sc, uint32_t *eaddr)
1586 {
1587         uint32_t word, reg, val;
1588         int error;
1589         int found;
1590         int vpdc;
1591         int i;
1592
1593         /*
1594          * Check for EEPROM.
1595          */
1596         error = ae_check_eeprom_present(sc, &vpdc);
1597         if (error != 0)
1598                 return (error);
1599
1600         /*
1601          * Read the VPD configuration space.
1602          * Each register is prefixed with signature,
1603          * so we can check if it is valid.
1604          */
1605         for (i = 0, found = 0; i < AE_VPD_NREGS; i++) {
1606                 error = ae_vpd_read_word(sc, i, &word);
1607                 if (error != 0)
1608                         break;
1609
1610                 /*
1611                  * Check signature.
1612                  */
1613                 if ((word & AE_VPD_SIG_MASK) != AE_VPD_SIG)
1614                         break;
1615                 reg = word >> AE_VPD_REG_SHIFT;
1616                 i++;    /* Move to the next word. */
1617                 if (reg != AE_EADDR0_REG && reg != AE_EADDR1_REG)
1618                         continue;
1619
1620                 error = ae_vpd_read_word(sc, i, &val);
1621                 if (error != 0)
1622                         break;
1623                 if (reg == AE_EADDR0_REG)
1624                         eaddr[0] = val;
1625                 else
1626                         eaddr[1] = val;
1627                 found++;
1628         }
1629         if (found < 2)
1630                 return (ENOENT);
1631
1632         eaddr[1] &= 0xffff;     /* Only last 2 bytes are used. */
1633         if (AE_CHECK_EADDR_VALID(eaddr) != 0) {
1634                 if (bootverbose)
1635                         device_printf(sc->ae_dev,
1636                             "VPD ethernet address registers are invalid.\n");
1637                 return (EINVAL);
1638         }
1639         return (0);
1640 }
1641
1642 static int
1643 ae_get_reg_eaddr(struct ae_softc *sc, uint32_t *eaddr)
1644 {
1645         /*
1646          * BIOS is supposed to set this.
1647          */
1648         eaddr[0] = AE_READ_4(sc, AE_EADDR0_REG);
1649         eaddr[1] = AE_READ_4(sc, AE_EADDR1_REG);
1650         eaddr[1] &= 0xffff;     /* Only last 2 bytes are used. */
1651         if (AE_CHECK_EADDR_VALID(eaddr) != 0) {
1652                 if (bootverbose)
1653                         device_printf(sc->ae_dev,
1654                             "Ethetnet address registers are invalid.\n");
1655                 return (EINVAL);
1656         }
1657         return (0);
1658 }
1659
1660 static void
1661 ae_get_eaddr(struct ae_softc *sc)
1662 {
1663         uint32_t eaddr[2] = {0, 0};
1664         int error;
1665
1666         /*
1667          *Check for EEPROM.
1668          */
1669         error = ae_get_vpd_eaddr(sc, eaddr);
1670         if (error)
1671                 error = ae_get_reg_eaddr(sc, eaddr);
1672         if (error) {
1673                 if (bootverbose)
1674                         device_printf(sc->ae_dev,
1675                             "Generating random ethernet address.\n");
1676                 eaddr[0] = karc4random();
1677                 /*
1678                  * Set OUI to ASUSTek COMPUTER INC.
1679                  */
1680                 sc->ae_eaddr[0] = 0x02; /* U/L bit set. */
1681                 sc->ae_eaddr[1] = 0x1f;
1682                 sc->ae_eaddr[2] = 0xc6;
1683                 sc->ae_eaddr[3] = (eaddr[0] >> 16) & 0xff;
1684                 sc->ae_eaddr[4] = (eaddr[0] >> 8) & 0xff;
1685                 sc->ae_eaddr[5] = (eaddr[0] >> 0) & 0xff;
1686         } else {
1687                 sc->ae_eaddr[0] = (eaddr[1] >> 8) & 0xff;
1688                 sc->ae_eaddr[1] = (eaddr[1] >> 0) & 0xff;
1689                 sc->ae_eaddr[2] = (eaddr[0] >> 24) & 0xff;
1690                 sc->ae_eaddr[3] = (eaddr[0] >> 16) & 0xff;
1691                 sc->ae_eaddr[4] = (eaddr[0] >> 8) & 0xff;
1692                 sc->ae_eaddr[5] = (eaddr[0] >> 0) & 0xff;
1693         }
1694 }
1695
1696 static int
1697 ae_mediachange(struct ifnet *ifp)
1698 {
1699         struct ae_softc *sc = ifp->if_softc;
1700         struct mii_data *mii = device_get_softc(sc->ae_miibus);
1701         int error;
1702
1703         ASSERT_SERIALIZED(ifp->if_serializer);
1704         if (mii->mii_instance != 0) {
1705                 struct mii_softc *miisc;
1706                 LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
1707                         mii_phy_reset(miisc);
1708         }
1709         error = mii_mediachg(mii);
1710         return (error);
1711 }
1712
1713 static void
1714 ae_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
1715 {
1716         struct ae_softc *sc = ifp->if_softc;
1717         struct mii_data *mii = device_get_softc(sc->ae_miibus);
1718
1719         ASSERT_SERIALIZED(ifp->if_serializer);
1720         mii_pollstat(mii);
1721         ifmr->ifm_status = mii->mii_media_status;
1722         ifmr->ifm_active = mii->mii_media_active;
1723 }
1724
1725 static void
1726 ae_update_stats_tx(uint16_t flags, struct ae_stats *stats)
1727 {
1728         if ((flags & AE_TXS_BCAST) != 0)
1729                 stats->tx_bcast++;
1730         if ((flags & AE_TXS_MCAST) != 0)
1731                 stats->tx_mcast++;
1732         if ((flags & AE_TXS_PAUSE) != 0)
1733                 stats->tx_pause++;
1734         if ((flags & AE_TXS_CTRL) != 0)
1735                 stats->tx_ctrl++;
1736         if ((flags & AE_TXS_DEFER) != 0)
1737                 stats->tx_defer++;
1738         if ((flags & AE_TXS_EXCDEFER) != 0)
1739                 stats->tx_excdefer++;
1740         if ((flags & AE_TXS_SINGLECOL) != 0)
1741                 stats->tx_singlecol++;
1742         if ((flags & AE_TXS_MULTICOL) != 0)
1743                 stats->tx_multicol++;
1744         if ((flags & AE_TXS_LATECOL) != 0)
1745                 stats->tx_latecol++;
1746         if ((flags & AE_TXS_ABORTCOL) != 0)
1747                 stats->tx_abortcol++;
1748         if ((flags & AE_TXS_UNDERRUN) != 0)
1749                 stats->tx_underrun++;
1750 }
1751
1752 static void
1753 ae_update_stats_rx(uint16_t flags, struct ae_stats *stats)
1754 {
1755         if ((flags & AE_RXD_BCAST) != 0)
1756                 stats->rx_bcast++;
1757         if ((flags & AE_RXD_MCAST) != 0)
1758                 stats->rx_mcast++;
1759         if ((flags & AE_RXD_PAUSE) != 0)
1760                 stats->rx_pause++;
1761         if ((flags & AE_RXD_CTRL) != 0)
1762                 stats->rx_ctrl++;
1763         if ((flags & AE_RXD_CRCERR) != 0)
1764                 stats->rx_crcerr++;
1765         if ((flags & AE_RXD_CODEERR) != 0)
1766                 stats->rx_codeerr++;
1767         if ((flags & AE_RXD_RUNT) != 0)
1768                 stats->rx_runt++;
1769         if ((flags & AE_RXD_FRAG) != 0)
1770                 stats->rx_frag++;
1771         if ((flags & AE_RXD_TRUNC) != 0)
1772                 stats->rx_trunc++;
1773         if ((flags & AE_RXD_ALIGN) != 0)
1774                 stats->rx_align++;
1775 }
1776
1777 static int
1778 ae_resume(device_t dev)
1779 {
1780         struct ae_softc *sc = device_get_softc(dev);
1781         struct ifnet *ifp = &sc->arpcom.ac_if;
1782
1783         lwkt_serialize_enter(ifp->if_serializer);
1784 #if 0
1785         AE_READ_4(sc, AE_WOL_REG);      /* Clear WOL status. */
1786 #endif
1787         ae_phy_reset(sc);
1788         if ((ifp->if_flags & IFF_UP) != 0)
1789                 ae_init(sc);
1790         lwkt_serialize_exit(ifp->if_serializer);
1791         return (0);
1792 }
1793
1794 static int
1795 ae_suspend(device_t dev)
1796 {
1797         struct ae_softc *sc = device_get_softc(dev);
1798         struct ifnet *ifp = &sc->arpcom.ac_if;
1799
1800         lwkt_serialize_enter(ifp->if_serializer);
1801         ae_stop(sc);
1802 #if 0
1803         /* we don't use ae_pm_init because we don't want WOL */
1804         ae_pm_init(sc);
1805 #endif
1806         lwkt_serialize_exit(ifp->if_serializer);
1807         return (0);
1808 }
1809
1810 static int
1811 ae_shutdown(device_t dev)
1812 {
1813         struct ae_softc *sc = device_get_softc(dev);
1814         struct ifnet *ifp = &sc->arpcom.ac_if;
1815
1816         ae_suspend(dev);
1817
1818         lwkt_serialize_enter(ifp->if_serializer);
1819         ae_powersave_enable(sc);
1820         lwkt_serialize_exit(ifp->if_serializer);
1821
1822         return (0);
1823 }
1824
1825 static void
1826 ae_powersave_disable(struct ae_softc *sc)
1827 {
1828         uint32_t val;
1829
1830         AE_PHY_WRITE(sc, AE_PHY_DBG_ADDR, 0);
1831         val = AE_PHY_READ(sc, AE_PHY_DBG_DATA);
1832         if (val & AE_PHY_DBG_POWERSAVE) {
1833                 val &= ~AE_PHY_DBG_POWERSAVE;
1834                 AE_PHY_WRITE(sc, AE_PHY_DBG_DATA, val);
1835                 DELAY(1000);
1836         }
1837 }
1838
1839 static void
1840 ae_powersave_enable(struct ae_softc *sc)
1841 {
1842         uint32_t val;
1843
1844         /*
1845          * XXX magic numbers.
1846          */
1847         AE_PHY_WRITE(sc, AE_PHY_DBG_ADDR, 0);
1848         val = AE_PHY_READ(sc, AE_PHY_DBG_DATA);
1849         AE_PHY_WRITE(sc, AE_PHY_DBG_ADDR, val | 0x1000);
1850         AE_PHY_WRITE(sc, AE_PHY_DBG_ADDR, 2);
1851         AE_PHY_WRITE(sc, AE_PHY_DBG_DATA, 0x3000);
1852         AE_PHY_WRITE(sc, AE_PHY_DBG_ADDR, 3);
1853         AE_PHY_WRITE(sc, AE_PHY_DBG_DATA, 0);
1854 }