Commit c891c24c authored by Uwe Kleine-König's avatar Uwe Kleine-König Committed by David S. Miller

net: mvneta: Fix reference counting for phy_node

If there is a "phy" handle the probe function returns with holding a
reference to that node. Make sure that in the fixed phy case there is
also held a reference to yield a consistant state.

Also add the corresponding of_node_put in the error path and the remove
function.

Fixes: 83895bed ("net: mvneta: add support for fixed links")
Fixes: c5aff182 ("net: mvneta: driver for Marvell Armada 370/XP network unit")
Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 888c88b8
...@@ -2969,14 +2969,14 @@ static int mvneta_probe(struct platform_device *pdev) ...@@ -2969,14 +2969,14 @@ static int mvneta_probe(struct platform_device *pdev)
/* In the case of a fixed PHY, the DT node associated /* In the case of a fixed PHY, the DT node associated
* to the PHY is the Ethernet MAC DT node. * to the PHY is the Ethernet MAC DT node.
*/ */
phy_node = dn; phy_node = of_node_get(dn);
} }
phy_mode = of_get_phy_mode(dn); phy_mode = of_get_phy_mode(dn);
if (phy_mode < 0) { if (phy_mode < 0) {
dev_err(&pdev->dev, "incorrect phy-mode\n"); dev_err(&pdev->dev, "incorrect phy-mode\n");
err = -EINVAL; err = -EINVAL;
goto err_free_irq; goto err_put_phy_node;
} }
dev->tx_queue_len = MVNETA_MAX_TXD; dev->tx_queue_len = MVNETA_MAX_TXD;
...@@ -2992,7 +2992,7 @@ static int mvneta_probe(struct platform_device *pdev) ...@@ -2992,7 +2992,7 @@ static int mvneta_probe(struct platform_device *pdev)
pp->clk = devm_clk_get(&pdev->dev, NULL); pp->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(pp->clk)) { if (IS_ERR(pp->clk)) {
err = PTR_ERR(pp->clk); err = PTR_ERR(pp->clk);
goto err_free_irq; goto err_put_phy_node;
} }
clk_prepare_enable(pp->clk); clk_prepare_enable(pp->clk);
...@@ -3071,6 +3071,8 @@ static int mvneta_probe(struct platform_device *pdev) ...@@ -3071,6 +3071,8 @@ static int mvneta_probe(struct platform_device *pdev)
free_percpu(pp->stats); free_percpu(pp->stats);
err_clk: err_clk:
clk_disable_unprepare(pp->clk); clk_disable_unprepare(pp->clk);
err_put_phy_node:
of_node_put(phy_node);
err_free_irq: err_free_irq:
irq_dispose_mapping(dev->irq); irq_dispose_mapping(dev->irq);
err_free_netdev: err_free_netdev:
...@@ -3088,6 +3090,7 @@ static int mvneta_remove(struct platform_device *pdev) ...@@ -3088,6 +3090,7 @@ static int mvneta_remove(struct platform_device *pdev)
clk_disable_unprepare(pp->clk); clk_disable_unprepare(pp->clk);
free_percpu(pp->stats); free_percpu(pp->stats);
irq_dispose_mapping(dev->irq); irq_dispose_mapping(dev->irq);
of_node_put(pp->phy_node);
free_netdev(dev); free_netdev(dev);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment