aboutsummaryrefslogtreecommitdiffstats
path: root/net/dsa/slave.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/dsa/slave.c')
-rw-r--r--net/dsa/slave.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 7bc787b095c8..40b9ca72aae3 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -15,6 +15,7 @@
15#include <linux/phy_fixed.h> 15#include <linux/phy_fixed.h>
16#include <linux/of_net.h> 16#include <linux/of_net.h>
17#include <linux/of_mdio.h> 17#include <linux/of_mdio.h>
18#include <linux/mdio.h>
18#include <net/rtnetlink.h> 19#include <net/rtnetlink.h>
19#include <net/switchdev.h> 20#include <net/switchdev.h>
20#include <linux/if_bridge.h> 21#include <linux/if_bridge.h>
@@ -997,7 +998,7 @@ static int dsa_slave_phy_connect(struct dsa_slave_priv *p,
997{ 998{
998 struct dsa_switch *ds = p->parent; 999 struct dsa_switch *ds = p->parent;
999 1000
1000 p->phy = ds->slave_mii_bus->phy_map[addr]; 1001 p->phy = mdiobus_get_phy(ds->slave_mii_bus, addr);
1001 if (!p->phy) { 1002 if (!p->phy) {
1002 netdev_err(slave_dev, "no phy at %d\n", addr); 1003 netdev_err(slave_dev, "no phy at %d\n", addr);
1003 return -ENODEV; 1004 return -ENODEV;
@@ -1080,11 +1081,10 @@ static int dsa_slave_phy_setup(struct dsa_slave_priv *p,
1080 netdev_err(slave_dev, "failed to connect to port %d: %d\n", p->port, ret); 1081 netdev_err(slave_dev, "failed to connect to port %d: %d\n", p->port, ret);
1081 return ret; 1082 return ret;
1082 } 1083 }
1083 } else {
1084 netdev_info(slave_dev, "attached PHY at address %d [%s]\n",
1085 p->phy->addr, p->phy->drv->name);
1086 } 1084 }
1087 1085
1086 phy_attached_info(p->phy);
1087
1088 return 0; 1088 return 0;
1089} 1089}
1090 1090
@@ -1189,13 +1189,6 @@ int dsa_slave_create(struct dsa_switch *ds, struct device *parent,
1189 p->old_link = -1; 1189 p->old_link = -1;
1190 p->old_duplex = -1; 1190 p->old_duplex = -1;
1191 1191
1192 ret = dsa_slave_phy_setup(p, slave_dev);
1193 if (ret) {
1194 netdev_err(master, "error %d setting up slave phy\n", ret);
1195 free_netdev(slave_dev);
1196 return ret;
1197 }
1198
1199 ds->ports[port] = slave_dev; 1192 ds->ports[port] = slave_dev;
1200 ret = register_netdev(slave_dev); 1193 ret = register_netdev(slave_dev);
1201 if (ret) { 1194 if (ret) {
@@ -1209,9 +1202,27 @@ int dsa_slave_create(struct dsa_switch *ds, struct device *parent,
1209 1202
1210 netif_carrier_off(slave_dev); 1203 netif_carrier_off(slave_dev);
1211 1204
1205 ret = dsa_slave_phy_setup(p, slave_dev);
1206 if (ret) {
1207 netdev_err(master, "error %d setting up slave phy\n", ret);
1208 free_netdev(slave_dev);
1209 return ret;
1210 }
1211
1212 return 0; 1212 return 0;
1213} 1213}
1214 1214
1215void dsa_slave_destroy(struct net_device *slave_dev)
1216{
1217 struct dsa_slave_priv *p = netdev_priv(slave_dev);
1218
1219 netif_carrier_off(slave_dev);
1220 if (p->phy)
1221 phy_disconnect(p->phy);
1222 unregister_netdev(slave_dev);
1223 free_netdev(slave_dev);
1224}
1225
1215static bool dsa_slave_dev_check(struct net_device *dev) 1226static bool dsa_slave_dev_check(struct net_device *dev)
1216{ 1227{
1217 return dev->netdev_ops == &dsa_slave_netdev_ops; 1228 return dev->netdev_ops == &dsa_slave_netdev_ops;