diff options
author | Johan Hovold <johan@kernel.org> | 2016-11-28 13:25:02 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-11-29 23:17:02 -0500 |
commit | 42c70042458d74ce049ce4a2ea7702f344a0dc0b (patch) | |
tree | 59579e9868bd551bf83556a13824d51314e27c82 | |
parent | b9755f03728b21c36375a47a6c6366e00b4f2062 (diff) |
net: ethernet: gianfar: 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.
Fixes: be40364544bd ("gianfar: 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/freescale/gianfar.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c index 4b4f5bc0e279..9061c2f82b9c 100644 --- a/drivers/net/ethernet/freescale/gianfar.c +++ b/drivers/net/ethernet/freescale/gianfar.c | |||
@@ -1312,6 +1312,7 @@ static void gfar_init_addr_hash_table(struct gfar_private *priv) | |||
1312 | */ | 1312 | */ |
1313 | static int gfar_probe(struct platform_device *ofdev) | 1313 | static int gfar_probe(struct platform_device *ofdev) |
1314 | { | 1314 | { |
1315 | struct device_node *np = ofdev->dev.of_node; | ||
1315 | struct net_device *dev = NULL; | 1316 | struct net_device *dev = NULL; |
1316 | struct gfar_private *priv = NULL; | 1317 | struct gfar_private *priv = NULL; |
1317 | int err = 0, i; | 1318 | int err = 0, i; |
@@ -1462,6 +1463,8 @@ static int gfar_probe(struct platform_device *ofdev) | |||
1462 | return 0; | 1463 | return 0; |
1463 | 1464 | ||
1464 | register_fail: | 1465 | register_fail: |
1466 | if (of_phy_is_fixed_link(np)) | ||
1467 | of_phy_deregister_fixed_link(np); | ||
1465 | unmap_group_regs(priv); | 1468 | unmap_group_regs(priv); |
1466 | gfar_free_rx_queues(priv); | 1469 | gfar_free_rx_queues(priv); |
1467 | gfar_free_tx_queues(priv); | 1470 | gfar_free_tx_queues(priv); |
@@ -1474,11 +1477,16 @@ register_fail: | |||
1474 | static int gfar_remove(struct platform_device *ofdev) | 1477 | static int gfar_remove(struct platform_device *ofdev) |
1475 | { | 1478 | { |
1476 | struct gfar_private *priv = platform_get_drvdata(ofdev); | 1479 | struct gfar_private *priv = platform_get_drvdata(ofdev); |
1480 | struct device_node *np = ofdev->dev.of_node; | ||
1477 | 1481 | ||
1478 | of_node_put(priv->phy_node); | 1482 | of_node_put(priv->phy_node); |
1479 | of_node_put(priv->tbi_node); | 1483 | of_node_put(priv->tbi_node); |
1480 | 1484 | ||
1481 | unregister_netdev(priv->ndev); | 1485 | unregister_netdev(priv->ndev); |
1486 | |||
1487 | if (of_phy_is_fixed_link(np)) | ||
1488 | of_phy_deregister_fixed_link(np); | ||
1489 | |||
1482 | unmap_group_regs(priv); | 1490 | unmap_group_regs(priv); |
1483 | gfar_free_rx_queues(priv); | 1491 | gfar_free_rx_queues(priv); |
1484 | gfar_free_tx_queues(priv); | 1492 | gfar_free_tx_queues(priv); |