diff options
author | Marcin Wojtas <mw@FreeBSD.org> | 2019-03-23 02:48:47 +0000 |
---|---|---|
committer | Marcin Wojtas <mw@FreeBSD.org> | 2019-03-23 02:48:47 +0000 |
commit | 0fd68d7298292d55e00375dff06077f1689d3f89 (patch) | |
tree | 26c23467a92eb2b738d141922a97c40556e5e84b /sys/dev/neta | |
parent | 55d3f888de48acdad3979651a73825ac11513010 (diff) | |
download | src-0fd68d7298292d55e00375dff06077f1689d3f89.tar.gz src-0fd68d7298292d55e00375dff06077f1689d3f89.zip |
Update mvneta/e6000sw for new DSA Device Tree Bindings
In the latest Linux kernel revisions the DSA (Distributed
Switch Architecture) device tree binding was changed.
Instead of the top level dsa@ node, the switch and its
ports is represented as a child node of the mdio bus.
With that other modifications were added, such as
relation with the ethernet port of the SoC. Adjust
e6000sw etherswitch and mvneta drivers to that.
Tested on Armada 3720 EspressoBin and Armada 388 Clearfog Pro boards.
Submitted by: Bert JW Regeer <xistence@0x58.com>
Reviewed by: manu
Differential Revision: https://reviews.freebsd.org/D19036
Notes
Notes:
svn path=/head/; revision=345432
Diffstat (limited to 'sys/dev/neta')
-rw-r--r-- | sys/dev/neta/if_mvneta.c | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/sys/dev/neta/if_mvneta.c b/sys/dev/neta/if_mvneta.c index 9b0b2384d74b..d6cdd7032445 100644 --- a/sys/dev/neta/if_mvneta.c +++ b/sys/dev/neta/if_mvneta.c @@ -189,6 +189,7 @@ STATIC void mvneta_clear_mib(struct mvneta_softc *); STATIC void mvneta_update_mib(struct mvneta_softc *); /* Switch */ +STATIC boolean_t mvneta_find_ethernet_prop_switch(phandle_t, phandle_t); STATIC boolean_t mvneta_has_switch(device_t); #define mvneta_sc_lock(sc) mtx_lock(&sc->mtx) @@ -412,23 +413,39 @@ mvneta_get_mac_address(struct mvneta_softc *sc, uint8_t *addr) } STATIC boolean_t -mvneta_has_switch(device_t self) +mvneta_find_ethernet_prop_switch(phandle_t ethernet, phandle_t node) { - phandle_t node, switch_node, switch_eth, switch_eth_handle; + boolean_t ret; + phandle_t child, switch_eth_handle, switch_eth; - node = ofw_bus_get_node(self); - switch_node = - ofw_bus_find_compatible(OF_finddevice("/"), "marvell,dsa"); - switch_eth = 0; + for (child = OF_child(node); child != 0; child = OF_peer(child)) { + if (OF_getencprop(child, "ethernet", (void*)&switch_eth_handle, + sizeof(switch_eth_handle)) > 0) { + if (switch_eth_handle > 0) { + switch_eth = OF_node_from_xref( + switch_eth_handle); - OF_getencprop(switch_node, "dsa,ethernet", - (void*)&switch_eth_handle, sizeof(switch_eth_handle)); + if (switch_eth == ethernet) + return (true); + } + } - if (switch_eth_handle > 0) - switch_eth = OF_node_from_xref(switch_eth_handle); + ret = mvneta_find_ethernet_prop_switch(ethernet, child); + if (ret != 0) + return (ret); + } + + return (false); +} + +STATIC boolean_t +mvneta_has_switch(device_t self) +{ + phandle_t node; + + node = ofw_bus_get_node(self); - /* Return true if dsa,ethernet cell points to us */ - return (node == switch_eth); + return mvneta_find_ethernet_prop_switch(node, OF_finddevice("/")); } STATIC int @@ -799,6 +816,8 @@ mvneta_attach(device_t self) if_link_state_change(sc->ifp, LINK_STATE_UP); if (mvneta_has_switch(self)) { + if (bootverbose) + device_printf(self, "This device is attached to a switch\n"); child = device_add_child(sc->dev, "mdio", -1); if (child == NULL) { ether_ifdetach(sc->ifp); |