Lines Matching +full:conf +full:- +full:mdio

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
148 felix_pci_ids, nitems(felix_pci_ids) - 1);
157 sc->dev = dev;
159 for (id = felix_pci_ids; id->vendor != 0; ++id) {
160 if (pci_get_device(dev) != id->device ||
161 pci_get_vendor(dev) != id->vendor)
164 device_set_desc(dev, id->desc);
179 device_printf(sc->dev, "Port node doesn't have reg property\n");
187 sc->ports[port].cpu_port = false;
189 sc->ports[port].cpu_port = true;
191 node = ofw_bus_find_child(child, "fixed-link");
193 sc->ports[port].fixed_port = false;
197 sc->ports[port].fixed_port = true;
200 device_printf(sc->dev,
201 "Port has fixed-link node without link speed specified\n");
219 device_printf(sc->dev,
225 if (OF_hasprop(node, "full-duplex"))
231 sc->ports[port].fixed_link_status = status;
240 snprintf(name, IFNAMSIZ, "%sport", device_get_nameunit(sc->dev));
242 sc->ports[port].ifp = if_alloc(IFT_ETHER);
243 if_setsoftc(sc->ports[port].ifp, sc);
244 if_setflags(sc->ports[port].ifp, IFF_UP | IFF_BROADCAST | IFF_MULTICAST |
246 sc->ports[port].ifname = malloc(strlen(name) + 1, M_FELIX, M_NOWAIT);
247 if (sc->ports[port].ifname == NULL) {
248 if_free(sc->ports[port].ifp);
252 memcpy(sc->ports[port].ifname, name, strlen(name) + 1);
253 if_initname(sc->ports[port].ifp, sc->ports[port].ifname, port);
288 /* Trigger soft reset, bit is self-clearing, with 5s timeout. */
296 } while (timeout-- > 0);
298 device_printf(sc->dev,
310 } while (timeout-- > 0);
312 device_printf(sc->dev,
319 for (i = 0; i < sc->info.es_nports; i++)
333 old = value = sc->timer_ticks;
335 if (error != 0 || req->newptr == NULL)
345 sc->timer_ticks = value;
346 callout_reset(&sc->tick_callout, sc->timer_ticks, felix_tick, sc);
362 sc->info.es_nports = 0;
363 sc->info.es_vlan_caps = ETHERSWITCH_VLAN_DOT1Q;
364 strlcpy(sc->info.es_name, "Felix TSN Switch", sizeof(sc->info.es_name));
367 sc->mdio = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
369 if (sc->mdio == NULL) {
370 device_printf(dev, "Failed to allocate MDIO registers.\n");
375 sc->regs = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
377 if (sc->regs == NULL) {
383 mtx_init(&sc->mtx, "felix lock", NULL, MTX_DEF);
384 callout_init_mtx(&sc->tick_callout, &sc->mtx, 0);
411 device_printf(sc->dev,
416 if (sc->ports[port].fixed_port) {
417 sc->info.es_nports++;
421 size = OF_getencprop(child, "phy-handle", &node, sizeof(node));
423 device_printf(sc->dev,
432 device_printf(sc->dev,
438 sc->ports[port].phyaddr = phy_addr;
439 sc->ports[port].miibus = NULL;
440 error = mii_attach(dev, &sc->ports[port].miibus, sc->ports[port].ifp,
446 sc->info.es_nports++;
453 sc->timer_ticks = hz; /* Default to 1s. */
488 mtx_lock(&sc->mtx);
489 callout_stop(&sc->tick_callout);
490 mtx_unlock(&sc->mtx);
491 mtx_destroy(&sc->mtx);
500 for (i = 0; i < sc->info.es_nports; i++) {
501 if (sc->ports[i].ifp != NULL)
502 if_free(sc->ports[i].ifp);
503 if (sc->ports[i].ifname != NULL)
504 free(sc->ports[i].ifname, M_FELIX);
507 if (sc->regs != NULL)
508 error = bus_release_resource(sc->dev, SYS_RES_MEMORY,
509 rman_get_rid(sc->regs), sc->regs);
511 if (sc->mdio != NULL)
512 error = bus_release_resource(sc->dev, SYS_RES_MEMORY,
513 rman_get_rid(sc->mdio), sc->mdio);
524 return (&sc->info);
528 felix_getconf(device_t dev, etherswitch_conf_t *conf)
535 conf->cmd = ETHERSWITCH_CONF_VLAN_MODE;
536 conf->vlan_mode = sc->vlan_mode;
554 } while (timeout-- > 0);
556 device_printf(sc->dev,
562 for (i = 0; i < sc->info.es_nvlangroups; i++)
563 sc->vlans[i] = 0;
571 for (i = 0; i < sc->info.es_nports; i++) {
583 felix_setconf(device_t dev, etherswitch_conf_t *conf)
592 if (conf->cmd & ETHERSWITCH_CONF_VLAN_MODE) {
593 switch (conf->vlan_mode) {
595 sc->vlan_mode = ETHERSWITCH_VLAN_DOT1Q;
596 sc->info.es_nvlangroups = FELIX_NUM_VLANS;
632 p->es_flags = 0;
634 reg = FELIX_ANA_PORT_RD4(sc, p->es_port, FELIX_ANA_PORT_DROP_CFG);
636 p->es_flags |= ETHERSWITCH_PORT_DROPTAGGED;
639 p->es_flags |= ETHERSWITCH_PORT_DROPUNTAGGED;
641 reg = FELIX_DEVGMII_PORT_RD4(sc, p->es_port, FELIX_DEVGMII_VLAN_CFG);
643 p->es_flags |= ETHERSWITCH_PORT_DOUBLE_TAG;
645 reg = FELIX_REW_PORT_RD4(sc, p->es_port, FELIX_REW_PORT_TAG_CFG);
647 p->es_flags |= ETHERSWITCH_PORT_ADDTAG;
649 reg = FELIX_ANA_PORT_RD4(sc, p->es_port, FELIX_ANA_PORT_VLAN_CFG);
651 p->es_flags |= ETHERSWITCH_PORT_STRIPTAGINGRESS;
653 p->es_pvid = reg & FELIX_ANA_PORT_VLAN_CFG_VID_MASK;
668 if (p->es_port >= sc->info.es_nports || p->es_port < 0)
673 if (sc->ports[p->es_port].fixed_port) {
674 ifmr = &p->es_ifmr;
675 ifmr->ifm_status = IFM_ACTIVE | IFM_AVALID;
676 ifmr->ifm_count = 0;
677 ifmr->ifm_active = sc->ports[p->es_port].fixed_link_status;
678 ifmr->ifm_current = ifmr->ifm_active;
679 ifmr->ifm_mask = 0;
681 mii = felix_miiforport(sc, p->es_port);
682 error = ifmedia_ioctl(mii->mii_ifp, &p->es_ifr,
683 &mii->mii_media, SIOCGIFMEDIA);
694 reg = FELIX_ANA_PORT_RD4(sc, p->es_port, FELIX_ANA_PORT_DROP_CFG);
695 if (p->es_flags & ETHERSWITCH_PORT_DROPTAGGED)
700 if (p->es_flags & ETHERSWITCH_PORT_DROPUNTAGGED)
705 FELIX_ANA_PORT_WR4(sc, p->es_port, FELIX_ANA_PORT_DROP_CFG, reg);
707 reg = FELIX_REW_PORT_RD4(sc, p->es_port, FELIX_REW_PORT_TAG_CFG);
708 if (p->es_flags & ETHERSWITCH_PORT_ADDTAG)
713 FELIX_REW_PORT_WR4(sc, p->es_port, FELIX_REW_PORT_TAG_CFG, reg);
715 reg = FELIX_ANA_PORT_RD4(sc, p->es_port, FELIX_ANA_PORT_VLAN_CFG);
716 if (p->es_flags & ETHERSWITCH_PORT_STRIPTAGINGRESS)
722 reg |= p->es_pvid & FELIX_ANA_PORT_VLAN_CFG_VID_MASK;
729 if (p->es_pvid != 0)
734 FELIX_ANA_PORT_WR4(sc, p->es_port, FELIX_ANA_PORT_VLAN_CFG, reg);
748 if (p->es_port >= sc->info.es_nports || p->es_port < 0)
753 if (felix_is_phyport(sc, p->es_port)) {
754 mii = felix_miiforport(sc, p->es_port);
755 error = ifmedia_ioctl(mii->mii_ifp, &p->es_ifr, &mii->mii_media,
769 if (addr_reg > rman_get_size(sc->regs))
781 if (addr_reg > rman_get_size(sc->regs))
795 return (enetc_mdio_read(sc->mdio, FELIX_MDIO_BASE, phy, reg));
805 return (enetc_mdio_write(sc->mdio, FELIX_MDIO_BASE, phy, reg, data));
814 vid = vg->es_vid & ETHERSWITCH_VID_MASK;
817 if (vg->es_member_ports != vg->es_untagged_ports)
826 FELIX_WR4(sc, FELIX_ANA_VTIDX, sc->vlans[vg->es_vlangroup]);
828 sc->vlans[vg->es_vlangroup] = 0;
833 for (i = 0; i < sc->info.es_nvlangroups; i++)
834 if (i != vg->es_vlangroup && vid == sc->vlans[i])
838 if (sc->vlans[vg->es_vlangroup] != 0 &&
839 sc->vlans[vg->es_vlangroup] != vid)
842 sc->vlans[vg->es_vlangroup] = vid;
845 reg = vg->es_member_ports & FELIX_ANA_VT_PORTMASK_MASK;
875 if (sc->vlan_mode == ETHERSWITCH_VLAN_DOT1Q)
890 vid = sc->vlans[vg->es_vlangroup];
912 vg->es_untagged_ports = vg->es_member_ports = reg;
913 vg->es_fid = 0;
914 vg->es_vid = vid | ETHERSWITCH_VID_VALID;
927 if (sc->vlan_mode == ETHERSWITCH_VLAN_DOT1Q)
947 for (port = 0; port < sc->info.es_nports; port++) {
955 if (sc->timer_ticks != 0)
956 callout_reset(&sc->tick_callout, sc->timer_ticks, felix_tick, sc);
986 ifmr->ifm_active = mii->mii_media_active;
987 ifmr->ifm_status = mii->mii_media_status;
994 return (!sc->ports[port].fixed_port);
1004 return (device_get_softc(sc->ports[port].miibus));