Add kernel tag that introduced the patch on backport patch. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
		
			
				
	
	
		
			119 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 1e3f407f3cacc5dcfe27166c412ed9bc263d82bf Mon Sep 17 00:00:00 2001
 | 
						|
From: Vladimir Oltean <vladimir.oltean@nxp.com>
 | 
						|
Date: Thu, 6 Jan 2022 01:11:16 +0200
 | 
						|
Subject: [PATCH 5/6] net: dsa: first set up shared ports, then non-shared
 | 
						|
 ports
 | 
						|
 | 
						|
After commit a57d8c217aad ("net: dsa: flush switchdev workqueue before
 | 
						|
tearing down CPU/DSA ports"), the port setup and teardown procedure
 | 
						|
became asymmetric.
 | 
						|
 | 
						|
The fact of the matter is that user ports need the shared ports to be up
 | 
						|
before they can be used for CPU-initiated termination. And since we
 | 
						|
register net devices for the user ports, those won't be functional until
 | 
						|
we also call the setup for the shared (CPU, DSA) ports. But we may do
 | 
						|
that later, depending on the port numbering scheme of the hardware we
 | 
						|
are dealing with.
 | 
						|
 | 
						|
It just makes sense that all shared ports are brought up before any user
 | 
						|
port is. I can't pinpoint any issue due to the current behavior, but
 | 
						|
let's change it nonetheless, for consistency's sake.
 | 
						|
 | 
						|
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
 | 
						|
Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
						|
---
 | 
						|
 net/dsa/dsa2.c | 50 +++++++++++++++++++++++++++++++++++++-------------
 | 
						|
 1 file changed, 37 insertions(+), 13 deletions(-)
 | 
						|
 | 
						|
--- a/net/dsa/dsa2.c
 | 
						|
+++ b/net/dsa/dsa2.c
 | 
						|
@@ -999,23 +999,28 @@ static void dsa_tree_teardown_switches(s
 | 
						|
 		dsa_switch_teardown(dp->ds);
 | 
						|
 }
 | 
						|
 
 | 
						|
-static int dsa_tree_setup_switches(struct dsa_switch_tree *dst)
 | 
						|
+/* Bring shared ports up first, then non-shared ports */
 | 
						|
+static int dsa_tree_setup_ports(struct dsa_switch_tree *dst)
 | 
						|
 {
 | 
						|
 	struct dsa_port *dp;
 | 
						|
-	int err;
 | 
						|
+	int err = 0;
 | 
						|
 
 | 
						|
 	list_for_each_entry(dp, &dst->ports, list) {
 | 
						|
-		err = dsa_switch_setup(dp->ds);
 | 
						|
-		if (err)
 | 
						|
-			goto teardown;
 | 
						|
+		if (dsa_port_is_dsa(dp) || dsa_port_is_cpu(dp)) {
 | 
						|
+			err = dsa_port_setup(dp);
 | 
						|
+			if (err)
 | 
						|
+				goto teardown;
 | 
						|
+		}
 | 
						|
 	}
 | 
						|
 
 | 
						|
 	list_for_each_entry(dp, &dst->ports, list) {
 | 
						|
-		err = dsa_port_setup(dp);
 | 
						|
-		if (err) {
 | 
						|
-			err = dsa_port_reinit_as_unused(dp);
 | 
						|
-			if (err)
 | 
						|
-				goto teardown;
 | 
						|
+		if (dsa_port_is_user(dp) || dsa_port_is_unused(dp)) {
 | 
						|
+			err = dsa_port_setup(dp);
 | 
						|
+			if (err) {
 | 
						|
+				err = dsa_port_reinit_as_unused(dp);
 | 
						|
+				if (err)
 | 
						|
+					goto teardown;
 | 
						|
+			}
 | 
						|
 		}
 | 
						|
 	}
 | 
						|
 
 | 
						|
@@ -1024,7 +1029,21 @@ static int dsa_tree_setup_switches(struc
 | 
						|
 teardown:
 | 
						|
 	dsa_tree_teardown_ports(dst);
 | 
						|
 
 | 
						|
-	dsa_tree_teardown_switches(dst);
 | 
						|
+	return err;
 | 
						|
+}
 | 
						|
+
 | 
						|
+static int dsa_tree_setup_switches(struct dsa_switch_tree *dst)
 | 
						|
+{
 | 
						|
+	struct dsa_port *dp;
 | 
						|
+	int err = 0;
 | 
						|
+
 | 
						|
+	list_for_each_entry(dp, &dst->ports, list) {
 | 
						|
+		err = dsa_switch_setup(dp->ds);
 | 
						|
+		if (err) {
 | 
						|
+			dsa_tree_teardown_switches(dst);
 | 
						|
+			break;
 | 
						|
+		}
 | 
						|
+	}
 | 
						|
 
 | 
						|
 	return err;
 | 
						|
 }
 | 
						|
@@ -1111,10 +1130,14 @@ static int dsa_tree_setup(struct dsa_swi
 | 
						|
 	if (err)
 | 
						|
 		goto teardown_cpu_ports;
 | 
						|
 
 | 
						|
-	err = dsa_tree_setup_master(dst);
 | 
						|
+	err = dsa_tree_setup_ports(dst);
 | 
						|
 	if (err)
 | 
						|
 		goto teardown_switches;
 | 
						|
 
 | 
						|
+	err = dsa_tree_setup_master(dst);
 | 
						|
+	if (err)
 | 
						|
+		goto teardown_ports;
 | 
						|
+
 | 
						|
 	err = dsa_tree_setup_lags(dst);
 | 
						|
 	if (err)
 | 
						|
 		goto teardown_master;
 | 
						|
@@ -1127,8 +1150,9 @@ static int dsa_tree_setup(struct dsa_swi
 | 
						|
 
 | 
						|
 teardown_master:
 | 
						|
 	dsa_tree_teardown_master(dst);
 | 
						|
-teardown_switches:
 | 
						|
+teardown_ports:
 | 
						|
 	dsa_tree_teardown_ports(dst);
 | 
						|
+teardown_switches:
 | 
						|
 	dsa_tree_teardown_switches(dst);
 | 
						|
 teardown_cpu_ports:
 | 
						|
 	dsa_tree_teardown_cpu_ports(dst);
 |