Lines Matching +full:sdio +full:- +full:attached

1 /*-
4 * Copyright (c) 2011-2012 Stefan Bethke.
33 * This code suppose ADM6996FC SDC/SDIO connect to SOC network interface
107 mtx_lock(&(_sc)->sc_mtx)
109 mtx_unlock(&(_sc)->sc_mtx)
111 mtx_assert(&(_sc)->sc_mtx, (_what))
113 mtx_trylock(&(_sc)->sc_mtx)
169 snprintf(name, IFNAMSIZ, "%sport", device_get_nameunit(sc->sc_dev)); in adm6996fc_attach_phys()
170 for (phy = 0; phy < sc->numports; phy++) { in adm6996fc_attach_phys()
171 if (((1 << phy) & sc->phymask) == 0) in adm6996fc_attach_phys()
173 sc->ifpport[phy] = port; in adm6996fc_attach_phys()
174 sc->portphy[port] = phy; in adm6996fc_attach_phys()
175 sc->ifp[port] = if_alloc(IFT_ETHER); in adm6996fc_attach_phys()
176 if_setsoftc(sc->ifp[port], sc); in adm6996fc_attach_phys()
177 if_setflagbits(sc->ifp[port], IFF_UP | IFF_BROADCAST | in adm6996fc_attach_phys()
179 if_initname(sc->ifp[port], name, port); in adm6996fc_attach_phys()
180 sc->miibus[port] = malloc(sizeof(device_t), M_ADM6996FC, in adm6996fc_attach_phys()
182 err = mii_attach(sc->sc_dev, sc->miibus[port], sc->ifp[port], in adm6996fc_attach_phys()
185 DPRINTF(sc->sc_dev, "%s attached to pseudo interface %s\n", in adm6996fc_attach_phys()
186 device_get_nameunit(*sc->miibus[port]), in adm6996fc_attach_phys()
187 if_name(sc->ifp[port])); in adm6996fc_attach_phys()
189 device_printf(sc->sc_dev, in adm6996fc_attach_phys()
196 sc->info.es_nports = port; in adm6996fc_attach_phys()
197 if (sc->cpuport != -1) { in adm6996fc_attach_phys()
199 sc->ifpport[sc->cpuport] = port; in adm6996fc_attach_phys()
200 sc->portphy[port] = sc->cpuport; in adm6996fc_attach_phys()
201 ++sc->info.es_nports; in adm6996fc_attach_phys()
206 for (phy = 0; phy < sc->numports; phy++) { in adm6996fc_attach_phys()
207 if (((1 << phy) & sc->phymask) == 0) in adm6996fc_attach_phys()
210 if (sc->miibus[port] != NULL) in adm6996fc_attach_phys()
211 device_delete_child(sc->sc_dev, (*sc->miibus[port])); in adm6996fc_attach_phys()
212 if (sc->ifp[port] != NULL) in adm6996fc_attach_phys()
213 if_free(sc->ifp[port]); in adm6996fc_attach_phys()
214 if (sc->ifname[port] != NULL) in adm6996fc_attach_phys()
215 free(sc->ifname[port], M_ADM6996FC); in adm6996fc_attach_phys()
216 if (sc->miibus[port] != NULL) in adm6996fc_attach_phys()
217 free(sc->miibus[port], M_ADM6996FC); in adm6996fc_attach_phys()
231 sc->sc_dev = dev; in adm6996fc_attach()
232 mtx_init(&sc->sc_mtx, "adm6996fc", NULL, MTX_DEF); in adm6996fc_attach()
233 strlcpy(sc->info.es_name, device_get_desc(dev), in adm6996fc_attach()
234 sizeof(sc->info.es_name)); in adm6996fc_attach()
237 sc->numports = 6; in adm6996fc_attach()
238 sc->phymask = 0x1f; in adm6996fc_attach()
239 sc->cpuport = 5; in adm6996fc_attach()
240 sc->media = 100; in adm6996fc_attach()
242 sc->info.es_nvlangroups = 16; in adm6996fc_attach()
243 sc->info.es_vlan_caps = ETHERSWITCH_VLAN_PORT | ETHERSWITCH_VLAN_DOT1Q; in adm6996fc_attach()
245 sc->ifp = malloc(sizeof(if_t) * sc->numports, M_ADM6996FC, in adm6996fc_attach()
247 sc->ifname = malloc(sizeof(char *) * sc->numports, M_ADM6996FC, in adm6996fc_attach()
249 sc->miibus = malloc(sizeof(device_t *) * sc->numports, M_ADM6996FC, in adm6996fc_attach()
251 sc->portphy = malloc(sizeof(int) * sc->numports, M_ADM6996FC, in adm6996fc_attach()
265 callout_init(&sc->callout_tick, 0); in adm6996fc_attach()
272 free(sc->portphy, M_ADM6996FC); in adm6996fc_attach()
273 free(sc->miibus, M_ADM6996FC); in adm6996fc_attach()
274 free(sc->ifname, M_ADM6996FC); in adm6996fc_attach()
275 free(sc->ifp, M_ADM6996FC); in adm6996fc_attach()
292 callout_drain(&sc->callout_tick); in adm6996fc_detach()
295 if (((1 << i) & sc->phymask) == 0) in adm6996fc_detach()
298 if (sc->ifp[port] != NULL) in adm6996fc_detach()
299 if_free(sc->ifp[port]); in adm6996fc_detach()
300 free(sc->ifname[port], M_ADM6996FC); in adm6996fc_detach()
301 free(sc->miibus[port], M_ADM6996FC); in adm6996fc_detach()
304 free(sc->portphy, M_ADM6996FC); in adm6996fc_detach()
305 free(sc->miibus, M_ADM6996FC); in adm6996fc_detach()
306 free(sc->ifname, M_ADM6996FC); in adm6996fc_detach()
307 free(sc->ifp, M_ADM6996FC); in adm6996fc_detach()
309 mtx_destroy(&sc->sc_mtx); in adm6996fc_detach()
321 return (sc->ifpport[phy]); in adm6996fc_portforphy()
328 if (port < 0 || port > sc->numports) in adm6996fc_miiforport()
330 if (port == sc->cpuport) in adm6996fc_miiforport()
332 return (device_get_softc(*sc->miibus[port])); in adm6996fc_miiforport()
339 if (port < 0 || port > sc->numports) in adm6996fc_ifpforport()
341 return (sc->ifp[port]); in adm6996fc_ifpforport()
357 if (((1 << i) & sc->phymask) == 0) in adm6996fc_miipollstat()
360 if ((*sc->miibus[port]) == NULL) in adm6996fc_miipollstat()
362 mii = device_get_softc(*sc->miibus[port]); in adm6996fc_miipollstat()
363 LIST_FOREACH(miisc, &mii->mii_phys, mii_list) { in adm6996fc_miipollstat()
364 if (IFM_INST(mii->mii_media.ifm_cur->ifm_media) != in adm6996fc_miipollstat()
365 miisc->mii_inst) in adm6996fc_miipollstat()
381 callout_reset(&sc->callout_tick, hz, adm6996fc_tick, sc); in adm6996fc_tick()
413 return (&sc->info); in adm6996fc_getinfo()
430 ifmr = &p->es_ifmr; in adm6996fc_getport()
432 if (p->es_port < 0 || p->es_port >= sc->numports) in adm6996fc_getport()
437 if (sc->vlan_mode == ETHERSWITCH_VLAN_DOT1Q) { in adm6996fc_getport()
438 data1 = ADM6996FC_READREG(parent, bcaddr[p->es_port]); in adm6996fc_getport()
439 data2 = ADM6996FC_READREG(parent, vidaddr[p->es_port]); in adm6996fc_getport()
441 if (p->es_port == 4) in adm6996fc_getport()
446 p->es_pvid = ADM6996FC_PVIDBYDATA(data1, data2); in adm6996fc_getport()
448 p->es_flags |= ETHERSWITCH_PORT_ADDTAG; in adm6996fc_getport()
450 p->es_pvid = 0; in adm6996fc_getport()
453 phy = sc->portphy[p->es_port]; in adm6996fc_getport()
454 mii = adm6996fc_miiforport(sc, p->es_port); in adm6996fc_getport()
455 if (sc->cpuport != -1 && phy == sc->cpuport) { in adm6996fc_getport()
457 p->es_flags |= ETHERSWITCH_PORT_CPU; in adm6996fc_getport()
458 ifmr->ifm_count = 0; in adm6996fc_getport()
459 if (sc->media == 100) in adm6996fc_getport()
460 ifmr->ifm_current = ifmr->ifm_active = in adm6996fc_getport()
463 ifmr->ifm_current = ifmr->ifm_active = in adm6996fc_getport()
465 ifmr->ifm_mask = 0; in adm6996fc_getport()
466 ifmr->ifm_status = IFM_ACTIVE | IFM_AVALID; in adm6996fc_getport()
468 err = ifmedia_ioctl(mii->mii_ifp, &p->es_ifr, in adm6996fc_getport()
469 &mii->mii_media, SIOCGIFMEDIA); in adm6996fc_getport()
495 if (p->es_port < 0 || p->es_port >= sc->numports) in adm6996fc_setport()
498 if (sc->vlan_mode == ETHERSWITCH_VLAN_DOT1Q) { in adm6996fc_setport()
499 data = ADM6996FC_READREG(parent, bcaddr[p->es_port]); in adm6996fc_setport()
501 data |= (p->es_pvid & 0xf) << ADM6996FC_PVID_SHIFT; in adm6996fc_setport()
502 if (p->es_flags & ETHERSWITCH_PORT_ADDTAG) in adm6996fc_setport()
506 ADM6996FC_WRITEREG(parent, bcaddr[p->es_port], data); in adm6996fc_setport()
507 data = ADM6996FC_READREG(parent, vidaddr[p->es_port]); in adm6996fc_setport()
509 if (p->es_port == 4) { in adm6996fc_setport()
511 data = data | (((p->es_pvid >> 4) & 0xff) << 8); in adm6996fc_setport()
514 data = data | ((p->es_pvid >> 4) & 0xff); in adm6996fc_setport()
516 ADM6996FC_WRITEREG(parent, vidaddr[p->es_port], data); in adm6996fc_setport()
519 if (sc->portphy[p->es_port] == sc->cpuport) in adm6996fc_setport()
523 if (sc->portphy[p->es_port] != sc->cpuport) { in adm6996fc_setport()
524 mii = adm6996fc_miiforport(sc, p->es_port); in adm6996fc_setport()
528 ifp = adm6996fc_ifpforport(sc, p->es_port); in adm6996fc_setport()
530 ifm = &mii->mii_media; in adm6996fc_setport()
531 err = ifmedia_ioctl(ifp, &p->es_ifr, ifm, SIOCSIFMEDIA); in adm6996fc_setport()
546 if (sc->vlan_mode == ETHERSWITCH_VLAN_PORT) { in adm6996fc_getvgroup()
547 if (vg->es_vlangroup <= 5) { in adm6996fc_getvgroup()
548 vg->es_vid = ETHERSWITCH_VID_VALID; in adm6996fc_getvgroup()
549 vg->es_vid |= vg->es_vlangroup; in adm6996fc_getvgroup()
551 ADM6996FC_VF0L + 2 * vg->es_vlangroup); in adm6996fc_getvgroup()
553 ADM6996FC_VF0H + 2 * vg->es_vlangroup); in adm6996fc_getvgroup()
555 vg->es_member_ports = datalo & 0x3f; in adm6996fc_getvgroup()
556 vg->es_untagged_ports = vg->es_member_ports; in adm6996fc_getvgroup()
557 vg->es_fid = 0; in adm6996fc_getvgroup()
559 vg->es_vid = 0; in adm6996fc_getvgroup()
561 } else if (sc->vlan_mode == ETHERSWITCH_VLAN_DOT1Q) { in adm6996fc_getvgroup()
563 ADM6996FC_VF0L + 2 * vg->es_vlangroup); in adm6996fc_getvgroup()
565 ADM6996FC_VF0H + 2 * vg->es_vlangroup); in adm6996fc_getvgroup()
568 vg->es_vid = ETHERSWITCH_VID_VALID; in adm6996fc_getvgroup()
569 vg->es_vid |= datahi & 0xfff; in adm6996fc_getvgroup()
570 vg->es_member_ports = datalo & 0x3f; in adm6996fc_getvgroup()
571 vg->es_untagged_ports = (~datalo >> 6) & 0x3f; in adm6996fc_getvgroup()
572 vg->es_fid = 0; in adm6996fc_getvgroup()
574 vg->es_fid = 0; in adm6996fc_getvgroup()
577 vg->es_fid = 0; in adm6996fc_getvgroup()
592 if (sc->vlan_mode == ETHERSWITCH_VLAN_PORT) { in adm6996fc_setvgroup()
593 ADM6996FC_WRITEREG(parent, ADM6996FC_VF0L + 2 * vg->es_vlangroup, in adm6996fc_setvgroup()
594 vg->es_member_ports); in adm6996fc_setvgroup()
595 } else if (sc->vlan_mode == ETHERSWITCH_VLAN_DOT1Q) { in adm6996fc_setvgroup()
596 ADM6996FC_WRITEREG(parent, ADM6996FC_VF0L + 2 * vg->es_vlangroup, in adm6996fc_setvgroup()
597 vg->es_member_ports | ((~vg->es_untagged_ports & 0x3f)<< 6)); in adm6996fc_setvgroup()
598 ADM6996FC_WRITEREG(parent, ADM6996FC_VF0H + 2 * vg->es_vlangroup, in adm6996fc_setvgroup()
599 (1 << ADM6996FC_VV_SHIFT) | vg->es_vid); in adm6996fc_setvgroup()
613 conf->cmd = ETHERSWITCH_CONF_VLAN_MODE; in adm6996fc_getconf()
614 conf->vlan_mode = sc->vlan_mode; in adm6996fc_getconf()
631 if ((conf->cmd & ETHERSWITCH_CONF_VLAN_MODE) == 0) in adm6996fc_setconf()
634 if (conf->vlan_mode == ETHERSWITCH_VLAN_PORT) { in adm6996fc_setconf()
635 sc->vlan_mode = ETHERSWITCH_VLAN_PORT; in adm6996fc_setconf()
649 } else if (conf->vlan_mode == ETHERSWITCH_VLAN_DOT1Q) { in adm6996fc_setconf()
650 sc->vlan_mode = ETHERSWITCH_VLAN_DOT1Q; in adm6996fc_setconf()
671 sc->vlan_mode = 0; in adm6996fc_setconf()
709 DPRINTF(sc->sc_dev, "%s\n", __func__); in adm6996fc_ifmedia_upd()
725 DPRINTF(sc->sc_dev, "%s\n", __func__); in adm6996fc_ifmedia_sts()
730 ifmr->ifm_active = mii->mii_media_active; in adm6996fc_ifmedia_sts()
731 ifmr->ifm_status = mii->mii_media_status; in adm6996fc_ifmedia_sts()