OSDN Git Service

net: dsa: setup a tree when adding a switch to it
authorVivien Didelot <vivien.didelot@savoirfairelinux.com>
Mon, 6 Nov 2017 21:11:52 +0000 (16:11 -0500)
committerDavid S. Miller <davem@davemloft.net>
Thu, 9 Nov 2017 00:26:49 +0000 (09:26 +0900)
Now that the tree setup is centralized, we can simplify the code a bit
more by setting up or tearing down the tree directly when adding or
removing a switch to/from it.

Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/dsa/dsa2.c

index 44d26b5..3db50e6 100644 (file)
@@ -489,6 +489,8 @@ static void dsa_tree_teardown(struct dsa_switch_tree *dst)
 static void dsa_tree_remove_switch(struct dsa_switch_tree *dst,
                                   unsigned int index)
 {
+       dsa_tree_teardown(dst);
+
        dst->ds[index] = NULL;
        dsa_tree_put(dst);
 }
@@ -497,6 +499,7 @@ static int dsa_tree_add_switch(struct dsa_switch_tree *dst,
                               struct dsa_switch *ds)
 {
        unsigned int index = ds->index;
+       int err;
 
        if (dst->ds[index])
                return -EBUSY;
@@ -504,7 +507,11 @@ static int dsa_tree_add_switch(struct dsa_switch_tree *dst,
        dsa_tree_get(dst);
        dst->ds[index] = ds;
 
-       return 0;
+       err = dsa_tree_setup(dst);
+       if (err)
+               dsa_tree_remove_switch(dst, index);
+
+       return err;
 }
 
 static int dsa_port_parse_user(struct dsa_port *dp, const char *name)
@@ -704,12 +711,17 @@ static int dsa_switch_parse(struct dsa_switch *ds, struct dsa_chip_data *cd)
        return dsa_switch_parse_ports(ds, cd);
 }
 
+static int dsa_switch_add(struct dsa_switch *ds)
+{
+       struct dsa_switch_tree *dst = ds->dst;
+
+       return dsa_tree_add_switch(dst, ds);
+}
+
 static int _dsa_register_switch(struct dsa_switch *ds)
 {
        struct dsa_chip_data *pdata = ds->dev->platform_data;
        struct device_node *np = ds->dev->of_node;
-       struct dsa_switch_tree *dst;
-       unsigned int index;
        int err;
 
        if (np)
@@ -722,20 +734,7 @@ static int _dsa_register_switch(struct dsa_switch *ds)
        if (err)
                return err;
 
-       index = ds->index;
-       dst = ds->dst;
-
-       err = dsa_tree_add_switch(dst, ds);
-       if (err)
-               return err;
-
-       err = dsa_tree_setup(dst);
-       if (err) {
-               dsa_tree_teardown(dst);
-               dsa_tree_remove_switch(dst, index);
-       }
-
-       return err;
+       return dsa_switch_add(ds);
 }
 
 struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n)
@@ -777,8 +776,6 @@ static void _dsa_unregister_switch(struct dsa_switch *ds)
        struct dsa_switch_tree *dst = ds->dst;
        unsigned int index = ds->index;
 
-       dsa_tree_teardown(dst);
-
        dsa_tree_remove_switch(dst, index);
 }