aboutsummaryrefslogtreecommitdiffstats
path: root/net/dsa/slave.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2016-12-03 11:46:54 -0500
committerDavid S. Miller <davem@davemloft.net>2016-12-03 12:29:53 -0500
commit2745529ac7358fdac72e6b388da2e934bd9da82c (patch)
tree245bb05b1a18189c5a5212db914c70a636d8267a /net/dsa/slave.c
parentab17cb1fea82b346bdecd4f2d7f0e84e80f847af (diff)
parent8dc0f265d39a3933f4c1f846c7c694f12a2ab88a (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Couple conflicts resolved here: 1) In the MACB driver, a bug fix to properly initialize the RX tail pointer properly overlapped with some changes to support variable sized rings. 2) In XGBE we had a "CONFIG_PM" --> "CONFIG_PM_SLEEP" fix overlapping with a reorganization of the driver to support ACPI, OF, as well as PCI variants of the chip. 3) In 'net' we had several probe error path bug fixes to the stmmac driver, meanwhile a lot of this code was cleaned up and reorganized in 'net-next'. 4) The cls_flower classifier obtained a helper function in 'net-next' called __fl_delete() and this overlapped with Daniel Borkamann's bug fix to use RCU for object destruction in 'net'. It also overlapped with Jiri's change to guard the rhashtable_remove_fast() call with a check against tc_skip_sw(). 5) In mlx4, a revert bug fix in 'net' overlapped with some unrelated changes in 'net-next'. 6) In geneve, a stale header pointer after pskb_expand_head() bug fix in 'net' overlapped with a large reorganization of the same code in 'net-next'. Since the 'net-next' code no longer had the bug in question, there was nothing to do other than to simply take the 'net-next' hunks. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dsa/slave.c')
-rw-r--r--net/dsa/slave.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index d0c7bce88743..68c9eea00518 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -1127,7 +1127,7 @@ static int dsa_slave_phy_setup(struct dsa_slave_priv *p,
1127 p->phy_interface = mode; 1127 p->phy_interface = mode;
1128 1128
1129 phy_dn = of_parse_phandle(port_dn, "phy-handle", 0); 1129 phy_dn = of_parse_phandle(port_dn, "phy-handle", 0);
1130 if (of_phy_is_fixed_link(port_dn)) { 1130 if (!phy_dn && of_phy_is_fixed_link(port_dn)) {
1131 /* In the case of a fixed PHY, the DT node associated 1131 /* In the case of a fixed PHY, the DT node associated
1132 * to the fixed PHY is the Port DT node 1132 * to the fixed PHY is the Port DT node
1133 */ 1133 */
@@ -1137,7 +1137,7 @@ static int dsa_slave_phy_setup(struct dsa_slave_priv *p,
1137 return ret; 1137 return ret;
1138 } 1138 }
1139 phy_is_fixed = true; 1139 phy_is_fixed = true;
1140 phy_dn = port_dn; 1140 phy_dn = of_node_get(port_dn);
1141 } 1141 }
1142 1142
1143 if (ds->ops->get_phy_flags) 1143 if (ds->ops->get_phy_flags)
@@ -1156,6 +1156,7 @@ static int dsa_slave_phy_setup(struct dsa_slave_priv *p,
1156 ret = dsa_slave_phy_connect(p, slave_dev, phy_id); 1156 ret = dsa_slave_phy_connect(p, slave_dev, phy_id);
1157 if (ret) { 1157 if (ret) {
1158 netdev_err(slave_dev, "failed to connect to phy%d: %d\n", phy_id, ret); 1158 netdev_err(slave_dev, "failed to connect to phy%d: %d\n", phy_id, ret);
1159 of_node_put(phy_dn);
1159 return ret; 1160 return ret;
1160 } 1161 }
1161 } else { 1162 } else {
@@ -1164,6 +1165,8 @@ static int dsa_slave_phy_setup(struct dsa_slave_priv *p,
1164 phy_flags, 1165 phy_flags,
1165 p->phy_interface); 1166 p->phy_interface);
1166 } 1167 }
1168
1169 of_node_put(phy_dn);
1167 } 1170 }
1168 1171
1169 if (p->phy && phy_is_fixed) 1172 if (p->phy && phy_is_fixed)
@@ -1176,6 +1179,8 @@ static int dsa_slave_phy_setup(struct dsa_slave_priv *p,
1176 ret = dsa_slave_phy_connect(p, slave_dev, p->port); 1179 ret = dsa_slave_phy_connect(p, slave_dev, p->port);
1177 if (ret) { 1180 if (ret) {
1178 netdev_err(slave_dev, "failed to connect to port %d: %d\n", p->port, ret); 1181 netdev_err(slave_dev, "failed to connect to port %d: %d\n", p->port, ret);
1182 if (phy_is_fixed)
1183 of_phy_deregister_fixed_link(port_dn);
1179 return ret; 1184 return ret;
1180 } 1185 }
1181 } 1186 }
@@ -1293,10 +1298,18 @@ int dsa_slave_create(struct dsa_switch *ds, struct device *parent,
1293void dsa_slave_destroy(struct net_device *slave_dev) 1298void dsa_slave_destroy(struct net_device *slave_dev)
1294{ 1299{
1295 struct dsa_slave_priv *p = netdev_priv(slave_dev); 1300 struct dsa_slave_priv *p = netdev_priv(slave_dev);
1301 struct dsa_switch *ds = p->parent;
1302 struct device_node *port_dn;
1303
1304 port_dn = ds->ports[p->port].dn;
1296 1305
1297 netif_carrier_off(slave_dev); 1306 netif_carrier_off(slave_dev);
1298 if (p->phy) 1307 if (p->phy) {
1299 phy_disconnect(p->phy); 1308 phy_disconnect(p->phy);
1309
1310 if (of_phy_is_fixed_link(port_dn))
1311 of_phy_deregister_fixed_link(port_dn);
1312 }
1300 unregister_netdev(slave_dev); 1313 unregister_netdev(slave_dev);
1301 free_netdev(slave_dev); 1314 free_netdev(slave_dev);
1302} 1315}