Lines Matching +full:program +full:- +full:gpios
1 /*-
2 * SPDX-License-Identifier: BSD-4-Clause
4 * Copyright (c) 1997, 1998, 1999, 2000-2003
18 * 4. Neither the name of the author nor the names of any co-contributors
54 * and has a 64-bit multicast hash filter. There is some information
58 * - You must set bit 7 in the RX control register, otherwise the
60 * - You must initialize all 3 IPG registers, or you won't be able
313 err = uether_do_request(&sc->sc_ue, &req, buf, 1000); in axe_cmd()
325 locked = mtx_owned(&sc->sc_mtx); in axe_miibus_readreg()
356 locked = mtx_owned(&sc->sc_mtx); in axe_miibus_writereg()
378 locked = mtx_owned(&sc->sc_mtx); in axe_miibus_statchg()
382 ifp = uether_getifp(&sc->sc_ue); in axe_miibus_statchg()
387 sc->sc_flags &= ~AXE_FLAG_LINK; in axe_miibus_statchg()
388 if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) == in axe_miibus_statchg()
390 switch (IFM_SUBTYPE(mii->mii_media_active)) { in axe_miibus_statchg()
393 sc->sc_flags |= AXE_FLAG_LINK; in axe_miibus_statchg()
396 if ((sc->sc_flags & AXE_FLAG_178) == 0) in axe_miibus_statchg()
398 sc->sc_flags |= AXE_FLAG_LINK; in axe_miibus_statchg()
406 if ((sc->sc_flags & AXE_FLAG_LINK) == 0) in axe_miibus_statchg()
410 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) { in axe_miibus_statchg()
413 if ((IFM_OPTIONS(mii->mii_media_active) & in axe_miibus_statchg()
416 if ((IFM_OPTIONS(mii->mii_media_active) & in axe_miibus_statchg()
423 if ((sc->sc_flags & AXE_FLAG_178) != 0) in axe_miibus_statchg()
425 switch (IFM_SUBTYPE(mii->mii_media_active)) { in axe_miibus_statchg()
458 LIST_FOREACH(miisc, &mii->mii_phys, mii_list) in axe_ifmedia_upd()
475 ifmr->ifm_active = mii->mii_media_active; in axe_ifmedia_sts()
476 ifmr->ifm_status = mii->mii_media_status; in axe_ifmedia_sts()
523 switch (AXE_PHY_TYPE(sc->sc_phyaddrs[sel])) { in axe_get_phyno()
526 phyno = AXE_PHY_NO(sc->sc_phyaddrs[sel]); in axe_get_phyno()
535 phyno = -1; in axe_get_phyno()
554 ue = &sc->sc_ue; in axe_ax88178_init()
573 device_printf(sc->sc_ue.ue_dev, in axe_ax88178_init()
576 /* Program GPIOs depending on PHY hardware. */ in axe_ax88178_init()
633 axe_miibus_writereg(ue->ue_dev, sc->sc_phyno, in axe_ax88178_init()
635 axe_miibus_writereg(ue->ue_dev, sc->sc_phyno, in axe_ax88178_init()
637 val = axe_miibus_readreg(ue->ue_dev, sc->sc_phyno, in axe_ax88178_init()
639 axe_miibus_writereg(ue->ue_dev, sc->sc_phyno, in axe_ax88178_init()
641 axe_miibus_writereg(ue->ue_dev, sc->sc_phyno, in axe_ax88178_init()
646 /* Unknown PHY model or no need to program GPIOs. */ in axe_ax88178_init()
668 uether_pause(&sc->sc_ue, hz / 16); in axe_ax88772_init()
670 if (sc->sc_phyno == AXE_772_PHY_NO_EPHY) { in axe_ax88772_init()
673 uether_pause(&sc->sc_ue, hz / 64); in axe_ax88772_init()
678 uether_pause(&sc->sc_ue, hz / 16); in axe_ax88772_init()
683 uether_pause(&sc->sc_ue, hz / 4); in axe_ax88772_init()
694 uether_pause(&sc->sc_ue, hz / 64); in axe_ax88772_init()
701 uether_pause(&sc->sc_ue, hz / 4); in axe_ax88772_init()
708 if (sc->sc_phyno == AXE_772_PHY_NO_EPHY) { in axe_ax88772_phywake()
709 /* Manually select internal(embedded) PHY - MAC mode. */ in axe_ax88772_phywake()
713 uether_pause(&sc->sc_ue, hz / 32); in axe_ax88772_phywake()
716 * Manually select external PHY - MAC mode. in axe_ax88772_phywake()
721 uether_pause(&sc->sc_ue, hz / 32); in axe_ax88772_phywake()
726 uether_pause(&sc->sc_ue, hz / 4); in axe_ax88772_phywake()
728 uether_pause(&sc->sc_ue, hz); in axe_ax88772_phywake()
730 uether_pause(&sc->sc_ue, hz / 32); in axe_ax88772_phywake()
732 uether_pause(&sc->sc_ue, hz / 32); in axe_ax88772_phywake()
740 ue = &sc->sc_ue; in axe_ax88772a_init()
756 ue = &sc->sc_ue; in axe_ax88772b_init()
764 sc->sc_pwrcfg = le16toh(eeprom) & 0xFF00; in axe_ax88772b_init()
767 * Auto-loaded default station address from internal ROM is in axe_ax88772b_init()
771 eaddr = ue->ue_eaddr; in axe_ax88772b_init()
793 cd = usbd_get_config_descriptor(sc->sc_ue.ue_udev); in axe_reset()
795 err = usbd_req_set_config(sc->sc_ue.ue_udev, &sc->sc_mtx, in axe_reset()
796 cd->bConfigurationValue); in axe_reset()
801 uether_pause(&sc->sc_ue, hz / 100); in axe_reset()
804 if (sc->sc_flags & AXE_FLAG_178) in axe_reset()
806 else if (sc->sc_flags & AXE_FLAG_772) in axe_reset()
808 else if (sc->sc_flags & AXE_FLAG_772A) in axe_reset()
810 else if (sc->sc_flags & AXE_FLAG_772B) in axe_reset()
822 axe_cmd(sc, AXE_CMD_READ_PHYID, 0, 0, sc->sc_phyaddrs); in axe_attach_post()
824 device_printf(sc->sc_ue.ue_dev, "PHYADDR 0x%02x:0x%02x\n", in axe_attach_post()
825 sc->sc_phyaddrs[0], sc->sc_phyaddrs[1]); in axe_attach_post()
826 sc->sc_phyno = axe_get_phyno(sc, AXE_PHY_SEL_PRI); in axe_attach_post()
827 if (sc->sc_phyno == -1) in axe_attach_post()
828 sc->sc_phyno = axe_get_phyno(sc, AXE_PHY_SEL_SEC); in axe_attach_post()
829 if (sc->sc_phyno == -1) { in axe_attach_post()
830 device_printf(sc->sc_ue.ue_dev, in axe_attach_post()
832 sc->sc_phyno = 0; in axe_attach_post()
836 if (sc->sc_flags & AXE_FLAG_178) { in axe_attach_post()
838 axe_cmd(sc, AXE_178_CMD_READ_NODEID, 0, 0, ue->ue_eaddr); in axe_attach_post()
839 } else if (sc->sc_flags & AXE_FLAG_772) { in axe_attach_post()
841 axe_cmd(sc, AXE_178_CMD_READ_NODEID, 0, 0, ue->ue_eaddr); in axe_attach_post()
842 } else if (sc->sc_flags & AXE_FLAG_772A) { in axe_attach_post()
844 axe_cmd(sc, AXE_178_CMD_READ_NODEID, 0, 0, ue->ue_eaddr); in axe_attach_post()
845 } else if (sc->sc_flags & AXE_FLAG_772B) { in axe_attach_post()
848 axe_cmd(sc, AXE_172_CMD_READ_NODEID, 0, 0, ue->ue_eaddr); in axe_attach_post()
853 if (sc->sc_flags & (AXE_FLAG_772A | AXE_FLAG_772B)) { in axe_attach_post()
855 sc->sc_ipgs[0] = 0x15; in axe_attach_post()
856 sc->sc_ipgs[1] = 0x16; in axe_attach_post()
857 sc->sc_ipgs[2] = 0x1A; in axe_attach_post()
859 axe_cmd(sc, AXE_CMD_READ_IPG012, 0, 0, sc->sc_ipgs); in axe_attach_post()
871 ifp = ue->ue_ifp; in axe_attach_post_sub()
881 if (sc->sc_flags & AXE_FLAG_772B) { in axe_attach_post_sub()
895 if (sc->sc_flags & (AXE_FLAG_772A | AXE_FLAG_772B | AXE_FLAG_178)) in axe_attach_post_sub()
900 error = mii_attach(ue->ue_dev, &ue->ue_miibus, ifp, in axe_attach_post_sub()
901 uether_ifmedia_upd, ue->ue_methods->ue_mii_sts, in axe_attach_post_sub()
902 BMSR_DEFCAPMASK, sc->sc_phyno, MII_OFFSET_ANY, adv_pause); in axe_attach_post_sub()
916 if (uaa->usb_mode != USB_MODE_HOST) in axe_probe()
918 if (uaa->info.bConfigIndex != AXE_CONFIG_IDX) in axe_probe()
920 if (uaa->info.bIfaceIndex != AXE_IFACE_IDX) in axe_probe()
935 struct usb_ether *ue = &sc->sc_ue; in axe_attach()
939 sc->sc_flags = USB_GET_DRIVER_INFO(uaa); in axe_attach()
943 mtx_init(&sc->sc_mtx, device_get_nameunit(dev), NULL, MTX_DEF); in axe_attach()
946 error = usbd_transfer_setup(uaa->device, &iface_index, sc->sc_xfer, in axe_attach()
947 axe_config, AXE_N_TRANSFER, sc, &sc->sc_mtx); in axe_attach()
953 ue->ue_sc = sc; in axe_attach()
954 ue->ue_dev = dev; in axe_attach()
955 ue->ue_udev = uaa->device; in axe_attach()
956 ue->ue_mtx = &sc->sc_mtx; in axe_attach()
957 ue->ue_methods = &axe_ue_methods; in axe_attach()
975 struct usb_ether *ue = &sc->sc_ue; in axe_detach()
977 usbd_transfer_unsetup(sc->sc_xfer, AXE_N_TRANSFER); in axe_detach()
979 mtx_destroy(&sc->sc_mtx); in axe_detach()
992 struct usb_ether *ue = &sc->sc_ue; in axe_bulk_read_callback()
1035 if ((sc->sc_flags & AXE_FLAG_STD_FRAME) != 0) { in axe_rx_frame()
1044 if ((hdr.len ^ hdr.ilen) != sc->sc_lenmask) { in axe_rx_frame()
1059 } else if ((sc->sc_flags & AXE_FLAG_CSUM_FRAME) != 0) { in axe_rx_frame()
1073 sc->sc_lenmask) { in axe_rx_frame()
1098 if_inc_counter(ue->ue_ifp, IFCOUNTER_IERRORS, 1); in axe_rx_frame()
1106 if_t ifp = ue->ue_ifp; in axe_rxeof()
1109 if (len < ETHER_HDR_LEN || len > MCLBYTES - ETHER_ALIGN) { in axe_rxeof()
1119 m->m_len = m->m_pkthdr.len = MCLBYTES; in axe_rxeof()
1125 m->m_pkthdr.rcvif = ifp; in axe_rxeof()
1126 m->m_pkthdr.len = m->m_len = len; in axe_rxeof()
1128 if (csum_hdr != NULL && csum_hdr->cstatus & AXE_CSUM_HDR_L3_TYPE_IPV4) { in axe_rxeof()
1129 if ((csum_hdr->cstatus & (AXE_CSUM_HDR_L4_CSUM_ERR | in axe_rxeof()
1131 m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED | in axe_rxeof()
1133 if ((csum_hdr->cstatus & AXE_CSUM_HDR_L4_TYPE_MASK) == in axe_rxeof()
1135 (csum_hdr->cstatus & AXE_CSUM_HDR_L4_TYPE_MASK) == in axe_rxeof()
1137 m->m_pkthdr.csum_flags |= in axe_rxeof()
1139 m->m_pkthdr.csum_data = 0xffff; in axe_rxeof()
1144 (void)mbufq_enqueue(&ue->ue_rxq, m); in axe_rxeof()
1157 if_t ifp = uether_getifp(&sc->sc_ue); in axe_bulk_write_callback()
1169 if ((sc->sc_flags & AXE_FLAG_LINK) == 0 || in axe_bulk_write_callback()
1188 hdr.len = htole16(m->m_pkthdr.len); in axe_bulk_write_callback()
1197 if ((m->m_pkthdr.csum_flags & in axe_bulk_write_callback()
1207 usbd_m_copy_in(pc, pos, m, 0, m->m_pkthdr.len); in axe_bulk_write_callback()
1208 pos += m->m_pkthdr.len; in axe_bulk_write_callback()
1217 usbd_m_copy_in(pc, pos, m, 0, m->m_pkthdr.len); in axe_bulk_write_callback()
1218 pos += m->m_pkthdr.len; in axe_bulk_write_callback()
1275 if ((sc->sc_flags & AXE_FLAG_LINK) == 0) { in axe_tick()
1276 axe_miibus_statchg(ue->ue_dev); in axe_tick()
1277 if ((sc->sc_flags & AXE_FLAG_LINK) != 0) in axe_tick()
1290 usbd_transfer_start(sc->sc_xfer[AXE_BULK_DT_RD]); in axe_start()
1291 usbd_transfer_start(sc->sc_xfer[AXE_BULK_DT_WR]); in axe_start()
1304 if ((sc->sc_flags & AXE_FLAG_772B) != 0) { in axe_csum_cfg()
1342 axe_cmd(sc, AXE_178_CMD_WRITE_IPG012, sc->sc_ipgs[2], in axe_init()
1343 (sc->sc_ipgs[1] << 8) | (sc->sc_ipgs[0]), NULL); in axe_init()
1346 axe_cmd(sc, AXE_172_CMD_WRITE_IPG0, 0, sc->sc_ipgs[0], NULL); in axe_init()
1347 axe_cmd(sc, AXE_172_CMD_WRITE_IPG1, 0, sc->sc_ipgs[1], NULL); in axe_init()
1348 axe_cmd(sc, AXE_172_CMD_WRITE_IPG2, 0, sc->sc_ipgs[2], NULL); in axe_init()
1352 sc->sc_flags &= ~(AXE_FLAG_STD_FRAME | AXE_FLAG_CSUM_FRAME); in axe_init()
1353 if ((sc->sc_flags & AXE_FLAG_772B) != 0 && in axe_init()
1355 sc->sc_lenmask = AXE_CSUM_HDR_LEN_MASK; in axe_init()
1356 sc->sc_flags |= AXE_FLAG_CSUM_FRAME; in axe_init()
1358 sc->sc_lenmask = AXE_HDR_LEN_MASK; in axe_init()
1359 sc->sc_flags |= AXE_FLAG_STD_FRAME; in axe_init()
1366 if (sc->sc_flags & AXE_FLAG_772B) { in axe_init()
1376 if (sc->sc_flags & AXE_FLAG_772B) { in axe_init()
1413 usbd_xfer_set_stall(sc->sc_xfer[AXE_BULK_DT_WR]); in axe_init()
1451 sc->sc_flags &= ~AXE_FLAG_LINK; in axe_stop()
1456 usbd_transfer_stop(sc->sc_xfer[AXE_BULK_DT_WR]); in axe_stop()
1457 usbd_transfer_stop(sc->sc_xfer[AXE_BULK_DT_RD]); in axe_stop()
1474 mask = ifr->ifr_reqcap ^ if_getcapenable(ifp); in axe_ioctl()