aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hovold <johan@kernel.org>2016-11-28 13:24:59 -0500
committerDavid S. Miller <davem@davemloft.net>2016-11-29 23:17:02 -0500
commit140ca9d3471c424ab4c4036ab8d8d995f24a9c5b (patch)
tree68a467c7cce871c24aa07d068898341812e520d0
parent39f8b0d426e0b3e04ddf4c6ef0ae28873c0f8c0f (diff)
net: ethernet: bcmgenet: fix fixed-link phydev 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. Note that we're still leaking any fixed-link PHY registered in the non-OF probe path. Fixes: 9abf0c2b717a ("net: bcmgenet: use the new fixed PHY helpers") Signed-off-by: Johan Hovold <johan@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmmii.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c
index 2e745bd51df4..e87607621e62 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
@@ -627,6 +627,7 @@ static int bcmgenet_mii_bus_init(struct bcmgenet_priv *priv)
627int bcmgenet_mii_init(struct net_device *dev) 627int bcmgenet_mii_init(struct net_device *dev)
628{ 628{
629 struct bcmgenet_priv *priv = netdev_priv(dev); 629 struct bcmgenet_priv *priv = netdev_priv(dev);
630 struct device_node *dn = priv->pdev->dev.of_node;
630 int ret; 631 int ret;
631 632
632 ret = bcmgenet_mii_alloc(priv); 633 ret = bcmgenet_mii_alloc(priv);
@@ -640,6 +641,8 @@ int bcmgenet_mii_init(struct net_device *dev)
640 return 0; 641 return 0;
641 642
642out: 643out:
644 if (of_phy_is_fixed_link(dn))
645 of_phy_deregister_fixed_link(dn);
643 of_node_put(priv->phy_dn); 646 of_node_put(priv->phy_dn);
644 mdiobus_unregister(priv->mii_bus); 647 mdiobus_unregister(priv->mii_bus);
645 mdiobus_free(priv->mii_bus); 648 mdiobus_free(priv->mii_bus);
@@ -649,7 +652,10 @@ out:
649void bcmgenet_mii_exit(struct net_device *dev) 652void bcmgenet_mii_exit(struct net_device *dev)
650{ 653{
651 struct bcmgenet_priv *priv = netdev_priv(dev); 654 struct bcmgenet_priv *priv = netdev_priv(dev);
655 struct device_node *dn = priv->pdev->dev.of_node;
652 656
657 if (of_phy_is_fixed_link(dn))
658 of_phy_deregister_fixed_link(dn);
653 of_node_put(priv->phy_dn); 659 of_node_put(priv->phy_dn);
654 mdiobus_unregister(priv->mii_bus); 660 mdiobus_unregister(priv->mii_bus);
655 mdiobus_free(priv->mii_bus); 661 mdiobus_free(priv->mii_bus);