drivers: net: cpsw: increment reference count on fixed-link PHY node
authorDavid Rivshin <drivshin@allworx.com>
Thu, 17 Dec 2015 04:02:11 +0000 (23:02 -0500)
committerDavid S. Miller <davem@davemloft.net>
Fri, 18 Dec 2015 19:46:06 +0000 (14:46 -0500)
When a fixed-link sub-node exists in a slave node, the slave node
is also the PHY node. Since this is a separate use of the slave node,
of_node_get() should be used to increment the reference count.

Fixes: 1f71e8c96fc6 ("drivers: net: cpsw: Add support for fixed-link PHY")
Signed-off-by: David Rivshin <drivshin@allworx.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ti/cpsw.c

index bc6d20dc28a0787aa75ff75405204077a095a823..3b489caea096d3efee632dd41e4681674851161e 100644 (file)
@@ -2036,16 +2036,21 @@ static int cpsw_probe_dt(struct cpsw_priv *priv,
                priv->phy_node = of_parse_phandle(slave_node, "phy-handle", 0);
                parp = of_get_property(slave_node, "phy_id", &lenp);
                if (of_phy_is_fixed_link(slave_node)) {
-                       struct phy_device *pd;
+                       struct device_node *phy_node;
+                       struct phy_device *phy_dev;
 
+                       /* In the case of a fixed PHY, the DT node associated
+                        * to the PHY is the Ethernet MAC DT node.
+                        */
                        ret = of_phy_register_fixed_link(slave_node);
                        if (ret)
                                return ret;
-                       pd = of_phy_find_device(slave_node);
-                       if (!pd)
+                       phy_node = of_node_get(slave_node);
+                       phy_dev = of_phy_find_device(phy_node);
+                       if (!phy_dev)
                                return -ENODEV;
                        snprintf(slave_data->phy_id, sizeof(slave_data->phy_id),
-                                PHY_ID_FMT, pd->bus->id, pd->addr);
+                                PHY_ID_FMT, phy_dev->bus->id, phy_dev->addr);
                } else if (parp) {
                        u32 phyid;
                        struct device_node *mdio_node;