]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - net/dsa/dsa.c
net: dsa: Copy the routing table into the switch structure
[mirror_ubuntu-zesty-kernel.git] / net / dsa / dsa.c
index eff5dfc2e33fc6c8c5cc50b6f3d6901219c95757..bfe1d03d4730546e8c96bc196acfb9164397e05c 100644 (file)
@@ -182,7 +182,6 @@ __ATTRIBUTE_GROUPS(dsa_hwmon);
 /* basic switch operations **************************************************/
 static int dsa_cpu_dsa_setup(struct dsa_switch *ds, struct net_device *master)
 {
-       struct dsa_chip_data *cd = ds->cd;
        struct device_node *port_dn;
        struct phy_device *phydev;
        int ret, port, mode;
@@ -191,7 +190,7 @@ static int dsa_cpu_dsa_setup(struct dsa_switch *ds, struct net_device *master)
                if (!(dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)))
                        continue;
 
-               port_dn = cd->port_dn[port];
+               port_dn = ds->ports[port].dn;
                if (of_phy_is_fixed_link(port_dn)) {
                        ret = of_phy_register_fixed_link(port_dn);
                        if (ret) {
@@ -298,6 +297,8 @@ static int dsa_switch_setup_one(struct dsa_switch *ds, struct device *parent)
                dst->tag_protocol = drv->tag_protocol;
        }
 
+       memcpy(ds->rtable, cd->rtable, sizeof(ds->rtable));
+
        /*
         * Do basic register setup.
         */
@@ -325,6 +326,8 @@ static int dsa_switch_setup_one(struct dsa_switch *ds, struct device *parent)
         * Create network devices for physical switch ports.
         */
        for (i = 0; i < DSA_MAX_PORTS; i++) {
+               ds->ports[i].dn = cd->port_dn[i];
+
                if (!(ds->enabled_port_mask & (1 << i)))
                        continue;
 
@@ -424,7 +427,6 @@ static void dsa_switch_destroy(struct dsa_switch *ds)
 {
        struct device_node *port_dn;
        struct phy_device *phydev;
-       struct dsa_chip_data *cd = ds->cd;
        int port;
 
 #ifdef CONFIG_NET_DSA_HWMON
@@ -437,15 +439,15 @@ static void dsa_switch_destroy(struct dsa_switch *ds)
                if (!(ds->enabled_port_mask & (1 << port)))
                        continue;
 
-               if (!ds->ports[port])
+               if (!ds->ports[port].netdev)
                        continue;
 
-               dsa_slave_destroy(ds->ports[port]);
+               dsa_slave_destroy(ds->ports[port].netdev);
        }
 
        /* Remove any fixed link PHYs */
        for (port = 0; port < DSA_MAX_PORTS; port++) {
-               port_dn = cd->port_dn[port];
+               port_dn = ds->ports[port].dn;
                if (of_phy_is_fixed_link(port_dn)) {
                        phydev = of_phy_find_device(port_dn);
                        if (phydev) {
@@ -469,7 +471,7 @@ static int dsa_switch_suspend(struct dsa_switch *ds)
                if (!dsa_is_port_initialized(ds, i))
                        continue;
 
-               ret = dsa_slave_suspend(ds->ports[i]);
+               ret = dsa_slave_suspend(ds->ports[i].netdev);
                if (ret)
                        return ret;
        }
@@ -495,7 +497,7 @@ static int dsa_switch_resume(struct dsa_switch *ds)
                if (!dsa_is_port_initialized(ds, i))
                        continue;
 
-               ret = dsa_slave_resume(ds->ports[i]);
+               ret = dsa_slave_resume(ds->ports[i].netdev);
                if (ret)
                        return ret;
        }
@@ -587,17 +589,6 @@ static int dsa_of_setup_routing_table(struct dsa_platform_data *pd,
        if (link_sw_addr >= pd->nr_chips)
                return -EINVAL;
 
-       /* First time routing table allocation */
-       if (!cd->rtable) {
-               cd->rtable = kmalloc_array(pd->nr_chips, sizeof(s8),
-                                          GFP_KERNEL);
-               if (!cd->rtable)
-                       return -ENOMEM;
-
-               /* default to no valid uplink/downlink */
-               memset(cd->rtable, -1, pd->nr_chips * sizeof(s8));
-       }
-
        cd->rtable[link_sw_addr] = port_index;
 
        return 0;
@@ -639,7 +630,6 @@ static void dsa_of_free_platform_data(struct dsa_platform_data *pd)
                        kfree(pd->chip[i].port_names[port_index]);
                        port_index++;
                }
-               kfree(pd->chip[i].rtable);
 
                /* Drop our reference to the MDIO bus device */
                if (pd->chip[i].host_dev)