net: dsa: Initialize ds->enabled_port_mask and ds->phys_mii_mask
authorFlorian Fainelli <f.fainelli@gmail.com>
Tue, 7 Jun 2016 23:32:39 +0000 (16:32 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 8 Jun 2016 18:23:41 +0000 (11:23 -0700)
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>
net/dsa/dsa2.c

index 80dfe08db8250c82abba4ef17850300a8ab9399a..921a36fd139da46e1a0600d8a7acd56326f79cf4 100644 (file)
@@ -283,6 +283,7 @@ static void dsa_user_port_unapply(struct device_node *port, u32 index,
        if (ds->ports[index].netdev) {
                dsa_slave_destroy(ds->ports[index].netdev);
                ds->ports[index].netdev = NULL;
+               ds->enabled_port_mask &= ~(1 << index);
        }
 }
 
@@ -292,6 +293,13 @@ static int dsa_ds_apply(struct dsa_switch_tree *dst, struct dsa_switch *ds)
        u32 index;
        int err;
 
+       /* Initialize ds->phys_mii_mask before registering the slave MDIO bus
+        * driver and before drv->setup() has run, since the switch drivers and
+        * the slave MDIO bus driver rely on these values for probing PHY
+        * devices or not
+        */
+       ds->phys_mii_mask = ds->enabled_port_mask;
+
        err = ds->drv->setup(ds);
        if (err < 0)
                return err;
@@ -511,6 +519,13 @@ static int dsa_parse_ports_dn(struct device_node *ports, struct dsa_switch *ds)
                        return -EINVAL;
 
                ds->ports[reg].dn = port;
+
+               /* Initialize enabled_port_mask now for drv->setup()
+                * to have access to a correct value, just like what
+                * net/dsa/dsa.c::dsa_switch_setup_one does.
+                */
+               if (!dsa_port_is_cpu(port))
+                       ds->enabled_port_mask |= 1 << reg;
        }
 
        return 0;