Lines Matching defs:sc

86 static int ar8xxx_port_vlan_setup(struct arswitch_softc *sc,
88 static int ar8xxx_port_vlan_get(struct arswitch_softc *sc,
90 static int arswitch_setled(struct arswitch_softc *sc, int phy, int led,
96 struct arswitch_softc *sc;
100 sc = device_get_softc(dev);
101 bzero(sc, sizeof(*sc));
102 sc->page = -1;
106 sc->chip_rev = (id & AR8X16_MASK_CTRL_REV_MASK);
107 sc->chip_ver = (id & AR8X16_MASK_CTRL_VER_MASK) >> AR8X16_MASK_CTRL_VER_SHIFT;
111 sc->sc_switchtype = AR8X16_SWITCH_AR8216;
115 sc->sc_switchtype = AR8X16_SWITCH_AR8226;
121 sc->sc_switchtype = AR8X16_SWITCH_AR8316;
126 sc->sc_switchtype = AR8X16_SWITCH_AR8327;
127 sc->mii_lo_first = 1;
133 DPRINTF(sc, ARSWITCH_DBG_ANY, "chipname=%s, id=%08x\n", chipname, id);
137 chipname, sc->chip_ver, sc->chip_rev);
144 arswitch_attach_phys(struct arswitch_softc *sc)
150 snprintf(name, IFNAMSIZ, "%sport", device_get_nameunit(sc->sc_dev));
151 for (phy = 0; phy < sc->numphys; phy++) {
152 sc->ifp[phy] = if_alloc(IFT_ETHER);
153 if_setsoftc(sc->ifp[phy], sc);
154 if_setflagbits(sc->ifp[phy], IFF_UP | IFF_BROADCAST |
156 sc->ifname[phy] = malloc(strlen(name)+1, M_DEVBUF, M_WAITOK);
157 bcopy(name, sc->ifname[phy], strlen(name)+1);
158 if_initname(sc->ifp[phy], sc->ifname[phy],
160 err = mii_attach(sc->sc_dev, &sc->miibus[phy], sc->ifp[phy],
164 DPRINTF(sc->sc_dev, "%s attached to pseudo interface %s\n",
165 device_get_nameunit(sc->miibus[phy]),
166 sc->ifp[phy]->if_xname);
169 device_printf(sc->sc_dev,
175 if (AR8X16_IS_SWITCH(sc, AR8327)) {
182 sc->dev_led[phy][led].sc = sc;
183 sc->dev_led[phy][led].phy = phy;
184 sc->dev_led[phy][led].lednum = led;
207 arswitch_set_vlan_mode(struct arswitch_softc *sc, uint32_t mode)
211 if ((mode & sc->info.es_vlan_caps) != mode)
216 sc->vlan_mode = ETHERSWITCH_VLAN_DOT1Q;
219 sc->vlan_mode = ETHERSWITCH_VLAN_PORT;
222 sc->vlan_mode = 0;
226 sc->hal.arswitch_vlan_init_hw(sc);
232 ar8xxx_port_init(struct arswitch_softc *sc, int port)
237 arswitch_writereg(sc->sc_dev, AR8X16_REG_PORT_STS(0),
238 (AR8X16_IS_SWITCH(sc, AR8216) ?
240 (AR8X16_IS_SWITCH(sc, AR8216) ? 0 : AR8X16_PORT_STS_RXFLOW) |
241 (AR8X16_IS_SWITCH(sc, AR8216) ? 0 : AR8X16_PORT_STS_TXFLOW) |
245 arswitch_writereg(sc->sc_dev, AR8X16_REG_PORT_CTRL(0),
246 arswitch_readreg(sc->sc_dev, AR8X16_REG_PORT_CTRL(0)) &
250 arswitch_writereg(sc->sc_dev, AR8X16_REG_PORT_STS(port),
252 arswitch_writereg(sc->sc_dev, AR8X16_REG_PORT_CTRL(port),
253 arswitch_readreg(sc->sc_dev, AR8X16_REG_PORT_CTRL(port)) &
259 ar8xxx_atu_wait_ready(struct arswitch_softc *sc)
263 ARSWITCH_LOCK_ASSERT(sc, MA_OWNED);
265 ret = arswitch_waitreg(sc->sc_dev,
278 ar8xxx_atu_flush(struct arswitch_softc *sc)
282 ARSWITCH_LOCK_ASSERT(sc, MA_OWNED);
284 DPRINTF(sc, ARSWITCH_DBG_ATU, "%s: flushing all ports\n", __func__);
286 ret = ar8xxx_atu_wait_ready(sc);
288 device_printf(sc->sc_dev, "%s: waitreg failed\n", __func__);
291 arswitch_writereg(sc->sc_dev,
302 ar8xxx_atu_flush_port(struct arswitch_softc *sc, int port)
306 DPRINTF(sc, ARSWITCH_DBG_ATU, "%s: flushing port %d\n", __func__,
309 ARSWITCH_LOCK_ASSERT(sc, MA_OWNED);
319 ret = ar8xxx_atu_wait_ready(sc);
321 device_printf(sc->sc_dev, "%s: waitreg failed\n", __func__);
324 arswitch_writereg(sc->sc_dev,
339 ar8xxx_atu_fetch_table(struct arswitch_softc *sc, etherswitch_atu_entry_t *e,
344 ARSWITCH_LOCK_ASSERT(sc, MA_OWNED);
350 DPRINTF(sc, ARSWITCH_DBG_ATU, "%s: initializing\n", __func__);
351 (void) ar8xxx_atu_wait_ready(sc);
353 arswitch_writereg(sc->sc_dev,
355 arswitch_writereg(sc->sc_dev,
357 arswitch_writereg(sc->sc_dev,
362 DPRINTF(sc, ARSWITCH_DBG_ATU, "%s: reading next\n", __func__);
367 (void) ar8xxx_atu_wait_ready(sc);
370 val = arswitch_readreg(sc->sc_dev, AR8216_REG_ATU);
372 arswitch_writereg(sc->sc_dev, AR8216_REG_ATU, val);
375 (void) ar8xxx_atu_wait_ready(sc);
378 ret0 = arswitch_readreg(sc->sc_dev, AR8216_REG_ATU);
379 ret1 = arswitch_readreg(sc->sc_dev, AR8216_REG_ATU_DATA);
380 ret2 = arswitch_readreg(sc->sc_dev, AR8216_REG_ATU_CTRL2);
399 DPRINTF(sc, ARSWITCH_DBG_ATU, "%s: MAC %6D portmask 0x%08x\n",
413 ar8xxx_atu_learn_default(struct arswitch_softc *sc)
418 DPRINTF(sc, ARSWITCH_DBG_ATU, "%s: resetting learning\n", __func__);
437 ret = arswitch_writereg(sc->sc_dev,
442 device_printf(sc->sc_dev, "%s: writereg failed\n", __func__);
457 ar8xxx_hw_get_switch_macaddr(struct arswitch_softc *sc, struct ether_addr *ea)
464 ret0 = arswitch_readreg(sc->sc_dev, AR8X16_REG_SW_MAC_ADDR0);
465 ret1 = arswitch_readreg(sc->sc_dev, AR8X16_REG_SW_MAC_ADDR1);
481 ar8xxx_hw_set_switch_macaddr(struct arswitch_softc *sc,
495 struct arswitch_softc *sc = device_get_softc(dev);
501 /* sc->sc_switchtype is already decided in arswitch_probe() */
502 sc->sc_dev = dev;
503 mtx_init(&sc->sc_mtx, "arswitch", NULL, MTX_DEF);
504 sc->page = -1;
505 strlcpy(sc->info.es_name, device_get_desc(dev),
506 sizeof(sc->info.es_name));
509 ctx = device_get_sysctl_ctx(sc->sc_dev);
510 tree = device_get_sysctl_tree(sc->sc_dev);
512 "debug", CTLFLAG_RW, &sc->sc_debug, 0,
517 sc->atu.entries = malloc(sizeof(etherswitch_atu_entry_t) * 128,
519 if (sc->atu.entries == NULL) {
520 device_printf(sc->sc_dev, "%s: failed to allocate ATU table\n",
524 sc->atu.count = 0;
525 sc->atu.size = 128;
528 sc->hal.arswitch_port_init = ar8xxx_port_init;
529 sc->hal.arswitch_port_vlan_setup = ar8xxx_port_vlan_setup;
530 sc->hal.arswitch_port_vlan_get = ar8xxx_port_vlan_get;
531 sc->hal.arswitch_vlan_init_hw = ar8xxx_reset_vlans;
532 sc->hal.arswitch_hw_get_switch_macaddr = ar8xxx_hw_get_switch_macaddr;
533 sc->hal.arswitch_hw_set_switch_macaddr = ar8xxx_hw_set_switch_macaddr;
535 sc->hal.arswitch_vlan_getvgroup = ar8xxx_getvgroup;
536 sc->hal.arswitch_vlan_setvgroup = ar8xxx_setvgroup;
538 sc->hal.arswitch_vlan_get_pvid = ar8xxx_get_pvid;
539 sc->hal.arswitch_vlan_set_pvid = ar8xxx_set_pvid;
541 sc->hal.arswitch_get_dot1q_vlan = ar8xxx_get_dot1q_vlan;
542 sc->hal.arswitch_set_dot1q_vlan = ar8xxx_set_dot1q_vlan;
543 sc->hal.arswitch_flush_dot1q_vlan = ar8xxx_flush_dot1q_vlan;
544 sc->hal.arswitch_purge_dot1q_vlan = ar8xxx_purge_dot1q_vlan;
545 sc->hal.arswitch_get_port_vlan = ar8xxx_get_port_vlan;
546 sc->hal.arswitch_set_port_vlan = ar8xxx_set_port_vlan;
548 sc->hal.arswitch_atu_flush = ar8xxx_atu_flush;
549 sc->hal.arswitch_atu_flush_port = ar8xxx_atu_flush_port;
550 sc->hal.arswitch_atu_learn_default = ar8xxx_atu_learn_default;
551 sc->hal.arswitch_atu_fetch_table = ar8xxx_atu_fetch_table;
553 sc->hal.arswitch_phy_read = arswitch_readphy_internal;
554 sc->hal.arswitch_phy_write = arswitch_writephy_internal;
559 if (AR8X16_IS_SWITCH(sc, AR8216))
560 ar8216_attach(sc);
561 else if (AR8X16_IS_SWITCH(sc, AR8226))
562 ar8226_attach(sc);
563 else if (AR8X16_IS_SWITCH(sc, AR8316))
564 ar8316_attach(sc);
565 else if (AR8X16_IS_SWITCH(sc, AR8327))
566 ar8327_attach(sc);
568 DPRINTF(sc, ARSWITCH_DBG_ANY,
569 "%s: unknown switch (%d)?\n", __func__, sc->sc_switchtype);
574 sc->info.es_nports = 5; /* XXX technically 6, but 6th not used */
577 sc->numphys = 4;
578 sc->phy4cpu = 1;
579 sc->is_rgmii = 1;
580 sc->is_gmii = 0;
581 sc->is_mii = 0;
584 "numphys", &sc->numphys);
586 "phy4cpu", &sc->phy4cpu);
588 "is_rgmii", &sc->is_rgmii);
590 "is_gmii", &sc->is_gmii);
592 "is_mii", &sc->is_mii);
594 if (sc->numphys > AR8X16_NUM_PHYS)
595 sc->numphys = AR8X16_NUM_PHYS;
599 DPRINTF(sc, ARSWITCH_DBG_ANY,
604 err = sc->hal.arswitch_hw_setup(sc);
606 DPRINTF(sc, ARSWITCH_DBG_ANY,
611 err = sc->hal.arswitch_hw_global_setup(sc);
613 DPRINTF(sc, ARSWITCH_DBG_ANY,
622 err = sc->hal.arswitch_atu_learn_default(sc);
624 DPRINTF(sc, ARSWITCH_DBG_ANY,
630 for (port = 0; port <= sc->numphys; port++) {
631 sc->hal.arswitch_port_init(sc, port);
637 err = arswitch_attach_phys(sc);
639 DPRINTF(sc, ARSWITCH_DBG_ANY,
645 err = arswitch_set_vlan_mode(sc, 0);
647 DPRINTF(sc, ARSWITCH_DBG_ANY,
656 callout_init_mtx(&sc->callout_tick, &sc->sc_mtx, 0);
658 ARSWITCH_LOCK(sc);
659 arswitch_tick(sc);
660 ARSWITCH_UNLOCK(sc);
668 struct arswitch_softc *sc = device_get_softc(dev);
671 callout_drain(&sc->callout_tick);
677 for (i=0; i < sc->numphys; i++) {
678 if (sc->ifp[i] != NULL)
679 if_free(sc->ifp[i]);
680 free(sc->ifname[i], M_DEVBUF);
683 free(sc->atu.entries, M_DEVBUF);
685 mtx_destroy(&sc->sc_mtx);
701 arswitch_miiforport(struct arswitch_softc *sc, int port)
705 if (phy < 0 || phy >= sc->numphys)
707 return (device_get_softc(sc->miibus[phy]));
711 arswitch_ifpforport(struct arswitch_softc *sc, int port)
715 if (phy < 0 || phy >= sc->numphys)
717 return (sc->ifp[phy]);
764 arswitch_miipollstat(struct arswitch_softc *sc)
772 ARSWITCH_LOCK_ASSERT(sc, MA_OWNED);
774 for (i = 0; i < sc->numphys; i++) {
775 if (sc->miibus[i] == NULL)
777 mii = device_get_softc(sc->miibus[i]);
780 if (AR8X16_IS_SWITCH(sc, AR8327))
781 portstatus = arswitch_readreg(sc->sc_dev,
784 portstatus = arswitch_readreg(sc->sc_dev,
787 DPRINTF(sc, ARSWITCH_DBG_POLL, "p[%d]=0x%08x (%b)\n",
800 device_printf(sc->sc_dev, "%s: port %d: port -> UP\n",
810 device_printf(sc->sc_dev, "%s: port %d: port -> DOWN\n",
827 sc->hal.arswitch_atu_flush(sc);
833 struct arswitch_softc *sc = arg;
835 arswitch_miipollstat(sc);
836 callout_reset(&sc->callout_tick, hz, arswitch_tick, sc);
842 struct arswitch_softc *sc = device_get_softc(dev);
844 ARSWITCH_LOCK_ASSERT(sc, MA_NOTOWNED);
845 ARSWITCH_LOCK(sc);
851 struct arswitch_softc *sc = device_get_softc(dev);
853 ARSWITCH_LOCK_ASSERT(sc, MA_OWNED);
854 ARSWITCH_UNLOCK(sc);
860 struct arswitch_softc *sc = device_get_softc(dev);
862 return (&sc->info);
866 ar8xxx_port_vlan_get(struct arswitch_softc *sc, etherswitch_port_t *p)
870 ARSWITCH_LOCK(sc);
873 sc->hal.arswitch_vlan_get_pvid(sc, p->es_port, &p->es_pvid);
876 reg = arswitch_readreg(sc->sc_dev, AR8X16_REG_PORT_CTRL(p->es_port));
884 ARSWITCH_UNLOCK(sc);
890 arswitch_is_cpuport(struct arswitch_softc *sc, int port)
894 ((AR8X16_IS_SWITCH(sc, AR8327) &&
901 struct arswitch_softc *sc;
906 sc = device_get_softc(dev);
908 if (p->es_port < 0 || p->es_port > sc->info.es_nports)
911 err = sc->hal.arswitch_port_vlan_get(sc, p);
915 mii = arswitch_miiforport(sc, p->es_port);
916 if (arswitch_is_cpuport(sc, p->es_port)) {
935 if (!arswitch_is_cpuport(sc, p->es_port) &&
936 AR8X16_IS_SWITCH(sc, AR8327)) {
970 ar8xxx_port_vlan_setup(struct arswitch_softc *sc, etherswitch_port_t *p)
975 ARSWITCH_LOCK(sc);
979 sc->hal.arswitch_vlan_set_pvid(sc, p->es_port, p->es_pvid);
984 ARSWITCH_UNLOCK(sc);
998 err = arswitch_modifyreg(sc->sc_dev,
1003 ARSWITCH_UNLOCK(sc);
1011 struct arswitch_softc *sc;
1016 sc = device_get_softc(dev);
1017 if (p->es_port < 0 || p->es_port > sc->info.es_nports)
1021 if (sc->vlan_mode == ETHERSWITCH_VLAN_DOT1Q) {
1022 err = sc->hal.arswitch_port_vlan_setup(sc, p);
1028 if (arswitch_is_cpuport(sc, p->es_port))
1031 if (AR8X16_IS_SWITCH(sc, AR8327))
1036 err = arswitch_setled(sc, p->es_port-1, i, p->es_led[i]);
1042 mii = arswitch_miiforport(sc, p->es_port);
1046 ifp = arswitch_ifpforport(sc, p->es_port);
1053 arswitch_setled(struct arswitch_softc *sc, int phy, int led, int style)
1058 if (phy < 0 || phy > sc->numphys)
1064 ARSWITCH_LOCK(sc);
1067 err = (arswitch_modifyreg(sc->sc_dev,
1070 ARSWITCH_UNLOCK(sc);
1078 struct arswitch_softc *sc = device_get_softc(dev);
1080 DPRINTF(sc, ARSWITCH_DBG_POLL, "%s\n", __func__);
1086 struct arswitch_softc *sc = if_getsoftc(ifp);
1087 struct mii_data *mii = arswitch_miiforport(sc, if_getdunit(ifp));
1098 struct arswitch_softc *sc = if_getsoftc(ifp);
1099 struct mii_data *mii = arswitch_miiforport(sc, if_getdunit(ifp));
1101 DPRINTF(sc, ARSWITCH_DBG_POLL, "%s\n", __func__);
1113 struct arswitch_softc *sc;
1116 sc = device_get_softc(dev);
1120 conf->vlan_mode = sc->vlan_mode;
1123 ret = sc->hal.arswitch_hw_get_switch_macaddr(sc,
1135 struct arswitch_softc *sc;
1138 sc = device_get_softc(dev);
1142 err = arswitch_set_vlan_mode(sc, conf->vlan_mode);
1155 struct arswitch_softc *sc;
1158 sc = device_get_softc(dev);
1159 ARSWITCH_LOCK(sc);
1160 err = sc->hal.arswitch_atu_flush(sc);
1162 sc->atu.count = 0;
1163 ARSWITCH_UNLOCK(sc);
1170 struct arswitch_softc *sc;
1173 sc = device_get_softc(dev);
1174 ARSWITCH_LOCK(sc);
1175 err = sc->hal.arswitch_atu_flush_port(sc, port);
1177 sc->atu.count = 0;
1178 ARSWITCH_UNLOCK(sc);
1185 struct arswitch_softc *sc;
1188 sc = device_get_softc(dev);
1190 ARSWITCH_LOCK(sc);
1193 err = sc->hal.arswitch_atu_fetch_table(sc, NULL, 0);
1196 while (err == 0 && nitems < sc->atu.size) {
1197 err = sc->hal.arswitch_atu_fetch_table(sc,
1198 &sc->atu.entries[nitems], 1);
1200 sc->atu.entries[nitems].id = nitems;
1204 sc->atu.count = nitems;
1205 ARSWITCH_UNLOCK(sc);
1215 struct arswitch_softc *sc;
1218 sc = device_get_softc(dev);
1221 ARSWITCH_LOCK(sc);
1222 if (id > sc->atu.count) {
1223 ARSWITCH_UNLOCK(sc);
1227 memcpy(e, &sc->atu.entries[id], sizeof(*e));
1228 ARSWITCH_UNLOCK(sc);
1235 struct arswitch_softc *sc = device_get_softc(dev);
1237 return (sc->hal.arswitch_vlan_getvgroup(sc, e));
1243 struct arswitch_softc *sc = device_get_softc(dev);
1245 return (sc->hal.arswitch_vlan_setvgroup(sc, e));
1251 struct arswitch_softc *sc = device_get_softc(dev);
1253 return (sc->hal.arswitch_phy_read(dev, phy, reg));
1259 struct arswitch_softc *sc = device_get_softc(dev);
1261 return (sc->hal.arswitch_phy_write(dev, phy, reg, val));