* [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®