aboutsummaryrefslogtreecommitdiffstats
path: root/net/dsa
diff options
context:
space:
mode:
authorFlorian Fainelli <f.fainelli@gmail.com>2016-06-07 19:32:39 -0400
committerDavid S. Miller <davem@davemloft.net>2016-06-08 14:23:41 -0400
commit6e830d8f0deca91fcb84d3156dcebb20384a9e2d (patch)
treef5bf1f8b55aa043b7649c3c5781eff767316866a /net/dsa
parent0b7b498d41709d68bb4f520051f68d64f752beee (diff)
net: dsa: Initialize ds->enabled_port_mask and ds->phys_mii_mask
Some drivers rely on these two bitmasks to contain the correct values for them to successfully probe and initialize at drv->setup() time, calculate correct values to put in both masks as early as possible in dsa_get_ports_dn(). Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dsa')
-rw-r--r--net/dsa/dsa2.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c
index 80dfe08db825..921a36fd139d 100644
--- a/net/dsa/dsa2.c
+++ b/net/dsa/dsa2.c
@@ -283,6 +283,7 @@ static void dsa_user_port_unapply(struct device_node *port, u32 index,
283 if (ds->ports[index].netdev) { 283 if (ds->ports[index].netdev) {
284 dsa_slave_destroy(ds->ports[index].netdev); 284 dsa_slave_destroy(ds->ports[index].netdev);
285 ds->ports[index].netdev = NULL; 285 ds->ports[index].netdev = NULL;
286 ds->enabled_port_mask &= ~(1 << index);
286 } 287 }
287} 288}
288 289
@@ -292,6 +293,13 @@ static int dsa_ds_apply(struct dsa_switch_tree *dst, struct dsa_switch *ds)
292 u32 index; 293 u32 index;
293 int err; 294 int err;
294 295
296 /* Initialize ds->phys_mii_mask before registering the slave MDIO bus
297 * driver and before drv->setup() has run, since the switch drivers and
298 * the slave MDIO bus driver rely on these values for probing PHY
299 * devices or not
300 */
301 ds->phys_mii_mask = ds->enabled_port_mask;
302
295 err = ds->drv->setup(ds); 303 err = ds->drv->setup(ds);
296 if (err < 0) 304 if (err < 0)
297 return err; 305 return err;
@@ -511,6 +519,13 @@ static int dsa_parse_ports_dn(struct device_node *ports, struct dsa_switch *ds)
511 return -EINVAL; 519 return -EINVAL;
512 520
513 ds->ports[reg].dn = port; 521 ds->ports[reg].dn = port;
522
523 /* Initialize enabled_port_mask now for drv->setup()
524 * to have access to a correct value, just like what
525 * net/dsa/dsa.c::dsa_switch_setup_one does.
526 */
527 if (!dsa_port_is_cpu(port))
528 ds->enabled_port_mask |= 1 << reg;
514 } 529 }
515 530
516 return 0; 531 return 0;