Patch "net: dsa: felix: fix tagging protocol changes with multiple CPU ports" has been added to the 5.17-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net: dsa: felix: fix tagging protocol changes with multiple CPU ports

to the 5.17-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-dsa-felix-fix-tagging-protocol-changes-with-mult.patch
and it can be found in the queue-5.17 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit a64c494266364e77fc61814744e1e9fe6e06e5e9
Author: Vladimir Oltean <vladimir.oltean@xxxxxxx>
Date:   Tue Apr 12 20:22:09 2022 +0300

    net: dsa: felix: fix tagging protocol changes with multiple CPU ports
    
    [ Upstream commit 00fa91bc9cc2a9d340f963af5e457610ad4b2f9c ]
    
    When the device tree has 2 CPU ports defined, a single one is active
    (has any dp->cpu_dp pointers point to it). Yet the second one is still a
    CPU port, and DSA still calls ->change_tag_protocol on it.
    
    On the NXP LS1028A, the CPU ports are ports 4 and 5. Port 4 is the
    active CPU port and port 5 is inactive.
    
    After the following commands:
    
     # Initial setting
     cat /sys/class/net/eno2/dsa/tagging
     ocelot
     echo ocelot-8021q > /sys/class/net/eno2/dsa/tagging
     echo ocelot > /sys/class/net/eno2/dsa/tagging
    
    traffic is now broken, because the driver has moved the NPI port from
    port 4 to port 5, unbeknown to DSA.
    
    The problem can be avoided by detecting that the second CPU port is
    unused, and not doing anything for it. Further rework will be needed
    when proper support for multiple CPU ports is added.
    
    Treat this as a bug and prepare current kernels to work in single-CPU
    mode with multiple-CPU DT blobs.
    
    Fixes: adb3dccf090b ("net: dsa: felix: convert to the new .change_tag_protocol DSA API")
    Signed-off-by: Vladimir Oltean <vladimir.oltean@xxxxxxx>
    Link: https://lore.kernel.org/r/20220412172209.2531865-1-vladimir.oltean@xxxxxxx
    Signed-off-by: Paolo Abeni <pabeni@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/dsa/ocelot/felix.c b/drivers/net/dsa/ocelot/felix.c
index 9957772201d5..c414d9e9d7c0 100644
--- a/drivers/net/dsa/ocelot/felix.c
+++ b/drivers/net/dsa/ocelot/felix.c
@@ -599,6 +599,8 @@ static int felix_change_tag_protocol(struct dsa_switch *ds, int cpu,
 	struct ocelot *ocelot = ds->priv;
 	struct felix *felix = ocelot_to_felix(ocelot);
 	enum dsa_tag_protocol old_proto = felix->tag_proto;
+	bool cpu_port_active = false;
+	struct dsa_port *dp;
 	int err;
 
 	if (proto != DSA_TAG_PROTO_SEVILLE &&
@@ -606,6 +608,27 @@ static int felix_change_tag_protocol(struct dsa_switch *ds, int cpu,
 	    proto != DSA_TAG_PROTO_OCELOT_8021Q)
 		return -EPROTONOSUPPORT;
 
+	/* We don't support multiple CPU ports, yet the DT blob may have
+	 * multiple CPU ports defined. The first CPU port is the active one,
+	 * the others are inactive. In this case, DSA will call
+	 * ->change_tag_protocol() multiple times, once per CPU port.
+	 * Since we implement the tagging protocol change towards "ocelot" or
+	 * "seville" as effectively initializing the NPI port, what we are
+	 * doing is effectively changing who the NPI port is to the last @cpu
+	 * argument passed, which is an unused DSA CPU port and not the one
+	 * that should actively pass traffic.
+	 * Suppress DSA's calls on CPU ports that are inactive.
+	 */
+	dsa_switch_for_each_user_port(dp, ds) {
+		if (dp->cpu_dp->index == cpu) {
+			cpu_port_active = true;
+			break;
+		}
+	}
+
+	if (!cpu_port_active)
+		return 0;
+
 	felix_del_tag_protocol(ds, cpu, old_proto);
 
 	err = felix_set_tag_protocol(ds, cpu, proto);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux