Browse Source

net: gianfar: correctly determine the number of queue groups

eTSEC of-nodes may have children which are not queue-group nodes. For
example new-style fixed-phy declarations. These where incorrectly
assumed to be additional queue-groups.

Change the search to filter out any nodes which are not queue-groups,
or have been disabled.

Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Tobias Waldekranz 10 năm trước cách đây
mục cha
commit
f50724cdfe

+ 17 - 2
drivers/net/ethernet/freescale/gianfar.c

@@ -747,6 +747,18 @@ static int gfar_parse_group(struct device_node *np,
 	return 0;
 	return 0;
 }
 }
 
 
+static int gfar_of_group_count(struct device_node *np)
+{
+	struct device_node *child;
+	int num = 0;
+
+	for_each_available_child_of_node(np, child)
+		if (!of_node_cmp(child->name, "queue-group"))
+			num++;
+
+	return num;
+}
+
 static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
 static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
 {
 {
 	const char *model;
 	const char *model;
@@ -784,7 +796,7 @@ static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
 		num_rx_qs = 1;
 		num_rx_qs = 1;
 	} else { /* MQ_MG_MODE */
 	} else { /* MQ_MG_MODE */
 		/* get the actual number of supported groups */
 		/* get the actual number of supported groups */
-		unsigned int num_grps = of_get_available_child_count(np);
+		unsigned int num_grps = gfar_of_group_count(np);
 
 
 		if (num_grps == 0 || num_grps > MAXGROUPS) {
 		if (num_grps == 0 || num_grps > MAXGROUPS) {
 			dev_err(&ofdev->dev, "Invalid # of int groups(%d)\n",
 			dev_err(&ofdev->dev, "Invalid # of int groups(%d)\n",
@@ -851,7 +863,10 @@ static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
 
 
 	/* Parse and initialize group specific information */
 	/* Parse and initialize group specific information */
 	if (priv->mode == MQ_MG_MODE) {
 	if (priv->mode == MQ_MG_MODE) {
-		for_each_child_of_node(np, child) {
+		for_each_available_child_of_node(np, child) {
+			if (of_node_cmp(child->name, "queue-group"))
+				continue;
+
 			err = gfar_parse_group(child, priv, model);
 			err = gfar_parse_group(child, priv, model);
 			if (err)
 			if (err)
 				goto err_grp_init;
 				goto err_grp_init;