Lines Matching refs:vrp

253 static	vr_result_t	vr_add_intr(vr_t *vrp);
254 static void vr_remove_intr(vr_t *vrp);
255 static int32_t vr_cam_index(vr_t *vrp, const uint8_t *maddr);
257 static void vr_tx_enqueue_msg(vr_t *vrp, mblk_t *mp);
258 static void vr_log(vr_t *vrp, int level, const char *fmt, ...);
261 static vr_result_t vr_bus_config(vr_t *vrp);
262 static void vr_bus_unconfig(vr_t *vrp);
263 static void vr_reset(vr_t *vrp);
264 static int vr_start(vr_t *vrp);
265 static int vr_stop(vr_t *vrp);
266 static vr_result_t vr_rings_init(vr_t *vrp);
267 static void vr_rings_fini(vr_t *vrp);
268 static vr_result_t vr_alloc_ring(vr_t *vrp, vr_ring_t *r, size_t n);
270 static vr_result_t vr_rxring_init(vr_t *vrp);
271 static void vr_rxring_fini(vr_t *vrp);
272 static vr_result_t vr_txring_init(vr_t *vrp);
273 static void vr_txring_fini(vr_t *vrp);
274 static vr_result_t vr_alloc_dmabuf(vr_t *vrp, vr_data_dma_t *dmap,
277 static void vr_param_init(vr_t *vrp);
278 static mblk_t *vr_receive(vr_t *vrp);
279 static void vr_tx_reclaim(vr_t *vrp);
281 static void vr_error(vr_t *vrp);
282 static void vr_phy_read(vr_t *vrp, int offset, uint16_t *value);
283 static void vr_phy_write(vr_t *vrp, int offset, uint16_t value);
284 static void vr_phy_autopoll_disable(vr_t *vrp);
285 static void vr_phy_autopoll_enable(vr_t *vrp);
286 static void vr_link_init(vr_t *vrp);
287 static void vr_link_state(vr_t *vrp);
288 static void vr_kstats_init(vr_t *vrp);
290 static void vr_remove_kstats(vr_t *vrp);
295 vr_t *vrp; in vr_attach() local
306 vrp = kmem_zalloc(sizeof (vr_t), KM_SLEEP); in vr_attach()
307 ddi_set_driver_private(devinfo, vrp); in vr_attach()
308 vrp->devinfo = devinfo; in vr_attach()
313 (void) snprintf(vrp->ifname, sizeof (vrp->ifname), "%s%d", in vr_attach()
319 if (vr_bus_config(vrp) != VR_SUCCESS) { in vr_attach()
320 vr_log(vrp, CE_WARN, "vr_bus_config failed"); in vr_attach()
327 vr_param_init(vrp); in vr_attach()
332 if (vr_rings_init(vrp) != VR_SUCCESS) { in vr_attach()
333 vr_log(vrp, CE_WARN, "vr_rings_init failed"); in vr_attach()
340 vr_kstats_init(vrp); in vr_attach()
345 if (vr_add_intr(vrp) != VR_SUCCESS) { in vr_attach()
346 vr_log(vrp, CE_WARN, "vr_add_intr failed in attach"); in vr_attach()
353 mutex_init(&vrp->intrlock, NULL, MUTEX_DRIVER, in vr_attach()
354 DDI_INTR_PRI(vrp->intr_pri)); in vr_attach()
355 mutex_init(&vrp->oplock, NULL, MUTEX_DRIVER, NULL); in vr_attach()
356 mutex_init(&vrp->tx.lock, NULL, MUTEX_DRIVER, NULL); in vr_attach()
361 if (ddi_intr_enable(vrp->intr_hdl) != DDI_SUCCESS) { in vr_attach()
362 vr_log(vrp, CE_NOTE, "ddi_intr_enable failed"); in vr_attach()
370 vr_log(vrp, CE_WARN, "mac_alloc failed in attach"); in vr_attach()
375 macreg->m_driver = vrp; in vr_attach()
377 macreg->m_src_addr = vrp->vendor_ether_addr; in vr_attach()
383 if (mac_register(macreg, &vrp->machdl) != 0) { in vr_attach()
384 vr_log(vrp, CE_WARN, "mac_register failed in attach"); in vr_attach()
393 (void) ddi_intr_disable(vrp->intr_hdl); in vr_attach()
395 mutex_destroy(&vrp->tx.lock); in vr_attach()
396 mutex_destroy(&vrp->oplock); in vr_attach()
397 mutex_destroy(&vrp->intrlock); in vr_attach()
398 vr_remove_intr(vrp); in vr_attach()
400 vr_remove_kstats(vrp); in vr_attach()
402 vr_rings_fini(vrp); in vr_attach()
404 vr_bus_unconfig(vrp); in vr_attach()
406 kmem_free(vrp, sizeof (vr_t)); in vr_attach()
413 vr_t *vrp; in vr_detach() local
415 vrp = ddi_get_driver_private(devinfo); in vr_detach()
422 if (vrp->chip.state == CHIPSTATE_RUNNING) in vr_detach()
428 if (mac_unregister(vrp->machdl) != 0) in vr_detach()
431 (void) ddi_intr_disable(vrp->intr_hdl); in vr_detach()
432 vr_remove_intr(vrp); in vr_detach()
433 mutex_destroy(&vrp->tx.lock); in vr_detach()
434 mutex_destroy(&vrp->oplock); in vr_detach()
435 mutex_destroy(&vrp->intrlock); in vr_detach()
436 vr_remove_kstats(vrp); in vr_detach()
437 vr_rings_fini(vrp); in vr_detach()
438 vr_bus_unconfig(vrp); in vr_detach()
439 kmem_free(vrp, sizeof (vr_t)); in vr_detach()
449 vr_t *vrp; in vr_quiesce() local
451 vrp = (vr_t *)ddi_get_driver_private(dev_info); in vr_quiesce()
456 VR_PUT16(vrp->acc_reg, VR_ICR0, 0); in vr_quiesce()
457 VR_PUT8(vrp->acc_reg, VR_ICR1, 0); in vr_quiesce()
462 VR_PUT8(vrp->acc_reg, VR_CTRL0, VR_CTRL0_DMA_STOP); in vr_quiesce()
470 vr_add_intr(vr_t *vrp) in vr_add_intr() argument
475 rc = ddi_intr_alloc(vrp->devinfo, &vrp->intr_hdl, in vr_add_intr()
483 vr_log(vrp, CE_NOTE, "ddi_intr_alloc failed: %d", rc); in vr_add_intr()
487 rc = ddi_intr_add_handler(vrp->intr_hdl, vr_intr, vrp, NULL); in vr_add_intr()
489 vr_log(vrp, CE_NOTE, "ddi_intr_add_handler failed"); in vr_add_intr()
490 if (ddi_intr_free(vrp->intr_hdl) != DDI_SUCCESS) in vr_add_intr()
491 vr_log(vrp, CE_NOTE, "ddi_intr_free failed"); in vr_add_intr()
495 rc = ddi_intr_get_pri(vrp->intr_hdl, &vrp->intr_pri); in vr_add_intr()
497 vr_log(vrp, CE_NOTE, "ddi_intr_get_pri failed"); in vr_add_intr()
498 if (ddi_intr_remove_handler(vrp->intr_hdl) != DDI_SUCCESS) in vr_add_intr()
499 vr_log(vrp, CE_NOTE, "ddi_intr_remove_handler failed"); in vr_add_intr()
501 if (ddi_intr_free(vrp->intr_hdl) != DDI_SUCCESS) in vr_add_intr()
502 vr_log(vrp, CE_NOTE, "ddi_intr_free failed"); in vr_add_intr()
513 vr_remove_intr(vr_t *vrp) in vr_remove_intr() argument
515 if (ddi_intr_remove_handler(vrp->intr_hdl) != DDI_SUCCESS) in vr_remove_intr()
516 vr_log(vrp, CE_NOTE, "ddi_intr_remove_handler failed"); in vr_remove_intr()
518 if (ddi_intr_free(vrp->intr_hdl) != DDI_SUCCESS) in vr_remove_intr()
519 vr_log(vrp, CE_NOTE, "ddi_intr_free failed"); in vr_remove_intr()
528 vr_t *vrp; in vr_resume() local
530 vrp = (vr_t *)ddi_get_driver_private(devinfo); in vr_resume()
531 mutex_enter(&vrp->oplock); in vr_resume()
532 if (vrp->chip.state == CHIPSTATE_SUSPENDED_RUNNING) in vr_resume()
533 (void) vr_start(vrp); in vr_resume()
534 mutex_exit(&vrp->oplock); in vr_resume()
544 vr_t *vrp; in vr_suspend() local
546 vrp = (vr_t *)ddi_get_driver_private(devinfo); in vr_suspend()
547 mutex_enter(&vrp->oplock); in vr_suspend()
548 if (vrp->chip.state == CHIPSTATE_RUNNING) { in vr_suspend()
549 (void) vr_stop(vrp); in vr_suspend()
550 vrp->chip.state = CHIPSTATE_SUSPENDED_RUNNING; in vr_suspend()
552 mutex_exit(&vrp->oplock); in vr_suspend()
560 vr_bus_config(vr_t *vrp) in vr_bus_config() argument
570 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, vrp->devinfo, in vr_bus_config()
572 vr_log(vrp, CE_WARN, "Can't get reg property"); in vr_bus_config()
580 vrp->nsets = nsets; in vr_bus_config()
581 vrp->regset = kmem_zalloc(nsets * sizeof (vr_acc_t), KM_SLEEP); in vr_bus_config()
583 rc = ddi_regs_map_setup(vrp->devinfo, n, in vr_bus_config()
584 &vrp->regset[n].addr, 0, 0, in vr_bus_config()
586 &vrp->regset[n].hdl); in vr_bus_config()
588 vr_log(vrp, CE_NOTE, in vr_bus_config()
591 ddi_regs_map_free(&vrp->regset[n].hdl); in vr_bus_config()
592 kmem_free(vrp->regset, nsets * sizeof (vr_acc_t)); in vr_bus_config()
596 bcopy(&regs[n], &vrp->regset[n].reg, sizeof (pci_regspec_t)); in vr_bus_config()
604 addr = vrp->regset[n].reg.pci_phys_hi & PCI_REG_ADDR_M; in vr_bus_config()
605 if (addr == PCI_ADDR_CONFIG && vrp->acc_cfg == NULL) in vr_bus_config()
606 vrp->acc_cfg = &vrp->regset[n]; in vr_bus_config()
607 else if (addr == PCI_ADDR_IO && vrp->acc_io == NULL) in vr_bus_config()
608 vrp->acc_io = &vrp->regset[n]; in vr_bus_config()
609 else if (addr == PCI_ADDR_MEM32 && vrp->acc_mem == NULL) in vr_bus_config()
610 vrp->acc_mem = &vrp->regset[n]; in vr_bus_config()
616 if (vrp->acc_cfg == NULL || in vr_bus_config()
617 vrp->acc_io == NULL || in vr_bus_config()
618 vrp->acc_mem == NULL) { in vr_bus_config()
620 ddi_regs_map_free(&vrp->regset[n].hdl); in vr_bus_config()
621 kmem_free(vrp->regset, nsets * sizeof (vr_acc_t)); in vr_bus_config()
622 vr_log(vrp, CE_WARN, in vr_bus_config()
630 vrp->chip.vendor = VR_GET16(vrp->acc_cfg, PCI_CONF_VENID); in vr_bus_config()
631 vrp->chip.device = VR_GET16(vrp->acc_cfg, PCI_CONF_DEVID); in vr_bus_config()
632 vrp->chip.revision = VR_GET16(vrp->acc_cfg, PCI_CONF_REVID); in vr_bus_config()
639 if (vrp->chip.revision >= vr_chip_info[n].revmin && in vr_bus_config()
640 vrp->chip.revision <= vr_chip_info[n].revmax) { in vr_bus_config()
642 (void*)&vrp->chip.info, in vr_bus_config()
653 if (vrp->chip.info.name == NULL) { in vr_bus_config()
655 (void*) &vrp->chip.info, in vr_bus_config()
662 vr_log(vrp, CE_NOTE, "pci%d,%d,%d: %s, revision 0x%0x", in vr_bus_config()
663 PCI_REG_BUS_G(vrp->acc_cfg->reg.pci_phys_hi), in vr_bus_config()
664 PCI_REG_DEV_G(vrp->acc_cfg->reg.pci_phys_hi), in vr_bus_config()
665 PCI_REG_FUNC_G(vrp->acc_cfg->reg.pci_phys_hi), in vr_bus_config()
666 vrp->chip.info.name, in vr_bus_config()
667 vrp->chip.revision); in vr_bus_config()
675 VR_SETBIT8(vrp->acc_io, VR_CFGD, VR_CFGD_MMIOEN); in vr_bus_config()
680 if (vrp->acc_mem != NULL && in vr_bus_config()
681 (vrp->chip.info.bugs & VR_BUG_NO_MEMIO) == 0) in vr_bus_config()
682 vrp->acc_reg = vrp->acc_mem; in vr_bus_config()
684 vrp->acc_reg = vrp->acc_io; in vr_bus_config()
690 vrp->vendor_ether_addr[n] = VR_GET8(vrp->acc_reg, in vr_bus_config()
697 vr_bus_unconfig(vr_t *vrp) in vr_bus_unconfig() argument
704 for (n = 0; n < vrp->nsets; n++) in vr_bus_unconfig()
705 ddi_regs_map_free(&vrp->regset[n].hdl); in vr_bus_unconfig()
706 kmem_free(vrp->regset, vrp->nsets * sizeof (vr_acc_t)); in vr_bus_unconfig()
713 vr_param_init(vr_t *vrp) in vr_param_init() argument
718 vrp->param.an_en = VR_LINK_AUTONEG_ON; in vr_param_init()
719 vrp->param.anadv_en = 1; /* Select 802.3 autonegotiation */ in vr_param_init()
720 vrp->param.anadv_en |= MII_ABILITY_100BASE_T4; in vr_param_init()
721 vrp->param.anadv_en |= MII_ABILITY_100BASE_TX_FD; in vr_param_init()
722 vrp->param.anadv_en |= MII_ABILITY_100BASE_TX; in vr_param_init()
723 vrp->param.anadv_en |= MII_ABILITY_10BASE_T_FD; in vr_param_init()
724 vrp->param.anadv_en |= MII_ABILITY_10BASE_T; in vr_param_init()
726 vrp->param.anadv_en |= MII_ABILITY_PAUSE; in vr_param_init()
727 vrp->param.mtu = ETHERMTU; in vr_param_init()
732 vr_phy_read(vrp, MII_PHYIDH, &vrp->chip.mii.identh); in vr_param_init()
733 vr_phy_read(vrp, MII_PHYIDL, &vrp->chip.mii.identl); in vr_param_init()
738 vrp->param.an_phymask = vrp->param.anadv_en; in vr_param_init()
739 vr_phy_read(vrp, MII_STATUS, &vrp->chip.mii.status); in vr_param_init()
740 if ((vrp->chip.mii.status & MII_STATUS_10) == 0) in vr_param_init()
741 vrp->param.an_phymask &= ~MII_ABILITY_10BASE_T; in vr_param_init()
743 if ((vrp->chip.mii.status & MII_STATUS_10_FD) == 0) in vr_param_init()
744 vrp->param.an_phymask &= ~MII_ABILITY_10BASE_T_FD; in vr_param_init()
746 if ((vrp->chip.mii.status & MII_STATUS_100_BASEX) == 0) in vr_param_init()
747 vrp->param.an_phymask &= ~MII_ABILITY_100BASE_TX; in vr_param_init()
749 if ((vrp->chip.mii.status & MII_STATUS_100_BASEX_FD) == 0) in vr_param_init()
750 vrp->param.an_phymask &= ~MII_ABILITY_100BASE_TX_FD; in vr_param_init()
752 if ((vrp->chip.mii.status & MII_STATUS_100_BASE_T4) == 0) in vr_param_init()
753 vrp->param.an_phymask &= ~MII_ABILITY_100BASE_T4; in vr_param_init()
762 vrp->param.an_macmask = vrp->param.anadv_en; in vr_param_init()
767 vrp->chip.mii.anadv = vrp->param.anadv_en & in vr_param_init()
768 (vrp->param.an_phymask & vrp->param.an_macmask); in vr_param_init()
773 if (vrp->param.an_en == VR_LINK_AUTONEG_ON) in vr_param_init()
774 vrp->chip.mii.control = MII_CONTROL_ANE; in vr_param_init()
776 vrp->chip.mii.control = in vr_param_init()
784 vr_rings_init(vr_t *vrp) in vr_rings_init() argument
787 vrp->rx.ndesc = VR_RX_N_DESC; in vr_rings_init()
788 vrp->tx.ndesc = VR_TX_N_DESC; in vr_rings_init()
793 if (vr_alloc_ring(vrp, &vrp->rxring, vrp->rx.ndesc) != VR_SUCCESS) in vr_rings_init()
799 if (vr_alloc_ring(vrp, &vrp->txring, vrp->tx.ndesc) != VR_SUCCESS) { in vr_rings_init()
800 vr_free_ring(&vrp->rxring, vrp->rx.ndesc); in vr_rings_init()
804 vrp->rx.ring = vrp->rxring.desc; in vr_rings_init()
805 vrp->tx.ring = vrp->txring.desc; in vr_rings_init()
810 vr_rings_fini(vr_t *vrp) in vr_rings_fini() argument
812 vr_free_ring(&vrp->rxring, vrp->rx.ndesc); in vr_rings_fini()
813 vr_free_ring(&vrp->txring, vrp->tx.ndesc); in vr_rings_fini()
824 vr_alloc_ring(vr_t *vrp, vr_ring_t *ring, size_t n) in vr_alloc_ring() argument
834 rc = ddi_dma_alloc_handle(vrp->devinfo, in vr_alloc_ring()
841 vr_log(vrp, CE_WARN, in vr_alloc_ring()
860 vr_log(vrp, CE_WARN, in vr_alloc_ring()
880 vr_log(vrp, CE_WARN, in vr_alloc_ring()
957 vr_rxring_init(vr_t *vrp) in vr_rxring_init() argument
965 vrp->rx.rp = &vrp->rx.ring[0]; in vr_rxring_init()
970 for (i = 0; i < vrp->rx.ndesc; i++) { in vr_rxring_init()
971 rp = &vrp->rx.ring[i]; in vr_rxring_init()
972 rc = vr_alloc_dmabuf(vrp, in vr_rxring_init()
973 &vrp->rx.ring[i].dmabuf, in vr_rxring_init()
978 vr_free_dmabuf(&vrp->rx.ring[i].dmabuf); in vr_rxring_init()
985 ddi_put32(vrp->rxring.acchdl, in vr_rxring_init()
993 ddi_put32(vrp->rxring.acchdl, &rp->cdesc->stat1, in vr_rxring_init()
999 ddi_put32(vrp->rxring.acchdl, &rp->cdesc->stat0, VR_RDES0_OWN); in vr_rxring_init()
1004 (void) ddi_dma_sync(vrp->rxring.handle, rp->offset, in vr_rxring_init()
1014 vr_rxring_fini(vr_t *vrp) in vr_rxring_fini() argument
1018 for (i = 0; i < vrp->rx.ndesc; i++) in vr_rxring_fini()
1019 vr_free_dmabuf(&vrp->rx.ring[i].dmabuf); in vr_rxring_fini()
1023 vr_txring_init(vr_t *vrp) in vr_txring_init() argument
1031 vrp->tx.wp = &vrp->tx.ring[0]; in vr_txring_init()
1032 vrp->tx.cp = &vrp->tx.ring[0]; in vr_txring_init()
1037 vrp->tx.stallticks = 0; in vr_txring_init()
1038 vrp->tx.resched = 0; in vr_txring_init()
1043 vrp->tx.nfree = vrp->tx.ndesc; in vr_txring_init()
1048 for (i = 0; i < vrp->tx.ndesc; i++) { in vr_txring_init()
1049 rc = vr_alloc_dmabuf(vrp, in vr_txring_init()
1050 &vrp->tx.ring[i].dmabuf, in vr_txring_init()
1055 vr_free_dmabuf(&vrp->tx.ring[i].dmabuf); in vr_txring_init()
1063 for (i = 0; i < vrp->tx.ndesc; i++) { in vr_txring_init()
1064 wp = &vrp->tx.ring[i]; in vr_txring_init()
1065 ddi_put32(vrp->txring.acchdl, &wp->cdesc->stat0, 0); in vr_txring_init()
1066 ddi_put32(vrp->txring.acchdl, &wp->cdesc->stat1, 0); in vr_txring_init()
1067 ddi_put32(vrp->txring.acchdl, &wp->cdesc->data, in vr_txring_init()
1069 (void) ddi_dma_sync(vrp->txring.handle, wp->offset, in vr_txring_init()
1080 vr_txring_fini(vr_t *vrp) in vr_txring_fini() argument
1087 for (i = 0; i < vrp->tx.ndesc; i++) in vr_txring_fini()
1088 vr_free_dmabuf(&vrp->tx.ring[i].dmabuf); in vr_txring_fini()
1095 vr_alloc_dmabuf(vr_t *vrp, vr_data_dma_t *dmap, uint_t dmaflags) in vr_alloc_dmabuf() argument
1104 rc = ddi_dma_alloc_handle(vrp->devinfo, in vr_alloc_dmabuf()
1110 vr_log(vrp, CE_WARN, in vr_alloc_dmabuf()
1131 vr_log(vrp, CE_WARN, in vr_alloc_dmabuf()
1154 vr_log(vrp, CE_WARN, in vr_alloc_dmabuf()
1186 vr_t *vrp; in vr_intr() local
1194 vrp = (void *)arg1; in vr_intr()
1197 mutex_enter(&vrp->intrlock); in vr_intr()
1202 if (vrp->chip.state != CHIPSTATE_RUNNING) { in vr_intr()
1203 mutex_exit(&vrp->intrlock); in vr_intr()
1211 status = VR_GET16(vrp->acc_reg, VR_ISR0) & VR_ICR0_CFG; in vr_intr()
1217 vrp->stats.intr_unclaimed++; in vr_intr()
1218 mutex_exit(&vrp->intrlock); in vr_intr()
1221 vrp->stats.intr_claimed++; in vr_intr()
1226 VR_PUT16(vrp->acc_reg, VR_ISR0, status); in vr_intr()
1235 lp = vr_receive(vrp); in vr_intr()
1241 VR_PUT8(vrp->acc_reg, VR_CTRL0, VR_CTRL0_DMA_GO); in vr_intr()
1255 mutex_enter(&vrp->tx.lock); in vr_intr()
1256 vr_tx_reclaim(vrp); in vr_intr()
1257 tx_resched = vrp->tx.resched; in vr_intr()
1258 vrp->tx.resched = 0; in vr_intr()
1259 mutex_exit(&vrp->tx.lock); in vr_intr()
1270 mutex_enter(&vrp->oplock); in vr_intr()
1271 mutex_enter(&vrp->tx.lock); in vr_intr()
1272 vr_link_state(vrp); in vr_intr()
1273 mutex_exit(&vrp->tx.lock); in vr_intr()
1274 mutex_exit(&vrp->oplock); in vr_intr()
1276 vrp->stats.linkchanges++; in vr_intr()
1284 vr_log(vrp, CE_WARN, "bus error occured"); in vr_intr()
1285 vrp->reset = 1; in vr_intr()
1293 mutex_exit(&vrp->intrlock); in vr_intr()
1300 if (vrp->reset != 0) { in vr_intr()
1301 vr_error(vrp); in vr_intr()
1302 vrp->reset = 0; in vr_intr()
1309 mac_rx(vrp->machdl, 0, lp); in vr_intr()
1315 mac_link_update(vrp->machdl, in vr_intr()
1316 (link_state_t)vrp->chip.link.state); in vr_intr()
1321 mac_tx_update(vrp->machdl); in vr_intr()
1327 (void) VR_GET8(vrp->acc_reg, VR_ETHERADDR); in vr_intr()
1335 vr_error(vr_t *vrp) in vr_error() argument
1337 vr_log(vrp, CE_WARN, "resetting MAC."); in vr_error()
1338 mutex_enter(&vrp->intrlock); in vr_error()
1339 mutex_enter(&vrp->oplock); in vr_error()
1340 mutex_enter(&vrp->tx.lock); in vr_error()
1341 (void) vr_stop(vrp); in vr_error()
1342 vr_reset(vrp); in vr_error()
1343 (void) vr_start(vrp); in vr_error()
1344 mutex_exit(&vrp->tx.lock); in vr_error()
1345 mutex_exit(&vrp->oplock); in vr_error()
1346 mutex_exit(&vrp->intrlock); in vr_error()
1347 vrp->stats.resets++; in vr_error()
1354 vr_receive(vr_t *vrp) in vr_receive() argument
1365 for (rxp = vrp->rx.rp; ; rxp = rxp->next, n++) { in vr_receive()
1369 (void) ddi_dma_sync(vrp->rxring.handle, rxp->offset, in vr_receive()
1375 rxstat0 = ddi_get32(vrp->rxring.acchdl, &rxp->cdesc->stat0); in vr_receive()
1403 vrp->stats.mac_stat_ipackets++; in vr_receive()
1404 vrp->stats.mac_stat_rbytes += pklen; in vr_receive()
1407 vrp->stats.mac_stat_brdcstrcv++; in vr_receive()
1409 vrp->stats.mac_stat_multircv++; in vr_receive()
1422 vrp->stats.allocbfail++; in vr_receive()
1423 vrp->stats.mac_stat_norcvbuf++; in vr_receive()
1430 vrp->stats.mac_stat_ierrors++; in vr_receive()
1432 vrp->stats.ether_stat_align_errors++; in vr_receive()
1434 vrp->stats.ether_stat_fcs_errors++; in vr_receive()
1436 vrp->stats.ether_stat_toolong_errors++; in vr_receive()
1438 vrp->stats.ether_stat_tooshort_errors++; in vr_receive()
1440 vrp->stats.mac_stat_overflows++; in vr_receive()
1446 ddi_put32(vrp->rxring.acchdl, in vr_receive()
1449 (void) ddi_dma_sync(vrp->rxring.handle, in vr_receive()
1454 vrp->rx.rp = rxp; in vr_receive()
1460 if (n > 0 && vrp->chip.link.flowctrl == VR_PAUSE_BIDIRECTIONAL) { in vr_receive()
1472 VR_PUT8(vrp->acc_reg, VR_FCR0_RXBUFCOUNT, MIN(n, 0xFF)); in vr_receive()
1484 vr_t *vrp; in vr_mac_tx_enqueue_list() local
1487 vrp = (vr_t *)p; in vr_mac_tx_enqueue_list()
1488 mutex_enter(&vrp->tx.lock); in vr_mac_tx_enqueue_list()
1490 if (vrp->tx.nfree == 0) { in vr_mac_tx_enqueue_list()
1491 vrp->stats.ether_stat_defer_xmts++; in vr_mac_tx_enqueue_list()
1492 vrp->tx.resched = 1; in vr_mac_tx_enqueue_list()
1497 vr_tx_enqueue_msg(vrp, mp); in vr_mac_tx_enqueue_list()
1499 vrp->tx.nfree--; in vr_mac_tx_enqueue_list()
1501 mutex_exit(&vrp->tx.lock); in vr_mac_tx_enqueue_list()
1506 VR_PUT8(vrp->acc_reg, VR_CTRL0, VR_CTRL0_DMA_GO); in vr_mac_tx_enqueue_list()
1514 vr_tx_enqueue_msg(vr_t *vrp, mblk_t *mp) in vr_tx_enqueue_msg() argument
1528 vrp->stats.mac_stat_brdcstxmt++; in vr_tx_enqueue_msg()
1530 vrp->stats.mac_stat_multixmt++; in vr_tx_enqueue_msg()
1533 wp = vrp->tx.wp; in vr_tx_enqueue_msg()
1555 vrp->stats.mac_stat_obytes += pklen; in vr_tx_enqueue_msg()
1570 vrp->tx.intr_distance++; in vr_tx_enqueue_msg()
1571 nextp = ddi_get32(vrp->txring.acchdl, &wp->cdesc->next); in vr_tx_enqueue_msg()
1572 if (vrp->tx.intr_distance >= VR_TX_MAX_INTR_DISTANCE) { in vr_tx_enqueue_msg()
1576 vrp->tx.intr_distance = 0; in vr_tx_enqueue_msg()
1588 ddi_put32(vrp->txring.acchdl, &wp->cdesc->stat1, in vr_tx_enqueue_msg()
1590 ddi_put32(vrp->txring.acchdl, &wp->cdesc->next, nextp); in vr_tx_enqueue_msg()
1591 ddi_put32(vrp->txring.acchdl, &wp->cdesc->stat0, VR_TDES0_OWN); in vr_tx_enqueue_msg()
1592 (void) ddi_dma_sync(vrp->txring.handle, wp->offset, in vr_tx_enqueue_msg()
1599 vrp->tx.stallticks = 1; in vr_tx_enqueue_msg()
1600 vrp->tx.wp = wp->next; in vr_tx_enqueue_msg()
1607 vr_tx_reclaim(vr_t *vrp) in vr_tx_reclaim() argument
1612 ASSERT(mutex_owned(&vrp->tx.lock)); in vr_tx_reclaim()
1615 dirty = vrp->tx.ndesc - vrp->tx.nfree; in vr_tx_reclaim()
1616 for (cp = vrp->tx.cp; dirty > 0; cp = cp->next) { in vr_tx_reclaim()
1620 (void) ddi_dma_sync(vrp->txring.handle, cp->offset, in vr_tx_reclaim()
1623 stat0 = ddi_get32(vrp->txring.acchdl, &cp->cdesc->stat0); in vr_tx_reclaim()
1631 stat1 = ddi_get32(vrp->txring.acchdl, &cp->cdesc->stat1); in vr_tx_reclaim()
1634 vrp->stats.ether_stat_macxmt_errors++; in vr_tx_reclaim()
1636 vrp->stats.mac_stat_underflows++; in vr_tx_reclaim()
1638 vrp-> stats.ether_stat_ex_collisions++; in vr_tx_reclaim()
1645 VR_PUT8(vrp->acc_reg, VR_CTRL0, in vr_tx_reclaim()
1648 vrp->stats.mac_stat_opackets++; in vr_tx_reclaim()
1652 vrp->stats. in vr_tx_reclaim()
1655 vrp->stats. in vr_tx_reclaim()
1658 vrp->stats.mac_stat_collisions += in vr_tx_reclaim()
1663 vrp->stats.ether_stat_carrier_errors++; in vr_tx_reclaim()
1666 vrp->stats.ether_stat_tx_late_collisions++; in vr_tx_reclaim()
1671 vrp->tx.cp = cp; in vr_tx_reclaim()
1674 vrp->tx.nfree += freed; in vr_tx_reclaim()
1675 vrp->tx.stallticks = 0; in vr_tx_reclaim()
1676 vrp->stats.txreclaims += 1; in vr_tx_reclaim()
1678 vrp->stats.txreclaim0 += 1; in vr_tx_reclaim()
1687 vr_t *vrp; in vr_periodic() local
1689 vrp = (vr_t *)p; in vr_periodic()
1690 if (vrp->chip.state == CHIPSTATE_RUNNING && in vr_periodic()
1691 vrp->chip.link.state == VR_LINK_STATE_UP && vrp->reset == 0) { in vr_periodic()
1692 if (mutex_tryenter(&vrp->intrlock) != 0) { in vr_periodic()
1693 mutex_enter(&vrp->tx.lock); in vr_periodic()
1694 if (vrp->tx.resched == 1) { in vr_periodic()
1695 if (vrp->tx.stallticks >= VR_MAXTXCHECKS) { in vr_periodic()
1700 vrp->reset = 1; in vr_periodic()
1701 vr_log(vrp, CE_WARN, in vr_periodic()
1703 vrp->stats.txstalls++; in vr_periodic()
1709 vrp->tx.stallticks += 1; in vr_periodic()
1712 mutex_exit(&vrp->tx.lock); in vr_periodic()
1713 mutex_exit(&vrp->intrlock); in vr_periodic()
1714 vrp->stats.txchecks++; in vr_periodic()
1717 vrp->stats.cyclics++; in vr_periodic()
1724 vr_reset(vr_t *vrp) in vr_reset() argument
1735 VR_PUT8(vrp->acc_io, VR_CTRL1, VR_CTRL1_RESET); in vr_reset()
1740 VR_PUT8(vrp->acc_io, VR_MISC1, VR_MISC1_RESET); in vr_reset()
1743 } while ((VR_GET8(vrp->acc_io, VR_CTRL1) & VR_CTRL1_RESET) != 0); in vr_reset()
1749 VR_SETBIT8(vrp->acc_io, VR_PROMCTL, VR_PROMCTL_RELOAD); in vr_reset()
1756 VR_SETBIT8(vrp->acc_io, VR_CFGD, VR_CFGD_MMIOEN); in vr_reset()
1763 vr_start(vr_t *vrp) in vr_start() argument
1767 ASSERT(mutex_owned(&vrp->oplock)); in vr_start()
1772 if (vr_rxring_init(vrp) != VR_SUCCESS) { in vr_start()
1773 vr_log(vrp, CE_NOTE, "vr_rxring_init() failed"); in vr_start()
1780 if (vr_txring_init(vrp) != VR_SUCCESS) { in vr_start()
1781 vr_log(vrp, CE_NOTE, "vr_txring_init() failed"); in vr_start()
1782 vr_rxring_fini(vrp); in vr_start()
1790 pci_mode = VR_GET8(vrp->acc_reg, VR_MODE2); in vr_start()
1791 if ((vrp->chip.info.bugs & VR_BUG_NEEDMODE10T) != 0) in vr_start()
1794 if ((vrp->chip.info.bugs & VR_BUG_NEEDMODE2PCEROPT) != 0) in vr_start()
1797 if ((vrp->chip.info.features & VR_FEATURE_MRDLNMULTIPLE) != 0) in vr_start()
1799 VR_PUT8(vrp->acc_reg, VR_MODE2, pci_mode); in vr_start()
1801 pci_mode = VR_GET8(vrp->acc_reg, VR_MODE3); in vr_start()
1802 if ((vrp->chip.info.bugs & VR_BUG_NEEDMIION) != 0) in vr_start()
1804 VR_PUT8(vrp->acc_reg, VR_MODE3, pci_mode); in vr_start()
1809 VR_SETBIT8(vrp->acc_reg, VR_RXCFG, VR_RXCFG_ACCEPTBROAD); in vr_start()
1814 VR_SETBITS8(vrp->acc_reg, VR_RXCFG, VR_RXCFG_FIFO_THRESHOLD_BITS, in vr_start()
1816 VR_SETBITS8(vrp->acc_reg, VR_BCR0, VR_BCR0_RX_FIFO_THRESHOLD_BITS, in vr_start()
1822 VR_SETBITS8(vrp->acc_reg, VR_TXCFG, VR_TXCFG_FIFO_THRESHOLD_BITS, in vr_start()
1824 VR_SETBITS8(vrp->acc_reg, VR_BCR1, VR_BCR1_TX_FIFO_THRESHOLD_BITS, in vr_start()
1830 VR_SETBITS8(vrp->acc_reg, VR_BCR0, VR_BCR0_DMABITS, VR_BCR0_DMA256); in vr_start()
1837 VR_SETBIT8(vrp->acc_reg, VR_CTRL1, VR_CTRL1_NOAUTOPOLL); in vr_start()
1842 pci_latency = VR_GET8(vrp->acc_cfg, PCI_CONF_LATENCY_TIMER); in vr_start()
1844 VR_SETBIT8(vrp->acc_reg, VR_CFGB, VR_CFGB_LATENCYTIMER); in vr_start()
1846 VR_CLRBIT8(vrp->acc_reg, VR_CFGB, VR_CFGB_LATENCYTIMER); in vr_start()
1851 if ((vrp->chip.info.features & VR_FEATURE_VLANTAGGING) != 0) { in vr_start()
1852 VR_CLRBIT8(vrp->acc_reg, VR_BCR1, VR_BCR1_VLANFILTER); in vr_start()
1853 VR_CLRBIT8(vrp->acc_reg, VR_TXCFG, VR_TXCFG_8021PQ_EN); in vr_start()
1859 if ((vrp->chip.info.features & VR_FEATURE_CAMSUPPORT) != 0) { in vr_start()
1860 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_ENABLE); in vr_start()
1861 VR_PUT32(vrp->acc_reg, VR_CAM_MASK, 0); in vr_start()
1862 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_DONE); in vr_start()
1864 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, in vr_start()
1866 VR_PUT8(vrp->acc_reg, VR_VCAM0, 0); in vr_start()
1867 VR_PUT8(vrp->acc_reg, VR_VCAM1, 0); in vr_start()
1868 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_WRITE); in vr_start()
1869 VR_PUT32(vrp->acc_reg, VR_CAM_MASK, 1); in vr_start()
1871 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_DONE); in vr_start()
1878 VR_PUT32(vrp->acc_reg, VR_RXADDR, vrp->rx.rp->paddr); in vr_start()
1879 VR_PUT32(vrp->acc_reg, VR_TXADDR, vrp->tx.wp->paddr); in vr_start()
1885 VR_PUT8(vrp->acc_reg, VR_ISR1, 0xFF); in vr_start()
1886 VR_PUT8(vrp->acc_reg, VR_ICR1, 0); in vr_start()
1891 VR_PUT16(vrp->acc_reg, VR_ISR0, 0xFFFF); in vr_start()
1892 VR_PUT16(vrp->acc_reg, VR_ICR0, VR_ICR0_CFG); in vr_start()
1897 VR_PUT8(vrp->acc_reg, VR_CTRL0, VR_CTRL0_DMA_GO); in vr_start()
1903 vr_link_init(vrp); in vr_start()
1908 vrp->chip.state = CHIPSTATE_RUNNING; in vr_start()
1916 vr_stop(vr_t *vrp) in vr_stop() argument
1918 ASSERT(mutex_owned(&vrp->oplock)); in vr_stop()
1923 VR_PUT16(vrp->acc_reg, VR_ICR0, 0); in vr_stop()
1924 VR_PUT8(vrp->acc_reg, VR_ICR1, 0); in vr_stop()
1929 VR_PUT8(vrp->acc_reg, VR_CTRL0, VR_CTRL0_DMA_STOP); in vr_stop()
1934 vrp->chip.state = CHIPSTATE_STOPPED; in vr_stop()
1939 vr_rxring_fini(vrp); in vr_stop()
1940 vr_txring_fini(vrp); in vr_stop()
1947 vr_t *vrp; in vr_mac_start() local
1950 vrp = (vr_t *)p; in vr_mac_start()
1951 mutex_enter(&vrp->oplock); in vr_mac_start()
1956 vr_reset(vrp); in vr_mac_start()
1961 rc = vr_start(vrp); in vr_mac_start()
1966 vrp->periodic_id = in vr_mac_start()
1967 ddi_periodic_add(vr_periodic, vrp, VR_CHECK_INTERVAL, DDI_IPL_0); in vr_mac_start()
1969 mutex_exit(&vrp->oplock); in vr_mac_start()
1976 vr_t *vrp = p; in vr_mac_stop() local
1978 mutex_enter(&vrp->oplock); in vr_mac_stop()
1979 mutex_enter(&vrp->tx.lock); in vr_mac_stop()
1984 (void) vr_stop(vrp); in vr_mac_stop()
1985 mutex_exit(&vrp->tx.lock); in vr_mac_stop()
1990 ddi_periodic_delete(vrp->periodic_id); in vr_mac_stop()
1991 mutex_exit(&vrp->oplock); in vr_mac_stop()
2029 vr_t *vrp; in vr_mac_set_multicast() local
2037 vrp = (vr_t *)p; in vr_mac_set_multicast()
2038 mutex_enter(&vrp->oplock); in vr_mac_set_multicast()
2039 mutex_enter(&vrp->intrlock); in vr_mac_set_multicast()
2042 if ((vrp->chip.info.features & VR_FEATURE_CAMSUPPORT) != 0) { in vr_mac_set_multicast()
2046 cam_mask = VR_GET32(vrp->acc_reg, VR_CAM_MASK); in vr_mac_set_multicast()
2052 cam_index = vr_cam_index(vrp, taddr); in vr_mac_set_multicast()
2058 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, in vr_mac_set_multicast()
2060 VR_PUT8(vrp->acc_reg, VR_CAM_ADDR, cam_index); in vr_mac_set_multicast()
2061 VR_PUT32(vrp->acc_reg, VR_CAM_MASK, cam_mask); in vr_mac_set_multicast()
2063 VR_PUT8(vrp->acc_reg, in vr_mac_set_multicast()
2066 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, in vr_mac_set_multicast()
2069 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, in vr_mac_set_multicast()
2084 cam_index = vr_cam_index(vrp, mca); in vr_mac_set_multicast()
2090 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, in vr_mac_set_multicast()
2092 VR_PUT32(vrp->acc_reg, VR_CAM_MASK, cam_mask); in vr_mac_set_multicast()
2093 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, in vr_mac_set_multicast()
2126 vrp->mhash0 |= (1 << crc_index); in vr_mac_set_multicast()
2128 vrp->mhash1 |= (1 << (crc_index - 32)); in vr_mac_set_multicast()
2134 vrp->mhash0 &= ~(0 << crc_index); in vr_mac_set_multicast()
2136 vrp->mhash1 &= ~(0 << (crc_index - 32)); in vr_mac_set_multicast()
2143 if (vrp->promisc == B_FALSE) { in vr_mac_set_multicast()
2144 VR_PUT32(vrp->acc_reg, VR_MAR0, vrp->mhash0); in vr_mac_set_multicast()
2145 VR_PUT32(vrp->acc_reg, VR_MAR1, vrp->mhash1); in vr_mac_set_multicast()
2153 vrp->mcount++; in vr_mac_set_multicast()
2154 else if (vrp->mcount != 0) in vr_mac_set_multicast()
2155 vrp->mcount --; in vr_mac_set_multicast()
2156 if (vrp->mcount != 0) in vr_mac_set_multicast()
2157 VR_SETBIT8(vrp->acc_reg, VR_RXCFG, VR_RXCFG_ACCEPTMULTI); in vr_mac_set_multicast()
2159 VR_CLRBIT8(vrp->acc_reg, VR_RXCFG, VR_RXCFG_ACCEPTMULTI); in vr_mac_set_multicast()
2161 mutex_exit(&vrp->intrlock); in vr_mac_set_multicast()
2162 mutex_exit(&vrp->oplock); in vr_mac_set_multicast()
2199 vr_cam_index(vr_t *vrp, const uint8_t *maddr) in vr_cam_index() argument
2211 mask = VR_GET32(vrp->acc_reg, VR_CAM_MASK); in vr_cam_index()
2234 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_ENABLE); in vr_cam_index()
2235 VR_PUT8(vrp->acc_reg, VR_CAM_ADDR, index); in vr_cam_index()
2236 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_READ); in vr_cam_index()
2239 taddr[a] = VR_GET8(vrp->acc_reg, VR_MCAM0 + a); in vr_cam_index()
2240 VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_DONE); in vr_cam_index()
2254 vr_t *vrp; in vr_mac_set_promisc() local
2257 vrp = (vr_t *)p; in vr_mac_set_promisc()
2259 mutex_enter(&vrp->intrlock); in vr_mac_set_promisc()
2260 mutex_enter(&vrp->oplock); in vr_mac_set_promisc()
2261 mutex_enter(&vrp->tx.lock); in vr_mac_set_promisc()
2266 rxcfg = VR_GET8(vrp->acc_reg, VR_RXCFG); in vr_mac_set_promisc()
2267 vrp->promisc = promiscflag; in vr_mac_set_promisc()
2274 VR_PUT32(vrp->acc_reg, VR_MAR0, 0xffffffff); in vr_mac_set_promisc()
2275 VR_PUT32(vrp->acc_reg, VR_MAR1, 0xffffffff); in vr_mac_set_promisc()
2280 VR_PUT32(vrp->acc_reg, VR_MAR0, vrp->mhash0); in vr_mac_set_promisc()
2281 VR_PUT32(vrp->acc_reg, VR_MAR1, vrp->mhash1); in vr_mac_set_promisc()
2283 if (vrp->mcount != 0) in vr_mac_set_promisc()
2286 VR_PUT8(vrp->acc_reg, VR_RXCFG, rxcfg); in vr_mac_set_promisc()
2287 mutex_exit(&vrp->tx.lock); in vr_mac_set_promisc()
2288 mutex_exit(&vrp->oplock); in vr_mac_set_promisc()
2289 mutex_exit(&vrp->intrlock); in vr_mac_set_promisc()
2296 vr_t *vrp; in vr_mac_getstat() local
2299 vrp = (void *) arg; in vr_mac_getstat()
2306 v = (vrp->chip.mii.anadv & MII_ABILITY_100BASE_T4) != 0; in vr_mac_getstat()
2310 v = (vrp->chip.mii.anadv & MII_ABILITY_100BASE_TX_FD) != 0; in vr_mac_getstat()
2314 v = (vrp->chip.mii.anadv & MII_ABILITY_100BASE_TX) != 0; in vr_mac_getstat()
2318 v = (vrp->chip.mii.anadv & MII_ABILITY_10BASE_T_FD) != 0; in vr_mac_getstat()
2322 v = (vrp->chip.mii.anadv & MII_ABILITY_10BASE_T) != 0; in vr_mac_getstat()
2330 v = (vrp->chip.mii.control & MII_CONTROL_ANE) != 0; in vr_mac_getstat()
2334 v = (vrp->chip.mii.anadv & MII_ABILITY_PAUSE) != 0; in vr_mac_getstat()
2338 v = (vrp->chip.mii.anadv & MII_AN_ADVERT_REMFAULT) != 0; in vr_mac_getstat()
2342 v = vrp->stats.ether_stat_align_errors; in vr_mac_getstat()
2346 v = (vrp->chip.mii.status & MII_STATUS_100_BASE_T4) != 0; in vr_mac_getstat()
2350 v = (vrp->chip.mii.status & MII_STATUS_100_BASEX_FD) != 0; in vr_mac_getstat()
2354 v = (vrp->chip.mii.status & MII_STATUS_100_BASEX) != 0; in vr_mac_getstat()
2358 v = (vrp->chip.mii.status & MII_STATUS_10_FD) != 0; in vr_mac_getstat()
2362 v = (vrp->chip.mii.status & MII_STATUS_10) != 0; in vr_mac_getstat()
2370 v = (vrp->chip.mii.status & MII_STATUS_CANAUTONEG) != 0; in vr_mac_getstat()
2378 v = (vrp->chip.mii.status & MII_STATUS_REMFAULT) != 0; in vr_mac_getstat()
2386 v = vrp->stats.ether_stat_carrier_errors; in vr_mac_getstat()
2397 v = vrp->stats.ether_stat_defer_xmts; in vr_mac_getstat()
2405 v = vrp->stats.ether_stat_ex_collisions; in vr_mac_getstat()
2412 v = vrp->stats.ether_stat_fcs_errors; in vr_mac_getstat()
2419 v = vrp->stats.ether_stat_first_collisions; in vr_mac_getstat()
2427 v = (vrp->chip.mii.control & MII_CONTROL_ANE) != 0 && in vr_mac_getstat()
2428 (vrp->chip.mii.status & MII_STATUS_ANDONE) != 0; in vr_mac_getstat()
2432 v = vrp->chip.link.duplex; in vr_mac_getstat()
2436 v = vrp->chip.link.flowctrl; in vr_mac_getstat()
2440 v = (vrp->chip.mii.lpable & MII_ABILITY_100BASE_T4) != 0; in vr_mac_getstat()
2452 v = (vrp->chip.mii.lpable & MII_ABILITY_100BASE_TX_FD) != 0; in vr_mac_getstat()
2456 v = (vrp->chip.mii.lpable & MII_ABILITY_100BASE_TX) != 0; in vr_mac_getstat()
2460 v = (vrp->chip.mii.lpable & MII_ABILITY_10BASE_T_FD) != 0; in vr_mac_getstat()
2464 v = (vrp->chip.mii.lpable & MII_ABILITY_10BASE_T) != 0; in vr_mac_getstat()
2472 v = (vrp->chip.mii.anexp & MII_AN_EXP_LPCANAN) != 0; in vr_mac_getstat()
2476 v = (vrp->chip.mii.lpable & MII_ABILITY_PAUSE) != 0; in vr_mac_getstat()
2480 v = (vrp->chip.mii.status & MII_STATUS_REMFAULT) != 0; in vr_mac_getstat()
2488 v = vrp->stats.ether_stat_macrcv_errors; in vr_mac_getstat()
2496 v = vrp->stats.ether_stat_macxmt_errors; in vr_mac_getstat()
2503 v = vrp->stats.ether_stat_multi_collisions; in vr_mac_getstat()
2517 v = vrp->stats.ether_stat_toolong_errors; in vr_mac_getstat()
2521 v = vrp->stats.ether_stat_tooshort_errors; in vr_mac_getstat()
2529 v = vrp->stats.ether_stat_tx_late_collisions; in vr_mac_getstat()
2537 v = vrp->chip.phyaddr; in vr_mac_getstat()
2544 v = (vrp->chip.mii.identh << 16) | vrp->chip.mii.identl; in vr_mac_getstat()
2548 v = vrp->chip.link.mau; in vr_mac_getstat()
2552 v = vrp->stats.mac_stat_brdcstrcv; in vr_mac_getstat()
2556 v = vrp->stats.mac_stat_brdcstxmt; in vr_mac_getstat()
2560 v = vrp->stats.mac_stat_multixmt; in vr_mac_getstat()
2564 v = vrp->stats.mac_stat_collisions; in vr_mac_getstat()
2568 v = vrp->stats.mac_stat_ierrors; in vr_mac_getstat()
2572 if (vrp->chip.link.speed == VR_LINK_SPEED_100MBS) in vr_mac_getstat()
2574 else if (vrp->chip.link.speed == VR_LINK_SPEED_10MBS) in vr_mac_getstat()
2581 v = vrp->stats.mac_stat_ipackets; in vr_mac_getstat()
2585 v = vrp->stats.mac_stat_multircv; in vr_mac_getstat()
2589 vrp->stats.mac_stat_norcvbuf += in vr_mac_getstat()
2590 VR_GET16(vrp->acc_reg, VR_TALLY_MPA); in vr_mac_getstat()
2591 VR_PUT16(vrp->acc_reg, VR_TALLY_MPA, 0); in vr_mac_getstat()
2592 v = vrp->stats.mac_stat_norcvbuf; in vr_mac_getstat()
2596 v = vrp->stats.mac_stat_noxmtbuf; in vr_mac_getstat()
2600 v = vrp->stats.mac_stat_obytes; in vr_mac_getstat()
2604 v = vrp->stats.ether_stat_macxmt_errors + in vr_mac_getstat()
2605 vrp->stats.mac_stat_underflows + in vr_mac_getstat()
2606 vrp->stats.ether_stat_align_errors + in vr_mac_getstat()
2607 vrp->stats.ether_stat_carrier_errors + in vr_mac_getstat()
2608 vrp->stats.ether_stat_fcs_errors; in vr_mac_getstat()
2612 v = vrp->stats.mac_stat_opackets; in vr_mac_getstat()
2616 v = vrp->stats.mac_stat_rbytes; in vr_mac_getstat()
2626 v = vrp->stats.mac_stat_underflows; in vr_mac_getstat()
2630 v = vrp->stats.mac_stat_overflows; in vr_mac_getstat()
2640 vr_t *vrp; in vr_mac_set_ether_addr() local
2643 vrp = (vr_t *)p; in vr_mac_set_ether_addr()
2644 mutex_enter(&vrp->oplock); in vr_mac_set_ether_addr()
2645 mutex_enter(&vrp->intrlock); in vr_mac_set_ether_addr()
2651 VR_PUT8(vrp->acc_reg, VR_ETHERADDR + i, ea[i]); in vr_mac_set_ether_addr()
2653 mutex_exit(&vrp->intrlock); in vr_mac_set_ether_addr()
2654 mutex_exit(&vrp->oplock); in vr_mac_set_ether_addr()
2662 vr_link_init(vr_t *vrp) in vr_link_init() argument
2664 ASSERT(mutex_owned(&vrp->oplock)); in vr_link_init()
2665 if ((vrp->chip.mii.control & MII_CONTROL_ANE) != 0) { in vr_link_init()
2669 vrp->chip.mii.control |= MII_CONTROL_RSAN; in vr_link_init()
2674 vr_phy_write(vrp, MII_AN_ADVERT, vrp->chip.mii.anadv); in vr_link_init()
2683 if ((vrp->param.anadv_en & in vr_link_init()
2685 vrp->chip.mii.control |= MII_CONTROL_100MB; in vr_link_init()
2686 vrp->chip.mii.control |= MII_CONTROL_FDUPLEX; in vr_link_init()
2687 } else if ((vrp->param.anadv_en & in vr_link_init()
2689 vrp->chip.mii.control |= MII_CONTROL_100MB; in vr_link_init()
2690 vrp->chip.mii.control &= ~MII_CONTROL_FDUPLEX; in vr_link_init()
2691 } else if ((vrp->param.anadv_en & in vr_link_init()
2693 vrp->chip.mii.control |= MII_CONTROL_FDUPLEX; in vr_link_init()
2694 vrp->chip.mii.control &= ~MII_CONTROL_100MB; in vr_link_init()
2696 vrp->chip.mii.control &= ~MII_CONTROL_100MB; in vr_link_init()
2697 vrp->chip.mii.control &= ~MII_CONTROL_FDUPLEX; in vr_link_init()
2703 vr_phy_write(vrp, MII_CONTROL, vrp->chip.mii.control); in vr_link_init()
2709 if ((vrp->chip.mii.control & MII_CONTROL_ANE) == 0) { in vr_link_init()
2710 vr_link_state(vrp); in vr_link_init()
2711 mac_link_update(vrp->machdl, in vr_link_init()
2712 (link_state_t)vrp->chip.link.state); in vr_link_init()
2720 vr_link_state(vr_t *vrp) in vr_link_state() argument
2724 ASSERT(mutex_owned(&vrp->oplock)); in vr_link_state()
2726 vr_phy_read(vrp, MII_STATUS, &vrp->chip.mii.status); in vr_link_state()
2727 vr_phy_read(vrp, MII_CONTROL, &vrp->chip.mii.control); in vr_link_state()
2728 vr_phy_read(vrp, MII_AN_ADVERT, &vrp->chip.mii.anadv); in vr_link_state()
2729 vr_phy_read(vrp, MII_AN_LPABLE, &vrp->chip.mii.lpable); in vr_link_state()
2730 vr_phy_read(vrp, MII_AN_EXPANSION, &vrp->chip.mii.anexp); in vr_link_state()
2736 if ((vrp->chip.mii.control & MII_CONTROL_ANE) != 0) { in vr_link_state()
2737 mask = vrp->chip.mii.anadv & vrp->chip.mii.lpable; in vr_link_state()
2739 vrp->chip.link.speed = VR_LINK_SPEED_100MBS; in vr_link_state()
2740 vrp->chip.link.duplex = VR_LINK_DUPLEX_FULL; in vr_link_state()
2741 vrp->chip.link.mau = VR_MAU_100X; in vr_link_state()
2743 vrp->chip.link.speed = VR_LINK_SPEED_100MBS; in vr_link_state()
2744 vrp->chip.link.duplex = VR_LINK_DUPLEX_HALF; in vr_link_state()
2745 vrp->chip.link.mau = VR_MAU_100T4; in vr_link_state()
2747 vrp->chip.link.speed = VR_LINK_SPEED_100MBS; in vr_link_state()
2748 vrp->chip.link.duplex = VR_LINK_DUPLEX_HALF; in vr_link_state()
2749 vrp->chip.link.mau = VR_MAU_100X; in vr_link_state()
2751 vrp->chip.link.speed = VR_LINK_SPEED_10MBS; in vr_link_state()
2752 vrp->chip.link.duplex = VR_LINK_DUPLEX_FULL; in vr_link_state()
2753 vrp->chip.link.mau = VR_MAU_10; in vr_link_state()
2755 vrp->chip.link.speed = VR_LINK_SPEED_10MBS; in vr_link_state()
2756 vrp->chip.link.duplex = VR_LINK_DUPLEX_HALF; in vr_link_state()
2757 vrp->chip.link.mau = VR_MAU_10; in vr_link_state()
2759 vrp->chip.link.speed = VR_LINK_SPEED_UNKNOWN; in vr_link_state()
2760 vrp->chip.link.duplex = VR_LINK_DUPLEX_UNKNOWN; in vr_link_state()
2761 vrp->chip.link.mau = VR_MAU_UNKNOWN; in vr_link_state()
2768 vrp->chip.link.duplex == VR_LINK_DUPLEX_FULL) in vr_link_state()
2769 vrp->chip.link.flowctrl = VR_PAUSE_BIDIRECTIONAL; in vr_link_state()
2771 vrp->chip.link.flowctrl = VR_PAUSE_NONE; in vr_link_state()
2776 if ((vrp->chip.mii.status & MII_STATUS_REMFAULT) != 0) in vr_link_state()
2777 vr_log(vrp, CE_WARN, in vr_link_state()
2780 if ((vrp->chip.mii.lpable & MII_AN_ADVERT_REMFAULT) != 0) in vr_link_state()
2781 vr_log(vrp, CE_WARN, "AN remote fault caused for LP."); in vr_link_state()
2787 if ((vrp->chip.mii.control & MII_CONTROL_100MB) != 0) { in vr_link_state()
2788 vrp->chip.link.speed = VR_LINK_SPEED_100MBS; in vr_link_state()
2789 vrp->chip.link.mau = VR_MAU_100X; in vr_link_state()
2791 vrp->chip.link.speed = VR_LINK_SPEED_10MBS; in vr_link_state()
2792 vrp->chip.link.mau = VR_MAU_10; in vr_link_state()
2795 if ((vrp->chip.mii.control & MII_CONTROL_FDUPLEX) != 0) in vr_link_state()
2796 vrp->chip.link.duplex = VR_LINK_DUPLEX_FULL; in vr_link_state()
2798 vrp->chip.link.duplex = VR_LINK_DUPLEX_HALF; in vr_link_state()
2802 vrp->chip.link.flowctrl = VR_PAUSE_NONE; in vr_link_state()
2809 if (vrp->chip.link.duplex == VR_LINK_DUPLEX_FULL) { in vr_link_state()
2810 VR_SETBIT8(vrp->acc_reg, VR_CTRL1, VR_CTRL1_MACFULLDUPLEX); in vr_link_state()
2814 if ((vrp->chip.info.bugs & VR_BUG_NO_TXQUEUEING) == 0) in vr_link_state()
2815 VR_CLRBIT8(vrp->acc_reg, VR_CFGB, VR_CFGB_QPKTDIS); in vr_link_state()
2817 VR_CLRBIT8(vrp->acc_reg, VR_CTRL1, VR_CTRL1_MACFULLDUPLEX); in vr_link_state()
2822 VR_SETBIT8(vrp->acc_reg, VR_CFGB, VR_CFGB_QPKTDIS); in vr_link_state()
2828 if (vrp->chip.link.flowctrl == VR_PAUSE_BIDIRECTIONAL) { in vr_link_state()
2832 VR_SETBIT8(vrp->acc_reg, VR_MISC0, VR_MISC0_FDXRFEN); in vr_link_state()
2837 if ((vrp->chip.info.features & VR_FEATURE_TX_PAUSE_CAP) != 0) { in vr_link_state()
2845 VR_PUT8(vrp->acc_reg, VR_FCR0_RXBUFCOUNT, in vr_link_state()
2846 MIN(vrp->rx.ndesc, 0xFF) - in vr_link_state()
2847 VR_GET8(vrp->acc_reg, in vr_link_state()
2853 VR_SETBITS8(vrp->acc_reg, VR_FCR1, in vr_link_state()
2859 VR_SETBITS8(vrp->acc_reg, VR_FCR1, in vr_link_state()
2866 VR_PUT16(vrp->acc_reg, VR_FCR2_PAUSE, 0xFFFF); in vr_link_state()
2871 VR_SETBIT8(vrp->acc_reg, VR_MISC0, VR_MISC0_FDXTFEN); in vr_link_state()
2872 VR_SETBIT8(vrp->acc_reg, VR_FCR1, VR_FCR1_FD_RX_EN | in vr_link_state()
2879 VR_CLRBIT8(vrp->acc_reg, in vr_link_state()
2881 if ((vrp->chip.info.features & VR_FEATURE_TX_PAUSE_CAP) != 0) { in vr_link_state()
2882 VR_CLRBIT8(vrp->acc_reg, VR_FCR1, in vr_link_state()
2891 if ((vrp->chip.mii.status & MII_STATUS_LINKUP) != 0) in vr_link_state()
2892 vrp->chip.link.state = VR_LINK_STATE_UP; in vr_link_state()
2894 vrp->chip.link.state = VR_LINK_STATE_DOWN; in vr_link_state()
2908 vr_phy_autopoll_disable(vr_t *vrp) in vr_phy_autopoll_disable() argument
2916 if ((vrp->chip.info.bugs & VR_BUG_MIIPOLLSTOP) != 0) { in vr_phy_autopoll_disable()
2920 miicmd = VR_GET8(vrp->acc_reg, VR_MIICMD); in vr_phy_autopoll_disable()
2929 vr_log(vrp, CE_WARN, in vr_phy_autopoll_disable()
2935 miiaddr = VR_GET8(vrp->acc_reg, VR_MIIADDR); in vr_phy_autopoll_disable()
2941 VR_PUT8(vrp->acc_reg, VR_MIICMD, 0); in vr_phy_autopoll_disable()
2946 VR_PUT8(vrp->acc_reg, VR_MIICMD, 0); in vr_phy_autopoll_disable()
2955 vr_log(vrp, CE_WARN, in vr_phy_autopoll_disable()
2960 miiaddr = VR_GET8(vrp->acc_reg, VR_MIIADDR); in vr_phy_autopoll_disable()
2969 vr_phy_autopoll_enable(vr_t *vrp) in vr_phy_autopoll_enable() argument
2973 VR_PUT8(vrp->acc_reg, VR_MIICMD, 0); in vr_phy_autopoll_enable()
2974 VR_PUT8(vrp->acc_reg, VR_MIIADDR, MII_STATUS|VR_MIIADDR_MAUTO); in vr_phy_autopoll_enable()
2975 VR_PUT8(vrp->acc_reg, VR_MIICMD, VR_MIICMD_MD_AUTO); in vr_phy_autopoll_enable()
2984 vr_log(vrp, CE_NOTE, "Timeout in enable MII polling"); in vr_phy_autopoll_enable()
2988 } while ((VR_GET8(vrp->acc_reg, VR_MIIADDR) & VR_MIIADDR_MDONE) == 0); in vr_phy_autopoll_enable()
2993 VR_SETBIT8(vrp->acc_reg, VR_MIIADDR, VR_MIIADDR_MAUTO); in vr_phy_autopoll_enable()
3000 vr_phy_read(vr_t *vrp, int offset, uint16_t *value) in vr_phy_read() argument
3004 vr_phy_autopoll_disable(vrp); in vr_phy_read()
3010 VR_SETBITS8(vrp->acc_reg, VR_MIIADDR, VR_MIIADDR_BITS, offset); in vr_phy_read()
3016 VR_SETBIT8(vrp->acc_reg, VR_MIICMD, VR_MIICMD_MD_READ); in vr_phy_read()
3025 vr_log(vrp, CE_NOTE, "Timeout in MII read command"); in vr_phy_read()
3029 } while ((VR_GET8(vrp->acc_reg, VR_MIICMD) & VR_MIICMD_MD_READ) != 0); in vr_phy_read()
3031 *value = VR_GET16(vrp->acc_reg, VR_MIIDATA); in vr_phy_read()
3032 vr_phy_autopoll_enable(vrp); in vr_phy_read()
3039 vr_phy_write(vr_t *vrp, int offset, uint16_t value) in vr_phy_write() argument
3043 vr_phy_autopoll_disable(vrp); in vr_phy_write()
3048 VR_SETBITS8(vrp->acc_reg, VR_MIIADDR, VR_MIIADDR_BITS, offset); in vr_phy_write()
3053 VR_PUT16(vrp->acc_reg, VR_MIIDATA, value); in vr_phy_write()
3059 VR_SETBIT8(vrp->acc_reg, VR_MIICMD, VR_MIICMD_MD_WRITE); in vr_phy_write()
3065 vr_log(vrp, CE_NOTE, "Timeout in MII write command"); in vr_phy_write()
3069 } while ((VR_GET8(vrp->acc_reg, VR_MIICMD) & VR_MIICMD_MD_WRITE) != 0); in vr_phy_write()
3070 vr_phy_autopoll_enable(vrp); in vr_phy_write()
3096 vr_kstats_init(vr_t *vrp) in vr_kstats_init() argument
3105 ksp = kstat_create(MODULENAME, ddi_get_instance(vrp->devinfo), in vr_kstats_init()
3109 vr_log(vrp, CE_WARN, "kstat_create failed"); in vr_kstats_init()
3112 ksp->ks_private = (void*) vrp; in vr_kstats_init()
3120 vrp->ksp = ksp; in vr_kstats_init()
3126 vr_t *vrp; in vr_update_kstats() local
3129 vrp = (vr_t *)ksp->ks_private; in vr_update_kstats()
3135 (knp++)->value.ui32 = vrp->stats.allocbfail; in vr_update_kstats()
3136 (knp++)->value.ui64 = vrp->stats.intr_claimed; in vr_update_kstats()
3137 (knp++)->value.ui64 = vrp->stats.intr_unclaimed; in vr_update_kstats()
3138 (knp++)->value.ui64 = vrp->stats.linkchanges; in vr_update_kstats()
3139 (knp++)->value.ui32 = vrp->tx.nfree; in vr_update_kstats()
3140 (knp++)->value.ui32 = vrp->stats.txstalls; in vr_update_kstats()
3141 (knp++)->value.ui32 = vrp->stats.resets; in vr_update_kstats()
3142 (knp++)->value.ui64 = vrp->stats.txreclaims; in vr_update_kstats()
3143 (knp++)->value.ui64 = vrp->stats.txreclaim0; in vr_update_kstats()
3144 (knp++)->value.ui64 = vrp->stats.cyclics; in vr_update_kstats()
3145 (knp++)->value.ui64 = vrp->stats.txchecks; in vr_update_kstats()
3153 vr_remove_kstats(vr_t *vrp) in vr_remove_kstats() argument
3155 if (vrp->ksp != NULL) in vr_remove_kstats()
3156 kstat_delete(vrp->ksp); in vr_remove_kstats()
3173 vr_t *vrp; in vr_mac_getprop() local
3181 vrp = (vr_t *)arg; in vr_mac_getprop()
3191 val = (vrp->chip.mii.anadv & in vr_mac_getprop()
3196 val = (vrp->chip.mii.anadv & in vr_mac_getprop()
3201 val = (vrp->chip.mii.anadv & in vr_mac_getprop()
3206 val = (vrp->chip.mii.anadv & in vr_mac_getprop()
3211 val = (vrp->chip.mii.anadv & in vr_mac_getprop()
3216 val = (vrp->chip.mii.control & in vr_mac_getprop()
3221 val = vrp->chip.link.duplex; in vr_mac_getprop()
3225 val = (vrp->param.anadv_en & in vr_mac_getprop()
3230 val = (vrp->param.anadv_en & in vr_mac_getprop()
3235 val = (vrp->param.anadv_en & in vr_mac_getprop()
3240 val = (vrp->param.anadv_en & in vr_mac_getprop()
3245 val = (vrp->param.anadv_en & in vr_mac_getprop()
3250 val = vrp->param.an_en == VR_LINK_AUTONEG_ON; in vr_mac_getprop()
3254 val = vrp->chip.link.flowctrl; in vr_mac_getprop()
3258 val = vrp->param.mtu; in vr_mac_getprop()
3262 if (vrp->chip.link.speed == in vr_mac_getprop()
3265 else if (vrp->chip.link.speed == in vr_mac_getprop()
3273 val = vrp->chip.link.state; in vr_mac_getprop()
3300 vr_t *vrp = (vr_t *)arg; in vr_mac_propinfo() local
3320 val = (vrp->chip.mii.status & in vr_mac_propinfo()
3325 val = (vrp->chip.mii.status & in vr_mac_propinfo()
3330 val = (vrp->chip.mii.status & in vr_mac_propinfo()
3335 val = (vrp->chip.mii.status & in vr_mac_propinfo()
3340 val = (vrp->chip.mii.status & in vr_mac_propinfo()
3346 val = (vrp->chip.mii.status & in vr_mac_propinfo()
3364 perm = ((vrp->chip.mii.control & in vr_mac_propinfo()
3376 perm = ((vrp->chip.mii.control & in vr_mac_propinfo()
3405 vr_t *vrp; in vr_mac_setprop() local
3413 vrp = (vr_t *)arg; in vr_mac_setprop()
3414 mutex_enter(&vrp->oplock); in vr_mac_setprop()
3430 mutex_exit(&vrp->oplock); in vr_mac_setprop()
3437 if ((vrp->chip.mii.control & MII_CONTROL_ANE) == 0) { in vr_mac_setprop()
3439 vrp->chip.mii.control |= in vr_mac_setprop()
3442 vrp->chip.mii.control &= in vr_mac_setprop()
3452 vrp->param.anadv_en &= in vr_mac_setprop()
3455 vrp->param.anadv_en |= in vr_mac_setprop()
3461 vrp->param.anadv_en &= in vr_mac_setprop()
3464 vrp->param.anadv_en |= in vr_mac_setprop()
3470 vrp->param.anadv_en &= in vr_mac_setprop()
3473 vrp->param.anadv_en |= in vr_mac_setprop()
3479 vrp->param.anadv_en &= in vr_mac_setprop()
3482 vrp->param.anadv_en |= in vr_mac_setprop()
3488 vrp->param.anadv_en &= in vr_mac_setprop()
3491 vrp->param.anadv_en |= in vr_mac_setprop()
3498 vrp->param.an_en = VR_LINK_AUTONEG_OFF; in vr_mac_setprop()
3499 vrp->chip.mii.control &= ~MII_CONTROL_ANE; in vr_mac_setprop()
3501 vrp->param.an_en = VR_LINK_AUTONEG_ON; in vr_mac_setprop()
3502 if ((vrp->chip.mii.status & in vr_mac_setprop()
3504 vrp->chip.mii.control |= in vr_mac_setprop()
3513 vrp->param.anadv_en &= ~MII_ABILITY_PAUSE; in vr_mac_setprop()
3515 vrp->param.anadv_en |= MII_ABILITY_PAUSE; in vr_mac_setprop()
3522 vrp->param.mtu = (uint32_t)val; in vr_mac_setprop()
3529 vrp->chip.link.speed = in vr_mac_setprop()
3532 vrp->chip.link.speed = in vr_mac_setprop()
3543 vrp->chip.mii.anadv = vrp->param.anadv_en & in vr_mac_setprop()
3544 (vrp->param.an_phymask & vrp->param.an_macmask); in vr_mac_setprop()
3545 vr_link_init(vrp); in vr_mac_setprop()
3547 mutex_exit(&vrp->oplock); in vr_mac_setprop()
3573 vr_log(vr_t *vrp, int level, const char *fmt, ...) in vr_log() argument
3578 prtdata.ifname = vrp->ifname; in vr_log()