Lines Matching +full:ipq4019 +full:- +full:mdio
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
53 #include <dev/mdio/mdio.h>
79 { "qcom,ess-switch", 1 },
90 if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
103 callout_reset(&sc->sc_phy_callout, hz, ar40xx_tick, sc);
119 return MDIO_READREG(sc->sc_mdio_dev, phy, reg);
127 return MDIO_WRITEREG(sc->sc_mdio_dev, phy, reg, val);
141 memset(&sc->sc_vlan, 0, sizeof(sc->sc_vlan));
145 sc->sc_vlan.vlan_id[i] = 0;
151 sc->sc_monitor.mirror_tx = false;
152 sc->sc_monitor.mirror_rx = false;
153 sc->sc_monitor.source_port = 0;
154 sc->sc_monitor.monitor_port = 0;
173 if (error || !req->newptr)
182 device_printf(sc->sc_dev, "port %d: PORT_STATUS=0x%08x\n", val,
184 device_printf(sc->sc_dev, "port %d: PORT_HEADER=0x%08x\n", val,
186 device_printf(sc->sc_dev, "port %d: PORT_VLAN0=0x%08x\n", val,
188 device_printf(sc->sc_dev, "port %d: PORT_VLAN1=0x%08x\n", val,
190 device_printf(sc->sc_dev, "port %d: PORT_LOOKUP=0x%08x\n", val,
192 device_printf(sc->sc_dev, "port %d: PORT_HOL_CTRL1=0x%08x\n", val,
194 device_printf(sc->sc_dev, "port %d: PORT_FLOWCTRL_THRESH=0x%08x\n",
213 if (error || !req->newptr)
235 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->sc_dev);
236 struct sysctl_oid *tree = device_get_sysctl_tree(sc->sc_dev);
239 "debug", CTLFLAG_RW, &sc->sc_debug, 0,
259 device_printf(sc->sc_dev, "%s: called\n", __func__);
265 callout_drain(&sc->sc_phy_callout);
269 if (sc->sc_phys.ifp[i] != NULL)
270 if_free(sc->sc_phys.ifp[i]);
271 free(sc->sc_phys.ifname[i], M_DEVBUF);
274 mtx_destroy(&sc->sc_mtx);
286 sc->sc_dev = dev;
287 mtx_init(&sc->sc_mtx, "ar40xx_switch", NULL, MTX_DEF);
289 psgmii_p = OF_finddevice("/soc/ess-psgmii");
290 if (psgmii_p == -1) {
292 "%s: couldn't find /soc/ess-psgmii DT node\n",
298 * Get the ipq4019-mdio node here, to talk to our local PHYs
302 mdio_p = ofw_bus_find_compatible(root_p, "qcom,ipq4019-mdio");
303 if (mdio_p == -1) {
304 device_printf(dev, "%s: couldn't find ipq4019-mdio DT node\n",
308 sc->sc_mdio_phandle = mdio_p;
309 sc->sc_mdio_dev = OF_device_from_xref(OF_xref_from_node(mdio_p));
310 if (sc->sc_mdio_dev == NULL) {
312 "%s: couldn't get mdio device (mdio_p=%u)\n",
318 ret = OF_decode_addr(psgmii_p, 0, &sc->sc_psgmii_mem_tag,
319 &sc->sc_psgmii_mem_handle,
320 &sc->sc_psgmii_mem_size);
328 sc->sc_ess_mem_rid = 0;
329 sc->sc_ess_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
330 &sc->sc_ess_mem_rid, RF_ACTIVE);
331 if (sc->sc_ess_mem_res == NULL) {
336 sc->sc_ess_mem_size = (size_t) bus_get_resource_count(dev,
337 SYS_RES_MEMORY, sc->sc_ess_mem_rid);
338 if (sc->sc_ess_mem_size == 0) {
345 &sc->sc_config.switch_mac_mode,
346 sizeof(sc->sc_config.switch_mac_mode));
354 &sc->sc_config.switch_cpu_bmp,
355 sizeof(sc->sc_config.switch_cpu_bmp));
363 &sc->sc_config.switch_lan_bmp,
364 sizeof(sc->sc_config.switch_lan_bmp));
372 &sc->sc_config.switch_wan_bmp,
373 sizeof(sc->sc_config.switch_wan_bmp));
380 ret = clk_get_by_ofw_name(dev, 0, "ess_clk", &sc->sc_ess_clk);
386 ret = clk_enable(sc->sc_ess_clk);
393 ret = hwreset_get_by_ofw_name(dev, 0, "ess_rst", &sc->sc_ess_rst);
410 device_printf(sc->sc_dev,
416 * ESS reset - this resets both the ethernet switch
421 device_printf(sc->sc_dev,
434 device_printf(sc->sc_dev,
441 * Do PSGMII PHY self-test; work-around issues.
445 device_printf(sc->sc_dev,
446 "ERROR: failed to do PSGMII self-test (%d)\n", ret);
453 device_printf(sc->sc_dev,
460 sc->sc_config.switch_mac_mode);
491 callout_init_mtx(&sc->sc_phy_callout, &sc->sc_mtx, 0);
496 strlcpy(sc->sc_info.es_name, device_get_desc(dev),
497 sizeof(sc->sc_info.es_name));
498 sc->sc_info.es_nports = AR40XX_NUM_PORTS;
499 sc->sc_info.es_vlan_caps = ETHERSWITCH_VLAN_DOT1Q;
500 /* XXX TODO: double-tag / 802.1ad */
501 sc->sc_info.es_nvlangroups = AR40XX_NUM_VTU_ENTRIES;
542 return (&sc->sc_info);
550 if (addr >= sc->sc_ess_mem_size - 1)
551 return (-1);
563 if (addr >= sc->sc_ess_mem_size - 1)
564 return (-1);
582 if (p->es_port < 0 || p->es_port > sc->sc_info.es_nports)
588 ar40xx_hw_get_port_pvid(sc, p->es_port, &p->es_pvid);
596 mii = ar40xx_phy_miiforport(sc, p->es_port);
600 if (p->es_port == 0) {
602 p->es_flags |= ETHERSWITCH_PORT_CPU;
603 ifmr = &p->es_ifmr;
604 ifmr->ifm_count = 0;
605 ifmr->ifm_current = ifmr->ifm_active =
607 ifmr->ifm_mask = 0;
608 ifmr->ifm_status = IFM_ACTIVE | IFM_AVALID;
610 /* non-CPU port */
611 err = ifmedia_ioctl(mii->mii_ifp, &p->es_ifr,
612 &mii->mii_media, SIOCGIFMEDIA);
634 if (p->es_port < 0 || p->es_port > sc->sc_info.es_nports)
639 ret = ar40xx_hw_set_port_pvid(sc, p->es_port, p->es_pvid);
644 /* XXX TODO: tag strip/unstrip, double-tag, etc */
648 if (p->es_port == 0)
651 mii = ar40xx_phy_miiforport(sc, p->es_port);
655 ifp = ar40xx_phy_ifpforport(sc, p->es_port);
657 ifm = &mii->mii_media;
658 return (ifmedia_ioctl(ifp, &p->es_ifr, ifm, SIOCSIFMEDIA));
664 * Get the current VLAN group (per-port, ISL, dot1q) configuration.
674 if (vg->es_vlangroup > sc->sc_info.es_nvlangroups)
677 vg->es_untagged_ports = 0;
678 vg->es_member_ports = 0;
679 vg->es_fid = 0;
684 if (sc->sc_vlan.vlan != 1) {
685 vg->es_member_ports = 0;
686 vg->es_untagged_ports = 0;
688 return (-1);
692 vid = sc->sc_vlan.vlan_id[vg->es_vlangroup];
698 vg->es_vid = vid;
700 ret = ar40xx_hw_vtu_get_vlan(sc, vid, &vg->es_member_ports,
701 &vg->es_untagged_ports);
706 vg->es_vid |= ETHERSWITCH_VID_VALID;
713 * Set the current VLAN group (per-port, ISL, dot1q) configuration.
724 if (sc->sc_vlan.vlan == 0)
728 vid = sc->sc_vlan.vlan_id[vg->es_vlangroup];
736 (vg->es_vid & ETHERSWITCH_VID_MASK))) {
747 vid = vg->es_vid & ETHERSWITCH_VID_MASK;
748 sc->sc_vlan.vlan_id[vg->es_vlangroup] = vid;
755 sc->sc_vlan.vlan_id[vg->es_vlangroup] = vid | ETHERSWITCH_VID_VALID;
758 err = ar40xx_hw_vtu_load_vlan(sc, vid, vg->es_member_ports,
759 vg->es_untagged_ports);
766 sc->sc_vlan.vlan_ports[vg->es_vlangroup] = vg->es_member_ports;
767 sc->sc_vlan.vlan_untagged[vg->es_vlangroup] = vg->es_untagged_ports;
786 conf->cmd = ETHERSWITCH_CONF_VLAN_MODE;
787 conf->vlan_mode = ETHERSWITCH_VLAN_DOT1Q;
790 ret = ar40xx_hw_read_switch_mac_address(sc, &conf->switch_macaddr);
792 conf->cmd |= ETHERSWITCH_CONF_SWITCH_MACADDR;
803 * allow it to be set to non-dot1q.
811 if (conf->cmd & ETHERSWITCH_CONF_VLAN_MODE) {
813 if (conf->vlan_mode != ETHERSWITCH_VLAN_DOT1Q)
817 if (conf->cmd & ETHERSWITCH_CONF_SWITCH_MACADDR) {
820 &conf->switch_macaddr);
867 memset(&sc->atu.entries, 0, sizeof(sc->atu.entries));
869 table->es_nitems = 0;
873 sc->atu.count = 0;
880 &sc->atu.entries[nitems], 1);
883 sc->atu.entries[nitems].id = nitems;
887 sc->atu.count = nitems;
888 table->es_nitems = nitems;
904 id = e->id;
906 if (id > sc->atu.count) {
910 memcpy(e, &sc->atu.entries[id], sizeof(*e));
930 /* MDIO interface */
963 DRIVER_MODULE(mdio, ar40xx, mdio_driver, 0, 0);
965 MODULE_DEPEND(ar40xx, mdio, 1, 1, 1);