Lines Matching +full:back +full:- +full:powering
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()
1600 sc->alc_pmcap = base; in alc_attach()
1605 error = mii_attach(dev, &sc->alc_miibus, ifp, alc_mediachange, in alc_attach()
1606 alc_mediastatus, BMSR_DEFCAPMASK, sc->alc_phyaddr, MII_OFFSET_ANY, in alc_attach()
1613 ether_ifattach(ifp, sc->alc_eaddr); in alc_attach()
1631 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) { in alc_attach()
1640 sc->alc_tq = taskqueue_create_fast("alc_taskq", M_WAITOK, in alc_attach()
1641 taskqueue_thread_enqueue, &sc->alc_tq); in alc_attach()
1642 taskqueue_start_threads(&sc->alc_tq, 1, PI_NET, "%s taskq", in alc_attach()
1643 device_get_nameunit(sc->alc_dev)); in alc_attach()
1646 if ((sc->alc_flags & ALC_FLAG_MSIX) != 0) in alc_attach()
1648 else if ((sc->alc_flags & ALC_FLAG_MSI) != 0) in alc_attach()
1653 error = bus_setup_intr(dev, sc->alc_irq[i], in alc_attach()
1655 &sc->alc_intrhand[i]); in alc_attach()
1661 taskqueue_free(sc->alc_tq); in alc_attach()
1662 sc->alc_tq = NULL; in alc_attach()
1686 ifp = sc->alc_ifp; in alc_detach()
1692 callout_drain(&sc->alc_tick_ch); in alc_detach()
1693 taskqueue_drain(sc->alc_tq, &sc->alc_int_task); in alc_detach()
1696 if (sc->alc_tq != NULL) { in alc_detach()
1697 taskqueue_drain(sc->alc_tq, &sc->alc_int_task); in alc_detach()
1698 taskqueue_free(sc->alc_tq); in alc_detach()
1699 sc->alc_tq = NULL; in alc_detach()
1707 sc->alc_ifp = NULL; in alc_detach()
1710 if ((sc->alc_flags & ALC_FLAG_MSIX) != 0) in alc_detach()
1712 else if ((sc->alc_flags & ALC_FLAG_MSI) != 0) in alc_detach()
1717 if (sc->alc_intrhand[i] != NULL) { in alc_detach()
1718 bus_teardown_intr(dev, sc->alc_irq[i], in alc_detach()
1719 sc->alc_intrhand[i]); in alc_detach()
1720 sc->alc_intrhand[i] = NULL; in alc_detach()
1723 if (sc->alc_res[0] != NULL) in alc_detach()
1725 bus_release_resources(dev, sc->alc_irq_spec, sc->alc_irq); in alc_detach()
1726 if ((sc->alc_flags & (ALC_FLAG_MSI | ALC_FLAG_MSIX)) != 0) in alc_detach()
1728 bus_release_resources(dev, sc->alc_res_spec, sc->alc_res); in alc_detach()
1729 mtx_destroy(&sc->alc_mtx); in alc_detach()
1748 stats = &sc->alc_stats; in alc_sysctl_node()
1749 ctx = device_get_sysctl_ctx(sc->alc_dev); in alc_sysctl_node()
1750 child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->alc_dev)); in alc_sysctl_node()
1753 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, &sc->alc_int_rx_mod, in alc_sysctl_node()
1756 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, &sc->alc_int_tx_mod, in alc_sysctl_node()
1759 sc->alc_int_rx_mod = ALC_IM_RX_TIMER_DEFAULT; in alc_sysctl_node()
1760 error = resource_int_value(device_get_name(sc->alc_dev), in alc_sysctl_node()
1761 device_get_unit(sc->alc_dev), "int_rx_mod", &sc->alc_int_rx_mod); in alc_sysctl_node()
1763 if (sc->alc_int_rx_mod < ALC_IM_TIMER_MIN || in alc_sysctl_node()
1764 sc->alc_int_rx_mod > ALC_IM_TIMER_MAX) { in alc_sysctl_node()
1765 device_printf(sc->alc_dev, "int_rx_mod value out of " in alc_sysctl_node()
1768 sc->alc_int_rx_mod = ALC_IM_RX_TIMER_DEFAULT; in alc_sysctl_node()
1771 sc->alc_int_tx_mod = ALC_IM_TX_TIMER_DEFAULT; in alc_sysctl_node()
1772 error = resource_int_value(device_get_name(sc->alc_dev), in alc_sysctl_node()
1773 device_get_unit(sc->alc_dev), "int_tx_mod", &sc->alc_int_tx_mod); in alc_sysctl_node()
1775 if (sc->alc_int_tx_mod < ALC_IM_TIMER_MIN || in alc_sysctl_node()
1776 sc->alc_int_tx_mod > ALC_IM_TIMER_MAX) { in alc_sysctl_node()
1777 device_printf(sc->alc_dev, "int_tx_mod value out of " in alc_sysctl_node()
1780 sc->alc_int_tx_mod = ALC_IM_TX_TIMER_DEFAULT; in alc_sysctl_node()
1785 &sc->alc_process_limit, 0, sysctl_hw_alc_proc_limit, "I", in alc_sysctl_node()
1788 sc->alc_process_limit = ALC_PROC_DEFAULT; in alc_sysctl_node()
1789 error = resource_int_value(device_get_name(sc->alc_dev), in alc_sysctl_node()
1790 device_get_unit(sc->alc_dev), "process_limit", in alc_sysctl_node()
1791 &sc->alc_process_limit); in alc_sysctl_node()
1793 if (sc->alc_process_limit < ALC_PROC_MIN || in alc_sysctl_node()
1794 sc->alc_process_limit > ALC_PROC_MAX) { in alc_sysctl_node()
1795 device_printf(sc->alc_dev, in alc_sysctl_node()
1798 sc->alc_process_limit = ALC_PROC_DEFAULT; in alc_sysctl_node()
1811 &stats->rx_frames, "Good frames"); in alc_sysctl_node()
1813 &stats->rx_bcast_frames, "Good broadcast frames"); in alc_sysctl_node()
1815 &stats->rx_mcast_frames, "Good multicast frames"); in alc_sysctl_node()
1817 &stats->rx_pause_frames, "Pause control frames"); in alc_sysctl_node()
1819 &stats->rx_control_frames, "Control frames"); in alc_sysctl_node()
1821 &stats->rx_crcerrs, "CRC errors"); in alc_sysctl_node()
1823 &stats->rx_lenerrs, "Frames with length mismatched"); in alc_sysctl_node()
1825 &stats->rx_bytes, "Good octets"); in alc_sysctl_node()
1827 &stats->rx_bcast_bytes, "Good broadcast octets"); in alc_sysctl_node()
1829 &stats->rx_mcast_bytes, "Good multicast octets"); in alc_sysctl_node()
1831 &stats->rx_runts, "Too short frames"); in alc_sysctl_node()
1833 &stats->rx_fragments, "Fragmented frames"); in alc_sysctl_node()
1835 &stats->rx_pkts_64, "64 bytes frames"); in alc_sysctl_node()
1837 &stats->rx_pkts_65_127, "65 to 127 bytes frames"); in alc_sysctl_node()
1839 &stats->rx_pkts_128_255, "128 to 255 bytes frames"); in alc_sysctl_node()
1841 &stats->rx_pkts_256_511, "256 to 511 bytes frames"); in alc_sysctl_node()
1843 &stats->rx_pkts_512_1023, "512 to 1023 bytes frames"); in alc_sysctl_node()
1845 &stats->rx_pkts_1024_1518, "1024 to 1518 bytes frames"); in alc_sysctl_node()
1847 &stats->rx_pkts_1519_max, "1519 to max frames"); in alc_sysctl_node()
1849 &stats->rx_pkts_truncated, "Truncated frames due to MTU size"); in alc_sysctl_node()
1851 &stats->rx_fifo_oflows, "FIFO overflows"); in alc_sysctl_node()
1853 &stats->rx_rrs_errs, "Return status write-back errors"); in alc_sysctl_node()
1855 &stats->rx_alignerrs, "Alignment errors"); in alc_sysctl_node()
1857 &stats->rx_pkts_filtered, in alc_sysctl_node()
1865 &stats->tx_frames, "Good frames"); in alc_sysctl_node()
1867 &stats->tx_bcast_frames, "Good broadcast frames"); in alc_sysctl_node()
1869 &stats->tx_mcast_frames, "Good multicast frames"); in alc_sysctl_node()
1871 &stats->tx_pause_frames, "Pause control frames"); in alc_sysctl_node()
1873 &stats->tx_control_frames, "Control frames"); in alc_sysctl_node()
1875 &stats->tx_excess_defer, "Frames with excessive derferrals"); in alc_sysctl_node()
1877 &stats->tx_excess_defer, "Frames with derferrals"); in alc_sysctl_node()
1879 &stats->tx_bytes, "Good octets"); in alc_sysctl_node()
1881 &stats->tx_bcast_bytes, "Good broadcast octets"); in alc_sysctl_node()
1883 &stats->tx_mcast_bytes, "Good multicast octets"); in alc_sysctl_node()
1885 &stats->tx_pkts_64, "64 bytes frames"); in alc_sysctl_node()
1887 &stats->tx_pkts_65_127, "65 to 127 bytes frames"); in alc_sysctl_node()
1889 &stats->tx_pkts_128_255, "128 to 255 bytes frames"); in alc_sysctl_node()
1891 &stats->tx_pkts_256_511, "256 to 511 bytes frames"); in alc_sysctl_node()
1893 &stats->tx_pkts_512_1023, "512 to 1023 bytes frames"); in alc_sysctl_node()
1895 &stats->tx_pkts_1024_1518, "1024 to 1518 bytes frames"); in alc_sysctl_node()
1897 &stats->tx_pkts_1519_max, "1519 to max frames"); in alc_sysctl_node()
1899 &stats->tx_single_colls, "Single collisions"); in alc_sysctl_node()
1901 &stats->tx_multi_colls, "Multiple collisions"); in alc_sysctl_node()
1903 &stats->tx_late_colls, "Late collisions"); in alc_sysctl_node()
1905 &stats->tx_excess_colls, "Excessive collisions"); in alc_sysctl_node()
1907 &stats->tx_underrun, "FIFO underruns"); in alc_sysctl_node()
1909 &stats->tx_desc_underrun, "Descriptor write-back errors"); in alc_sysctl_node()
1911 &stats->tx_lenerrs, "Frames with length mismatched"); in alc_sysctl_node()
1913 &stats->tx_pkts_truncated, "Truncated frames due to MTU size"); in alc_sysctl_node()
1934 ctx->alc_busaddr = segs[0].ds_addr; in alc_dmamap_cb()
1947 rx_ring_end = sc->alc_rdata.alc_rx_ring_paddr + ALC_RX_RING_SZ; in alc_check_boundary()
1948 rr_ring_end = sc->alc_rdata.alc_rr_ring_paddr + ALC_RR_RING_SZ; in alc_check_boundary()
1949 cmb_end = sc->alc_rdata.alc_cmb_paddr + ALC_CMB_SZ; in alc_check_boundary()
1950 tx_ring_end = sc->alc_rdata.alc_tx_ring_paddr + ALC_TX_RING_SZ; in alc_check_boundary()
1954 ALC_ADDR_HI(sc->alc_rdata.alc_rx_ring_paddr)) || in alc_check_boundary()
1956 ALC_ADDR_HI(sc->alc_rdata.alc_rr_ring_paddr)) || in alc_check_boundary()
1958 ALC_ADDR_HI(sc->alc_rdata.alc_cmb_paddr)) || in alc_check_boundary()
1960 ALC_ADDR_HI(sc->alc_rdata.alc_tx_ring_paddr))) in alc_check_boundary()
1983 if (sc->alc_flags & ALC_FLAG_MT) in alc_dma_alloc()
1988 bus_get_dma_tag(sc->alc_dev), /* parent */ in alc_dma_alloc()
1998 &sc->alc_cdata.alc_parent_tag); in alc_dma_alloc()
2000 device_printf(sc->alc_dev, in alc_dma_alloc()
2007 sc->alc_cdata.alc_parent_tag, /* parent */ in alc_dma_alloc()
2017 &sc->alc_cdata.alc_tx_ring_tag); in alc_dma_alloc()
2019 device_printf(sc->alc_dev, in alc_dma_alloc()
2026 sc->alc_cdata.alc_parent_tag, /* parent */ in alc_dma_alloc()
2036 &sc->alc_cdata.alc_rx_ring_tag); in alc_dma_alloc()
2038 device_printf(sc->alc_dev, in alc_dma_alloc()
2044 sc->alc_cdata.alc_parent_tag, /* parent */ in alc_dma_alloc()
2054 &sc->alc_cdata.alc_rr_ring_tag); in alc_dma_alloc()
2056 device_printf(sc->alc_dev, in alc_dma_alloc()
2063 sc->alc_cdata.alc_parent_tag, /* parent */ in alc_dma_alloc()
2073 &sc->alc_cdata.alc_cmb_tag); in alc_dma_alloc()
2075 device_printf(sc->alc_dev, in alc_dma_alloc()
2081 sc->alc_cdata.alc_parent_tag, /* parent */ in alc_dma_alloc()
2091 &sc->alc_cdata.alc_smb_tag); in alc_dma_alloc()
2093 device_printf(sc->alc_dev, in alc_dma_alloc()
2099 error = bus_dmamem_alloc(sc->alc_cdata.alc_tx_ring_tag, in alc_dma_alloc()
2100 (void **)&sc->alc_rdata.alc_tx_ring, in alc_dma_alloc()
2102 &sc->alc_cdata.alc_tx_ring_map); in alc_dma_alloc()
2104 device_printf(sc->alc_dev, in alc_dma_alloc()
2109 error = bus_dmamap_load(sc->alc_cdata.alc_tx_ring_tag, in alc_dma_alloc()
2110 sc->alc_cdata.alc_tx_ring_map, sc->alc_rdata.alc_tx_ring, in alc_dma_alloc()
2113 device_printf(sc->alc_dev, in alc_dma_alloc()
2117 sc->alc_rdata.alc_tx_ring_paddr = ctx.alc_busaddr; in alc_dma_alloc()
2120 error = bus_dmamem_alloc(sc->alc_cdata.alc_rx_ring_tag, in alc_dma_alloc()
2121 (void **)&sc->alc_rdata.alc_rx_ring, in alc_dma_alloc()
2123 &sc->alc_cdata.alc_rx_ring_map); in alc_dma_alloc()
2125 device_printf(sc->alc_dev, in alc_dma_alloc()
2130 error = bus_dmamap_load(sc->alc_cdata.alc_rx_ring_tag, in alc_dma_alloc()
2131 sc->alc_cdata.alc_rx_ring_map, sc->alc_rdata.alc_rx_ring, in alc_dma_alloc()
2134 device_printf(sc->alc_dev, in alc_dma_alloc()
2138 sc->alc_rdata.alc_rx_ring_paddr = ctx.alc_busaddr; in alc_dma_alloc()
2141 error = bus_dmamem_alloc(sc->alc_cdata.alc_rr_ring_tag, in alc_dma_alloc()
2142 (void **)&sc->alc_rdata.alc_rr_ring, in alc_dma_alloc()
2144 &sc->alc_cdata.alc_rr_ring_map); in alc_dma_alloc()
2146 device_printf(sc->alc_dev, in alc_dma_alloc()
2151 error = bus_dmamap_load(sc->alc_cdata.alc_rr_ring_tag, in alc_dma_alloc()
2152 sc->alc_cdata.alc_rr_ring_map, sc->alc_rdata.alc_rr_ring, in alc_dma_alloc()
2155 device_printf(sc->alc_dev, in alc_dma_alloc()
2159 sc->alc_rdata.alc_rr_ring_paddr = ctx.alc_busaddr; in alc_dma_alloc()
2162 error = bus_dmamem_alloc(sc->alc_cdata.alc_cmb_tag, in alc_dma_alloc()
2163 (void **)&sc->alc_rdata.alc_cmb, in alc_dma_alloc()
2165 &sc->alc_cdata.alc_cmb_map); in alc_dma_alloc()
2167 device_printf(sc->alc_dev, in alc_dma_alloc()
2172 error = bus_dmamap_load(sc->alc_cdata.alc_cmb_tag, in alc_dma_alloc()
2173 sc->alc_cdata.alc_cmb_map, sc->alc_rdata.alc_cmb, in alc_dma_alloc()
2176 device_printf(sc->alc_dev, in alc_dma_alloc()
2180 sc->alc_rdata.alc_cmb_paddr = ctx.alc_busaddr; in alc_dma_alloc()
2183 error = bus_dmamem_alloc(sc->alc_cdata.alc_smb_tag, in alc_dma_alloc()
2184 (void **)&sc->alc_rdata.alc_smb, in alc_dma_alloc()
2186 &sc->alc_cdata.alc_smb_map); in alc_dma_alloc()
2188 device_printf(sc->alc_dev, in alc_dma_alloc()
2193 error = bus_dmamap_load(sc->alc_cdata.alc_smb_tag, in alc_dma_alloc()
2194 sc->alc_cdata.alc_smb_map, sc->alc_rdata.alc_smb, in alc_dma_alloc()
2197 device_printf(sc->alc_dev, in alc_dma_alloc()
2201 sc->alc_rdata.alc_smb_paddr = ctx.alc_busaddr; in alc_dma_alloc()
2206 device_printf(sc->alc_dev, "4GB boundary crossed, " in alc_dma_alloc()
2225 bus_get_dma_tag(sc->alc_dev), /* parent */ in alc_dma_alloc()
2235 &sc->alc_cdata.alc_buffer_tag); in alc_dma_alloc()
2237 device_printf(sc->alc_dev, in alc_dma_alloc()
2244 sc->alc_cdata.alc_buffer_tag, /* parent */ in alc_dma_alloc()
2254 &sc->alc_cdata.alc_tx_tag); in alc_dma_alloc()
2256 device_printf(sc->alc_dev, "could not create Tx DMA tag.\n"); in alc_dma_alloc()
2262 sc->alc_cdata.alc_buffer_tag, /* parent */ in alc_dma_alloc()
2272 &sc->alc_cdata.alc_rx_tag); in alc_dma_alloc()
2274 device_printf(sc->alc_dev, "could not create Rx DMA tag.\n"); in alc_dma_alloc()
2279 txd = &sc->alc_cdata.alc_txdesc[i]; in alc_dma_alloc()
2280 txd->tx_m = NULL; in alc_dma_alloc()
2281 txd->tx_dmamap = NULL; in alc_dma_alloc()
2282 error = bus_dmamap_create(sc->alc_cdata.alc_tx_tag, 0, in alc_dma_alloc()
2283 &txd->tx_dmamap); in alc_dma_alloc()
2285 device_printf(sc->alc_dev, in alc_dma_alloc()
2291 if ((error = bus_dmamap_create(sc->alc_cdata.alc_rx_tag, 0, in alc_dma_alloc()
2292 &sc->alc_cdata.alc_rx_sparemap)) != 0) { in alc_dma_alloc()
2293 device_printf(sc->alc_dev, in alc_dma_alloc()
2298 rxd = &sc->alc_cdata.alc_rxdesc[i]; in alc_dma_alloc()
2299 rxd->rx_m = NULL; in alc_dma_alloc()
2300 rxd->rx_dmamap = NULL; in alc_dma_alloc()
2301 error = bus_dmamap_create(sc->alc_cdata.alc_rx_tag, 0, in alc_dma_alloc()
2302 &rxd->rx_dmamap); in alc_dma_alloc()
2304 device_printf(sc->alc_dev, in alc_dma_alloc()
2322 if (sc->alc_cdata.alc_tx_tag != NULL) { in alc_dma_free()
2324 txd = &sc->alc_cdata.alc_txdesc[i]; in alc_dma_free()
2325 if (txd->tx_dmamap != NULL) { in alc_dma_free()
2326 bus_dmamap_destroy(sc->alc_cdata.alc_tx_tag, in alc_dma_free()
2327 txd->tx_dmamap); in alc_dma_free()
2328 txd->tx_dmamap = NULL; in alc_dma_free()
2331 bus_dma_tag_destroy(sc->alc_cdata.alc_tx_tag); in alc_dma_free()
2332 sc->alc_cdata.alc_tx_tag = NULL; in alc_dma_free()
2335 if (sc->alc_cdata.alc_rx_tag != NULL) { in alc_dma_free()
2337 rxd = &sc->alc_cdata.alc_rxdesc[i]; in alc_dma_free()
2338 if (rxd->rx_dmamap != NULL) { in alc_dma_free()
2339 bus_dmamap_destroy(sc->alc_cdata.alc_rx_tag, in alc_dma_free()
2340 rxd->rx_dmamap); in alc_dma_free()
2341 rxd->rx_dmamap = NULL; in alc_dma_free()
2344 if (sc->alc_cdata.alc_rx_sparemap != NULL) { in alc_dma_free()
2345 bus_dmamap_destroy(sc->alc_cdata.alc_rx_tag, in alc_dma_free()
2346 sc->alc_cdata.alc_rx_sparemap); in alc_dma_free()
2347 sc->alc_cdata.alc_rx_sparemap = NULL; in alc_dma_free()
2349 bus_dma_tag_destroy(sc->alc_cdata.alc_rx_tag); in alc_dma_free()
2350 sc->alc_cdata.alc_rx_tag = NULL; in alc_dma_free()
2353 if (sc->alc_cdata.alc_tx_ring_tag != NULL) { in alc_dma_free()
2354 if (sc->alc_rdata.alc_tx_ring_paddr != 0) in alc_dma_free()
2355 bus_dmamap_unload(sc->alc_cdata.alc_tx_ring_tag, in alc_dma_free()
2356 sc->alc_cdata.alc_tx_ring_map); in alc_dma_free()
2357 if (sc->alc_rdata.alc_tx_ring != NULL) in alc_dma_free()
2358 bus_dmamem_free(sc->alc_cdata.alc_tx_ring_tag, in alc_dma_free()
2359 sc->alc_rdata.alc_tx_ring, in alc_dma_free()
2360 sc->alc_cdata.alc_tx_ring_map); in alc_dma_free()
2361 sc->alc_rdata.alc_tx_ring_paddr = 0; in alc_dma_free()
2362 sc->alc_rdata.alc_tx_ring = NULL; in alc_dma_free()
2363 bus_dma_tag_destroy(sc->alc_cdata.alc_tx_ring_tag); in alc_dma_free()
2364 sc->alc_cdata.alc_tx_ring_tag = NULL; in alc_dma_free()
2367 if (sc->alc_cdata.alc_rx_ring_tag != NULL) { in alc_dma_free()
2368 if (sc->alc_rdata.alc_rx_ring_paddr != 0) in alc_dma_free()
2369 bus_dmamap_unload(sc->alc_cdata.alc_rx_ring_tag, in alc_dma_free()
2370 sc->alc_cdata.alc_rx_ring_map); in alc_dma_free()
2371 if (sc->alc_rdata.alc_rx_ring != NULL) in alc_dma_free()
2372 bus_dmamem_free(sc->alc_cdata.alc_rx_ring_tag, in alc_dma_free()
2373 sc->alc_rdata.alc_rx_ring, in alc_dma_free()
2374 sc->alc_cdata.alc_rx_ring_map); in alc_dma_free()
2375 sc->alc_rdata.alc_rx_ring_paddr = 0; in alc_dma_free()
2376 sc->alc_rdata.alc_rx_ring = NULL; in alc_dma_free()
2377 bus_dma_tag_destroy(sc->alc_cdata.alc_rx_ring_tag); in alc_dma_free()
2378 sc->alc_cdata.alc_rx_ring_tag = NULL; in alc_dma_free()
2381 if (sc->alc_cdata.alc_rr_ring_tag != NULL) { in alc_dma_free()
2382 if (sc->alc_rdata.alc_rr_ring_paddr != 0) in alc_dma_free()
2383 bus_dmamap_unload(sc->alc_cdata.alc_rr_ring_tag, in alc_dma_free()
2384 sc->alc_cdata.alc_rr_ring_map); in alc_dma_free()
2385 if (sc->alc_rdata.alc_rr_ring != NULL) in alc_dma_free()
2386 bus_dmamem_free(sc->alc_cdata.alc_rr_ring_tag, in alc_dma_free()
2387 sc->alc_rdata.alc_rr_ring, in alc_dma_free()
2388 sc->alc_cdata.alc_rr_ring_map); in alc_dma_free()
2389 sc->alc_rdata.alc_rr_ring_paddr = 0; in alc_dma_free()
2390 sc->alc_rdata.alc_rr_ring = NULL; in alc_dma_free()
2391 bus_dma_tag_destroy(sc->alc_cdata.alc_rr_ring_tag); in alc_dma_free()
2392 sc->alc_cdata.alc_rr_ring_tag = NULL; in alc_dma_free()
2395 if (sc->alc_cdata.alc_cmb_tag != NULL) { in alc_dma_free()
2396 if (sc->alc_rdata.alc_cmb_paddr != 0) in alc_dma_free()
2397 bus_dmamap_unload(sc->alc_cdata.alc_cmb_tag, in alc_dma_free()
2398 sc->alc_cdata.alc_cmb_map); in alc_dma_free()
2399 if (sc->alc_rdata.alc_cmb != NULL) in alc_dma_free()
2400 bus_dmamem_free(sc->alc_cdata.alc_cmb_tag, in alc_dma_free()
2401 sc->alc_rdata.alc_cmb, in alc_dma_free()
2402 sc->alc_cdata.alc_cmb_map); in alc_dma_free()
2403 sc->alc_rdata.alc_cmb_paddr = 0; in alc_dma_free()
2404 sc->alc_rdata.alc_cmb = NULL; in alc_dma_free()
2405 bus_dma_tag_destroy(sc->alc_cdata.alc_cmb_tag); in alc_dma_free()
2406 sc->alc_cdata.alc_cmb_tag = NULL; in alc_dma_free()
2409 if (sc->alc_cdata.alc_smb_tag != NULL) { in alc_dma_free()
2410 if (sc->alc_rdata.alc_smb_paddr != 0) in alc_dma_free()
2411 bus_dmamap_unload(sc->alc_cdata.alc_smb_tag, in alc_dma_free()
2412 sc->alc_cdata.alc_smb_map); in alc_dma_free()
2413 if (sc->alc_rdata.alc_smb != NULL) in alc_dma_free()
2414 bus_dmamem_free(sc->alc_cdata.alc_smb_tag, in alc_dma_free()
2415 sc->alc_rdata.alc_smb, in alc_dma_free()
2416 sc->alc_cdata.alc_smb_map); in alc_dma_free()
2417 sc->alc_rdata.alc_smb_paddr = 0; in alc_dma_free()
2418 sc->alc_rdata.alc_smb = NULL; in alc_dma_free()
2419 bus_dma_tag_destroy(sc->alc_cdata.alc_smb_tag); in alc_dma_free()
2420 sc->alc_cdata.alc_smb_tag = NULL; in alc_dma_free()
2422 if (sc->alc_cdata.alc_buffer_tag != NULL) { in alc_dma_free()
2423 bus_dma_tag_destroy(sc->alc_cdata.alc_buffer_tag); in alc_dma_free()
2424 sc->alc_cdata.alc_buffer_tag = NULL; in alc_dma_free()
2426 if (sc->alc_cdata.alc_parent_tag != NULL) { in alc_dma_free()
2427 bus_dma_tag_destroy(sc->alc_cdata.alc_parent_tag); in alc_dma_free()
2428 sc->alc_cdata.alc_parent_tag = NULL; in alc_dma_free()
2441 * restarting auto-negotiation in suspend/shutdown phase but we
2442 * don't know whether that auto-negotiation would succeed or not
2443 * as driver has no control after powering off/suspend operation.
2450 * Save current negotiated media speed/duplex/flow-control to
2461 mii = device_get_softc(sc->alc_miibus); in alc_setlinkspeed()
2464 if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) == in alc_setlinkspeed()
2466 switch IFM_SUBTYPE(mii->mii_media_active) { in alc_setlinkspeed()
2477 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, MII_100T2CR, 0); in alc_setlinkspeed()
2478 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_setlinkspeed()
2480 alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, in alc_setlinkspeed()
2489 if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) in alc_setlinkspeed()
2492 mii->mii_media_active)) { in alc_setlinkspeed()
2506 device_printf(sc->alc_dev, in alc_setlinkspeed()
2510 * No link, force MAC to have 100Mbps, full-duplex link. in alc_setlinkspeed()
2513 mii->mii_media_status = IFM_AVALID | IFM_ACTIVE; in alc_setlinkspeed()
2514 mii->mii_media_active = IFM_ETHER | IFM_100_TX | IFM_FDX; in alc_setlinkspeed()
2522 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_setwol()
2538 ifp = sc->alc_ifp; in alc_setwol_813x()
2539 if ((sc->alc_flags & ALC_FLAG_PM) == 0) { in alc_setwol_813x()
2553 if ((sc->alc_flags & ALC_FLAG_FASTETHER) == 0) in alc_setwol_813x()
2582 pmstat = pci_read_config(sc->alc_dev, in alc_setwol_813x()
2583 sc->alc_pmcap + PCIR_POWER_STATUS, 2); in alc_setwol_813x()
2587 pci_write_config(sc->alc_dev, in alc_setwol_813x()
2588 sc->alc_pmcap + PCIR_POWER_STATUS, pmstat, 2); in alc_setwol_813x()
2600 ifp = sc->alc_ifp; in alc_setwol_816x()
2607 if ((sc->alc_flags & ALC_FLAG_PM) == 0) { in alc_setwol_816x()
2614 if ((sc->alc_flags & ALC_FLAG_FASTETHER) == 0) in alc_setwol_816x()
2645 if ((sc->alc_flags & ALC_FLAG_PM) != 0) { in alc_setwol_816x()
2647 pmstat = pci_read_config(sc->alc_dev, in alc_setwol_816x()
2648 sc->alc_pmcap + PCIR_POWER_STATUS, 2); in alc_setwol_816x()
2652 pci_write_config(sc->alc_dev, in alc_setwol_816x()
2653 sc->alc_pmcap + PCIR_POWER_STATUS, pmstat, 2); in alc_setwol_816x()
2682 if ((sc->alc_flags & ALC_FLAG_PM) != 0) { in alc_resume()
2684 pmstat = pci_read_config(sc->alc_dev, in alc_resume()
2685 sc->alc_pmcap + PCIR_POWER_STATUS, 2); in alc_resume()
2688 pci_write_config(sc->alc_dev, in alc_resume()
2689 sc->alc_pmcap + PCIR_POWER_STATUS, pmstat, 2); in alc_resume()
2694 ifp = sc->alc_ifp; in alc_resume()
2725 if ((m->m_pkthdr.csum_flags & (ALC_CSUM_FEATURES | CSUM_TSO)) != 0) { in alc_encap()
2759 if (eh->ether_type == htons(ETHERTYPE_VLAN)) { in alc_encap()
2773 poff = ip_off + (ip->ip_hl << 2); in alc_encap()
2774 if ((m->m_pkthdr.csum_flags & CSUM_TSO) != 0) { in alc_encap()
2781 m = m_pullup(m, poff + (tcp->th_off << 2)); in alc_encap()
2801 ip->ip_sum = 0; in alc_encap()
2802 tcp->th_sum = in_pseudo(ip->ip_src.s_addr, in alc_encap()
2803 ip->ip_dst.s_addr, htons(IPPROTO_TCP)); in alc_encap()
2808 prod = sc->alc_cdata.alc_tx_prod; in alc_encap()
2809 txd = &sc->alc_cdata.alc_txdesc[prod]; in alc_encap()
2811 map = txd->tx_dmamap; in alc_encap()
2813 error = bus_dmamap_load_mbuf_sg(sc->alc_cdata.alc_tx_tag, map, in alc_encap()
2823 error = bus_dmamap_load_mbuf_sg(sc->alc_cdata.alc_tx_tag, map, in alc_encap()
2839 if (sc->alc_cdata.alc_tx_cnt + nsegs >= ALC_TX_RING_CNT - 3) { in alc_encap()
2840 bus_dmamap_unload(sc->alc_cdata.alc_tx_tag, map); in alc_encap()
2843 bus_dmamap_sync(sc->alc_cdata.alc_tx_tag, map, BUS_DMASYNC_PREWRITE); in alc_encap()
2851 if ((m->m_flags & M_VLANTAG) != 0) { in alc_encap()
2852 vtag = htons(m->m_pkthdr.ether_vtag); in alc_encap()
2856 if ((m->m_pkthdr.csum_flags & CSUM_TSO) != 0) { in alc_encap()
2859 cflags |= ((uint32_t)m->m_pkthdr.tso_segsz << TD_MSS_SHIFT) & in alc_encap()
2869 hdrlen = poff + (tcp->th_off << 2); in alc_encap()
2870 desc = &sc->alc_rdata.alc_tx_ring[prod]; in alc_encap()
2871 desc->len = htole32(TX_BYTES(hdrlen | vtag)); in alc_encap()
2872 desc->flags = htole32(cflags); in alc_encap()
2873 desc->addr = htole64(txsegs[0].ds_addr); in alc_encap()
2874 sc->alc_cdata.alc_tx_cnt++; in alc_encap()
2876 if (m->m_len - hdrlen > 0) { in alc_encap()
2878 desc = &sc->alc_rdata.alc_tx_ring[prod]; in alc_encap()
2879 desc->len = htole32(TX_BYTES((m->m_len - hdrlen) | in alc_encap()
2881 desc->flags = htole32(cflags); in alc_encap()
2882 desc->addr = htole64(txsegs[0].ds_addr + hdrlen); in alc_encap()
2883 sc->alc_cdata.alc_tx_cnt++; in alc_encap()
2888 } else if ((m->m_pkthdr.csum_flags & ALC_CSUM_FEATURES) != 0) { in alc_encap()
2896 cflags |= (((poff + m->m_pkthdr.csum_data) >> 1) << in alc_encap()
2899 if ((m->m_pkthdr.csum_flags & CSUM_IP) != 0) in alc_encap()
2901 if ((m->m_pkthdr.csum_flags & CSUM_TCP) != 0) in alc_encap()
2903 if ((m->m_pkthdr.csum_flags & CSUM_UDP) != 0) in alc_encap()
2911 desc = &sc->alc_rdata.alc_tx_ring[prod]; in alc_encap()
2912 desc->len = htole32(TX_BYTES(txsegs[idx].ds_len) | vtag); in alc_encap()
2913 desc->flags = htole32(cflags); in alc_encap()
2914 desc->addr = htole64(txsegs[idx].ds_addr); in alc_encap()
2915 sc->alc_cdata.alc_tx_cnt++; in alc_encap()
2919 sc->alc_cdata.alc_tx_prod = prod; in alc_encap()
2922 prod = (prod + ALC_TX_RING_CNT - 1) % ALC_TX_RING_CNT; in alc_encap()
2923 desc = &sc->alc_rdata.alc_tx_ring[prod]; in alc_encap()
2924 desc->flags |= htole32(TD_EOP); in alc_encap()
2927 txd = &sc->alc_cdata.alc_txdesc[prod]; in alc_encap()
2928 map = txd_last->tx_dmamap; in alc_encap()
2929 txd_last->tx_dmamap = txd->tx_dmamap; in alc_encap()
2930 txd->tx_dmamap = map; in alc_encap()
2931 txd->tx_m = m; in alc_encap()
2959 if (sc->alc_cdata.alc_tx_cnt >= ALC_TX_DESC_HIWAT) in alc_start_locked()
2963 IFF_DRV_RUNNING || (sc->alc_flags & ALC_FLAG_LINK) == 0) in alc_start_locked()
3000 bus_dmamap_sync(sc->alc_cdata.alc_tx_ring_tag, in alc_start_tx()
3001 sc->alc_cdata.alc_tx_ring_map, BUS_DMASYNC_PREWRITE); in alc_start_tx()
3003 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_start_tx()
3005 (uint16_t)sc->alc_cdata.alc_tx_prod); in alc_start_tx()
3008 (sc->alc_cdata.alc_tx_prod << in alc_start_tx()
3012 sc->alc_watchdog_timer = ALC_TX_TIMEOUT; in alc_start_tx()
3022 if (sc->alc_watchdog_timer == 0 || --sc->alc_watchdog_timer) in alc_watchdog()
3025 ifp = sc->alc_ifp; in alc_watchdog()
3026 if ((sc->alc_flags & ALC_FLAG_LINK) == 0) { in alc_watchdog()
3027 if_printf(sc->alc_ifp, "watchdog timeout (lost link)\n"); in alc_watchdog()
3033 if_printf(sc->alc_ifp, "watchdog timeout -- resetting\n"); in alc_watchdog()
3054 if (ifr->ifr_mtu < ETHERMIN || in alc_ioctl()
3055 ifr->ifr_mtu > (sc->alc_ident->max_framelen - in alc_ioctl()
3056 sizeof(struct ether_vlan_header) - ETHER_CRC_LEN) || in alc_ioctl()
3057 ((sc->alc_flags & ALC_FLAG_JUMBO) == 0 && in alc_ioctl()
3058 ifr->ifr_mtu > ETHERMTU)) in alc_ioctl()
3060 else if (if_getmtu(ifp) != ifr->ifr_mtu) { in alc_ioctl()
3062 if_setmtu(ifp, ifr->ifr_mtu); in alc_ioctl()
3077 ((if_getflags(ifp) ^ sc->alc_if_flags) & in alc_ioctl()
3084 sc->alc_if_flags = if_getflags(ifp); in alc_ioctl()
3096 mii = device_get_softc(sc->alc_miibus); in alc_ioctl()
3097 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd); in alc_ioctl()
3101 mask = ifr->ifr_reqcap ^ if_getcapenable(ifp); in alc_ioctl()
3162 mii = device_get_softc(sc->alc_miibus); in alc_mac_config()
3166 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0 || in alc_mac_config()
3167 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8151 || in alc_mac_config()
3168 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8151_V2 || in alc_mac_config()
3169 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B2) in alc_mac_config()
3172 switch (IFM_SUBTYPE(mii->mii_media_active)) { in alc_mac_config()
3181 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) { in alc_mac_config()
3183 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_ETH_TXPAUSE) != 0) in alc_mac_config()
3185 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_ETH_RXPAUSE) != 0) in alc_mac_config()
3198 if ((sc->alc_flags & ALC_FLAG_SMB_BUG) == 0) { in alc_stats_clear()
3199 bus_dmamap_sync(sc->alc_cdata.alc_smb_tag, in alc_stats_clear()
3200 sc->alc_cdata.alc_smb_map, in alc_stats_clear()
3202 smb = sc->alc_rdata.alc_smb; in alc_stats_clear()
3204 smb->updated = 0; in alc_stats_clear()
3205 bus_dmamap_sync(sc->alc_cdata.alc_smb_tag, in alc_stats_clear()
3206 sc->alc_cdata.alc_smb_map, in alc_stats_clear()
3234 ifp = sc->alc_ifp; in alc_stats_update()
3235 stat = &sc->alc_stats; in alc_stats_update()
3236 if ((sc->alc_flags & ALC_FLAG_SMB_BUG) == 0) { in alc_stats_update()
3237 bus_dmamap_sync(sc->alc_cdata.alc_smb_tag, in alc_stats_update()
3238 sc->alc_cdata.alc_smb_map, in alc_stats_update()
3240 smb = sc->alc_rdata.alc_smb; in alc_stats_update()
3241 if (smb->updated == 0) in alc_stats_update()
3260 stat->rx_frames += smb->rx_frames; in alc_stats_update()
3261 stat->rx_bcast_frames += smb->rx_bcast_frames; in alc_stats_update()
3262 stat->rx_mcast_frames += smb->rx_mcast_frames; in alc_stats_update()
3263 stat->rx_pause_frames += smb->rx_pause_frames; in alc_stats_update()
3264 stat->rx_control_frames += smb->rx_control_frames; in alc_stats_update()
3265 stat->rx_crcerrs += smb->rx_crcerrs; in alc_stats_update()
3266 stat->rx_lenerrs += smb->rx_lenerrs; in alc_stats_update()
3267 stat->rx_bytes += smb->rx_bytes; in alc_stats_update()
3268 stat->rx_runts += smb->rx_runts; in alc_stats_update()
3269 stat->rx_fragments += smb->rx_fragments; in alc_stats_update()
3270 stat->rx_pkts_64 += smb->rx_pkts_64; in alc_stats_update()
3271 stat->rx_pkts_65_127 += smb->rx_pkts_65_127; in alc_stats_update()
3272 stat->rx_pkts_128_255 += smb->rx_pkts_128_255; in alc_stats_update()
3273 stat->rx_pkts_256_511 += smb->rx_pkts_256_511; in alc_stats_update()
3274 stat->rx_pkts_512_1023 += smb->rx_pkts_512_1023; in alc_stats_update()
3275 stat->rx_pkts_1024_1518 += smb->rx_pkts_1024_1518; in alc_stats_update()
3276 stat->rx_pkts_1519_max += smb->rx_pkts_1519_max; in alc_stats_update()
3277 stat->rx_pkts_truncated += smb->rx_pkts_truncated; in alc_stats_update()
3278 stat->rx_fifo_oflows += smb->rx_fifo_oflows; in alc_stats_update()
3279 stat->rx_rrs_errs += smb->rx_rrs_errs; in alc_stats_update()
3280 stat->rx_alignerrs += smb->rx_alignerrs; in alc_stats_update()
3281 stat->rx_bcast_bytes += smb->rx_bcast_bytes; in alc_stats_update()
3282 stat->rx_mcast_bytes += smb->rx_mcast_bytes; in alc_stats_update()
3283 stat->rx_pkts_filtered += smb->rx_pkts_filtered; in alc_stats_update()
3286 stat->tx_frames += smb->tx_frames; in alc_stats_update()
3287 stat->tx_bcast_frames += smb->tx_bcast_frames; in alc_stats_update()
3288 stat->tx_mcast_frames += smb->tx_mcast_frames; in alc_stats_update()
3289 stat->tx_pause_frames += smb->tx_pause_frames; in alc_stats_update()
3290 stat->tx_excess_defer += smb->tx_excess_defer; in alc_stats_update()
3291 stat->tx_control_frames += smb->tx_control_frames; in alc_stats_update()
3292 stat->tx_deferred += smb->tx_deferred; in alc_stats_update()
3293 stat->tx_bytes += smb->tx_bytes; in alc_stats_update()
3294 stat->tx_pkts_64 += smb->tx_pkts_64; in alc_stats_update()
3295 stat->tx_pkts_65_127 += smb->tx_pkts_65_127; in alc_stats_update()
3296 stat->tx_pkts_128_255 += smb->tx_pkts_128_255; in alc_stats_update()
3297 stat->tx_pkts_256_511 += smb->tx_pkts_256_511; in alc_stats_update()
3298 stat->tx_pkts_512_1023 += smb->tx_pkts_512_1023; in alc_stats_update()
3299 stat->tx_pkts_1024_1518 += smb->tx_pkts_1024_1518; in alc_stats_update()
3300 stat->tx_pkts_1519_max += smb->tx_pkts_1519_max; in alc_stats_update()
3301 stat->tx_single_colls += smb->tx_single_colls; in alc_stats_update()
3302 stat->tx_multi_colls += smb->tx_multi_colls; in alc_stats_update()
3303 stat->tx_late_colls += smb->tx_late_colls; in alc_stats_update()
3304 stat->tx_excess_colls += smb->tx_excess_colls; in alc_stats_update()
3305 stat->tx_underrun += smb->tx_underrun; in alc_stats_update()
3306 stat->tx_desc_underrun += smb->tx_desc_underrun; in alc_stats_update()
3307 stat->tx_lenerrs += smb->tx_lenerrs; in alc_stats_update()
3308 stat->tx_pkts_truncated += smb->tx_pkts_truncated; in alc_stats_update()
3309 stat->tx_bcast_bytes += smb->tx_bcast_bytes; in alc_stats_update()
3310 stat->tx_mcast_bytes += smb->tx_mcast_bytes; in alc_stats_update()
3313 if_inc_counter(ifp, IFCOUNTER_OPACKETS, smb->tx_frames); in alc_stats_update()
3315 if_inc_counter(ifp, IFCOUNTER_COLLISIONS, smb->tx_single_colls + in alc_stats_update()
3316 smb->tx_multi_colls * 2 + smb->tx_late_colls + in alc_stats_update()
3317 smb->tx_excess_colls * HDPX_CFG_RETRY_DEFAULT); in alc_stats_update()
3319 if_inc_counter(ifp, IFCOUNTER_OERRORS, smb->tx_late_colls + in alc_stats_update()
3320 smb->tx_excess_colls + smb->tx_underrun + smb->tx_pkts_truncated); in alc_stats_update()
3322 if_inc_counter(ifp, IFCOUNTER_IPACKETS, smb->rx_frames); in alc_stats_update()
3325 smb->rx_crcerrs + smb->rx_lenerrs + in alc_stats_update()
3326 smb->rx_runts + smb->rx_pkts_truncated + in alc_stats_update()
3327 smb->rx_fifo_oflows + smb->rx_rrs_errs + in alc_stats_update()
3328 smb->rx_alignerrs); in alc_stats_update()
3330 if ((sc->alc_flags & ALC_FLAG_SMB_BUG) == 0) { in alc_stats_update()
3332 smb->updated = 0; in alc_stats_update()
3333 bus_dmamap_sync(sc->alc_cdata.alc_smb_tag, in alc_stats_update()
3334 sc->alc_cdata.alc_smb_map, in alc_stats_update()
3347 if (sc->alc_flags & ALC_FLAG_MT) { in alc_intr()
3348 taskqueue_enqueue(sc->alc_tq, &sc->alc_int_task); in alc_intr()
3357 taskqueue_enqueue(sc->alc_tq, &sc->alc_int_task); in alc_intr()
3371 ifp = sc->alc_ifp; in alc_int_task()
3375 if (sc->alc_morework != 0) { in alc_int_task()
3376 sc->alc_morework = 0; in alc_int_task()
3388 more = alc_rxintr(sc, sc->alc_process_limit); in alc_int_task()
3390 sc->alc_morework = 1; in alc_int_task()
3401 device_printf(sc->alc_dev, in alc_int_task()
3402 "DMA read error! -- resetting\n"); in alc_int_task()
3404 device_printf(sc->alc_dev, in alc_int_task()
3405 "DMA write error! -- resetting\n"); in alc_int_task()
3407 device_printf(sc->alc_dev, in alc_int_task()
3408 "TxQ reset! -- resetting\n"); in alc_int_task()
3422 taskqueue_enqueue(sc->alc_tq, &sc->alc_int_task); in alc_int_task()
3428 /* Re-enable interrupts if we're running. */ in alc_int_task()
3429 if (sc->alc_flags & ALC_FLAG_MT) in alc_int_task()
3446 ifp = sc->alc_ifp; in alc_txeof()
3448 if (sc->alc_cdata.alc_tx_cnt == 0) in alc_txeof()
3450 bus_dmamap_sync(sc->alc_cdata.alc_tx_ring_tag, in alc_txeof()
3451 sc->alc_cdata.alc_tx_ring_map, BUS_DMASYNC_POSTWRITE); in alc_txeof()
3452 if ((sc->alc_flags & ALC_FLAG_CMB_BUG) == 0) { in alc_txeof()
3453 bus_dmamap_sync(sc->alc_cdata.alc_cmb_tag, in alc_txeof()
3454 sc->alc_cdata.alc_cmb_map, BUS_DMASYNC_POSTREAD); in alc_txeof()
3455 prod = sc->alc_rdata.alc_cmb->cons; in alc_txeof()
3457 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_txeof()
3466 cons = sc->alc_cdata.alc_tx_cons; in alc_txeof()
3472 if (sc->alc_cdata.alc_tx_cnt <= 0) in alc_txeof()
3475 sc->alc_cdata.alc_tx_cnt--; in alc_txeof()
3476 txd = &sc->alc_cdata.alc_txdesc[cons]; in alc_txeof()
3477 if (txd->tx_m != NULL) { in alc_txeof()
3479 bus_dmamap_sync(sc->alc_cdata.alc_tx_tag, in alc_txeof()
3480 txd->tx_dmamap, BUS_DMASYNC_POSTWRITE); in alc_txeof()
3481 bus_dmamap_unload(sc->alc_cdata.alc_tx_tag, in alc_txeof()
3482 txd->tx_dmamap); in alc_txeof()
3483 m_freem(txd->tx_m); in alc_txeof()
3484 txd->tx_m = NULL; in alc_txeof()
3488 if ((sc->alc_flags & ALC_FLAG_CMB_BUG) == 0) in alc_txeof()
3489 bus_dmamap_sync(sc->alc_cdata.alc_cmb_tag, in alc_txeof()
3490 sc->alc_cdata.alc_cmb_map, BUS_DMASYNC_PREREAD); in alc_txeof()
3491 sc->alc_cdata.alc_tx_cons = cons; in alc_txeof()
3496 if (sc->alc_cdata.alc_tx_cnt == 0) in alc_txeof()
3497 sc->alc_watchdog_timer = 0; in alc_txeof()
3511 m->m_len = m->m_pkthdr.len = RX_BUF_SIZE_MAX; in alc_newbuf()
3516 if (bus_dmamap_load_mbuf_sg(sc->alc_cdata.alc_rx_tag, in alc_newbuf()
3517 sc->alc_cdata.alc_rx_sparemap, m, segs, &nsegs, 0) != 0) { in alc_newbuf()
3523 if (rxd->rx_m != NULL) { in alc_newbuf()
3524 bus_dmamap_sync(sc->alc_cdata.alc_rx_tag, rxd->rx_dmamap, in alc_newbuf()
3526 bus_dmamap_unload(sc->alc_cdata.alc_rx_tag, rxd->rx_dmamap); in alc_newbuf()
3528 map = rxd->rx_dmamap; in alc_newbuf()
3529 rxd->rx_dmamap = sc->alc_cdata.alc_rx_sparemap; in alc_newbuf()
3530 sc->alc_cdata.alc_rx_sparemap = map; in alc_newbuf()
3531 bus_dmamap_sync(sc->alc_cdata.alc_rx_tag, rxd->rx_dmamap, in alc_newbuf()
3533 rxd->rx_m = m; in alc_newbuf()
3534 rxd->rx_desc->addr = htole64(segs[0].ds_addr); in alc_newbuf()
3546 bus_dmamap_sync(sc->alc_cdata.alc_rr_ring_tag, in alc_rxintr()
3547 sc->alc_cdata.alc_rr_ring_map, in alc_rxintr()
3549 bus_dmamap_sync(sc->alc_cdata.alc_rx_ring_tag, in alc_rxintr()
3550 sc->alc_cdata.alc_rx_ring_map, BUS_DMASYNC_POSTWRITE); in alc_rxintr()
3551 rr_cons = sc->alc_cdata.alc_rr_cons; in alc_rxintr()
3552 ifp = sc->alc_ifp; in alc_rxintr()
3554 if (count-- <= 0) in alc_rxintr()
3556 rrd = &sc->alc_rdata.alc_rr_ring[rr_cons]; in alc_rxintr()
3557 status = le32toh(rrd->status); in alc_rxintr()
3560 nsegs = RRD_RD_CNT(le32toh(rrd->rdinfo)); in alc_rxintr()
3563 device_printf(sc->alc_dev, in alc_rxintr()
3564 "unexpected segment count -- resetting\n"); in alc_rxintr()
3569 rrd->status = 0; in alc_rxintr()
3571 sc->alc_cdata.alc_rx_cons += nsegs; in alc_rxintr()
3572 sc->alc_cdata.alc_rx_cons %= ALC_RR_RING_CNT; in alc_rxintr()
3578 sc->alc_cdata.alc_rr_cons = rr_cons; in alc_rxintr()
3580 bus_dmamap_sync(sc->alc_cdata.alc_rr_ring_tag, in alc_rxintr()
3581 sc->alc_cdata.alc_rr_ring_map, in alc_rxintr()
3587 bus_dmamap_sync(sc->alc_cdata.alc_rx_ring_tag, in alc_rxintr()
3588 sc->alc_cdata.alc_rx_ring_map, BUS_DMASYNC_PREWRITE); in alc_rxintr()
3593 * only when Rx buffer pre-fetching is required. In in alc_rxintr()
3596 * it still seems that pre-fetching needs more in alc_rxintr()
3599 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_rxintr()
3601 (uint16_t)sc->alc_cdata.alc_rx_cons); in alc_rxintr()
3604 sc->alc_cdata.alc_rx_cons); in alc_rxintr()
3619 dst = src - 3; in alc_fixup_rx()
3621 if (m->m_next == NULL) { in alc_fixup_rx()
3622 for (i = 0; i < (m->m_len / sizeof(uint16_t) + 1); i++) in alc_fixup_rx()
3624 m->m_data -= 6; in alc_fixup_rx()
3638 bcopy(m->m_data, n->m_data, ETHER_HDR_LEN); in alc_fixup_rx()
3639 m->m_data += ETHER_HDR_LEN; in alc_fixup_rx()
3640 m->m_len -= ETHER_HDR_LEN; in alc_fixup_rx()
3641 n->m_len = ETHER_HDR_LEN; in alc_fixup_rx()
3643 n->m_next = m; in alc_fixup_rx()
3658 ifp = sc->alc_ifp; in alc_rxeof()
3659 status = le32toh(rrd->status); in alc_rxeof()
3660 rdinfo = le32toh(rrd->rdinfo); in alc_rxeof()
3664 sc->alc_cdata.alc_rxlen = RRD_BYTES(status); in alc_rxeof()
3686 rxd = &sc->alc_cdata.alc_rxdesc[rx_cons]; in alc_rxeof()
3687 mp = rxd->rx_m; in alc_rxeof()
3692 if (sc->alc_cdata.alc_rxhead != NULL) in alc_rxeof()
3693 m_freem(sc->alc_cdata.alc_rxhead); in alc_rxeof()
3700 * multi-segmented frame. in alc_rxeof()
3702 mp->m_len = sc->alc_buf_size; in alc_rxeof()
3705 if (sc->alc_cdata.alc_rxhead == NULL) { in alc_rxeof()
3706 sc->alc_cdata.alc_rxhead = mp; in alc_rxeof()
3707 sc->alc_cdata.alc_rxtail = mp; in alc_rxeof()
3709 mp->m_flags &= ~M_PKTHDR; in alc_rxeof()
3710 sc->alc_cdata.alc_rxprev_tail = in alc_rxeof()
3711 sc->alc_cdata.alc_rxtail; in alc_rxeof()
3712 sc->alc_cdata.alc_rxtail->m_next = mp; in alc_rxeof()
3713 sc->alc_cdata.alc_rxtail = mp; in alc_rxeof()
3716 if (count == nsegs - 1) { in alc_rxeof()
3718 m = sc->alc_cdata.alc_rxhead; in alc_rxeof()
3719 m->m_flags |= M_PKTHDR; in alc_rxeof()
3724 m->m_pkthdr.len = in alc_rxeof()
3725 sc->alc_cdata.alc_rxlen - ETHER_CRC_LEN; in alc_rxeof()
3728 mp->m_len = sc->alc_cdata.alc_rxlen - in alc_rxeof()
3729 (nsegs - 1) * sc->alc_buf_size; in alc_rxeof()
3731 if (mp->m_len <= ETHER_CRC_LEN) { in alc_rxeof()
3732 sc->alc_cdata.alc_rxtail = in alc_rxeof()
3733 sc->alc_cdata.alc_rxprev_tail; in alc_rxeof()
3734 sc->alc_cdata.alc_rxtail->m_len -= in alc_rxeof()
3735 (ETHER_CRC_LEN - mp->m_len); in alc_rxeof()
3736 sc->alc_cdata.alc_rxtail->m_next = NULL; in alc_rxeof()
3739 mp->m_len -= ETHER_CRC_LEN; in alc_rxeof()
3742 m->m_len = m->m_pkthdr.len; in alc_rxeof()
3743 m->m_pkthdr.rcvif = ifp; in alc_rxeof()
3750 vtag = RRD_VLAN(le32toh(rrd->vtag)); in alc_rxeof()
3751 m->m_pkthdr.ether_vtag = ntohs(vtag); in alc_rxeof()
3752 m->m_flags |= M_VLANTAG; in alc_rxeof()
3780 mii = device_get_softc(sc->alc_miibus); in alc_tick()
3792 callout_reset(&sc->alc_tick_ch, hz, alc_tick, sc); in alc_tick()
3806 if (AR816X_REV(sc->alc_rev) >= AR816X_REV_B0) { in alc_osc_reset()
3808 * Restore over-current protection default value. in alc_osc_reset()
3824 if (AR816X_REV(sc->alc_rev) <= AR816X_REV_A1) in alc_osc_reset()
3840 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_reset()
3843 if (AR816X_REV(sc->alc_rev) <= AR816X_REV_A1 && in alc_reset()
3844 (sc->alc_rev & 0x01) != 0) { in alc_reset()
3859 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_reset()
3860 for (i = ALC_RESET_TIMEOUT; i > 0; i--) { in alc_reset()
3866 device_printf(sc->alc_dev, "MAC reset timeout!\n"); in alc_reset()
3868 for (i = ALC_RESET_TIMEOUT; i > 0; i--) { in alc_reset()
3874 device_printf(sc->alc_dev, "master reset timeout!\n"); in alc_reset()
3876 for (i = ALC_RESET_TIMEOUT; i > 0; i--) { in alc_reset()
3884 device_printf(sc->alc_dev, "reset timeout(0x%08x)!\n", reg); in alc_reset()
3886 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_reset()
3887 if (AR816X_REV(sc->alc_rev) <= AR816X_REV_A1 && in alc_reset()
3888 (sc->alc_rev & 0x01) != 0) { in alc_reset()
3905 if (AR816X_REV(sc->alc_rev) <= AR816X_REV_A1) in alc_reset()
3910 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0 || in alc_reset()
3911 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B || in alc_reset()
3912 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8151_V2) in alc_reset()
3939 ifp = sc->alc_ifp; in alc_init_locked()
3954 device_printf(sc->alc_dev, "no memory for Rx buffers.\n"); in alc_init_locked()
3964 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_init_locked()
3969 if (AR816X_REV(sc->alc_rev) >= AR816X_REV_B0) in alc_init_locked()
3987 paddr = sc->alc_rdata.alc_tx_ring_paddr; in alc_init_locked()
3996 paddr = sc->alc_rdata.alc_rx_ring_paddr; in alc_init_locked()
3999 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) { in alc_init_locked()
4016 * For strict-alignment architectures make sure to reduce buffer in alc_init_locked()
4020 sc->alc_buf_size = RX_BUF_SIZE_MAX - sizeof(uint64_t); in alc_init_locked()
4022 sc->alc_buf_size = RX_BUF_SIZE_MAX; in alc_init_locked()
4024 CSR_WRITE_4(sc, ALC_RX_BUF_SIZE, sc->alc_buf_size); in alc_init_locked()
4026 paddr = sc->alc_rdata.alc_rr_ring_paddr; in alc_init_locked()
4029 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) { in alc_init_locked()
4038 paddr = sc->alc_rdata.alc_cmb_paddr; in alc_init_locked()
4040 paddr = sc->alc_rdata.alc_smb_paddr; in alc_init_locked()
4044 if (sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B) { in alc_init_locked()
4045 /* Reconfigure SRAM - Vendor magic. */ in alc_init_locked()
4060 reg = ALC_USECS(sc->alc_int_rx_mod) << IM_TIMER_RX_SHIFT; in alc_init_locked()
4061 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) in alc_init_locked()
4062 reg |= ALC_USECS(sc->alc_int_tx_mod) << IM_TIMER_TX_SHIFT; in alc_init_locked()
4071 if (ALC_USECS(sc->alc_int_rx_mod) != 0) in alc_init_locked()
4073 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0 && in alc_init_locked()
4074 ALC_USECS(sc->alc_int_tx_mod) != 0) in alc_init_locked()
4078 * Disable interrupt re-trigger timer. We don't want automatic in alc_init_locked()
4079 * re-triggering of un-ACKed interrupts. in alc_init_locked()
4083 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_init_locked()
4086 ALC_USECS(sc->alc_int_tx_mod)); in alc_init_locked()
4088 if ((sc->alc_flags & ALC_FLAG_CMB_BUG) == 0) { in alc_init_locked()
4108 * would make path-MTU discovery hard as sender wouldn't get in alc_init_locked()
4110 * multi-fragmented frames on Rx path so it has no issue on in alc_init_locked()
4116 * accept from others - RFC 793. in alc_init_locked()
4118 CSR_WRITE_4(sc, ALC_FRAME_SIZE, sc->alc_ident->max_framelen); in alc_init_locked()
4120 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) { in alc_init_locked()
4134 /* Set parameters for half-duplex media. */ in alc_init_locked()
4151 reg = (sc->alc_ident->max_framelen >> TSO_OFFLOAD_THRESH_UNIT_SHIFT) & in alc_init_locked()
4153 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) in alc_init_locked()
4157 reg = (alc_dma_burst[sc->alc_dma_rd_burst] << in alc_init_locked()
4159 if (sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B || in alc_init_locked()
4160 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B2) in alc_init_locked()
4166 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_init_locked()
4179 /* Configure Rx free descriptor pre-fetching. */ in alc_init_locked()
4192 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_init_locked()
4197 reg -= RX_FIFO_PAUSE_816X_RSVD; in alc_init_locked()
4199 reg -= RX_BUF_SIZE_MAX; in alc_init_locked()
4207 } else if (sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8131 || in alc_init_locked()
4208 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8132) { in alc_init_locked()
4219 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) { in alc_init_locked()
4229 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_init_locked()
4233 if ((sc->alc_flags & ALC_FLAG_FASTETHER) == 0) in alc_init_locked()
4236 if ((sc->alc_flags & ALC_FLAG_FASTETHER) == 0 && in alc_init_locked()
4237 sc->alc_ident->deviceid != DEVICEID_ATHEROS_AR8151_V2) in alc_init_locked()
4244 reg |= sc->alc_rcb; in alc_init_locked()
4245 if ((sc->alc_flags & ALC_FLAG_CMB_BUG) == 0) in alc_init_locked()
4247 if ((sc->alc_flags & ALC_FLAG_SMB_BUG) == 0) in alc_init_locked()
4251 reg |= (sc->alc_dma_rd_burst & DMA_CFG_RD_BURST_MASK) << in alc_init_locked()
4253 reg |= (sc->alc_dma_wr_burst & DMA_CFG_WR_BURST_MASK) << in alc_init_locked()
4259 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0) { in alc_init_locked()
4260 switch (AR816X_REV(sc->alc_rev)) { in alc_init_locked()
4276 * - Auto-padding for short frames. in alc_init_locked()
4277 * - Enable CRC generation. in alc_init_locked()
4290 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) != 0 || in alc_init_locked()
4291 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8151 || in alc_init_locked()
4292 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8151_V2 || in alc_init_locked()
4293 sc->alc_ident->deviceid == DEVICEID_ATHEROS_AR8152_B2) in alc_init_locked()
4295 if ((sc->alc_flags & ALC_FLAG_FASTETHER) != 0) in alc_init_locked()
4313 sc->alc_flags &= ~ALC_FLAG_LINK; in alc_init_locked()
4317 callout_reset(&sc->alc_tick_ch, hz, alc_tick, sc); in alc_init_locked()
4333 ifp = sc->alc_ifp; in alc_stop()
4335 sc->alc_flags &= ~ALC_FLAG_LINK; in alc_stop()
4336 callout_stop(&sc->alc_tick_ch); in alc_stop()
4337 sc->alc_watchdog_timer = 0; in alc_stop()
4355 if (sc->alc_cdata.alc_rxhead != NULL) in alc_stop()
4356 m_freem(sc->alc_cdata.alc_rxhead); in alc_stop()
4362 rxd = &sc->alc_cdata.alc_rxdesc[i]; in alc_stop()
4363 if (rxd->rx_m != NULL) { in alc_stop()
4364 bus_dmamap_sync(sc->alc_cdata.alc_rx_tag, in alc_stop()
4365 rxd->rx_dmamap, BUS_DMASYNC_POSTREAD); in alc_stop()
4366 bus_dmamap_unload(sc->alc_cdata.alc_rx_tag, in alc_stop()
4367 rxd->rx_dmamap); in alc_stop()
4368 m_freem(rxd->rx_m); in alc_stop()
4369 rxd->rx_m = NULL; in alc_stop()
4373 txd = &sc->alc_cdata.alc_txdesc[i]; in alc_stop()
4374 if (txd->tx_m != NULL) { in alc_stop()
4375 bus_dmamap_sync(sc->alc_cdata.alc_tx_tag, in alc_stop()
4376 txd->tx_dmamap, BUS_DMASYNC_POSTWRITE); in alc_stop()
4377 bus_dmamap_unload(sc->alc_cdata.alc_tx_tag, in alc_stop()
4378 txd->tx_dmamap); in alc_stop()
4379 m_freem(txd->tx_m); in alc_stop()
4380 txd->tx_m = NULL; in alc_stop()
4398 for (i = ALC_TIMEOUT; i > 0; i--) { in alc_stop_mac()
4405 device_printf(sc->alc_dev, in alc_stop_mac()
4425 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) { in alc_start_queue()
4445 if ((sc->alc_flags & ALC_FLAG_AR816X_FAMILY) == 0) { in alc_stop_queue()
4463 for (i = ALC_TIMEOUT; i > 0; i--) { in alc_stop_queue()
4470 device_printf(sc->alc_dev, in alc_stop_queue()
4483 sc->alc_cdata.alc_tx_prod = 0; in alc_init_tx_ring()
4484 sc->alc_cdata.alc_tx_cons = 0; in alc_init_tx_ring()
4485 sc->alc_cdata.alc_tx_cnt = 0; in alc_init_tx_ring()
4487 rd = &sc->alc_rdata; in alc_init_tx_ring()
4488 bzero(rd->alc_tx_ring, ALC_TX_RING_SZ); in alc_init_tx_ring()
4490 txd = &sc->alc_cdata.alc_txdesc[i]; in alc_init_tx_ring()
4491 txd->tx_m = NULL; in alc_init_tx_ring()
4494 bus_dmamap_sync(sc->alc_cdata.alc_tx_ring_tag, in alc_init_tx_ring()
4495 sc->alc_cdata.alc_tx_ring_map, BUS_DMASYNC_PREWRITE); in alc_init_tx_ring()
4507 sc->alc_cdata.alc_rx_cons = ALC_RX_RING_CNT - 1; in alc_init_rx_ring()
4508 sc->alc_morework = 0; in alc_init_rx_ring()
4509 rd = &sc->alc_rdata; in alc_init_rx_ring()
4510 bzero(rd->alc_rx_ring, ALC_RX_RING_SZ); in alc_init_rx_ring()
4512 rxd = &sc->alc_cdata.alc_rxdesc[i]; in alc_init_rx_ring()
4513 rxd->rx_m = NULL; in alc_init_rx_ring()
4514 rxd->rx_desc = &rd->alc_rx_ring[i]; in alc_init_rx_ring()
4521 * does have to read Rx descriptors back so BUS_DMASYNC_PREWRITE in alc_init_rx_ring()
4524 bus_dmamap_sync(sc->alc_cdata.alc_rx_ring_tag, in alc_init_rx_ring()
4525 sc->alc_cdata.alc_rx_ring_map, BUS_DMASYNC_PREWRITE); in alc_init_rx_ring()
4527 CSR_WRITE_4(sc, ALC_MBOX_RD0_PROD_IDX, sc->alc_cdata.alc_rx_cons); in alc_init_rx_ring()
4539 sc->alc_cdata.alc_rr_cons = 0; in alc_init_rr_ring()
4542 rd = &sc->alc_rdata; in alc_init_rr_ring()
4543 bzero(rd->alc_rr_ring, ALC_RR_RING_SZ); in alc_init_rr_ring()
4544 bus_dmamap_sync(sc->alc_cdata.alc_rr_ring_tag, in alc_init_rr_ring()
4545 sc->alc_cdata.alc_rr_ring_map, in alc_init_rr_ring()
4556 rd = &sc->alc_rdata; in alc_init_cmb()
4557 bzero(rd->alc_cmb, ALC_CMB_SZ); in alc_init_cmb()
4558 bus_dmamap_sync(sc->alc_cdata.alc_cmb_tag, sc->alc_cdata.alc_cmb_map, in alc_init_cmb()
4569 rd = &sc->alc_rdata; in alc_init_smb()
4570 bzero(rd->alc_smb, ALC_SMB_SZ); in alc_init_smb()
4571 bus_dmamap_sync(sc->alc_cdata.alc_smb_tag, sc->alc_cdata.alc_smb_map, in alc_init_smb()
4583 ifp = sc->alc_ifp; in alc_rxvlan()
4613 ifp = sc->alc_ifp; in alc_rxfilter()
4647 if (error || req->newptr == NULL) in sysctl_int_range()
4678 KASSERT(sc->alc_buf_size <= MCLBYTES, ("incorrect cluster size")); in alc_debugnet_init()