net: dsa: split dsa_switch_setup into two functions
authorFlorian Fainelli <f.fainelli@gmail.com>
Thu, 5 Mar 2015 20:35:06 +0000 (12:35 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 6 Mar 2015 05:18:20 +0000 (00:18 -0500)
Split the part of dsa_switch_setup() which is responsible for allocating
and initializing a 'struct dsa_switch' and the part which is doing a
given switch device setup and slave network device creation.

This is a preliminary change to allow a separate caller of
dsa_switch_setup_one() which may have externally initialized the
dsa_switch structure, outside of dsa_switch_setup().

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/dsa/dsa.c

index 79879d01488afea8640ea8739d02915d9ca9a1bc..6f02ccc57593fe76adb12b985fcfdb6f7423e0c4 100644 (file)
@@ -175,43 +175,14 @@ __ATTRIBUTE_GROUPS(dsa_hwmon);
 #endif /* CONFIG_NET_DSA_HWMON */
 
 /* basic switch operations **************************************************/
-static struct dsa_switch *
-dsa_switch_setup(struct dsa_switch_tree *dst, int index,
-                struct device *parent, struct device *host_dev)
+static int dsa_switch_setup_one(struct dsa_switch *ds, struct device *parent)
 {
-       struct dsa_chip_data *pd = dst->pd->chip + index;
-       struct dsa_switch_driver *drv;
-       struct dsa_switch *ds;
-       int ret;
-       char *name;
-       int i;
+       struct dsa_switch_driver *drv = ds->drv;
+       struct dsa_switch_tree *dst = ds->dst;
+       struct dsa_chip_data *pd = ds->pd;
        bool valid_name_found = false;
-
-       /*
-        * Probe for switch model.
-        */
-       drv = dsa_switch_probe(host_dev, pd->sw_addr, &name);
-       if (drv == NULL) {
-               netdev_err(dst->master_netdev, "[%d]: could not detect attached switch\n",
-                          index);
-               return ERR_PTR(-EINVAL);
-       }
-       netdev_info(dst->master_netdev, "[%d]: detected a %s switch\n",
-                   index, name);
-
-
-       /*
-        * Allocate and initialise switch state.
-        */
-       ds = kzalloc(sizeof(*ds) + drv->priv_size, GFP_KERNEL);
-       if (ds == NULL)
-               return ERR_PTR(-ENOMEM);
-
-       ds->dst = dst;
-       ds->index = index;
-       ds->pd = dst->pd->chip + index;
-       ds->drv = drv;
-       ds->master_dev = host_dev;
+       int index = ds->index;
+       int i, ret;
 
        /*
         * Validate supplied switch configuration.
@@ -350,13 +321,56 @@ dsa_switch_setup(struct dsa_switch_tree *dst, int index,
        }
 #endif /* CONFIG_NET_DSA_HWMON */
 
-       return ds;
+       return ret;
 
 out_free:
        mdiobus_free(ds->slave_mii_bus);
 out:
        kfree(ds);
-       return ERR_PTR(ret);
+       return ret;
+}
+
+static struct dsa_switch *
+dsa_switch_setup(struct dsa_switch_tree *dst, int index,
+                struct device *parent, struct device *host_dev)
+{
+       struct dsa_chip_data *pd = dst->pd->chip + index;
+       struct dsa_switch_driver *drv;
+       struct dsa_switch *ds;
+       int ret;
+       char *name;
+
+       /*
+        * Probe for switch model.
+        */
+       drv = dsa_switch_probe(host_dev, pd->sw_addr, &name);
+       if (drv == NULL) {
+               netdev_err(dst->master_netdev, "[%d]: could not detect attached switch\n",
+                          index);
+               return ERR_PTR(-EINVAL);
+       }
+       netdev_info(dst->master_netdev, "[%d]: detected a %s switch\n",
+                   index, name);
+
+
+       /*
+        * Allocate and initialise switch state.
+        */
+       ds = kzalloc(sizeof(*ds) + drv->priv_size, GFP_KERNEL);
+       if (ds == NULL)
+               return NULL;
+
+       ds->dst = dst;
+       ds->index = index;
+       ds->pd = pd;
+       ds->drv = drv;
+       ds->master_dev = host_dev;
+
+       ret = dsa_switch_setup_one(ds, parent);
+       if (ret)
+               return NULL;
+
+       return ds;
 }
 
 static void dsa_switch_destroy(struct dsa_switch *ds)