diff options
Diffstat (limited to 'net/dsa/slave.c')
-rw-r--r-- | net/dsa/slave.c | 33 |
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 | ||
1215 | void 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 | |||
1215 | static bool dsa_slave_dev_check(struct net_device *dev) | 1226 | static 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; |