Lines Matching +full:xcvr +full:- +full:setup

1 /*-
2 * SPDX-License-Identifier: BSD-4-Clause
18 * 4. Neither the name of the author nor the names of any co-contributors
40 * bus-master chips (3c90x cards and embedded controllers) including
43 * 3Com 3c900-TPO 10Mbps/RJ-45
44 * 3Com 3c900-COMBO 10Mbps/RJ-45,AUI,BNC
45 * 3Com 3c905-TX 10/100Mbps/RJ-45
46 * 3Com 3c905-T4 10/100Mbps/RJ-45
47 * 3Com 3c900B-TPO 10Mbps/RJ-45
48 * 3Com 3c900B-COMBO 10Mbps/RJ-45,AUI,BNC
49 * 3Com 3c900B-TPC 10Mbps/RJ-45,BNC
50 * 3Com 3c900B-FL 10Mbps/Fiber-optic
51 * 3Com 3c905B-COMBO 10/100Mbps/RJ-45,AUI,BNC
52 * 3Com 3c905B-TX 10/100Mbps/RJ-45
53 * 3Com 3c905B-FL/FX 10/100Mbps/Fiber-optic
54 * 3Com 3c905C-TX 10/100Mbps/RJ-45 (Tornado ASIC)
55 * 3Com 3c980-TX 10/100Mbps server adapter (Hurricane ASIC)
56 * 3Com 3c980C-TX 10/100Mbps server adapter (Tornado ASIC)
57 * 3Com 3cSOHO100-TX 10/100Mbps/RJ-45 (Hurricane ASIC)
58 * 3Com 3c450-TX 10/100Mbps/RJ-45 (Tornado ASIC)
59 * 3Com 3c555 10/100Mbps/RJ-45 (MiniPCI, Laptop Hurricane)
60 * 3Com 3c556 10/100Mbps/RJ-45 (MiniPCI, Hurricane ASIC)
61 * 3Com 3c556B 10/100Mbps/RJ-45 (MiniPCI, Hurricane ASIC)
62 * 3Com 3c575TX 10/100Mbps/RJ-45 (Cardbus, Hurricane ASIC)
63 * 3Com 3c575B 10/100Mbps/RJ-45 (Cardbus, Hurricane ASIC)
64 * 3Com 3c575C 10/100Mbps/RJ-45 (Cardbus, Hurricane ASIC)
65 * 3Com 3cxfem656 10/100Mbps/RJ-45 (Cardbus, Hurricane ASIC)
66 * 3Com 3cxfem656b 10/100Mbps/RJ-45 (Cardbus, Hurricane ASIC)
67 * 3Com 3cxfem656c 10/100Mbps/RJ-45 (Cardbus, Tornado ASIC)
68 * Dell Optiplex GX1 on-board 3c918 10/100Mbps/RJ-45
69 * Dell on-board 3c920 10/100Mbps/RJ-45
70 * Dell Precision on-board 3c905B 10/100Mbps/RJ-45
71 * Dell Latitude laptop docking station embedded 3c905-TX
78 * The 3c90x series chips use a bus-master DMA interface for transferring
87 * By contrast, the 3c90x cards support a fragment-based bus master
149 * - TX Checksumming will occasionally produce corrupt packets
150 * - TX Checksumming seems to reduce performance
168 "3Com 3c900-TPO Etherlink XL" },
170 "3Com 3c900-COMBO Etherlink XL" },
172 "3Com 3c905-TX Fast Etherlink XL" },
174 "3Com 3c905-T4 Fast Etherlink XL" },
176 "3Com 3c900B-TPO Etherlink XL" },
178 "3Com 3c900B-COMBO Etherlink XL" },
180 "3Com 3c900B-TPC Etherlink XL" },
182 "3Com 3c900B-FL Etherlink XL" },
184 "3Com 3c905B-TX Fast Etherlink XL" },
186 "3Com 3c905B-T4 Fast Etherlink XL" },
188 "3Com 3c905B-FX/SC Fast Etherlink XL" },
190 "3Com 3c905B-COMBO Fast Etherlink XL" },
192 "3Com 3c905C-TX Fast Etherlink XL" },
194 "3Com 3c920B-EMB Integrated Fast Etherlink XL" },
196 "3Com 3c920B-EMB-WNM Integrated Fast Etherlink XL" },
202 "3Com 3cSOHO100-TX OfficeConnect" },
204 "3Com 3c450-TX HomeConnect" },
289 * MII bit-bang glue
333 nitems(xl_devs) - 1);
341 *paddr = segs->ds_addr; in xl_dma_map_addr()
362 if (i == XL_TIMEOUT && bus_child_present(sc->xl_dev)) in xl_wait()
363 device_printf(sc->xl_dev, "command never completed!\n"); in xl_wait()
368 * PHYs (3c905-TX, 3c905-T4, 3c905B-T4) and those with built-in
369 * autoneg logic that's faked up to look like a PHY (3c905B-TX).
377 * Read the MII serial port for the MII bit-bang module.
396 * Write the MII serial port for the MII bit-bang module.
447 mii = device_get_softc(sc->xl_miibus); in xl_miibus_statchg()
454 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) { in xl_miibus_statchg()
456 if (sc->xl_type == XL_TYPE_905B) { in xl_miibus_statchg()
457 if ((IFM_OPTIONS(mii->mii_media_active) & in xl_miibus_statchg()
465 if (sc->xl_type == XL_TYPE_905B) in xl_miibus_statchg()
472 * Special support for the 3c905B-COMBO. This card has 10/100 support
474 * plus some non-MII media settings. In order to allow this, we have to
489 mii = device_get_softc(sc->xl_miibus); in xl_miibus_mediainit()
490 ifm = &mii->mii_media; in xl_miibus_mediainit()
492 if (sc->xl_media & (XL_MEDIAOPT_AUI | XL_MEDIAOPT_10FL)) { in xl_miibus_mediainit()
496 if (sc->xl_type == XL_TYPE_905B && in xl_miibus_mediainit()
497 sc->xl_media == XL_MEDIAOPT_10FL) { in xl_miibus_mediainit()
499 device_printf(sc->xl_dev, "found 10baseFL\n"); in xl_miibus_mediainit()
503 if (sc->xl_caps & XL_CAPS_FULL_DUPLEX) in xl_miibus_mediainit()
508 device_printf(sc->xl_dev, "found AUI\n"); in xl_miibus_mediainit()
513 if (sc->xl_media & XL_MEDIAOPT_BNC) { in xl_miibus_mediainit()
515 device_printf(sc->xl_dev, "found BNC\n"); in xl_miibus_mediainit()
537 device_printf(sc->xl_dev, "eeprom failed to come ready\n"); in xl_eeprom_wait()
566 if (sc->xl_flags & XL_FLAG_EEPROM_OFFSET_30) in xl_read_eeprom()
570 if (sc->xl_flags & XL_FLAG_8BITROM) in xl_read_eeprom()
594 if (sc->xl_type == XL_TYPE_905B) in xl_rxfilter()
622 ifp = sc->xl_ifp; in xl_rxfilter_90x()
642 if_foreach_llmaddr(sc->xl_ifp, xl_check_maddr_90x, &rxfilt); in xl_rxfilter_90x()
650 * Note: the 3c905B currently only supports a 64-bit
653 * will have a 256-bit hash table, hence the routine
682 ifp = sc->xl_ifp; in xl_rxfilter_90xB()
708 if (if_foreach_llmaddr(sc->xl_ifp, xl_check_maddr_90xB, sc) > 0) in xl_rxfilter_90xB()
726 if (sc->xl_media & XL_MEDIAOPT_MII || in xl_setcfg()
727 sc->xl_media & XL_MEDIAOPT_BT4) in xl_setcfg()
729 if (sc->xl_media & XL_MEDIAOPT_BTX) in xl_setcfg()
750 if (sc->xl_media & XL_MEDIAOPT_BT) { in xl_setmode()
753 sc->xl_xcvr = XL_XCVR_10BT; in xl_setmode()
762 if (sc->xl_media & XL_MEDIAOPT_BFX) { in xl_setmode()
765 sc->xl_xcvr = XL_XCVR_100BFX; in xl_setmode()
773 if (sc->xl_media & (XL_MEDIAOPT_AUI|XL_MEDIAOPT_10FL)) { in xl_setmode()
776 sc->xl_xcvr = XL_XCVR_AUI; in xl_setmode()
785 sc->xl_xcvr = XL_XCVR_AUI; in xl_setmode()
794 if (sc->xl_media & XL_MEDIAOPT_BNC) { in xl_setmode()
797 sc->xl_xcvr = XL_XCVR_COAX; in xl_setmode()
829 device_printf(sc->xl_dev, "selecting %s, %s duplex\n", pmsg, dmsg); in xl_setmode()
841 ((sc->xl_flags & XL_FLAG_WEIRDRESET) ? in xl_reset()
851 if (sc->xl_flags & XL_FLAG_USE_MMIO) in xl_reset()
861 device_printf(sc->xl_dev, "reset didn't complete\n"); in xl_reset()
876 if (sc->xl_flags & XL_FLAG_INVERT_LED_PWR || in xl_reset()
877 sc->xl_flags & XL_FLAG_INVERT_MII_PWR) { in xl_reset()
881 ((sc->xl_flags & XL_FLAG_INVERT_LED_PWR) ? in xl_reset()
883 ((sc->xl_flags & XL_FLAG_INVERT_MII_PWR) ? in xl_reset()
902 while (t->xl_name != NULL) { in xl_probe()
903 if ((pci_get_vendor(dev) == t->xl_vid) && in xl_probe()
904 (pci_get_device(dev) == t->xl_did)) { in xl_probe()
905 device_set_desc(dev, t->xl_name); in xl_probe()
919 * one Dell Latitude laptop docking station with an integrated 3c905-TX
936 if (sc->xl_media & (XL_MEDIAOPT_MASK & ~XL_MEDIAOPT_VCO)) { in xl_mediacheck()
938 * Check the XCVR value. If it's not in the normal range in xl_mediacheck()
941 if (sc->xl_xcvr <= XL_XCVR_AUTO) in xl_mediacheck()
944 device_printf(sc->xl_dev, in xl_mediacheck()
945 "bogus xcvr value in EEPROM (%x)\n", sc->xl_xcvr); in xl_mediacheck()
946 device_printf(sc->xl_dev, in xl_mediacheck()
950 if (sc->xl_type == XL_TYPE_905B && in xl_mediacheck()
951 sc->xl_media & XL_MEDIAOPT_10FL) in xl_mediacheck()
953 device_printf(sc->xl_dev, in xl_mediacheck()
955 device_printf(sc->xl_dev, in xl_mediacheck()
957 device_printf(sc->xl_dev, in xl_mediacheck()
977 case TC_DEVICEID_BOOMERANG_10BT: /* 3c900-TPO */ in xl_choose_xcvr()
978 case TC_DEVICEID_KRAKATOA_10BT: /* 3c900B-TPO */ in xl_choose_xcvr()
979 sc->xl_media = XL_MEDIAOPT_BT; in xl_choose_xcvr()
980 sc->xl_xcvr = XL_XCVR_10BT; in xl_choose_xcvr()
982 device_printf(sc->xl_dev, in xl_choose_xcvr()
985 case TC_DEVICEID_BOOMERANG_10BT_COMBO: /* 3c900-COMBO */ in xl_choose_xcvr()
986 case TC_DEVICEID_KRAKATOA_10BT_COMBO: /* 3c900B-COMBO */ in xl_choose_xcvr()
987 sc->xl_media = XL_MEDIAOPT_BT|XL_MEDIAOPT_BNC|XL_MEDIAOPT_AUI; in xl_choose_xcvr()
988 sc->xl_xcvr = XL_XCVR_10BT; in xl_choose_xcvr()
990 device_printf(sc->xl_dev, in xl_choose_xcvr()
993 case TC_DEVICEID_KRAKATOA_10BT_TPC: /* 3c900B-TPC */ in xl_choose_xcvr()
994 sc->xl_media = XL_MEDIAOPT_BT|XL_MEDIAOPT_BNC; in xl_choose_xcvr()
995 sc->xl_xcvr = XL_XCVR_10BT; in xl_choose_xcvr()
997 device_printf(sc->xl_dev, "guessing TPC (BNC/TP)\n"); in xl_choose_xcvr()
999 case TC_DEVICEID_CYCLONE_10FL: /* 3c900B-FL */ in xl_choose_xcvr()
1000 sc->xl_media = XL_MEDIAOPT_10FL; in xl_choose_xcvr()
1001 sc->xl_xcvr = XL_XCVR_AUI; in xl_choose_xcvr()
1003 device_printf(sc->xl_dev, "guessing 10baseFL\n"); in xl_choose_xcvr()
1005 case TC_DEVICEID_BOOMERANG_10_100BT: /* 3c905-TX */ in xl_choose_xcvr()
1015 case TC_DEVICEID_TORNADO_10_100BT_920B: /* 3c920B-EMB */ in xl_choose_xcvr()
1016 case TC_DEVICEID_TORNADO_10_100BT_920B_WNM: /* 3c920B-EMB-WNM */ in xl_choose_xcvr()
1017 sc->xl_media = XL_MEDIAOPT_MII; in xl_choose_xcvr()
1018 sc->xl_xcvr = XL_XCVR_MII; in xl_choose_xcvr()
1020 device_printf(sc->xl_dev, "guessing MII\n"); in xl_choose_xcvr()
1022 case TC_DEVICEID_BOOMERANG_100BT4: /* 3c905-T4 */ in xl_choose_xcvr()
1023 case TC_DEVICEID_CYCLONE_10_100BT4: /* 3c905B-T4 */ in xl_choose_xcvr()
1024 sc->xl_media = XL_MEDIAOPT_BT4; in xl_choose_xcvr()
1025 sc->xl_xcvr = XL_XCVR_MII; in xl_choose_xcvr()
1027 device_printf(sc->xl_dev, "guessing 100baseT4/MII\n"); in xl_choose_xcvr()
1029 case TC_DEVICEID_HURRICANE_10_100BT: /* 3c905B-TX */ in xl_choose_xcvr()
1030 case TC_DEVICEID_HURRICANE_10_100BT_SERV:/*3c980-TX */ in xl_choose_xcvr()
1031 case TC_DEVICEID_TORNADO_10_100BT_SERV: /* 3c980C-TX */ in xl_choose_xcvr()
1032 case TC_DEVICEID_HURRICANE_SOHO100TX: /* 3cSOHO100-TX */ in xl_choose_xcvr()
1033 case TC_DEVICEID_TORNADO_10_100BT: /* 3c905C-TX */ in xl_choose_xcvr()
1034 case TC_DEVICEID_TORNADO_HOMECONNECT: /* 3c450-TX */ in xl_choose_xcvr()
1035 sc->xl_media = XL_MEDIAOPT_BTX; in xl_choose_xcvr()
1036 sc->xl_xcvr = XL_XCVR_AUTO; in xl_choose_xcvr()
1038 device_printf(sc->xl_dev, "guessing 10/100 internal\n"); in xl_choose_xcvr()
1040 case TC_DEVICEID_CYCLONE_10_100_COMBO: /* 3c905B-COMBO */ in xl_choose_xcvr()
1041 sc->xl_media = XL_MEDIAOPT_BTX|XL_MEDIAOPT_BNC|XL_MEDIAOPT_AUI; in xl_choose_xcvr()
1042 sc->xl_xcvr = XL_XCVR_AUTO; in xl_choose_xcvr()
1044 device_printf(sc->xl_dev, in xl_choose_xcvr()
1048 device_printf(sc->xl_dev, in xl_choose_xcvr()
1049 "unknown device ID: %x -- defaulting to 10baseT\n", devid); in xl_choose_xcvr()
1050 sc->xl_media = XL_MEDIAOPT_BT; in xl_choose_xcvr()
1057 * setup and ethernet/BPF attach.
1063 u_int16_t sinfo2, xcvr[2]; in xl_attach() local
1071 sc->xl_dev = dev; in xl_attach()
1073 mtx_init(&sc->xl_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, in xl_attach()
1075 ifmedia_init(&sc->ifmedia, 0, xl_ifmedia_upd, xl_ifmedia_sts); in xl_attach()
1079 sc->xl_flags = 0; in xl_attach()
1081 sc->xl_flags |= XL_FLAG_EEPROM_OFFSET_30 | XL_FLAG_PHYOK; in xl_attach()
1084 sc->xl_flags |= XL_FLAG_FUNCREG | XL_FLAG_PHYOK | in xl_attach()
1089 sc->xl_flags |= XL_FLAG_8BITROM; in xl_attach()
1091 sc->xl_flags |= XL_FLAG_NO_XCVR_PWR; in xl_attach()
1097 sc->xl_flags |= XL_FLAG_FUNCREG; in xl_attach()
1103 sc->xl_flags |= XL_FLAG_PHYOK | XL_FLAG_EEPROM_OFFSET_30 | in xl_attach()
1106 sc->xl_flags |= XL_FLAG_FUNCREG | XL_FLAG_PHYOK; in xl_attach()
1108 sc->xl_flags |= XL_FLAG_INVERT_LED_PWR; in xl_attach()
1110 sc->xl_flags |= XL_FLAG_INVERT_MII_PWR; in xl_attach()
1112 sc->xl_flags |= XL_FLAG_INVERT_MII_PWR; in xl_attach()
1115 sc->xl_flags |= XL_FLAG_INVERT_MII_PWR | in xl_attach()
1119 sc->xl_flags |= XL_FLAG_PHYOK; in xl_attach()
1122 case TC_DEVICEID_BOOMERANG_10_100BT: /* 3c905-TX */ in xl_attach()
1126 sc->xl_flags |= XL_FLAG_NO_MMIO; in xl_attach()
1137 if ((sc->xl_flags & XL_FLAG_NO_MMIO) == 0) { in xl_attach()
1141 sc->xl_res = bus_alloc_resource_any(dev, res, &rid, RF_ACTIVE); in xl_attach()
1144 if (sc->xl_res != NULL) { in xl_attach()
1145 sc->xl_flags |= XL_FLAG_USE_MMIO; in xl_attach()
1151 sc->xl_res = bus_alloc_resource_any(dev, res, &rid, RF_ACTIVE); in xl_attach()
1152 if (sc->xl_res == NULL) { in xl_attach()
1161 sc->xl_btag = rman_get_bustag(sc->xl_res); in xl_attach()
1162 sc->xl_bhandle = rman_get_bushandle(sc->xl_res); in xl_attach()
1164 if (sc->xl_flags & XL_FLAG_FUNCREG) { in xl_attach()
1166 sc->xl_fres = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, in xl_attach()
1169 if (sc->xl_fres == NULL) { in xl_attach()
1175 sc->xl_ftag = rman_get_bustag(sc->xl_fres); in xl_attach()
1176 sc->xl_fhandle = rman_get_bushandle(sc->xl_fres); in xl_attach()
1181 sc->xl_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, in xl_attach()
1183 if (sc->xl_irq == NULL) { in xl_attach()
1190 ifp = sc->xl_ifp = if_alloc(IFT_ETHER); in xl_attach()
1208 callout_init_mtx(&sc->xl_tick_callout, &sc->xl_mtx, 0); in xl_attach()
1209 NET_TASK_INIT(&sc->xl_task, 0, xl_rxeof_task, sc); in xl_attach()
1213 * of DMA-able memory based on the tag. Also obtain the DMA in xl_attach()
1221 &sc->xl_ldata.xl_rx_tag); in xl_attach()
1227 error = bus_dmamem_alloc(sc->xl_ldata.xl_rx_tag, in xl_attach()
1228 (void **)&sc->xl_ldata.xl_rx_list, BUS_DMA_NOWAIT | in xl_attach()
1229 BUS_DMA_COHERENT | BUS_DMA_ZERO, &sc->xl_ldata.xl_rx_dmamap); in xl_attach()
1232 bus_dma_tag_destroy(sc->xl_ldata.xl_rx_tag); in xl_attach()
1233 sc->xl_ldata.xl_rx_tag = NULL; in xl_attach()
1237 error = bus_dmamap_load(sc->xl_ldata.xl_rx_tag, in xl_attach()
1238 sc->xl_ldata.xl_rx_dmamap, sc->xl_ldata.xl_rx_list, in xl_attach()
1240 &sc->xl_ldata.xl_rx_dmaaddr, BUS_DMA_NOWAIT); in xl_attach()
1243 bus_dmamem_free(sc->xl_ldata.xl_rx_tag, sc->xl_ldata.xl_rx_list, in xl_attach()
1244 sc->xl_ldata.xl_rx_dmamap); in xl_attach()
1245 bus_dma_tag_destroy(sc->xl_ldata.xl_rx_tag); in xl_attach()
1246 sc->xl_ldata.xl_rx_tag = NULL; in xl_attach()
1253 &sc->xl_ldata.xl_tx_tag); in xl_attach()
1259 error = bus_dmamem_alloc(sc->xl_ldata.xl_tx_tag, in xl_attach()
1260 (void **)&sc->xl_ldata.xl_tx_list, BUS_DMA_NOWAIT | in xl_attach()
1261 BUS_DMA_COHERENT | BUS_DMA_ZERO, &sc->xl_ldata.xl_tx_dmamap); in xl_attach()
1264 bus_dma_tag_destroy(sc->xl_ldata.xl_tx_tag); in xl_attach()
1265 sc->xl_ldata.xl_tx_tag = NULL; in xl_attach()
1269 error = bus_dmamap_load(sc->xl_ldata.xl_tx_tag, in xl_attach()
1270 sc->xl_ldata.xl_tx_dmamap, sc->xl_ldata.xl_tx_list, in xl_attach()
1272 &sc->xl_ldata.xl_tx_dmaaddr, BUS_DMA_NOWAIT); in xl_attach()
1275 bus_dmamem_free(sc->xl_ldata.xl_tx_tag, sc->xl_ldata.xl_tx_list, in xl_attach()
1276 sc->xl_ldata.xl_tx_dmamap); in xl_attach()
1277 bus_dma_tag_destroy(sc->xl_ldata.xl_tx_tag); in xl_attach()
1278 sc->xl_ldata.xl_tx_tag = NULL; in xl_attach()
1288 NULL, &sc->xl_mtag); in xl_attach()
1295 error = bus_dmamap_create(sc->xl_mtag, 0, &sc->xl_tmpmap); in xl_attach()
1309 xl_read_eeprom(sc, (caddr_t)&sc->xl_caps, XL_EE_CAPS, 1, 0); in xl_attach()
1310 if (sc->xl_caps & XL_CAPS_NO_TXLENGTH || in xl_attach()
1311 !(sc->xl_caps & XL_CAPS_LARGE_PKTS)) in xl_attach()
1312 sc->xl_type = XL_TYPE_905B; in xl_attach()
1314 sc->xl_type = XL_TYPE_90X; in xl_attach()
1317 if ((sc->xl_caps & XL_CAPS_PWRMGMT) != 0 && pci_has_pm(dev)) { in xl_attach()
1318 sc->xl_flags |= XL_FLAG_WOL; in xl_attach()
1327 sc->xl_tx_thresh = XL_MIN_FRAMELEN; in xl_attach()
1332 if (sc->xl_type == XL_TYPE_905B) { in xl_attach()
1340 if ((sc->xl_flags & XL_FLAG_WOL) != 0) in xl_attach()
1348 if_setsendqlen(ifp, XL_TX_LIST_CNT - 1); in xl_attach()
1357 sc->xl_media = CSR_READ_2(sc, XL_W3_MEDIA_OPT); in xl_attach()
1359 device_printf(dev, "media options word: %x\n", sc->xl_media); in xl_attach()
1361 xl_read_eeprom(sc, (char *)&xcvr, XL_EE_ICFG_0, 2, 0); in xl_attach()
1362 sc->xl_xcvr = xcvr[0] | xcvr[1] << 16; in xl_attach()
1363 sc->xl_xcvr &= XL_ICFG_CONNECTOR_MASK; in xl_attach()
1364 sc->xl_xcvr >>= XL_ICFG_CONNECTOR_BITS; in xl_attach()
1368 if (sc->xl_media & XL_MEDIAOPT_MII || in xl_attach()
1369 sc->xl_media & XL_MEDIAOPT_BTX || in xl_attach()
1370 sc->xl_media & XL_MEDIAOPT_BT4) { in xl_attach()
1381 if ((sc->xl_flags & XL_FLAG_PHYOK) == 0) in xl_attach()
1383 error = mii_attach(dev, &sc->xl_miibus, ifp, xl_ifmedia_upd, in xl_attach()
1385 sc->xl_type == XL_TYPE_905B ? MIIF_DOPAUSE : 0); in xl_attach()
1398 if (sc->xl_xcvr == XL_XCVR_AUTO) in xl_attach()
1402 * Do ifmedia setup. in xl_attach()
1404 if (sc->xl_media & XL_MEDIAOPT_BT) { in xl_attach()
1407 ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_T, 0, NULL); in xl_attach()
1408 ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_T|IFM_HDX, 0, NULL); in xl_attach()
1409 if (sc->xl_caps & XL_CAPS_FULL_DUPLEX) in xl_attach()
1410 ifmedia_add(&sc->ifmedia, in xl_attach()
1414 if (sc->xl_media & (XL_MEDIAOPT_AUI|XL_MEDIAOPT_10FL)) { in xl_attach()
1418 if (sc->xl_type == XL_TYPE_905B && in xl_attach()
1419 sc->xl_media == XL_MEDIAOPT_10FL) { in xl_attach()
1422 ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_FL, 0, NULL); in xl_attach()
1423 ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_FL|IFM_HDX, in xl_attach()
1425 if (sc->xl_caps & XL_CAPS_FULL_DUPLEX) in xl_attach()
1426 ifmedia_add(&sc->ifmedia, in xl_attach()
1431 ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_5, 0, NULL); in xl_attach()
1435 if (sc->xl_media & XL_MEDIAOPT_BNC) { in xl_attach()
1438 ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_2, 0, NULL); in xl_attach()
1441 if (sc->xl_media & XL_MEDIAOPT_BFX) { in xl_attach()
1444 ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_100_FX, 0, NULL); in xl_attach()
1450 if (sc->xl_miibus == NULL) in xl_attach()
1451 ifmedia_set(&sc->ifmedia, media); in xl_attach()
1454 if (sc->xl_flags & XL_FLAG_NO_XCVR_PWR) { in xl_attach()
1464 error = bus_setup_intr(dev, sc->xl_irq, INTR_TYPE_NET | INTR_MPSAFE, in xl_attach()
1465 NULL, xl_intr, sc, &sc->xl_intrhand); in xl_attach()
1482 * acquires/releases the non-recursible driver mutex to
1491 switch (sc->xl_xcvr) { in xl_choose_media()
1497 if (sc->xl_type == XL_TYPE_905B && in xl_choose_media()
1498 sc->xl_media == XL_MEDIAOPT_10FL) { in xl_choose_media()
1519 device_printf(sc->xl_dev, "unknown XCVR type: %d\n", in xl_choose_media()
1520 sc->xl_xcvr); in xl_choose_media()
1547 ifp = sc->xl_ifp; in xl_detach()
1549 KASSERT(mtx_initialized(&sc->xl_mtx), ("xl mutex not initialized")); in xl_detach()
1556 if (sc->xl_flags & XL_FLAG_USE_MMIO) { in xl_detach()
1569 taskqueue_drain(taskqueue_swi, &sc->xl_task); in xl_detach()
1570 callout_drain(&sc->xl_tick_callout); in xl_detach()
1574 ifmedia_removeall(&sc->ifmedia); in xl_detach()
1576 if (sc->xl_intrhand) in xl_detach()
1577 bus_teardown_intr(dev, sc->xl_irq, sc->xl_intrhand); in xl_detach()
1578 if (sc->xl_irq) in xl_detach()
1579 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->xl_irq); in xl_detach()
1580 if (sc->xl_fres != NULL) in xl_detach()
1582 XL_PCI_FUNCMEM, sc->xl_fres); in xl_detach()
1583 if (sc->xl_res) in xl_detach()
1584 bus_release_resource(dev, res, rid, sc->xl_res); in xl_detach()
1589 if (sc->xl_mtag) { in xl_detach()
1590 bus_dmamap_destroy(sc->xl_mtag, sc->xl_tmpmap); in xl_detach()
1591 bus_dma_tag_destroy(sc->xl_mtag); in xl_detach()
1593 if (sc->xl_ldata.xl_rx_tag) { in xl_detach()
1594 bus_dmamap_unload(sc->xl_ldata.xl_rx_tag, in xl_detach()
1595 sc->xl_ldata.xl_rx_dmamap); in xl_detach()
1596 bus_dmamem_free(sc->xl_ldata.xl_rx_tag, sc->xl_ldata.xl_rx_list, in xl_detach()
1597 sc->xl_ldata.xl_rx_dmamap); in xl_detach()
1598 bus_dma_tag_destroy(sc->xl_ldata.xl_rx_tag); in xl_detach()
1600 if (sc->xl_ldata.xl_tx_tag) { in xl_detach()
1601 bus_dmamap_unload(sc->xl_ldata.xl_tx_tag, in xl_detach()
1602 sc->xl_ldata.xl_tx_dmamap); in xl_detach()
1603 bus_dmamem_free(sc->xl_ldata.xl_tx_tag, sc->xl_ldata.xl_tx_list, in xl_detach()
1604 sc->xl_ldata.xl_tx_dmamap); in xl_detach()
1605 bus_dma_tag_destroy(sc->xl_ldata.xl_tx_tag); in xl_detach()
1608 mtx_destroy(&sc->xl_mtx); in xl_detach()
1625 cd = &sc->xl_cdata; in xl_list_tx_init()
1626 ld = &sc->xl_ldata; in xl_list_tx_init()
1628 cd->xl_tx_chain[i].xl_ptr = &ld->xl_tx_list[i]; in xl_list_tx_init()
1629 error = bus_dmamap_create(sc->xl_mtag, 0, in xl_list_tx_init()
1630 &cd->xl_tx_chain[i].xl_map); in xl_list_tx_init()
1633 cd->xl_tx_chain[i].xl_phys = ld->xl_tx_dmaaddr + in xl_list_tx_init()
1635 if (i == (XL_TX_LIST_CNT - 1)) in xl_list_tx_init()
1636 cd->xl_tx_chain[i].xl_next = NULL; in xl_list_tx_init()
1638 cd->xl_tx_chain[i].xl_next = &cd->xl_tx_chain[i + 1]; in xl_list_tx_init()
1641 cd->xl_tx_free = &cd->xl_tx_chain[0]; in xl_list_tx_init()
1642 cd->xl_tx_tail = cd->xl_tx_head = NULL; in xl_list_tx_init()
1644 bus_dmamap_sync(ld->xl_tx_tag, ld->xl_tx_dmamap, BUS_DMASYNC_PREWRITE); in xl_list_tx_init()
1660 cd = &sc->xl_cdata; in xl_list_tx_init_90xB()
1661 ld = &sc->xl_ldata; in xl_list_tx_init_90xB()
1663 cd->xl_tx_chain[i].xl_ptr = &ld->xl_tx_list[i]; in xl_list_tx_init_90xB()
1664 error = bus_dmamap_create(sc->xl_mtag, 0, in xl_list_tx_init_90xB()
1665 &cd->xl_tx_chain[i].xl_map); in xl_list_tx_init_90xB()
1668 cd->xl_tx_chain[i].xl_phys = ld->xl_tx_dmaaddr + in xl_list_tx_init_90xB()
1670 if (i == (XL_TX_LIST_CNT - 1)) in xl_list_tx_init_90xB()
1671 cd->xl_tx_chain[i].xl_next = &cd->xl_tx_chain[0]; in xl_list_tx_init_90xB()
1673 cd->xl_tx_chain[i].xl_next = &cd->xl_tx_chain[i + 1]; in xl_list_tx_init_90xB()
1675 cd->xl_tx_chain[i].xl_prev = in xl_list_tx_init_90xB()
1676 &cd->xl_tx_chain[XL_TX_LIST_CNT - 1]; in xl_list_tx_init_90xB()
1678 cd->xl_tx_chain[i].xl_prev = in xl_list_tx_init_90xB()
1679 &cd->xl_tx_chain[i - 1]; in xl_list_tx_init_90xB()
1682 bzero(ld->xl_tx_list, XL_TX_LIST_SZ); in xl_list_tx_init_90xB()
1683 ld->xl_tx_list[0].xl_status = htole32(XL_TXSTAT_EMPTY); in xl_list_tx_init_90xB()
1685 cd->xl_tx_prod = 1; in xl_list_tx_init_90xB()
1686 cd->xl_tx_cons = 1; in xl_list_tx_init_90xB()
1687 cd->xl_tx_cnt = 0; in xl_list_tx_init_90xB()
1689 bus_dmamap_sync(ld->xl_tx_tag, ld->xl_tx_dmamap, BUS_DMASYNC_PREWRITE); in xl_list_tx_init_90xB()
1708 cd = &sc->xl_cdata; in xl_list_rx_init()
1709 ld = &sc->xl_ldata; in xl_list_rx_init()
1712 cd->xl_rx_chain[i].xl_ptr = &ld->xl_rx_list[i]; in xl_list_rx_init()
1713 error = bus_dmamap_create(sc->xl_mtag, 0, in xl_list_rx_init()
1714 &cd->xl_rx_chain[i].xl_map); in xl_list_rx_init()
1717 error = xl_newbuf(sc, &cd->xl_rx_chain[i]); in xl_list_rx_init()
1720 if (i == (XL_RX_LIST_CNT - 1)) in xl_list_rx_init()
1724 nextptr = ld->xl_rx_dmaaddr + in xl_list_rx_init()
1726 cd->xl_rx_chain[i].xl_next = &cd->xl_rx_chain[next]; in xl_list_rx_init()
1727 ld->xl_rx_list[i].xl_next = htole32(nextptr); in xl_list_rx_init()
1730 bus_dmamap_sync(ld->xl_rx_tag, ld->xl_rx_dmamap, BUS_DMASYNC_PREWRITE); in xl_list_rx_init()
1731 cd->xl_rx_head = &cd->xl_rx_chain[0]; in xl_list_rx_init()
1755 m_new->m_len = m_new->m_pkthdr.len = MCLBYTES; in xl_newbuf()
1760 error = bus_dmamap_load_mbuf_sg(sc->xl_mtag, sc->xl_tmpmap, m_new, in xl_newbuf()
1764 device_printf(sc->xl_dev, "can't map mbuf (error %d)\n", in xl_newbuf()
1771 bus_dmamap_unload(sc->xl_mtag, c->xl_map); in xl_newbuf()
1772 map = c->xl_map; in xl_newbuf()
1773 c->xl_map = sc->xl_tmpmap; in xl_newbuf()
1774 sc->xl_tmpmap = map; in xl_newbuf()
1775 c->xl_mbuf = m_new; in xl_newbuf()
1776 c->xl_ptr->xl_frag.xl_len = htole32(m_new->m_len | XL_LAST_FRAG); in xl_newbuf()
1777 c->xl_ptr->xl_frag.xl_addr = htole32(segs->ds_addr); in xl_newbuf()
1778 c->xl_ptr->xl_status = 0; in xl_newbuf()
1779 bus_dmamap_sync(sc->xl_mtag, c->xl_map, BUS_DMASYNC_PREREAD); in xl_newbuf()
1791 pos = sc->xl_cdata.xl_rx_head; in xl_rx_resync()
1794 if (pos->xl_ptr->xl_status) in xl_rx_resync()
1796 pos = pos->xl_next; in xl_rx_resync()
1802 sc->xl_cdata.xl_rx_head = pos; in xl_rx_resync()
1815 if_t ifp = sc->xl_ifp; in xl_rxeof()
1823 bus_dmamap_sync(sc->xl_ldata.xl_rx_tag, sc->xl_ldata.xl_rx_dmamap, in xl_rxeof()
1825 while ((rxstat = le32toh(sc->xl_cdata.xl_rx_head->xl_ptr->xl_status))) { in xl_rxeof()
1828 if (sc->rxcycles <= 0) in xl_rxeof()
1830 sc->rxcycles--; in xl_rxeof()
1833 cur_rx = sc->xl_cdata.xl_rx_head; in xl_rxeof()
1834 sc->xl_cdata.xl_rx_head = cur_rx->xl_next; in xl_rxeof()
1850 * it should simply get re-used next time this descriptor in xl_rxeof()
1855 cur_rx->xl_ptr->xl_status = 0; in xl_rxeof()
1856 bus_dmamap_sync(sc->xl_ldata.xl_rx_tag, in xl_rxeof()
1857 sc->xl_ldata.xl_rx_dmamap, BUS_DMASYNC_PREWRITE); in xl_rxeof()
1867 device_printf(sc->xl_dev, in xl_rxeof()
1868 "bad receive status -- packet dropped\n"); in xl_rxeof()
1870 cur_rx->xl_ptr->xl_status = 0; in xl_rxeof()
1871 bus_dmamap_sync(sc->xl_ldata.xl_rx_tag, in xl_rxeof()
1872 sc->xl_ldata.xl_rx_dmamap, BUS_DMASYNC_PREWRITE); in xl_rxeof()
1877 bus_dmamap_sync(sc->xl_mtag, cur_rx->xl_map, in xl_rxeof()
1879 m = cur_rx->xl_mbuf; in xl_rxeof()
1890 cur_rx->xl_ptr->xl_status = 0; in xl_rxeof()
1891 bus_dmamap_sync(sc->xl_ldata.xl_rx_tag, in xl_rxeof()
1892 sc->xl_ldata.xl_rx_dmamap, BUS_DMASYNC_PREWRITE); in xl_rxeof()
1895 bus_dmamap_sync(sc->xl_ldata.xl_rx_tag, in xl_rxeof()
1896 sc->xl_ldata.xl_rx_dmamap, BUS_DMASYNC_PREWRITE); in xl_rxeof()
1899 m->m_pkthdr.rcvif = ifp; in xl_rxeof()
1900 m->m_pkthdr.len = m->m_len = total_len; in xl_rxeof()
1905 m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED; in xl_rxeof()
1907 m->m_pkthdr.csum_flags |= CSUM_IP_VALID; in xl_rxeof()
1912 m->m_pkthdr.csum_flags |= in xl_rxeof()
1914 m->m_pkthdr.csum_data = 0xffff; in xl_rxeof()
1947 CSR_WRITE_4(sc, XL_UPLIST_PTR, sc->xl_ldata.xl_rx_dmaaddr); in xl_rxeof()
1948 sc->xl_cdata.xl_rx_head = &sc->xl_cdata.xl_rx_chain[0]; in xl_rxeof()
1964 if (if_getdrvflags(sc->xl_ifp) & IFF_DRV_RUNNING) in xl_rxeof_task()
1977 if_t ifp = sc->xl_ifp; in xl_txeof()
1990 while (sc->xl_cdata.xl_tx_head != NULL) { in xl_txeof()
1991 cur_tx = sc->xl_cdata.xl_tx_head; in xl_txeof()
1996 sc->xl_cdata.xl_tx_head = cur_tx->xl_next; in xl_txeof()
1997 bus_dmamap_sync(sc->xl_mtag, cur_tx->xl_map, in xl_txeof()
1999 bus_dmamap_unload(sc->xl_mtag, cur_tx->xl_map); in xl_txeof()
2000 m_freem(cur_tx->xl_mbuf); in xl_txeof()
2001 cur_tx->xl_mbuf = NULL; in xl_txeof()
2005 cur_tx->xl_next = sc->xl_cdata.xl_tx_free; in xl_txeof()
2006 sc->xl_cdata.xl_tx_free = cur_tx; in xl_txeof()
2009 if (sc->xl_cdata.xl_tx_head == NULL) { in xl_txeof()
2010 sc->xl_wdog_timer = 0; in xl_txeof()
2011 sc->xl_cdata.xl_tx_tail = NULL; in xl_txeof()
2016 sc->xl_cdata.xl_tx_head->xl_phys); in xl_txeof()
2026 if_t ifp = sc->xl_ifp; in xl_txeof_90xB()
2031 bus_dmamap_sync(sc->xl_ldata.xl_tx_tag, sc->xl_ldata.xl_tx_dmamap, in xl_txeof_90xB()
2033 idx = sc->xl_cdata.xl_tx_cons; in xl_txeof_90xB()
2034 while (idx != sc->xl_cdata.xl_tx_prod) { in xl_txeof_90xB()
2035 cur_tx = &sc->xl_cdata.xl_tx_chain[idx]; in xl_txeof_90xB()
2037 if (!(le32toh(cur_tx->xl_ptr->xl_status) & in xl_txeof_90xB()
2041 if (cur_tx->xl_mbuf != NULL) { in xl_txeof_90xB()
2042 bus_dmamap_sync(sc->xl_mtag, cur_tx->xl_map, in xl_txeof_90xB()
2044 bus_dmamap_unload(sc->xl_mtag, cur_tx->xl_map); in xl_txeof_90xB()
2045 m_freem(cur_tx->xl_mbuf); in xl_txeof_90xB()
2046 cur_tx->xl_mbuf = NULL; in xl_txeof_90xB()
2051 sc->xl_cdata.xl_tx_cnt--; in xl_txeof_90xB()
2055 if (sc->xl_cdata.xl_tx_cnt == 0) in xl_txeof_90xB()
2056 sc->xl_wdog_timer = 0; in xl_txeof_90xB()
2057 sc->xl_cdata.xl_tx_cons = idx; in xl_txeof_90xB()
2079 device_printf(sc->xl_dev, in xl_txeoc()
2083 if (sc->xl_type == XL_TYPE_905B) { in xl_txeoc()
2084 if (sc->xl_cdata.xl_tx_cnt) { in xl_txeoc()
2088 i = sc->xl_cdata.xl_tx_cons; in xl_txeoc()
2089 c = &sc->xl_cdata.xl_tx_chain[i]; in xl_txeoc()
2091 c->xl_phys); in xl_txeoc()
2093 sc->xl_wdog_timer = 5; in xl_txeoc()
2096 if (sc->xl_cdata.xl_tx_head != NULL) { in xl_txeoc()
2098 sc->xl_cdata.xl_tx_head->xl_phys); in xl_txeoc()
2099 sc->xl_wdog_timer = 5; in xl_txeoc()
2108 sc->xl_tx_thresh < XL_PACKET_SIZE) { in xl_txeoc()
2109 sc->xl_tx_thresh += XL_MIN_FRAMELEN; in xl_txeoc()
2110 device_printf(sc->xl_dev, in xl_txeoc()
2111 "tx underrun, increasing tx start threshold to %d bytes\n", sc->xl_tx_thresh); in xl_txeoc()
2114 XL_CMD_TX_SET_START|sc->xl_tx_thresh); in xl_txeoc()
2115 if (sc->xl_type == XL_TYPE_905B) { in xl_txeoc()
2137 if_t ifp = sc->xl_ifp; in xl_intr()
2166 if (sc->xl_type == XL_TYPE_905B) in xl_intr()
2189 if (sc->xl_type == XL_TYPE_905B) in xl_intr()
2220 sc->rxcycles = count; in xl_poll_locked()
2222 if (sc->xl_type == XL_TYPE_905B) in xl_poll_locked()
2228 if (sc->xl_type == XL_TYPE_905B) in xl_poll_locked()
2268 if (sc->xl_miibus != NULL) { in xl_tick()
2269 mii = device_get_softc(sc->xl_miibus); in xl_tick()
2277 callout_reset(&sc->xl_tick_callout, hz, xl_tick, sc); in xl_tick()
2283 if_t ifp = sc->xl_ifp; in xl_stats_update()
2326 if_t ifp = sc->xl_ifp; in xl_encap()
2332 error = bus_dmamap_load_mbuf_sg(sc->xl_mtag, c->xl_map, *m_head, in xl_encap()
2333 sc->xl_cdata.xl_tx_segs, &nseg, BUS_DMA_NOWAIT); in xl_encap()
2357 error = bus_dmamap_load_mbuf_sg(sc->xl_mtag, c->xl_map, in xl_encap()
2358 *m_head, sc->xl_cdata.xl_tx_segs, &nseg, BUS_DMA_NOWAIT); in xl_encap()
2374 bus_dmamap_sync(sc->xl_mtag, c->xl_map, BUS_DMASYNC_PREWRITE); in xl_encap()
2378 KASSERT(sc->xl_cdata.xl_tx_segs[i].ds_len <= MCLBYTES, in xl_encap()
2380 c->xl_ptr->xl_frag[i].xl_addr = in xl_encap()
2381 htole32(sc->xl_cdata.xl_tx_segs[i].ds_addr); in xl_encap()
2382 c->xl_ptr->xl_frag[i].xl_len = in xl_encap()
2383 htole32(sc->xl_cdata.xl_tx_segs[i].ds_len); in xl_encap()
2384 total_len += sc->xl_cdata.xl_tx_segs[i].ds_len; in xl_encap()
2386 c->xl_ptr->xl_frag[nseg - 1].xl_len |= htole32(XL_LAST_FRAG); in xl_encap()
2388 if (sc->xl_type == XL_TYPE_905B) { in xl_encap()
2392 if ((*m_head)->m_pkthdr.csum_flags) { in xl_encap()
2393 if ((*m_head)->m_pkthdr.csum_flags & CSUM_IP) in xl_encap()
2395 if ((*m_head)->m_pkthdr.csum_flags & CSUM_TCP) in xl_encap()
2397 if ((*m_head)->m_pkthdr.csum_flags & CSUM_UDP) in xl_encap()
2403 c->xl_ptr->xl_status = htole32(status); in xl_encap()
2404 c->xl_ptr->xl_next = 0; in xl_encap()
2406 c->xl_mbuf = *m_head; in xl_encap()
2424 if (sc->xl_type == XL_TYPE_905B) in xl_start()
2450 if (sc->xl_cdata.xl_tx_free == NULL) { in xl_start_locked()
2453 if (sc->xl_cdata.xl_tx_free == NULL) { in xl_start_locked()
2459 start_tx = sc->xl_cdata.xl_tx_free; in xl_start_locked()
2462 sc->xl_cdata.xl_tx_free != NULL;) { in xl_start_locked()
2469 cur_tx = sc->xl_cdata.xl_tx_free; in xl_start_locked()
2482 sc->xl_cdata.xl_tx_free = cur_tx->xl_next; in xl_start_locked()
2483 cur_tx->xl_next = NULL; in xl_start_locked()
2487 prev->xl_next = cur_tx; in xl_start_locked()
2488 prev->xl_ptr->xl_next = htole32(cur_tx->xl_phys); in xl_start_locked()
2496 BPF_MTAP(ifp, cur_tx->xl_mbuf); in xl_start_locked()
2512 cur_tx->xl_ptr->xl_status |= htole32(XL_TXSTAT_DL_INTR); in xl_start_locked()
2521 if (sc->xl_cdata.xl_tx_head != NULL) { in xl_start_locked()
2522 sc->xl_cdata.xl_tx_tail->xl_next = start_tx; in xl_start_locked()
2523 sc->xl_cdata.xl_tx_tail->xl_ptr->xl_next = in xl_start_locked()
2524 htole32(start_tx->xl_phys); in xl_start_locked()
2525 sc->xl_cdata.xl_tx_tail->xl_ptr->xl_status &= in xl_start_locked()
2527 sc->xl_cdata.xl_tx_tail = cur_tx; in xl_start_locked()
2529 sc->xl_cdata.xl_tx_head = start_tx; in xl_start_locked()
2530 sc->xl_cdata.xl_tx_tail = cur_tx; in xl_start_locked()
2532 bus_dmamap_sync(sc->xl_ldata.xl_tx_tag, sc->xl_ldata.xl_tx_dmamap, in xl_start_locked()
2535 CSR_WRITE_4(sc, XL_DOWNLIST_PTR, start_tx->xl_phys); in xl_start_locked()
2544 sc->xl_wdog_timer = 5; in xl_start_locked()
2561 taskqueue_enqueue(taskqueue_swi, &sc->xl_task); in xl_start_locked()
2579 idx = sc->xl_cdata.xl_tx_prod; in xl_start_90xB_locked()
2580 start_tx = &sc->xl_cdata.xl_tx_chain[idx]; in xl_start_90xB_locked()
2583 sc->xl_cdata.xl_tx_chain[idx].xl_mbuf == NULL;) { in xl_start_90xB_locked()
2584 if ((XL_TX_LIST_CNT - sc->xl_cdata.xl_tx_cnt) < 3) { in xl_start_90xB_locked()
2594 cur_tx = &sc->xl_cdata.xl_tx_chain[idx]; in xl_start_90xB_locked()
2609 prev->xl_ptr->xl_next = htole32(cur_tx->xl_phys); in xl_start_90xB_locked()
2616 BPF_MTAP(ifp, cur_tx->xl_mbuf); in xl_start_90xB_locked()
2619 sc->xl_cdata.xl_tx_cnt++; in xl_start_90xB_locked()
2635 cur_tx->xl_ptr->xl_status |= htole32(XL_TXSTAT_DL_INTR); in xl_start_90xB_locked()
2638 sc->xl_cdata.xl_tx_prod = idx; in xl_start_90xB_locked()
2639 start_tx->xl_prev->xl_ptr->xl_next = htole32(start_tx->xl_phys); in xl_start_90xB_locked()
2640 bus_dmamap_sync(sc->xl_ldata.xl_tx_tag, sc->xl_ldata.xl_tx_dmamap, in xl_start_90xB_locked()
2646 sc->xl_wdog_timer = 5; in xl_start_90xB_locked()
2662 if_t ifp = sc->xl_ifp; in xl_init_locked()
2678 if (sc->xl_miibus == NULL) { in xl_init_locked()
2686 if (sc->xl_miibus != NULL) in xl_init_locked()
2687 mii = device_get_softc(sc->xl_miibus); in xl_init_locked()
2693 if ((sc->xl_flags & XL_FLAG_WOL) != 0) { in xl_init_locked()
2702 if_getlladdr(sc->xl_ifp)[i]); in xl_init_locked()
2718 device_printf(sc->xl_dev, "initialization of the rx ring failed (%d)\n", in xl_init_locked()
2725 if (sc->xl_type == XL_TYPE_905B) in xl_init_locked()
2730 device_printf(sc->xl_dev, "initialization of the tx ring failed (%d)\n", in xl_init_locked()
2745 CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_TX_SET_START|sc->xl_tx_thresh); in xl_init_locked()
2756 if (sc->xl_type == XL_TYPE_905B) { in xl_init_locked()
2776 CSR_WRITE_4(sc, XL_UPLIST_PTR, sc->xl_ldata.xl_rx_dmaaddr); in xl_init_locked()
2780 if (sc->xl_type == XL_TYPE_905B) { in xl_init_locked()
2787 sc->xl_cdata.xl_tx_chain[0].xl_phys); in xl_init_locked()
2794 * the DC-DC converter. in xl_init_locked()
2797 if (sc->xl_xcvr == XL_XCVR_COAX) in xl_init_locked()
2809 if (sc->xl_type == XL_TYPE_905B) in xl_init_locked()
2837 if (sc->xl_flags & XL_FLAG_FUNCREG) in xl_init_locked()
2838 bus_space_write_4(sc->xl_ftag, sc->xl_fhandle, 4, 0x8000); in xl_init_locked()
2860 sc->xl_wdog_timer = 0; in xl_init_locked()
2861 callout_reset(&sc->xl_tick_callout, hz, xl_tick, sc); in xl_init_locked()
2876 if (sc->xl_miibus != NULL) in xl_ifmedia_upd()
2877 mii = device_get_softc(sc->xl_miibus); in xl_ifmedia_upd()
2879 ifm = &sc->ifmedia; in xl_ifmedia_upd()
2881 ifm = &mii->mii_media; in xl_ifmedia_upd()
2883 switch (IFM_SUBTYPE(ifm->ifm_media)) { in xl_ifmedia_upd()
2888 xl_setmode(sc, ifm->ifm_media); in xl_ifmedia_upd()
2893 if (sc->xl_media & XL_MEDIAOPT_MII || in xl_ifmedia_upd()
2894 sc->xl_media & XL_MEDIAOPT_BTX || in xl_ifmedia_upd()
2895 sc->xl_media & XL_MEDIAOPT_BT4) { in xl_ifmedia_upd()
2899 xl_setmode(sc, ifm->ifm_media); in xl_ifmedia_upd()
2920 if (sc->xl_miibus != NULL) in xl_ifmedia_sts()
2921 mii = device_get_softc(sc->xl_miibus); in xl_ifmedia_sts()
2930 ifmr->ifm_active = IFM_ETHER; in xl_ifmedia_sts()
2931 ifmr->ifm_status = IFM_AVALID; in xl_ifmedia_sts()
2934 ifmr->ifm_status |= IFM_ACTIVE; in xl_ifmedia_sts()
2938 ifmr->ifm_active = IFM_ETHER|IFM_10_T; in xl_ifmedia_sts()
2940 ifmr->ifm_active |= IFM_FDX; in xl_ifmedia_sts()
2942 ifmr->ifm_active |= IFM_HDX; in xl_ifmedia_sts()
2945 if (sc->xl_type == XL_TYPE_905B && in xl_ifmedia_sts()
2946 sc->xl_media == XL_MEDIAOPT_10FL) { in xl_ifmedia_sts()
2947 ifmr->ifm_active = IFM_ETHER|IFM_10_FL; in xl_ifmedia_sts()
2949 ifmr->ifm_active |= IFM_FDX; in xl_ifmedia_sts()
2951 ifmr->ifm_active |= IFM_HDX; in xl_ifmedia_sts()
2953 ifmr->ifm_active = IFM_ETHER|IFM_10_5; in xl_ifmedia_sts()
2956 ifmr->ifm_active = IFM_ETHER|IFM_10_2; in xl_ifmedia_sts()
2967 ifmr->ifm_active = mii->mii_media_active; in xl_ifmedia_sts()
2968 ifmr->ifm_status = mii->mii_media_status; in xl_ifmedia_sts()
2972 ifmr->ifm_active = IFM_ETHER|IFM_100_FX; in xl_ifmedia_sts()
2975 if_printf(ifp, "unknown XCVR type: %d\n", icfg); in xl_ifmedia_sts()
2995 (if_getflags(ifp) ^ sc->xl_if_flags) & in xl_ioctl()
3004 sc->xl_if_flags = if_getflags(ifp); in xl_ioctl()
3017 if (sc->xl_miibus != NULL) in xl_ioctl()
3018 mii = device_get_softc(sc->xl_miibus); in xl_ioctl()
3021 &sc->ifmedia, command); in xl_ioctl()
3024 &mii->mii_media, command); in xl_ioctl()
3027 mask = ifr->ifr_reqcap ^ if_getcapenable(ifp); in xl_ioctl()
3049 if (sc->xl_flags & XL_FLAG_FUNCREG) in xl_ioctl()
3050 bus_space_write_4(sc->xl_ftag, in xl_ioctl()
3051 sc->xl_fhandle, 4, 0x8000); in xl_ioctl()
3084 if_t ifp = sc->xl_ifp; in xl_watchdog()
3090 if (sc->xl_wdog_timer == 0 || --sc->xl_wdog_timer != 0) in xl_watchdog()
3096 if (sc->xl_type == XL_TYPE_905B) { in xl_watchdog()
3098 if (sc->xl_cdata.xl_tx_cnt == 0) in xl_watchdog()
3102 if (sc->xl_cdata.xl_tx_head == NULL) in xl_watchdog()
3106 device_printf(sc->xl_dev, in xl_watchdog()
3107 "watchdog timeout (missed Tx interrupts) -- recovering\n"); in xl_watchdog()
3114 device_printf(sc->xl_dev, "watchdog timeout\n"); in xl_watchdog()
3117 device_printf(sc->xl_dev, in xl_watchdog()
3118 "no carrier - transceiver cable problem?\n"); in xl_watchdog()
3124 if (sc->xl_type == XL_TYPE_905B) in xl_watchdog()
3141 if_t ifp = sc->xl_ifp; in xl_stop()
3145 sc->xl_wdog_timer = 0; in xl_stop()
3166 if (sc->xl_flags & XL_FLAG_FUNCREG) in xl_stop()
3167 bus_space_write_4(sc->xl_ftag, sc->xl_fhandle, 4, 0x8000); in xl_stop()
3170 callout_stop(&sc->xl_tick_callout); in xl_stop()
3176 if (sc->xl_cdata.xl_rx_chain[i].xl_mbuf != NULL) { in xl_stop()
3177 bus_dmamap_unload(sc->xl_mtag, in xl_stop()
3178 sc->xl_cdata.xl_rx_chain[i].xl_map); in xl_stop()
3179 bus_dmamap_destroy(sc->xl_mtag, in xl_stop()
3180 sc->xl_cdata.xl_rx_chain[i].xl_map); in xl_stop()
3181 m_freem(sc->xl_cdata.xl_rx_chain[i].xl_mbuf); in xl_stop()
3182 sc->xl_cdata.xl_rx_chain[i].xl_mbuf = NULL; in xl_stop()
3185 if (sc->xl_ldata.xl_rx_list != NULL) in xl_stop()
3186 bzero(sc->xl_ldata.xl_rx_list, XL_RX_LIST_SZ); in xl_stop()
3191 if (sc->xl_cdata.xl_tx_chain[i].xl_mbuf != NULL) { in xl_stop()
3192 bus_dmamap_unload(sc->xl_mtag, in xl_stop()
3193 sc->xl_cdata.xl_tx_chain[i].xl_map); in xl_stop()
3194 bus_dmamap_destroy(sc->xl_mtag, in xl_stop()
3195 sc->xl_cdata.xl_tx_chain[i].xl_map); in xl_stop()
3196 m_freem(sc->xl_cdata.xl_tx_chain[i].xl_mbuf); in xl_stop()
3197 sc->xl_cdata.xl_tx_chain[i].xl_mbuf = NULL; in xl_stop()
3200 if (sc->xl_ldata.xl_tx_list != NULL) in xl_stop()
3201 bzero(sc->xl_ldata.xl_tx_list, XL_TX_LIST_SZ); in xl_stop()
3239 ifp = sc->xl_ifp; in xl_resume()
3259 if ((sc->xl_flags & XL_FLAG_WOL) == 0) in xl_setwol()
3262 ifp = sc->xl_ifp; in xl_setwol()
3275 pci_enable_pme(sc->xl_dev); in xl_setwol()