net: ethernet: ti: davinci_emac: fix fixed-link phydev and of-node leaks
Make sure to deregister and free any fixed-link PHY registered using
of_phy_register_fixed_link() on probe errors and on driver unbind.
Also remember to put the of-node reference on probe errors.
Fixes: 1bb6aa56bb
("net: davinci_emac: Add support for fixed-link
PHY")
Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c41a47678d
commit
14cab6f651
|
@ -1767,6 +1767,7 @@ static int davinci_emac_try_get_mac(struct platform_device *pdev,
|
|||
*/
|
||||
static int davinci_emac_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
int rc = 0;
|
||||
struct resource *res, *res_ctrl;
|
||||
struct net_device *ndev;
|
||||
|
@ -1805,7 +1806,7 @@ static int davinci_emac_probe(struct platform_device *pdev)
|
|||
if (!pdata) {
|
||||
dev_err(&pdev->dev, "no platform data\n");
|
||||
rc = -ENODEV;
|
||||
goto no_pdata;
|
||||
goto err_free_netdev;
|
||||
}
|
||||
|
||||
/* MAC addr and PHY mask , RMII enable info from platform_data */
|
||||
|
@ -1941,6 +1942,10 @@ static int davinci_emac_probe(struct platform_device *pdev)
|
|||
cpdma_chan_destroy(priv->rxchan);
|
||||
cpdma_ctlr_destroy(priv->dma);
|
||||
no_pdata:
|
||||
if (of_phy_is_fixed_link(np))
|
||||
of_phy_deregister_fixed_link(np);
|
||||
of_node_put(priv->phy_node);
|
||||
err_free_netdev:
|
||||
free_netdev(ndev);
|
||||
return rc;
|
||||
}
|
||||
|
@ -1956,6 +1961,7 @@ static int davinci_emac_remove(struct platform_device *pdev)
|
|||
{
|
||||
struct net_device *ndev = platform_get_drvdata(pdev);
|
||||
struct emac_priv *priv = netdev_priv(ndev);
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
|
||||
dev_notice(&ndev->dev, "DaVinci EMAC: davinci_emac_remove()\n");
|
||||
|
||||
|
@ -1968,6 +1974,8 @@ static int davinci_emac_remove(struct platform_device *pdev)
|
|||
unregister_netdev(ndev);
|
||||
of_node_put(priv->phy_node);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
if (of_phy_is_fixed_link(np))
|
||||
of_phy_deregister_fixed_link(np);
|
||||
free_netdev(ndev);
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue