diff options
author | Johan Hovold <johan@kernel.org> | 2016-11-28 13:24:59 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-11-29 23:17:02 -0500 |
commit | 140ca9d3471c424ab4c4036ab8d8d995f24a9c5b (patch) | |
tree | 68a467c7cce871c24aa07d068898341812e520d0 | |
parent | 39f8b0d426e0b3e04ddf4c6ef0ae28873c0f8c0f (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.c | 6 |
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) | |||
627 | int bcmgenet_mii_init(struct net_device *dev) | 627 | int 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 | ||
642 | out: | 643 | out: |
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: | |||
649 | void bcmgenet_mii_exit(struct net_device *dev) | 652 | void 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); |