public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
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
>    *************************************************************************/


  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