diff options
author | Florian Fainelli <f.fainelli@gmail.com> | 2016-06-07 19:32:39 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-06-08 14:23:41 -0400 |
commit | 6e830d8f0deca91fcb84d3156dcebb20384a9e2d (patch) | |
tree | f5bf1f8b55aa043b7649c3c5781eff767316866a /net/dsa | |
parent | 0b7b498d41709d68bb4f520051f68d64f752beee (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.c | 15 |
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; |