The previous implementation failed to account for the "ports" node. The
actual port nodes are not child nodes of the switch node, but a "ports"
node sits in between.

Fixes: edecfa98f602 ("net: dsa: microchip: look for phy-mode in port nodes")
Signed-off-by: Helmut Grohne <[email protected]>
---
 drivers/net/dsa/microchip/ksz_common.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

I am very sorry that I need to send a fixup. It turned out that my
testing methodology was flawed. When I reintegrated Linus' master
branch, I noticed that it didn't work. It turned out that our hardware
now correctly implements hardware reset. As a consequence, the correct
setting of the phy-mode now became essential to operating the device.

I'm also looking forward to see "net: dsa: microchip: Improve phy mode
message" (from net-next) being merged. That would have helped me spot
this earlier.

Helmut

diff --git a/drivers/net/dsa/microchip/ksz_common.c 
b/drivers/net/dsa/microchip/ksz_common.c
index 8e755b50c9c1..c796d42730ba 100644
--- a/drivers/net/dsa/microchip/ksz_common.c
+++ b/drivers/net/dsa/microchip/ksz_common.c
@@ -387,8 +387,8 @@ EXPORT_SYMBOL(ksz_switch_alloc);
 int ksz_switch_register(struct ksz_device *dev,
                        const struct ksz_dev_ops *ops)
 {
+       struct device_node *port, *ports;
        phy_interface_t interface;
-       struct device_node *port;
        unsigned int port_num;
        int ret;
 
@@ -429,13 +429,17 @@ int ksz_switch_register(struct ksz_device *dev,
                ret = of_get_phy_mode(dev->dev->of_node, &interface);
                if (ret == 0)
                        dev->compat_interface = interface;
-               for_each_available_child_of_node(dev->dev->of_node, port) {
-                       if (of_property_read_u32(port, "reg", &port_num))
-                               continue;
-                       if (port_num >= dev->port_cnt)
-                               return -EINVAL;
-                       of_get_phy_mode(port, &dev->ports[port_num].interface);
-               }
+               ports = of_get_child_by_name(dev->dev->of_node, "ports");
+               if (ports)
+                       for_each_available_child_of_node(ports, port) {
+                               if (of_property_read_u32(port, "reg",
+                                                        &port_num))
+                                       continue;
+                               if (port_num >= dev->port_cnt)
+                                       return -EINVAL;
+                               of_get_phy_mode(port,
+                                               
&dev->ports[port_num].interface);
+                       }
                dev->synclko_125 = of_property_read_bool(dev->dev->of_node,
                                                         
"microchip,synclko-125");
        }
-- 
2.20.1

Reply via email to