Lines Matching +full:timeout +full:- +full:pwr +full:- +full:ms

3 /*-
4 * Copyright (c) 2006 Shigeaki Tagashira <shigeaki@se.hiroshima-u.ac.jp>
136 device_printf((sc)->nfe_dev, __VA_ARGS__); \
140 device_printf((sc)->nfe_dev, __VA_ARGS__); \
147 #define NFE_LOCK(_sc) mtx_lock(&(_sc)->nfe_mtx)
148 #define NFE_UNLOCK(_sc) mtx_unlock(&(_sc)->nfe_mtx)
149 #define NFE_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->nfe_mtx, MA_OWNED)
277 while (t->name != NULL) { in nfe_probe()
278 if ((pci_get_vendor(dev) == t->vid_id) && in nfe_probe()
279 (pci_get_device(dev) == t->dev_id)) { in nfe_probe()
280 device_set_desc(dev, t->name); in nfe_probe()
295 sc->nfe_msix_res = bus_alloc_resource_any(sc->nfe_dev, SYS_RES_MEMORY, in nfe_alloc_msix()
297 if (sc->nfe_msix_res == NULL) { in nfe_alloc_msix()
298 device_printf(sc->nfe_dev, in nfe_alloc_msix()
303 sc->nfe_msix_pba_res = bus_alloc_resource_any(sc->nfe_dev, in nfe_alloc_msix()
305 if (sc->nfe_msix_pba_res == NULL) { in nfe_alloc_msix()
306 device_printf(sc->nfe_dev, in nfe_alloc_msix()
308 bus_release_resource(sc->nfe_dev, SYS_RES_MEMORY, PCIR_BAR(2), in nfe_alloc_msix()
309 sc->nfe_msix_res); in nfe_alloc_msix()
310 sc->nfe_msix_res = NULL; in nfe_alloc_msix()
314 if (pci_alloc_msix(sc->nfe_dev, &count) == 0) { in nfe_alloc_msix()
317 device_printf(sc->nfe_dev, in nfe_alloc_msix()
319 sc->nfe_msix = 1; in nfe_alloc_msix()
322 device_printf(sc->nfe_dev, in nfe_alloc_msix()
324 pci_release_msi(sc->nfe_dev); in nfe_alloc_msix()
325 bus_release_resource(sc->nfe_dev, SYS_RES_MEMORY, in nfe_alloc_msix()
326 PCIR_BAR(3), sc->nfe_msix_pba_res); in nfe_alloc_msix()
327 bus_release_resource(sc->nfe_dev, SYS_RES_MEMORY, in nfe_alloc_msix()
328 PCIR_BAR(2), sc->nfe_msix_res); in nfe_alloc_msix()
329 sc->nfe_msix_pba_res = NULL; in nfe_alloc_msix()
330 sc->nfe_msix_res = NULL; in nfe_alloc_msix()
339 static const char *product = "K9N6PGM2-V2 (MS-7309)"; in nfe_detect_msik9()
367 sc->nfe_dev = dev; in nfe_attach()
369 mtx_init(&sc->nfe_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, in nfe_attach()
371 callout_init_mtx(&sc->nfe_stat_ch, &sc->nfe_mtx, 0); in nfe_attach()
376 sc->nfe_res[0] = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, in nfe_attach()
378 if (sc->nfe_res[0] == NULL) { in nfe_attach()
380 mtx_destroy(&sc->nfe_mtx); in nfe_attach()
400 device_printf(sc->nfe_dev, in nfe_attach()
406 device_printf(sc->nfe_dev, in nfe_attach()
407 "MSI/MSI-X capability black-listed, will use INTx\n"); in nfe_attach()
417 if (msi_disable == 0 && sc->nfe_msix == 0 && in nfe_attach()
424 sc->nfe_msi = 1; in nfe_attach()
430 if (sc->nfe_msix == 0 && sc->nfe_msi == 0) { in nfe_attach()
432 sc->nfe_irq[0] = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, in nfe_attach()
434 if (sc->nfe_irq[0] == NULL) { in nfe_attach()
441 sc->nfe_irq[i] = bus_alloc_resource_any(dev, in nfe_attach()
443 if (sc->nfe_irq[i] == NULL) { in nfe_attach()
452 if (sc->nfe_msix != 0) { in nfe_attach()
455 } else if (sc->nfe_msi != 0) { in nfe_attach()
462 sc->nfe_irq_status = NFE_IRQ_STATUS; in nfe_attach()
463 sc->nfe_irq_mask = NFE_IRQ_MASK; in nfe_attach()
464 sc->nfe_intrs = NFE_IRQ_WANTED; in nfe_attach()
465 sc->nfe_nointrs = 0; in nfe_attach()
466 if (sc->nfe_msix != 0) { in nfe_attach()
467 sc->nfe_irq_status = NFE_MSIX_IRQ_STATUS; in nfe_attach()
468 sc->nfe_nointrs = NFE_IRQ_WANTED; in nfe_attach()
469 } else if (sc->nfe_msi != 0) { in nfe_attach()
470 sc->nfe_irq_mask = NFE_MSI_IRQ_MASK; in nfe_attach()
471 sc->nfe_intrs = NFE_MSI_VECTOR_0_ENABLED; in nfe_attach()
474 sc->nfe_devid = pci_get_device(dev); in nfe_attach()
475 sc->nfe_revid = pci_get_revid(dev); in nfe_attach()
476 sc->nfe_flags = 0; in nfe_attach()
478 switch (sc->nfe_devid) { in nfe_attach()
483 sc->nfe_flags |= NFE_JUMBO_SUP | NFE_HW_CSUM; in nfe_attach()
487 sc->nfe_flags |= NFE_40BIT_ADDR | NFE_PWR_MGMT | NFE_MIB_V1; in nfe_attach()
493 sc->nfe_flags |= NFE_JUMBO_SUP | NFE_40BIT_ADDR | NFE_HW_CSUM | in nfe_attach()
498 sc->nfe_flags |= NFE_JUMBO_SUP | NFE_40BIT_ADDR | NFE_HW_CSUM | in nfe_attach()
514 sc->nfe_flags |= NFE_40BIT_ADDR | NFE_PWR_MGMT | in nfe_attach()
522 sc->nfe_flags |= NFE_40BIT_ADDR | NFE_HW_CSUM | NFE_PWR_MGMT | in nfe_attach()
531 sc->nfe_flags |= NFE_JUMBO_SUP | NFE_40BIT_ADDR | NFE_HW_CSUM | in nfe_attach()
538 sc->nfe_flags |= NFE_JUMBO_SUP | NFE_40BIT_ADDR | in nfe_attach()
547 sc->nfe_flags |= NFE_CORRECT_MACADDR; in nfe_attach()
548 nfe_get_macaddr(sc, sc->eaddr); in nfe_attach()
553 if ((sc->nfe_flags & NFE_40BIT_ADDR) != 0) in nfe_attach()
556 bus_get_dma_tag(sc->nfe_dev), /* parent */ in nfe_attach()
565 &sc->nfe_parent_tag); in nfe_attach()
569 ifp = sc->nfe_ifp = if_gethandle(IFT_ETHER); in nfe_attach()
574 if ((error = nfe_alloc_tx_ring(sc, &sc->txq)) != 0) in nfe_attach()
577 if ((error = nfe_alloc_rx_ring(sc, &sc->rxq)) != 0) in nfe_attach()
580 nfe_alloc_jrx_ring(sc, &sc->jrxq); in nfe_attach()
592 if_setsendqlen(ifp, NFE_TX_RING_COUNT - 1); in nfe_attach()
595 if (sc->nfe_flags & NFE_HW_CSUM) { in nfe_attach()
601 sc->nfe_framesize = if_getmtu(ifp) + NFE_RX_HEADERS; in nfe_attach()
604 if ((sc->nfe_flags & NFE_HW_VLAN) != 0) { in nfe_attach()
628 if (sc->nfe_devid == PCI_PRODUCT_NVIDIA_MCP61_LAN1 || in nfe_attach()
629 sc->nfe_devid == PCI_PRODUCT_NVIDIA_MCP61_LAN2 || in nfe_attach()
630 sc->nfe_devid == PCI_PRODUCT_NVIDIA_MCP61_LAN3 || in nfe_attach()
631 sc->nfe_devid == PCI_PRODUCT_NVIDIA_MCP61_LAN4) { in nfe_attach()
635 error = mii_attach(dev, &sc->nfe_miibus, ifp, in nfe_attach()
642 ether_ifattach(ifp, sc->eaddr); in nfe_attach()
644 NET_TASK_INIT(&sc->nfe_int_task, 0, nfe_int_task, sc); in nfe_attach()
645 sc->nfe_tq = taskqueue_create_fast("nfe_taskq", M_WAITOK, in nfe_attach()
646 taskqueue_thread_enqueue, &sc->nfe_tq); in nfe_attach()
647 taskqueue_start_threads(&sc->nfe_tq, 1, PI_NET, "%s taskq", in nfe_attach()
648 device_get_nameunit(sc->nfe_dev)); in nfe_attach()
650 if (sc->nfe_msi == 0 && sc->nfe_msix == 0) { in nfe_attach()
651 error = bus_setup_intr(dev, sc->nfe_irq[0], in nfe_attach()
653 &sc->nfe_intrhand[0]); in nfe_attach()
656 error = bus_setup_intr(dev, sc->nfe_irq[i], in nfe_attach()
658 &sc->nfe_intrhand[i]); in nfe_attach()
665 taskqueue_free(sc->nfe_tq); in nfe_attach()
666 sc->nfe_tq = NULL; in nfe_attach()
687 KASSERT(mtx_initialized(&sc->nfe_mtx), ("nfe mutex not initialized")); in nfe_detach()
688 ifp = sc->nfe_ifp; in nfe_detach()
699 callout_drain(&sc->nfe_stat_ch); in nfe_detach()
705 if ((sc->nfe_flags & NFE_CORRECT_MACADDR) == 0) { in nfe_detach()
707 eaddr[i] = sc->eaddr[5 - i]; in nfe_detach()
710 bcopy(sc->eaddr, eaddr, ETHER_ADDR_LEN); in nfe_detach()
715 if (sc->nfe_tq != NULL) { in nfe_detach()
716 taskqueue_drain(sc->nfe_tq, &sc->nfe_int_task); in nfe_detach()
717 taskqueue_free(sc->nfe_tq); in nfe_detach()
718 sc->nfe_tq = NULL; in nfe_detach()
722 if (sc->nfe_intrhand[i] != NULL) { in nfe_detach()
723 bus_teardown_intr(dev, sc->nfe_irq[i], in nfe_detach()
724 sc->nfe_intrhand[i]); in nfe_detach()
725 sc->nfe_intrhand[i] = NULL; in nfe_detach()
729 if (sc->nfe_msi == 0 && sc->nfe_msix == 0) { in nfe_detach()
730 if (sc->nfe_irq[0] != NULL) in nfe_detach()
732 sc->nfe_irq[0]); in nfe_detach()
735 if (sc->nfe_irq[i] != NULL) { in nfe_detach()
737 sc->nfe_irq[i]); in nfe_detach()
738 sc->nfe_irq[i] = NULL; in nfe_detach()
743 if (sc->nfe_msix_pba_res != NULL) { in nfe_detach()
745 sc->nfe_msix_pba_res); in nfe_detach()
746 sc->nfe_msix_pba_res = NULL; in nfe_detach()
748 if (sc->nfe_msix_res != NULL) { in nfe_detach()
750 sc->nfe_msix_res); in nfe_detach()
751 sc->nfe_msix_res = NULL; in nfe_detach()
753 if (sc->nfe_res[0] != NULL) { in nfe_detach()
755 sc->nfe_res[0]); in nfe_detach()
756 sc->nfe_res[0] = NULL; in nfe_detach()
759 nfe_free_tx_ring(sc, &sc->txq); in nfe_detach()
760 nfe_free_rx_ring(sc, &sc->rxq); in nfe_detach()
761 nfe_free_jrx_ring(sc, &sc->jrxq); in nfe_detach()
763 if (sc->nfe_parent_tag) { in nfe_detach()
764 bus_dma_tag_destroy(sc->nfe_parent_tag); in nfe_detach()
765 sc->nfe_parent_tag = NULL; in nfe_detach()
768 mtx_destroy(&sc->nfe_mtx); in nfe_detach()
781 nfe_stop(sc->nfe_ifp); in nfe_suspend()
783 sc->nfe_suspended = 1; in nfe_suspend()
799 ifp = sc->nfe_ifp; in nfe_resume()
802 sc->nfe_suspended = 0; in nfe_resume()
815 { "ASUSTeK Computer INC.", "P5N32-SLI PREMIUM" } in nfe_can_use_msix()
824 * to see this system has a known MSI/MSI-X issue. in nfe_can_use_msix()
833 if (strcmp(maker, mblp->maker) == 0 && in nfe_can_use_msix()
834 strcmp(product, mblp->product) == 0) { in nfe_can_use_msix()
853 uint32_t pwr; in nfe_power() local
855 if ((sc->nfe_flags & NFE_PWR_MGMT) == 0) in nfe_power()
863 pwr = NFE_READ(sc, NFE_PWR2_CTL); in nfe_power()
864 pwr &= ~NFE_PWR2_WAKEUP_MASK; in nfe_power()
865 if (sc->nfe_revid >= 0xa3 && in nfe_power()
866 (sc->nfe_devid == PCI_PRODUCT_NVIDIA_NFORCE430_LAN1 || in nfe_power()
867 sc->nfe_devid == PCI_PRODUCT_NVIDIA_NFORCE430_LAN2)) in nfe_power()
868 pwr |= NFE_PWR2_REVA3; in nfe_power()
869 NFE_WRITE(sc, NFE_PWR2_CTL, pwr); in nfe_power()
882 mii = device_get_softc(sc->nfe_miibus); in nfe_miibus_statchg()
883 ifp = sc->nfe_ifp; in nfe_miibus_statchg()
885 sc->nfe_link = 0; in nfe_miibus_statchg()
886 if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) == in nfe_miibus_statchg()
888 switch (IFM_SUBTYPE(mii->mii_media_active)) { in nfe_miibus_statchg()
892 sc->nfe_link = 1; in nfe_miibus_statchg()
902 if (sc->nfe_link != 0 && (if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) { in nfe_miibus_statchg()
930 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) == 0) { in nfe_mac_config()
931 phy |= NFE_PHY_HDX; /* half-duplex */ in nfe_mac_config()
935 switch (IFM_SUBTYPE(mii->mii_media_active)) { in nfe_mac_config()
936 case IFM_1000_T: /* full-duplex only */ in nfe_mac_config()
953 if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T) in nfe_mac_config()
967 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) { in nfe_mac_config()
970 if ((IFM_OPTIONS(mii->mii_media_active) & in nfe_mac_config()
976 if ((sc->nfe_flags & NFE_TX_FLOW_CTRL) != 0) { in nfe_mac_config()
978 if ((IFM_OPTIONS(mii->mii_media_active) & in nfe_mac_config()
995 if ((sc->nfe_flags & NFE_TX_FLOW_CTRL) != 0) { in nfe_mac_config()
1027 DPRINTFN(sc, 2, "timeout waiting for PHY\n"); in nfe_miibus_readreg()
1038 sc->mii_phyaddr = phy; in nfe_miibus_readreg()
1070 device_printf(sc->nfe_dev, "could not write to PHY\n"); in nfe_miibus_writereg()
1087 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_alloc_rx_ring()
1088 desc = ring->desc64; in nfe_alloc_rx_ring()
1091 desc = ring->desc32; in nfe_alloc_rx_ring()
1095 ring->cur = ring->next = 0; in nfe_alloc_rx_ring()
1097 error = bus_dma_tag_create(sc->nfe_parent_tag, in nfe_alloc_rx_ring()
1106 &ring->rx_desc_tag); in nfe_alloc_rx_ring()
1108 device_printf(sc->nfe_dev, "could not create desc DMA tag\n"); in nfe_alloc_rx_ring()
1113 error = bus_dmamem_alloc(ring->rx_desc_tag, &desc, BUS_DMA_WAITOK | in nfe_alloc_rx_ring()
1114 BUS_DMA_COHERENT | BUS_DMA_ZERO, &ring->rx_desc_map); in nfe_alloc_rx_ring()
1116 device_printf(sc->nfe_dev, "could not create desc DMA map\n"); in nfe_alloc_rx_ring()
1119 if (sc->nfe_flags & NFE_40BIT_ADDR) in nfe_alloc_rx_ring()
1120 ring->desc64 = desc; in nfe_alloc_rx_ring()
1122 ring->desc32 = desc; in nfe_alloc_rx_ring()
1126 error = bus_dmamap_load(ring->rx_desc_tag, ring->rx_desc_map, desc, in nfe_alloc_rx_ring()
1129 device_printf(sc->nfe_dev, "could not load desc DMA map\n"); in nfe_alloc_rx_ring()
1132 ring->physaddr = ctx.nfe_busaddr; in nfe_alloc_rx_ring()
1134 error = bus_dma_tag_create(sc->nfe_parent_tag, in nfe_alloc_rx_ring()
1143 &ring->rx_data_tag); in nfe_alloc_rx_ring()
1145 device_printf(sc->nfe_dev, "could not create Rx DMA tag\n"); in nfe_alloc_rx_ring()
1149 error = bus_dmamap_create(ring->rx_data_tag, 0, &ring->rx_spare_map); in nfe_alloc_rx_ring()
1151 device_printf(sc->nfe_dev, in nfe_alloc_rx_ring()
1157 * Pre-allocate Rx buffers and populate Rx ring. in nfe_alloc_rx_ring()
1160 data = &sc->rxq.data[i]; in nfe_alloc_rx_ring()
1161 data->rx_data_map = NULL; in nfe_alloc_rx_ring()
1162 data->m = NULL; in nfe_alloc_rx_ring()
1163 error = bus_dmamap_create(ring->rx_data_tag, 0, in nfe_alloc_rx_ring()
1164 &data->rx_data_map); in nfe_alloc_rx_ring()
1166 device_printf(sc->nfe_dev, in nfe_alloc_rx_ring()
1184 if ((sc->nfe_flags & NFE_JUMBO_SUP) == 0) in nfe_alloc_jrx_ring()
1187 device_printf(sc->nfe_dev, "disabling jumbo frame support\n"); in nfe_alloc_jrx_ring()
1188 sc->nfe_jumbo_disable = 1; in nfe_alloc_jrx_ring()
1192 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_alloc_jrx_ring()
1193 desc = ring->jdesc64; in nfe_alloc_jrx_ring()
1196 desc = ring->jdesc32; in nfe_alloc_jrx_ring()
1200 ring->jcur = ring->jnext = 0; in nfe_alloc_jrx_ring()
1203 error = bus_dma_tag_create(sc->nfe_parent_tag, in nfe_alloc_jrx_ring()
1213 &ring->jrx_desc_tag); in nfe_alloc_jrx_ring()
1215 device_printf(sc->nfe_dev, in nfe_alloc_jrx_ring()
1221 error = bus_dma_tag_create(sc->nfe_parent_tag, in nfe_alloc_jrx_ring()
1231 &ring->jrx_data_tag); in nfe_alloc_jrx_ring()
1233 device_printf(sc->nfe_dev, in nfe_alloc_jrx_ring()
1239 error = bus_dmamem_alloc(ring->jrx_desc_tag, &desc, BUS_DMA_WAITOK | in nfe_alloc_jrx_ring()
1240 BUS_DMA_COHERENT | BUS_DMA_ZERO, &ring->jrx_desc_map); in nfe_alloc_jrx_ring()
1242 device_printf(sc->nfe_dev, in nfe_alloc_jrx_ring()
1246 if (sc->nfe_flags & NFE_40BIT_ADDR) in nfe_alloc_jrx_ring()
1247 ring->jdesc64 = desc; in nfe_alloc_jrx_ring()
1249 ring->jdesc32 = desc; in nfe_alloc_jrx_ring()
1252 error = bus_dmamap_load(ring->jrx_desc_tag, ring->jrx_desc_map, desc, in nfe_alloc_jrx_ring()
1255 device_printf(sc->nfe_dev, in nfe_alloc_jrx_ring()
1259 ring->jphysaddr = ctx.nfe_busaddr; in nfe_alloc_jrx_ring()
1262 error = bus_dmamap_create(ring->jrx_data_tag, 0, &ring->jrx_spare_map); in nfe_alloc_jrx_ring()
1264 device_printf(sc->nfe_dev, in nfe_alloc_jrx_ring()
1270 data = &sc->jrxq.jdata[i]; in nfe_alloc_jrx_ring()
1271 data->rx_data_map = NULL; in nfe_alloc_jrx_ring()
1272 data->m = NULL; in nfe_alloc_jrx_ring()
1273 error = bus_dmamap_create(ring->jrx_data_tag, 0, in nfe_alloc_jrx_ring()
1274 &data->rx_data_map); in nfe_alloc_jrx_ring()
1276 device_printf(sc->nfe_dev, in nfe_alloc_jrx_ring()
1290 device_printf(sc->nfe_dev, "disabling jumbo frame support due to " in nfe_alloc_jrx_ring()
1292 sc->nfe_jumbo_disable = 1; in nfe_alloc_jrx_ring()
1302 ring->cur = ring->next = 0; in nfe_init_rx_ring()
1303 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_init_rx_ring()
1304 desc = ring->desc64; in nfe_init_rx_ring()
1307 desc = ring->desc32; in nfe_init_rx_ring()
1316 bus_dmamap_sync(ring->rx_desc_tag, ring->rx_desc_map, in nfe_init_rx_ring()
1329 ring->jcur = ring->jnext = 0; in nfe_init_jrx_ring()
1330 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_init_jrx_ring()
1331 desc = ring->jdesc64; in nfe_init_jrx_ring()
1334 desc = ring->jdesc32; in nfe_init_jrx_ring()
1343 bus_dmamap_sync(ring->jrx_desc_tag, ring->jrx_desc_map, in nfe_init_jrx_ring()
1356 if (sc->nfe_flags & NFE_40BIT_ADDR) in nfe_free_rx_ring()
1357 desc = ring->desc64; in nfe_free_rx_ring()
1359 desc = ring->desc32; in nfe_free_rx_ring()
1362 data = &ring->data[i]; in nfe_free_rx_ring()
1363 if (data->rx_data_map != NULL) { in nfe_free_rx_ring()
1364 bus_dmamap_destroy(ring->rx_data_tag, in nfe_free_rx_ring()
1365 data->rx_data_map); in nfe_free_rx_ring()
1366 data->rx_data_map = NULL; in nfe_free_rx_ring()
1368 if (data->m != NULL) { in nfe_free_rx_ring()
1369 m_freem(data->m); in nfe_free_rx_ring()
1370 data->m = NULL; in nfe_free_rx_ring()
1373 if (ring->rx_data_tag != NULL) { in nfe_free_rx_ring()
1374 if (ring->rx_spare_map != NULL) { in nfe_free_rx_ring()
1375 bus_dmamap_destroy(ring->rx_data_tag, in nfe_free_rx_ring()
1376 ring->rx_spare_map); in nfe_free_rx_ring()
1377 ring->rx_spare_map = NULL; in nfe_free_rx_ring()
1379 bus_dma_tag_destroy(ring->rx_data_tag); in nfe_free_rx_ring()
1380 ring->rx_data_tag = NULL; in nfe_free_rx_ring()
1384 bus_dmamap_unload(ring->rx_desc_tag, ring->rx_desc_map); in nfe_free_rx_ring()
1385 bus_dmamem_free(ring->rx_desc_tag, desc, ring->rx_desc_map); in nfe_free_rx_ring()
1386 ring->desc64 = NULL; in nfe_free_rx_ring()
1387 ring->desc32 = NULL; in nfe_free_rx_ring()
1389 if (ring->rx_desc_tag != NULL) { in nfe_free_rx_ring()
1390 bus_dma_tag_destroy(ring->rx_desc_tag); in nfe_free_rx_ring()
1391 ring->rx_desc_tag = NULL; in nfe_free_rx_ring()
1402 if ((sc->nfe_flags & NFE_JUMBO_SUP) == 0) in nfe_free_jrx_ring()
1405 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_free_jrx_ring()
1406 desc = ring->jdesc64; in nfe_free_jrx_ring()
1408 desc = ring->jdesc32; in nfe_free_jrx_ring()
1412 data = &ring->jdata[i]; in nfe_free_jrx_ring()
1413 if (data->rx_data_map != NULL) { in nfe_free_jrx_ring()
1414 bus_dmamap_destroy(ring->jrx_data_tag, in nfe_free_jrx_ring()
1415 data->rx_data_map); in nfe_free_jrx_ring()
1416 data->rx_data_map = NULL; in nfe_free_jrx_ring()
1418 if (data->m != NULL) { in nfe_free_jrx_ring()
1419 m_freem(data->m); in nfe_free_jrx_ring()
1420 data->m = NULL; in nfe_free_jrx_ring()
1423 if (ring->jrx_data_tag != NULL) { in nfe_free_jrx_ring()
1424 if (ring->jrx_spare_map != NULL) { in nfe_free_jrx_ring()
1425 bus_dmamap_destroy(ring->jrx_data_tag, in nfe_free_jrx_ring()
1426 ring->jrx_spare_map); in nfe_free_jrx_ring()
1427 ring->jrx_spare_map = NULL; in nfe_free_jrx_ring()
1429 bus_dma_tag_destroy(ring->jrx_data_tag); in nfe_free_jrx_ring()
1430 ring->jrx_data_tag = NULL; in nfe_free_jrx_ring()
1434 bus_dmamap_unload(ring->jrx_desc_tag, ring->jrx_desc_map); in nfe_free_jrx_ring()
1435 bus_dmamem_free(ring->jrx_desc_tag, desc, ring->jrx_desc_map); in nfe_free_jrx_ring()
1436 ring->jdesc64 = NULL; in nfe_free_jrx_ring()
1437 ring->jdesc32 = NULL; in nfe_free_jrx_ring()
1440 if (ring->jrx_desc_tag != NULL) { in nfe_free_jrx_ring()
1441 bus_dma_tag_destroy(ring->jrx_desc_tag); in nfe_free_jrx_ring()
1442 ring->jrx_desc_tag = NULL; in nfe_free_jrx_ring()
1454 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_alloc_tx_ring()
1455 desc = ring->desc64; in nfe_alloc_tx_ring()
1458 desc = ring->desc32; in nfe_alloc_tx_ring()
1462 ring->queued = 0; in nfe_alloc_tx_ring()
1463 ring->cur = ring->next = 0; in nfe_alloc_tx_ring()
1465 error = bus_dma_tag_create(sc->nfe_parent_tag, in nfe_alloc_tx_ring()
1474 &ring->tx_desc_tag); in nfe_alloc_tx_ring()
1476 device_printf(sc->nfe_dev, "could not create desc DMA tag\n"); in nfe_alloc_tx_ring()
1480 error = bus_dmamem_alloc(ring->tx_desc_tag, &desc, BUS_DMA_WAITOK | in nfe_alloc_tx_ring()
1481 BUS_DMA_COHERENT | BUS_DMA_ZERO, &ring->tx_desc_map); in nfe_alloc_tx_ring()
1483 device_printf(sc->nfe_dev, "could not create desc DMA map\n"); in nfe_alloc_tx_ring()
1486 if (sc->nfe_flags & NFE_40BIT_ADDR) in nfe_alloc_tx_ring()
1487 ring->desc64 = desc; in nfe_alloc_tx_ring()
1489 ring->desc32 = desc; in nfe_alloc_tx_ring()
1492 error = bus_dmamap_load(ring->tx_desc_tag, ring->tx_desc_map, desc, in nfe_alloc_tx_ring()
1495 device_printf(sc->nfe_dev, "could not load desc DMA map\n"); in nfe_alloc_tx_ring()
1498 ring->physaddr = ctx.nfe_busaddr; in nfe_alloc_tx_ring()
1500 error = bus_dma_tag_create(sc->nfe_parent_tag, in nfe_alloc_tx_ring()
1510 &ring->tx_data_tag); in nfe_alloc_tx_ring()
1512 device_printf(sc->nfe_dev, "could not create Tx DMA tag\n"); in nfe_alloc_tx_ring()
1517 error = bus_dmamap_create(ring->tx_data_tag, 0, in nfe_alloc_tx_ring()
1518 &ring->data[i].tx_data_map); in nfe_alloc_tx_ring()
1520 device_printf(sc->nfe_dev, in nfe_alloc_tx_ring()
1536 sc->nfe_force_tx = 0; in nfe_init_tx_ring()
1537 ring->queued = 0; in nfe_init_tx_ring()
1538 ring->cur = ring->next = 0; in nfe_init_tx_ring()
1539 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_init_tx_ring()
1540 desc = ring->desc64; in nfe_init_tx_ring()
1543 desc = ring->desc32; in nfe_init_tx_ring()
1548 bus_dmamap_sync(ring->tx_desc_tag, ring->tx_desc_map, in nfe_init_tx_ring()
1559 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_free_tx_ring()
1560 desc = ring->desc64; in nfe_free_tx_ring()
1562 desc = ring->desc32; in nfe_free_tx_ring()
1566 data = &ring->data[i]; in nfe_free_tx_ring()
1568 if (data->m != NULL) { in nfe_free_tx_ring()
1569 bus_dmamap_sync(ring->tx_data_tag, data->tx_data_map, in nfe_free_tx_ring()
1571 bus_dmamap_unload(ring->tx_data_tag, data->tx_data_map); in nfe_free_tx_ring()
1572 m_freem(data->m); in nfe_free_tx_ring()
1573 data->m = NULL; in nfe_free_tx_ring()
1575 if (data->tx_data_map != NULL) { in nfe_free_tx_ring()
1576 bus_dmamap_destroy(ring->tx_data_tag, in nfe_free_tx_ring()
1577 data->tx_data_map); in nfe_free_tx_ring()
1578 data->tx_data_map = NULL; in nfe_free_tx_ring()
1582 if (ring->tx_data_tag != NULL) { in nfe_free_tx_ring()
1583 bus_dma_tag_destroy(ring->tx_data_tag); in nfe_free_tx_ring()
1584 ring->tx_data_tag = NULL; in nfe_free_tx_ring()
1588 bus_dmamap_sync(ring->tx_desc_tag, ring->tx_desc_map, in nfe_free_tx_ring()
1590 bus_dmamap_unload(ring->tx_desc_tag, ring->tx_desc_map); in nfe_free_tx_ring()
1591 bus_dmamem_free(ring->tx_desc_tag, desc, ring->tx_desc_map); in nfe_free_tx_ring()
1592 ring->desc64 = NULL; in nfe_free_tx_ring()
1593 ring->desc32 = NULL; in nfe_free_tx_ring()
1594 bus_dma_tag_destroy(ring->tx_desc_tag); in nfe_free_tx_ring()
1595 ring->tx_desc_tag = NULL; in nfe_free_tx_ring()
1616 if (sc->nfe_framesize > MCLBYTES - ETHER_HDR_LEN) in nfe_poll()
1625 if ((r = NFE_READ(sc, sc->nfe_irq_status)) == 0) { in nfe_poll()
1629 NFE_WRITE(sc, sc->nfe_irq_status, r); in nfe_poll()
1646 if (sc->nfe_msi != 0) in nfe_set_intr()
1655 if (sc->nfe_msix != 0) { in nfe_enable_intr()
1657 if (NFE_READ(sc, sc->nfe_irq_mask) == 0) in nfe_enable_intr()
1658 NFE_WRITE(sc, sc->nfe_irq_mask, sc->nfe_intrs); in nfe_enable_intr()
1660 NFE_WRITE(sc, sc->nfe_irq_mask, sc->nfe_intrs); in nfe_enable_intr()
1667 if (sc->nfe_msix != 0) { in nfe_disable_intr()
1669 if (NFE_READ(sc, sc->nfe_irq_mask) != 0) in nfe_disable_intr()
1670 NFE_WRITE(sc, sc->nfe_irq_mask, sc->nfe_nointrs); in nfe_disable_intr()
1672 NFE_WRITE(sc, sc->nfe_irq_mask, sc->nfe_nointrs); in nfe_disable_intr()
1689 if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > NFE_JUMBO_MTU) in nfe_ioctl()
1691 else if (if_getmtu(ifp) != ifr->ifr_mtu) { in nfe_ioctl()
1692 if ((((sc->nfe_flags & NFE_JUMBO_SUP) == 0) || in nfe_ioctl()
1693 (sc->nfe_jumbo_disable != 0)) && in nfe_ioctl()
1694 ifr->ifr_mtu > ETHERMTU) in nfe_ioctl()
1698 if_setmtu(ifp, ifr->ifr_mtu); in nfe_ioctl()
1712 * don't do a full re-init of the chip, just update in nfe_ioctl()
1716 ((if_getflags(ifp) ^ sc->nfe_if_flags) & in nfe_ioctl()
1725 sc->nfe_if_flags = if_getflags(ifp); in nfe_ioctl()
1740 mii = device_get_softc(sc->nfe_miibus); in nfe_ioctl()
1741 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd); in nfe_ioctl()
1744 mask = ifr->ifr_reqcap ^ if_getcapenable(ifp); in nfe_ioctl()
1747 if ((ifr->ifr_reqcap & IFCAP_POLLING) != 0) { in nfe_ioctl()
1834 status = NFE_READ(sc, sc->nfe_irq_status); in nfe_intr()
1838 taskqueue_enqueue(sc->nfe_tq, &sc->nfe_int_task); in nfe_intr()
1847 if_t ifp = sc->nfe_ifp; in nfe_int_task()
1853 if ((r = NFE_READ(sc, sc->nfe_irq_status)) == 0) { in nfe_int_task()
1858 NFE_WRITE(sc, sc->nfe_irq_status, r); in nfe_int_task()
1883 if (sc->nfe_framesize > MCLBYTES - ETHER_HDR_LEN) in nfe_int_task()
1884 domore = nfe_jrxeof(sc, sc->nfe_process_limit, NULL); in nfe_int_task()
1886 domore = nfe_rxeof(sc, sc->nfe_process_limit, NULL); in nfe_int_task()
1895 if (domore || (NFE_READ(sc, sc->nfe_irq_status) != 0)) { in nfe_int_task()
1896 taskqueue_enqueue(sc->nfe_tq, &sc->nfe_int_task); in nfe_int_task()
1912 data = &sc->rxq.data[idx]; in nfe_discard_rxbuf()
1913 m = data->m; in nfe_discard_rxbuf()
1915 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_discard_rxbuf()
1916 desc64 = &sc->rxq.desc64[idx]; in nfe_discard_rxbuf()
1918 desc64->physaddr[0] = htole32(NFE_ADDR_HI(data->paddr)); in nfe_discard_rxbuf()
1919 desc64->physaddr[1] = htole32(NFE_ADDR_LO(data->paddr)); in nfe_discard_rxbuf()
1920 desc64->length = htole16(m->m_len); in nfe_discard_rxbuf()
1921 desc64->flags = htole16(NFE_RX_READY); in nfe_discard_rxbuf()
1923 desc32 = &sc->rxq.desc32[idx]; in nfe_discard_rxbuf()
1924 desc32->length = htole16(m->m_len); in nfe_discard_rxbuf()
1925 desc32->flags = htole16(NFE_RX_READY); in nfe_discard_rxbuf()
1937 data = &sc->jrxq.jdata[idx]; in nfe_discard_jrxbuf()
1938 m = data->m; in nfe_discard_jrxbuf()
1940 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_discard_jrxbuf()
1941 desc64 = &sc->jrxq.jdesc64[idx]; in nfe_discard_jrxbuf()
1943 desc64->physaddr[0] = htole32(NFE_ADDR_HI(data->paddr)); in nfe_discard_jrxbuf()
1944 desc64->physaddr[1] = htole32(NFE_ADDR_LO(data->paddr)); in nfe_discard_jrxbuf()
1945 desc64->length = htole16(m->m_len); in nfe_discard_jrxbuf()
1946 desc64->flags = htole16(NFE_RX_READY); in nfe_discard_jrxbuf()
1948 desc32 = &sc->jrxq.jdesc32[idx]; in nfe_discard_jrxbuf()
1949 desc32->length = htole16(m->m_len); in nfe_discard_jrxbuf()
1950 desc32->flags = htole16(NFE_RX_READY); in nfe_discard_jrxbuf()
1969 m->m_len = m->m_pkthdr.len = MCLBYTES; in nfe_newbuf()
1972 if (bus_dmamap_load_mbuf_sg(sc->rxq.rx_data_tag, sc->rxq.rx_spare_map, in nfe_newbuf()
1979 data = &sc->rxq.data[idx]; in nfe_newbuf()
1980 if (data->m != NULL) { in nfe_newbuf()
1981 bus_dmamap_sync(sc->rxq.rx_data_tag, data->rx_data_map, in nfe_newbuf()
1983 bus_dmamap_unload(sc->rxq.rx_data_tag, data->rx_data_map); in nfe_newbuf()
1985 map = data->rx_data_map; in nfe_newbuf()
1986 data->rx_data_map = sc->rxq.rx_spare_map; in nfe_newbuf()
1987 sc->rxq.rx_spare_map = map; in nfe_newbuf()
1988 bus_dmamap_sync(sc->rxq.rx_data_tag, data->rx_data_map, in nfe_newbuf()
1990 data->paddr = segs[0].ds_addr; in nfe_newbuf()
1991 data->m = m; in nfe_newbuf()
1993 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_newbuf()
1994 desc64 = &sc->rxq.desc64[idx]; in nfe_newbuf()
1995 desc64->physaddr[0] = htole32(NFE_ADDR_HI(segs[0].ds_addr)); in nfe_newbuf()
1996 desc64->physaddr[1] = htole32(NFE_ADDR_LO(segs[0].ds_addr)); in nfe_newbuf()
1997 desc64->length = htole16(segs[0].ds_len); in nfe_newbuf()
1998 desc64->flags = htole16(NFE_RX_READY); in nfe_newbuf()
2000 desc32 = &sc->rxq.desc32[idx]; in nfe_newbuf()
2001 desc32->physaddr = htole32(NFE_ADDR_LO(segs[0].ds_addr)); in nfe_newbuf()
2002 desc32->length = htole16(segs[0].ds_len); in nfe_newbuf()
2003 desc32->flags = htole16(NFE_RX_READY); in nfe_newbuf()
2023 m->m_pkthdr.len = m->m_len = MJUM9BYTES; in nfe_jnewbuf()
2026 if (bus_dmamap_load_mbuf_sg(sc->jrxq.jrx_data_tag, in nfe_jnewbuf()
2027 sc->jrxq.jrx_spare_map, m, segs, &nsegs, BUS_DMA_NOWAIT) != 0) { in nfe_jnewbuf()
2033 data = &sc->jrxq.jdata[idx]; in nfe_jnewbuf()
2034 if (data->m != NULL) { in nfe_jnewbuf()
2035 bus_dmamap_sync(sc->jrxq.jrx_data_tag, data->rx_data_map, in nfe_jnewbuf()
2037 bus_dmamap_unload(sc->jrxq.jrx_data_tag, data->rx_data_map); in nfe_jnewbuf()
2039 map = data->rx_data_map; in nfe_jnewbuf()
2040 data->rx_data_map = sc->jrxq.jrx_spare_map; in nfe_jnewbuf()
2041 sc->jrxq.jrx_spare_map = map; in nfe_jnewbuf()
2042 bus_dmamap_sync(sc->jrxq.jrx_data_tag, data->rx_data_map, in nfe_jnewbuf()
2044 data->paddr = segs[0].ds_addr; in nfe_jnewbuf()
2045 data->m = m; in nfe_jnewbuf()
2047 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_jnewbuf()
2048 desc64 = &sc->jrxq.jdesc64[idx]; in nfe_jnewbuf()
2049 desc64->physaddr[0] = htole32(NFE_ADDR_HI(segs[0].ds_addr)); in nfe_jnewbuf()
2050 desc64->physaddr[1] = htole32(NFE_ADDR_LO(segs[0].ds_addr)); in nfe_jnewbuf()
2051 desc64->length = htole16(segs[0].ds_len); in nfe_jnewbuf()
2052 desc64->flags = htole16(NFE_RX_READY); in nfe_jnewbuf()
2054 desc32 = &sc->jrxq.jdesc32[idx]; in nfe_jnewbuf()
2055 desc32->physaddr = htole32(NFE_ADDR_LO(segs[0].ds_addr)); in nfe_jnewbuf()
2056 desc32->length = htole16(segs[0].ds_len); in nfe_jnewbuf()
2057 desc32->flags = htole16(NFE_RX_READY); in nfe_jnewbuf()
2066 if_t ifp = sc->nfe_ifp; in nfe_rxeof()
2078 bus_dmamap_sync(sc->rxq.rx_desc_tag, sc->rxq.rx_desc_map, in nfe_rxeof()
2081 for (prog = 0; ; NFE_INC(sc->rxq.cur, NFE_RX_RING_COUNT), vtag = 0) { in nfe_rxeof()
2084 count--; in nfe_rxeof()
2086 data = &sc->rxq.data[sc->rxq.cur]; in nfe_rxeof()
2088 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_rxeof()
2089 desc64 = &sc->rxq.desc64[sc->rxq.cur]; in nfe_rxeof()
2090 vtag = le32toh(desc64->physaddr[1]); in nfe_rxeof()
2091 flags = le16toh(desc64->flags); in nfe_rxeof()
2092 len = le16toh(desc64->length) & NFE_RX_LEN_MASK; in nfe_rxeof()
2094 desc32 = &sc->rxq.desc32[sc->rxq.cur]; in nfe_rxeof()
2095 flags = le16toh(desc32->flags); in nfe_rxeof()
2096 len = le16toh(desc32->length) & NFE_RX_LEN_MASK; in nfe_rxeof()
2102 if ((sc->nfe_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) { in nfe_rxeof()
2105 nfe_discard_rxbuf(sc, sc->rxq.cur); in nfe_rxeof()
2110 len--; /* fix buffer length */ in nfe_rxeof()
2115 nfe_discard_rxbuf(sc, sc->rxq.cur); in nfe_rxeof()
2121 len--; /* fix buffer length */ in nfe_rxeof()
2127 nfe_discard_rxbuf(sc, sc->rxq.cur); in nfe_rxeof()
2131 m = data->m; in nfe_rxeof()
2132 if (nfe_newbuf(sc, sc->rxq.cur) != 0) { in nfe_rxeof()
2134 nfe_discard_rxbuf(sc, sc->rxq.cur); in nfe_rxeof()
2140 m->m_pkthdr.ether_vtag = vtag & 0xffff; in nfe_rxeof()
2141 m->m_flags |= M_VLANTAG; in nfe_rxeof()
2144 m->m_pkthdr.len = m->m_len = len; in nfe_rxeof()
2145 m->m_pkthdr.rcvif = ifp; in nfe_rxeof()
2149 m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED; in nfe_rxeof()
2150 m->m_pkthdr.csum_flags |= CSUM_IP_VALID; in nfe_rxeof()
2153 m->m_pkthdr.csum_flags |= in nfe_rxeof()
2155 m->m_pkthdr.csum_data = 0xffff; in nfe_rxeof()
2169 bus_dmamap_sync(sc->rxq.rx_desc_tag, sc->rxq.rx_desc_map, in nfe_rxeof()
2180 if_t ifp = sc->nfe_ifp; in nfe_jrxeof()
2192 bus_dmamap_sync(sc->jrxq.jrx_desc_tag, sc->jrxq.jrx_desc_map, in nfe_jrxeof()
2195 for (prog = 0; ; NFE_INC(sc->jrxq.jcur, NFE_JUMBO_RX_RING_COUNT), in nfe_jrxeof()
2199 count--; in nfe_jrxeof()
2201 data = &sc->jrxq.jdata[sc->jrxq.jcur]; in nfe_jrxeof()
2203 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_jrxeof()
2204 desc64 = &sc->jrxq.jdesc64[sc->jrxq.jcur]; in nfe_jrxeof()
2205 vtag = le32toh(desc64->physaddr[1]); in nfe_jrxeof()
2206 flags = le16toh(desc64->flags); in nfe_jrxeof()
2207 len = le16toh(desc64->length) & NFE_RX_LEN_MASK; in nfe_jrxeof()
2209 desc32 = &sc->jrxq.jdesc32[sc->jrxq.jcur]; in nfe_jrxeof()
2210 flags = le16toh(desc32->flags); in nfe_jrxeof()
2211 len = le16toh(desc32->length) & NFE_RX_LEN_MASK; in nfe_jrxeof()
2217 if ((sc->nfe_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) { in nfe_jrxeof()
2220 nfe_discard_jrxbuf(sc, sc->jrxq.jcur); in nfe_jrxeof()
2225 len--; /* fix buffer length */ in nfe_jrxeof()
2230 nfe_discard_jrxbuf(sc, sc->jrxq.jcur); in nfe_jrxeof()
2236 len--; /* fix buffer length */ in nfe_jrxeof()
2242 nfe_discard_jrxbuf(sc, sc->jrxq.jcur); in nfe_jrxeof()
2246 m = data->m; in nfe_jrxeof()
2247 if (nfe_jnewbuf(sc, sc->jrxq.jcur) != 0) { in nfe_jrxeof()
2249 nfe_discard_jrxbuf(sc, sc->jrxq.jcur); in nfe_jrxeof()
2255 m->m_pkthdr.ether_vtag = vtag & 0xffff; in nfe_jrxeof()
2256 m->m_flags |= M_VLANTAG; in nfe_jrxeof()
2259 m->m_pkthdr.len = m->m_len = len; in nfe_jrxeof()
2260 m->m_pkthdr.rcvif = ifp; in nfe_jrxeof()
2264 m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED; in nfe_jrxeof()
2265 m->m_pkthdr.csum_flags |= CSUM_IP_VALID; in nfe_jrxeof()
2268 m->m_pkthdr.csum_flags |= in nfe_jrxeof()
2270 m->m_pkthdr.csum_data = 0xffff; in nfe_jrxeof()
2284 bus_dmamap_sync(sc->jrxq.jrx_desc_tag, sc->jrxq.jrx_desc_map, in nfe_jrxeof()
2295 if_t ifp = sc->nfe_ifp; in nfe_txeof()
2304 bus_dmamap_sync(sc->txq.tx_desc_tag, sc->txq.tx_desc_map, in nfe_txeof()
2308 for (cons = sc->txq.next; cons != sc->txq.cur; in nfe_txeof()
2310 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_txeof()
2311 desc64 = &sc->txq.desc64[cons]; in nfe_txeof()
2312 flags = le16toh(desc64->flags); in nfe_txeof()
2314 desc32 = &sc->txq.desc32[cons]; in nfe_txeof()
2315 flags = le16toh(desc32->flags); in nfe_txeof()
2322 sc->txq.queued--; in nfe_txeof()
2323 data = &sc->txq.data[cons]; in nfe_txeof()
2325 if ((sc->nfe_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) { in nfe_txeof()
2329 device_printf(sc->nfe_dev, in nfe_txeof()
2339 device_printf(sc->nfe_dev, in nfe_txeof()
2347 KASSERT(data->m != NULL, ("%s: freeing NULL mbuf!", __func__)); in nfe_txeof()
2348 bus_dmamap_sync(sc->txq.tx_data_tag, data->tx_data_map, in nfe_txeof()
2350 bus_dmamap_unload(sc->txq.tx_data_tag, data->tx_data_map); in nfe_txeof()
2351 m_freem(data->m); in nfe_txeof()
2352 data->m = NULL; in nfe_txeof()
2356 sc->nfe_force_tx = 0; in nfe_txeof()
2357 sc->txq.next = cons; in nfe_txeof()
2359 if (sc->txq.queued == 0) in nfe_txeof()
2360 sc->nfe_watchdog_timer = 0; in nfe_txeof()
2376 prod = si = sc->txq.cur; in nfe_encap()
2377 map = sc->txq.data[prod].tx_data_map; in nfe_encap()
2379 error = bus_dmamap_load_mbuf_sg(sc->txq.tx_data_tag, map, *m_head, segs, in nfe_encap()
2389 error = bus_dmamap_load_mbuf_sg(sc->txq.tx_data_tag, map, in nfe_encap()
2404 if (sc->txq.queued + nsegs >= NFE_TX_RING_COUNT - 2) { in nfe_encap()
2405 bus_dmamap_unload(sc->txq.tx_data_tag, map); in nfe_encap()
2412 if ((m->m_pkthdr.csum_flags & CSUM_TSO) != 0) { in nfe_encap()
2413 tsosegsz = (uint32_t)m->m_pkthdr.tso_segsz << in nfe_encap()
2417 } else if ((m->m_pkthdr.csum_flags & NFE_CSUM_FEATURES) != 0) { in nfe_encap()
2418 if ((m->m_pkthdr.csum_flags & CSUM_IP) != 0) in nfe_encap()
2420 if ((m->m_pkthdr.csum_flags & CSUM_TCP) != 0) in nfe_encap()
2422 if ((m->m_pkthdr.csum_flags & CSUM_UDP) != 0) in nfe_encap()
2427 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_encap()
2428 desc64 = &sc->txq.desc64[prod]; in nfe_encap()
2429 desc64->physaddr[0] = in nfe_encap()
2431 desc64->physaddr[1] = in nfe_encap()
2433 desc64->vtag = 0; in nfe_encap()
2434 desc64->length = htole16(segs[i].ds_len - 1); in nfe_encap()
2435 desc64->flags = htole16(flags); in nfe_encap()
2437 desc32 = &sc->txq.desc32[prod]; in nfe_encap()
2438 desc32->physaddr = in nfe_encap()
2440 desc32->length = htole16(segs[i].ds_len - 1); in nfe_encap()
2441 desc32->flags = htole16(flags); in nfe_encap()
2450 sc->txq.queued++; in nfe_encap()
2458 if (sc->nfe_flags & NFE_40BIT_ADDR) { in nfe_encap()
2459 desc64->flags |= htole16(NFE_TX_LASTFRAG_V2); in nfe_encap()
2460 desc64 = &sc->txq.desc64[si]; in nfe_encap()
2461 if ((m->m_flags & M_VLANTAG) != 0) in nfe_encap()
2462 desc64->vtag = htole32(NFE_TX_VTAG | in nfe_encap()
2463 m->m_pkthdr.ether_vtag); in nfe_encap()
2470 desc64->length |= htole16((uint16_t)tsosegsz); in nfe_encap()
2471 desc64->flags |= htole16(tsosegsz >> 16); in nfe_encap()
2477 desc64->flags |= htole16(NFE_TX_VALID | cflags); in nfe_encap()
2479 if (sc->nfe_flags & NFE_JUMBO_SUP) in nfe_encap()
2480 desc32->flags |= htole16(NFE_TX_LASTFRAG_V2); in nfe_encap()
2482 desc32->flags |= htole16(NFE_TX_LASTFRAG_V1); in nfe_encap()
2483 desc32 = &sc->txq.desc32[si]; in nfe_encap()
2490 desc32->length |= htole16((uint16_t)tsosegsz); in nfe_encap()
2491 desc32->flags |= htole16(tsosegsz >> 16); in nfe_encap()
2497 desc32->flags |= htole16(NFE_TX_VALID | cflags); in nfe_encap()
2500 sc->txq.cur = prod; in nfe_encap()
2501 prod = (prod + NFE_TX_RING_COUNT - 1) % NFE_TX_RING_COUNT; in nfe_encap()
2502 sc->txq.data[si].tx_data_map = sc->txq.data[prod].tx_data_map; in nfe_encap()
2503 sc->txq.data[prod].tx_data_map = map; in nfe_encap()
2504 sc->txq.data[prod].m = m; in nfe_encap()
2506 bus_dmamap_sync(sc->txq.tx_data_tag, map, BUS_DMASYNC_PREWRITE); in nfe_encap()
2526 ctx->addr[j] &= mcaddr; in nfe_hash_maddr()
2527 ctx->mask[j] &= ~mcaddr; in nfe_hash_maddr()
2536 if_t ifp = sc->nfe_ifp; in nfe_setmulti()
2600 IFF_DRV_RUNNING || sc->nfe_link == 0) in nfe_start_locked()
2621 bus_dmamap_sync(sc->txq.tx_desc_tag, sc->txq.tx_desc_map, in nfe_start_locked()
2625 NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_KICKTX | sc->rxtxctl); in nfe_start_locked()
2628 * Set a timeout in case the chip goes out to lunch. in nfe_start_locked()
2630 sc->nfe_watchdog_timer = 5; in nfe_start_locked()
2639 if (sc->nfe_watchdog_timer == 0 || --sc->nfe_watchdog_timer) in nfe_watchdog()
2644 if (sc->txq.queued == 0) { in nfe_watchdog()
2645 if_printf(ifp, "watchdog timeout (missed Tx interrupts) " in nfe_watchdog()
2646 "-- recovering\n"); in nfe_watchdog()
2652 sc->nfe_force_tx++; in nfe_watchdog()
2653 if (sc->nfe_force_tx <= 3) { in nfe_watchdog()
2655 * If this is the case for watchdog timeout, the following in nfe_watchdog()
2658 NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_KICKTX | sc->rxtxctl); in nfe_watchdog()
2661 sc->nfe_force_tx = 0; in nfe_watchdog()
2663 if_printf(ifp, "watchdog timeout\n"); in nfe_watchdog()
2684 if_t ifp = sc->nfe_ifp; in nfe_init_locked()
2691 mii = device_get_softc(sc->nfe_miibus); in nfe_init_locked()
2698 sc->nfe_framesize = if_getmtu(ifp) + NFE_RX_HEADERS; in nfe_init_locked()
2700 nfe_init_tx_ring(sc, &sc->txq); in nfe_init_locked()
2701 if (sc->nfe_framesize > (MCLBYTES - ETHER_HDR_LEN)) in nfe_init_locked()
2702 error = nfe_init_jrx_ring(sc, &sc->jrxq); in nfe_init_locked()
2704 error = nfe_init_rx_ring(sc, &sc->rxq); in nfe_init_locked()
2706 device_printf(sc->nfe_dev, in nfe_init_locked()
2713 if ((sc->nfe_flags & NFE_CORRECT_MACADDR) != 0) in nfe_init_locked()
2718 if ((sc->nfe_flags & NFE_TX_FLOW_CTRL) != 0) in nfe_init_locked()
2721 sc->rxtxctl = NFE_RXTX_BIT2; in nfe_init_locked()
2722 if (sc->nfe_flags & NFE_40BIT_ADDR) in nfe_init_locked()
2723 sc->rxtxctl |= NFE_RXTX_V3MAGIC; in nfe_init_locked()
2724 else if (sc->nfe_flags & NFE_JUMBO_SUP) in nfe_init_locked()
2725 sc->rxtxctl |= NFE_RXTX_V2MAGIC; in nfe_init_locked()
2728 sc->rxtxctl |= NFE_RXTX_RXCSUM; in nfe_init_locked()
2730 sc->rxtxctl |= NFE_RXTX_VTAG_INSERT | NFE_RXTX_VTAG_STRIP; in nfe_init_locked()
2732 NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_RESET | sc->rxtxctl); in nfe_init_locked()
2734 NFE_WRITE(sc, NFE_RXTX_CTL, sc->rxtxctl); in nfe_init_locked()
2747 if (sc->nfe_framesize > MCLBYTES - ETHER_HDR_LEN) { in nfe_init_locked()
2749 NFE_ADDR_HI(sc->jrxq.jphysaddr)); in nfe_init_locked()
2751 NFE_ADDR_LO(sc->jrxq.jphysaddr)); in nfe_init_locked()
2754 NFE_ADDR_HI(sc->rxq.physaddr)); in nfe_init_locked()
2756 NFE_ADDR_LO(sc->rxq.physaddr)); in nfe_init_locked()
2758 NFE_WRITE(sc, NFE_TX_RING_ADDR_HI, NFE_ADDR_HI(sc->txq.physaddr)); in nfe_init_locked()
2759 NFE_WRITE(sc, NFE_TX_RING_ADDR_LO, NFE_ADDR_LO(sc->txq.physaddr)); in nfe_init_locked()
2762 (NFE_RX_RING_COUNT - 1) << 16 | in nfe_init_locked()
2763 (NFE_TX_RING_COUNT - 1)); in nfe_init_locked()
2765 NFE_WRITE(sc, NFE_RXBUFSZ, sc->nfe_framesize); in nfe_init_locked()
2788 NFE_WRITE(sc, NFE_STATUS, sc->mii_phyaddr << 24 | NFE_STATUS_MAGIC); in nfe_init_locked()
2794 sc->rxtxctl &= ~NFE_RXTX_BIT2; in nfe_init_locked()
2795 NFE_WRITE(sc, NFE_RXTX_CTL, sc->rxtxctl); in nfe_init_locked()
2797 NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_BIT1 | sc->rxtxctl); in nfe_init_locked()
2824 sc->nfe_link = 0; in nfe_init_locked()
2827 callout_reset(&sc->nfe_stat_ch, hz, nfe_tick, sc); in nfe_init_locked()
2843 sc->nfe_watchdog_timer = 0; in nfe_stop()
2846 callout_stop(&sc->nfe_stat_ch); in nfe_stop()
2857 sc->nfe_link = 0; in nfe_stop()
2860 rx_ring = &sc->rxq; in nfe_stop()
2862 rdata = &rx_ring->data[i]; in nfe_stop()
2863 if (rdata->m != NULL) { in nfe_stop()
2864 bus_dmamap_sync(rx_ring->rx_data_tag, in nfe_stop()
2865 rdata->rx_data_map, BUS_DMASYNC_POSTREAD); in nfe_stop()
2866 bus_dmamap_unload(rx_ring->rx_data_tag, in nfe_stop()
2867 rdata->rx_data_map); in nfe_stop()
2868 m_freem(rdata->m); in nfe_stop()
2869 rdata->m = NULL; in nfe_stop()
2873 if ((sc->nfe_flags & NFE_JUMBO_SUP) != 0) { in nfe_stop()
2874 jrx_ring = &sc->jrxq; in nfe_stop()
2876 rdata = &jrx_ring->jdata[i]; in nfe_stop()
2877 if (rdata->m != NULL) { in nfe_stop()
2878 bus_dmamap_sync(jrx_ring->jrx_data_tag, in nfe_stop()
2879 rdata->rx_data_map, BUS_DMASYNC_POSTREAD); in nfe_stop()
2880 bus_dmamap_unload(jrx_ring->jrx_data_tag, in nfe_stop()
2881 rdata->rx_data_map); in nfe_stop()
2882 m_freem(rdata->m); in nfe_stop()
2883 rdata->m = NULL; in nfe_stop()
2888 tx_ring = &sc->txq; in nfe_stop()
2890 tdata = &tx_ring->data[i]; in nfe_stop()
2891 if (tdata->m != NULL) { in nfe_stop()
2892 bus_dmamap_sync(tx_ring->tx_data_tag, in nfe_stop()
2893 tdata->tx_data_map, BUS_DMASYNC_POSTWRITE); in nfe_stop()
2894 bus_dmamap_unload(tx_ring->tx_data_tag, in nfe_stop()
2895 tdata->tx_data_map); in nfe_stop()
2896 m_freem(tdata->m); in nfe_stop()
2897 tdata->m = NULL; in nfe_stop()
2911 mii = device_get_softc(sc->nfe_miibus); in nfe_ifmedia_upd()
2927 mii = device_get_softc(sc->nfe_miibus); in nfe_ifmedia_sts()
2930 ifmr->ifm_active = mii->mii_media_active; in nfe_ifmedia_sts()
2931 ifmr->ifm_status = mii->mii_media_status; in nfe_ifmedia_sts()
2946 ifp = sc->nfe_ifp; in nfe_tick()
2948 mii = device_get_softc(sc->nfe_miibus); in nfe_tick()
2952 callout_reset(&sc->nfe_stat_ch, hz, nfe_tick, sc); in nfe_tick()
2967 if ((sc->nfe_flags & NFE_CORRECT_MACADDR) == 0) { in nfe_get_macaddr()
3014 ctx->nfe_busaddr = segs[0].ds_addr; in nfe_dma_map_segs()
3026 if (error || !req->newptr) in sysctl_int_range()
3057 stats = &sc->nfe_stats; in nfe_sysctl_node()
3058 ctx = device_get_sysctl_ctx(sc->nfe_dev); in nfe_sysctl_node()
3059 child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->nfe_dev)); in nfe_sysctl_node()
3062 &sc->nfe_process_limit, 0, sysctl_hw_nfe_proc_limit, "I", in nfe_sysctl_node()
3065 sc->nfe_process_limit = NFE_PROC_DEFAULT; in nfe_sysctl_node()
3066 error = resource_int_value(device_get_name(sc->nfe_dev), in nfe_sysctl_node()
3067 device_get_unit(sc->nfe_dev), "process_limit", in nfe_sysctl_node()
3068 &sc->nfe_process_limit); in nfe_sysctl_node()
3070 if (sc->nfe_process_limit < NFE_PROC_MIN || in nfe_sysctl_node()
3071 sc->nfe_process_limit > NFE_PROC_MAX) { in nfe_sysctl_node()
3072 device_printf(sc->nfe_dev, in nfe_sysctl_node()
3075 sc->nfe_process_limit = NFE_PROC_DEFAULT; in nfe_sysctl_node()
3079 if ((sc->nfe_flags & (NFE_MIB_V1 | NFE_MIB_V2 | NFE_MIB_V3)) == 0) in nfe_sysctl_node()
3092 &stats->rx_frame_errors, "Framing Errors"); in nfe_sysctl_node()
3094 &stats->rx_extra_bytes, "Extra Bytes"); in nfe_sysctl_node()
3096 &stats->rx_late_cols, "Late Collisions"); in nfe_sysctl_node()
3098 &stats->rx_runts, "Runts"); in nfe_sysctl_node()
3100 &stats->rx_jumbos, "Jumbos"); in nfe_sysctl_node()
3102 &stats->rx_fifo_overuns, "FIFO Overruns"); in nfe_sysctl_node()
3104 &stats->rx_crc_errors, "CRC Errors"); in nfe_sysctl_node()
3106 &stats->rx_fae, "Frame Alignment Errors"); in nfe_sysctl_node()
3108 &stats->rx_len_errors, "Length Errors"); in nfe_sysctl_node()
3110 &stats->rx_unicast, "Unicast Frames"); in nfe_sysctl_node()
3112 &stats->rx_multicast, "Multicast Frames"); in nfe_sysctl_node()
3114 &stats->rx_broadcast, "Broadcast Frames"); in nfe_sysctl_node()
3115 if ((sc->nfe_flags & NFE_MIB_V2) != 0) { in nfe_sysctl_node()
3117 &stats->rx_octets, "Octets"); in nfe_sysctl_node()
3119 &stats->rx_pause, "Pause frames"); in nfe_sysctl_node()
3121 &stats->rx_drops, "Drop frames"); in nfe_sysctl_node()
3129 &stats->tx_octets, "Octets"); in nfe_sysctl_node()
3131 &stats->tx_zero_rexmits, "Zero Retransmits"); in nfe_sysctl_node()
3133 &stats->tx_one_rexmits, "One Retransmits"); in nfe_sysctl_node()
3135 &stats->tx_multi_rexmits, "Multiple Retransmits"); in nfe_sysctl_node()
3137 &stats->tx_late_cols, "Late Collisions"); in nfe_sysctl_node()
3139 &stats->tx_fifo_underuns, "FIFO Underruns"); in nfe_sysctl_node()
3141 &stats->tx_carrier_losts, "Carrier Losts"); in nfe_sysctl_node()
3143 &stats->tx_excess_deferals, "Excess Deferrals"); in nfe_sysctl_node()
3145 &stats->tx_retry_errors, "Retry Errors"); in nfe_sysctl_node()
3146 if ((sc->nfe_flags & NFE_MIB_V2) != 0) { in nfe_sysctl_node()
3148 &stats->tx_deferals, "Deferrals"); in nfe_sysctl_node()
3150 &stats->tx_frames, "Frames"); in nfe_sysctl_node()
3152 &stats->tx_pause, "Pause Frames"); in nfe_sysctl_node()
3154 if ((sc->nfe_flags & NFE_MIB_V3) != 0) { in nfe_sysctl_node()
3156 &stats->tx_deferals, "Unicast Frames"); in nfe_sysctl_node()
3158 &stats->tx_frames, "Multicast Frames"); in nfe_sysctl_node()
3160 &stats->tx_pause, "Broadcast Frames"); in nfe_sysctl_node()
3172 if ((sc->nfe_flags & NFE_MIB_V1) != 0) in nfe_stats_clear()
3174 else if ((sc->nfe_flags & (NFE_MIB_V2 | NFE_MIB_V3)) != 0) in nfe_stats_clear()
3182 if ((sc->nfe_flags & NFE_MIB_V3) != 0) { in nfe_stats_clear()
3196 if ((sc->nfe_flags & (NFE_MIB_V1 | NFE_MIB_V2 | NFE_MIB_V3)) == 0) in nfe_stats_update()
3199 stats = &sc->nfe_stats; in nfe_stats_update()
3200 stats->tx_octets += NFE_READ(sc, NFE_TX_OCTET); in nfe_stats_update()
3201 stats->tx_zero_rexmits += NFE_READ(sc, NFE_TX_ZERO_REXMIT); in nfe_stats_update()
3202 stats->tx_one_rexmits += NFE_READ(sc, NFE_TX_ONE_REXMIT); in nfe_stats_update()
3203 stats->tx_multi_rexmits += NFE_READ(sc, NFE_TX_MULTI_REXMIT); in nfe_stats_update()
3204 stats->tx_late_cols += NFE_READ(sc, NFE_TX_LATE_COL); in nfe_stats_update()
3205 stats->tx_fifo_underuns += NFE_READ(sc, NFE_TX_FIFO_UNDERUN); in nfe_stats_update()
3206 stats->tx_carrier_losts += NFE_READ(sc, NFE_TX_CARRIER_LOST); in nfe_stats_update()
3207 stats->tx_excess_deferals += NFE_READ(sc, NFE_TX_EXCESS_DEFERRAL); in nfe_stats_update()
3208 stats->tx_retry_errors += NFE_READ(sc, NFE_TX_RETRY_ERROR); in nfe_stats_update()
3209 stats->rx_frame_errors += NFE_READ(sc, NFE_RX_FRAME_ERROR); in nfe_stats_update()
3210 stats->rx_extra_bytes += NFE_READ(sc, NFE_RX_EXTRA_BYTES); in nfe_stats_update()
3211 stats->rx_late_cols += NFE_READ(sc, NFE_RX_LATE_COL); in nfe_stats_update()
3212 stats->rx_runts += NFE_READ(sc, NFE_RX_RUNT); in nfe_stats_update()
3213 stats->rx_jumbos += NFE_READ(sc, NFE_RX_JUMBO); in nfe_stats_update()
3214 stats->rx_fifo_overuns += NFE_READ(sc, NFE_RX_FIFO_OVERUN); in nfe_stats_update()
3215 stats->rx_crc_errors += NFE_READ(sc, NFE_RX_CRC_ERROR); in nfe_stats_update()
3216 stats->rx_fae += NFE_READ(sc, NFE_RX_FAE); in nfe_stats_update()
3217 stats->rx_len_errors += NFE_READ(sc, NFE_RX_LEN_ERROR); in nfe_stats_update()
3218 stats->rx_unicast += NFE_READ(sc, NFE_RX_UNICAST); in nfe_stats_update()
3219 stats->rx_multicast += NFE_READ(sc, NFE_RX_MULTICAST); in nfe_stats_update()
3220 stats->rx_broadcast += NFE_READ(sc, NFE_RX_BROADCAST); in nfe_stats_update()
3222 if ((sc->nfe_flags & NFE_MIB_V2) != 0) { in nfe_stats_update()
3223 stats->tx_deferals += NFE_READ(sc, NFE_TX_DEFERAL); in nfe_stats_update()
3224 stats->tx_frames += NFE_READ(sc, NFE_TX_FRAME); in nfe_stats_update()
3225 stats->rx_octets += NFE_READ(sc, NFE_RX_OCTET); in nfe_stats_update()
3226 stats->tx_pause += NFE_READ(sc, NFE_TX_PAUSE); in nfe_stats_update()
3227 stats->rx_pause += NFE_READ(sc, NFE_RX_PAUSE); in nfe_stats_update()
3228 stats->rx_drops += NFE_READ(sc, NFE_RX_DROP); in nfe_stats_update()
3231 if ((sc->nfe_flags & NFE_MIB_V3) != 0) { in nfe_stats_update()
3232 stats->tx_unicast += NFE_READ(sc, NFE_TX_UNICAST); in nfe_stats_update()
3233 stats->tx_multicast += NFE_READ(sc, NFE_TX_MULTICAST); in nfe_stats_update()
3234 stats->tx_broadcast += NFE_READ(sc, NFE_TX_BROADCAST); in nfe_stats_update()
3247 mii = device_get_softc(sc->nfe_miibus); in nfe_set_linkspeed()
3250 if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) == in nfe_set_linkspeed()
3252 switch IFM_SUBTYPE(mii->mii_media_active) { in nfe_set_linkspeed()
3263 miisc = LIST_FIRST(&mii->mii_phys); in nfe_set_linkspeed()
3264 phyno = miisc->mii_phy; in nfe_set_linkspeed()
3265 LIST_FOREACH(miisc, &mii->mii_phys, mii_list) in nfe_set_linkspeed()
3267 nfe_miibus_writereg(sc->nfe_dev, phyno, MII_100T2CR, 0); in nfe_set_linkspeed()
3268 nfe_miibus_writereg(sc->nfe_dev, phyno, in nfe_set_linkspeed()
3270 nfe_miibus_writereg(sc->nfe_dev, phyno, in nfe_set_linkspeed()
3279 if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) in nfe_set_linkspeed()
3281 switch (IFM_SUBTYPE(mii->mii_media_active)) { in nfe_set_linkspeed()
3295 device_printf(sc->nfe_dev, in nfe_set_linkspeed()
3299 * No link, force MAC to have 100Mbps, full-duplex link. in nfe_set_linkspeed()
3302 mii->mii_media_status = IFM_AVALID | IFM_ACTIVE; in nfe_set_linkspeed()
3303 mii->mii_media_active = IFM_ETHER | IFM_100_TX | IFM_FDX; in nfe_set_linkspeed()
3315 if (!pci_has_pm(sc->nfe_dev)) in nfe_set_wol()
3317 ifp = sc->nfe_ifp; in nfe_set_wol()
3325 if ((sc->nfe_flags & NFE_PWR_MGMT) != 0) in nfe_set_wol()
3336 pci_enable_pme(sc->nfe_dev); in nfe_set_wol()