Lines Matching refs:erip

101 static	void	eri_uninit(struct eri *erip);
148 static void eri_stop_timer(struct eri *erip);
149 static void eri_start_timer(struct eri *erip, fptrv_t func, clock_t msec);
231 #define BUMP_InNUcast(erip, pkt) \ argument
233 HSTAT(erip, brdcstrcv); \
235 HSTAT(erip, multircv); \
238 #define BUMP_OutNUcast(erip, pkt) \ argument
240 HSTAT(erip, brdcstxmt); \
242 HSTAT(erip, multixmt); \
251 #define ERI_PROCESS_READ(erip, bp, sum) \ argument
261 HSTAT(erip, ipackets64); \
262 HSTATN(erip, rbytes64, len); \
263 BUMP_InNUcast(erip, bp->b_rptr); \
282 #define ERI_PROCESS_READ(erip, bp) \ argument
290 HSTAT(erip, ipackets64); \
291 HSTATN(erip, rbytes64, len); \
292 BUMP_InNUcast(erip, bp->b_rptr); \
333 #define ERI_IOPBIOADDR(erip, a) \ argument
334 ((erip)->iopbiobase + ((uintptr_t)a - (erip)->iopbkbase))
661 struct eri *erip = NULL; in eri_attach() local
673 if ((erip = ddi_get_driver_private(dip)) == NULL) in eri_attach()
676 mutex_enter(&erip->intrlock); in eri_attach()
677 erip->flags &= ~ERI_SUSPENDED; in eri_attach()
678 erip->init_macregs = 1; in eri_attach()
680 erip->stats.link_up = LINK_STATE_DOWN; in eri_attach()
681 erip->linkcheck = 0; in eri_attach()
683 doinit = (erip->flags & ERI_STARTED) ? B_TRUE : B_FALSE; in eri_attach()
684 mutex_exit(&erip->intrlock); in eri_attach()
686 if (doinit && !eri_init(erip)) { in eri_attach()
698 erip = kmem_zalloc(sizeof (struct eri), KM_SLEEP); in eri_attach()
703 ddi_set_driver_private(dip, erip); in eri_attach()
704 erip->dip = dip; /* dip */ in eri_attach()
705 erip->instance = ddi_get_instance(dip); /* instance */ in eri_attach()
706 erip->flags = 0; in eri_attach()
707 erip->multi_refcnt = 0; in eri_attach()
708 erip->promisc = B_FALSE; in eri_attach()
711 ERI_FAULT_MSG1(erip, SEVERITY_HIGH, ERI_VERB_MSG, in eri_attach()
716 macp->m_driver = erip; in eri_attach()
718 macp->m_src_addr = erip->ouraddr; in eri_attach()
736 ERI_FAULT_MSG2(erip, SEVERITY_HIGH, ERI_VERB_MSG, in eri_attach()
744 if (pci_config_setup(dip, &erip->pci_config_handle) != DDI_SUCCESS) { in eri_attach()
745 ERI_FAULT_MSG2(erip, SEVERITY_HIGH, ERI_VERB_MSG, in eri_attach()
753 erip->dev_attr.devacc_attr_version = DDI_DEVICE_ATTR_V0; in eri_attach()
754 erip->dev_attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC; in eri_attach()
755 erip->dev_attr.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC; in eri_attach()
757 if (ddi_regs_map_setup(dip, 1, (caddr_t *)&(erip->globregp), 0, 0, in eri_attach()
758 &erip->dev_attr, &erip->globregh)) { in eri_attach()
761 erip->etxregh = erip->globregh; in eri_attach()
762 erip->erxregh = erip->globregh; in eri_attach()
763 erip->bmacregh = erip->globregh; in eri_attach()
764 erip->mifregh = erip->globregh; in eri_attach()
766 erip->etxregp = (void *)(((caddr_t)erip->globregp) + 0x2000); in eri_attach()
767 erip->erxregp = (void *)(((caddr_t)erip->globregp) + 0x4000); in eri_attach()
768 erip->bmacregp = (void *)(((caddr_t)erip->globregp) + 0x6000); in eri_attach()
769 erip->mifregp = (void *)(((caddr_t)erip->globregp) + 0x6200); in eri_attach()
774 if (ddi_regs_map_setup(dip, 1, (caddr_t *)&(erip->sw_reset_reg), in eri_attach()
775 0x1010, 4, &erip->dev_attr, &erip->sw_reset_regh)) { in eri_attach()
776 ERI_FAULT_MSG1(erip, SEVERITY_MID, ERI_VERB_MSG, in eri_attach()
785 if (eri_stop(erip)) in eri_attach()
791 pci_config_put8(erip->pci_config_handle, PCI_CONF_LATENCY_TIMER, in eri_attach()
795 ERI_FAULT_MSG1(erip, SEVERITY_NONE, ERI_VERB_MSG, in eri_attach()
804 if (ddi_get_iblock_cookie(dip, 0, &erip->cookie) != DDI_SUCCESS) in eri_attach()
810 mutex_init(&erip->xmitlock, NULL, MUTEX_DRIVER, (void *)erip->cookie); in eri_attach()
811 mutex_init(&erip->intrlock, NULL, MUTEX_DRIVER, (void *)erip->cookie); in eri_attach()
812 mutex_init(&erip->linklock, NULL, MUTEX_DRIVER, (void *)erip->cookie); in eri_attach()
813 mutex_init(&erip->xcvrlock, NULL, MUTEX_DRIVER, (void *)erip->cookie); in eri_attach()
820 if (ddi_add_intr(dip, 0, &erip->cookie, 0, eri_intr, (caddr_t)erip) == in eri_attach()
830 (void) eri_setup_mac_address(erip, dip); in eri_attach()
832 if (eri_init_xfer_params(erip)) in eri_attach()
835 if (eri_burstsize(erip) == DDI_FAILURE) { in eri_attach()
845 erip->rpending_mask = ERI_RPENDING - 1; in eri_attach()
846 erip->rmdmax_mask = ERI_RPENDING - 1; in eri_attach()
847 erip->mif_config = (ERI_PHY_BMSR << ERI_MIF_CFGPR_SHIFT); in eri_attach()
849 erip->stats.pmcap = ERI_PMCAP_NONE; in eri_attach()
852 erip->stats.pmcap = ERI_PMCAP_4MHZ; in eri_attach()
854 if (mac_register(macp, &erip->mh) != 0) in eri_attach()
862 if (erip->pci_config_handle) in eri_attach()
863 (void) pci_config_teardown(&erip->pci_config_handle); in eri_attach()
866 mutex_destroy(&erip->xmitlock); in eri_attach()
867 mutex_destroy(&erip->intrlock); in eri_attach()
868 mutex_destroy(&erip->linklock); in eri_attach()
869 mutex_destroy(&erip->xcvrlock); in eri_attach()
872 ERI_FAULT_MSG1(erip, SEVERITY_NONE, ERI_VERB_MSG, attach_fail_msg); in eri_attach()
875 ddi_remove_intr(dip, 0, erip->cookie); in eri_attach()
877 if (erip->globregh) in eri_attach()
878 ddi_regs_map_free(&erip->globregh); in eri_attach()
882 if (erip != NULL) in eri_attach()
883 kmem_free(erip, sizeof (*erip)); in eri_attach()
891 struct eri *erip; in eri_detach() local
894 if ((erip = ddi_get_driver_private(dip)) == NULL) { in eri_detach()
906 erip->flags |= ERI_SUSPENDED; in eri_detach()
907 eri_uninit(erip); in eri_detach()
914 if (erip->flags & (ERI_RUNNING | ERI_SUSPENDED)) { in eri_detach()
915 ERI_FAULT_MSG1(erip, SEVERITY_NONE, ERI_VERB_MSG, busy_msg); in eri_detach()
919 if (mac_unregister(erip->mh) != 0) { in eri_detach()
926 (void) eri_stop(erip); in eri_detach()
931 ddi_remove_intr(dip, 0, erip->cookie); in eri_detach()
933 if (erip->pci_config_handle) in eri_detach()
934 (void) pci_config_teardown(&erip->pci_config_handle); in eri_detach()
941 if (erip->globregh) in eri_detach()
942 ddi_regs_map_free(&erip->globregh); in eri_detach()
944 erip->etxregh = NULL; in eri_detach()
945 erip->erxregh = NULL; in eri_detach()
946 erip->bmacregh = NULL; in eri_detach()
947 erip->mifregh = NULL; in eri_detach()
948 erip->globregh = NULL; in eri_detach()
950 if (erip->sw_reset_regh) in eri_detach()
951 ddi_regs_map_free(&erip->sw_reset_regh); in eri_detach()
953 if (erip->ksp) in eri_detach()
954 kstat_delete(erip->ksp); in eri_detach()
956 eri_stop_timer(erip); /* acquire linklock */ in eri_detach()
957 eri_start_timer(erip, eri_check_link, 0); in eri_detach()
958 mutex_destroy(&erip->xmitlock); in eri_detach()
959 mutex_destroy(&erip->intrlock); in eri_detach()
960 mutex_destroy(&erip->linklock); in eri_detach()
961 mutex_destroy(&erip->xcvrlock); in eri_detach()
963 if (erip->md_h) { in eri_detach()
964 if (ddi_dma_unbind_handle(erip->md_h) == in eri_detach()
967 ddi_dma_mem_free(&erip->mdm_h); in eri_detach()
968 ddi_dma_free_handle(&erip->md_h); in eri_detach()
971 if (eri_freebufs(erip)) in eri_detach()
976 if (erip->eri_dvmarh) { in eri_detach()
977 (void) dvma_release(erip->eri_dvmarh); in eri_detach()
978 erip->eri_dvmarh = NULL; in eri_detach()
985 if (erip->ndmarh[i]) in eri_detach()
986 ddi_dma_free_handle(&erip->ndmarh[i]); in eri_detach()
991 if (erip->tbuf_ioaddr != 0) { in eri_detach()
992 (void) ddi_dma_unbind_handle(erip->tbuf_handle); in eri_detach()
993 erip->tbuf_ioaddr = 0; in eri_detach()
995 if (erip->tbuf_kaddr != NULL) { in eri_detach()
996 ddi_dma_mem_free(&erip->tbuf_acch); in eri_detach()
997 erip->tbuf_kaddr = NULL; in eri_detach()
999 if (erip->tbuf_handle != NULL) { in eri_detach()
1000 ddi_dma_free_handle(&erip->tbuf_handle); in eri_detach()
1001 erip->tbuf_handle = NULL; in eri_detach()
1004 eri_param_cleanup(erip); in eri_detach()
1007 kmem_free((caddr_t)erip, sizeof (struct eri)); in eri_detach()
1028 eri_setup_mac_address(struct eri *erip, dev_info_t *dip) in eri_setup_mac_address() argument
1046 ERI_FAULT_MSG2(erip, SEVERITY_NONE, ERI_VERB_MSG, in eri_setup_mac_address()
1058 bcopy(prop, erip->ouraddr, ETHERADDRL); in eri_setup_mac_address()
1070 bcopy(&factaddr, erip->ouraddr, ETHERADDRL); in eri_setup_mac_address()
1072 ERI_FAULT_MSG1(erip, SEVERITY_NONE, ERI_VERB_MSG, in eri_setup_mac_address()
1083 bcopy(&factaddr, erip->ouraddr, ETHERADDRL); in eri_setup_mac_address()
1109 struct eri *erip = arg; in eri_m_ioctl() local
1113 ASSERT(erip != NULL); in eri_m_ioctl()
1134 eri_process_ndd_ioctl(erip, wq, mp, iocp->ioc_cmd); in eri_m_ioctl()
1142 eri_loopback(erip, wq, mp); in eri_m_ioctl()
1150 ASSERT(!MUTEX_HELD(&erip->linklock)); in eri_m_ioctl()
1154 eri_loopback(struct eri *erip, queue_t *wq, mblk_t *mp) in eri_loopback() argument
1170 erip->flags &= (~ERI_MACLOOPBACK & ~ERI_SERLOOPBACK); in eri_loopback()
1173 erip->stats.link_up = LINK_STATE_DOWN; in eri_loopback()
1174 erip->stats.link_duplex = LINK_DUPLEX_UNKNOWN; in eri_loopback()
1175 (void) eri_init(erip); in eri_loopback()
1179 erip->flags |= ERI_MACLOOPBACK; in eri_loopback()
1180 erip->flags &= ~ERI_SERLOOPBACK; in eri_loopback()
1182 erip->stats.link_up = LINK_STATE_DOWN; in eri_loopback()
1183 erip->stats.link_duplex = LINK_DUPLEX_UNKNOWN; in eri_loopback()
1184 (void) eri_init(erip); in eri_loopback()
1191 erip->flags |= ERI_SERLOOPBACK; in eri_loopback()
1192 erip->flags &= ~ERI_MACLOOPBACK; in eri_loopback()
1195 erip->stats.link_up = LINK_STATE_DOWN; in eri_loopback()
1196 erip->stats.link_duplex = LINK_DUPLEX_UNKNOWN; in eri_loopback()
1197 (void) eri_init(erip); in eri_loopback()
1201 ERI_FAULT_MSG1(erip, SEVERITY_NONE, ERI_VERB_MSG, in eri_loopback()
1216 ERI_FAULT_MSG1(erip, SEVERITY_LOW, ERI_VERB_MSG, in eri_loopback()
1224 struct eri *erip = arg; in eri_m_promisc() local
1226 mutex_enter(&erip->intrlock); in eri_m_promisc()
1227 erip->promisc = on; in eri_m_promisc()
1228 eri_init_rx(erip); in eri_m_promisc()
1229 mutex_exit(&erip->intrlock); in eri_m_promisc()
1240 struct eri *erip = arg; in eri_m_multicst() local
1249 mutex_enter(&erip->intrlock); in eri_m_multicst()
1251 erip->ladrf_refcnt[ladrf_bit]++; in eri_m_multicst()
1252 if (erip->ladrf_refcnt[ladrf_bit] == 1) { in eri_m_multicst()
1253 LADRF_SET(erip, ladrf_bit); in eri_m_multicst()
1254 erip->multi_refcnt++; in eri_m_multicst()
1255 eri_init_rx(erip); in eri_m_multicst()
1258 erip->ladrf_refcnt[ladrf_bit]--; in eri_m_multicst()
1259 if (erip->ladrf_refcnt[ladrf_bit] == 0) { in eri_m_multicst()
1260 LADRF_CLR(erip, ladrf_bit); in eri_m_multicst()
1261 erip->multi_refcnt--; in eri_m_multicst()
1262 eri_init_rx(erip); in eri_m_multicst()
1265 mutex_exit(&erip->intrlock); in eri_m_multicst()
1272 struct eri *erip = arg; in eri_m_unicst() local
1279 mutex_enter(&erip->intrlock); in eri_m_unicst()
1280 bcopy(macaddr, &erip->ouraddr, ETHERADDRL); in eri_m_unicst()
1281 eri_init_rx(erip); in eri_m_unicst()
1282 mutex_exit(&erip->intrlock); in eri_m_unicst()
1304 struct eri *erip = arg; in eri_m_start() local
1306 mutex_enter(&erip->intrlock); in eri_m_start()
1307 erip->flags |= ERI_STARTED; in eri_m_start()
1308 mutex_exit(&erip->intrlock); in eri_m_start()
1310 if (!eri_init(erip)) { in eri_m_start()
1311 mutex_enter(&erip->intrlock); in eri_m_start()
1312 erip->flags &= ~ERI_STARTED; in eri_m_start()
1313 mutex_exit(&erip->intrlock); in eri_m_start()
1322 struct eri *erip = arg; in eri_m_stop() local
1324 mutex_enter(&erip->intrlock); in eri_m_stop()
1325 erip->flags &= ~ERI_STARTED; in eri_m_stop()
1326 mutex_exit(&erip->intrlock); in eri_m_stop()
1327 eri_uninit(erip); in eri_m_stop()
1333 struct eri *erip = arg; in eri_m_stat() local
1337 esp = &erip->stats; in eri_m_stat()
1339 mutex_enter(&erip->xmitlock); in eri_m_stat()
1340 if ((erip->flags & ERI_RUNNING) && (erip->flags & ERI_TXINIT)) { in eri_m_stat()
1341 erip->tx_completion = in eri_m_stat()
1343 macupdate |= eri_reclaim(erip, erip->tx_completion); in eri_m_stat()
1345 mutex_exit(&erip->xmitlock); in eri_m_stat()
1347 mac_tx_update(erip->mh); in eri_m_stat()
1349 eri_savecntrs(erip); in eri_m_stat()
1426 *val = erip->phyad; in eri_m_stat()
1523 eri_init_macregs_generic(struct eri *erip) in eri_init_macregs_generic() argument
1530 if ((erip->stats.inits == 1) || (erip->init_macregs)) { in eri_init_macregs_generic()
1531 erip->init_macregs = 0; in eri_init_macregs_generic()
1546 ((erip->ouraddr[0] & 0x3) << 8) | erip->ouraddr[1]); in eri_init_macregs_generic()
1576 if (erip->pauseTX) in eri_init_macregs_generic()
1585 PUT_MACREG(madd0, (erip->ouraddr[4] << 8) | erip->ouraddr[5]); in eri_init_macregs_generic()
1586 PUT_MACREG(madd1, (erip->ouraddr[2] << 8) | erip->ouraddr[3]); in eri_init_macregs_generic()
1587 PUT_MACREG(madd2, (erip->ouraddr[0] << 8) | erip->ouraddr[1]); in eri_init_macregs_generic()
1593 PUT_MACREG(hash0, erip->ladrf[0]); in eri_init_macregs_generic()
1594 PUT_MACREG(hash1, erip->ladrf[1]); in eri_init_macregs_generic()
1595 PUT_MACREG(hash2, erip->ladrf[2]); in eri_init_macregs_generic()
1596 PUT_MACREG(hash3, erip->ladrf[3]); in eri_init_macregs_generic()
1597 PUT_MACREG(hash4, erip->ladrf[4]); in eri_init_macregs_generic()
1598 PUT_MACREG(hash5, erip->ladrf[5]); in eri_init_macregs_generic()
1599 PUT_MACREG(hash6, erip->ladrf[6]); in eri_init_macregs_generic()
1600 PUT_MACREG(hash7, erip->ladrf[7]); in eri_init_macregs_generic()
1601 PUT_MACREG(hash8, erip->ladrf[8]); in eri_init_macregs_generic()
1602 PUT_MACREG(hash9, erip->ladrf[9]); in eri_init_macregs_generic()
1603 PUT_MACREG(hash10, erip->ladrf[10]); in eri_init_macregs_generic()
1604 PUT_MACREG(hash11, erip->ladrf[11]); in eri_init_macregs_generic()
1605 PUT_MACREG(hash12, erip->ladrf[12]); in eri_init_macregs_generic()
1606 PUT_MACREG(hash13, erip->ladrf[13]); in eri_init_macregs_generic()
1607 PUT_MACREG(hash14, erip->ladrf[14]); in eri_init_macregs_generic()
1611 eri_flush_rxbufs(struct eri *erip) in eri_flush_rxbufs() argument
1626 if (erip->rmblkp[i]) { in eri_flush_rxbufs()
1627 if (erip->eri_dvmarh) in eri_flush_rxbufs()
1628 dvma_unload(erip->eri_dvmarh, 2 * i, in eri_flush_rxbufs()
1630 else if ((ddi_dma_unbind_handle(erip->ndmarh[i]) == in eri_flush_rxbufs()
1633 freeb(erip->rmblkp[i]); in eri_flush_rxbufs()
1634 erip->rmblkp[i] = NULL; in eri_flush_rxbufs()
1641 eri_init_txbufs(struct eri *erip) in eri_init_txbufs() argument
1646 bzero((caddr_t)erip->eri_tmdp, ERI_TPENDING * sizeof (struct eri_tmd)); in eri_init_txbufs()
1651 ERI_SYNCIOPB(erip, erip->eri_tmdp, in eri_init_txbufs()
1656 erip->tcurp = erip->eri_tmdp; in eri_init_txbufs()
1657 erip->tnextp = erip->eri_tmdp; in eri_init_txbufs()
1658 erip->tx_cur_cnt = 0; in eri_init_txbufs()
1659 erip->tx_kick = 0; in eri_init_txbufs()
1660 erip->tx_completion = 0; in eri_init_txbufs()
1664 eri_init_rxbufs(struct eri *erip) in eri_init_rxbufs() argument
1675 bzero((caddr_t)erip->rmdp, ERI_RPENDING * sizeof (struct rmd)); in eri_init_rxbufs()
1683 if (erip->eri_dvmarh) in eri_init_rxbufs()
1684 dvma_kaddr_load(erip->eri_dvmarh, in eri_init_rxbufs()
1690 else if (ddi_dma_addr_bind_handle(erip->ndmarh[i], NULL, in eri_init_rxbufs()
1696 PUT_RMD((&erip->rmdp[i]), dma_cookie); in eri_init_rxbufs()
1697 erip->rmblkp[i] = bp; /* save for later use */ in eri_init_rxbufs()
1703 ERI_SYNCIOPB(erip, erip->rmdp, (ERI_RPENDING * sizeof (struct rmd)), in eri_init_rxbufs()
1708 erip->rnextp = erip->rmdp; in eri_init_rxbufs()
1709 erip->rx_completion = 0; in eri_init_rxbufs()
1710 erip->rx_kick = ERI_RPENDING - 4; in eri_init_rxbufs()
1715 eri_txmac_disable(struct eri *erip) in eri_txmac_disable() argument
1731 eri_rxmac_disable(struct eri *erip) in eri_rxmac_disable() argument
1749 eri_stop(struct eri *erip) in eri_stop() argument
1751 (void) eri_erx_reset(erip); in eri_stop()
1752 (void) eri_etx_reset(erip); in eri_stop()
1759 if (erip->linkcheck) { in eri_stop()
1760 erip->linkcheck = 0; in eri_stop()
1761 erip->global_reset_issued = 2; in eri_stop()
1764 erip->stats.link_up = LINK_STATE_DOWN; in eri_stop()
1765 erip->stats.link_duplex = LINK_DUPLEX_UNKNOWN; in eri_stop()
1766 erip->global_reset_issued = -1; in eri_stop()
1771 erip->rx_reset_issued = -1; in eri_stop()
1772 erip->tx_reset_issued = -1; in eri_stop()
1798 eri_erx_reset(struct eri *erip) in eri_erx_reset() argument
1800 (void) eri_rxmac_disable(erip); /* Disable the RX MAC */ in eri_erx_reset()
1806 ERI_FAULT_MSG1(erip, SEVERITY_LOW, ERI_VERB_MSG, in eri_erx_reset()
1818 erip->rx_reset_issued = -1; in eri_erx_reset()
1833 eri_etx_reset(struct eri *erip) in eri_etx_reset() argument
1835 (void) eri_txmac_disable(erip); in eri_etx_reset()
1842 ERI_FAULT_MSG1(erip, SEVERITY_LOW, ERI_VERB_MSG, in eri_etx_reset()
1849 ERI_FAULT_MSG1(erip, SEVERITY_LOW, ERI_VERB_MSG, in eri_etx_reset()
1860 erip->tx_reset_issued = -1; in eri_etx_reset()
1873 eri_init_txregs(struct eri *erip) in eri_init_txregs() argument
1883 tx_ring = ERI_IOPBIOADDR(erip, erip->eri_tmdp); in eri_init_txregs()
1909 ERI_FAULT_MSG2(erip, SEVERITY_HIGH, ERI_VERB_MSG, in eri_init_txregs()
1916 ENABLE_TXDMA(erip); in eri_init_txregs()
1917 ENABLE_MAC(erip); in eri_init_txregs()
1926 eri_init_rxregs(struct eri *erip) in eri_init_rxregs() argument
1938 rx_ring = ERI_IOPBIOADDR(erip, erip->rmdp); in eri_init_rxregs()
1941 PUT_ERXREG(rx_kick, erip->rx_kick); in eri_init_rxregs()
1973 ERI_FAULT_MSG2(erip, SEVERITY_HIGH, ERI_VERB_MSG, in eri_init_rxregs()
1989 erip->rxfifo_size = GET_ERXREG(rxfifo_size); in eri_init_rxregs()
1990 ENABLE_RXDMA(erip); in eri_init_rxregs()
1995 eri_freebufs(struct eri *erip) in eri_freebufs() argument
1999 status = eri_flush_rxbufs(erip); in eri_freebufs()
2004 eri_update_rxbufs(struct eri *erip) in eri_update_rxbufs() argument
2012 rmdpbase = erip->rmdp; in eri_update_rxbufs()
2021 ERI_SYNCIOPB(erip, erip->rmdp, (ERI_RPENDING * sizeof (struct rmd)), in eri_update_rxbufs()
2026 erip->rnextp = erip->rmdp; in eri_update_rxbufs()
2027 erip->rx_completion = 0; in eri_update_rxbufs()
2028 erip->rx_kick = ERI_RPENDING - 4; in eri_update_rxbufs()
2038 eri_init_rx_channel(struct eri *erip) in eri_init_rx_channel() argument
2040 erip->flags &= ~ERI_RXINIT; in eri_init_rx_channel()
2041 (void) eri_erx_reset(erip); in eri_init_rx_channel()
2042 eri_update_rxbufs(erip); in eri_init_rx_channel()
2043 if (eri_init_rxregs(erip)) in eri_init_rx_channel()
2047 erip->rx_reset_issued = 0; in eri_init_rx_channel()
2048 HSTAT(erip, rx_inits); in eri_init_rx_channel()
2049 erip->flags |= ERI_RXINIT; in eri_init_rx_channel()
2054 eri_init_rx(struct eri *erip) in eri_init_rx() argument
2061 (void) eri_rxmac_disable(erip); /* Disable the RX MAC */ in eri_init_rx()
2067 PUT_MACREG(madd0, (erip->ouraddr[4] << 8) | erip->ouraddr[5]); in eri_init_rx()
2068 PUT_MACREG(madd1, (erip->ouraddr[2] << 8) | erip->ouraddr[3]); in eri_init_rx()
2069 PUT_MACREG(madd2, (erip->ouraddr[0] << 8) | erip->ouraddr[1]); in eri_init_rx()
2079 ladrf = erip->ladrf; in eri_init_rx()
2100 ((erip->promisc ? BMAC_RXCFG_PROMIS : 0) | in eri_init_rx()
2101 (erip->multi_refcnt ? BMAC_RXCFG_HASH : 0) | in eri_init_rx()
2105 ((erip->promisc ? BMAC_RXCFG_PROMIS : 0) | in eri_init_rx()
2106 (erip->multi_refcnt ? BMAC_RXCFG_HASH : 0) | in eri_init_rx()
2112 HSTAT(erip, rx_inits); in eri_init_rx()
2120 eri_init_txmac(struct eri *erip) in eri_init_txmac() argument
2124 erip->flags &= ~ERI_TXINIT; in eri_init_txmac()
2128 (void) eri_txmac_disable(erip); in eri_init_txmac()
2147 if (erip->ngu_enable) in eri_init_txmac()
2149 ((param_lance_mode && (erip->lance_mode_enable)) ? in eri_init_txmac()
2155 ((param_lance_mode && (erip->lance_mode_enable)) ? in eri_init_txmac()
2159 ENABLE_TXDMA(erip); in eri_init_txmac()
2160 ENABLE_TXMAC(erip); in eri_init_txmac()
2162 HSTAT(erip, tx_inits); in eri_init_txmac()
2163 erip->flags |= ERI_TXINIT; in eri_init_txmac()
2167 eri_unallocthings(struct eri *erip) in eri_unallocthings() argument
2172 flag = erip->alloc_flag; in eri_unallocthings()
2175 (void) ddi_dma_unbind_handle(erip->md_h); in eri_unallocthings()
2178 ddi_dma_mem_free(&erip->mdm_h); in eri_unallocthings()
2179 erip->rmdp = NULL; in eri_unallocthings()
2180 erip->eri_tmdp = NULL; in eri_unallocthings()
2184 ddi_dma_free_handle(&erip->md_h); in eri_unallocthings()
2186 (void) eri_freebufs(erip); in eri_unallocthings()
2189 for (i = 0; i < erip->rcv_handle_cnt; i++) in eri_unallocthings()
2190 ddi_dma_free_handle(&erip->ndmarh[i]); in eri_unallocthings()
2193 (void) dvma_release(erip->eri_dvmarh); in eri_unallocthings()
2194 erip->eri_dvmarh = NULL; in eri_unallocthings()
2198 (void) ddi_dma_unbind_handle(erip->tbuf_handle); in eri_unallocthings()
2199 erip->tbuf_ioaddr = 0; in eri_unallocthings()
2203 ddi_dma_mem_free(&erip->tbuf_acch); in eri_unallocthings()
2204 erip->tbuf_kaddr = NULL; in eri_unallocthings()
2208 ddi_dma_free_handle(&erip->tbuf_handle); in eri_unallocthings()
2209 erip->tbuf_handle = NULL; in eri_unallocthings()
2250 eri_init(struct eri *erip) in eri_init() argument
2264 ASSERT(erip != NULL); in eri_init()
2266 if (erip->flags & ERI_SUSPENDED) { in eri_init()
2271 mutex_enter(&erip->intrlock); in eri_init()
2272 eri_stop_timer(erip); /* acquire linklock */ in eri_init()
2273 mutex_enter(&erip->xmitlock); in eri_init()
2274 erip->flags &= (ERI_DLPI_LINKUP | ERI_STARTED); in eri_init()
2275 erip->wantw = B_FALSE; in eri_init()
2276 HSTAT(erip, inits); in eri_init()
2277 erip->txhung = 0; in eri_init()
2279 if ((erip->stats.inits > 1) && (erip->init_macregs == 0)) in eri_init()
2280 eri_savecntrs(erip); in eri_init()
2282 mutex_enter(&erip->xcvrlock); in eri_init()
2283 if (!param_linkup || erip->linkcheck) { in eri_init()
2284 if (!erip->linkcheck) in eri_init()
2286 (void) eri_stop(erip); in eri_init()
2288 if (!(erip->flags & ERI_DLPI_LINKUP) || !param_linkup) { in eri_init()
2289 erip->flags |= ERI_DLPI_LINKUP; in eri_init()
2290 eri_mif_poll(erip, MIF_POLL_STOP); in eri_init()
2291 (void) eri_new_xcvr(erip); in eri_init()
2292 ERI_DEBUG_MSG1(erip, XCVR_MSG, "New transceiver detected."); in eri_init()
2298 if (eri_reset_xcvr(erip)) { in eri_init()
2299 ERI_FAULT_MSG1(erip, SEVERITY_NONE, in eri_init()
2301 mutex_exit(&erip->xcvrlock); in eri_init()
2305 if (erip->stats.link_up == LINK_STATE_UP) in eri_init()
2308 erip->flags |= (ERI_RUNNING | ERI_INITIALIZED); in eri_init()
2310 erip->stats.link_up = LINK_STATE_DOWN; in eri_init()
2311 erip->stats.link_duplex = LINK_DUPLEX_UNKNOWN; in eri_init()
2319 eri_mif_poll(erip, MIF_POLL_START); in eri_init()
2322 mutex_exit(&erip->xcvrlock); in eri_init()
2327 if (erip->global_reset_issued) { in eri_init()
2328 if (erip->global_reset_issued == 2) { /* fast path */ in eri_init()
2333 eri_init_txbufs(erip); in eri_init()
2335 eri_update_rxbufs(erip); in eri_init()
2337 init_stat = eri_allocthings(erip); in eri_init()
2341 if (eri_freebufs(erip)) in eri_init()
2346 eri_init_txbufs(erip); in eri_init()
2347 if (eri_init_rxbufs(erip)) in eri_init()
2360 if (eri_txmac_disable(erip)) { in eri_init()
2361 ERI_FAULT_MSG1(erip, SEVERITY_LOW, ERI_VERB_MSG, in eri_init()
2364 erip->stats.link_up = LINK_STATE_DOWN; in eri_init()
2365 erip->stats.link_duplex = LINK_DUPLEX_UNKNOWN; in eri_init()
2370 if (eri_rxmac_disable(erip)) { in eri_init()
2371 ERI_FAULT_MSG1(erip, SEVERITY_LOW, ERI_VERB_MSG, in eri_init()
2374 erip->stats.link_up = LINK_STATE_DOWN; in eri_init()
2375 erip->stats.link_duplex = LINK_DUPLEX_UNKNOWN; in eri_init()
2380 eri_init_macregs_generic(erip); in eri_init()
2402 erip->tx_int_me = 0; in eri_init()
2408 if (erip->global_reset_issued) { in eri_init()
2413 if (eri_init_txregs(erip)) in eri_init()
2421 if (eri_init_rxregs(erip)) in eri_init()
2436 ((erip->promisc ? BMAC_RXCFG_PROMIS : 0) | in eri_init()
2437 (erip->multi_refcnt ? BMAC_RXCFG_HASH : 0) | in eri_init()
2441 ((erip->promisc ? BMAC_RXCFG_PROMIS : 0) | in eri_init()
2442 (erip->multi_refcnt ? BMAC_RXCFG_HASH : 0) | in eri_init()
2448 if (erip->ngu_enable) in eri_init()
2451 ((param_lance_mode && (erip->lance_mode_enable)) ? in eri_init()
2458 ((param_lance_mode && (erip->lance_mode_enable)) ? in eri_init()
2462 if (erip->pauseRX) in eri_init()
2464 if (erip->pauseTX) in eri_init()
2487 if (erip->flags & ERI_MACLOOPBACK) { in eri_init()
2494 ENABLE_MAC(erip); in eri_init()
2495 erip->flags |= (ERI_RUNNING | ERI_INITIALIZED | in eri_init()
2497 mac_tx_update(erip->mh); in eri_init()
2498 erip->global_reset_issued = 0; in eri_init()
2501 eri_xcvr_force_mode(erip, &link_timeout); in eri_init()
2506 eri_unallocthings(erip); in eri_init()
2508 mutex_exit(&erip->xmitlock); in eri_init()
2509 eri_start_timer(erip, eri_check_link, link_timeout); in eri_init()
2510 mutex_exit(&erip->intrlock); in eri_init()
2513 mac_link_update(erip->mh, linkupdate); in eri_init()
2515 ret = (erip->flags & ERI_RUNNING) ? B_TRUE : B_FALSE; in eri_init()
2517 ERI_FAULT_MSG1(erip, SEVERITY_NONE, ERI_VERB_MSG, in eri_init()
2522 ASSERT(!MUTEX_HELD(&erip->linklock)); in eri_init()
2530 eri_burstsize(struct eri *erip) in eri_burstsize() argument
2534 if (ddi_dma_alloc_handle(erip->dip, &dma_attr, DDI_DMA_DONTWAIT, in eri_burstsize()
2538 erip->burstsizes = ddi_dma_burstsizes(handle); in eri_burstsize()
2541 if (erip->burstsizes) in eri_burstsize()
2551 eri_uninit(struct eri *erip) in eri_uninit() argument
2558 ERI_DELAY((erip->tcurp == erip->tnextp), ERI_DRAINTIME); in eri_uninit()
2560 mutex_enter(&erip->intrlock); in eri_uninit()
2561 eri_stop_timer(erip); /* acquire linklock */ in eri_uninit()
2562 mutex_enter(&erip->xmitlock); in eri_uninit()
2563 mutex_enter(&erip->xcvrlock); in eri_uninit()
2564 eri_mif_poll(erip, MIF_POLL_STOP); in eri_uninit()
2565 erip->flags &= ~ERI_DLPI_LINKUP; in eri_uninit()
2566 mutex_exit(&erip->xcvrlock); in eri_uninit()
2568 needind = !erip->linkcheck; in eri_uninit()
2569 (void) eri_stop(erip); in eri_uninit()
2570 erip->flags &= ~ERI_RUNNING; in eri_uninit()
2572 mutex_exit(&erip->xmitlock); in eri_uninit()
2573 eri_start_timer(erip, eri_check_link, 0); in eri_uninit()
2574 mutex_exit(&erip->intrlock); in eri_uninit()
2577 mac_link_update(erip->mh, LINK_STATE_DOWN); in eri_uninit()
2589 eri_allocthings(struct eri *erip) in eri_allocthings() argument
2604 if (erip->rmdp) in eri_allocthings()
2607 erip->alloc_flag = 0; in eri_allocthings()
2615 rval = ddi_dma_alloc_handle(erip->dip, &desc_dma_attr, in eri_allocthings()
2616 DDI_DMA_DONTWAIT, 0, &erip->md_h); in eri_allocthings()
2620 erip->alloc_flag |= ERI_DESC_HANDLE_ALLOC; in eri_allocthings()
2622 rval = ddi_dma_mem_alloc(erip->md_h, size, &erip->dev_attr, in eri_allocthings()
2624 (caddr_t *)&erip->iopbkbase, &real_len, &erip->mdm_h); in eri_allocthings()
2628 erip->alloc_flag |= ERI_DESC_MEM_ALLOC; in eri_allocthings()
2630 rval = ddi_dma_addr_bind_handle(erip->md_h, NULL, in eri_allocthings()
2631 (caddr_t)erip->iopbkbase, size, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, in eri_allocthings()
2632 DDI_DMA_DONTWAIT, 0, &erip->md_c, &cookiec); in eri_allocthings()
2637 erip->alloc_flag |= ERI_DESC_MEM_MAP; in eri_allocthings()
2642 erip->iopbiobase = erip->md_c.dmac_address; in eri_allocthings()
2644 a = erip->iopbkbase; in eri_allocthings()
2646 erip->rmdp = (struct rmd *)a; in eri_allocthings()
2648 erip->eri_tmdp = (struct eri_tmd *)a; in eri_allocthings()
2666 (dvma_reserve(erip->dip, &eri_dma_limits, (ERI_RPENDING * 2), in eri_allocthings()
2667 &erip->eri_dvmarh)) == DDI_SUCCESS) { in eri_allocthings()
2668 erip->alloc_flag |= ERI_RCV_DVMA_ALLOC; in eri_allocthings()
2670 erip->eri_dvmarh = NULL; in eri_allocthings()
2673 rval = ddi_dma_alloc_handle(erip->dip, in eri_allocthings()
2675 0, &erip->ndmarh[i]); in eri_allocthings()
2678 ERI_FAULT_MSG1(erip, SEVERITY_HIGH, in eri_allocthings()
2685 erip->rcv_handle_cnt = i; in eri_allocthings()
2688 erip->alloc_flag |= ERI_RCV_HANDLE_ALLOC; in eri_allocthings()
2704 if (ddi_dma_alloc_handle(erip->dip, &desc_dma_attr, DDI_DMA_DONTWAIT, in eri_allocthings()
2705 0, &erip->tbuf_handle) != DDI_SUCCESS) { in eri_allocthings()
2706 ERI_FAULT_MSG1(erip, SEVERITY_HIGH, ERI_VERB_MSG, in eri_allocthings()
2710 erip->alloc_flag |= ERI_XBUFS_HANDLE_ALLOC; in eri_allocthings()
2712 if (ddi_dma_mem_alloc(erip->tbuf_handle, size, &buf_attr, in eri_allocthings()
2713 DDI_DMA_CONSISTENT, DDI_DMA_DONTWAIT, NULL, &erip->tbuf_kaddr, in eri_allocthings()
2714 &real_len, &erip->tbuf_acch) != DDI_SUCCESS) { in eri_allocthings()
2715 ERI_FAULT_MSG1(erip, SEVERITY_HIGH, ERI_VERB_MSG, in eri_allocthings()
2719 erip->alloc_flag |= ERI_XBUFS_KMEM_ALLOC; in eri_allocthings()
2720 if (ddi_dma_addr_bind_handle(erip->tbuf_handle, NULL, in eri_allocthings()
2721 erip->tbuf_kaddr, size, DDI_DMA_WRITE | DDI_DMA_CONSISTENT, in eri_allocthings()
2725 erip->tbuf_ioaddr = dma_cookie.dmac_address; in eri_allocthings()
2726 erip->alloc_flag |= ERI_XBUFS_KMEM_DMABIND; in eri_allocthings()
2733 erip->rmdlimp = &((erip->rmdp)[ERI_RPENDING]); in eri_allocthings()
2734 erip->eri_tmdlimp = &((erip->eri_tmdp)[ERI_TPENDING]); in eri_allocthings()
2739 bzero((caddr_t)erip->rmblkp, sizeof (erip->rmblkp)); in eri_allocthings()
2750 struct eri *erip = (void *)arg; in eri_intr() local
2763 mutex_enter(&erip->intrlock); in eri_intr()
2772 (erip->flags & ERI_RUNNING)) { in eri_intr()
2778 if (erip->flags & ERI_INITIALIZED) { in eri_intr()
2779 erip->flags &= ~ERI_INITIALIZED; in eri_intr()
2789 ERI_DEBUG_MSG2(erip, DIAG_MSG, in eri_intr()
2794 ERI_DEBUG_MSG2(erip, DIAG_MSG, "eri_intr:MIF Config = 0x%X", in eri_intr()
2796 ERI_DEBUG_MSG2(erip, DIAG_MSG, "eri_intr:MIF imask = 0x%X", in eri_intr()
2798 ERI_DEBUG_MSG2(erip, DIAG_MSG, "eri_intr:INT imask = 0x%X", in eri_intr()
2800 ERI_DEBUG_MSG2(erip, DIAG_MSG, "eri_intr:alias %X", in eri_intr()
2803 linkupdate = eri_check_link_noind(erip); in eri_intr()
2805 mutex_exit(&erip->intrlock); in eri_intr()
2808 mac_link_update(erip->mh, linkupdate); in eri_intr()
2814 if (!(erip->flags & ERI_RUNNING)) { in eri_intr()
2815 mutex_exit(&erip->intrlock); in eri_intr()
2816 eri_uninit(erip); in eri_intr()
2821 ERI_DEBUG_MSG2(erip, INTR_MSG, in eri_intr()
2823 (void) eri_fatal_err(erip, erisbits); in eri_intr()
2826 if (erip->rx_reset_issued) { in eri_intr()
2827 erip->rx_reset_issued = 0; in eri_intr()
2828 (void) eri_init_rx_channel(erip); in eri_intr()
2829 mutex_exit(&erip->intrlock); in eri_intr()
2832 erip->stats.link_up = LINK_STATE_DOWN; in eri_intr()
2833 erip->stats.link_duplex = LINK_DUPLEX_UNKNOWN; in eri_intr()
2834 DISABLE_MAC(erip); in eri_intr()
2835 mutex_exit(&erip->intrlock); in eri_intr()
2836 (void) eri_init(erip); in eri_intr()
2842 ERI_DEBUG_MSG2(erip, INTR_MSG, in eri_intr()
2844 (void) eri_nonfatal_err(erip, erisbits); in eri_intr()
2845 if (erip->linkcheck) { in eri_intr()
2846 mutex_exit(&erip->intrlock); in eri_intr()
2847 (void) eri_init(erip); in eri_intr()
2854 ERI_DEBUG_MSG2(erip, XCVR_MSG, in eri_intr()
2855 "eri_intr:MIF Interrupt:mii_status %X", erip->mii_status); in eri_intr()
2856 eri_stop_timer(erip); /* acquire linklock */ in eri_intr()
2858 mutex_enter(&erip->xmitlock); in eri_intr()
2859 mutex_enter(&erip->xcvrlock); in eri_intr()
2862 eri_mif_poll(erip, MIF_POLL_STOP); in eri_intr()
2863 ERI_DEBUG_MSG3(erip, XCVR_MSG, in eri_intr()
2865 mif_status, erip->mii_status); in eri_intr()
2866 (void) eri_mii_read(erip, ERI_PHY_BMSR, &stat); in eri_intr()
2867 linkupdate = eri_mif_check(erip, stat, stat); in eri_intr()
2871 eri_mif_poll(erip, MIF_POLL_STOP); in eri_intr()
2872 linkupdate = eri_mif_check(erip, (uint16_t)mif_status, in eri_intr()
2875 eri_mif_poll(erip, MIF_POLL_START); in eri_intr()
2876 mutex_exit(&erip->xcvrlock); in eri_intr()
2877 mutex_exit(&erip->xmitlock); in eri_intr()
2879 if (!erip->openloop_autoneg) in eri_intr()
2880 eri_start_timer(erip, eri_check_link, in eri_intr()
2883 eri_start_timer(erip, eri_check_link, in eri_intr()
2887 ERI_DEBUG_MSG2(erip, INTR_MSG, in eri_intr()
2892 (erip->tx_cur_cnt >= tx_interrupt_rate)) { in eri_intr()
2893 mutex_enter(&erip->xmitlock); in eri_intr()
2894 erip->tx_completion = (uint32_t)(GET_ETXREG(tx_completion) & in eri_intr()
2897 macupdate |= eri_reclaim(erip, erip->tx_completion); in eri_intr()
2899 erip->wantw = B_FALSE; in eri_intr()
2901 mutex_exit(&erip->xmitlock); in eri_intr()
2909 uint32_t rmdmax_mask = erip->rmdmax_mask; in eri_intr()
2911 rmdpbase = erip->rmdp; in eri_intr()
2912 rmdi = erip->rx_completion; in eri_intr()
2918 ERI_SYNCIOPB(erip, rmdp, sizeof (struct rmd), in eri_intr()
2927 mp = eri_read_dma(erip, rmdp, rmdi, flags); in eri_intr()
2950 erip->rx_kick = in eri_intr()
2953 PUT_ERXREG(rx_kick, erip->rx_kick); in eri_intr()
2960 ERI_SYNCIOPB(erip, rmdp, sizeof (struct rmd), in eri_intr()
2965 erip->rx_completion = rmdi; in eri_intr()
2968 mutex_exit(&erip->intrlock); in eri_intr()
2971 mac_rx(erip->mh, NULL, head); in eri_intr()
2974 mac_tx_update(erip->mh); in eri_intr()
2977 mac_link_update(erip->mh, linkupdate); in eri_intr()
2995 eri_fatal_err(struct eri *erip, uint32_t erisbits) in eri_fatal_err() argument
3001 erip->rx_reset_issued = 1; in eri_fatal_err()
3002 HSTAT(erip, rxtag_err); in eri_fatal_err()
3004 erip->global_reset_issued = 1; in eri_fatal_err()
3007 HSTAT(erip, pci_error_int); in eri_fatal_err()
3009 HSTAT(erip, parity_error); in eri_fatal_err()
3011 HSTAT(erip, unknown_fatal); in eri_fatal_err()
3018 if (pci_error_int && erip->pci_config_handle) { in eri_fatal_err()
3019 pci_status = pci_config_get16(erip->pci_config_handle, in eri_fatal_err()
3021 ERI_DEBUG_MSG2(erip, FATAL_ERR_MSG, "Bus Error Status %x", in eri_fatal_err()
3024 HSTAT(erip, pci_data_parity_err); in eri_fatal_err()
3026 HSTAT(erip, pci_signal_target_abort); in eri_fatal_err()
3028 HSTAT(erip, pci_rcvd_target_abort); in eri_fatal_err()
3030 HSTAT(erip, pci_rcvd_master_abort); in eri_fatal_err()
3032 HSTAT(erip, pci_signal_system_err); in eri_fatal_err()
3034 HSTAT(erip, pci_signal_system_err); in eri_fatal_err()
3038 pci_config_put16(erip->pci_config_handle, PCI_CONF_STAT, in eri_fatal_err()
3048 eri_nonfatal_err(struct eri *erip, uint32_t erisbits) in eri_nonfatal_err() argument
3054 if (pci_report_pmcap(erip->dip, PCI_PM_IDLESPEED, in eri_nonfatal_err()
3056 erip->stats.pmcap = ERI_PMCAP_NONE; in eri_nonfatal_err()
3062 erip->linkcheck = 1; in eri_nonfatal_err()
3063 HSTAT(erip, txmac_urun); in eri_nonfatal_err()
3064 HSTAT(erip, oerrors); in eri_nonfatal_err()
3068 erip->linkcheck = 1; in eri_nonfatal_err()
3069 HSTAT(erip, txmac_maxpkt_err); in eri_nonfatal_err()
3070 HSTAT(erip, oerrors); in eri_nonfatal_err()
3073 erip->stats.collisions += 0x10000; in eri_nonfatal_err()
3077 erip->stats.excessive_coll += 0x10000; in eri_nonfatal_err()
3081 erip->stats.late_coll += 0x10000; in eri_nonfatal_err()
3085 erip->stats.first_coll += 0x10000; in eri_nonfatal_err()
3089 HSTAT(erip, defer_timer_exp); in eri_nonfatal_err()
3093 erip->stats.peak_attempt_cnt += 0x100; in eri_nonfatal_err()
3098 ERI_DEBUG_MSG1(erip, NONFATAL_MSG, "rx dropped/no free desc"); in eri_nonfatal_err()
3101 erip->linkcheck = 1; in eri_nonfatal_err()
3103 HSTAT(erip, no_free_rx_desc); in eri_nonfatal_err()
3104 HSTAT(erip, ierrors); in eri_nonfatal_err()
3110 eri_stop_timer(erip); /* acquire linklock */ in eri_nonfatal_err()
3111 erip->check_rmac_hang ++; in eri_nonfatal_err()
3112 erip->check2_rmac_hang = 0; in eri_nonfatal_err()
3113 erip->rxfifo_wr_ptr = GET_ERXREG(rxfifo_wr_ptr); in eri_nonfatal_err()
3114 erip->rxfifo_rd_ptr = GET_ERXREG(rxfifo_rd_ptr); in eri_nonfatal_err()
3116 ERI_DEBUG_MSG5(erip, NONFATAL_MSG, in eri_nonfatal_err()
3118 erip->check_rmac_hang, in eri_nonfatal_err()
3123 eri_start_timer(erip, eri_check_link, in eri_nonfatal_err()
3127 erip->linkcheck = 1; in eri_nonfatal_err()
3129 HSTAT(erip, rx_overflow); in eri_nonfatal_err()
3130 HSTAT(erip, ierrors); in eri_nonfatal_err()
3134 erip->stats.rx_align_err += 0x10000; in eri_nonfatal_err()
3135 erip->stats.ierrors += 0x10000; in eri_nonfatal_err()
3139 erip->stats.rx_crc_err += 0x10000; in eri_nonfatal_err()
3140 erip->stats.ierrors += 0x10000; in eri_nonfatal_err()
3144 erip->stats.rx_length_err += 0x10000; in eri_nonfatal_err()
3145 erip->stats.ierrors += 0x10000; in eri_nonfatal_err()
3149 erip->stats.rx_code_viol_err += 0x10000; in eri_nonfatal_err()
3150 erip->stats.ierrors += 0x10000; in eri_nonfatal_err()
3160 ERI_DEBUG_MSG2(erip, NONFATAL_MSG, in eri_nonfatal_err()
3163 HSTAT(erip, pause_rxcount); in eri_nonfatal_err()
3164 erip->stats.pause_time_count += pause_time; in eri_nonfatal_err()
3168 HSTAT(erip, pause_oncount); in eri_nonfatal_err()
3169 erip->stats.pausing = 1; in eri_nonfatal_err()
3173 HSTAT(erip, pause_offcount); in eri_nonfatal_err()
3174 erip->stats.pausing = 0; in eri_nonfatal_err()
3185 eri_savecntrs(struct eri *erip) in eri_savecntrs() argument
3192 HSTATN(erip, rx_crc_err, fecnt); in eri_savecntrs()
3196 HSTATN(erip, rx_align_err, aecnt); in eri_savecntrs()
3200 HSTATN(erip, rx_length_err, lecnt); in eri_savecntrs()
3204 HSTATN(erip, rx_code_viol_err, rxcv); in eri_savecntrs()
3208 HSTATN(erip, late_coll, ltcnt); in eri_savecntrs()
3211 erip->stats.collisions += (GET_MACREG(nccnt) + ltcnt); in eri_savecntrs()
3215 HSTATN(erip, excessive_coll, excnt); in eri_savecntrs()
3219 HSTATN(erip, first_coll, fccnt); in eri_savecntrs()
3226 HSTATN(erip, ierrors, (fecnt + aecnt + lecnt)); in eri_savecntrs()
3227 HSTATN(erip, oerrors, (ltcnt + excnt)); in eri_savecntrs()
3268 send_bit(struct eri *erip, uint32_t x) in send_bit() argument
3279 get_bit_std(struct eri *erip) in get_bit_std() argument
3293 #define SEND_BIT(x) send_bit(erip, x)
3294 #define GET_BIT_STD(x) x = get_bit_std(erip)
3298 eri_bb_mii_write(struct eri *erip, uint8_t regad, uint16_t data) in eri_bb_mii_write() argument
3304 phyad = erip->phyad; in eri_bb_mii_write()
3305 (void) eri_bb_force_idle(erip); in eri_bb_mii_write()
3323 eri_bb_mii_read(struct eri *erip, uint8_t regad, uint16_t *datap) in eri_bb_mii_read() argument
3333 phyad = erip->phyad; in eri_bb_mii_read()
3334 (void) eri_bb_force_idle(erip); in eri_bb_mii_read()
3362 eri_bb_force_idle(struct eri *erip) in eri_bb_force_idle() argument
3382 eri_mii_read(struct eri *erip, uint8_t regad, uint16_t *datap) in eri_mii_read() argument
3390 if (!erip->frame_enable) in eri_mii_read()
3391 return (eri_bb_mii_read(erip, regad, datap)); in eri_mii_read()
3393 phyad = erip->phyad; in eri_mii_read()
3396 eri_errror(erip->dip, "Frame Register used for MII"); in eri_mii_read()
3400 ERI_DEBUG_MSG3(erip, FRM_MSG, in eri_mii_read()
3418 eri_mii_write(struct eri *erip, uint8_t regad, uint16_t data) in eri_mii_write() argument
3422 if (!erip->frame_enable) { in eri_mii_write()
3423 eri_bb_mii_write(erip, regad, data); in eri_mii_write()
3427 phyad = erip->phyad; in eri_mii_write()
3448 eri_send_msg(struct eri *erip, mblk_t *mp) in eri_send_msg() argument
3467 HSTAT(erip, tnocar); in eri_send_msg()
3468 HSTAT(erip, oerrors); in eri_send_msg()
3492 HSTAT(erip, oerrors); in eri_send_msg()
3500 BUMP_OutNUcast(erip, mp->b_rptr); in eri_send_msg()
3502 mutex_enter(&erip->xmitlock); in eri_send_msg()
3504 tbasep = erip->eri_tmdp; in eri_send_msg()
3507 tmdp = erip->tnextp; in eri_send_msg()
3509 if (tmdp >= erip->tcurp) /* check notmds */ in eri_send_msg()
3510 i = tmdp - erip->tcurp; in eri_send_msg()
3512 i = tmdp + ERI_TPENDING - erip->tcurp; in eri_send_msg()
3517 if (i >= (ERI_TPENDING >> 1) && !(erip->starts & 0x7)) { in eri_send_msg()
3520 if (!erip->tx_int_me) { in eri_send_msg()
3523 erip->tx_int_me = 1; in eri_send_msg()
3530 ptr = erip->tbuf_kaddr + offset; in eri_send_msg()
3547 c.dmac_address = erip->tbuf_ioaddr + offset; in eri_send_msg()
3548 (void) ddi_dma_sync(erip->tbuf_handle, in eri_send_msg()
3557 ERI_SYNCIOPB(erip, tmdp, sizeof (struct eri_tmd), in eri_send_msg()
3560 tmdp = NEXTTMD(erip, tmdp); in eri_send_msg()
3561 erip->tx_cur_cnt++; in eri_send_msg()
3563 erip->tx_kick = tmdp - tbasep; in eri_send_msg()
3564 PUT_ETXREG(tx_kick, erip->tx_kick); in eri_send_msg()
3565 erip->tnextp = tmdp; in eri_send_msg()
3567 erip->starts++; in eri_send_msg()
3569 if (erip->tx_cur_cnt >= tx_interrupt_rate) { in eri_send_msg()
3570 erip->tx_completion = (uint32_t)(GET_ETXREG(tx_completion) & in eri_send_msg()
3572 (void) eri_reclaim(erip, erip->tx_completion); in eri_send_msg()
3574 mutex_exit(&erip->xmitlock); in eri_send_msg()
3579 HSTAT(erip, notmds); in eri_send_msg()
3580 erip->wantw = B_TRUE; in eri_send_msg()
3582 mutex_exit(&erip->xmitlock); in eri_send_msg()
3590 struct eri *erip = arg; in eri_m_tx() local
3596 if (!eri_send_msg(erip, mp)) { in eri_m_tx()
3610 eri_reclaim(struct eri *erip, uint32_t tx_completion) in eri_reclaim() argument
3619 tbasep = erip->eri_tmdp; in eri_reclaim()
3620 tlimp = erip->eri_tmdlimp; in eri_reclaim()
3622 tmdp = erip->tcurp; in eri_reclaim()
3631 HSTAT(erip, opackets64); in eri_reclaim()
3633 HSTATN(erip, obytes64, (flags & ERI_TMD_BUFSIZE)); in eri_reclaim()
3639 erip->tcurp = tmdp; in eri_reclaim()
3640 erip->tx_cur_cnt -= reclaimed; in eri_reclaim()
3642 return (erip->wantw && reclaimed ? B_TRUE : B_FALSE); in eri_reclaim()
3648 eri_read_dma(struct eri *erip, volatile struct rmd *rmdp, in eri_read_dma() argument
3660 bp = erip->rmblkp[rmdi]; in eri_read_dma()
3678 HSTAT(erip, rx_bad_pkts); in eri_read_dma()
3680 HSTAT(erip, ierrors); in eri_read_dma()
3682 HSTAT(erip, rx_runt); in eri_read_dma()
3684 HSTAT(erip, rx_toolong_pkts); in eri_read_dma()
3686 HSTAT(erip, drop); in eri_read_dma()
3689 ERI_SYNCIOPB(erip, rmdp, sizeof (struct rmd), in eri_read_dma()
3740 (void) ddi_dma_sync(erip->ndmarh[rmdi], 0, in eri_read_dma()
3746 ERI_SYNCIOPB(erip, rmdp, sizeof (struct rmd), in eri_read_dma()
3755 ERI_PROCESS_READ(erip, nbp, sum); in eri_read_dma()
3757 ERI_PROCESS_READ(erip, nbp); in eri_read_dma()
3767 HSTAT(erip, ierrors); in eri_read_dma()
3768 HSTAT(erip, allocbfail); in eri_read_dma()
3769 HSTAT(erip, norcvbuf); in eri_read_dma()
3772 ERI_SYNCIOPB(erip, rmdp, sizeof (struct rmd), in eri_read_dma()
3774 ERI_DEBUG_MSG1(erip, RESOURCE_MSG, "allocb fail"); in eri_read_dma()
3786 (void) ddi_dma_unbind_handle(erip->ndmarh[rmdi]); in eri_read_dma()
3787 (void) ddi_dma_addr_bind_handle(erip->ndmarh[rmdi], in eri_read_dma()
3792 erip->rmblkp[rmdi] = nbp; in eri_read_dma()
3794 ERI_SYNCIOPB(erip, rmdp, sizeof (struct rmd), in eri_read_dma()
3804 ERI_PROCESS_READ(erip, bp, sum); in eri_read_dma()
3806 ERI_PROCESS_READ(erip, bp); in eri_read_dma()
3816 HSTAT(erip, ierrors); in eri_read_dma()
3817 HSTAT(erip, allocbfail); in eri_read_dma()
3818 HSTAT(erip, norcvbuf); in eri_read_dma()
3821 ERI_SYNCIOPB(erip, rmdp, sizeof (struct rmd), in eri_read_dma()
3823 ERI_DEBUG_MSG1(erip, RESOURCE_MSG, "allocb fail"); in eri_read_dma()
3833 eri_init_xfer_params(struct eri *erip) in eri_init_xfer_params() argument
3838 dip = erip->dip; in eri_init_xfer_params()
3841 erip->param_arr[i] = param_arr[i]; in eri_init_xfer_params()
3843 erip->xmit_dma_mode = 0; in eri_init_xfer_params()
3844 erip->rcv_dma_mode = 0; in eri_init_xfer_params()
3845 erip->mifpoll_enable = mifpoll_enable; in eri_init_xfer_params()
3846 erip->lance_mode_enable = lance_mode; in eri_init_xfer_params()
3847 erip->frame_enable = 1; in eri_init_xfer_params()
3848 erip->ngu_enable = ngu_enable; in eri_init_xfer_params()
3850 if (!erip->g_nd && !eri_param_register(erip, in eri_init_xfer_params()
3851 erip->param_arr, A_CNT(param_arr))) { in eri_init_xfer_params()
3852 ERI_FAULT_MSG1(erip, SEVERITY_LOW, ERI_VERB_MSG, in eri_init_xfer_params()
3948 erip->link_pulse_disabled = 1; in eri_init_xfer_params()
3950 erip->link_pulse_disabled = 1; in eri_init_xfer_params()
3952 eri_statinit(erip); in eri_init_xfer_params()
3958 eri_process_ndd_ioctl(struct eri *erip, queue_t *wq, mblk_t *mp, int cmd) in eri_process_ndd_ioctl() argument
3990 if (!eri_nd_getset(wq, erip->g_nd, mp)) { in eri_process_ndd_ioctl()
4036 if (!eri_nd_getset(wq, erip->g_nd, mp)) { in eri_process_ndd_ioctl()
4045 ERI_DEBUG_MSG2(erip, NDD_MSG, in eri_process_ndd_ioctl()
4048 erip->stats.link_up = LINK_STATE_DOWN; in eri_process_ndd_ioctl()
4049 erip->stats.link_duplex = LINK_DUPLEX_UNKNOWN; in eri_process_ndd_ioctl()
4050 (void) eri_init(erip); in eri_process_ndd_ioctl()
4057 erip->stats.link_up = LINK_STATE_DOWN; in eri_process_ndd_ioctl()
4058 erip->stats.link_duplex = LINK_DUPLEX_UNKNOWN; in eri_process_ndd_ioctl()
4059 (void) eri_init(erip); in eri_process_ndd_ioctl()
4068 erip->stats.link_up = LINK_STATE_DOWN; in eri_process_ndd_ioctl()
4069 erip->stats.link_duplex = LINK_DUPLEX_UNKNOWN; in eri_process_ndd_ioctl()
4070 (void) eri_init(erip); in eri_process_ndd_ioctl()
4081 struct eri *erip; in eri_stat_kstat_update() local
4086 erip = (struct eri *)ksp->ks_private; in eri_stat_kstat_update()
4097 mutex_enter(&erip->xmitlock); in eri_stat_kstat_update()
4098 if ((erip->flags & ERI_RUNNING) && (erip->flags & ERI_TXINIT)) { in eri_stat_kstat_update()
4099 erip->tx_completion = in eri_stat_kstat_update()
4101 macupdate |= eri_reclaim(erip, erip->tx_completion); in eri_stat_kstat_update()
4103 mutex_exit(&erip->xmitlock); in eri_stat_kstat_update()
4105 mac_tx_update(erip->mh); in eri_stat_kstat_update()
4107 eri_savecntrs(erip); in eri_stat_kstat_update()
4109 esp = &erip->stats; in eri_stat_kstat_update()
4155 eri_statinit(struct eri *erip) in eri_statinit() argument
4160 if ((ksp = kstat_create("eri", erip->instance, "driver_info", "net", in eri_statinit()
4163 ERI_FAULT_MSG1(erip, SEVERITY_LOW, ERI_VERB_MSG, in eri_statinit()
4168 erip->ksp = ksp; in eri_statinit()
4244 ksp->ks_private = (void *) erip; in eri_statinit()
4255 eri_param_cleanup(struct eri *erip) in eri_param_cleanup() argument
4257 if (erip->g_nd) in eri_param_cleanup()
4258 (void) eri_nd_free(&erip->g_nd); in eri_param_cleanup()
4321 eri_param_register(struct eri *erip, param_t *eripa, int cnt) in eri_param_register() argument
4345 if (!eri_nd_load(&erip->g_nd, eripa->param_name + 1, in eri_param_register()
4347 (void) eri_nd_free(&erip->g_nd); in eri_param_register()
4576 eri_debug_msg(const char *file, int line, struct eri *erip, in eri_debug_msg() argument
4589 if (erip) in eri_debug_msg()
4592 ddi_driver_name(erip->dip), erip->instance, in eri_debug_msg()
4606 eri_fault_msg(struct eri *erip, uint_t severity, msg_t type, in eri_fault_msg() argument
4616 if (erip == NULL) { in eri_fault_msg()
4622 cmn_err(CE_WARN, "%s%d : %s", ddi_driver_name(erip->dip), in eri_fault_msg()
4623 erip->instance, msg_buffer); in eri_fault_msg()
4626 cmn_err(CE_CONT, "?%s%d : %s", ddi_driver_name(erip->dip), in eri_fault_msg()
4627 erip->instance, msg_buffer); in eri_fault_msg()
4630 cmn_err(CE_NOTE, "^%s%d : %s", ddi_driver_name(erip->dip), in eri_fault_msg()
4631 erip->instance, msg_buffer); in eri_fault_msg()
4634 cmn_err(CE_NOTE, "!%s%d : %s", ddi_driver_name(erip->dip), in eri_fault_msg()
4635 erip->instance, msg_buffer); in eri_fault_msg()
4638 cmn_err(CE_CONT, "%s%d : %s", ddi_driver_name(erip->dip), in eri_fault_msg()
4639 erip->instance, msg_buffer); in eri_fault_msg()
4655 eri_stop_timer(struct eri *erip) in eri_stop_timer() argument
4658 mutex_enter(&erip->linklock); in eri_stop_timer()
4659 if (erip->timerid) { in eri_stop_timer()
4660 erip->flags |= ERI_NOTIMEOUTS; /* prevent multiple timeout */ in eri_stop_timer()
4661 id = erip->timerid; in eri_stop_timer()
4662 erip->timerid = 0; /* prevent other thread do untimeout */ in eri_stop_timer()
4663 mutex_exit(&erip->linklock); /* no mutex across untimeout() */ in eri_stop_timer()
4666 mutex_enter(&erip->linklock); /* acquire mutex again */ in eri_stop_timer()
4667 erip->flags &= ~ERI_NOTIMEOUTS; in eri_stop_timer()
4675 eri_start_timer(struct eri *erip, fptrv_t func, clock_t msec) in eri_start_timer() argument
4678 if (!(erip->flags & ERI_NOTIMEOUTS) && in eri_start_timer()
4679 (erip->flags & ERI_RUNNING)) { in eri_start_timer()
4680 erip->timerid = timeout(func, (caddr_t)erip, in eri_start_timer()
4685 mutex_exit(&erip->linklock); in eri_start_timer()
4689 eri_new_xcvr(struct eri *erip) in eri_new_xcvr() argument
4695 if (pci_report_pmcap(erip->dip, PCI_PM_IDLESPEED, in eri_new_xcvr()
4697 erip->stats.pmcap = ERI_PMCAP_NONE; in eri_new_xcvr()
4701 ERI_DEBUG_MSG2(erip, MIF_MSG, "cfg value = %X", cfg); in eri_new_xcvr()
4705 ERI_DEBUG_MSG1(erip, PHY_MSG, "Found External XCVR"); in eri_new_xcvr()
4717 eri_mii_write(erip, ERI_PHY_BMCR, in eri_new_xcvr()
4726 erip->phyad = ERI_EXTERNAL_PHYAD; in eri_new_xcvr()
4728 erip->mif_config &= ~ERI_MIF_CFGPD; in eri_new_xcvr()
4729 erip->mif_config |= (erip->phyad << ERI_MIF_CFGPD_SHIFT); in eri_new_xcvr()
4730 erip->mif_config |= ERI_MIF_CFGPS; in eri_new_xcvr()
4731 PUT_MIFREG(mif_cfg, erip->mif_config); in eri_new_xcvr()
4736 ERI_DEBUG_MSG1(erip, PHY_MSG, "Found Internal XCVR"); in eri_new_xcvr()
4749 eri_mii_write(erip, ERI_PHY_BMCR, in eri_new_xcvr()
4758 erip->phyad = ERI_INTERNAL_PHYAD; in eri_new_xcvr()
4760 erip->mif_config &= ~ERI_MIF_CFGPD; in eri_new_xcvr()
4761 erip->mif_config |= (erip->phyad << ERI_MIF_CFGPD_SHIFT); in eri_new_xcvr()
4762 erip->mif_config &= ~ERI_MIF_CFGPS; in eri_new_xcvr()
4763 PUT_MIFREG(mif_cfg, erip->mif_config); in eri_new_xcvr()
4771 ERI_FAULT_MSG1(erip, SEVERITY_NONE, ERI_VERB_MSG, in eri_new_xcvr()
4774 erip->xcvr_status = PHY_LINK_DOWN; in eri_new_xcvr()
4777 if (erip->stats.pmcap == ERI_PMCAP_NONE) { in eri_new_xcvr()
4778 if (pci_report_pmcap(erip->dip, PCI_PM_IDLESPEED, in eri_new_xcvr()
4780 erip->stats.pmcap = ERI_PMCAP_4MHZ; in eri_new_xcvr()
4790 eri_check_link(struct eri *erip) in eri_check_link() argument
4792 link_state_t linkupdate = eri_check_link_noind(erip); in eri_check_link()
4795 mac_link_update(erip->mh, linkupdate); in eri_check_link()
4808 eri_check_link_noind(struct eri *erip) in eri_check_link_noind() argument
4814 eri_stop_timer(erip); /* acquire linklock */ in eri_check_link_noind()
4816 mutex_enter(&erip->xmitlock); in eri_check_link_noind()
4817 mutex_enter(&erip->xcvrlock); in eri_check_link_noind()
4818 eri_mif_poll(erip, MIF_POLL_STOP); in eri_check_link_noind()
4820 (void) eri_mii_read(erip, ERI_PHY_BMSR, &stat); in eri_check_link_noind()
4821 mif_ints = erip->mii_status ^ stat; in eri_check_link_noind()
4823 if (erip->openloop_autoneg) { in eri_check_link_noind()
4824 (void) eri_mii_read(erip, ERI_PHY_BMSR, &stat); in eri_check_link_noind()
4825 ERI_DEBUG_MSG3(erip, XCVR_MSG, in eri_check_link_noind()
4827 stat, erip->mii_status); in eri_check_link_noind()
4828 (void) eri_mii_read(erip, ERI_PHY_BMCR, &control); in eri_check_link_noind()
4830 (erip->openloop_autoneg < 2)) { in eri_check_link_noind()
4836 erip->stats.ifspeed = 10; in eri_check_link_noind()
4843 erip->stats.ifspeed = 100; in eri_check_link_noind()
4845 ERI_DEBUG_MSG3(erip, XCVR_MSG, in eri_check_link_noind()
4849 erip->openloop_autoneg ++; in eri_check_link_noind()
4850 eri_mii_write(erip, ERI_PHY_BMCR, control); in eri_check_link_noind()
4853 erip->openloop_autoneg = 0; in eri_check_link_noind()
4854 linkupdate = eri_mif_check(erip, stat, stat); in eri_check_link_noind()
4855 if (erip->openloop_autoneg) in eri_check_link_noind()
4858 eri_mif_poll(erip, MIF_POLL_START); in eri_check_link_noind()
4859 mutex_exit(&erip->xcvrlock); in eri_check_link_noind()
4860 mutex_exit(&erip->xmitlock); in eri_check_link_noind()
4862 eri_start_timer(erip, eri_check_link, link_timeout); in eri_check_link_noind()
4866 linkupdate = eri_mif_check(erip, mif_ints, stat); in eri_check_link_noind()
4867 eri_mif_poll(erip, MIF_POLL_START); in eri_check_link_noind()
4868 mutex_exit(&erip->xcvrlock); in eri_check_link_noind()
4869 mutex_exit(&erip->xmitlock); in eri_check_link_noind()
4875 if ((erip->flags & ERI_RUNNING) && param_linkup) { in eri_check_link_noind()
4876 if (erip->check_rmac_hang) { in eri_check_link_noind()
4877 ERI_DEBUG_MSG5(erip, in eri_check_link_noind()
4880 erip->check_rmac_hang, in eri_check_link_noind()
4885 erip->check_rmac_hang = 0; in eri_check_link_noind()
4886 erip->check2_rmac_hang ++; in eri_check_link_noind()
4888 erip->rxfifo_wr_ptr_c = GET_ERXREG(rxfifo_wr_ptr); in eri_check_link_noind()
4889 erip->rxfifo_rd_ptr_c = GET_ERXREG(rxfifo_rd_ptr); in eri_check_link_noind()
4891 eri_start_timer(erip, eri_check_link, in eri_check_link_noind()
4896 if (erip->check2_rmac_hang) { in eri_check_link_noind()
4897 ERI_DEBUG_MSG5(erip, in eri_check_link_noind()
4900 erip->check2_rmac_hang, in eri_check_link_noind()
4905 erip->check2_rmac_hang = 0; in eri_check_link_noind()
4907 erip->rxfifo_wr_ptr = GET_ERXREG(rxfifo_wr_ptr); in eri_check_link_noind()
4908 erip->rxfifo_rd_ptr = GET_ERXREG(rxfifo_rd_ptr); in eri_check_link_noind()
4912 ((erip->rxfifo_wr_ptr_c == erip->rxfifo_rd_ptr_c) || in eri_check_link_noind()
4913 ((erip->rxfifo_rd_ptr == erip->rxfifo_rd_ptr_c) && in eri_check_link_noind()
4914 (erip->rxfifo_wr_ptr == erip->rxfifo_wr_ptr_c)))) { in eri_check_link_noind()
4915 ERI_DEBUG_MSG1(erip, in eri_check_link_noind()
4919 HSTAT(erip, rx_hang); in eri_check_link_noind()
4920 erip->linkcheck = 1; in eri_check_link_noind()
4922 eri_start_timer(erip, eri_check_link, in eri_check_link_noind()
4924 (void) eri_init(erip); in eri_check_link_noind()
4935 if ((erip->flags & ERI_RUNNING) && param_linkup && in eri_check_link_noind()
4936 (eri_check_txhung(erip))) { in eri_check_link_noind()
4937 HSTAT(erip, tx_hang); in eri_check_link_noind()
4939 erip->linkcheck = 1; in eri_check_link_noind()
4940 eri_start_timer(erip, eri_check_link, ERI_CHECK_HANG_TIMER); in eri_check_link_noind()
4941 (void) eri_init(erip); in eri_check_link_noind()
4947 if (erip->stats.pmcap == ERI_PMCAP_NONE) { in eri_check_link_noind()
4948 if (pci_report_pmcap(erip->dip, PCI_PM_IDLESPEED, in eri_check_link_noind()
4950 erip->stats.pmcap = ERI_PMCAP_4MHZ; in eri_check_link_noind()
4952 ERI_DEBUG_MSG2(erip, NONFATAL_MSG, in eri_check_link_noind()
4953 "eri_check_link: PMCAP %d", erip->stats.pmcap); in eri_check_link_noind()
4957 eri_start_timer(erip, eri_check_link, ERI_CHECK_HANG_TIMER); in eri_check_link_noind()
4959 eri_start_timer(erip, eri_check_link, ERI_LINKCHECK_TIMER); in eri_check_link_noind()
4964 eri_mif_check(struct eri *erip, uint16_t mif_ints, uint16_t mif_data) in eri_mif_check() argument
4971 ERI_DEBUG_MSG4(erip, XCVR_MSG, "eri_mif_check: mif_mask: %X, %X, %X", in eri_mif_check()
4972 erip->mif_mask, mif_ints, mif_data); in eri_mif_check()
4974 mif_ints &= ~erip->mif_mask; in eri_mif_check()
4975 erip->mii_status = mif_data; in eri_mif_check()
4983 ERI_FAULT_MSG1(erip, SEVERITY_NONE, ERI_VERB_MSG, in eri_mif_check()
4985 if (eri_new_xcvr(erip)) { in eri_mif_check()
4990 (void) eri_reset_xcvr(erip); in eri_mif_check()
4999 ERI_DEBUG_MSG3(erip, PHY_MSG, in eri_mif_check()
5005 ERI_DEBUG_MSG1(erip, PHY_MSG, "Auto-negotiation interrupt."); in eri_mif_check()
5011 erip->mif_mask |= PHY_BMSR_ANC; in eri_mif_check()
5012 erip->mif_mask &= ~PHY_BMSR_LNKSTS; in eri_mif_check()
5013 (void) eri_mii_read(erip, ERI_PHY_ANER, &aner); in eri_mif_check()
5016 ERI_DEBUG_MSG1(erip, XCVR_MSG, in eri_mif_check()
5021 ERI_DEBUG_MSG1(erip, XCVR_MSG, in eri_mif_check()
5023 (void) eri_mii_read(erip, ERI_PHY_BMCR, &control); in eri_mif_check()
5032 erip->stats.ifspeed = 100; in eri_mif_check()
5039 erip->stats.ifspeed = 10; in eri_mif_check()
5041 ERI_FAULT_MSG1(erip, SEVERITY_NONE, in eri_mif_check()
5047 (void) eri_mii_write(erip, ERI_PHY_BMCR, control); in eri_mif_check()
5051 erip->openloop_autoneg = 1; in eri_mif_check()
5054 (void) eri_mii_read(erip, ERI_PHY_ANLPAR, &anlpar); in eri_mif_check()
5055 (void) eri_mii_read(erip, ERI_PHY_ANAR, &anar); in eri_mif_check()
5058 ERI_DEBUG_MSG2(erip, XCVR_MSG, "an_common = 0x%X", an_common); in eri_mif_check()
5062 erip->stats.ifspeed = 100; in eri_mif_check()
5067 erip->stats.ifspeed = 10; in eri_mif_check()
5073 ERI_FAULT_MSG1(erip, SEVERITY_MID, ERI_VERB_MSG, in eri_mif_check()
5082 ERI_DEBUG_MSG2(erip, PHY_MSG, in eri_mif_check()
5084 ERI_DEBUG_MSG2(erip, PHY_MSG, in eri_mif_check()
5092 ERI_DEBUG_MSG1(erip, PHY_MSG, "Link Up"); in eri_mif_check()
5097 eri_mii_write(erip, 31, 0x8000); in eri_mif_check()
5098 (void) eri_mii_read(erip, 0, &old_mintrans); in eri_mif_check()
5099 eri_mii_write(erip, 0, 0x00F1); in eri_mif_check()
5100 eri_mii_write(erip, 31, 0x0000); in eri_mif_check()
5105 eri_init_txmac(erip); in eri_mif_check()
5107 erip->stats.link_up = LINK_STATE_UP; in eri_mif_check()
5109 erip->stats.link_duplex = LINK_DUPLEX_FULL; in eri_mif_check()
5111 erip->stats.link_duplex = LINK_DUPLEX_HALF; in eri_mif_check()
5115 ERI_DEBUG_MSG1(erip, PHY_MSG, "Link down."); in eri_mif_check()
5117 erip->stats.link_up = LINK_STATE_DOWN; in eri_mif_check()
5118 erip->stats.link_duplex = LINK_DUPLEX_UNKNOWN; in eri_mif_check()
5127 ERI_DEBUG_MSG1(erip, PHY_MSG, in eri_mif_check()
5133 eri_mii_write(erip, 31, 0x8000); in eri_mif_check()
5134 (void) eri_mii_read(erip, 0, in eri_mif_check()
5136 eri_mii_write(erip, 0, 0x00F1); in eri_mif_check()
5137 eri_mii_write(erip, 31, 0x0000); in eri_mif_check()
5142 eri_init_txmac(erip); in eri_mif_check()
5145 erip->stats.link_up = LINK_STATE_UP; in eri_mif_check()
5147 erip->stats.link_duplex = in eri_mif_check()
5150 erip->stats.link_duplex = in eri_mif_check()
5159 ERI_DEBUG_MSG1(erip, PHY_MSG, in eri_mif_check()
5162 erip->stats.link_up = LINK_STATE_DOWN; in eri_mif_check()
5163 erip->stats.link_duplex = LINK_DUPLEX_UNKNOWN; in eri_mif_check()
5173 ERI_DEBUG_MSG1(erip, PHY_MSG, in eri_mif_check()
5175 erip->openloop_autoneg = 0; in eri_mif_check()
5184 (void) eri_mii_read(erip, ERI_PHY_BMCR, &control); in eri_mif_check()
5186 eri_mii_write(erip, ERI_PHY_BMCR, control); in eri_mif_check()
5190 ERI_DEBUG_MSG1(erip, PHY_MSG, "Jabber detected."); in eri_mif_check()
5191 HSTAT(erip, jab); in eri_mif_check()
5196 (void) eri_reset_xcvr(erip); in eri_mif_check()
5204 eri_reset_xcvr(struct eri *erip) in eri_reset_xcvr() argument
5217 erip->ifspeed_old = erip->stats.ifspeed; in eri_reset_xcvr()
5225 erip->openloop_autoneg = 0; in eri_reset_xcvr()
5230 eri_mii_write(erip, ERI_PHY_BMCR, PHY_BMCR_RESET); in eri_reset_xcvr()
5237 if (eri_mii_read(erip, ERI_PHY_BMCR, &control) == 1) { in eri_reset_xcvr()
5239 ERI_FAULT_MSG1(erip, SEVERITY_NONE, ERI_VERB_MSG, in eri_reset_xcvr()
5245 ERI_FAULT_MSG2(erip, SEVERITY_NONE, ERI_VERB_MSG, in eri_reset_xcvr()
5251 ERI_DEBUG_MSG2(erip, AUTOCONFIG_MSG, in eri_reset_xcvr()
5255 (void) eri_mii_read(erip, ERI_PHY_BMSR, &stat); in eri_reset_xcvr()
5256 (void) eri_mii_read(erip, ERI_PHY_ANAR, &anar); in eri_reset_xcvr()
5257 (void) eri_mii_read(erip, ERI_PHY_IDR1, &idr1); in eri_reset_xcvr()
5258 (void) eri_mii_read(erip, ERI_PHY_IDR2, &idr2); in eri_reset_xcvr()
5260 ERI_DEBUG_MSG4(erip, XCVR_MSG, in eri_reset_xcvr()
5301 ERI_DEBUG_MSG2(erip, XCVR_MSG, "anar = %x", anar); in eri_reset_xcvr()
5302 eri_mii_write(erip, ERI_PHY_ANAR, anar); in eri_reset_xcvr()
5308 eri_mii_write(erip, ERI_PHY_BMCR, in eri_reset_xcvr()
5322 erip->mif_mask = (uint16_t)(~PHY_BMSR_RES1); in eri_reset_xcvr()
5331 ERI_DEBUG_MSG5(erip, XCVR_MSG, "eri_reset_xcvr: %d %d %d %d", in eri_reset_xcvr()
5335 ERI_DEBUG_MSG3(erip, XCVR_MSG, in eri_reset_xcvr()
5339 erip->mif_mask &= ~PHY_BMSR_JABDET; in eri_reset_xcvr()
5342 (erip->link_pulse_disabled)) { in eri_reset_xcvr()
5345 (void) eri_mii_read(erip, ERI_PHY_NICR, &nicr); in eri_reset_xcvr()
5347 eri_mii_write(erip, ERI_PHY_NICR, nicr); in eri_reset_xcvr()
5349 erip->stats.link_up = LINK_STATE_UP; in eri_reset_xcvr()
5351 erip->stats.link_duplex = LINK_DUPLEX_FULL; in eri_reset_xcvr()
5353 erip->stats.link_duplex = LINK_DUPLEX_HALF; in eri_reset_xcvr()
5366 erip->mif_mask &= ~PHY_BMSR_ANC; in eri_reset_xcvr()
5371 eri_mii_write(erip, ERI_PHY_BMCR, control & ~PHY_BMCR_ANE); in eri_reset_xcvr()
5378 eri_mii_write(erip, ERI_PHY_BMCR, control); in eri_reset_xcvr()
5383 erip->mif_mask &= ~PHY_BMSR_LNKSTS; in eri_reset_xcvr()
5399 erip->stats.ifspeed = 100; in eri_reset_xcvr()
5403 erip->stats.link_duplex = LINK_DUPLEX_FULL; in eri_reset_xcvr()
5405 erip->stats.link_duplex = LINK_DUPLEX_HALF; in eri_reset_xcvr()
5416 erip->stats.ifspeed = 10; in eri_reset_xcvr()
5420 erip->stats.link_duplex = LINK_DUPLEX_FULL; in eri_reset_xcvr()
5422 erip->stats.link_duplex = LINK_DUPLEX_HALF; in eri_reset_xcvr()
5425 ERI_FAULT_MSG1(erip, SEVERITY_NONE, ERI_VERB_MSG, in eri_reset_xcvr()
5433 ERI_DEBUG_MSG4(erip, PHY_MSG, in eri_reset_xcvr()
5437 eri_mii_write(erip, ERI_PHY_BMCR, control); in eri_reset_xcvr()
5448 (void) eri_mii_read(erip, ERI_PHY_BMCR, &control); in eri_reset_xcvr()
5449 (void) eri_mii_read(erip, ERI_PHY_BMSR, &stat); in eri_reset_xcvr()
5450 (void) eri_mii_read(erip, ERI_PHY_ANAR, &anar); in eri_reset_xcvr()
5452 ERI_DEBUG_MSG4(erip, PHY_MSG, in eri_reset_xcvr()
5465 eri_xcvr_force_mode(struct eri *erip, uint32_t *link_timeout) in eri_xcvr_force_mode() argument
5468 if (!param_autoneg && !param_linkup && (erip->stats.ifspeed == 10) && in eri_xcvr_force_mode()
5474 if (!param_autoneg && !param_linkup && (erip->ifspeed_old == 10) && in eri_xcvr_force_mode()
5479 ERI_FAULT_MSG1(erip, SEVERITY_NONE, ERI_LOG_MSG, in eri_xcvr_force_mode()
5486 eri_mif_poll(struct eri *erip, soft_mif_enable_t enable) in eri_mif_poll() argument
5489 if (erip->mifpoll_enable && !erip->openloop_autoneg) { in eri_mif_poll()
5490 erip->mif_config |= ERI_MIF_CFGPE; in eri_mif_poll()
5491 PUT_MIFREG(mif_cfg, erip->mif_config); in eri_mif_poll()
5495 PUT_MIFREG(mif_imask, erip->mif_mask); in eri_mif_poll()
5498 erip->mif_config &= ~ERI_MIF_CFGPE; in eri_mif_poll()
5499 PUT_MIFREG(mif_cfg, erip->mif_config); in eri_mif_poll()
5505 ERI_DEBUG_MSG2(erip, XCVR_MSG, "MIF Config = 0x%X", in eri_mif_poll()
5507 ERI_DEBUG_MSG2(erip, XCVR_MSG, "MIF imask = 0x%X", in eri_mif_poll()
5509 ERI_DEBUG_MSG2(erip, XCVR_MSG, "INT imask = 0x%X", in eri_mif_poll()
5511 ERI_DEBUG_MSG1(erip, XCVR_MSG, "<== mif_poll"); in eri_mif_poll()
5518 eri_check_txhung(struct eri *erip) in eri_check_txhung() argument
5522 mutex_enter(&erip->xmitlock); in eri_check_txhung()
5523 if (erip->flags & ERI_RUNNING) in eri_check_txhung()
5524 erip->tx_completion = (uint32_t)(GET_ETXREG(tx_completion) & in eri_check_txhung()
5526 macupdate |= eri_reclaim(erip, erip->tx_completion); in eri_check_txhung()
5529 if ((erip->tcurp != erip->tnextp) && in eri_check_txhung()
5530 (erip->stats.opackets64 == erip->erisave.reclaim_opackets) && in eri_check_txhung()
5531 (erip->stats.collisions == erip->erisave.starts)) in eri_check_txhung()
5532 erip->txhung++; in eri_check_txhung()
5534 erip->txhung = 0; in eri_check_txhung()
5536 erip->erisave.reclaim_opackets = erip->stats.opackets64; in eri_check_txhung()
5537 erip->erisave.starts = erip->stats.collisions; in eri_check_txhung()
5538 mutex_exit(&erip->xmitlock); in eri_check_txhung()
5541 mac_tx_update(erip->mh); in eri_check_txhung()
5543 return (erip->txhung >= eri_txhung_limit); in eri_check_txhung()