Lines Matching +full:master +full:- +full:stats
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
98 * enable MSI-X in alc_attach() depending on the card type. The operator can
248 nitems(alc_ident_table) - 1);
253 { -1, 0, 0 }
258 { -1, 0, 0 }
263 { -1, 0, 0 }
268 { -1, 0, 0 }
280 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_miibus_readreg()
299 if ((sc->alc_flags & ALC_FLAG_FASTETHER) != 0 && in alc_mii_readreg_813x()
305 for (i = ALC_PHY_TIMEOUT; i > 0; i--) { in alc_mii_readreg_813x()
313 device_printf(sc->alc_dev, "phy read timeout : %d\n", reg); in alc_mii_readreg_813x()
326 if ((sc->alc_flags & ALC_FLAG_LINK) != 0) in alc_mii_readreg_816x()
332 for (i = ALC_PHY_TIMEOUT; i > 0; i--) { in alc_mii_readreg_816x()
340 device_printf(sc->alc_dev, "phy read timeout : %d\n", reg); in alc_mii_readreg_816x()
354 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_miibus_writereg()
370 for (i = ALC_PHY_TIMEOUT; i > 0; i--) { in alc_mii_writereg_813x()
378 device_printf(sc->alc_dev, "phy write timeout : %d\n", reg); in alc_mii_writereg_813x()
389 if ((sc->alc_flags & ALC_FLAG_LINK) != 0) in alc_mii_writereg_816x()
396 for (i = ALC_PHY_TIMEOUT; i > 0; i--) { in alc_mii_writereg_816x()
404 device_printf(sc->alc_dev, "phy write timeout : %d\n", reg); in alc_mii_writereg_816x()
419 mii = device_get_softc(sc->alc_miibus); in alc_miibus_statchg()
420 ifp = sc->alc_ifp; in alc_miibus_statchg()
425 sc->alc_flags &= ~ALC_FLAG_LINK; in alc_miibus_statchg()
426 if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) == in alc_miibus_statchg()
428 switch (IFM_SUBTYPE(mii->mii_media_active)) { in alc_miibus_statchg()
431 sc->alc_flags |= ALC_FLAG_LINK; in alc_miibus_statchg()
434 if ((sc->alc_flags & ALC_FLAG_FASTETHER) == 0) in alc_miibus_statchg()
435 sc->alc_flags |= ALC_FLAG_LINK; in alc_miibus_statchg()
444 /* Program MACs with resolved speed/duplex/flow-control. */ in alc_miibus_statchg()
445 if ((sc->alc_flags & ALC_FLAG_LINK) != 0) { in alc_miibus_statchg()
448 /* Re-enable Tx/Rx MACs. */ in alc_miibus_statchg()
453 alc_aspm(sc, 0, IFM_SUBTYPE(mii->mii_media_active)); in alc_miibus_statchg()
454 alc_dsp_fixup(sc, IFM_SUBTYPE(mii->mii_media_active)); in alc_miibus_statchg()
461 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, ALC_MII_DBG_ADDR, in alc_miidbg_readreg()
463 return (alc_miibus_readreg(sc->alc_dev, sc->alc_phyaddr, in alc_miidbg_readreg()
471 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, ALC_MII_DBG_ADDR, in alc_miidbg_writereg()
473 return (alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_miidbg_writereg()
485 if ((sc->alc_flags & ALC_FLAG_LINK) != 0) in alc_miiext_readreg()
491 for (i = ALC_PHY_TIMEOUT; i > 0; i--) { in alc_miiext_readreg()
499 device_printf(sc->alc_dev, "phy ext read timeout : %d, %d\n", in alc_miiext_readreg()
515 if ((sc->alc_flags & ALC_FLAG_LINK) != 0) in alc_miiext_writereg()
522 for (i = ALC_PHY_TIMEOUT; i > 0; i--) { in alc_miiext_writereg()
530 device_printf(sc->alc_dev, "phy ext write timeout : %d, %d\n", in alc_miiext_writereg()
541 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_dsp_fixup()
543 if (AR816X_REV(sc->alc_rev) >= AR816X_REV_C0) in alc_dsp_fixup()
550 if ((sc->alc_flags & ALC_FLAG_LINK) != 0) { in alc_dsp_fixup()
576 if ((sc->alc_flags & ALC_FLAG_LINK_WAR) != 0 && in alc_dsp_fixup()
577 AR816X_REV(sc->alc_rev) == AR816X_REV_B0) { in alc_dsp_fixup()
596 if ((sc->alc_flags & ALC_FLAG_LINK_WAR) != 0 && in alc_dsp_fixup()
597 AR816X_REV(sc->alc_rev) == AR816X_REV_B0) { in alc_dsp_fixup()
620 mii = device_get_softc(sc->alc_miibus); in alc_mediastatus()
623 ifmr->ifm_status = mii->mii_media_status; in alc_mediastatus()
624 ifmr->ifm_active = mii->mii_media_active; in alc_mediastatus()
651 mii = device_get_softc(sc->alc_miibus); in alc_mediachange_locked()
652 LIST_FOREACH(miisc, &mii->mii_phys, mii_list) in alc_mediachange_locked()
667 for (ident = alc_ident_table; ident->name != NULL; ident++) { in alc_find_ident()
668 if (vendor == ident->vendorid && devid == ident->deviceid) in alc_find_ident()
682 device_set_desc(dev, ident->name); in alc_probe()
693 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_get_macaddr()
715 switch (sc->alc_ident->deviceid) { in alc_get_macaddr_813x()
729 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_get_macaddr_813x()
731 val = alc_miibus_readreg(sc->alc_dev, sc->alc_phyaddr, in alc_get_macaddr_813x()
733 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_get_macaddr_813x()
735 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_get_macaddr_813x()
737 val = alc_miibus_readreg(sc->alc_dev, sc->alc_phyaddr, in alc_get_macaddr_813x()
739 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_get_macaddr_813x()
752 for (i = 100; i > 0; i--) { in alc_get_macaddr_813x()
759 device_printf(sc->alc_dev, in alc_get_macaddr_813x()
763 device_printf(sc->alc_dev, "EEPROM not found!\n"); in alc_get_macaddr_813x()
766 switch (sc->alc_ident->deviceid) { in alc_get_macaddr_813x()
780 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_get_macaddr_813x()
782 val = alc_miibus_readreg(sc->alc_dev, sc->alc_phyaddr, in alc_get_macaddr_813x()
784 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_get_macaddr_813x()
786 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_get_macaddr_813x()
788 val = alc_miibus_readreg(sc->alc_dev, sc->alc_phyaddr, in alc_get_macaddr_813x()
790 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_get_macaddr_813x()
808 for (i = 100; i > 0; i--) { in alc_get_macaddr_816x()
816 for (i = 100; i > 0; i--) { in alc_get_macaddr_816x()
825 device_printf(sc->alc_dev, in alc_get_macaddr_816x()
834 for (i = 100; i > 0; i--) { in alc_get_macaddr_816x()
844 for (i = 100; i > 0; i--) { in alc_get_macaddr_816x()
851 device_printf(sc->alc_dev, in alc_get_macaddr_816x()
866 sc->alc_eaddr[0] = (ea[1] >> 8) & 0xFF; in alc_get_macaddr_par()
867 sc->alc_eaddr[1] = (ea[1] >> 0) & 0xFF; in alc_get_macaddr_par()
868 sc->alc_eaddr[2] = (ea[0] >> 24) & 0xFF; in alc_get_macaddr_par()
869 sc->alc_eaddr[3] = (ea[0] >> 16) & 0xFF; in alc_get_macaddr_par()
870 sc->alc_eaddr[4] = (ea[0] >> 8) & 0xFF; in alc_get_macaddr_par()
871 sc->alc_eaddr[5] = (ea[0] >> 0) & 0xFF; in alc_get_macaddr_par()
879 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) { in alc_disable_l0s_l1()
895 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_phy_reset()
917 if (sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B) { in alc_phy_reset_813x()
918 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
920 data = alc_miibus_readreg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
922 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
925 if (sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8151 || in alc_phy_reset_813x()
926 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8151_V2 || in alc_phy_reset_813x()
927 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B || in alc_phy_reset_813x()
928 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B2) { in alc_phy_reset_813x()
929 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
931 data = alc_miibus_readreg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
933 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
937 if (sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8151) { in alc_phy_reset_813x()
938 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
940 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
943 if (sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8131 || in alc_phy_reset_813x()
944 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8132 || in alc_phy_reset_813x()
945 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8151_V2 || in alc_phy_reset_813x()
946 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B2) { in alc_phy_reset_813x()
947 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
949 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
956 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
958 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
964 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
966 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
974 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
976 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
983 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
985 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
991 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
993 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
998 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, ALC_MII_DBG_ADDR, in alc_phy_reset_813x()
1000 data = alc_miibus_readreg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
1003 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, ALC_MII_DBG_DATA, in alc_phy_reset_813x()
1006 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, ALC_MII_DBG_ADDR, in alc_phy_reset_813x()
1008 data = alc_miibus_readreg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_reset_813x()
1011 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, ALC_MII_DBG_DATA, in alc_phy_reset_813x()
1072 if ((sc->alc_flags & ALC_FLAG_LINK_WAR) != 0) { in alc_phy_reset_816x()
1093 switch (sc->alc_ident->deviceid) { in alc_phy_down()
1124 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_phy_down()
1141 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_aspm()
1153 if ((sc->alc_flags & ALC_FLAG_LINK) == 0) in alc_aspm_813x()
1157 if ((sc->alc_flags & (ALC_FLAG_APS | ALC_FLAG_PCIE)) == in alc_aspm_813x()
1159 linkcfg = CSR_READ_2(sc, sc->alc_expcap + in alc_aspm_813x()
1169 if ((sc->alc_flags & ALC_FLAG_APS) != 0) { in alc_aspm_813x()
1172 if (sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B && in alc_aspm_813x()
1173 sc->alc_rev == ATHEROS_AR8152_B_V10) in alc_aspm_813x()
1175 CSR_WRITE_2(sc, sc->alc_expcap + PCIER_LINK_CTL, in alc_aspm_813x()
1187 if ((sc->alc_flags & ALC_FLAG_LINK) != 0) { in alc_aspm_813x()
1188 if ((sc->alc_flags & ALC_FLAG_L0S) != 0) in alc_aspm_813x()
1190 if ((sc->alc_flags & ALC_FLAG_L1S) != 0) in alc_aspm_813x()
1192 if ((sc->alc_flags & ALC_FLAG_APS) != 0) { in alc_aspm_813x()
1193 if (sc->alc_ident->deviceid == in alc_aspm_813x()
1202 switch (sc->alc_ident->deviceid) { in alc_aspm_813x()
1229 if ((sc->alc_flags & ALC_FLAG_L1S) != 0) in alc_aspm_813x()
1253 if (AR816X_REV(sc->alc_rev) <= AR816X_REV_A1 && in alc_aspm_816x()
1254 (sc->alc_rev & 0x01) != 0) in alc_aspm_816x()
1256 if ((sc->alc_flags & ALC_FLAG_LINK) != 0) { in alc_aspm_816x()
1264 else if ((if_getdrvflags(sc->alc_ifp) & IFF_DRV_RUNNING) != 0) in alc_aspm_816x()
1277 /* Clear data link and flow-control protocol error. */ in alc_init_pcie()
1282 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) { in alc_init_pcie()
1288 if (sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B && in alc_init_pcie()
1289 sc->alc_rev == ATHEROS_AR8152_B_V10) { in alc_init_pcie()
1298 cap = CSR_READ_2(sc, sc->alc_expcap + PCIER_LINK_CAP); in alc_init_pcie()
1300 ctl = CSR_READ_2(sc, sc->alc_expcap + PCIER_LINK_CTL); in alc_init_pcie()
1302 sc->alc_rcb = DMA_CFG_RCB_128; in alc_init_pcie()
1304 device_printf(sc->alc_dev, "RCB %u bytes\n", in alc_init_pcie()
1305 sc->alc_rcb == DMA_CFG_RCB_64 ? 64 : 128); in alc_init_pcie()
1308 sc->alc_flags |= ALC_FLAG_L0S; in alc_init_pcie()
1310 sc->alc_flags |= ALC_FLAG_L1S; in alc_init_pcie()
1312 device_printf(sc->alc_dev, "ASPM %s %s\n", in alc_init_pcie()
1318 device_printf(sc->alc_dev, in alc_init_pcie()
1326 if (AR816X_REV(sc->alc_rev) <= AR816X_REV_A1 && in alc_init_pcie()
1327 (sc->alc_rev & 0x01) != 0) { in alc_init_pcie()
1350 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_config_msi()
1360 mod = ALC_USECS(sc->alc_int_rx_mod); in alc_config_msi()
1364 if ((sc->alc_flags & ALC_FLAG_MSIX) != 0) in alc_config_msi()
1367 else if ((sc->alc_flags & ALC_FLAG_MSI) != 0) in alc_config_msi()
1385 sc->alc_dev = dev; in alc_attach()
1386 sc->alc_rev = pci_get_revid(dev); in alc_attach()
1388 mtx_init(&sc->alc_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, in alc_attach()
1390 callout_init_mtx(&sc->alc_tick_ch, &sc->alc_mtx, 0); in alc_attach()
1391 NET_TASK_INIT(&sc->alc_int_task, 0, alc_int_task, sc); in alc_attach()
1392 sc->alc_ident = alc_find_ident(dev); in alc_attach()
1396 sc->alc_res_spec = alc_res_spec_mem; in alc_attach()
1397 sc->alc_irq_spec = alc_irq_spec_legacy; in alc_attach()
1398 error = bus_alloc_resources(dev, sc->alc_res_spec, sc->alc_res); in alc_attach()
1405 sc->alc_phyaddr = ALC_PHY_ADDR; in alc_attach()
1414 switch (sc->alc_ident->deviceid) { in alc_attach()
1418 sc->alc_flags |= ALC_FLAG_E2X00; in alc_attach()
1421 * Disable MSI-X by default on Killer devices, since this is in alc_attach()
1430 pci_get_subdevice(dev) == 0x0091 && sc->alc_rev == 0) in alc_attach()
1431 sc->alc_flags |= ALC_FLAG_LINK_WAR; in alc_attach()
1434 sc->alc_flags |= ALC_FLAG_AR816X_FAMILY; in alc_attach()
1438 sc->alc_flags |= ALC_FLAG_FASTETHER | ALC_FLAG_AR816X_FAMILY; in alc_attach()
1442 sc->alc_flags |= ALC_FLAG_APS; in alc_attach()
1445 sc->alc_flags |= ALC_FLAG_FASTETHER; in alc_attach()
1449 sc->alc_flags |= ALC_FLAG_APS; in alc_attach()
1451 sc->alc_flags |= ALC_FLAG_MT; in alc_attach()
1458 * The default value of msix_disable is 2, which means auto-detect. If in alc_attach()
1459 * we didn't auto-detect it, default to enabling it. in alc_attach()
1464 sc->alc_flags |= ALC_FLAG_JUMBO; in alc_attach()
1472 sc->alc_flags |= ALC_FLAG_SMB_BUG; in alc_attach()
1476 sc->alc_flags |= ALC_FLAG_CMB_BUG; in alc_attach()
1477 sc->alc_chip_rev = CSR_READ_4(sc, ALC_MASTER_CFG) >> in alc_attach()
1481 sc->alc_rev); in alc_attach()
1483 sc->alc_chip_rev); in alc_attach()
1484 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_attach()
1486 AR816X_REV(sc->alc_rev)); in alc_attach()
1493 sc->alc_dma_rd_burst = 0; in alc_attach()
1494 sc->alc_dma_wr_burst = 0; in alc_attach()
1495 sc->alc_rcb = DMA_CFG_RCB_64; in alc_attach()
1497 sc->alc_flags |= ALC_FLAG_PCIE; in alc_attach()
1498 sc->alc_expcap = base; in alc_attach()
1500 sc->alc_dma_rd_burst = in alc_attach()
1502 sc->alc_dma_wr_burst = (burst & PCIEM_CTL_MAX_PAYLOAD) >> 5; in alc_attach()
1505 alc_dma_burst[sc->alc_dma_rd_burst]); in alc_attach()
1507 alc_dma_burst[sc->alc_dma_wr_burst]); in alc_attach()
1509 if (alc_dma_burst[sc->alc_dma_rd_burst] > 1024) in alc_attach()
1510 sc->alc_dma_rd_burst = 3; in alc_attach()
1511 if (alc_dma_burst[sc->alc_dma_wr_burst] > 1024) in alc_attach()
1512 sc->alc_dma_wr_burst = 3; in alc_attach()
1518 if ((sc->alc_flags & in alc_attach()
1520 sc->alc_dma_wr_burst = 0; in alc_attach()
1554 sc->alc_flags |= ALC_FLAG_MSIX; in alc_attach()
1555 sc->alc_irq_spec = alc_irq_spec_msix; in alc_attach()
1559 if (msi_disable == 0 && (sc->alc_flags & ALC_FLAG_MSIX) == 0 && in alc_attach()
1564 sc->alc_flags |= ALC_FLAG_MSI; in alc_attach()
1565 sc->alc_irq_spec = alc_irq_spec_msi; in alc_attach()
1571 error = bus_alloc_resources(dev, sc->alc_irq_spec, sc->alc_irq); in alc_attach()
1586 ifp = sc->alc_ifp = if_alloc(IFT_ETHER); in alc_attach()
1593 if_setsendqlen(ifp, ALC_TX_RING_CNT - 1); in alc_attach()
1599 sc->alc_flags |= ALC_FLAG_PM; in alc_attach()
1604 error = mii_attach(dev, &sc->alc_miibus, ifp, alc_mediachange, in alc_attach()
1605 alc_mediastatus, BMSR_DEFCAPMASK, sc->alc_phyaddr, MII_OFFSET_ANY, in alc_attach()
1612 ether_ifattach(ifp, sc->alc_eaddr); in alc_attach()
1630 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) { in alc_attach()
1639 sc->alc_tq = taskqueue_create_fast("alc_taskq", M_WAITOK, in alc_attach()
1640 taskqueue_thread_enqueue, &sc->alc_tq); in alc_attach()
1641 taskqueue_start_threads(&sc->alc_tq, 1, PI_NET, "%s taskq", in alc_attach()
1642 device_get_nameunit(sc->alc_dev)); in alc_attach()
1645 if ((sc->alc_flags & ALC_FLAG_MSIX) != 0) in alc_attach()
1647 else if ((sc->alc_flags & ALC_FLAG_MSI) != 0) in alc_attach()
1652 error = bus_setup_intr(dev, sc->alc_irq[i], in alc_attach()
1654 &sc->alc_intrhand[i]); in alc_attach()
1660 taskqueue_free(sc->alc_tq); in alc_attach()
1661 sc->alc_tq = NULL; in alc_attach()
1685 ifp = sc->alc_ifp; in alc_detach()
1691 callout_drain(&sc->alc_tick_ch); in alc_detach()
1692 taskqueue_drain(sc->alc_tq, &sc->alc_int_task); in alc_detach()
1695 if (sc->alc_tq != NULL) { in alc_detach()
1696 taskqueue_drain(sc->alc_tq, &sc->alc_int_task); in alc_detach()
1697 taskqueue_free(sc->alc_tq); in alc_detach()
1698 sc->alc_tq = NULL; in alc_detach()
1706 sc->alc_ifp = NULL; in alc_detach()
1709 if ((sc->alc_flags & ALC_FLAG_MSIX) != 0) in alc_detach()
1711 else if ((sc->alc_flags & ALC_FLAG_MSI) != 0) in alc_detach()
1716 if (sc->alc_intrhand[i] != NULL) { in alc_detach()
1717 bus_teardown_intr(dev, sc->alc_irq[i], in alc_detach()
1718 sc->alc_intrhand[i]); in alc_detach()
1719 sc->alc_intrhand[i] = NULL; in alc_detach()
1722 if (sc->alc_res[0] != NULL) in alc_detach()
1724 bus_release_resources(dev, sc->alc_irq_spec, sc->alc_irq); in alc_detach()
1725 if ((sc->alc_flags & (ALC_FLAG_MSI | ALC_FLAG_MSIX)) != 0) in alc_detach()
1727 bus_release_resources(dev, sc->alc_res_spec, sc->alc_res); in alc_detach()
1728 mtx_destroy(&sc->alc_mtx); in alc_detach()
1744 struct alc_hw_stats *stats; in alc_sysctl_node() local
1747 stats = &sc->alc_stats; in alc_sysctl_node()
1748 ctx = device_get_sysctl_ctx(sc->alc_dev); in alc_sysctl_node()
1749 child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->alc_dev)); in alc_sysctl_node()
1752 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, &sc->alc_int_rx_mod, in alc_sysctl_node()
1755 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, &sc->alc_int_tx_mod, in alc_sysctl_node()
1758 sc->alc_int_rx_mod = ALC_IM_RX_TIMER_DEFAULT; in alc_sysctl_node()
1759 error = resource_int_value(device_get_name(sc->alc_dev), in alc_sysctl_node()
1760 device_get_unit(sc->alc_dev), "int_rx_mod", &sc->alc_int_rx_mod); in alc_sysctl_node()
1762 if (sc->alc_int_rx_mod < ALC_IM_TIMER_MIN || in alc_sysctl_node()
1763 sc->alc_int_rx_mod > ALC_IM_TIMER_MAX) { in alc_sysctl_node()
1764 device_printf(sc->alc_dev, "int_rx_mod value out of " in alc_sysctl_node()
1767 sc->alc_int_rx_mod = ALC_IM_RX_TIMER_DEFAULT; in alc_sysctl_node()
1770 sc->alc_int_tx_mod = ALC_IM_TX_TIMER_DEFAULT; in alc_sysctl_node()
1771 error = resource_int_value(device_get_name(sc->alc_dev), in alc_sysctl_node()
1772 device_get_unit(sc->alc_dev), "int_tx_mod", &sc->alc_int_tx_mod); in alc_sysctl_node()
1774 if (sc->alc_int_tx_mod < ALC_IM_TIMER_MIN || in alc_sysctl_node()
1775 sc->alc_int_tx_mod > ALC_IM_TIMER_MAX) { in alc_sysctl_node()
1776 device_printf(sc->alc_dev, "int_tx_mod value out of " in alc_sysctl_node()
1779 sc->alc_int_tx_mod = ALC_IM_TX_TIMER_DEFAULT; in alc_sysctl_node()
1784 &sc->alc_process_limit, 0, sysctl_hw_alc_proc_limit, "I", in alc_sysctl_node()
1787 sc->alc_process_limit = ALC_PROC_DEFAULT; in alc_sysctl_node()
1788 error = resource_int_value(device_get_name(sc->alc_dev), in alc_sysctl_node()
1789 device_get_unit(sc->alc_dev), "process_limit", in alc_sysctl_node()
1790 &sc->alc_process_limit); in alc_sysctl_node()
1792 if (sc->alc_process_limit < ALC_PROC_MIN || in alc_sysctl_node()
1793 sc->alc_process_limit > ALC_PROC_MAX) { in alc_sysctl_node()
1794 device_printf(sc->alc_dev, in alc_sysctl_node()
1797 sc->alc_process_limit = ALC_PROC_DEFAULT; in alc_sysctl_node()
1801 tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", in alc_sysctl_node()
1810 &stats->rx_frames, "Good frames"); in alc_sysctl_node()
1812 &stats->rx_bcast_frames, "Good broadcast frames"); in alc_sysctl_node()
1814 &stats->rx_mcast_frames, "Good multicast frames"); in alc_sysctl_node()
1816 &stats->rx_pause_frames, "Pause control frames"); in alc_sysctl_node()
1818 &stats->rx_control_frames, "Control frames"); in alc_sysctl_node()
1820 &stats->rx_crcerrs, "CRC errors"); in alc_sysctl_node()
1822 &stats->rx_lenerrs, "Frames with length mismatched"); in alc_sysctl_node()
1824 &stats->rx_bytes, "Good octets"); in alc_sysctl_node()
1826 &stats->rx_bcast_bytes, "Good broadcast octets"); in alc_sysctl_node()
1828 &stats->rx_mcast_bytes, "Good multicast octets"); in alc_sysctl_node()
1830 &stats->rx_runts, "Too short frames"); in alc_sysctl_node()
1832 &stats->rx_fragments, "Fragmented frames"); in alc_sysctl_node()
1834 &stats->rx_pkts_64, "64 bytes frames"); in alc_sysctl_node()
1836 &stats->rx_pkts_65_127, "65 to 127 bytes frames"); in alc_sysctl_node()
1838 &stats->rx_pkts_128_255, "128 to 255 bytes frames"); in alc_sysctl_node()
1840 &stats->rx_pkts_256_511, "256 to 511 bytes frames"); in alc_sysctl_node()
1842 &stats->rx_pkts_512_1023, "512 to 1023 bytes frames"); in alc_sysctl_node()
1844 &stats->rx_pkts_1024_1518, "1024 to 1518 bytes frames"); in alc_sysctl_node()
1846 &stats->rx_pkts_1519_max, "1519 to max frames"); in alc_sysctl_node()
1848 &stats->rx_pkts_truncated, "Truncated frames due to MTU size"); in alc_sysctl_node()
1850 &stats->rx_fifo_oflows, "FIFO overflows"); in alc_sysctl_node()
1852 &stats->rx_rrs_errs, "Return status write-back errors"); in alc_sysctl_node()
1854 &stats->rx_alignerrs, "Alignment errors"); in alc_sysctl_node()
1856 &stats->rx_pkts_filtered, in alc_sysctl_node()
1864 &stats->tx_frames, "Good frames"); in alc_sysctl_node()
1866 &stats->tx_bcast_frames, "Good broadcast frames"); in alc_sysctl_node()
1868 &stats->tx_mcast_frames, "Good multicast frames"); in alc_sysctl_node()
1870 &stats->tx_pause_frames, "Pause control frames"); in alc_sysctl_node()
1872 &stats->tx_control_frames, "Control frames"); in alc_sysctl_node()
1874 &stats->tx_excess_defer, "Frames with excessive derferrals"); in alc_sysctl_node()
1876 &stats->tx_excess_defer, "Frames with derferrals"); in alc_sysctl_node()
1878 &stats->tx_bytes, "Good octets"); in alc_sysctl_node()
1880 &stats->tx_bcast_bytes, "Good broadcast octets"); in alc_sysctl_node()
1882 &stats->tx_mcast_bytes, "Good multicast octets"); in alc_sysctl_node()
1884 &stats->tx_pkts_64, "64 bytes frames"); in alc_sysctl_node()
1886 &stats->tx_pkts_65_127, "65 to 127 bytes frames"); in alc_sysctl_node()
1888 &stats->tx_pkts_128_255, "128 to 255 bytes frames"); in alc_sysctl_node()
1890 &stats->tx_pkts_256_511, "256 to 511 bytes frames"); in alc_sysctl_node()
1892 &stats->tx_pkts_512_1023, "512 to 1023 bytes frames"); in alc_sysctl_node()
1894 &stats->tx_pkts_1024_1518, "1024 to 1518 bytes frames"); in alc_sysctl_node()
1896 &stats->tx_pkts_1519_max, "1519 to max frames"); in alc_sysctl_node()
1898 &stats->tx_single_colls, "Single collisions"); in alc_sysctl_node()
1900 &stats->tx_multi_colls, "Multiple collisions"); in alc_sysctl_node()
1902 &stats->tx_late_colls, "Late collisions"); in alc_sysctl_node()
1904 &stats->tx_excess_colls, "Excessive collisions"); in alc_sysctl_node()
1906 &stats->tx_underrun, "FIFO underruns"); in alc_sysctl_node()
1908 &stats->tx_desc_underrun, "Descriptor write-back errors"); in alc_sysctl_node()
1910 &stats->tx_lenerrs, "Frames with length mismatched"); in alc_sysctl_node()
1912 &stats->tx_pkts_truncated, "Truncated frames due to MTU size"); in alc_sysctl_node()
1933 ctx->alc_busaddr = segs[0].ds_addr; in alc_dmamap_cb()
1946 rx_ring_end = sc->alc_rdata.alc_rx_ring_paddr + ALC_RX_RING_SZ; in alc_check_boundary()
1947 rr_ring_end = sc->alc_rdata.alc_rr_ring_paddr + ALC_RR_RING_SZ; in alc_check_boundary()
1948 cmb_end = sc->alc_rdata.alc_cmb_paddr + ALC_CMB_SZ; in alc_check_boundary()
1949 tx_ring_end = sc->alc_rdata.alc_tx_ring_paddr + ALC_TX_RING_SZ; in alc_check_boundary()
1953 ALC_ADDR_HI(sc->alc_rdata.alc_rx_ring_paddr)) || in alc_check_boundary()
1955 ALC_ADDR_HI(sc->alc_rdata.alc_rr_ring_paddr)) || in alc_check_boundary()
1957 ALC_ADDR_HI(sc->alc_rdata.alc_cmb_paddr)) || in alc_check_boundary()
1959 ALC_ADDR_HI(sc->alc_rdata.alc_tx_ring_paddr))) in alc_check_boundary()
1982 if (sc->alc_flags & ALC_FLAG_MT) in alc_dma_alloc()
1987 bus_get_dma_tag(sc->alc_dev), /* parent */ in alc_dma_alloc()
1997 &sc->alc_cdata.alc_parent_tag); in alc_dma_alloc()
1999 device_printf(sc->alc_dev, in alc_dma_alloc()
2006 sc->alc_cdata.alc_parent_tag, /* parent */ in alc_dma_alloc()
2016 &sc->alc_cdata.alc_tx_ring_tag); in alc_dma_alloc()
2018 device_printf(sc->alc_dev, in alc_dma_alloc()
2025 sc->alc_cdata.alc_parent_tag, /* parent */ in alc_dma_alloc()
2035 &sc->alc_cdata.alc_rx_ring_tag); in alc_dma_alloc()
2037 device_printf(sc->alc_dev, in alc_dma_alloc()
2043 sc->alc_cdata.alc_parent_tag, /* parent */ in alc_dma_alloc()
2053 &sc->alc_cdata.alc_rr_ring_tag); in alc_dma_alloc()
2055 device_printf(sc->alc_dev, in alc_dma_alloc()
2062 sc->alc_cdata.alc_parent_tag, /* parent */ in alc_dma_alloc()
2072 &sc->alc_cdata.alc_cmb_tag); in alc_dma_alloc()
2074 device_printf(sc->alc_dev, in alc_dma_alloc()
2080 sc->alc_cdata.alc_parent_tag, /* parent */ in alc_dma_alloc()
2090 &sc->alc_cdata.alc_smb_tag); in alc_dma_alloc()
2092 device_printf(sc->alc_dev, in alc_dma_alloc()
2098 error = bus_dmamem_alloc(sc->alc_cdata.alc_tx_ring_tag, in alc_dma_alloc()
2099 (void **)&sc->alc_rdata.alc_tx_ring, in alc_dma_alloc()
2101 &sc->alc_cdata.alc_tx_ring_map); in alc_dma_alloc()
2103 device_printf(sc->alc_dev, in alc_dma_alloc()
2108 error = bus_dmamap_load(sc->alc_cdata.alc_tx_ring_tag, in alc_dma_alloc()
2109 sc->alc_cdata.alc_tx_ring_map, sc->alc_rdata.alc_tx_ring, in alc_dma_alloc()
2112 device_printf(sc->alc_dev, in alc_dma_alloc()
2116 sc->alc_rdata.alc_tx_ring_paddr = ctx.alc_busaddr; in alc_dma_alloc()
2119 error = bus_dmamem_alloc(sc->alc_cdata.alc_rx_ring_tag, in alc_dma_alloc()
2120 (void **)&sc->alc_rdata.alc_rx_ring, in alc_dma_alloc()
2122 &sc->alc_cdata.alc_rx_ring_map); in alc_dma_alloc()
2124 device_printf(sc->alc_dev, in alc_dma_alloc()
2129 error = bus_dmamap_load(sc->alc_cdata.alc_rx_ring_tag, in alc_dma_alloc()
2130 sc->alc_cdata.alc_rx_ring_map, sc->alc_rdata.alc_rx_ring, in alc_dma_alloc()
2133 device_printf(sc->alc_dev, in alc_dma_alloc()
2137 sc->alc_rdata.alc_rx_ring_paddr = ctx.alc_busaddr; in alc_dma_alloc()
2140 error = bus_dmamem_alloc(sc->alc_cdata.alc_rr_ring_tag, in alc_dma_alloc()
2141 (void **)&sc->alc_rdata.alc_rr_ring, in alc_dma_alloc()
2143 &sc->alc_cdata.alc_rr_ring_map); in alc_dma_alloc()
2145 device_printf(sc->alc_dev, in alc_dma_alloc()
2150 error = bus_dmamap_load(sc->alc_cdata.alc_rr_ring_tag, in alc_dma_alloc()
2151 sc->alc_cdata.alc_rr_ring_map, sc->alc_rdata.alc_rr_ring, in alc_dma_alloc()
2154 device_printf(sc->alc_dev, in alc_dma_alloc()
2158 sc->alc_rdata.alc_rr_ring_paddr = ctx.alc_busaddr; in alc_dma_alloc()
2161 error = bus_dmamem_alloc(sc->alc_cdata.alc_cmb_tag, in alc_dma_alloc()
2162 (void **)&sc->alc_rdata.alc_cmb, in alc_dma_alloc()
2164 &sc->alc_cdata.alc_cmb_map); in alc_dma_alloc()
2166 device_printf(sc->alc_dev, in alc_dma_alloc()
2171 error = bus_dmamap_load(sc->alc_cdata.alc_cmb_tag, in alc_dma_alloc()
2172 sc->alc_cdata.alc_cmb_map, sc->alc_rdata.alc_cmb, in alc_dma_alloc()
2175 device_printf(sc->alc_dev, in alc_dma_alloc()
2179 sc->alc_rdata.alc_cmb_paddr = ctx.alc_busaddr; in alc_dma_alloc()
2182 error = bus_dmamem_alloc(sc->alc_cdata.alc_smb_tag, in alc_dma_alloc()
2183 (void **)&sc->alc_rdata.alc_smb, in alc_dma_alloc()
2185 &sc->alc_cdata.alc_smb_map); in alc_dma_alloc()
2187 device_printf(sc->alc_dev, in alc_dma_alloc()
2192 error = bus_dmamap_load(sc->alc_cdata.alc_smb_tag, in alc_dma_alloc()
2193 sc->alc_cdata.alc_smb_map, sc->alc_rdata.alc_smb, in alc_dma_alloc()
2196 device_printf(sc->alc_dev, in alc_dma_alloc()
2200 sc->alc_rdata.alc_smb_paddr = ctx.alc_busaddr; in alc_dma_alloc()
2205 device_printf(sc->alc_dev, "4GB boundary crossed, " in alc_dma_alloc()
2224 bus_get_dma_tag(sc->alc_dev), /* parent */ in alc_dma_alloc()
2234 &sc->alc_cdata.alc_buffer_tag); in alc_dma_alloc()
2236 device_printf(sc->alc_dev, in alc_dma_alloc()
2243 sc->alc_cdata.alc_buffer_tag, /* parent */ in alc_dma_alloc()
2253 &sc->alc_cdata.alc_tx_tag); in alc_dma_alloc()
2255 device_printf(sc->alc_dev, "could not create Tx DMA tag.\n"); in alc_dma_alloc()
2261 sc->alc_cdata.alc_buffer_tag, /* parent */ in alc_dma_alloc()
2271 &sc->alc_cdata.alc_rx_tag); in alc_dma_alloc()
2273 device_printf(sc->alc_dev, "could not create Rx DMA tag.\n"); in alc_dma_alloc()
2278 txd = &sc->alc_cdata.alc_txdesc[i]; in alc_dma_alloc()
2279 txd->tx_m = NULL; in alc_dma_alloc()
2280 txd->tx_dmamap = NULL; in alc_dma_alloc()
2281 error = bus_dmamap_create(sc->alc_cdata.alc_tx_tag, 0, in alc_dma_alloc()
2282 &txd->tx_dmamap); in alc_dma_alloc()
2284 device_printf(sc->alc_dev, in alc_dma_alloc()
2290 if ((error = bus_dmamap_create(sc->alc_cdata.alc_rx_tag, 0, in alc_dma_alloc()
2291 &sc->alc_cdata.alc_rx_sparemap)) != 0) { in alc_dma_alloc()
2292 device_printf(sc->alc_dev, in alc_dma_alloc()
2297 rxd = &sc->alc_cdata.alc_rxdesc[i]; in alc_dma_alloc()
2298 rxd->rx_m = NULL; in alc_dma_alloc()
2299 rxd->rx_dmamap = NULL; in alc_dma_alloc()
2300 error = bus_dmamap_create(sc->alc_cdata.alc_rx_tag, 0, in alc_dma_alloc()
2301 &rxd->rx_dmamap); in alc_dma_alloc()
2303 device_printf(sc->alc_dev, in alc_dma_alloc()
2321 if (sc->alc_cdata.alc_tx_tag != NULL) { in alc_dma_free()
2323 txd = &sc->alc_cdata.alc_txdesc[i]; in alc_dma_free()
2324 if (txd->tx_dmamap != NULL) { in alc_dma_free()
2325 bus_dmamap_destroy(sc->alc_cdata.alc_tx_tag, in alc_dma_free()
2326 txd->tx_dmamap); in alc_dma_free()
2327 txd->tx_dmamap = NULL; in alc_dma_free()
2330 bus_dma_tag_destroy(sc->alc_cdata.alc_tx_tag); in alc_dma_free()
2331 sc->alc_cdata.alc_tx_tag = NULL; in alc_dma_free()
2334 if (sc->alc_cdata.alc_rx_tag != NULL) { in alc_dma_free()
2336 rxd = &sc->alc_cdata.alc_rxdesc[i]; in alc_dma_free()
2337 if (rxd->rx_dmamap != NULL) { in alc_dma_free()
2338 bus_dmamap_destroy(sc->alc_cdata.alc_rx_tag, in alc_dma_free()
2339 rxd->rx_dmamap); in alc_dma_free()
2340 rxd->rx_dmamap = NULL; in alc_dma_free()
2343 if (sc->alc_cdata.alc_rx_sparemap != NULL) { in alc_dma_free()
2344 bus_dmamap_destroy(sc->alc_cdata.alc_rx_tag, in alc_dma_free()
2345 sc->alc_cdata.alc_rx_sparemap); in alc_dma_free()
2346 sc->alc_cdata.alc_rx_sparemap = NULL; in alc_dma_free()
2348 bus_dma_tag_destroy(sc->alc_cdata.alc_rx_tag); in alc_dma_free()
2349 sc->alc_cdata.alc_rx_tag = NULL; in alc_dma_free()
2352 if (sc->alc_cdata.alc_tx_ring_tag != NULL) { in alc_dma_free()
2353 if (sc->alc_rdata.alc_tx_ring_paddr != 0) in alc_dma_free()
2354 bus_dmamap_unload(sc->alc_cdata.alc_tx_ring_tag, in alc_dma_free()
2355 sc->alc_cdata.alc_tx_ring_map); in alc_dma_free()
2356 if (sc->alc_rdata.alc_tx_ring != NULL) in alc_dma_free()
2357 bus_dmamem_free(sc->alc_cdata.alc_tx_ring_tag, in alc_dma_free()
2358 sc->alc_rdata.alc_tx_ring, in alc_dma_free()
2359 sc->alc_cdata.alc_tx_ring_map); in alc_dma_free()
2360 sc->alc_rdata.alc_tx_ring_paddr = 0; in alc_dma_free()
2361 sc->alc_rdata.alc_tx_ring = NULL; in alc_dma_free()
2362 bus_dma_tag_destroy(sc->alc_cdata.alc_tx_ring_tag); in alc_dma_free()
2363 sc->alc_cdata.alc_tx_ring_tag = NULL; in alc_dma_free()
2366 if (sc->alc_cdata.alc_rx_ring_tag != NULL) { in alc_dma_free()
2367 if (sc->alc_rdata.alc_rx_ring_paddr != 0) in alc_dma_free()
2368 bus_dmamap_unload(sc->alc_cdata.alc_rx_ring_tag, in alc_dma_free()
2369 sc->alc_cdata.alc_rx_ring_map); in alc_dma_free()
2370 if (sc->alc_rdata.alc_rx_ring != NULL) in alc_dma_free()
2371 bus_dmamem_free(sc->alc_cdata.alc_rx_ring_tag, in alc_dma_free()
2372 sc->alc_rdata.alc_rx_ring, in alc_dma_free()
2373 sc->alc_cdata.alc_rx_ring_map); in alc_dma_free()
2374 sc->alc_rdata.alc_rx_ring_paddr = 0; in alc_dma_free()
2375 sc->alc_rdata.alc_rx_ring = NULL; in alc_dma_free()
2376 bus_dma_tag_destroy(sc->alc_cdata.alc_rx_ring_tag); in alc_dma_free()
2377 sc->alc_cdata.alc_rx_ring_tag = NULL; in alc_dma_free()
2380 if (sc->alc_cdata.alc_rr_ring_tag != NULL) { in alc_dma_free()
2381 if (sc->alc_rdata.alc_rr_ring_paddr != 0) in alc_dma_free()
2382 bus_dmamap_unload(sc->alc_cdata.alc_rr_ring_tag, in alc_dma_free()
2383 sc->alc_cdata.alc_rr_ring_map); in alc_dma_free()
2384 if (sc->alc_rdata.alc_rr_ring != NULL) in alc_dma_free()
2385 bus_dmamem_free(sc->alc_cdata.alc_rr_ring_tag, in alc_dma_free()
2386 sc->alc_rdata.alc_rr_ring, in alc_dma_free()
2387 sc->alc_cdata.alc_rr_ring_map); in alc_dma_free()
2388 sc->alc_rdata.alc_rr_ring_paddr = 0; in alc_dma_free()
2389 sc->alc_rdata.alc_rr_ring = NULL; in alc_dma_free()
2390 bus_dma_tag_destroy(sc->alc_cdata.alc_rr_ring_tag); in alc_dma_free()
2391 sc->alc_cdata.alc_rr_ring_tag = NULL; in alc_dma_free()
2394 if (sc->alc_cdata.alc_cmb_tag != NULL) { in alc_dma_free()
2395 if (sc->alc_rdata.alc_cmb_paddr != 0) in alc_dma_free()
2396 bus_dmamap_unload(sc->alc_cdata.alc_cmb_tag, in alc_dma_free()
2397 sc->alc_cdata.alc_cmb_map); in alc_dma_free()
2398 if (sc->alc_rdata.alc_cmb != NULL) in alc_dma_free()
2399 bus_dmamem_free(sc->alc_cdata.alc_cmb_tag, in alc_dma_free()
2400 sc->alc_rdata.alc_cmb, in alc_dma_free()
2401 sc->alc_cdata.alc_cmb_map); in alc_dma_free()
2402 sc->alc_rdata.alc_cmb_paddr = 0; in alc_dma_free()
2403 sc->alc_rdata.alc_cmb = NULL; in alc_dma_free()
2404 bus_dma_tag_destroy(sc->alc_cdata.alc_cmb_tag); in alc_dma_free()
2405 sc->alc_cdata.alc_cmb_tag = NULL; in alc_dma_free()
2408 if (sc->alc_cdata.alc_smb_tag != NULL) { in alc_dma_free()
2409 if (sc->alc_rdata.alc_smb_paddr != 0) in alc_dma_free()
2410 bus_dmamap_unload(sc->alc_cdata.alc_smb_tag, in alc_dma_free()
2411 sc->alc_cdata.alc_smb_map); in alc_dma_free()
2412 if (sc->alc_rdata.alc_smb != NULL) in alc_dma_free()
2413 bus_dmamem_free(sc->alc_cdata.alc_smb_tag, in alc_dma_free()
2414 sc->alc_rdata.alc_smb, in alc_dma_free()
2415 sc->alc_cdata.alc_smb_map); in alc_dma_free()
2416 sc->alc_rdata.alc_smb_paddr = 0; in alc_dma_free()
2417 sc->alc_rdata.alc_smb = NULL; in alc_dma_free()
2418 bus_dma_tag_destroy(sc->alc_cdata.alc_smb_tag); in alc_dma_free()
2419 sc->alc_cdata.alc_smb_tag = NULL; in alc_dma_free()
2421 if (sc->alc_cdata.alc_buffer_tag != NULL) { in alc_dma_free()
2422 bus_dma_tag_destroy(sc->alc_cdata.alc_buffer_tag); in alc_dma_free()
2423 sc->alc_cdata.alc_buffer_tag = NULL; in alc_dma_free()
2425 if (sc->alc_cdata.alc_parent_tag != NULL) { in alc_dma_free()
2426 bus_dma_tag_destroy(sc->alc_cdata.alc_parent_tag); in alc_dma_free()
2427 sc->alc_cdata.alc_parent_tag = NULL; in alc_dma_free()
2440 * restarting auto-negotiation in suspend/shutdown phase but we
2441 * don't know whether that auto-negotiation would succeed or not
2449 * Save current negotiated media speed/duplex/flow-control to
2460 mii = device_get_softc(sc->alc_miibus); in alc_setlinkspeed()
2463 if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) == in alc_setlinkspeed()
2465 switch IFM_SUBTYPE(mii->mii_media_active) { in alc_setlinkspeed()
2476 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, MII_100T2CR, 0); in alc_setlinkspeed()
2477 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_setlinkspeed()
2479 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_setlinkspeed()
2488 if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) in alc_setlinkspeed()
2491 mii->mii_media_active)) { in alc_setlinkspeed()
2505 device_printf(sc->alc_dev, in alc_setlinkspeed()
2509 * No link, force MAC to have 100Mbps, full-duplex link. in alc_setlinkspeed()
2512 mii->mii_media_status = IFM_AVALID | IFM_ACTIVE; in alc_setlinkspeed()
2513 mii->mii_media_active = IFM_ETHER | IFM_100_TX | IFM_FDX; in alc_setlinkspeed()
2521 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_setwol()
2536 ifp = sc->alc_ifp; in alc_setwol_813x()
2537 if ((sc->alc_flags & ALC_FLAG_PM) == 0) { in alc_setwol_813x()
2551 if ((sc->alc_flags & ALC_FLAG_FASTETHER) == 0) in alc_setwol_813x()
2581 pci_enable_pme(sc->alc_dev); in alc_setwol_813x()
2588 uint32_t gphy, mac, master, pmcs, reg; in alc_setwol_816x() local
2592 ifp = sc->alc_ifp; in alc_setwol_816x()
2593 master = CSR_READ_4(sc, ALC_MASTER_CFG); in alc_setwol_816x()
2594 master &= ~MASTER_CLK_SEL_DIS; in alc_setwol_816x()
2599 if ((sc->alc_flags & ALC_FLAG_PM) == 0) { in alc_setwol_816x()
2606 if ((sc->alc_flags & ALC_FLAG_FASTETHER) == 0) in alc_setwol_816x()
2630 CSR_WRITE_4(sc, ALC_MASTER_CFG, master); in alc_setwol_816x()
2637 if ((sc->alc_flags & ALC_FLAG_PM) != 0) { in alc_setwol_816x()
2640 pci_enable_pme(sc->alc_dev); in alc_setwol_816x()
2670 ifp = sc->alc_ifp; in alc_resume()
2701 if ((m->m_pkthdr.csum_flags & (ALC_CSUM_FEATURES | CSUM_TSO)) != 0) { in alc_encap()
2735 if (eh->ether_type == htons(ETHERTYPE_VLAN)) { in alc_encap()
2749 poff = ip_off + (ip->ip_hl << 2); in alc_encap()
2750 if ((m->m_pkthdr.csum_flags & CSUM_TSO) != 0) { in alc_encap()
2757 m = m_pullup(m, poff + (tcp->th_off << 2)); in alc_encap()
2777 ip->ip_sum = 0; in alc_encap()
2778 tcp->th_sum = in_pseudo(ip->ip_src.s_addr, in alc_encap()
2779 ip->ip_dst.s_addr, htons(IPPROTO_TCP)); in alc_encap()
2784 prod = sc->alc_cdata.alc_tx_prod; in alc_encap()
2785 txd = &sc->alc_cdata.alc_txdesc[prod]; in alc_encap()
2787 map = txd->tx_dmamap; in alc_encap()
2789 error = bus_dmamap_load_mbuf_sg(sc->alc_cdata.alc_tx_tag, map, in alc_encap()
2799 error = bus_dmamap_load_mbuf_sg(sc->alc_cdata.alc_tx_tag, map, in alc_encap()
2815 if (sc->alc_cdata.alc_tx_cnt + nsegs >= ALC_TX_RING_CNT - 3) { in alc_encap()
2816 bus_dmamap_unload(sc->alc_cdata.alc_tx_tag, map); in alc_encap()
2819 bus_dmamap_sync(sc->alc_cdata.alc_tx_tag, map, BUS_DMASYNC_PREWRITE); in alc_encap()
2827 if ((m->m_flags & M_VLANTAG) != 0) { in alc_encap()
2828 vtag = htons(m->m_pkthdr.ether_vtag); in alc_encap()
2832 if ((m->m_pkthdr.csum_flags & CSUM_TSO) != 0) { in alc_encap()
2835 cflags |= ((uint32_t)m->m_pkthdr.tso_segsz << TD_MSS_SHIFT) & in alc_encap()
2845 hdrlen = poff + (tcp->th_off << 2); in alc_encap()
2846 desc = &sc->alc_rdata.alc_tx_ring[prod]; in alc_encap()
2847 desc->len = htole32(TX_BYTES(hdrlen | vtag)); in alc_encap()
2848 desc->flags = htole32(cflags); in alc_encap()
2849 desc->addr = htole64(txsegs[0].ds_addr); in alc_encap()
2850 sc->alc_cdata.alc_tx_cnt++; in alc_encap()
2852 if (m->m_len - hdrlen > 0) { in alc_encap()
2854 desc = &sc->alc_rdata.alc_tx_ring[prod]; in alc_encap()
2855 desc->len = htole32(TX_BYTES((m->m_len - hdrlen) | in alc_encap()
2857 desc->flags = htole32(cflags); in alc_encap()
2858 desc->addr = htole64(txsegs[0].ds_addr + hdrlen); in alc_encap()
2859 sc->alc_cdata.alc_tx_cnt++; in alc_encap()
2864 } else if ((m->m_pkthdr.csum_flags & ALC_CSUM_FEATURES) != 0) { in alc_encap()
2872 cflags |= (((poff + m->m_pkthdr.csum_data) >> 1) << in alc_encap()
2875 if ((m->m_pkthdr.csum_flags & CSUM_IP) != 0) in alc_encap()
2877 if ((m->m_pkthdr.csum_flags & CSUM_TCP) != 0) in alc_encap()
2879 if ((m->m_pkthdr.csum_flags & CSUM_UDP) != 0) in alc_encap()
2887 desc = &sc->alc_rdata.alc_tx_ring[prod]; in alc_encap()
2888 desc->len = htole32(TX_BYTES(txsegs[idx].ds_len) | vtag); in alc_encap()
2889 desc->flags = htole32(cflags); in alc_encap()
2890 desc->addr = htole64(txsegs[idx].ds_addr); in alc_encap()
2891 sc->alc_cdata.alc_tx_cnt++; in alc_encap()
2895 sc->alc_cdata.alc_tx_prod = prod; in alc_encap()
2898 prod = (prod + ALC_TX_RING_CNT - 1) % ALC_TX_RING_CNT; in alc_encap()
2899 desc = &sc->alc_rdata.alc_tx_ring[prod]; in alc_encap()
2900 desc->flags |= htole32(TD_EOP); in alc_encap()
2903 txd = &sc->alc_cdata.alc_txdesc[prod]; in alc_encap()
2904 map = txd_last->tx_dmamap; in alc_encap()
2905 txd_last->tx_dmamap = txd->tx_dmamap; in alc_encap()
2906 txd->tx_dmamap = map; in alc_encap()
2907 txd->tx_m = m; in alc_encap()
2935 if (sc->alc_cdata.alc_tx_cnt >= ALC_TX_DESC_HIWAT) in alc_start_locked()
2939 IFF_DRV_RUNNING || (sc->alc_flags & ALC_FLAG_LINK) == 0) in alc_start_locked()
2976 bus_dmamap_sync(sc->alc_cdata.alc_tx_ring_tag, in alc_start_tx()
2977 sc->alc_cdata.alc_tx_ring_map, BUS_DMASYNC_PREWRITE); in alc_start_tx()
2979 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_start_tx()
2981 (uint16_t)sc->alc_cdata.alc_tx_prod); in alc_start_tx()
2984 (sc->alc_cdata.alc_tx_prod << in alc_start_tx()
2988 sc->alc_watchdog_timer = ALC_TX_TIMEOUT; in alc_start_tx()
2998 if (sc->alc_watchdog_timer == 0 || --sc->alc_watchdog_timer) in alc_watchdog()
3001 ifp = sc->alc_ifp; in alc_watchdog()
3002 if ((sc->alc_flags & ALC_FLAG_LINK) == 0) { in alc_watchdog()
3003 if_printf(sc->alc_ifp, "watchdog timeout (lost link)\n"); in alc_watchdog()
3009 if_printf(sc->alc_ifp, "watchdog timeout -- resetting\n"); in alc_watchdog()
3030 if (ifr->ifr_mtu < ETHERMIN || in alc_ioctl()
3031 ifr->ifr_mtu > (sc->alc_ident->max_framelen - in alc_ioctl()
3032 sizeof(struct ether_vlan_header) - ETHER_CRC_LEN) || in alc_ioctl()
3033 ((sc->alc_flags & ALC_FLAG_JUMBO) == 0 && in alc_ioctl()
3034 ifr->ifr_mtu > ETHERMTU)) in alc_ioctl()
3036 else if (if_getmtu(ifp) != ifr->ifr_mtu) { in alc_ioctl()
3038 if_setmtu(ifp, ifr->ifr_mtu); in alc_ioctl()
3053 ((if_getflags(ifp) ^ sc->alc_if_flags) & in alc_ioctl()
3060 sc->alc_if_flags = if_getflags(ifp); in alc_ioctl()
3072 mii = device_get_softc(sc->alc_miibus); in alc_ioctl()
3073 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd); in alc_ioctl()
3077 mask = ifr->ifr_reqcap ^ if_getcapenable(ifp); in alc_ioctl()
3138 mii = device_get_softc(sc->alc_miibus); in alc_mac_config()
3142 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0 || in alc_mac_config()
3143 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8151 || in alc_mac_config()
3144 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8151_V2 || in alc_mac_config()
3145 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B2) in alc_mac_config()
3148 switch (IFM_SUBTYPE(mii->mii_media_active)) { in alc_mac_config()
3157 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) { in alc_mac_config()
3159 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_ETH_TXPAUSE) != 0) in alc_mac_config()
3161 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_ETH_RXPAUSE) != 0) in alc_mac_config()
3174 if ((sc->alc_flags & ALC_FLAG_SMB_BUG) == 0) { in alc_stats_clear()
3175 bus_dmamap_sync(sc->alc_cdata.alc_smb_tag, in alc_stats_clear()
3176 sc->alc_cdata.alc_smb_map, in alc_stats_clear()
3178 smb = sc->alc_rdata.alc_smb; in alc_stats_clear()
3180 smb->updated = 0; in alc_stats_clear()
3181 bus_dmamap_sync(sc->alc_cdata.alc_smb_tag, in alc_stats_clear()
3182 sc->alc_cdata.alc_smb_map, in alc_stats_clear()
3210 ifp = sc->alc_ifp; in alc_stats_update()
3211 stat = &sc->alc_stats; in alc_stats_update()
3212 if ((sc->alc_flags & ALC_FLAG_SMB_BUG) == 0) { in alc_stats_update()
3213 bus_dmamap_sync(sc->alc_cdata.alc_smb_tag, in alc_stats_update()
3214 sc->alc_cdata.alc_smb_map, in alc_stats_update()
3216 smb = sc->alc_rdata.alc_smb; in alc_stats_update()
3217 if (smb->updated == 0) in alc_stats_update()
3235 /* Rx stats. */ in alc_stats_update()
3236 stat->rx_frames += smb->rx_frames; in alc_stats_update()
3237 stat->rx_bcast_frames += smb->rx_bcast_frames; in alc_stats_update()
3238 stat->rx_mcast_frames += smb->rx_mcast_frames; in alc_stats_update()
3239 stat->rx_pause_frames += smb->rx_pause_frames; in alc_stats_update()
3240 stat->rx_control_frames += smb->rx_control_frames; in alc_stats_update()
3241 stat->rx_crcerrs += smb->rx_crcerrs; in alc_stats_update()
3242 stat->rx_lenerrs += smb->rx_lenerrs; in alc_stats_update()
3243 stat->rx_bytes += smb->rx_bytes; in alc_stats_update()
3244 stat->rx_runts += smb->rx_runts; in alc_stats_update()
3245 stat->rx_fragments += smb->rx_fragments; in alc_stats_update()
3246 stat->rx_pkts_64 += smb->rx_pkts_64; in alc_stats_update()
3247 stat->rx_pkts_65_127 += smb->rx_pkts_65_127; in alc_stats_update()
3248 stat->rx_pkts_128_255 += smb->rx_pkts_128_255; in alc_stats_update()
3249 stat->rx_pkts_256_511 += smb->rx_pkts_256_511; in alc_stats_update()
3250 stat->rx_pkts_512_1023 += smb->rx_pkts_512_1023; in alc_stats_update()
3251 stat->rx_pkts_1024_1518 += smb->rx_pkts_1024_1518; in alc_stats_update()
3252 stat->rx_pkts_1519_max += smb->rx_pkts_1519_max; in alc_stats_update()
3253 stat->rx_pkts_truncated += smb->rx_pkts_truncated; in alc_stats_update()
3254 stat->rx_fifo_oflows += smb->rx_fifo_oflows; in alc_stats_update()
3255 stat->rx_rrs_errs += smb->rx_rrs_errs; in alc_stats_update()
3256 stat->rx_alignerrs += smb->rx_alignerrs; in alc_stats_update()
3257 stat->rx_bcast_bytes += smb->rx_bcast_bytes; in alc_stats_update()
3258 stat->rx_mcast_bytes += smb->rx_mcast_bytes; in alc_stats_update()
3259 stat->rx_pkts_filtered += smb->rx_pkts_filtered; in alc_stats_update()
3261 /* Tx stats. */ in alc_stats_update()
3262 stat->tx_frames += smb->tx_frames; in alc_stats_update()
3263 stat->tx_bcast_frames += smb->tx_bcast_frames; in alc_stats_update()
3264 stat->tx_mcast_frames += smb->tx_mcast_frames; in alc_stats_update()
3265 stat->tx_pause_frames += smb->tx_pause_frames; in alc_stats_update()
3266 stat->tx_excess_defer += smb->tx_excess_defer; in alc_stats_update()
3267 stat->tx_control_frames += smb->tx_control_frames; in alc_stats_update()
3268 stat->tx_deferred += smb->tx_deferred; in alc_stats_update()
3269 stat->tx_bytes += smb->tx_bytes; in alc_stats_update()
3270 stat->tx_pkts_64 += smb->tx_pkts_64; in alc_stats_update()
3271 stat->tx_pkts_65_127 += smb->tx_pkts_65_127; in alc_stats_update()
3272 stat->tx_pkts_128_255 += smb->tx_pkts_128_255; in alc_stats_update()
3273 stat->tx_pkts_256_511 += smb->tx_pkts_256_511; in alc_stats_update()
3274 stat->tx_pkts_512_1023 += smb->tx_pkts_512_1023; in alc_stats_update()
3275 stat->tx_pkts_1024_1518 += smb->tx_pkts_1024_1518; in alc_stats_update()
3276 stat->tx_pkts_1519_max += smb->tx_pkts_1519_max; in alc_stats_update()
3277 stat->tx_single_colls += smb->tx_single_colls; in alc_stats_update()
3278 stat->tx_multi_colls += smb->tx_multi_colls; in alc_stats_update()
3279 stat->tx_late_colls += smb->tx_late_colls; in alc_stats_update()
3280 stat->tx_excess_colls += smb->tx_excess_colls; in alc_stats_update()
3281 stat->tx_underrun += smb->tx_underrun; in alc_stats_update()
3282 stat->tx_desc_underrun += smb->tx_desc_underrun; in alc_stats_update()
3283 stat->tx_lenerrs += smb->tx_lenerrs; in alc_stats_update()
3284 stat->tx_pkts_truncated += smb->tx_pkts_truncated; in alc_stats_update()
3285 stat->tx_bcast_bytes += smb->tx_bcast_bytes; in alc_stats_update()
3286 stat->tx_mcast_bytes += smb->tx_mcast_bytes; in alc_stats_update()
3289 if_inc_counter(ifp, IFCOUNTER_OPACKETS, smb->tx_frames); in alc_stats_update()
3291 if_inc_counter(ifp, IFCOUNTER_COLLISIONS, smb->tx_single_colls + in alc_stats_update()
3292 smb->tx_multi_colls * 2 + smb->tx_late_colls + in alc_stats_update()
3293 smb->tx_excess_colls * HDPX_CFG_RETRY_DEFAULT); in alc_stats_update()
3295 if_inc_counter(ifp, IFCOUNTER_OERRORS, smb->tx_late_colls + in alc_stats_update()
3296 smb->tx_excess_colls + smb->tx_underrun + smb->tx_pkts_truncated); in alc_stats_update()
3298 if_inc_counter(ifp, IFCOUNTER_IPACKETS, smb->rx_frames); in alc_stats_update()
3301 smb->rx_crcerrs + smb->rx_lenerrs + in alc_stats_update()
3302 smb->rx_runts + smb->rx_pkts_truncated + in alc_stats_update()
3303 smb->rx_fifo_oflows + smb->rx_rrs_errs + in alc_stats_update()
3304 smb->rx_alignerrs); in alc_stats_update()
3306 if ((sc->alc_flags & ALC_FLAG_SMB_BUG) == 0) { in alc_stats_update()
3308 smb->updated = 0; in alc_stats_update()
3309 bus_dmamap_sync(sc->alc_cdata.alc_smb_tag, in alc_stats_update()
3310 sc->alc_cdata.alc_smb_map, in alc_stats_update()
3323 if (sc->alc_flags & ALC_FLAG_MT) { in alc_intr()
3324 taskqueue_enqueue(sc->alc_tq, &sc->alc_int_task); in alc_intr()
3333 taskqueue_enqueue(sc->alc_tq, &sc->alc_int_task); in alc_intr()
3347 ifp = sc->alc_ifp; in alc_int_task()
3351 if (sc->alc_morework != 0) { in alc_int_task()
3352 sc->alc_morework = 0; in alc_int_task()
3364 more = alc_rxintr(sc, sc->alc_process_limit); in alc_int_task()
3366 sc->alc_morework = 1; in alc_int_task()
3377 device_printf(sc->alc_dev, in alc_int_task()
3378 "DMA read error! -- resetting\n"); in alc_int_task()
3380 device_printf(sc->alc_dev, in alc_int_task()
3381 "DMA write error! -- resetting\n"); in alc_int_task()
3383 device_printf(sc->alc_dev, in alc_int_task()
3384 "TxQ reset! -- resetting\n"); in alc_int_task()
3398 taskqueue_enqueue(sc->alc_tq, &sc->alc_int_task); in alc_int_task()
3404 /* Re-enable interrupts if we're running. */ in alc_int_task()
3405 if (sc->alc_flags & ALC_FLAG_MT) in alc_int_task()
3422 ifp = sc->alc_ifp; in alc_txeof()
3424 if (sc->alc_cdata.alc_tx_cnt == 0) in alc_txeof()
3426 bus_dmamap_sync(sc->alc_cdata.alc_tx_ring_tag, in alc_txeof()
3427 sc->alc_cdata.alc_tx_ring_map, BUS_DMASYNC_POSTWRITE); in alc_txeof()
3428 if ((sc->alc_flags & ALC_FLAG_CMB_BUG) == 0) { in alc_txeof()
3429 bus_dmamap_sync(sc->alc_cdata.alc_cmb_tag, in alc_txeof()
3430 sc->alc_cdata.alc_cmb_map, BUS_DMASYNC_POSTREAD); in alc_txeof()
3431 prod = sc->alc_rdata.alc_cmb->cons; in alc_txeof()
3433 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_txeof()
3442 cons = sc->alc_cdata.alc_tx_cons; in alc_txeof()
3448 if (sc->alc_cdata.alc_tx_cnt <= 0) in alc_txeof()
3451 sc->alc_cdata.alc_tx_cnt--; in alc_txeof()
3452 txd = &sc->alc_cdata.alc_txdesc[cons]; in alc_txeof()
3453 if (txd->tx_m != NULL) { in alc_txeof()
3455 bus_dmamap_sync(sc->alc_cdata.alc_tx_tag, in alc_txeof()
3456 txd->tx_dmamap, BUS_DMASYNC_POSTWRITE); in alc_txeof()
3457 bus_dmamap_unload(sc->alc_cdata.alc_tx_tag, in alc_txeof()
3458 txd->tx_dmamap); in alc_txeof()
3459 m_freem(txd->tx_m); in alc_txeof()
3460 txd->tx_m = NULL; in alc_txeof()
3464 if ((sc->alc_flags & ALC_FLAG_CMB_BUG) == 0) in alc_txeof()
3465 bus_dmamap_sync(sc->alc_cdata.alc_cmb_tag, in alc_txeof()
3466 sc->alc_cdata.alc_cmb_map, BUS_DMASYNC_PREREAD); in alc_txeof()
3467 sc->alc_cdata.alc_tx_cons = cons; in alc_txeof()
3472 if (sc->alc_cdata.alc_tx_cnt == 0) in alc_txeof()
3473 sc->alc_watchdog_timer = 0; in alc_txeof()
3487 m->m_len = m->m_pkthdr.len = RX_BUF_SIZE_MAX; in alc_newbuf()
3492 if (bus_dmamap_load_mbuf_sg(sc->alc_cdata.alc_rx_tag, in alc_newbuf()
3493 sc->alc_cdata.alc_rx_sparemap, m, segs, &nsegs, 0) != 0) { in alc_newbuf()
3499 if (rxd->rx_m != NULL) { in alc_newbuf()
3500 bus_dmamap_sync(sc->alc_cdata.alc_rx_tag, rxd->rx_dmamap, in alc_newbuf()
3502 bus_dmamap_unload(sc->alc_cdata.alc_rx_tag, rxd->rx_dmamap); in alc_newbuf()
3504 map = rxd->rx_dmamap; in alc_newbuf()
3505 rxd->rx_dmamap = sc->alc_cdata.alc_rx_sparemap; in alc_newbuf()
3506 sc->alc_cdata.alc_rx_sparemap = map; in alc_newbuf()
3507 bus_dmamap_sync(sc->alc_cdata.alc_rx_tag, rxd->rx_dmamap, in alc_newbuf()
3509 rxd->rx_m = m; in alc_newbuf()
3510 rxd->rx_desc->addr = htole64(segs[0].ds_addr); in alc_newbuf()
3522 bus_dmamap_sync(sc->alc_cdata.alc_rr_ring_tag, in alc_rxintr()
3523 sc->alc_cdata.alc_rr_ring_map, in alc_rxintr()
3525 bus_dmamap_sync(sc->alc_cdata.alc_rx_ring_tag, in alc_rxintr()
3526 sc->alc_cdata.alc_rx_ring_map, BUS_DMASYNC_POSTWRITE); in alc_rxintr()
3527 rr_cons = sc->alc_cdata.alc_rr_cons; in alc_rxintr()
3528 ifp = sc->alc_ifp; in alc_rxintr()
3530 if (count-- <= 0) in alc_rxintr()
3532 rrd = &sc->alc_rdata.alc_rr_ring[rr_cons]; in alc_rxintr()
3533 status = le32toh(rrd->status); in alc_rxintr()
3536 nsegs = RRD_RD_CNT(le32toh(rrd->rdinfo)); in alc_rxintr()
3539 device_printf(sc->alc_dev, in alc_rxintr()
3540 "unexpected segment count -- resetting\n"); in alc_rxintr()
3545 rrd->status = 0; in alc_rxintr()
3547 sc->alc_cdata.alc_rx_cons += nsegs; in alc_rxintr()
3548 sc->alc_cdata.alc_rx_cons %= ALC_RR_RING_CNT; in alc_rxintr()
3554 sc->alc_cdata.alc_rr_cons = rr_cons; in alc_rxintr()
3556 bus_dmamap_sync(sc->alc_cdata.alc_rr_ring_tag, in alc_rxintr()
3557 sc->alc_cdata.alc_rr_ring_map, in alc_rxintr()
3563 bus_dmamap_sync(sc->alc_cdata.alc_rx_ring_tag, in alc_rxintr()
3564 sc->alc_cdata.alc_rx_ring_map, BUS_DMASYNC_PREWRITE); in alc_rxintr()
3569 * only when Rx buffer pre-fetching is required. In in alc_rxintr()
3572 * it still seems that pre-fetching needs more in alc_rxintr()
3575 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_rxintr()
3577 (uint16_t)sc->alc_cdata.alc_rx_cons); in alc_rxintr()
3580 sc->alc_cdata.alc_rx_cons); in alc_rxintr()
3595 dst = src - 3; in alc_fixup_rx()
3597 if (m->m_next == NULL) { in alc_fixup_rx()
3598 for (i = 0; i < (m->m_len / sizeof(uint16_t) + 1); i++) in alc_fixup_rx()
3600 m->m_data -= 6; in alc_fixup_rx()
3614 bcopy(m->m_data, n->m_data, ETHER_HDR_LEN); in alc_fixup_rx()
3615 m->m_data += ETHER_HDR_LEN; in alc_fixup_rx()
3616 m->m_len -= ETHER_HDR_LEN; in alc_fixup_rx()
3617 n->m_len = ETHER_HDR_LEN; in alc_fixup_rx()
3619 n->m_next = m; in alc_fixup_rx()
3634 ifp = sc->alc_ifp; in alc_rxeof()
3635 status = le32toh(rrd->status); in alc_rxeof()
3636 rdinfo = le32toh(rrd->rdinfo); in alc_rxeof()
3640 sc->alc_cdata.alc_rxlen = RRD_BYTES(status); in alc_rxeof()
3662 rxd = &sc->alc_cdata.alc_rxdesc[rx_cons]; in alc_rxeof()
3663 mp = rxd->rx_m; in alc_rxeof()
3668 if (sc->alc_cdata.alc_rxhead != NULL) in alc_rxeof()
3669 m_freem(sc->alc_cdata.alc_rxhead); in alc_rxeof()
3676 * multi-segmented frame. in alc_rxeof()
3678 mp->m_len = sc->alc_buf_size; in alc_rxeof()
3681 if (sc->alc_cdata.alc_rxhead == NULL) { in alc_rxeof()
3682 sc->alc_cdata.alc_rxhead = mp; in alc_rxeof()
3683 sc->alc_cdata.alc_rxtail = mp; in alc_rxeof()
3685 mp->m_flags &= ~M_PKTHDR; in alc_rxeof()
3686 sc->alc_cdata.alc_rxprev_tail = in alc_rxeof()
3687 sc->alc_cdata.alc_rxtail; in alc_rxeof()
3688 sc->alc_cdata.alc_rxtail->m_next = mp; in alc_rxeof()
3689 sc->alc_cdata.alc_rxtail = mp; in alc_rxeof()
3692 if (count == nsegs - 1) { in alc_rxeof()
3694 m = sc->alc_cdata.alc_rxhead; in alc_rxeof()
3695 m->m_flags |= M_PKTHDR; in alc_rxeof()
3700 m->m_pkthdr.len = in alc_rxeof()
3701 sc->alc_cdata.alc_rxlen - ETHER_CRC_LEN; in alc_rxeof()
3704 mp->m_len = sc->alc_cdata.alc_rxlen - in alc_rxeof()
3705 (nsegs - 1) * sc->alc_buf_size; in alc_rxeof()
3707 if (mp->m_len <= ETHER_CRC_LEN) { in alc_rxeof()
3708 sc->alc_cdata.alc_rxtail = in alc_rxeof()
3709 sc->alc_cdata.alc_rxprev_tail; in alc_rxeof()
3710 sc->alc_cdata.alc_rxtail->m_len -= in alc_rxeof()
3711 (ETHER_CRC_LEN - mp->m_len); in alc_rxeof()
3712 sc->alc_cdata.alc_rxtail->m_next = NULL; in alc_rxeof()
3715 mp->m_len -= ETHER_CRC_LEN; in alc_rxeof()
3718 m->m_len = m->m_pkthdr.len; in alc_rxeof()
3719 m->m_pkthdr.rcvif = ifp; in alc_rxeof()
3726 vtag = RRD_VLAN(le32toh(rrd->vtag)); in alc_rxeof()
3727 m->m_pkthdr.ether_vtag = ntohs(vtag); in alc_rxeof()
3728 m->m_flags |= M_VLANTAG; in alc_rxeof()
3756 mii = device_get_softc(sc->alc_miibus); in alc_tick()
3768 callout_reset(&sc->alc_tick_ch, hz, alc_tick, sc); in alc_tick()
3782 if (AR816X_REV(sc->alc_rev) >= AR816X_REV_B0) { in alc_osc_reset()
3784 * Restore over-current protection default value. in alc_osc_reset()
3800 if (AR816X_REV(sc->alc_rev) <= AR816X_REV_A1) in alc_osc_reset()
3816 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_reset()
3819 if (AR816X_REV(sc->alc_rev) <= AR816X_REV_A1 && in alc_reset()
3820 (sc->alc_rev & 0x01) != 0) { in alc_reset()
3835 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_reset()
3836 for (i = ALC_RESET_TIMEOUT; i > 0; i--) { in alc_reset()
3842 device_printf(sc->alc_dev, "MAC reset timeout!\n"); in alc_reset()
3844 for (i = ALC_RESET_TIMEOUT; i > 0; i--) { in alc_reset()
3850 device_printf(sc->alc_dev, "master reset timeout!\n"); in alc_reset()
3852 for (i = ALC_RESET_TIMEOUT; i > 0; i--) { in alc_reset()
3860 device_printf(sc->alc_dev, "reset timeout(0x%08x)!\n", reg); in alc_reset()
3862 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_reset()
3863 if (AR816X_REV(sc->alc_rev) <= AR816X_REV_A1 && in alc_reset()
3864 (sc->alc_rev & 0x01) != 0) { in alc_reset()
3881 if (AR816X_REV(sc->alc_rev) <= AR816X_REV_A1) in alc_reset()
3886 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0 || in alc_reset()
3887 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B || in alc_reset()
3888 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8151_V2) in alc_reset()
3915 ifp = sc->alc_ifp; in alc_init_locked()
3930 device_printf(sc->alc_dev, "no memory for Rx buffers.\n"); in alc_init_locked()
3940 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_init_locked()
3945 if (AR816X_REV(sc->alc_rev) >= AR816X_REV_B0) in alc_init_locked()
3963 paddr = sc->alc_rdata.alc_tx_ring_paddr; in alc_init_locked()
3972 paddr = sc->alc_rdata.alc_rx_ring_paddr; in alc_init_locked()
3975 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) { in alc_init_locked()
3992 * For strict-alignment architectures make sure to reduce buffer in alc_init_locked()
3996 sc->alc_buf_size = RX_BUF_SIZE_MAX - sizeof(uint64_t); in alc_init_locked()
3998 sc->alc_buf_size = RX_BUF_SIZE_MAX; in alc_init_locked()
4000 CSR_WRITE_4(sc, ALC_RX_BUF_SIZE, sc->alc_buf_size); in alc_init_locked()
4002 paddr = sc->alc_rdata.alc_rr_ring_paddr; in alc_init_locked()
4005 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) { in alc_init_locked()
4014 paddr = sc->alc_rdata.alc_cmb_paddr; in alc_init_locked()
4016 paddr = sc->alc_rdata.alc_smb_paddr; in alc_init_locked()
4020 if (sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B) { in alc_init_locked()
4021 /* Reconfigure SRAM - Vendor magic. */ in alc_init_locked()
4036 reg = ALC_USECS(sc->alc_int_rx_mod) << IM_TIMER_RX_SHIFT; in alc_init_locked()
4037 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) in alc_init_locked()
4038 reg |= ALC_USECS(sc->alc_int_tx_mod) << IM_TIMER_TX_SHIFT; in alc_init_locked()
4047 if (ALC_USECS(sc->alc_int_rx_mod) != 0) in alc_init_locked()
4049 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0 && in alc_init_locked()
4050 ALC_USECS(sc->alc_int_tx_mod) != 0) in alc_init_locked()
4054 * Disable interrupt re-trigger timer. We don't want automatic in alc_init_locked()
4055 * re-triggering of un-ACKed interrupts. in alc_init_locked()
4059 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_init_locked()
4062 ALC_USECS(sc->alc_int_tx_mod)); in alc_init_locked()
4064 if ((sc->alc_flags & ALC_FLAG_CMB_BUG) == 0) { in alc_init_locked()
4084 * would make path-MTU discovery hard as sender wouldn't get in alc_init_locked()
4086 * multi-fragmented frames on Rx path so it has no issue on in alc_init_locked()
4092 * accept from others - RFC 793. in alc_init_locked()
4094 CSR_WRITE_4(sc, ALC_FRAME_SIZE, sc->alc_ident->max_framelen); in alc_init_locked()
4096 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) { in alc_init_locked()
4110 /* Set parameters for half-duplex media. */ in alc_init_locked()
4127 reg = (sc->alc_ident->max_framelen >> TSO_OFFLOAD_THRESH_UNIT_SHIFT) & in alc_init_locked()
4129 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_init_locked()
4133 reg = (alc_dma_burst[sc->alc_dma_rd_burst] << in alc_init_locked()
4135 if (sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B || in alc_init_locked()
4136 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B2) in alc_init_locked()
4142 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_init_locked()
4155 /* Configure Rx free descriptor pre-fetching. */ in alc_init_locked()
4168 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_init_locked()
4173 reg -= RX_FIFO_PAUSE_816X_RSVD; in alc_init_locked()
4175 reg -= RX_BUF_SIZE_MAX; in alc_init_locked()
4183 } else if (sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8131 || in alc_init_locked()
4184 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8132) { in alc_init_locked()
4195 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) { in alc_init_locked()
4205 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_init_locked()
4209 if ((sc->alc_flags & ALC_FLAG_FASTETHER) == 0) in alc_init_locked()
4212 if ((sc->alc_flags & ALC_FLAG_FASTETHER) == 0 && in alc_init_locked()
4213 sc->alc_ident->deviceid != DEVICEID_ATHEROS_AR8151_V2) in alc_init_locked()
4220 reg |= sc->alc_rcb; in alc_init_locked()
4221 if ((sc->alc_flags & ALC_FLAG_CMB_BUG) == 0) in alc_init_locked()
4223 if ((sc->alc_flags & ALC_FLAG_SMB_BUG) == 0) in alc_init_locked()
4227 reg |= (sc->alc_dma_rd_burst & DMA_CFG_RD_BURST_MASK) << in alc_init_locked()
4229 reg |= (sc->alc_dma_wr_burst & DMA_CFG_WR_BURST_MASK) << in alc_init_locked()
4235 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_init_locked()
4236 switch (AR816X_REV(sc->alc_rev)) { in alc_init_locked()
4252 * - Auto-padding for short frames. in alc_init_locked()
4253 * - Enable CRC generation. in alc_init_locked()
4266 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0 || in alc_init_locked()
4267 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8151 || in alc_init_locked()
4268 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8151_V2 || in alc_init_locked()
4269 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B2) in alc_init_locked()
4271 if ((sc->alc_flags & ALC_FLAG_FASTETHER) != 0) in alc_init_locked()
4289 sc->alc_flags &= ~ALC_FLAG_LINK; in alc_init_locked()
4293 callout_reset(&sc->alc_tick_ch, hz, alc_tick, sc); in alc_init_locked()
4309 ifp = sc->alc_ifp; in alc_stop()
4311 sc->alc_flags &= ~ALC_FLAG_LINK; in alc_stop()
4312 callout_stop(&sc->alc_tick_ch); in alc_stop()
4313 sc->alc_watchdog_timer = 0; in alc_stop()
4331 if (sc->alc_cdata.alc_rxhead != NULL) in alc_stop()
4332 m_freem(sc->alc_cdata.alc_rxhead); in alc_stop()
4338 rxd = &sc->alc_cdata.alc_rxdesc[i]; in alc_stop()
4339 if (rxd->rx_m != NULL) { in alc_stop()
4340 bus_dmamap_sync(sc->alc_cdata.alc_rx_tag, in alc_stop()
4341 rxd->rx_dmamap, BUS_DMASYNC_POSTREAD); in alc_stop()
4342 bus_dmamap_unload(sc->alc_cdata.alc_rx_tag, in alc_stop()
4343 rxd->rx_dmamap); in alc_stop()
4344 m_freem(rxd->rx_m); in alc_stop()
4345 rxd->rx_m = NULL; in alc_stop()
4349 txd = &sc->alc_cdata.alc_txdesc[i]; in alc_stop()
4350 if (txd->tx_m != NULL) { in alc_stop()
4351 bus_dmamap_sync(sc->alc_cdata.alc_tx_tag, in alc_stop()
4352 txd->tx_dmamap, BUS_DMASYNC_POSTWRITE); in alc_stop()
4353 bus_dmamap_unload(sc->alc_cdata.alc_tx_tag, in alc_stop()
4354 txd->tx_dmamap); in alc_stop()
4355 m_freem(txd->tx_m); in alc_stop()
4356 txd->tx_m = NULL; in alc_stop()
4374 for (i = ALC_TIMEOUT; i > 0; i--) { in alc_stop_mac()
4381 device_printf(sc->alc_dev, in alc_stop_mac()
4401 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) { in alc_start_queue()
4421 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) { in alc_stop_queue()
4439 for (i = ALC_TIMEOUT; i > 0; i--) { in alc_stop_queue()
4446 device_printf(sc->alc_dev, in alc_stop_queue()
4459 sc->alc_cdata.alc_tx_prod = 0; in alc_init_tx_ring()
4460 sc->alc_cdata.alc_tx_cons = 0; in alc_init_tx_ring()
4461 sc->alc_cdata.alc_tx_cnt = 0; in alc_init_tx_ring()
4463 rd = &sc->alc_rdata; in alc_init_tx_ring()
4464 bzero(rd->alc_tx_ring, ALC_TX_RING_SZ); in alc_init_tx_ring()
4466 txd = &sc->alc_cdata.alc_txdesc[i]; in alc_init_tx_ring()
4467 txd->tx_m = NULL; in alc_init_tx_ring()
4470 bus_dmamap_sync(sc->alc_cdata.alc_tx_ring_tag, in alc_init_tx_ring()
4471 sc->alc_cdata.alc_tx_ring_map, BUS_DMASYNC_PREWRITE); in alc_init_tx_ring()
4483 sc->alc_cdata.alc_rx_cons = ALC_RX_RING_CNT - 1; in alc_init_rx_ring()
4484 sc->alc_morework = 0; in alc_init_rx_ring()
4485 rd = &sc->alc_rdata; in alc_init_rx_ring()
4486 bzero(rd->alc_rx_ring, ALC_RX_RING_SZ); in alc_init_rx_ring()
4488 rxd = &sc->alc_cdata.alc_rxdesc[i]; in alc_init_rx_ring()
4489 rxd->rx_m = NULL; in alc_init_rx_ring()
4490 rxd->rx_desc = &rd->alc_rx_ring[i]; in alc_init_rx_ring()
4500 bus_dmamap_sync(sc->alc_cdata.alc_rx_ring_tag, in alc_init_rx_ring()
4501 sc->alc_cdata.alc_rx_ring_map, BUS_DMASYNC_PREWRITE); in alc_init_rx_ring()
4503 CSR_WRITE_4(sc, ALC_MBOX_RD0_PROD_IDX, sc->alc_cdata.alc_rx_cons); in alc_init_rx_ring()
4515 sc->alc_cdata.alc_rr_cons = 0; in alc_init_rr_ring()
4518 rd = &sc->alc_rdata; in alc_init_rr_ring()
4519 bzero(rd->alc_rr_ring, ALC_RR_RING_SZ); in alc_init_rr_ring()
4520 bus_dmamap_sync(sc->alc_cdata.alc_rr_ring_tag, in alc_init_rr_ring()
4521 sc->alc_cdata.alc_rr_ring_map, in alc_init_rr_ring()
4532 rd = &sc->alc_rdata; in alc_init_cmb()
4533 bzero(rd->alc_cmb, ALC_CMB_SZ); in alc_init_cmb()
4534 bus_dmamap_sync(sc->alc_cdata.alc_cmb_tag, sc->alc_cdata.alc_cmb_map, in alc_init_cmb()
4545 rd = &sc->alc_rdata; in alc_init_smb()
4546 bzero(rd->alc_smb, ALC_SMB_SZ); in alc_init_smb()
4547 bus_dmamap_sync(sc->alc_cdata.alc_smb_tag, sc->alc_cdata.alc_smb_map, in alc_init_smb()
4559 ifp = sc->alc_ifp; in alc_rxvlan()
4589 ifp = sc->alc_ifp; in alc_rxfilter()
4623 if (error || req->newptr == NULL) in sysctl_int_range()
4654 KASSERT(sc->alc_buf_size <= MCLBYTES, ("incorrect cluster size")); in alc_debugnet_init()