described below.
 
 Optionnal property:
-- link                 : Should be a phandle to another switch's DSA port.
+- link                 : Should be a list of phandles to another switch's DSA port.
                          This property is only used when switches are being
-                         chained/cascaded together.
+                         chained/cascaded together. This port is used as outgoing port
+                         towards the phandle port, which can be more than one hop away.
 
 - phy-handle           : Phandle to a PHY on an external MDIO bus, not the
                          switch internal one. See
                                label = "cpu";
                        };
 
-                       switch0uplink: port@6 {
+                       switch0port6: port@6 {
                                reg = <6>;
                                label = "dsa";
-                               link = <&switch1uplink>;
+                               link = <&switch1port0
+                                       &switch2port0>;
                        };
                };
 
                        reg = <17 1>;   /* MDIO address 17, switch 1 in tree */
                        mii-bus = <&mii_bus1>;
 
-                       switch1uplink: port@0 {
+                       switch1port0: port@0 {
                                reg = <0>;
                                label = "dsa";
-                               link = <&switch0uplink>;
+                               link = <&switch0port6>;
+                       };
+                       switch1port1: port@1 {
+                               reg = <1>;
+                               label = "dsa";
+                               link = <&switch2port1>;
+                       };
+               };
+
+               switch@2 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <18 2>;   /* MDIO address 18, switch 2 in tree */
+                       mii-bus = <&mii_bus1>;
+
+                       switch2port0: port@0 {
+                               reg = <0>;
+                               label = "dsa";
+                               link = <&switch1port1
+                                       &switch0port6>;
                        };
                };
        };
 
        return 0;
 }
 
+static int dsa_of_probe_links(struct dsa_platform_data *pd,
+                             struct dsa_chip_data *cd,
+                             int chip_index, int port_index,
+                             struct device_node *port,
+                             const char *port_name)
+{
+       struct device_node *link;
+       int link_index;
+       int ret;
+
+       for (link_index = 0;; link_index++) {
+               link = of_parse_phandle(port, "link", link_index);
+               if (!link)
+                       break;
+
+               if (!strcmp(port_name, "dsa") && pd->nr_chips > 1) {
+                       ret = dsa_of_setup_routing_table(pd, cd, chip_index,
+                                                        port_index, link);
+                       if (ret)
+                               return ret;
+               }
+       }
+       return 0;
+}
+
 static void dsa_of_free_platform_data(struct dsa_platform_data *pd)
 {
        int i;
 static int dsa_of_probe(struct device *dev)
 {
        struct device_node *np = dev->of_node;
-       struct device_node *child, *mdio, *ethernet, *port, *link;
+       struct device_node *child, *mdio, *ethernet, *port;
        struct mii_bus *mdio_bus, *mdio_bus_switch;
        struct net_device *ethernet_dev;
        struct dsa_platform_data *pd;
                                goto out_free_chip;
                        }
 
-                       link = of_parse_phandle(port, "link", 0);
-
-                       if (!strcmp(port_name, "dsa") && link &&
-                                       pd->nr_chips > 1) {
-                               ret = dsa_of_setup_routing_table(pd, cd,
-                                               chip_index, port_index, link);
-                               if (ret)
-                                       goto out_free_chip;
-                       }
+                       ret = dsa_of_probe_links(pd, cd, chip_index,
+                                                port_index, port, port_name);
+                       if (ret)
+                               goto out_free_chip;
 
                }
        }