From: "Rafał Miłecki" <zajec5@gmail.com>
To: Jonas Gorski <jonas.gorski@gmail.com>,
Florian Fainelli <florian.fainelli@broadcom.com>,
Andrew Lunn <andrew@lunn.ch>, Vladimir Oltean <olteanv@gmail.com>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>
Cc: Florian Fainelli <f.fainelli@gmail.com>,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH net] net: dsa: b53: prevent standalone from trying to forward to other ports
Date: Thu, 26 Feb 2026 21:24:59 +0100 [thread overview]
Message-ID: <ce4d9b7b-aaf6-4796-94fb-8c3d6a1dcd4d@gmail.com> (raw)
In-Reply-To: <20250508091424.26870-1-jonas.gorski@gmail.com>
W dniu 8.05.2025 o 11:14, Jonas Gorski pisze:
> When bridged ports and standalone ports share a VLAN, e.g. via VLAN
> uppers, or untagged traffic with a vlan unaware bridge, the ASIC will
> still try to forward traffic to known FDB entries on standalone ports.
> But since the port VLAN masks prevent forwarding to bridged ports, this
> traffic will be dropped.
>
> This e.g. can be observed in the bridge_vlan_unaware ping tests, where
> this breaks pinging with learning on.
>
> Work around this by enabling the simplified EAP mode on switches
> supporting it for standalone ports, which causes the ASIC to redirect
> traffic of unknown source MAC addresses to the CPU port.
>
> Since standalone ports do not learn, there are no known source MAC
> addresses, so effectively this redirects all incoming traffic to the CPU
> port.
This change broke standalone ports (those not being part of bridge) on Northstar (BCM5301X) devices. We got reports from users about WAN ports on routers not working anymore:
https://github.com/openwrt/openwrt/issues/21187
https://github.com/openwrt/openwrt/issues/21349
Can you take another look at those changes, see if something me be wrong / missing?
> Fixes: ff39c2d68679 ("net: dsa: b53: Add bridge support")
> Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
> ---
> drivers/net/dsa/b53/b53_common.c | 33 ++++++++++++++++++++++++++++++++
> drivers/net/dsa/b53/b53_regs.h | 14 ++++++++++++++
> 2 files changed, 47 insertions(+)
>
> diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
> index 9eb39cfa5fb2..7216eb8f9493 100644
> --- a/drivers/net/dsa/b53/b53_common.c
> +++ b/drivers/net/dsa/b53/b53_common.c
> @@ -326,6 +326,26 @@ static void b53_get_vlan_entry(struct b53_device *dev, u16 vid,
> }
> }
>
> +static void b53_set_eap_mode(struct b53_device *dev, int port, int mode)
> +{
> + u64 eap_conf;
> +
> + if (is5325(dev) || is5365(dev) || dev->chip_id == BCM5389_DEVICE_ID)
> + return;
> +
> + b53_read64(dev, B53_EAP_PAGE, B53_PORT_EAP_CONF(port), &eap_conf);
> +
> + if (is63xx(dev)) {
> + eap_conf &= ~EAP_MODE_MASK_63XX;
> + eap_conf |= (u64)mode << EAP_MODE_SHIFT_63XX;
> + } else {
> + eap_conf &= ~EAP_MODE_MASK;
> + eap_conf |= (u64)mode << EAP_MODE_SHIFT;
> + }
> +
> + b53_write64(dev, B53_EAP_PAGE, B53_PORT_EAP_CONF(port), eap_conf);
> +}
> +
> static void b53_set_forwarding(struct b53_device *dev, int enable)
> {
> u8 mgmt;
> @@ -586,6 +606,13 @@ int b53_setup_port(struct dsa_switch *ds, int port)
> b53_port_set_mcast_flood(dev, port, true);
> b53_port_set_learning(dev, port, false);
>
> + /* Force all traffic to go to the CPU port to prevent the ASIC from
> + * trying to forward to bridged ports on matching FDB entries, then
> + * dropping frames because it isn't allowed to forward there.
> + */
> + if (dsa_is_user_port(ds, port))
> + b53_set_eap_mode(dev, port, EAP_MODE_SIMPLIFIED);
> +
> return 0;
> }
> EXPORT_SYMBOL(b53_setup_port);
> @@ -2042,6 +2069,9 @@ int b53_br_join(struct dsa_switch *ds, int port, struct dsa_bridge bridge,
> pvlan |= BIT(i);
> }
>
> + /* Disable redirection of unknown SA to the CPU port */
> + b53_set_eap_mode(dev, port, EAP_MODE_BASIC);
> +
> /* Configure the local port VLAN control membership to include
> * remote ports and update the local port bitmask
> */
> @@ -2077,6 +2107,9 @@ void b53_br_leave(struct dsa_switch *ds, int port, struct dsa_bridge bridge)
> pvlan &= ~BIT(i);
> }
>
> + /* Enable redirection of unknown SA to the CPU port */
> + b53_set_eap_mode(dev, port, EAP_MODE_SIMPLIFIED);
> +
> b53_write16(dev, B53_PVLAN_PAGE, B53_PVLAN_PORT_MASK(port), pvlan);
> dev->ports[port].vlan_ctl_mask = pvlan;
>
> diff --git a/drivers/net/dsa/b53/b53_regs.h b/drivers/net/dsa/b53/b53_regs.h
> index bfbcb66bef66..5f7a0e5c5709 100644
> --- a/drivers/net/dsa/b53/b53_regs.h
> +++ b/drivers/net/dsa/b53/b53_regs.h
> @@ -50,6 +50,9 @@
> /* Jumbo Frame Registers */
> #define B53_JUMBO_PAGE 0x40
>
> +/* EAP Registers */
> +#define B53_EAP_PAGE 0x42
> +
> /* EEE Control Registers Page */
> #define B53_EEE_PAGE 0x92
>
> @@ -480,6 +483,17 @@
> #define JMS_MIN_SIZE 1518
> #define JMS_MAX_SIZE 9724
>
> +/*************************************************************************
> + * EAP Page Registers
> + *************************************************************************/
> +#define B53_PORT_EAP_CONF(i) (0x20 + 8 * (i))
> +#define EAP_MODE_SHIFT 51
> +#define EAP_MODE_SHIFT_63XX 50
> +#define EAP_MODE_MASK (0x3ull << EAP_MODE_SHIFT)
> +#define EAP_MODE_MASK_63XX (0x3ull << EAP_MODE_SHIFT_63XX)
> +#define EAP_MODE_BASIC 0
> +#define EAP_MODE_SIMPLIFIED 3
> +
> /*************************************************************************
> * EEE Configuration Page Registers
> *************************************************************************/
next prev parent reply other threads:[~2026-02-26 20:25 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-08 9:14 [PATCH net] net: dsa: b53: prevent standalone from trying to forward to other ports Jonas Gorski
2025-05-13 10:28 ` Paolo Abeni
2025-05-13 12:43 ` Florian Fainelli
2025-05-13 12:55 ` Vladimir Oltean
2025-05-13 13:50 ` patchwork-bot+netdevbpf
2026-02-26 20:24 ` Rafał Miłecki [this message]
2026-02-26 21:26 ` Florian Fainelli
2026-02-27 12:23 ` Rafał Miłecki
2026-02-27 13:32 ` Rafał Miłecki
2026-02-27 17:58 ` Florian Fainelli
2026-02-27 18:13 ` Rafał Miłecki
2026-02-28 13:30 ` Jonas Gorski
2026-03-02 12:34 ` Rafał Miłecki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ce4d9b7b-aaf6-4796-94fb-8c3d6a1dcd4d@gmail.com \
--to=zajec5@gmail.com \
--cc=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=f.fainelli@gmail.com \
--cc=florian.fainelli@broadcom.com \
--cc=jonas.gorski@gmail.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=olteanv@gmail.com \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox