|
@@ -554,6 +554,31 @@ static int dsa_of_setup_routing_table(struct dsa_platform_data *pd,
|
|
|
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;
|
|
@@ -573,7 +598,7 @@ static void dsa_of_free_platform_data(struct dsa_platform_data *pd)
|
|
|
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;
|
|
@@ -668,15 +693,10 @@ static int dsa_of_probe(struct device *dev)
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
}
|