Lines Matching +full:disable +full:- +full:eop

1 /*-
2 * SPDX-License-Identifier: BSD-4-Clause
18 * 4. Neither the name of the author nor the names of any co-contributors
40 * and Rhine II PCI controllers, including the D-Link DFE530TX.
52 * receiver has a one entry perfect filter and a 64-bit hash table
257 device_printf(sc->vr_dev, "phy read timeout %d:%d\n", phy, reg); in vr_miibus_readreg()
281 device_printf(sc->vr_dev, "phy write timeout %d:%d\n", phy, in vr_miibus_writereg()
289 * 'full-duplex' and '100Mbps' bits in the netconfig register, we
302 mii = device_get_softc(sc->vr_miibus); in vr_miibus_statchg()
303 ifp = sc->vr_ifp; in vr_miibus_statchg()
308 sc->vr_flags &= ~(VR_F_LINK | VR_F_TXPAUSE); in vr_miibus_statchg()
309 if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) == in vr_miibus_statchg()
311 switch (IFM_SUBTYPE(mii->mii_media_active)) { in vr_miibus_statchg()
314 sc->vr_flags |= VR_F_LINK; in vr_miibus_statchg()
321 if ((sc->vr_flags & VR_F_LINK) != 0) { in vr_miibus_statchg()
325 lfdx = (IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0; in vr_miibus_statchg()
330 device_printf(sc->vr_dev, in vr_miibus_statchg()
331 "%s: Tx/Rx shutdown error -- " in vr_miibus_statchg()
333 sc->vr_flags |= VR_F_RESTART; in vr_miibus_statchg()
345 /* Configure flow-control. */ in vr_miibus_statchg()
346 if (sc->vr_revid >= REV_ID_VT6105_A0) { in vr_miibus_statchg()
349 if ((IFM_OPTIONS(mii->mii_media_active) & in vr_miibus_statchg()
352 if ((IFM_OPTIONS(mii->mii_media_active) & in vr_miibus_statchg()
355 sc->vr_flags |= VR_F_TXPAUSE; in vr_miibus_statchg()
358 } else if (sc->vr_revid >= REV_ID_VT6102_A) { in vr_miibus_statchg()
362 if ((IFM_OPTIONS(mii->mii_media_active) & in vr_miibus_statchg()
371 device_printf(sc->vr_dev, in vr_miibus_statchg()
372 "%s: Tx/Rx shutdown error -- resetting\n", in vr_miibus_statchg()
374 sc->vr_flags |= VR_F_RESTART; in vr_miibus_statchg()
414 /* Write CAM and wait for self-clear of VR_CAMCTL_WRITE bit. */ in vr_cam_data()
423 device_printf(sc->vr_dev, "%s: setting CAM filter timeout!\n", in vr_cam_data()
441 if (ctx->error != 0) in vr_hash_maddr_cam()
443 ctx->error = vr_cam_data(ctx->sc, VR_MCAST_CAM, mcnt, LLADDR(sdl)); in vr_hash_maddr_cam()
444 if (ctx->error != 0) { in vr_hash_maddr_cam()
445 ctx->mask = 0; in vr_hash_maddr_cam()
448 ctx->mask |= 1 << mcnt; in vr_hash_maddr_cam()
463 hashes[1] |= (1 << (h - 32)); in vr_hash_maddr()
469 * Program the 64-bit multicast hash filter.
481 ifp = sc->vr_ifp; in vr_set_filter()
499 if ((sc->vr_quirks & VR_Q_CAM) != 0) { in vr_set_filter()
513 if ((sc->vr_quirks & VR_Q_CAM) == 0 || error != 0) { in vr_set_filter()
538 if (sc->vr_revid < REV_ID_VT6102_A) { in vr_reset()
548 if (sc->vr_revid < REV_ID_VT6102_A) in vr_reset()
549 device_printf(sc->vr_dev, "reset never completed!\n"); in vr_reset()
552 device_printf(sc->vr_dev, in vr_reset()
574 for (t = vr_devs; t->vr_name != NULL; t++) in vr_match()
575 if ((pci_get_vendor(dev) == t->vr_vid) && in vr_match()
576 (pci_get_device(dev) == t->vr_did)) in vr_match()
592 device_set_desc(dev, t->vr_name); in vr_probe()
613 sc->vr_dev = dev; in vr_attach()
616 sc->vr_quirks = t->vr_quirks; in vr_attach()
617 device_printf(dev, "Quirks: 0x%x\n", sc->vr_quirks); in vr_attach()
619 mtx_init(&sc->vr_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, in vr_attach()
621 callout_init_mtx(&sc->vr_stat_callout, &sc->vr_mtx, 0); in vr_attach()
633 sc->vr_revid = pci_get_revid(dev); in vr_attach()
634 device_printf(dev, "Revision: 0x%x\n", sc->vr_revid); in vr_attach()
636 sc->vr_res_id = PCIR_BAR(0); in vr_attach()
637 sc->vr_res_type = SYS_RES_IOPORT; in vr_attach()
638 sc->vr_res = bus_alloc_resource_any(dev, sc->vr_res_type, in vr_attach()
639 &sc->vr_res_id, RF_ACTIVE); in vr_attach()
640 if (sc->vr_res == NULL) { in vr_attach()
648 sc->vr_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, in vr_attach()
651 if (sc->vr_irq == NULL) { in vr_attach()
658 ifp = sc->vr_ifp = if_alloc(IFT_ETHER); in vr_attach()
665 if_setsendqlen(ifp, VR_TX_RING_CNT - 1); in vr_attach()
668 NET_TASK_INIT(&sc->vr_inttask, 0, vr_int_task, sc); in vr_attach()
671 sc->vr_txthresh = VR_TXTHRESH_MIN; in vr_attach()
672 if (sc->vr_revid < REV_ID_VT6105_A0) { in vr_attach()
679 sc->vr_txthresh = VR_TXTHRESH_MAX; in vr_attach()
681 if ((sc->vr_quirks & VR_Q_CSUM) != 0) { in vr_attach()
688 sc->vr_txthresh = VR_TXTHRESH_MAX; in vr_attach()
691 if (sc->vr_revid >= REV_ID_VT6102_A && pci_has_pm(dev)) in vr_attach()
720 for (i = VR_TIMEOUT; i > 0; i--) { in vr_attach()
732 /* Ack intr & disable further interrupts. */ in vr_attach()
735 if (sc->vr_revid >= REV_ID_VT6102_A) in vr_attach()
738 if (sc->vr_revid < REV_ID_VT6102_A) { in vr_attach()
751 if (sc->vr_revid >= REV_ID_VT6105_LOM && in vr_attach()
752 sc->vr_revid < REV_ID_VT6105M_A0) in vr_attach()
756 /* Enable Memory-Read-Multiple. */ in vr_attach()
757 if (sc->vr_revid >= REV_ID_VT6107_A1 && in vr_attach()
758 sc->vr_revid < REV_ID_VT6105M_A0) in vr_attach()
763 /* Disable MII AUTOPOLL. */ in vr_attach()
772 if (sc->vr_revid >= REV_ID_VT6105_A0) in vr_attach()
776 error = mii_attach(dev, &sc->vr_miibus, ifp, vr_ifmedia_upd, in vr_attach()
778 sc->vr_revid >= REV_ID_VT6102_A ? MIIF_DOPAUSE : 0); in vr_attach()
794 error = bus_setup_intr(dev, sc->vr_irq, INTR_TYPE_NET | INTR_MPSAFE, in vr_attach()
795 vr_intr, NULL, sc, &sc->vr_intrhand); in vr_attach()
821 if_t ifp = sc->vr_ifp; in vr_detach()
823 KASSERT(mtx_initialized(&sc->vr_mtx), ("vr mutex not initialized")); in vr_detach()
833 sc->vr_flags |= VR_F_DETACHED; in vr_detach()
836 callout_drain(&sc->vr_stat_callout); in vr_detach()
837 taskqueue_drain(taskqueue_fast, &sc->vr_inttask); in vr_detach()
842 if (sc->vr_intrhand) in vr_detach()
843 bus_teardown_intr(dev, sc->vr_irq, sc->vr_intrhand); in vr_detach()
844 if (sc->vr_irq) in vr_detach()
845 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->vr_irq); in vr_detach()
846 if (sc->vr_res) in vr_detach()
847 bus_release_resource(dev, sc->vr_res_type, sc->vr_res_id, in vr_detach()
848 sc->vr_res); in vr_detach()
855 mtx_destroy(&sc->vr_mtx); in vr_detach()
872 ctx->vr_busaddr = segs[0].ds_addr; in vr_dmamap_cb()
886 bus_get_dma_tag(sc->vr_dev), /* parent */ in vr_dma_alloc()
896 &sc->vr_cdata.vr_parent_tag); in vr_dma_alloc()
898 device_printf(sc->vr_dev, "failed to create parent DMA tag\n"); in vr_dma_alloc()
903 sc->vr_cdata.vr_parent_tag, /* parent */ in vr_dma_alloc()
913 &sc->vr_cdata.vr_tx_ring_tag); in vr_dma_alloc()
915 device_printf(sc->vr_dev, "failed to create Tx ring DMA tag\n"); in vr_dma_alloc()
921 sc->vr_cdata.vr_parent_tag, /* parent */ in vr_dma_alloc()
931 &sc->vr_cdata.vr_rx_ring_tag); in vr_dma_alloc()
933 device_printf(sc->vr_dev, "failed to create Rx ring DMA tag\n"); in vr_dma_alloc()
937 if ((sc->vr_quirks & VR_Q_NEEDALIGN) != 0) in vr_dma_alloc()
943 sc->vr_cdata.vr_parent_tag, /* parent */ in vr_dma_alloc()
953 &sc->vr_cdata.vr_tx_tag); in vr_dma_alloc()
955 device_printf(sc->vr_dev, "failed to create Tx DMA tag\n"); in vr_dma_alloc()
961 sc->vr_cdata.vr_parent_tag, /* parent */ in vr_dma_alloc()
971 &sc->vr_cdata.vr_rx_tag); in vr_dma_alloc()
973 device_printf(sc->vr_dev, "failed to create Rx DMA tag\n"); in vr_dma_alloc()
978 error = bus_dmamem_alloc(sc->vr_cdata.vr_tx_ring_tag, in vr_dma_alloc()
979 (void **)&sc->vr_rdata.vr_tx_ring, BUS_DMA_WAITOK | in vr_dma_alloc()
980 BUS_DMA_COHERENT | BUS_DMA_ZERO, &sc->vr_cdata.vr_tx_ring_map); in vr_dma_alloc()
982 device_printf(sc->vr_dev, in vr_dma_alloc()
988 error = bus_dmamap_load(sc->vr_cdata.vr_tx_ring_tag, in vr_dma_alloc()
989 sc->vr_cdata.vr_tx_ring_map, sc->vr_rdata.vr_tx_ring, in vr_dma_alloc()
992 device_printf(sc->vr_dev, in vr_dma_alloc()
996 sc->vr_rdata.vr_tx_ring_paddr = ctx.vr_busaddr; in vr_dma_alloc()
999 error = bus_dmamem_alloc(sc->vr_cdata.vr_rx_ring_tag, in vr_dma_alloc()
1000 (void **)&sc->vr_rdata.vr_rx_ring, BUS_DMA_WAITOK | in vr_dma_alloc()
1001 BUS_DMA_COHERENT | BUS_DMA_ZERO, &sc->vr_cdata.vr_rx_ring_map); in vr_dma_alloc()
1003 device_printf(sc->vr_dev, in vr_dma_alloc()
1009 error = bus_dmamap_load(sc->vr_cdata.vr_rx_ring_tag, in vr_dma_alloc()
1010 sc->vr_cdata.vr_rx_ring_map, sc->vr_rdata.vr_rx_ring, in vr_dma_alloc()
1013 device_printf(sc->vr_dev, in vr_dma_alloc()
1017 sc->vr_rdata.vr_rx_ring_paddr = ctx.vr_busaddr; in vr_dma_alloc()
1021 txd = &sc->vr_cdata.vr_txdesc[i]; in vr_dma_alloc()
1022 txd->tx_m = NULL; in vr_dma_alloc()
1023 txd->tx_dmamap = NULL; in vr_dma_alloc()
1024 error = bus_dmamap_create(sc->vr_cdata.vr_tx_tag, 0, in vr_dma_alloc()
1025 &txd->tx_dmamap); in vr_dma_alloc()
1027 device_printf(sc->vr_dev, in vr_dma_alloc()
1033 if ((error = bus_dmamap_create(sc->vr_cdata.vr_rx_tag, 0, in vr_dma_alloc()
1034 &sc->vr_cdata.vr_rx_sparemap)) != 0) { in vr_dma_alloc()
1035 device_printf(sc->vr_dev, in vr_dma_alloc()
1040 rxd = &sc->vr_cdata.vr_rxdesc[i]; in vr_dma_alloc()
1041 rxd->rx_m = NULL; in vr_dma_alloc()
1042 rxd->rx_dmamap = NULL; in vr_dma_alloc()
1043 error = bus_dmamap_create(sc->vr_cdata.vr_rx_tag, 0, in vr_dma_alloc()
1044 &rxd->rx_dmamap); in vr_dma_alloc()
1046 device_printf(sc->vr_dev, in vr_dma_alloc()
1064 if (sc->vr_cdata.vr_tx_ring_tag) { in vr_dma_free()
1065 if (sc->vr_rdata.vr_tx_ring_paddr) in vr_dma_free()
1066 bus_dmamap_unload(sc->vr_cdata.vr_tx_ring_tag, in vr_dma_free()
1067 sc->vr_cdata.vr_tx_ring_map); in vr_dma_free()
1068 if (sc->vr_rdata.vr_tx_ring) in vr_dma_free()
1069 bus_dmamem_free(sc->vr_cdata.vr_tx_ring_tag, in vr_dma_free()
1070 sc->vr_rdata.vr_tx_ring, in vr_dma_free()
1071 sc->vr_cdata.vr_tx_ring_map); in vr_dma_free()
1072 sc->vr_rdata.vr_tx_ring = NULL; in vr_dma_free()
1073 sc->vr_rdata.vr_tx_ring_paddr = 0; in vr_dma_free()
1074 bus_dma_tag_destroy(sc->vr_cdata.vr_tx_ring_tag); in vr_dma_free()
1075 sc->vr_cdata.vr_tx_ring_tag = NULL; in vr_dma_free()
1078 if (sc->vr_cdata.vr_rx_ring_tag) { in vr_dma_free()
1079 if (sc->vr_rdata.vr_rx_ring_paddr) in vr_dma_free()
1080 bus_dmamap_unload(sc->vr_cdata.vr_rx_ring_tag, in vr_dma_free()
1081 sc->vr_cdata.vr_rx_ring_map); in vr_dma_free()
1082 if (sc->vr_rdata.vr_rx_ring) in vr_dma_free()
1083 bus_dmamem_free(sc->vr_cdata.vr_rx_ring_tag, in vr_dma_free()
1084 sc->vr_rdata.vr_rx_ring, in vr_dma_free()
1085 sc->vr_cdata.vr_rx_ring_map); in vr_dma_free()
1086 sc->vr_rdata.vr_rx_ring = NULL; in vr_dma_free()
1087 sc->vr_rdata.vr_rx_ring_paddr = 0; in vr_dma_free()
1088 bus_dma_tag_destroy(sc->vr_cdata.vr_rx_ring_tag); in vr_dma_free()
1089 sc->vr_cdata.vr_rx_ring_tag = NULL; in vr_dma_free()
1092 if (sc->vr_cdata.vr_tx_tag) { in vr_dma_free()
1094 txd = &sc->vr_cdata.vr_txdesc[i]; in vr_dma_free()
1095 if (txd->tx_dmamap) { in vr_dma_free()
1096 bus_dmamap_destroy(sc->vr_cdata.vr_tx_tag, in vr_dma_free()
1097 txd->tx_dmamap); in vr_dma_free()
1098 txd->tx_dmamap = NULL; in vr_dma_free()
1101 bus_dma_tag_destroy(sc->vr_cdata.vr_tx_tag); in vr_dma_free()
1102 sc->vr_cdata.vr_tx_tag = NULL; in vr_dma_free()
1105 if (sc->vr_cdata.vr_rx_tag) { in vr_dma_free()
1107 rxd = &sc->vr_cdata.vr_rxdesc[i]; in vr_dma_free()
1108 if (rxd->rx_dmamap) { in vr_dma_free()
1109 bus_dmamap_destroy(sc->vr_cdata.vr_rx_tag, in vr_dma_free()
1110 rxd->rx_dmamap); in vr_dma_free()
1111 rxd->rx_dmamap = NULL; in vr_dma_free()
1114 if (sc->vr_cdata.vr_rx_sparemap) { in vr_dma_free()
1115 bus_dmamap_destroy(sc->vr_cdata.vr_rx_tag, in vr_dma_free()
1116 sc->vr_cdata.vr_rx_sparemap); in vr_dma_free()
1117 sc->vr_cdata.vr_rx_sparemap = 0; in vr_dma_free()
1119 bus_dma_tag_destroy(sc->vr_cdata.vr_rx_tag); in vr_dma_free()
1120 sc->vr_cdata.vr_rx_tag = NULL; in vr_dma_free()
1123 if (sc->vr_cdata.vr_parent_tag) { in vr_dma_free()
1124 bus_dma_tag_destroy(sc->vr_cdata.vr_parent_tag); in vr_dma_free()
1125 sc->vr_cdata.vr_parent_tag = NULL; in vr_dma_free()
1140 sc->vr_cdata.vr_tx_prod = 0; in vr_tx_ring_init()
1141 sc->vr_cdata.vr_tx_cons = 0; in vr_tx_ring_init()
1142 sc->vr_cdata.vr_tx_cnt = 0; in vr_tx_ring_init()
1143 sc->vr_cdata.vr_tx_pkts = 0; in vr_tx_ring_init()
1145 rd = &sc->vr_rdata; in vr_tx_ring_init()
1146 bzero(rd->vr_tx_ring, VR_TX_RING_SIZE); in vr_tx_ring_init()
1148 if (i == VR_TX_RING_CNT - 1) in vr_tx_ring_init()
1152 rd->vr_tx_ring[i].vr_nextphys = htole32(VR_ADDR_LO(addr)); in vr_tx_ring_init()
1153 txd = &sc->vr_cdata.vr_txdesc[i]; in vr_tx_ring_init()
1154 txd->tx_m = NULL; in vr_tx_ring_init()
1157 bus_dmamap_sync(sc->vr_cdata.vr_tx_ring_tag, in vr_tx_ring_init()
1158 sc->vr_cdata.vr_tx_ring_map, in vr_tx_ring_init()
1177 sc->vr_cdata.vr_rx_cons = 0; in vr_rx_ring_init()
1179 rd = &sc->vr_rdata; in vr_rx_ring_init()
1180 bzero(rd->vr_rx_ring, VR_RX_RING_SIZE); in vr_rx_ring_init()
1182 rxd = &sc->vr_cdata.vr_rxdesc[i]; in vr_rx_ring_init()
1183 rxd->rx_m = NULL; in vr_rx_ring_init()
1184 rxd->desc = &rd->vr_rx_ring[i]; in vr_rx_ring_init()
1185 if (i == VR_RX_RING_CNT - 1) in vr_rx_ring_init()
1189 rd->vr_rx_ring[i].vr_nextphys = htole32(VR_ADDR_LO(addr)); in vr_rx_ring_init()
1194 bus_dmamap_sync(sc->vr_cdata.vr_rx_ring_tag, in vr_rx_ring_init()
1195 sc->vr_cdata.vr_rx_ring_map, in vr_rx_ring_init()
1206 desc = rxd->desc; in vr_discard_rxbuf()
1207 desc->vr_ctl = htole32(VR_RXCTL | (MCLBYTES - sizeof(uint64_t))); in vr_discard_rxbuf()
1208 desc->vr_status = htole32(VR_RXSTAT_OWN); in vr_discard_rxbuf()
1231 m->m_len = m->m_pkthdr.len = MCLBYTES; in vr_newbuf()
1234 if (bus_dmamap_load_mbuf_sg(sc->vr_cdata.vr_rx_tag, in vr_newbuf()
1235 sc->vr_cdata.vr_rx_sparemap, m, segs, &nsegs, 0) != 0) { in vr_newbuf()
1241 rxd = &sc->vr_cdata.vr_rxdesc[idx]; in vr_newbuf()
1242 if (rxd->rx_m != NULL) { in vr_newbuf()
1243 bus_dmamap_sync(sc->vr_cdata.vr_rx_tag, rxd->rx_dmamap, in vr_newbuf()
1245 bus_dmamap_unload(sc->vr_cdata.vr_rx_tag, rxd->rx_dmamap); in vr_newbuf()
1247 map = rxd->rx_dmamap; in vr_newbuf()
1248 rxd->rx_dmamap = sc->vr_cdata.vr_rx_sparemap; in vr_newbuf()
1249 sc->vr_cdata.vr_rx_sparemap = map; in vr_newbuf()
1250 bus_dmamap_sync(sc->vr_cdata.vr_rx_tag, rxd->rx_dmamap, in vr_newbuf()
1252 rxd->rx_m = m; in vr_newbuf()
1253 desc = rxd->desc; in vr_newbuf()
1254 desc->vr_data = htole32(VR_ADDR_LO(segs[0].ds_addr)); in vr_newbuf()
1255 desc->vr_ctl = htole32(VR_RXCTL | segs[0].ds_len); in vr_newbuf()
1256 desc->vr_status = htole32(VR_RXSTAT_OWN); in vr_newbuf()
1269 dst = src - 1; in vr_fixup_rx()
1271 for (i = 0; i < (m->m_len / sizeof(uint16_t) + 1); i++) in vr_fixup_rx()
1274 m->m_data -= ETHER_ALIGN; in vr_fixup_rx()
1293 ifp = sc->vr_ifp; in vr_rxeof()
1294 cons = sc->vr_cdata.vr_rx_cons; in vr_rxeof()
1297 bus_dmamap_sync(sc->vr_cdata.vr_rx_ring_tag, in vr_rxeof()
1298 sc->vr_cdata.vr_rx_ring_map, in vr_rxeof()
1304 if (sc->rxcycles <= 0) in vr_rxeof()
1306 sc->rxcycles--; in vr_rxeof()
1309 cur_rx = &sc->vr_rdata.vr_rx_ring[cons]; in vr_rxeof()
1310 rxstat = le32toh(cur_rx->vr_status); in vr_rxeof()
1311 rxctl = le32toh(cur_rx->vr_ctl); in vr_rxeof()
1316 rxd = &sc->vr_cdata.vr_rxdesc[cons]; in vr_rxeof()
1317 m = rxd->rx_m; in vr_rxeof()
1322 * it should simply get re-used next time this descriptor in vr_rxeof()
1331 sc->vr_stat.rx_errors++; in vr_rxeof()
1333 sc->vr_stat.rx_crc_errors++; in vr_rxeof()
1335 sc->vr_stat.rx_alignment++; in vr_rxeof()
1337 sc->vr_stat.rx_fifo_overflows++; in vr_rxeof()
1339 sc->vr_stat.rx_giants++; in vr_rxeof()
1341 sc->vr_stat.rx_runts++; in vr_rxeof()
1343 sc->vr_stat.rx_no_buffers++; in vr_rxeof()
1345 device_printf(sc->vr_dev, "%s: receive error = 0x%b\n", in vr_rxeof()
1354 sc->vr_stat.rx_errors++; in vr_rxeof()
1355 sc->vr_stat.rx_no_mbufs++; in vr_rxeof()
1368 total_len -= ETHER_CRC_LEN; in vr_rxeof()
1369 m->m_pkthdr.len = m->m_len = total_len; in vr_rxeof()
1372 * RX buffers must be 32-bit aligned. in vr_rxeof()
1373 * Ignore the alignment problems on the non-strict alignment in vr_rxeof()
1380 m->m_pkthdr.rcvif = ifp; in vr_rxeof()
1382 sc->vr_stat.rx_ok++; in vr_rxeof()
1386 /* Checksum is valid for non-fragmented IP packets. */ in vr_rxeof()
1387 m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED; in vr_rxeof()
1389 m->m_pkthdr.csum_flags |= CSUM_IP_VALID; in vr_rxeof()
1391 m->m_pkthdr.csum_flags |= in vr_rxeof()
1394 m->m_pkthdr.csum_data = 0xffff; in vr_rxeof()
1411 if ((sc->vr_flags & VR_F_TXPAUSE) != 0) { in vr_rxeof()
1413 prog = VR_RX_RING_CNT - 1; in vr_rxeof()
1416 sc->vr_cdata.vr_rx_cons = cons; in vr_rxeof()
1417 bus_dmamap_sync(sc->vr_cdata.vr_rx_ring_tag, in vr_rxeof()
1418 sc->vr_cdata.vr_rx_ring_map, in vr_rxeof()
1439 cons = sc->vr_cdata.vr_tx_cons; in vr_txeof()
1440 prod = sc->vr_cdata.vr_tx_prod; in vr_txeof()
1444 bus_dmamap_sync(sc->vr_cdata.vr_tx_ring_tag, in vr_txeof()
1445 sc->vr_cdata.vr_tx_ring_map, in vr_txeof()
1448 ifp = sc->vr_ifp; in vr_txeof()
1454 cur_tx = &sc->vr_rdata.vr_tx_ring[cons]; in vr_txeof()
1455 txctl = le32toh(cur_tx->vr_ctl); in vr_txeof()
1456 txstat = le32toh(cur_tx->vr_status); in vr_txeof()
1460 sc->vr_cdata.vr_tx_cnt--; in vr_txeof()
1466 txd = &sc->vr_cdata.vr_txdesc[cons]; in vr_txeof()
1467 KASSERT(txd->tx_m != NULL, ("%s: accessing NULL mbuf!\n", in vr_txeof()
1472 sc->vr_stat.tx_errors++; in vr_txeof()
1475 sc->vr_stat.tx_abort++; in vr_txeof()
1476 bus_dmamap_sync(sc->vr_cdata.vr_tx_tag, in vr_txeof()
1477 txd->tx_dmamap, BUS_DMASYNC_POSTWRITE); in vr_txeof()
1478 bus_dmamap_unload(sc->vr_cdata.vr_tx_tag, in vr_txeof()
1479 txd->tx_dmamap); in vr_txeof()
1480 m_freem(txd->tx_m); in vr_txeof()
1481 txd->tx_m = NULL; in vr_txeof()
1483 sc->vr_cdata.vr_tx_cons = cons; in vr_txeof()
1485 device_printf(sc->vr_dev, in vr_txeof()
1486 "%s: Tx shutdown error -- " in vr_txeof()
1488 sc->vr_flags |= VR_F_RESTART; in vr_txeof()
1494 if ((sc->vr_revid < REV_ID_VT3071_A && in vr_txeof()
1497 sc->vr_stat.tx_underrun++; in vr_txeof()
1499 sc->vr_cdata.vr_tx_cnt++; in vr_txeof()
1500 sc->vr_cdata.vr_tx_cons = cons; in vr_txeof()
1501 cur_tx->vr_status = htole32(VR_TXSTAT_OWN); in vr_txeof()
1502 bus_dmamap_sync(sc->vr_cdata.vr_tx_ring_tag, in vr_txeof()
1503 sc->vr_cdata.vr_tx_ring_map, in vr_txeof()
1510 sc->vr_stat.tx_collisions++; in vr_txeof()
1514 sc->vr_stat.tx_late_collisions++; in vr_txeof()
1517 sc->vr_stat.tx_ok++; in vr_txeof()
1521 bus_dmamap_sync(sc->vr_cdata.vr_tx_tag, txd->tx_dmamap, in vr_txeof()
1523 bus_dmamap_unload(sc->vr_cdata.vr_tx_tag, txd->tx_dmamap); in vr_txeof()
1524 if (sc->vr_revid < REV_ID_VT3071_A) { in vr_txeof()
1527 sc->vr_stat.tx_collisions += in vr_txeof()
1531 sc->vr_stat.tx_collisions += (txstat & 0x0f); in vr_txeof()
1533 m_freem(txd->tx_m); in vr_txeof()
1534 txd->tx_m = NULL; in vr_txeof()
1537 sc->vr_cdata.vr_tx_cons = cons; in vr_txeof()
1538 if (sc->vr_cdata.vr_tx_cnt == 0) in vr_txeof()
1539 sc->vr_watchdog_timer = 0; in vr_txeof()
1552 if ((sc->vr_flags & VR_F_RESTART) != 0) { in vr_tick()
1553 device_printf(sc->vr_dev, "restarting\n"); in vr_tick()
1554 sc->vr_stat.num_restart++; in vr_tick()
1555 if_setdrvflagbits(sc->vr_ifp, 0, IFF_DRV_RUNNING); in vr_tick()
1557 sc->vr_flags &= ~VR_F_RESTART; in vr_tick()
1560 mii = device_get_softc(sc->vr_miibus); in vr_tick()
1562 if ((sc->vr_flags & VR_F_LINK) == 0) in vr_tick()
1563 vr_miibus_statchg(sc->vr_dev); in vr_tick()
1565 callout_reset(&sc->vr_stat_callout, hz, vr_tick, sc); in vr_tick()
1598 sc->rxcycles = count; in vr_poll_locked()
1622 device_printf(sc->vr_dev, "%s: receive error : 0x%b\n", in vr_poll_locked()
1638 device_printf(sc->vr_dev, "Tx underrun -- "); in vr_tx_underrun()
1639 if (sc->vr_txthresh < VR_TXTHRESH_MAX) { in vr_tx_underrun()
1640 thresh = sc->vr_txthresh; in vr_tx_underrun()
1641 sc->vr_txthresh++; in vr_tx_underrun()
1642 if (sc->vr_txthresh >= VR_TXTHRESH_MAX) { in vr_tx_underrun()
1643 sc->vr_txthresh = VR_TXTHRESH_MAX; in vr_tx_underrun()
1646 printf("increasing Tx threshold(%d -> %d)\n", in vr_tx_underrun()
1651 sc->vr_stat.tx_underrun++; in vr_tx_underrun()
1653 device_printf(sc->vr_dev, "%s: Tx shutdown error -- " in vr_tx_underrun()
1655 sc->vr_flags |= VR_F_RESTART; in vr_tx_underrun()
1673 /* Disable interrupts. */ in vr_intr()
1676 taskqueue_enqueue(taskqueue_fast, &sc->vr_inttask); in vr_intr()
1692 if ((sc->vr_flags & VR_F_SUSPENDED) != 0) in vr_int_task()
1696 ifp = sc->vr_ifp; in vr_int_task()
1704 (sc->vr_flags & VR_F_RESTART) != 0) { in vr_int_task()
1722 device_printf(sc->vr_dev, "%s: receive error = 0x%b\n", in vr_int_task()
1736 /* Re-enable interrupts. */ in vr_int_task()
1751 sc->vr_stat.bus_errors++; in vr_error()
1752 /* Disable further interrupts. */ in vr_error()
1754 pcis = pci_read_config(sc->vr_dev, PCIR_STATUS, 2); in vr_error()
1755 device_printf(sc->vr_dev, "PCI bus error(0x%04x) -- " in vr_error()
1757 pci_write_config(sc->vr_dev, PCIR_STATUS, pcis, 2); in vr_error()
1758 sc->vr_flags |= VR_F_RESTART; in vr_error()
1767 if (sc->vr_revid >= REV_ID_VT6105M_A0) { in vr_error()
1773 device_printf(sc->vr_dev, in vr_error()
1803 if ((sc->vr_quirks & VR_Q_NEEDALIGN) != 0) { in vr_encap()
1814 * The Rhine chip doesn't auto-pad, so we have to make in vr_encap()
1818 if ((*m_head)->m_pkthdr.len < VR_MIN_FRAMELEN) { in vr_encap()
1820 padlen = VR_MIN_FRAMELEN - m->m_pkthdr.len; in vr_encap()
1831 if (m->m_next != NULL || M_TRAILINGSPACE(m) < padlen) { in vr_encap()
1843 bzero(mtod(m, char *) + m->m_pkthdr.len, padlen); in vr_encap()
1844 m->m_pkthdr.len += padlen; in vr_encap()
1845 m->m_len = m->m_pkthdr.len; in vr_encap()
1849 prod = sc->vr_cdata.vr_tx_prod; in vr_encap()
1850 txd = &sc->vr_cdata.vr_txdesc[prod]; in vr_encap()
1851 error = bus_dmamap_load_mbuf_sg(sc->vr_cdata.vr_tx_tag, txd->tx_dmamap, in vr_encap()
1861 error = bus_dmamap_load_mbuf_sg(sc->vr_cdata.vr_tx_tag, in vr_encap()
1862 txd->tx_dmamap, *m_head, txsegs, &nsegs, BUS_DMA_NOWAIT); in vr_encap()
1877 if (sc->vr_cdata.vr_tx_cnt + nsegs >= (VR_TX_RING_CNT - 1)) { in vr_encap()
1878 bus_dmamap_unload(sc->vr_cdata.vr_tx_tag, txd->tx_dmamap); in vr_encap()
1882 txd->tx_m = *m_head; in vr_encap()
1883 bus_dmamap_sync(sc->vr_cdata.vr_tx_tag, txd->tx_dmamap, in vr_encap()
1888 if (((*m_head)->m_pkthdr.csum_flags & VR_CSUM_FEATURES) != 0) { in vr_encap()
1889 if ((*m_head)->m_pkthdr.csum_flags & CSUM_IP) in vr_encap()
1891 if ((*m_head)->m_pkthdr.csum_flags & CSUM_TCP) in vr_encap()
1893 if ((*m_head)->m_pkthdr.csum_flags & CSUM_UDP) in vr_encap()
1901 * the first descriptor for a multi-fragmented frames. Without in vr_encap()
1907 desc = &sc->vr_rdata.vr_tx_ring[prod]; in vr_encap()
1908 desc->vr_status = 0; in vr_encap()
1912 desc->vr_ctl = htole32(txctl); in vr_encap()
1913 desc->vr_data = htole32(VR_ADDR_LO(txsegs[i].ds_addr)); in vr_encap()
1914 sc->vr_cdata.vr_tx_cnt++; in vr_encap()
1918 sc->vr_cdata.vr_tx_prod = prod; in vr_encap()
1920 prod = (prod + VR_TX_RING_CNT - 1) % VR_TX_RING_CNT; in vr_encap()
1921 desc = &sc->vr_rdata.vr_tx_ring[prod]; in vr_encap()
1924 * Set EOP on the last descriptor and request Tx completion in vr_encap()
1925 * interrupt for every VR_TX_INTR_THRESH-th frames. in vr_encap()
1927 VR_INC(sc->vr_cdata.vr_tx_pkts, VR_TX_INTR_THRESH); in vr_encap()
1928 if (sc->vr_cdata.vr_tx_pkts == 0) in vr_encap()
1929 desc->vr_ctl |= htole32(VR_TXCTL_LASTFRAG | VR_TXCTL_FINT); in vr_encap()
1931 desc->vr_ctl |= htole32(VR_TXCTL_LASTFRAG); in vr_encap()
1934 desc = &sc->vr_rdata.vr_tx_ring[si]; in vr_encap()
1935 desc->vr_status |= htole32(VR_TXSTAT_OWN); in vr_encap()
1938 bus_dmamap_sync(sc->vr_cdata.vr_tx_ring_tag, in vr_encap()
1939 sc->vr_cdata.vr_tx_ring_map, in vr_encap()
1968 IFF_DRV_RUNNING || (sc->vr_flags & VR_F_LINK) == 0) in vr_start_locked()
1972 sc->vr_cdata.vr_tx_cnt < VR_TX_RING_CNT - 2; ) { in vr_start_locked()
2001 sc->vr_watchdog_timer = 5; in vr_start_locked()
2026 ifp = sc->vr_ifp; in vr_init_locked()
2027 mii = device_get_softc(sc->vr_miibus); in vr_init_locked()
2038 CSR_WRITE_1(sc, VR_PAR0 + i, if_getlladdr(sc->vr_ifp)[i]); in vr_init_locked()
2052 VR_SETBIT(sc, VR_BCR1, vr_tx_threshold_tables[sc->vr_txthresh].bcr_cfg); in vr_init_locked()
2058 VR_SETBIT(sc, VR_TXCFG, vr_tx_threshold_tables[sc->vr_txthresh].tx_cfg); in vr_init_locked()
2062 device_printf(sc->vr_dev, in vr_init_locked()
2071 if ((sc->vr_quirks & VR_Q_CAM) != 0) { in vr_init_locked()
2074 /* Disable VLAN hardware tag insertion/stripping. */ in vr_init_locked()
2076 /* Disable VLAN hardware filtering. */ in vr_init_locked()
2078 /* Disable all CAM entries. */ in vr_init_locked()
2101 /* Default : full-duplex, no Tx poll. */ in vr_init_locked()
2104 /* Set flow-control parameters for Rhine III. */ in vr_init_locked()
2105 if (sc->vr_revid >= REV_ID_VT6105_A0) { in vr_init_locked()
2120 * to the number of total RX buffers - 1 before in vr_init_locked()
2125 CSR_WRITE_1(sc, VR_FLOWCR0, VR_RX_RING_CNT - 1); in vr_init_locked()
2143 * Disable interrupts if we are polling. in vr_init_locked()
2150 * Enable interrupts and disable MII intrs. in vr_init_locked()
2153 if (sc->vr_revid > REV_ID_VT6102_A) in vr_init_locked()
2159 sc->vr_flags &= ~(VR_F_LINK | VR_F_TXPAUSE); in vr_init_locked()
2162 callout_reset(&sc->vr_stat_callout, hz, vr_tick, sc); in vr_init_locked()
2178 mii = device_get_softc(sc->vr_miibus); in vr_ifmedia_upd()
2179 LIST_FOREACH(miisc, &mii->mii_phys, mii_list) in vr_ifmedia_upd()
2181 sc->vr_flags &= ~(VR_F_LINK | VR_F_TXPAUSE); in vr_ifmedia_upd()
2198 mii = device_get_softc(sc->vr_miibus); in vr_ifmedia_sts()
2205 ifmr->ifm_active = mii->mii_media_active; in vr_ifmedia_sts()
2206 ifmr->ifm_status = mii->mii_media_status; in vr_ifmedia_sts()
2227 if ((if_getflags(ifp) ^ sc->vr_if_flags) & in vr_ioctl()
2231 if ((sc->vr_flags & VR_F_DETACHED) == 0) in vr_ioctl()
2238 sc->vr_if_flags = if_getflags(ifp); in vr_ioctl()
2249 mii = device_get_softc(sc->vr_miibus); in vr_ioctl()
2250 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command); in vr_ioctl()
2253 mask = ifr->ifr_reqcap ^ if_getcapenable(ifp); in vr_ioctl()
2256 if (ifr->ifr_reqcap & IFCAP_POLLING) { in vr_ioctl()
2261 /* Disable interrupts. */ in vr_ioctl()
2308 if (sc->vr_watchdog_timer == 0 || --sc->vr_watchdog_timer) in vr_watchdog()
2311 ifp = sc->vr_ifp; in vr_watchdog()
2316 if (sc->vr_cdata.vr_tx_cnt == 0) in vr_watchdog()
2319 if ((sc->vr_flags & VR_F_LINK) == 0) { in vr_watchdog()
2321 if_printf(sc->vr_ifp, "watchdog timeout " in vr_watchdog()
2347 addr = VR_TX_RING_ADDR(sc, sc->vr_cdata.vr_tx_cons); in vr_tx_start()
2352 if (sc->vr_cdata.vr_tx_cnt != 0) { in vr_tx_start()
2353 sc->vr_watchdog_timer = 5; in vr_tx_start()
2366 addr = VR_RX_RING_ADDR(sc, sc->vr_cdata.vr_rx_cons); in vr_rx_start()
2384 for (i = VR_TIMEOUT; i > 0; i--) { in vr_tx_stop()
2406 for (i = VR_TIMEOUT; i > 0; i--) { in vr_rx_stop()
2432 ifp = sc->vr_ifp; in vr_stop()
2433 sc->vr_watchdog_timer = 0; in vr_stop()
2435 callout_stop(&sc->vr_stat_callout); in vr_stop()
2440 device_printf(sc->vr_dev, "%s: Rx shutdown error\n", __func__); in vr_stop()
2442 device_printf(sc->vr_dev, "%s: Tx shutdown error\n", __func__); in vr_stop()
2453 rxd = &sc->vr_cdata.vr_rxdesc[i]; in vr_stop()
2454 if (rxd->rx_m != NULL) { in vr_stop()
2455 bus_dmamap_sync(sc->vr_cdata.vr_rx_tag, in vr_stop()
2456 rxd->rx_dmamap, BUS_DMASYNC_POSTREAD); in vr_stop()
2457 bus_dmamap_unload(sc->vr_cdata.vr_rx_tag, in vr_stop()
2458 rxd->rx_dmamap); in vr_stop()
2459 m_freem(rxd->rx_m); in vr_stop()
2460 rxd->rx_m = NULL; in vr_stop()
2464 txd = &sc->vr_cdata.vr_txdesc[i]; in vr_stop()
2465 if (txd->tx_m != NULL) { in vr_stop()
2466 bus_dmamap_sync(sc->vr_cdata.vr_tx_tag, in vr_stop()
2467 txd->tx_dmamap, BUS_DMASYNC_POSTWRITE); in vr_stop()
2468 bus_dmamap_unload(sc->vr_cdata.vr_tx_tag, in vr_stop()
2469 txd->tx_dmamap); in vr_stop()
2470 m_freem(txd->tx_m); in vr_stop()
2471 txd->tx_m = NULL; in vr_stop()
2497 sc->vr_flags |= VR_F_SUSPENDED; in vr_suspend()
2512 ifp = sc->vr_ifp; in vr_resume()
2518 sc->vr_flags &= ~VR_F_SUSPENDED; in vr_resume()
2532 if (sc->vr_revid < REV_ID_VT6102_A || in vr_setwol()
2533 !pci_has_pm(sc->vr_dev)) in vr_setwol()
2536 ifp = sc->vr_ifp; in vr_setwol()
2543 if (sc->vr_revid > REV_ID_VT6105_B0) { in vr_setwol()
2573 pci_enable_pme(sc->vr_dev); in vr_setwol()
2583 if (sc->vr_revid < REV_ID_VT6102_A) in vr_clrwol()
2597 if (sc->vr_revid > REV_ID_VT6105_B0) { in vr_clrwol()
2613 result = -1; in vr_sysctl_stats()
2616 if (error != 0 || req->newptr == NULL) in vr_sysctl_stats()
2621 stat = &sc->vr_stat; in vr_sysctl_stats()
2623 printf("%s statistics:\n", device_get_nameunit(sc->vr_dev)); in vr_sysctl_stats()
2625 (uintmax_t)stat->tx_ok); in vr_sysctl_stats()
2627 (uintmax_t)stat->rx_ok); in vr_sysctl_stats()
2628 printf("Outbound errors : %u\n", stat->tx_errors); in vr_sysctl_stats()
2629 printf("Inbound errors : %u\n", stat->rx_errors); in vr_sysctl_stats()
2630 printf("Inbound no buffers : %u\n", stat->rx_no_buffers); in vr_sysctl_stats()
2631 printf("Inbound no mbuf clusters: %d\n", stat->rx_no_mbufs); in vr_sysctl_stats()
2633 stat->rx_fifo_overflows); in vr_sysctl_stats()
2634 printf("Inbound CRC errors : %u\n", stat->rx_crc_errors); in vr_sysctl_stats()
2636 stat->rx_alignment); in vr_sysctl_stats()
2637 printf("Inbound giant frames : %u\n", stat->rx_giants); in vr_sysctl_stats()
2638 printf("Inbound runt frames : %u\n", stat->rx_runts); in vr_sysctl_stats()
2640 stat->tx_abort); in vr_sysctl_stats()
2641 printf("Outbound collisions : %u\n", stat->tx_collisions); in vr_sysctl_stats()
2643 stat->tx_late_collisions); in vr_sysctl_stats()
2644 printf("Outbound underrun : %u\n", stat->tx_underrun); in vr_sysctl_stats()
2645 printf("PCI bus errors : %u\n", stat->bus_errors); in vr_sysctl_stats()
2647 stat->num_restart); in vr_sysctl_stats()