mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH net] net: dsa: motorcomm: Isolate all ports during chip setup
@ 2026-10-24 14:40 David Yang
  2026-10-24 22:53 ` kernel test robot
  0 siblings, 1 reply; 2+ messages in thread
From: David Yang @ 2026-10-24 14:40 UTC (permalink / raw)
  To: netdev
  Cc: David Yang, Andrew Lunn, Vladimir Oltean, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-kernel

The chip setup only blocked unknown unicast and unknown multicast
frames, known multicast and broadcast were left open (though the former
cannot appear while the FDB is still empty). Before port_setup() runs,
this leaks in two ways: frames pumped untagged into the conduit port
reach the fabric and loop back to the CPU, where the tag driver warns
about and drops them; and broadcast frames received on a user port flood
out of the other user ports.

Close the window by fully isolating every port right after the hardware
reset. The CPU port one-way isolation is also applied during chip setup
instead of port_setup(), and yt921x_userport_standalone(), which
port_setup() also runs for CPU ports, keeps it intact.

Fixes: 186623f4aa72 ("net: dsa: yt921x: Add support for Motorcomm YT921x")
Signed-off-by: David Yang <mmyangfl@gmail.com>
---
 drivers/net/dsa/motorcomm/chip.c | 56 ++++++++++++--------------------
 1 file changed, 20 insertions(+), 36 deletions(-)

diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/chip.c
index d4fc20c52a58..f1762273dd6a 100644
--- a/drivers/net/dsa/motorcomm/chip.c
+++ b/drivers/net/dsa/motorcomm/chip.c
@@ -1164,10 +1164,13 @@ static int yt921x_userport_standalone(struct yt921x_priv *priv, int port)
 	u32 ctrl;
 	int res;
 
-	ctrl = ~priv->cpu_ports_mask;
-	res = yt921x_reg_write(priv, YT921X_PORTn_ISOLATION(port), ctrl);
-	if (res)
-		return res;
+	if (!(BIT(port) & priv->cpu_ports_mask)) {
+		ctrl = ~priv->cpu_ports_mask;
+		res = yt921x_reg_write(priv, YT921X_PORTn_ISOLATION(port),
+				       ctrl);
+		if (res)
+			return res;
+	}
 
 	/* Turn off FDB learning to prevent FDB pollution */
 	mask = YT921X_PORT_LEARN_DIS;
@@ -1942,8 +1945,6 @@ yt921x_dsa_phylink_get_caps(struct dsa_switch *ds, int port,
 
 static int yt921x_port_setup(struct yt921x_priv *priv, int port)
 {
-	struct dsa_switch *ds = &priv->ds;
-	u32 ctrl;
 	int res;
 
 	res = yt921x_userport_standalone(priv, port);
@@ -1957,27 +1958,6 @@ static int yt921x_port_setup(struct yt921x_priv *priv, int port)
 	if (res)
 		return res;
 
-	if (dsa_is_cpu_port(ds, port)) {
-		/* Egress of CPU port is supposed to be completely controlled
-		 * via tagging, so set to oneway isolated (drop all packets
-		 * without tag).
-		 */
-		ctrl = ~(u32)0;
-		res = yt921x_reg_write(priv, YT921X_PORTn_ISOLATION(port),
-				       ctrl);
-		if (res)
-			return res;
-
-		/* To simplify FDB "isolation" simulation, we also disable
-		 * learning on the CPU port, and let software identify packets
-		 * towarding CPU (either trapped or a static FDB entry is
-		 * matched, no matter which bridge that entry is for), which is
-		 * already done by yt921x_userport_standalone(). As a result,
-		 * VLAN-awareness becomes unrelated on the CPU port (set to
-		 * VLAN-unaware by the way).
-		 */
-	}
-
 	return 0;
 }
 
@@ -2221,6 +2201,7 @@ static int yt921x_chip_reset(struct yt921x_priv *priv)
 {
 	struct device *dev = yt921x_priv_to_device(priv);
 	u16 eth_p_tag;
+	u32 ctrl;
 	u32 val;
 	int res;
 
@@ -2258,6 +2239,17 @@ static int yt921x_chip_reset(struct yt921x_priv *priv)
 		return -EINVAL;
 	}
 
+	/* Block all traffic as soon as we reset the hardware since it now acts
+	 * as a dump switch.
+	 */
+	for (int port = 0; port < YT921X_PORT_NUM; port++) {
+		ctrl = ~(u32)0;
+		res = yt921x_reg_write(priv, YT921X_PORTn_ISOLATION(port),
+				       ctrl);
+		if (res)
+			return res;
+	}
+
 	return 0;
 }
 
@@ -2285,7 +2277,7 @@ static int yt921x_chip_setup_dsa(struct yt921x_priv *priv)
 	if (res)
 		return res;
 
-	ctrl = GENMASK(10, 0);
+	ctrl = GENMASK(10, 0) & ~priv->cpu_ports_mask;
 	res = yt921x_reg_write(priv, YT921X_FILTER_UNK_UCAST, ctrl);
 	if (res)
 		return res;
@@ -2308,14 +2300,6 @@ static int yt921x_chip_setup_dsa(struct yt921x_priv *priv)
 	ctrl = 0;
 	for (int i = 0; i < YT921X_PORT_NUM; i++)
 		ctrl |= YT921X_ACT_UNK_ACTn_TRAP(i);
-	/* Except for CPU ports, if any packets are sent via CPU ports without
-	 * tag, they should be dropped.
-	 */
-	cpu_ports_mask = priv->cpu_ports_mask;
-	for_each_set_bit(port, &cpu_ports_mask, YT921X_PORT_NUM) {
-		ctrl &= ~YT921X_ACT_UNK_ACTn_M(port);
-		ctrl |= YT921X_ACT_UNK_ACTn_DROP(port);
-	}
 	res = yt921x_reg_write(priv, YT921X_ACT_UNK_UCAST, ctrl);
 	if (res)
 		return res;
-- 
2.53.0


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH net] net: dsa: motorcomm: Isolate all ports during chip setup
  2026-10-24 14:40 [PATCH net] net: dsa: motorcomm: Isolate all ports during chip setup David Yang
@ 2026-10-24 22:53 ` kernel test robot
  0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2026-10-24 22:53 UTC (permalink / raw)
  To: David Yang, netdev
  Cc: oe-kbuild-all, David Yang, Andrew Lunn, Vladimir Oltean,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-kernel

Hi David,

kernel test robot noticed the following build warnings:

[auto build test WARNING on net/main]

url:    https://github.com/intel-lab-lkp/linux/commits/David-Yang/net-dsa-motorcomm-Isolate-all-ports-during-chip-setup/20261024-224021
base:   net/main
patch link:    https://lore.kernel.org/r/20261024144023.1010237-1-mmyangfl%40gmail.com
patch subject: [PATCH net] net: dsa: motorcomm: Isolate all ports during chip setup
config: arm64-randconfig-1000-20261025 (https://download.01.org/0day-ci/archive/20261025/202610250645.V7tGJ85r-lkp@intel.com/config)
compiler: aarch64-linux-gcc (GCC) 8.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20261025/202610250645.V7tGJ85r-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202610250645.V7tGJ85r-lkp@intel.com/

All warnings (new ones prefixed by >>):

   drivers/net/dsa/motorcomm/chip.c: In function 'yt921x_chip_setup_dsa':
>> drivers/net/dsa/motorcomm/chip.c:2262:6: warning: unused variable 'port' [-Wunused-variable]
     int port;
         ^~~~
>> drivers/net/dsa/motorcomm/chip.c:2259:16: warning: unused variable 'cpu_ports_mask' [-Wunused-variable]
     unsigned long cpu_ports_mask;
                   ^~~~~~~~~~~~~~


vim +/port +2262 drivers/net/dsa/motorcomm/chip.c

186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2255  
95e6bcab3c08e8 drivers/net/dsa/yt921x.c         David Yang 2026-01-31  2256  static int yt921x_chip_setup_dsa(struct yt921x_priv *priv)
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2257  {
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2258  	struct dsa_switch *ds = &priv->ds;
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17 @2259  	unsigned long cpu_ports_mask;
9f8888984eb095 drivers/net/dsa/yt921x.c         David Yang 2026-04-30  2260  	u32 ctrls[2];
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2261  	u32 ctrl;
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17 @2262  	int port;
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2263  	int res;
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2264  
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2265  	/* Enable DSA */
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2266  	priv->cpu_ports_mask = dsa_cpu_ports(ds);
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2267  
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2268  	ctrl = YT921X_EXT_CPU_PORT_TAG_EN | YT921X_EXT_CPU_PORT_PORT_EN |
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2269  	       YT921X_EXT_CPU_PORT_PORT(__ffs(priv->cpu_ports_mask));
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2270  	res = yt921x_reg_write(priv, YT921X_EXT_CPU_PORT, ctrl);
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2271  	if (res)
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2272  		return res;
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2273  
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2274  	/* Setup software switch */
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2275  	ctrl = YT921X_CPU_COPY_TO_EXT_CPU;
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2276  	res = yt921x_reg_write(priv, YT921X_CPU_COPY, ctrl);
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2277  	if (res)
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2278  		return res;
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2279  
47373f4f561962 drivers/net/dsa/motorcomm/chip.c David Yang 2026-10-24  2280  	ctrl = GENMASK(10, 0) & ~priv->cpu_ports_mask;
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2281  	res = yt921x_reg_write(priv, YT921X_FILTER_UNK_UCAST, ctrl);
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2282  	if (res)
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2283  		return res;
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2284  	res = yt921x_reg_write(priv, YT921X_FILTER_UNK_MCAST, ctrl);
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2285  	if (res)
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2286  		return res;
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2287  
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2288  	/* YT921x does not support native DSA port bridging, so we use port
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2289  	 * isolation to emulate it. However, be especially careful that port
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2290  	 * isolation takes _after_ FDB lookups, i.e. if an FDB entry (from
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2291  	 * another bridge) is matched and the destination port (in another
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2292  	 * bridge) is blocked, the packet will be dropped instead of flooding to
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2293  	 * the "bridged" ports, thus we need to trap and handle those packets by
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2294  	 * software.
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2295  	 *
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2296  	 * If there is no more than one bridge, we might be able to drop them
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2297  	 * directly given some conditions are met, but we trap them in all cases
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2298  	 * for now.
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2299  	 */
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2300  	ctrl = 0;
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2301  	for (int i = 0; i < YT921X_PORT_NUM; i++)
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2302  		ctrl |= YT921X_ACT_UNK_ACTn_TRAP(i);
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2303  	res = yt921x_reg_write(priv, YT921X_ACT_UNK_UCAST, ctrl);
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2304  	if (res)
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2305  		return res;
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2306  	res = yt921x_reg_write(priv, YT921X_ACT_UNK_MCAST, ctrl);
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2307  	if (res)
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2308  		return res;
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2309  
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2310  	/* Tagged VID 0 should be treated as untagged, which confuses the
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2311  	 * hardware a lot
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2312  	 */
9f8888984eb095 drivers/net/dsa/yt921x.c         David Yang 2026-04-30  2313  	ctrls[0] = YT921X_VLAN_CTRLa_LEARN_DIS | YT921X_VLAN_CTRLa_PORTS_M;
9f8888984eb095 drivers/net/dsa/yt921x.c         David Yang 2026-04-30  2314  	ctrls[1] = 0;
9f8888984eb095 drivers/net/dsa/yt921x.c         David Yang 2026-04-30  2315  	res = yt921x_reg64_write(priv, YT921X_VLANn_CTRL(0), ctrls);
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2316  	if (res)
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2317  		return res;
186623f4aa724c drivers/net/dsa/yt921x.c         David Yang 2025-10-17  2318  
95e6bcab3c08e8 drivers/net/dsa/yt921x.c         David Yang 2026-01-31  2319  	return 0;
95e6bcab3c08e8 drivers/net/dsa/yt921x.c         David Yang 2026-01-31  2320  }
95e6bcab3c08e8 drivers/net/dsa/yt921x.c         David Yang 2026-01-31  2321  

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-10-24 22:54 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-24 14:40 [PATCH net] net: dsa: motorcomm: Isolate all ports during chip setup David Yang
2026-10-24 22:53 ` kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®