[PATCH 2/2] realtek: use assisted learning on CPU port

Sander Vanheule sander at svanheule.net
Sun Oct 23 11:24:19 PDT 2022


Hi Jan,

On Fri, 2022-10-21 at 23:54 +0200, Jan Hoffmann wrote:
> L2 learning on the CPU port is currently not consistently configured and
> relies on the default configuration of the device. On RTL83xx, it is
> disabled for packets transmitted with a TX header, as hardware learning
> corrupts the forwarding table otherwise. As a result, unneeded flooding
> of traffic for the CPU port can already happen on some devices now. It
> is also likely that similar issues exist on RTL93xx, which doesn't have
> a field to disable learning in the TX header.
> 
> To address this, disable hardware learning for the CPU port globally on
> all devices. Instead, enable assisted learning to let DSA write FDB
> entries to the switch.
> 
> For now, this does not sync local/bridge entries to the switch. However,
> support for that was added in Linux 5.14, so the next switch to a newer
> kernel version is going to fix this.
> 
> Signed-off-by: Jan Hoffmann <jan at 3e8.eu>
> ---
>  .../files-5.10/drivers/net/dsa/rtl83xx/dsa.c     | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
> 
> diff --git a/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/dsa.c
> b/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/dsa.c
> index 45b489afa124..f45002f33bfb 100644
> --- a/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/dsa.c
> +++ b/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/dsa.c
> @@ -162,6 +162,16 @@ static void rtl83xx_setup_bpdu_traps(struct
> rtl838x_switch_priv *priv)
>                 priv->r->set_receive_management_action(i, BPDU, COPY2CPU);
>  }
>  
> +static void rtl83xx_port_set_salrn(struct rtl838x_switch_priv *priv,
> +                                  int port, bool enable)
> +{
> +       int offset = (port & 0xf) << 1;

I find this masking and shifting unintuitive, because the intention here is not
to stuff the value in a bitfield (which is how I would read this). Instead, this
calculates the offset in an array of 2-bit fields, so just do that explicitly
and let the compiler translate this into more efficient masking and shifting:

	int offset = (port % 16) * 2;

> +       int val = enable ? 0 : 2;

Please add some form of description for these values:

	#define SALRN_MODE_HARDWARE	0
	#define SALRN_MODE_DISABLED	2

Or with an RTL83XX_ prefix.

> +
> +       sw_w32_mask(0x3 << offset, val << offset,
> +                   priv->r->l2_port_new_salrn(port));
> +}
> +
> 

Best,
Sander




More information about the openwrt-devel mailing list