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