aboutsummaryrefslogtreecommitdiffstats
path: root/net/dsa
diff options
context:
space:
mode:
authorVivien Didelot <vivien.didelot@savoirfairelinux.com>2016-07-06 20:03:54 -0400
committerDavid S. Miller <davem@davemloft.net>2016-07-08 23:59:49 -0400
commitd390238c4fba7c87a3bcd859ce3373c864eb7b02 (patch)
treebd365573098b83c1addb653306cb0a49db7dab00 /net/dsa
parent86dfb4acb378cb3a4eede3db919604c583beaa7c (diff)
net: dsa: initialize the routing table
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>
Diffstat (limited to 'net/dsa')
-rw-r--r--net/dsa/dsa.c6
-rw-r--r--net/dsa/dsa2.c7
2 files changed, 12 insertions, 1 deletions
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c
index 766d2a525ada..7e68bc6bc853 100644
--- a/net/dsa/dsa.c
+++ b/net/dsa/dsa.c
@@ -774,11 +774,17 @@ static int dsa_of_probe(struct device *dev)
774 774
775 chip_index = -1; 775 chip_index = -1;
776 for_each_available_child_of_node(np, child) { 776 for_each_available_child_of_node(np, child) {
777 int i;
778
777 chip_index++; 779 chip_index++;
778 cd = &pd->chip[chip_index]; 780 cd = &pd->chip[chip_index];
779 781
780 cd->of_node = child; 782 cd->of_node = child;
781 783
784 /* Initialize the routing table */
785 for (i = 0; i < DSA_MAX_SWITCHES; ++i)
786 cd->rtable[i] = DSA_RTABLE_NONE;
787
782 /* When assigning the host device, increment its refcount */ 788 /* When assigning the host device, increment its refcount */
783 cd->host_dev = get_device(&mdio_bus->dev); 789 cd->host_dev = get_device(&mdio_bus->dev);
784 790
diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c
index 83b95fc4cede..78e4c0131c30 100644
--- a/net/dsa/dsa2.c
+++ b/net/dsa/dsa2.c
@@ -595,7 +595,7 @@ static int _dsa_register_switch(struct dsa_switch *ds, struct device_node *np)
595 struct device_node *ports = dsa_get_ports(ds, np); 595 struct device_node *ports = dsa_get_ports(ds, np);
596 struct dsa_switch_tree *dst; 596 struct dsa_switch_tree *dst;
597 u32 tree, index; 597 u32 tree, index;
598 int err; 598 int i, err;
599 599
600 err = dsa_parse_member(np, &tree, &index); 600 err = dsa_parse_member(np, &tree, &index);
601 if (err) 601 if (err)
@@ -622,6 +622,11 @@ static int _dsa_register_switch(struct dsa_switch *ds, struct device_node *np)
622 622
623 ds->dst = dst; 623 ds->dst = dst;
624 ds->index = index; 624 ds->index = index;
625
626 /* Initialize the routing table */
627 for (i = 0; i < DSA_MAX_SWITCHES; ++i)
628 ds->rtable[i] = DSA_RTABLE_NONE;
629
625 dsa_dst_add_ds(dst, ds, index); 630 dsa_dst_add_ds(dst, ds, index);
626 631
627 err = dsa_dst_complete(dst); 632 err = dsa_dst_complete(dst);