summaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
diff options
context:
space:
mode:
authorJohan Hovold2016-11-30 15:29:55 +0100
committerDavid S. Miller2016-12-02 16:42:47 +0100
commitd2ed0a7755fe14c790f398ae55088d00492ef168 (patch)
tree38bf52c2e8c80c7ff2b09ebf6943734a9d01336e /drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
parentnet: ethernet: stmmac: platform: fix outdated function header (diff)
downloadkernel-qcow2-linux-d2ed0a7755fe14c790f398ae55088d00492ef168.tar.gz
kernel-qcow2-linux-d2ed0a7755fe14c790f398ae55088d00492ef168.tar.xz
kernel-qcow2-linux-d2ed0a7755fe14c790f398ae55088d00492ef168.zip
net: ethernet: stmmac: fix of-node and fixed-link-phydev leaks
Make sure to deregister and free any fixed-link phy registered during probe on probe errors and on driver unbind by adding a new glue helper function. Drop the of-node reference taken in the same path also on late probe errors (and not just on driver unbind) by moving the put from stmmac_dvr_remove() to the new helper. Fixes: 277323814e49 ("stmmac: add fixed-link device-tree support") Fixes: 4613b279bee7 ("ethernet: stmicro: stmmac: add missing of_node_put after calling of_parse_phandle") Signed-off-by: Johan Hovold <johan@kernel.org> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c')
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
index 05e46a82cdb1..e6e6c2fcc4b7 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
@@ -50,7 +50,7 @@ static int dwmac_generic_probe(struct platform_device *pdev)
if (plat_dat->init) {
ret = plat_dat->init(pdev, plat_dat->bsp_priv);
if (ret)
- return ret;
+ goto err_remove_config_dt;
}
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
@@ -62,6 +62,9 @@ static int dwmac_generic_probe(struct platform_device *pdev)
err_exit:
if (plat_dat->exit)
plat_dat->exit(pdev, plat_dat->bsp_priv);
+err_remove_config_dt:
+ if (pdev->dev.of_node)
+ stmmac_remove_config_dt(pdev, plat_dat);
return ret;
}