net: dsa: initialize the routing table
authorVivien Didelot <vivien.didelot@savoirfairelinux.com>
Thu, 7 Jul 2016 00:03:54 +0000 (20:03 -0400)
committerDavid S. Miller <davem@davemloft.net>
Sat, 9 Jul 2016 03:59:49 +0000 (23:59 -0400)
The routing table of every switch in a tree is currently initialized to
all zeros. This is an issue since 0 is a valid port number.

Add a DSA_RTABLE_NONE=-1 constant to initialize the signed values of the
routing table pointing to other switches.

This fixes the device mapping of the mv88e6xxx driver where the port
pointing to the switch itself and to non-existent switches was wrongly
configured to be 0. It is now set to the expected 0xf value.

Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/dsa.h
net/dsa/dsa.c
net/dsa/dsa2.c

index 20b3087ad1933d2c731876387224bc509c8c6d47..52ab18bc2b0d8eb097c77b90651549eb12edba48 100644 (file)
@@ -32,6 +32,8 @@ enum dsa_tag_protocol {
 #define DSA_MAX_SWITCHES       4
 #define DSA_MAX_PORTS          12
 
+#define DSA_RTABLE_NONE                -1
+
 struct dsa_chip_data {
        /*
         * How to access the switch configuration registers.
index 766d2a525ada4dd35ec53736afc9fe5aea4502e4..7e68bc6bc8537e793e7b41a9753ef75d8a5112d2 100644 (file)
@@ -774,11 +774,17 @@ static int dsa_of_probe(struct device *dev)
 
        chip_index = -1;
        for_each_available_child_of_node(np, child) {
+               int i;
+
                chip_index++;
                cd = &pd->chip[chip_index];
 
                cd->of_node = child;
 
+               /* Initialize the routing table */
+               for (i = 0; i < DSA_MAX_SWITCHES; ++i)
+                       cd->rtable[i] = DSA_RTABLE_NONE;
+
                /* When assigning the host device, increment its refcount */
                cd->host_dev = get_device(&mdio_bus->dev);
 
index 83b95fc4cede30d088a7ba795ad57629706c1876..78e4c0131c3085dfe2edcff322fc7b115fa83595 100644 (file)
@@ -595,7 +595,7 @@ static int _dsa_register_switch(struct dsa_switch *ds, struct device_node *np)
        struct device_node *ports = dsa_get_ports(ds, np);
        struct dsa_switch_tree *dst;
        u32 tree, index;
-       int err;
+       int i, err;
 
        err = dsa_parse_member(np, &tree, &index);
        if (err)
@@ -622,6 +622,11 @@ static int _dsa_register_switch(struct dsa_switch *ds, struct device_node *np)
 
        ds->dst = dst;
        ds->index = index;
+
+       /* Initialize the routing table */
+       for (i = 0; i < DSA_MAX_SWITCHES; ++i)
+               ds->rtable[i] = DSA_RTABLE_NONE;
+
        dsa_dst_add_ds(dst, ds, index);
 
        err = dsa_dst_complete(dst);