Lines Matching +full:i2c +full:- +full:transfer +full:- +full:timeout +full:- +full:us

3 /*-
4 * SPDX-License-Identifier: BSD-4-Clause
20 * 4. Neither the name of the author nor the names of any co-contributors
36 /*-
54 * SysKonnect SK-NET gigabit ethernet driver for FreeBSD. Supports
55 * the SK-984x series adapters, both single port and dual port.
58 * https://www.freebsd.org/~wpaul/SysKonnect/xmacii_datasheet_rev_c_9-29.pdf
65 * https://people.freebsd.org/~wpaul/SysKonnect/xmacii_datasheet_rev_c_9-29.pdf
176 "D-Link DGE-530T Gigabit Ethernet"
181 "D-Link DGE-530T Gigabit Ethernet"
269 * It seems that SK-NET GENESIS supports very simple checksum offload
335 { -1, 0, 0 }
341 { -1, 0, 0 }
440 switch(sc_if->sk_softc->sk_type) { in sk_miibus_readreg()
467 switch(sc_if->sk_softc->sk_type) { in sk_miibus_writereg()
493 switch(sc_if->sk_softc->sk_type) { in sk_miibus_statchg()
515 if (sc_if->sk_phytype != SK_PHYTYPE_XMAC) { in sk_xmac_miibus_readreg()
524 if_printf(sc_if->sk_ifp, "phy failed to come ready\n"); in sk_xmac_miibus_readreg()
546 if_printf(sc_if->sk_ifp, "phy failed to come ready\n"); in sk_xmac_miibus_writereg()
557 if_printf(sc_if->sk_ifp, "phy write timed out\n"); in sk_xmac_miibus_writereg()
567 mii = device_get_softc(sc_if->sk_miibus); in sk_xmac_miibus_statchg()
573 if (sc_if->sk_phytype != SK_PHYTYPE_XMAC) { in sk_xmac_miibus_statchg()
574 if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX) { in sk_xmac_miibus_statchg()
588 if (sc_if->sk_phytype != SK_PHYTYPE_MARV_COPPER && in sk_marv_miibus_readreg()
589 sc_if->sk_phytype != SK_PHYTYPE_MARV_FIBER) { in sk_marv_miibus_readreg()
604 if_printf(sc_if->sk_ifp, "phy failed to come ready\n"); in sk_marv_miibus_readreg()
628 if_printf(sc_if->sk_ifp, "phy write timeout\n"); in sk_marv_miibus_writereg()
649 return (~crc & ((1 << HASH_BITS) - 1)); in sk_xmchash()
673 sc = sc_if->sk_softc; in sk_rxfilter()
674 if (sc->sk_type == SK_GENESIS) in sk_rxfilter()
697 sk_setfilt(ctx->sc_if, (uint16_t *)LLADDR(sdl), cnt + 1); in sk_add_maddr_genesis()
698 ctx->mode |= XM_MODE_RX_USE_PERFECT; in sk_add_maddr_genesis()
703 ctx->hashes[0] |= (1 << h); in sk_add_maddr_genesis()
705 ctx->hashes[1] |= (1 << (h - 32)); in sk_add_maddr_genesis()
706 ctx->mode |= XM_MODE_RX_USE_HASH; in sk_add_maddr_genesis()
714 if_t ifp = sc_if->sk_ifp; in sk_rxfilter_genesis()
767 ifp = sc_if->sk_ifp; in sk_rxfilter_yukon()
797 sc_if->sk_cdata.sk_rx_cons = 0; in sk_init_rx_ring()
801 rd = &sc_if->sk_rdata; in sk_init_rx_ring()
802 bzero(rd->sk_rx_ring, sizeof(struct sk_rx_desc) * SK_RX_RING_CNT); in sk_init_rx_ring()
806 if (i == (SK_RX_RING_CNT - 1)) in sk_init_rx_ring()
810 rd->sk_rx_ring[i].sk_next = htole32(SK_ADDR_LO(addr)); in sk_init_rx_ring()
811 rd->sk_rx_ring[i].sk_csum_start = htole32(csum_start); in sk_init_rx_ring()
814 bus_dmamap_sync(sc_if->sk_cdata.sk_rx_ring_tag, in sk_init_rx_ring()
815 sc_if->sk_cdata.sk_rx_ring_map, in sk_init_rx_ring()
829 sc_if->sk_cdata.sk_jumbo_rx_cons = 0; in sk_init_jumbo_rx_ring()
833 rd = &sc_if->sk_rdata; in sk_init_jumbo_rx_ring()
834 bzero(rd->sk_jumbo_rx_ring, in sk_init_jumbo_rx_ring()
839 if (i == (SK_JUMBO_RX_RING_CNT - 1)) in sk_init_jumbo_rx_ring()
843 rd->sk_jumbo_rx_ring[i].sk_next = htole32(SK_ADDR_LO(addr)); in sk_init_jumbo_rx_ring()
844 rd->sk_jumbo_rx_ring[i].sk_csum_start = htole32(csum_start); in sk_init_jumbo_rx_ring()
847 bus_dmamap_sync(sc_if->sk_cdata.sk_jumbo_rx_ring_tag, in sk_init_jumbo_rx_ring()
848 sc_if->sk_cdata.sk_jumbo_rx_ring_map, in sk_init_jumbo_rx_ring()
862 STAILQ_INIT(&sc_if->sk_cdata.sk_txfreeq); in sk_init_tx_ring()
863 STAILQ_INIT(&sc_if->sk_cdata.sk_txbusyq); in sk_init_tx_ring()
865 sc_if->sk_cdata.sk_tx_prod = 0; in sk_init_tx_ring()
866 sc_if->sk_cdata.sk_tx_cons = 0; in sk_init_tx_ring()
867 sc_if->sk_cdata.sk_tx_cnt = 0; in sk_init_tx_ring()
869 rd = &sc_if->sk_rdata; in sk_init_tx_ring()
870 bzero(rd->sk_tx_ring, sizeof(struct sk_tx_desc) * SK_TX_RING_CNT); in sk_init_tx_ring()
872 if (i == (SK_TX_RING_CNT - 1)) in sk_init_tx_ring()
876 rd->sk_tx_ring[i].sk_next = htole32(SK_ADDR_LO(addr)); in sk_init_tx_ring()
877 txd = &sc_if->sk_cdata.sk_txdesc[i]; in sk_init_tx_ring()
878 STAILQ_INSERT_TAIL(&sc_if->sk_cdata.sk_txfreeq, txd, tx_q); in sk_init_tx_ring()
881 bus_dmamap_sync(sc_if->sk_cdata.sk_tx_ring_tag, in sk_init_tx_ring()
882 sc_if->sk_cdata.sk_tx_ring_map, in sk_init_tx_ring()
893 r = &sc_if->sk_rdata.sk_rx_ring[idx]; in sk_discard_rxbuf()
894 rxd = &sc_if->sk_cdata.sk_rxdesc[idx]; in sk_discard_rxbuf()
895 m = rxd->rx_m; in sk_discard_rxbuf()
896 r->sk_ctl = htole32(m->m_len | SK_RXSTAT | SK_OPCODE_CSUM); in sk_discard_rxbuf()
906 r = &sc_if->sk_rdata.sk_jumbo_rx_ring[idx]; in sk_discard_jumbo_rxbuf()
907 rxd = &sc_if->sk_cdata.sk_jumbo_rxdesc[idx]; in sk_discard_jumbo_rxbuf()
908 m = rxd->rx_m; in sk_discard_jumbo_rxbuf()
909 r->sk_ctl = htole32(m->m_len | SK_RXSTAT | SK_OPCODE_CSUM); in sk_discard_jumbo_rxbuf()
925 m->m_len = m->m_pkthdr.len = MCLBYTES; in sk_newbuf()
928 if (bus_dmamap_load_mbuf_sg(sc_if->sk_cdata.sk_rx_tag, in sk_newbuf()
929 sc_if->sk_cdata.sk_rx_sparemap, m, segs, &nsegs, 0) != 0) { in sk_newbuf()
935 rxd = &sc_if->sk_cdata.sk_rxdesc[idx]; in sk_newbuf()
936 if (rxd->rx_m != NULL) { in sk_newbuf()
937 bus_dmamap_sync(sc_if->sk_cdata.sk_rx_tag, rxd->rx_dmamap, in sk_newbuf()
939 bus_dmamap_unload(sc_if->sk_cdata.sk_rx_tag, rxd->rx_dmamap); in sk_newbuf()
941 map = rxd->rx_dmamap; in sk_newbuf()
942 rxd->rx_dmamap = sc_if->sk_cdata.sk_rx_sparemap; in sk_newbuf()
943 sc_if->sk_cdata.sk_rx_sparemap = map; in sk_newbuf()
944 bus_dmamap_sync(sc_if->sk_cdata.sk_rx_tag, rxd->rx_dmamap, in sk_newbuf()
946 rxd->rx_m = m; in sk_newbuf()
947 r = &sc_if->sk_rdata.sk_rx_ring[idx]; in sk_newbuf()
948 r->sk_data_lo = htole32(SK_ADDR_LO(segs[0].ds_addr)); in sk_newbuf()
949 r->sk_data_hi = htole32(SK_ADDR_HI(segs[0].ds_addr)); in sk_newbuf()
950 r->sk_ctl = htole32(segs[0].ds_len | SK_RXSTAT | SK_OPCODE_CSUM); in sk_newbuf()
968 m->m_pkthdr.len = m->m_len = MJUM9BYTES; in sk_jumbo_newbuf()
976 if (bus_dmamap_load_mbuf_sg(sc_if->sk_cdata.sk_jumbo_rx_tag, in sk_jumbo_newbuf()
977 sc_if->sk_cdata.sk_jumbo_rx_sparemap, m, segs, &nsegs, 0) != 0) { in sk_jumbo_newbuf()
983 rxd = &sc_if->sk_cdata.sk_jumbo_rxdesc[idx]; in sk_jumbo_newbuf()
984 if (rxd->rx_m != NULL) { in sk_jumbo_newbuf()
985 bus_dmamap_sync(sc_if->sk_cdata.sk_jumbo_rx_tag, rxd->rx_dmamap, in sk_jumbo_newbuf()
987 bus_dmamap_unload(sc_if->sk_cdata.sk_jumbo_rx_tag, in sk_jumbo_newbuf()
988 rxd->rx_dmamap); in sk_jumbo_newbuf()
990 map = rxd->rx_dmamap; in sk_jumbo_newbuf()
991 rxd->rx_dmamap = sc_if->sk_cdata.sk_jumbo_rx_sparemap; in sk_jumbo_newbuf()
992 sc_if->sk_cdata.sk_jumbo_rx_sparemap = map; in sk_jumbo_newbuf()
993 bus_dmamap_sync(sc_if->sk_cdata.sk_jumbo_rx_tag, rxd->rx_dmamap, in sk_jumbo_newbuf()
995 rxd->rx_m = m; in sk_jumbo_newbuf()
996 r = &sc_if->sk_rdata.sk_jumbo_rx_ring[idx]; in sk_jumbo_newbuf()
997 r->sk_data_lo = htole32(SK_ADDR_LO(segs[0].ds_addr)); in sk_jumbo_newbuf()
998 r->sk_data_hi = htole32(SK_ADDR_HI(segs[0].ds_addr)); in sk_jumbo_newbuf()
999 r->sk_ctl = htole32(segs[0].ds_len | SK_RXSTAT | SK_OPCODE_CSUM); in sk_jumbo_newbuf()
1013 mii = device_get_softc(sc_if->sk_miibus); in sk_ifmedia_upd()
1030 mii = device_get_softc(sc_if->sk_miibus); in sk_ifmedia_sts()
1033 ifmr->ifm_active = mii->mii_media_active; in sk_ifmedia_sts()
1034 ifmr->ifm_status = mii->mii_media_status; in sk_ifmedia_sts()
1050 if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > SK_JUMBO_MTU) in sk_ioctl()
1052 else if (if_getmtu(ifp) != ifr->ifr_mtu) { in sk_ioctl()
1053 if (sc_if->sk_jumbo_disable != 0 && in sk_ioctl()
1054 ifr->ifr_mtu > SK_MAX_FRAMELEN) in sk_ioctl()
1058 if_setmtu(ifp, ifr->ifr_mtu); in sk_ioctl()
1071 if ((if_getflags(ifp) ^ sc_if->sk_if_flags) in sk_ioctl()
1080 sc_if->sk_if_flags = if_getflags(ifp); in sk_ioctl()
1092 mii = device_get_softc(sc_if->sk_miibus); in sk_ioctl()
1093 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command); in sk_ioctl()
1097 if (sc_if->sk_softc->sk_type == SK_GENESIS) { in sk_ioctl()
1101 mask = ifr->ifr_reqcap ^ if_getcapenable(ifp); in sk_ioctl()
1132 while(t->sk_name != NULL) { in skc_probe()
1133 if ((pci_get_vendor(dev) == t->sk_vid) && in skc_probe()
1134 (pci_get_device(dev) == t->sk_did)) { in skc_probe()
1139 if ((t->sk_vid == VENDORID_LINKSYS) && in skc_probe()
1140 (t->sk_did == DEVICEID_LINKSYS_EG1032) && in skc_probe()
1146 device_set_desc(dev, t->sk_name); in skc_probe()
1164 if (SK_YUKON_FAMILY(sc->sk_type)) in sk_reset()
1171 if (SK_YUKON_FAMILY(sc->sk_type)) in sk_reset()
1174 if (sc->sk_type == SK_GENESIS) { in sk_reset()
1189 * timer mask based on the timeout specified in the interrupt in sk_reset()
1191 * register represents one tick, so to specify a timeout in in sk_reset()
1193 * ticks-per-microsecond. in sk_reset()
1195 switch (sc->sk_type) { in sk_reset()
1197 sc->sk_int_ticks = SK_IMTIMER_TICKS_GENESIS; in sk_reset()
1200 sc->sk_int_ticks = SK_IMTIMER_TICKS_YUKON; in sk_reset()
1204 device_printf(sc->sk_dev, "interrupt moderation is %d us\n", in sk_reset()
1205 sc->sk_int_mod); in sk_reset()
1206 sk_win_write_4(sc, SK_IMTIMERINIT, SK_IM_USECS(sc->sk_int_mod, in sk_reset()
1207 sc->sk_int_ticks)); in sk_reset()
1226 * for us. in sk_probe()
1228 switch (sc->sk_type) { in sk_probe()
1265 sc_if->sk_if_dev = dev; in sk_attach()
1266 sc_if->sk_port = port; in sk_attach()
1267 sc_if->sk_softc = sc; in sk_attach()
1268 sc->sk_if[port] = sc_if; in sk_attach()
1270 sc_if->sk_tx_bmu = SK_BMU_TXS_CSR0; in sk_attach()
1272 sc_if->sk_tx_bmu = SK_BMU_TXS_CSR1; in sk_attach()
1274 callout_init_mtx(&sc_if->sk_tick_ch, &sc_if->sk_softc->sk_mtx, 0); in sk_attach()
1275 callout_init_mtx(&sc_if->sk_watchdog_ch, &sc_if->sk_softc->sk_mtx, 0); in sk_attach()
1283 ifp = sc_if->sk_ifp = if_alloc(IFT_ETHER); in sk_attach()
1288 * SK_GENESIS has a bug in checksum offload - From linux. in sk_attach()
1290 if (sc_if->sk_softc->sk_type != SK_GENESIS) { in sk_attach()
1311 if_setsendqlen(ifp, SK_TX_RING_CNT - 1); in sk_attach()
1330 device_printf(sc_if->sk_if_dev, in sk_attach()
1359 chunk = sc->sk_ramsize / 2; in sk_attach()
1360 val = sc->sk_rboff / sizeof(u_int64_t); in sk_attach()
1361 sc_if->sk_rx_ramstart = val; in sk_attach()
1363 sc_if->sk_rx_ramend = val - 1; in sk_attach()
1364 sc_if->sk_tx_ramstart = val; in sk_attach()
1366 sc_if->sk_tx_ramend = val - 1; in sk_attach()
1370 chunk = sc->sk_ramsize / 4; in sk_attach()
1371 val = (sc->sk_rboff + (chunk * 2 * sc_if->sk_port)) / in sk_attach()
1373 sc_if->sk_rx_ramstart = val; in sk_attach()
1375 sc_if->sk_rx_ramend = val - 1; in sk_attach()
1376 sc_if->sk_tx_ramstart = val; in sk_attach()
1378 sc_if->sk_tx_ramend = val - 1; in sk_attach()
1382 sc_if->sk_phytype = sk_win_read_1(sc, SK_EPROM1) & 0xF; in sk_attach()
1383 if (!SK_YUKON_FAMILY(sc->sk_type)) { in sk_attach()
1384 switch(sc_if->sk_phytype) { in sk_attach()
1386 sc_if->sk_phyaddr = SK_PHYADDR_XMAC; in sk_attach()
1389 sc_if->sk_phyaddr = SK_PHYADDR_BCOM; in sk_attach()
1392 device_printf(sc->sk_dev, "unsupported PHY type: %d\n", in sk_attach()
1393 sc_if->sk_phytype); in sk_attach()
1399 if (sc_if->sk_phytype < SK_PHYTYPE_MARV_COPPER && in sk_attach()
1400 sc->sk_pmd != 'S') { in sk_attach()
1402 sc_if->sk_phytype = SK_PHYTYPE_MARV_COPPER; in sk_attach()
1403 sc->sk_coppertype = 1; in sk_attach()
1406 sc_if->sk_phyaddr = SK_PHYADDR_MARV; in sk_attach()
1408 if (!(sc->sk_coppertype)) in sk_attach()
1409 sc_if->sk_phytype = SK_PHYTYPE_MARV_FIBER; in sk_attach()
1438 switch (sc->sk_type) { in sk_attach()
1441 if (sc_if->sk_phytype == SK_PHYTYPE_XMAC) in sk_attach()
1453 error = mii_attach(dev, &sc_if->sk_miibus, ifp, sk_ifmedia_upd, in sk_attach()
1456 device_printf(sc_if->sk_if_dev, "attaching PHYs failed\n"); in sk_attach()
1464 sc->sk_if[port] = NULL; in sk_attach()
1485 sc->sk_dev = dev; in skc_attach()
1487 mtx_init(&sc->sk_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, in skc_attach()
1489 mtx_init(&sc->sk_mii_mtx, "sk_mii_mutex", NULL, MTX_DEF); in skc_attach()
1497 sc->sk_res_spec = sk_res_spec_io; in skc_attach()
1499 sc->sk_res_spec = sk_res_spec_mem; in skc_attach()
1501 error = bus_alloc_resources(dev, sc->sk_res_spec, sc->sk_res); in skc_attach()
1503 if (sc->sk_res_spec == sk_res_spec_mem) in skc_attach()
1504 sc->sk_res_spec = sk_res_spec_io; in skc_attach()
1506 sc->sk_res_spec = sk_res_spec_mem; in skc_attach()
1507 error = bus_alloc_resources(dev, sc->sk_res_spec, sc->sk_res); in skc_attach()
1510 sc->sk_res_spec == sk_res_spec_mem ? "memory" : in skc_attach()
1516 sc->sk_type = sk_win_read_1(sc, SK_CHIPVER); in skc_attach()
1517 sc->sk_rev = (sk_win_read_1(sc, SK_CONFIG) >> 4) & 0xf; in skc_attach()
1520 if (sc->sk_type != SK_GENESIS && !SK_YUKON_FAMILY(sc->sk_type)) { in skc_attach()
1522 sc->sk_type, sc->sk_rev); in skc_attach()
1531 &sc->sk_int_mod, 0, sysctl_hw_sk_int_mod, "I", in skc_attach()
1535 sc->sk_int_mod = SK_IM_DEFAULT; in skc_attach()
1537 "int_mod", &sc->sk_int_mod); in skc_attach()
1539 if (sc->sk_int_mod < SK_IM_MIN || in skc_attach()
1540 sc->sk_int_mod > SK_IM_MAX) { in skc_attach()
1543 sc->sk_int_mod = SK_IM_DEFAULT; in skc_attach()
1551 if (sc->sk_type == SK_GENESIS) { in skc_attach()
1555 sc->sk_ramsize = 0x80000; in skc_attach()
1556 sc->sk_rboff = SK_RBOFF_0; in skc_attach()
1559 sc->sk_ramsize = 0x100000; in skc_attach()
1560 sc->sk_rboff = SK_RBOFF_80000; in skc_attach()
1563 sc->sk_ramsize = 0x100000; in skc_attach()
1564 sc->sk_rboff = SK_RBOFF_0; in skc_attach()
1567 sc->sk_ramsize = 0x200000; in skc_attach()
1568 sc->sk_rboff = SK_RBOFF_0; in skc_attach()
1577 sc->sk_ramsize = 0x20000; in skc_attach()
1579 sc->sk_ramsize = skrs * (1<<12); in skc_attach()
1580 sc->sk_rboff = SK_RBOFF_0; in skc_attach()
1584 sc->sk_pmd = sk_win_read_1(sc, SK_PMDTYPE); in skc_attach()
1586 if (sc->sk_pmd == 'T' || sc->sk_pmd == '1') in skc_attach()
1587 sc->sk_coppertype = 1; in skc_attach()
1589 sc->sk_coppertype = 0; in skc_attach()
1605 switch (sc->sk_type) { in skc_attach()
1625 if (sc->sk_type == SK_YUKON || sc->sk_type == SK_YUKON_LP) { in skc_attach()
1637 sc->sk_type = SK_YUKON_LITE; in skc_attach()
1638 sc->sk_rev = SK_YUKON_LITE_REV_A0; in skc_attach()
1648 sc->sk_type, sc->sk_rev); in skc_attach()
1653 if (sc->sk_type == SK_YUKON_LITE) { in skc_attach()
1654 switch (sc->sk_rev) { in skc_attach()
1675 pname, revstr, sc->sk_rev); in skc_attach()
1678 device_printf(dev, "chip ver = 0x%02x\n", sc->sk_type); in skc_attach()
1679 device_printf(dev, "chip rev = 0x%02x\n", sc->sk_rev); in skc_attach()
1681 device_printf(dev, "SRAM size = 0x%06x\n", sc->sk_ramsize); in skc_attach()
1684 sc->sk_devs[SK_PORT_A] = device_add_child(dev, "sk", DEVICE_UNIT_ANY); in skc_attach()
1685 if (sc->sk_devs[SK_PORT_A] == NULL) { in skc_attach()
1698 device_set_ivars(sc->sk_devs[SK_PORT_A], port); in skc_attach()
1701 sc->sk_devs[SK_PORT_B] = device_add_child(dev, "sk", DEVICE_UNIT_ANY); in skc_attach()
1702 if (sc->sk_devs[SK_PORT_B] == NULL) { in skc_attach()
1715 device_set_ivars(sc->sk_devs[SK_PORT_B], port); in skc_attach()
1724 error = bus_setup_intr(dev, sc->sk_res[1], INTR_TYPE_NET|INTR_MPSAFE, in skc_attach()
1725 NULL, sk_intr, sc, &sc->sk_intrhand); in skc_attach()
1759 KASSERT(mtx_initialized(&sc_if->sk_softc->sk_mtx), in sk_detach()
1763 ifp = sc_if->sk_ifp; in sk_detach()
1769 callout_drain(&sc_if->sk_tick_ch); in sk_detach()
1770 callout_drain(&sc_if->sk_watchdog_ch); in sk_detach()
1790 KASSERT(mtx_initialized(&sc->sk_mtx), ("sk mutex not initialized")); in skc_detach()
1794 if (sc->sk_intrhand) in skc_detach()
1795 bus_teardown_intr(dev, sc->sk_res[1], sc->sk_intrhand); in skc_detach()
1796 bus_release_resources(dev, sc->sk_res_spec, sc->sk_res); in skc_detach()
1798 mtx_destroy(&sc->sk_mii_mtx); in skc_detach()
1799 mtx_destroy(&sc->sk_mtx); in skc_detach()
1824 ctx->sk_busaddr = segs[0].ds_addr; in sk_dmamap_cb()
1830 * use them in their drivers. In order for us to use them, we need
1854 bus_get_dma_tag(sc_if->sk_if_dev),/* parent */ in sk_dma_alloc()
1864 &sc_if->sk_cdata.sk_parent_tag); in sk_dma_alloc()
1866 device_printf(sc_if->sk_if_dev, in sk_dma_alloc()
1872 error = bus_dma_tag_create(sc_if->sk_cdata.sk_parent_tag,/* parent */ in sk_dma_alloc()
1882 &sc_if->sk_cdata.sk_tx_ring_tag); in sk_dma_alloc()
1884 device_printf(sc_if->sk_if_dev, in sk_dma_alloc()
1890 error = bus_dma_tag_create(sc_if->sk_cdata.sk_parent_tag,/* parent */ in sk_dma_alloc()
1900 &sc_if->sk_cdata.sk_rx_ring_tag); in sk_dma_alloc()
1902 device_printf(sc_if->sk_if_dev, in sk_dma_alloc()
1908 error = bus_dma_tag_create(sc_if->sk_cdata.sk_parent_tag,/* parent */ in sk_dma_alloc()
1918 &sc_if->sk_cdata.sk_tx_tag); in sk_dma_alloc()
1920 device_printf(sc_if->sk_if_dev, in sk_dma_alloc()
1926 error = bus_dma_tag_create(sc_if->sk_cdata.sk_parent_tag,/* parent */ in sk_dma_alloc()
1936 &sc_if->sk_cdata.sk_rx_tag); in sk_dma_alloc()
1938 device_printf(sc_if->sk_if_dev, in sk_dma_alloc()
1944 error = bus_dmamem_alloc(sc_if->sk_cdata.sk_tx_ring_tag, in sk_dma_alloc()
1945 (void **)&sc_if->sk_rdata.sk_tx_ring, BUS_DMA_NOWAIT | in sk_dma_alloc()
1946 BUS_DMA_COHERENT | BUS_DMA_ZERO, &sc_if->sk_cdata.sk_tx_ring_map); in sk_dma_alloc()
1948 device_printf(sc_if->sk_if_dev, in sk_dma_alloc()
1954 error = bus_dmamap_load(sc_if->sk_cdata.sk_tx_ring_tag, in sk_dma_alloc()
1955 sc_if->sk_cdata.sk_tx_ring_map, sc_if->sk_rdata.sk_tx_ring, in sk_dma_alloc()
1958 device_printf(sc_if->sk_if_dev, in sk_dma_alloc()
1962 sc_if->sk_rdata.sk_tx_ring_paddr = ctx.sk_busaddr; in sk_dma_alloc()
1965 error = bus_dmamem_alloc(sc_if->sk_cdata.sk_rx_ring_tag, in sk_dma_alloc()
1966 (void **)&sc_if->sk_rdata.sk_rx_ring, BUS_DMA_NOWAIT | in sk_dma_alloc()
1967 BUS_DMA_COHERENT | BUS_DMA_ZERO, &sc_if->sk_cdata.sk_rx_ring_map); in sk_dma_alloc()
1969 device_printf(sc_if->sk_if_dev, in sk_dma_alloc()
1975 error = bus_dmamap_load(sc_if->sk_cdata.sk_rx_ring_tag, in sk_dma_alloc()
1976 sc_if->sk_cdata.sk_rx_ring_map, sc_if->sk_rdata.sk_rx_ring, in sk_dma_alloc()
1979 device_printf(sc_if->sk_if_dev, in sk_dma_alloc()
1983 sc_if->sk_rdata.sk_rx_ring_paddr = ctx.sk_busaddr; in sk_dma_alloc()
1987 txd = &sc_if->sk_cdata.sk_txdesc[i]; in sk_dma_alloc()
1988 txd->tx_m = NULL; in sk_dma_alloc()
1989 txd->tx_dmamap = NULL; in sk_dma_alloc()
1990 error = bus_dmamap_create(sc_if->sk_cdata.sk_tx_tag, 0, in sk_dma_alloc()
1991 &txd->tx_dmamap); in sk_dma_alloc()
1993 device_printf(sc_if->sk_if_dev, in sk_dma_alloc()
2000 if ((error = bus_dmamap_create(sc_if->sk_cdata.sk_rx_tag, 0, in sk_dma_alloc()
2001 &sc_if->sk_cdata.sk_rx_sparemap)) != 0) { in sk_dma_alloc()
2002 device_printf(sc_if->sk_if_dev, in sk_dma_alloc()
2007 rxd = &sc_if->sk_cdata.sk_rxdesc[i]; in sk_dma_alloc()
2008 rxd->rx_m = NULL; in sk_dma_alloc()
2009 rxd->rx_dmamap = NULL; in sk_dma_alloc()
2010 error = bus_dmamap_create(sc_if->sk_cdata.sk_rx_tag, 0, in sk_dma_alloc()
2011 &rxd->rx_dmamap); in sk_dma_alloc()
2013 device_printf(sc_if->sk_if_dev, in sk_dma_alloc()
2031 device_printf(sc_if->sk_if_dev, "disabling jumbo frame support\n"); in sk_dma_jumbo_alloc()
2032 sc_if->sk_jumbo_disable = 1; in sk_dma_jumbo_alloc()
2036 error = bus_dma_tag_create(sc_if->sk_cdata.sk_parent_tag,/* parent */ in sk_dma_jumbo_alloc()
2046 &sc_if->sk_cdata.sk_jumbo_rx_ring_tag); in sk_dma_jumbo_alloc()
2048 device_printf(sc_if->sk_if_dev, in sk_dma_jumbo_alloc()
2054 error = bus_dma_tag_create(sc_if->sk_cdata.sk_parent_tag,/* parent */ in sk_dma_jumbo_alloc()
2064 &sc_if->sk_cdata.sk_jumbo_rx_tag); in sk_dma_jumbo_alloc()
2066 device_printf(sc_if->sk_if_dev, in sk_dma_jumbo_alloc()
2072 error = bus_dmamem_alloc(sc_if->sk_cdata.sk_jumbo_rx_ring_tag, in sk_dma_jumbo_alloc()
2073 (void **)&sc_if->sk_rdata.sk_jumbo_rx_ring, BUS_DMA_NOWAIT | in sk_dma_jumbo_alloc()
2075 &sc_if->sk_cdata.sk_jumbo_rx_ring_map); in sk_dma_jumbo_alloc()
2077 device_printf(sc_if->sk_if_dev, in sk_dma_jumbo_alloc()
2083 error = bus_dmamap_load(sc_if->sk_cdata.sk_jumbo_rx_ring_tag, in sk_dma_jumbo_alloc()
2084 sc_if->sk_cdata.sk_jumbo_rx_ring_map, in sk_dma_jumbo_alloc()
2085 sc_if->sk_rdata.sk_jumbo_rx_ring, SK_JUMBO_RX_RING_SZ, sk_dmamap_cb, in sk_dma_jumbo_alloc()
2088 device_printf(sc_if->sk_if_dev, in sk_dma_jumbo_alloc()
2092 sc_if->sk_rdata.sk_jumbo_rx_ring_paddr = ctx.sk_busaddr; in sk_dma_jumbo_alloc()
2095 if ((error = bus_dmamap_create(sc_if->sk_cdata.sk_jumbo_rx_tag, 0, in sk_dma_jumbo_alloc()
2096 &sc_if->sk_cdata.sk_jumbo_rx_sparemap)) != 0) { in sk_dma_jumbo_alloc()
2097 device_printf(sc_if->sk_if_dev, in sk_dma_jumbo_alloc()
2102 jrxd = &sc_if->sk_cdata.sk_jumbo_rxdesc[i]; in sk_dma_jumbo_alloc()
2103 jrxd->rx_m = NULL; in sk_dma_jumbo_alloc()
2104 jrxd->rx_dmamap = NULL; in sk_dma_jumbo_alloc()
2105 error = bus_dmamap_create(sc_if->sk_cdata.sk_jumbo_rx_tag, 0, in sk_dma_jumbo_alloc()
2106 &jrxd->rx_dmamap); in sk_dma_jumbo_alloc()
2108 device_printf(sc_if->sk_if_dev, in sk_dma_jumbo_alloc()
2118 device_printf(sc_if->sk_if_dev, "disabling jumbo frame support due to " in sk_dma_jumbo_alloc()
2120 sc_if->sk_jumbo_disable = 1; in sk_dma_jumbo_alloc()
2132 if (sc_if->sk_cdata.sk_tx_ring_tag) { in sk_dma_free()
2133 if (sc_if->sk_rdata.sk_tx_ring_paddr) in sk_dma_free()
2134 bus_dmamap_unload(sc_if->sk_cdata.sk_tx_ring_tag, in sk_dma_free()
2135 sc_if->sk_cdata.sk_tx_ring_map); in sk_dma_free()
2136 if (sc_if->sk_rdata.sk_tx_ring) in sk_dma_free()
2137 bus_dmamem_free(sc_if->sk_cdata.sk_tx_ring_tag, in sk_dma_free()
2138 sc_if->sk_rdata.sk_tx_ring, in sk_dma_free()
2139 sc_if->sk_cdata.sk_tx_ring_map); in sk_dma_free()
2140 sc_if->sk_rdata.sk_tx_ring = NULL; in sk_dma_free()
2141 sc_if->sk_rdata.sk_tx_ring_paddr = 0; in sk_dma_free()
2142 bus_dma_tag_destroy(sc_if->sk_cdata.sk_tx_ring_tag); in sk_dma_free()
2143 sc_if->sk_cdata.sk_tx_ring_tag = NULL; in sk_dma_free()
2146 if (sc_if->sk_cdata.sk_rx_ring_tag) { in sk_dma_free()
2147 if (sc_if->sk_rdata.sk_rx_ring_paddr) in sk_dma_free()
2148 bus_dmamap_unload(sc_if->sk_cdata.sk_rx_ring_tag, in sk_dma_free()
2149 sc_if->sk_cdata.sk_rx_ring_map); in sk_dma_free()
2150 if (sc_if->sk_rdata.sk_rx_ring) in sk_dma_free()
2151 bus_dmamem_free(sc_if->sk_cdata.sk_rx_ring_tag, in sk_dma_free()
2152 sc_if->sk_rdata.sk_rx_ring, in sk_dma_free()
2153 sc_if->sk_cdata.sk_rx_ring_map); in sk_dma_free()
2154 sc_if->sk_rdata.sk_rx_ring = NULL; in sk_dma_free()
2155 sc_if->sk_rdata.sk_rx_ring_paddr = 0; in sk_dma_free()
2156 bus_dma_tag_destroy(sc_if->sk_cdata.sk_rx_ring_tag); in sk_dma_free()
2157 sc_if->sk_cdata.sk_rx_ring_tag = NULL; in sk_dma_free()
2160 if (sc_if->sk_cdata.sk_tx_tag) { in sk_dma_free()
2162 txd = &sc_if->sk_cdata.sk_txdesc[i]; in sk_dma_free()
2163 if (txd->tx_dmamap) { in sk_dma_free()
2164 bus_dmamap_destroy(sc_if->sk_cdata.sk_tx_tag, in sk_dma_free()
2165 txd->tx_dmamap); in sk_dma_free()
2166 txd->tx_dmamap = NULL; in sk_dma_free()
2169 bus_dma_tag_destroy(sc_if->sk_cdata.sk_tx_tag); in sk_dma_free()
2170 sc_if->sk_cdata.sk_tx_tag = NULL; in sk_dma_free()
2173 if (sc_if->sk_cdata.sk_rx_tag) { in sk_dma_free()
2175 rxd = &sc_if->sk_cdata.sk_rxdesc[i]; in sk_dma_free()
2176 if (rxd->rx_dmamap) { in sk_dma_free()
2177 bus_dmamap_destroy(sc_if->sk_cdata.sk_rx_tag, in sk_dma_free()
2178 rxd->rx_dmamap); in sk_dma_free()
2179 rxd->rx_dmamap = NULL; in sk_dma_free()
2182 if (sc_if->sk_cdata.sk_rx_sparemap) { in sk_dma_free()
2183 bus_dmamap_destroy(sc_if->sk_cdata.sk_rx_tag, in sk_dma_free()
2184 sc_if->sk_cdata.sk_rx_sparemap); in sk_dma_free()
2185 sc_if->sk_cdata.sk_rx_sparemap = NULL; in sk_dma_free()
2187 bus_dma_tag_destroy(sc_if->sk_cdata.sk_rx_tag); in sk_dma_free()
2188 sc_if->sk_cdata.sk_rx_tag = NULL; in sk_dma_free()
2191 if (sc_if->sk_cdata.sk_parent_tag) { in sk_dma_free()
2192 bus_dma_tag_destroy(sc_if->sk_cdata.sk_parent_tag); in sk_dma_free()
2193 sc_if->sk_cdata.sk_parent_tag = NULL; in sk_dma_free()
2204 if (sc_if->sk_cdata.sk_jumbo_rx_ring_tag) { in sk_dma_jumbo_free()
2205 if (sc_if->sk_rdata.sk_jumbo_rx_ring_paddr) in sk_dma_jumbo_free()
2206 bus_dmamap_unload(sc_if->sk_cdata.sk_jumbo_rx_ring_tag, in sk_dma_jumbo_free()
2207 sc_if->sk_cdata.sk_jumbo_rx_ring_map); in sk_dma_jumbo_free()
2208 if (sc_if->sk_rdata.sk_jumbo_rx_ring) in sk_dma_jumbo_free()
2209 bus_dmamem_free(sc_if->sk_cdata.sk_jumbo_rx_ring_tag, in sk_dma_jumbo_free()
2210 sc_if->sk_rdata.sk_jumbo_rx_ring, in sk_dma_jumbo_free()
2211 sc_if->sk_cdata.sk_jumbo_rx_ring_map); in sk_dma_jumbo_free()
2212 sc_if->sk_rdata.sk_jumbo_rx_ring = NULL; in sk_dma_jumbo_free()
2213 sc_if->sk_rdata.sk_jumbo_rx_ring_paddr = 0; in sk_dma_jumbo_free()
2214 bus_dma_tag_destroy(sc_if->sk_cdata.sk_jumbo_rx_ring_tag); in sk_dma_jumbo_free()
2215 sc_if->sk_cdata.sk_jumbo_rx_ring_tag = NULL; in sk_dma_jumbo_free()
2219 if (sc_if->sk_cdata.sk_jumbo_rx_tag) { in sk_dma_jumbo_free()
2221 jrxd = &sc_if->sk_cdata.sk_jumbo_rxdesc[i]; in sk_dma_jumbo_free()
2222 if (jrxd->rx_dmamap) { in sk_dma_jumbo_free()
2224 sc_if->sk_cdata.sk_jumbo_rx_tag, in sk_dma_jumbo_free()
2225 jrxd->rx_dmamap); in sk_dma_jumbo_free()
2226 jrxd->rx_dmamap = NULL; in sk_dma_jumbo_free()
2229 if (sc_if->sk_cdata.sk_jumbo_rx_sparemap) { in sk_dma_jumbo_free()
2230 bus_dmamap_destroy(sc_if->sk_cdata.sk_jumbo_rx_tag, in sk_dma_jumbo_free()
2231 sc_if->sk_cdata.sk_jumbo_rx_sparemap); in sk_dma_jumbo_free()
2232 sc_if->sk_cdata.sk_jumbo_rx_sparemap = NULL; in sk_dma_jumbo_free()
2234 bus_dma_tag_destroy(sc_if->sk_cdata.sk_jumbo_rx_tag); in sk_dma_jumbo_free()
2235 sc_if->sk_cdata.sk_jumbo_rx_tag = NULL; in sk_dma_jumbo_free()
2247 for(; m && m->m_len == 0; m = m->m_next) in sk_txcksum()
2249 if (m == NULL || m->m_len < ETHER_HDR_LEN) { in sk_txcksum()
2254 if (m->m_len < ETHER_HDR_LEN + sizeof(u_int32_t)) { in sk_txcksum()
2255 if (m->m_len != ETHER_HDR_LEN) { in sk_txcksum()
2261 for(m = m->m_next; m && m->m_len == 0; m = m->m_next) in sk_txcksum()
2274 offset = (ip->ip_hl << 2) + ETHER_HDR_LEN; in sk_txcksum()
2277 f->sk_csum_startval = 0; in sk_txcksum()
2278 f->sk_csum_start = htole32(((offset + m->m_pkthdr.csum_data) & 0xffff) | in sk_txcksum()
2294 if ((txd = STAILQ_FIRST(&sc_if->sk_cdata.sk_txfreeq)) == NULL) in sk_encap()
2297 error = bus_dmamap_load_mbuf_sg(sc_if->sk_cdata.sk_tx_tag, in sk_encap()
2298 txd->tx_dmamap, *m_head, txsegs, &nseg, 0); in sk_encap()
2307 error = bus_dmamap_load_mbuf_sg(sc_if->sk_cdata.sk_tx_tag, in sk_encap()
2308 txd->tx_dmamap, *m_head, txsegs, &nseg, 0); in sk_encap()
2321 if (sc_if->sk_cdata.sk_tx_cnt + nseg >= SK_TX_RING_CNT) { in sk_encap()
2322 bus_dmamap_unload(sc_if->sk_cdata.sk_tx_tag, txd->tx_dmamap); in sk_encap()
2327 if ((m->m_pkthdr.csum_flags & if_gethwassist(sc_if->sk_ifp)) != 0) in sk_encap()
2331 si = frag = sc_if->sk_cdata.sk_tx_prod; in sk_encap()
2333 f = &sc_if->sk_rdata.sk_tx_ring[frag]; in sk_encap()
2334 f->sk_data_lo = htole32(SK_ADDR_LO(txsegs[i].ds_addr)); in sk_encap()
2335 f->sk_data_hi = htole32(SK_ADDR_HI(txsegs[i].ds_addr)); in sk_encap()
2339 sk_txcksum(sc_if->sk_ifp, m, f); in sk_encap()
2343 f->sk_ctl = htole32(sk_ctl); in sk_encap()
2344 sc_if->sk_cdata.sk_tx_cnt++; in sk_encap()
2347 sc_if->sk_cdata.sk_tx_prod = frag; in sk_encap()
2350 frag = (frag + SK_TX_RING_CNT - 1) % SK_TX_RING_CNT; in sk_encap()
2351 f = &sc_if->sk_rdata.sk_tx_ring[frag]; in sk_encap()
2352 f->sk_ctl |= htole32(SK_TXCTL_LASTFRAG | SK_TXCTL_EOF_INTR); in sk_encap()
2355 f = &sc_if->sk_rdata.sk_tx_ring[si]; in sk_encap()
2356 f->sk_ctl |= htole32(SK_TXCTL_OWN); in sk_encap()
2358 STAILQ_REMOVE_HEAD(&sc_if->sk_cdata.sk_txfreeq, tx_q); in sk_encap()
2359 STAILQ_INSERT_TAIL(&sc_if->sk_cdata.sk_txbusyq, txd, tx_q); in sk_encap()
2360 txd->tx_m = m; in sk_encap()
2363 bus_dmamap_sync(sc_if->sk_cdata.sk_tx_tag, txd->tx_dmamap, in sk_encap()
2365 bus_dmamap_sync(sc_if->sk_cdata.sk_tx_ring_tag, in sk_encap()
2366 sc_if->sk_cdata.sk_tx_ring_map, in sk_encap()
2395 sc = sc_if->sk_softc; in sk_start_locked()
2400 sc_if->sk_cdata.sk_tx_cnt < SK_TX_RING_CNT - 1; ) { in sk_start_locked()
2428 CSR_WRITE_4(sc, sc_if->sk_tx_bmu, SK_TXBMU_TX_START); in sk_start_locked()
2430 /* Set a timeout in case the chip goes out to lunch. */ in sk_start_locked()
2431 sc_if->sk_watchdog_timer = 5; in sk_start_locked()
2446 if (sc_if->sk_watchdog_timer == 0 || --sc_if->sk_watchdog_timer) in sk_watchdog()
2454 if (sc_if->sk_cdata.sk_tx_cnt != 0) { in sk_watchdog()
2455 if_printf(sc_if->sk_ifp, "watchdog timeout\n"); in sk_watchdog()
2462 callout_reset(&sc_if->sk_watchdog_ch, hz, sk_watchdog, ifp); in sk_watchdog()
2499 sc_if0 = sc->sk_if[SK_PORT_A]; in skc_suspend()
2500 sc_if1 = sc->sk_if[SK_PORT_B]; in skc_suspend()
2502 ifp0 = sc_if0->sk_ifp; in skc_suspend()
2504 ifp1 = sc_if1->sk_ifp; in skc_suspend()
2509 sc->sk_suspended = 1; in skc_suspend()
2527 sc_if0 = sc->sk_if[SK_PORT_A]; in skc_resume()
2528 sc_if1 = sc->sk_if[SK_PORT_B]; in skc_resume()
2530 ifp0 = sc_if0->sk_ifp; in skc_resume()
2532 ifp1 = sc_if1->sk_ifp; in skc_resume()
2537 sc->sk_suspended = 0; in skc_resume()
2545 * According to the data sheet from SK-NET GENESIS the hardware can compute
2566 pktlen = m->m_pkthdr.len; in sk_rxcksum()
2570 if (eh->ether_type != htons(ETHERTYPE_IP)) in sk_rxcksum()
2573 if (ip->ip_v != IPVERSION) in sk_rxcksum()
2575 hlen = ip->ip_hl << 2; in sk_rxcksum()
2576 pktlen -= sizeof(struct ether_header); in sk_rxcksum()
2579 if (ntohs(ip->ip_len) < hlen) in sk_rxcksum()
2581 if (ntohs(ip->ip_len) != pktlen) in sk_rxcksum()
2588 len = hlen - sizeof(struct ip); in sk_rxcksum()
2602 m->m_pkthdr.csum_flags = CSUM_IP_CHECKED; in sk_rxcksum()
2604 m->m_pkthdr.csum_flags |= CSUM_IP_VALID; in sk_rxcksum()
2611 if (sc->sk_type == SK_GENESIS) { in sk_rxvalid()
2638 sc = sc_if->sk_softc; in sk_rxeof()
2639 ifp = sc_if->sk_ifp; in sk_rxeof()
2643 bus_dmamap_sync(sc_if->sk_cdata.sk_rx_ring_tag, in sk_rxeof()
2644 sc_if->sk_cdata.sk_rx_ring_map, BUS_DMASYNC_POSTREAD); in sk_rxeof()
2647 for (cons = sc_if->sk_cdata.sk_rx_cons; prog < SK_RX_RING_CNT; in sk_rxeof()
2649 cur_rx = &sc_if->sk_rdata.sk_rx_ring[cons]; in sk_rxeof()
2650 sk_ctl = le32toh(cur_rx->sk_ctl); in sk_rxeof()
2653 rxd = &sc_if->sk_cdata.sk_rxdesc[cons]; in sk_rxeof()
2654 rxstat = le32toh(cur_rx->sk_xmac_rxstat); in sk_rxeof()
2667 m = rxd->rx_m; in sk_rxeof()
2668 csum = le32toh(cur_rx->sk_csum); in sk_rxeof()
2675 m->m_pkthdr.rcvif = ifp; in sk_rxeof()
2676 m->m_pkthdr.len = m->m_len = SK_RXBYTES(sk_ctl); in sk_rxeof()
2686 sc_if->sk_cdata.sk_rx_cons = cons; in sk_rxeof()
2687 bus_dmamap_sync(sc_if->sk_cdata.sk_rx_ring_tag, in sk_rxeof()
2688 sc_if->sk_cdata.sk_rx_ring_map, in sk_rxeof()
2704 sc = sc_if->sk_softc; in sk_jumbo_rxeof()
2705 ifp = sc_if->sk_ifp; in sk_jumbo_rxeof()
2709 bus_dmamap_sync(sc_if->sk_cdata.sk_jumbo_rx_ring_tag, in sk_jumbo_rxeof()
2710 sc_if->sk_cdata.sk_jumbo_rx_ring_map, BUS_DMASYNC_POSTREAD); in sk_jumbo_rxeof()
2713 for (cons = sc_if->sk_cdata.sk_jumbo_rx_cons; in sk_jumbo_rxeof()
2716 cur_rx = &sc_if->sk_rdata.sk_jumbo_rx_ring[cons]; in sk_jumbo_rxeof()
2717 sk_ctl = le32toh(cur_rx->sk_ctl); in sk_jumbo_rxeof()
2720 jrxd = &sc_if->sk_cdata.sk_jumbo_rxdesc[cons]; in sk_jumbo_rxeof()
2721 rxstat = le32toh(cur_rx->sk_xmac_rxstat); in sk_jumbo_rxeof()
2734 m = jrxd->rx_m; in sk_jumbo_rxeof()
2735 csum = le32toh(cur_rx->sk_csum); in sk_jumbo_rxeof()
2742 m->m_pkthdr.rcvif = ifp; in sk_jumbo_rxeof()
2743 m->m_pkthdr.len = m->m_len = SK_RXBYTES(sk_ctl); in sk_jumbo_rxeof()
2753 sc_if->sk_cdata.sk_jumbo_rx_cons = cons; in sk_jumbo_rxeof()
2754 bus_dmamap_sync(sc_if->sk_cdata.sk_jumbo_rx_ring_tag, in sk_jumbo_rxeof()
2755 sc_if->sk_cdata.sk_jumbo_rx_ring_map, in sk_jumbo_rxeof()
2768 ifp = sc_if->sk_ifp; in sk_txeof()
2770 txd = STAILQ_FIRST(&sc_if->sk_cdata.sk_txbusyq); in sk_txeof()
2773 bus_dmamap_sync(sc_if->sk_cdata.sk_tx_ring_tag, in sk_txeof()
2774 sc_if->sk_cdata.sk_tx_ring_map, BUS_DMASYNC_POSTREAD); in sk_txeof()
2779 for (idx = sc_if->sk_cdata.sk_tx_cons;; SK_INC(idx, SK_TX_RING_CNT)) { in sk_txeof()
2780 if (sc_if->sk_cdata.sk_tx_cnt <= 0) in sk_txeof()
2782 cur_tx = &sc_if->sk_rdata.sk_tx_ring[idx]; in sk_txeof()
2783 sk_ctl = le32toh(cur_tx->sk_ctl); in sk_txeof()
2786 sc_if->sk_cdata.sk_tx_cnt--; in sk_txeof()
2790 bus_dmamap_sync(sc_if->sk_cdata.sk_tx_tag, txd->tx_dmamap, in sk_txeof()
2792 bus_dmamap_unload(sc_if->sk_cdata.sk_tx_tag, txd->tx_dmamap); in sk_txeof()
2795 m_freem(txd->tx_m); in sk_txeof()
2796 txd->tx_m = NULL; in sk_txeof()
2797 STAILQ_REMOVE_HEAD(&sc_if->sk_cdata.sk_txbusyq, tx_q); in sk_txeof()
2798 STAILQ_INSERT_TAIL(&sc_if->sk_cdata.sk_txfreeq, txd, tx_q); in sk_txeof()
2799 txd = STAILQ_FIRST(&sc_if->sk_cdata.sk_txbusyq); in sk_txeof()
2801 sc_if->sk_cdata.sk_tx_cons = idx; in sk_txeof()
2802 sc_if->sk_watchdog_timer = sc_if->sk_cdata.sk_tx_cnt > 0 ? 5 : 0; in sk_txeof()
2804 bus_dmamap_sync(sc_if->sk_cdata.sk_tx_ring_tag, in sk_txeof()
2805 sc_if->sk_cdata.sk_tx_ring_map, in sk_txeof()
2818 ifp = sc_if->sk_ifp; in sk_tick()
2819 mii = device_get_softc(sc_if->sk_miibus); in sk_tick()
2824 if (sc_if->sk_phytype == SK_PHYTYPE_BCOM) { in sk_tick()
2842 callout_reset(&sc_if->sk_tick_ch, hz, sk_tick, sc_if); in sk_tick()
2850 callout_stop(&sc_if->sk_tick_ch); in sk_tick()
2860 mii = device_get_softc(sc_if->sk_miibus); in sk_yukon_tick()
2863 callout_reset(&sc_if->sk_tick_ch, hz, sk_yukon_tick, sc_if); in sk_yukon_tick()
2872 mii = device_get_softc(sc_if->sk_miibus); in sk_intr_bcom()
2873 ifp = sc_if->sk_ifp; in sk_intr_bcom()
2893 if (!(lstat & BRGPHY_AUXSTS_LINK) && sc_if->sk_link) { in sk_intr_bcom()
2898 sc_if->sk_link = 0; in sk_intr_bcom()
2903 sc_if->sk_link = 1; in sk_intr_bcom()
2910 callout_reset(&sc_if->sk_tick_ch, hz, sk_tick, sc_if); in sk_intr_bcom()
2927 * Link has gone down. Start MII tick timeout to in sk_intr_xmac()
2930 if (sc_if->sk_phytype == SK_PHYTYPE_XMAC) { in sk_intr_xmac()
2933 callout_reset(&sc_if->sk_tick_ch, hz, sk_tick, sc_if); in sk_intr_xmac()
2937 callout_reset(&sc_if->sk_tick_ch, hz, sk_tick, sc_if); in sk_intr_xmac()
2981 if (status == 0 || status == 0xffffffff || sc->sk_suspended) in sk_intr()
2984 sc_if0 = sc->sk_if[SK_PORT_A]; in sk_intr()
2985 sc_if1 = sc->sk_if[SK_PORT_B]; in sk_intr()
2988 ifp0 = sc_if0->sk_ifp; in sk_intr()
2990 ifp1 = sc_if1->sk_ifp; in sk_intr()
2992 for (; (status &= sc->sk_intrmask) != 0;) { in sk_intr()
3024 if (sc->sk_type == SK_GENESIS) in sk_intr()
3032 if (sc->sk_type == SK_GENESIS) in sk_intr()
3040 sc_if0->sk_phytype == SK_PHYTYPE_BCOM) in sk_intr()
3043 sc_if1->sk_phytype == SK_PHYTYPE_BCOM) in sk_intr()
3049 CSR_WRITE_4(sc, SK_IMR, sc->sk_intrmask); in sk_intr()
3074 sc = sc_if->sk_softc; in sk_init_xmac()
3075 ifp = sc_if->sk_ifp; in sk_init_xmac()
3085 sc_if->sk_xmac_rev = XM_XMAC_REV(SK_XM_READ_4(sc_if, XM_DEVID)); in sk_init_xmac()
3092 if (sc_if->sk_phytype == SK_PHYTYPE_BCOM) { in sk_init_xmac()
3098 if (sc_if->sk_port == SK_PORT_A) in sk_init_xmac()
3130 bcopy(if_getlladdr(sc_if->sk_ifp), eaddr, ETHER_ADDR_LEN); in sk_init_xmac()
3181 if (sc_if->sk_phytype == SK_PHYTYPE_XMAC) in sk_init_xmac()
3187 switch(sc_if->sk_xmac_rev) { in sk_init_xmac()
3216 sc_if->sk_link = 1; in sk_init_xmac()
3233 sc = sc_if->sk_softc; in sk_init_yukon()
3234 ifp = sc_if->sk_ifp; in sk_init_yukon()
3236 if (sc->sk_type == SK_YUKON_LITE && in sk_init_yukon()
3237 sc->sk_rev >= SK_YUKON_LITE_REV_A3) { in sk_init_yukon()
3253 if (sc->sk_type == SK_YUKON_LITE && in sk_init_yukon()
3254 sc->sk_rev >= SK_YUKON_LITE_REV_A3) { in sk_init_yukon()
3267 if (sc->sk_coppertype) in sk_init_yukon()
3305 eaddr = if_getlladdr(sc_if->sk_ifp); in sk_init_yukon()
3332 /* Disable RX MAC FIFO Flush for YUKON-Lite Rev. A0 only */ in sk_init_yukon()
3333 if (sc->sk_type == SK_YUKON_LITE && sc->sk_rev == SK_YUKON_LITE_REV_A0) in sk_init_yukon()
3378 ifp = sc_if->sk_ifp; in sk_init_locked()
3379 sc = sc_if->sk_softc; in sk_init_locked()
3380 mii = device_get_softc(sc_if->sk_miibus); in sk_init_locked()
3388 if (sc->sk_type == SK_GENESIS) { in sk_init_locked()
3406 * SK-NET GENESIS data sheet says that possibility of losing Start in sk_init_locked()
3409 * mechanism to send a Start transmit command to initiate transfer in sk_init_locked()
3422 /* Configure I2C registers */ in sk_init_locked()
3425 switch (sc->sk_type) { in sk_init_locked()
3437 if (sc->sk_type == SK_GENESIS) { in sk_init_locked()
3454 SK_IF_WRITE_4(sc_if, 0, SK_RXRB1_START, sc_if->sk_rx_ramstart); in sk_init_locked()
3455 SK_IF_WRITE_4(sc_if, 0, SK_RXRB1_WR_PTR, sc_if->sk_rx_ramstart); in sk_init_locked()
3456 SK_IF_WRITE_4(sc_if, 0, SK_RXRB1_RD_PTR, sc_if->sk_rx_ramstart); in sk_init_locked()
3457 SK_IF_WRITE_4(sc_if, 0, SK_RXRB1_END, sc_if->sk_rx_ramend); in sk_init_locked()
3462 SK_IF_WRITE_4(sc_if, 1, SK_TXRBS1_START, sc_if->sk_tx_ramstart); in sk_init_locked()
3463 SK_IF_WRITE_4(sc_if, 1, SK_TXRBS1_WR_PTR, sc_if->sk_tx_ramstart); in sk_init_locked()
3464 SK_IF_WRITE_4(sc_if, 1, SK_TXRBS1_RD_PTR, sc_if->sk_tx_ramstart); in sk_init_locked()
3465 SK_IF_WRITE_4(sc_if, 1, SK_TXRBS1_END, sc_if->sk_tx_ramend); in sk_init_locked()
3494 device_printf(sc_if->sk_if_dev, in sk_init_locked()
3503 if (imr != SK_IM_USECS(sc->sk_int_mod, sc->sk_int_ticks)) { in sk_init_locked()
3504 sk_win_write_4(sc, SK_IMTIMERINIT, SK_IM_USECS(sc->sk_int_mod, in sk_init_locked()
3505 sc->sk_int_ticks)); in sk_init_locked()
3507 device_printf(sc_if->sk_if_dev, in sk_init_locked()
3508 "interrupt moderation is %d us.\n", in sk_init_locked()
3509 sc->sk_int_mod); in sk_init_locked()
3514 if (sc_if->sk_port == SK_PORT_A) in sk_init_locked()
3515 sc->sk_intrmask |= SK_INTRS1; in sk_init_locked()
3517 sc->sk_intrmask |= SK_INTRS2; in sk_init_locked()
3519 sc->sk_intrmask |= SK_ISR_EXTERNAL_REG; in sk_init_locked()
3521 CSR_WRITE_4(sc, SK_IMR, sc->sk_intrmask); in sk_init_locked()
3526 switch(sc->sk_type) { in sk_init_locked()
3546 /* start transfer of Tx descriptors */ in sk_init_locked()
3547 CSR_WRITE_4(sc, sc_if->sk_tx_bmu, SK_TXBMU_TX_START); in sk_init_locked()
3552 switch (sc->sk_type) { in sk_init_locked()
3556 callout_reset(&sc_if->sk_tick_ch, hz, sk_yukon_tick, sc_if); in sk_init_locked()
3560 callout_reset(&sc_if->sk_watchdog_ch, hz, sk_watchdog, ifp); in sk_init_locked()
3577 sc = sc_if->sk_softc; in sk_stop()
3578 ifp = sc_if->sk_ifp; in sk_stop()
3580 callout_stop(&sc_if->sk_tick_ch); in sk_stop()
3581 callout_stop(&sc_if->sk_watchdog_ch); in sk_stop()
3585 /* stop transfer of Tx descriptors */ in sk_stop()
3586 CSR_WRITE_4(sc, sc_if->sk_tx_bmu, SK_TXBMU_TX_STOP); in sk_stop()
3588 val = CSR_READ_4(sc, sc_if->sk_tx_bmu); in sk_stop()
3594 device_printf(sc_if->sk_if_dev, in sk_stop()
3595 "can not stop transfer of Tx descriptor\n"); in sk_stop()
3596 /* stop transfer of Rx descriptors */ in sk_stop()
3605 device_printf(sc_if->sk_if_dev, in sk_stop()
3606 "can not stop transfer of Rx descriptor\n"); in sk_stop()
3608 if (sc_if->sk_phytype == SK_PHYTYPE_BCOM) { in sk_stop()
3611 if (sc_if->sk_port == SK_PORT_A) { in sk_stop()
3623 switch (sc->sk_type) { in sk_stop()
3646 if (sc_if->sk_port == SK_PORT_A) in sk_stop()
3647 sc->sk_intrmask &= ~SK_INTRS1; in sk_stop()
3649 sc->sk_intrmask &= ~SK_INTRS2; in sk_stop()
3650 CSR_WRITE_4(sc, SK_IMR, sc->sk_intrmask); in sk_stop()
3657 rxd = &sc_if->sk_cdata.sk_rxdesc[i]; in sk_stop()
3658 if (rxd->rx_m != NULL) { in sk_stop()
3659 bus_dmamap_sync(sc_if->sk_cdata.sk_rx_tag, in sk_stop()
3660 rxd->rx_dmamap, BUS_DMASYNC_POSTREAD); in sk_stop()
3661 bus_dmamap_unload(sc_if->sk_cdata.sk_rx_tag, in sk_stop()
3662 rxd->rx_dmamap); in sk_stop()
3663 m_freem(rxd->rx_m); in sk_stop()
3664 rxd->rx_m = NULL; in sk_stop()
3668 jrxd = &sc_if->sk_cdata.sk_jumbo_rxdesc[i]; in sk_stop()
3669 if (jrxd->rx_m != NULL) { in sk_stop()
3670 bus_dmamap_sync(sc_if->sk_cdata.sk_jumbo_rx_tag, in sk_stop()
3671 jrxd->rx_dmamap, BUS_DMASYNC_POSTREAD); in sk_stop()
3672 bus_dmamap_unload(sc_if->sk_cdata.sk_jumbo_rx_tag, in sk_stop()
3673 jrxd->rx_dmamap); in sk_stop()
3674 m_freem(jrxd->rx_m); in sk_stop()
3675 jrxd->rx_m = NULL; in sk_stop()
3679 txd = &sc_if->sk_cdata.sk_txdesc[i]; in sk_stop()
3680 if (txd->tx_m != NULL) { in sk_stop()
3681 bus_dmamap_sync(sc_if->sk_cdata.sk_tx_tag, in sk_stop()
3682 txd->tx_dmamap, BUS_DMASYNC_POSTWRITE); in sk_stop()
3683 bus_dmamap_unload(sc_if->sk_cdata.sk_tx_tag, in sk_stop()
3684 txd->tx_dmamap); in sk_stop()
3685 m_freem(txd->tx_m); in sk_stop()
3686 txd->tx_m = NULL; in sk_stop()
3704 if (error || !req->newptr) in sysctl_int_range()