Lines Matching defs:sc
154 felix_softc_t sc;
156 sc = device_get_softc(dev);
157 sc->dev = dev;
173 felix_parse_port_fdt(felix_softc_t sc, phandle_t child, int *pport)
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;
193 sc->ports[port].fixed_port = false;
197 sc->ports[port].fixed_port = true;
200 device_printf(sc->dev,
219 device_printf(sc->dev,
231 sc->ports[port].fixed_link_status = status;
236 felix_init_interface(felix_softc_t sc, int port)
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);
258 felix_setup_port(felix_softc_t sc, int port)
262 FELIX_DEVGMII_PORT_WR4(sc, port, FELIX_DEVGMII_CLK_CFG,
264 FELIX_DEVGMII_PORT_WR4(sc, port, FELIX_DEVGMII_MAC_CFG,
266 FELIX_WR4(sc, FELIX_QSYS_PORT_MODE(port),
276 FELIX_DEVGMII_PORT_WR4(sc, port, FELIX_DEVGMII_VLAN_CFG,
283 felix_setup(felix_softc_t sc)
289 FELIX_WR4(sc, FELIX_DEVCPU_GCB_RST, FELIX_DEVCPU_GCB_RST_EN);
293 reg = FELIX_RD4(sc, FELIX_DEVCPU_GCB_RST);
298 device_printf(sc->dev,
303 FELIX_WR4(sc, FELIX_SYS_RAM_CTRL, FELIX_SYS_RAM_CTRL_INIT);
307 reg = FELIX_RD4(sc, FELIX_SYS_RAM_CTRL);
312 device_printf(sc->dev,
317 FELIX_WR4(sc, FELIX_SYS_CFG, FELIX_SYS_CFG_CORE_EN);
319 for (i = 0; i < sc->info.es_nports; i++)
320 felix_setup_port(sc, i);
328 felix_softc_t sc;
331 sc = arg1;
333 old = value = sc->timer_ticks;
344 FELIX_LOCK(sc);
345 sc->timer_ticks = value;
346 callout_reset(&sc->tick_callout, sc->timer_ticks, felix_tick, sc);
347 FELIX_UNLOCK(sc);
357 felix_softc_t sc;
361 sc = device_get_softc(dev);
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) {
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);
405 error = felix_parse_port_fdt(sc, child, &port);
409 error = felix_init_interface(sc, port);
411 device_printf(sc->dev,
416 if (sc->ports[port].fixed_port) {
417 sc->info.es_nports++;
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++;
449 error = felix_setup(sc);
453 sc->timer_ticks = hz; /* Default to 1s. */
457 sc, 0, felix_timer_rate, "I",
461 FELIX_LOCK(sc);
462 felix_tick(sc);
463 FELIX_UNLOCK(sc);
479 felix_softc_t sc;
483 sc = device_get_softc(dev);
488 mtx_lock(&sc->mtx);
489 callout_stop(&sc->tick_callout);
490 mtx_unlock(&sc->mtx);
491 mtx_destroy(&sc->mtx);
498 felix_setup(sc);
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);
521 felix_softc_t sc;
523 sc = device_get_softc(dev);
524 return (&sc->info);
530 felix_softc_t sc;
532 sc = device_get_softc(dev);
536 conf->vlan_mode = sc->vlan_mode;
541 felix_init_vlan(felix_softc_t sc)
548 FELIX_WR4(sc, FELIX_ANA_VT, FELIX_ANA_VT_RESET);
551 reg = FELIX_RD4(sc, FELIX_ANA_VT);
556 device_printf(sc->dev,
561 /* Flush VLAN table in sc. */
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++) {
572 reg = FELIX_ANA_PORT_RD4(sc, i, FELIX_ANA_PORT_VLAN_CFG);
577 FELIX_ANA_PORT_WR4(sc, i, FELIX_ANA_PORT_VLAN_CFG, reg);
585 felix_softc_t sc;
590 sc = device_get_softc(dev);
591 FELIX_LOCK(sc);
595 sc->vlan_mode = ETHERSWITCH_VLAN_DOT1Q;
596 sc->info.es_nvlangroups = FELIX_NUM_VLANS;
597 error = felix_init_vlan(sc);
603 FELIX_UNLOCK(sc);
610 felix_softc_t sc;
612 sc = device_get_softc(dev);
613 FELIX_LOCK_ASSERT(sc, MA_NOTOWNED);
614 FELIX_LOCK(sc);
620 felix_softc_t sc;
622 sc = device_get_softc(dev);
623 FELIX_LOCK_ASSERT(sc, MA_OWNED);
624 FELIX_UNLOCK(sc);
628 felix_get_port_cfg(felix_softc_t sc, etherswitch_port_t *p)
634 reg = FELIX_ANA_PORT_RD4(sc, p->es_port, FELIX_ANA_PORT_DROP_CFG);
641 reg = FELIX_DEVGMII_PORT_RD4(sc, p->es_port, FELIX_DEVGMII_VLAN_CFG);
645 reg = FELIX_REW_PORT_RD4(sc, p->es_port, FELIX_REW_PORT_TAG_CFG);
649 reg = FELIX_ANA_PORT_RD4(sc, p->es_port, FELIX_ANA_PORT_VLAN_CFG);
661 felix_softc_t sc;
665 sc = device_get_softc(dev);
666 FELIX_LOCK_ASSERT(sc, MA_NOTOWNED);
668 if (p->es_port >= sc->info.es_nports || p->es_port < 0)
671 FELIX_LOCK(sc);
672 felix_get_port_cfg(sc, p);
673 if (sc->ports[p->es_port].fixed_port) {
677 ifmr->ifm_active = sc->ports[p->es_port].fixed_link_status;
681 mii = felix_miiforport(sc, p->es_port);
685 FELIX_UNLOCK(sc);
690 felix_set_port_cfg(felix_softc_t sc, etherswitch_port_t *p)
694 reg = FELIX_ANA_PORT_RD4(sc, p->es_port, FELIX_ANA_PORT_DROP_CFG);
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);
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);
734 FELIX_ANA_PORT_WR4(sc, p->es_port, FELIX_ANA_PORT_VLAN_CFG, reg);
740 felix_softc_t sc;
745 sc = device_get_softc(dev);
746 FELIX_LOCK_ASSERT(sc, MA_NOTOWNED);
748 if (p->es_port >= sc->info.es_nports || p->es_port < 0)
751 FELIX_LOCK(sc);
752 felix_set_port_cfg(sc, p);
753 if (felix_is_phyport(sc, p->es_port)) {
754 mii = felix_miiforport(sc, p->es_port);
758 FELIX_UNLOCK(sc);
766 felix_softc_t sc;
768 sc = device_get_softc(dev);
769 if (addr_reg > rman_get_size(sc->regs))
772 return (FELIX_RD4(sc, addr_reg));
778 felix_softc_t sc;
780 sc = device_get_softc(dev);
781 if (addr_reg > rman_get_size(sc->regs))
784 FELIX_WR4(sc, addr_reg, val);
791 felix_softc_t sc;
793 sc = device_get_softc(dev);
795 return (enetc_mdio_read(sc->mdio, FELIX_MDIO_BASE, phy, reg));
801 felix_softc_t sc;
803 sc = device_get_softc(dev);
805 return (enetc_mdio_write(sc->mdio, FELIX_MDIO_BASE, phy, reg, data));
809 felix_set_dot1q_vlan(felix_softc_t sc, etherswitch_vlangroup_t *vg)
826 FELIX_WR4(sc, FELIX_ANA_VTIDX, sc->vlans[vg->es_vlangroup]);
827 FELIX_WR4(sc, FELIX_ANA_VT, FELIX_ANA_VT_WRITE);
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;
849 FELIX_WR4(sc, FELIX_ANA_VTIDX, vid);
850 FELIX_WR4(sc, FELIX_ANA_VT, reg);
859 reg = FELIX_RD4(sc, FELIX_ANA_VT);
869 felix_softc_t sc;
872 sc = device_get_softc(dev);
874 FELIX_LOCK(sc);
875 if (sc->vlan_mode == ETHERSWITCH_VLAN_DOT1Q)
876 error = felix_set_dot1q_vlan(sc, vg);
880 FELIX_UNLOCK(sc);
885 felix_get_dot1q_vlan(felix_softc_t sc, etherswitch_vlangroup_t *vg)
890 vid = sc->vlans[vg->es_vlangroup];
895 FELIX_WR4(sc, FELIX_ANA_VTIDX, vid);
896 FELIX_WR4(sc, FELIX_ANA_VT, FELIX_ANA_VT_READ);
905 reg = FELIX_RD4(sc, FELIX_ANA_VT);
921 felix_softc_t sc;
924 sc = device_get_softc(dev);
926 FELIX_LOCK(sc);
927 if (sc->vlan_mode == ETHERSWITCH_VLAN_DOT1Q)
928 error = felix_get_dot1q_vlan(sc, vg);
932 FELIX_UNLOCK(sc);
940 felix_softc_t sc;
943 sc = arg;
945 FELIX_LOCK_ASSERT(sc, MA_OWNED);
947 for (port = 0; port < sc->info.es_nports; port++) {
948 if (!felix_is_phyport(sc, port))
951 mii = felix_miiforport(sc, port);
955 if (sc->timer_ticks != 0)
956 callout_reset(&sc->tick_callout, sc->timer_ticks, felix_tick, sc);
963 felix_softc_t sc;
965 sc = if_getsoftc(ifp);
966 mii = felix_miiforport(sc, if_getdunit(ifp));
977 felix_softc_t sc;
980 sc = if_getsoftc(ifp);
981 mii = felix_miiforport(sc, if_getdunit(ifp));
991 felix_is_phyport(felix_softc_t sc, int port)
994 return (!sc->ports[port].fixed_port);
998 felix_miiforport(felix_softc_t sc, unsigned int port)
1001 if (!felix_is_phyport(sc, port))
1004 return (device_get_softc(sc->ports[port].miibus));