net: gianfar: fix reference counting for phy_node
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Thu, 7 Aug 2014 20:17:07 +0000 (22:17 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 7 Aug 2014 23:02:58 +0000 (16:02 -0700)
The line before the changed if condition is:

priv->phy_node = of_parse_phandle(np, "phy-handle", 0);

. If this call succeeds priv->phy_node must not be overwritten in the if
block; otherwise the reference to the node returned by of_parse_phandle
is lost. So add a check that the if block isn't executed in this case.

Furthermore in the fixed phy case no reference is aquired for phy_node
resulting in an of_node_put without holding a reference. To fix that,
get a reference on the MAC dt node.

Fixes: be40364544bd ("gianfar: use the new fixed PHY helpers")
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/gianfar.c

index 6b0c477..fb29d04 100644 (file)
@@ -892,12 +892,12 @@ static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
        /* In the case of a fixed PHY, the DT node associated
         * to the PHY is the Ethernet MAC DT node.
         */
-       if (of_phy_is_fixed_link(np)) {
+       if (!priv->phy_node && of_phy_is_fixed_link(np)) {
                err = of_phy_register_fixed_link(np);
                if (err)
                        goto err_grp_init;
 
-               priv->phy_node = np;
+               priv->phy_node = of_node_get(np);
        }
 
        /* Find the TBI PHY.  If it's not there, we don't support SGMII */