aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJohan Hovold <johan@kernel.org>2016-11-28 13:25:09 -0500
committerDavid S. Miller <davem@davemloft.net>2016-11-29 23:17:02 -0500
commit881eadabe71fa78c081eda3cd5701768f3778a21 (patch)
treed7a3fd6644f2f711212b7e7cc7cabb113747128b /net
parent14cab6f6510c498c2fd55d4fd6063a91b477d2ff (diff)
net: dsa: slave: fix fixed-link phydev leaks
Make sure to deregister and free any fixed-link PHY registered using of_phy_register_fixed_link() on slave-setup errors and on slave destroy. Fixes: 0d8bcdd383b8 ("net: dsa: allow for more complex PHY setups") Signed-off-by: Johan Hovold <johan@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/dsa/slave.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 2a5c20a13fe4..30e2e21d7619 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -1177,6 +1177,8 @@ static int dsa_slave_phy_setup(struct dsa_slave_priv *p,
1177 ret = dsa_slave_phy_connect(p, slave_dev, p->port); 1177 ret = dsa_slave_phy_connect(p, slave_dev, p->port);
1178 if (ret) { 1178 if (ret) {
1179 netdev_err(slave_dev, "failed to connect to port %d: %d\n", p->port, ret); 1179 netdev_err(slave_dev, "failed to connect to port %d: %d\n", p->port, ret);
1180 if (phy_is_fixed)
1181 of_phy_deregister_fixed_link(port_dn);
1180 return ret; 1182 return ret;
1181 } 1183 }
1182 } 1184 }
@@ -1292,10 +1294,18 @@ int dsa_slave_create(struct dsa_switch *ds, struct device *parent,
1292void dsa_slave_destroy(struct net_device *slave_dev) 1294void dsa_slave_destroy(struct net_device *slave_dev)
1293{ 1295{
1294 struct dsa_slave_priv *p = netdev_priv(slave_dev); 1296 struct dsa_slave_priv *p = netdev_priv(slave_dev);
1297 struct dsa_switch *ds = p->parent;
1298 struct device_node *port_dn;
1299
1300 port_dn = ds->ports[p->port].dn;
1295 1301
1296 netif_carrier_off(slave_dev); 1302 netif_carrier_off(slave_dev);
1297 if (p->phy) 1303 if (p->phy) {
1298 phy_disconnect(p->phy); 1304 phy_disconnect(p->phy);
1305
1306 if (of_phy_is_fixed_link(port_dn))
1307 of_phy_deregister_fixed_link(port_dn);
1308 }
1299 unregister_netdev(slave_dev); 1309 unregister_netdev(slave_dev);
1300 free_netdev(slave_dev); 1310 free_netdev(slave_dev);
1301} 1311}