net: dsa: microchip: really look for phy-mode in port nodes
authorHelmut Grohne <helmut.grohne@intenta.de>
Thu, 24 Sep 2020 08:37:47 +0000 (10:37 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 25 Sep 2020 03:08:48 +0000 (20:08 -0700)
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 <helmut.grohne@intenta.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/microchip/ksz_common.c

index 8e755b50c9c1b3732c374c5b6709716942cc4518..c796d42730baea5f4f2ee34efcf33d19c08bf5ca 100644 (file)
@@ -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");
        }