[PATCH v2 2/2] realtek: use assisted learning on CPU port
Jan Hoffmann
jan at 3e8.eu
Wed Oct 26 14:39:24 PDT 2022
On 26.10.22 at 00:20, 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 ++++++++++++++++
> .../files-5.10/drivers/net/dsa/rtl83xx/rtl838x.h | 6 ++++++
> 2 files changed, 22 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 474d540945d1..319f171eaacc 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 shift = SALRN_PORT_SHIFT(port);
> + int val = enable ? SALRN_MODE_HARDWARE : SALRN_MODE_DISABLED;
While looking at the patch again, I noticed that the type of these
variables should probably be u32 (to avoid possible undefined behaviour
when shift is 30).
As the patch is already accepted now, I'll send a separate fix.
> +
> + sw_w32_mask(SALRN_MODE_MASK << shift, val << shift,
> + priv->r->l2_port_new_salrn(port));
> +}
> +
> static int rtl83xx_setup(struct dsa_switch *ds)
> {
> int i;
> @@ -205,6 +215,9 @@ static int rtl83xx_setup(struct dsa_switch *ds)
>
> priv->r->l2_learning_setup();
>
> + rtl83xx_port_set_salrn(priv, priv->cpu_port, false);
> + ds->assisted_learning_on_cpu_port = true;
> +
> /*
> * Make sure all frames sent to the switch's MAC are trapped to the CPU-port
> * 0: FWD, 1: DROP, 2: TRAP2CPU
> @@ -263,6 +276,9 @@ static int rtl93xx_setup(struct dsa_switch *ds)
>
> priv->r->l2_learning_setup();
>
> + rtl83xx_port_set_salrn(priv, priv->cpu_port, false);
> + ds->assisted_learning_on_cpu_port = true;
> +
> rtl83xx_enable_phy_polling(priv);
>
> priv->r->pie_init(priv);
> diff --git a/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/rtl838x.h b/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/rtl838x.h
> index e2b82a4975f0..10913dacef42 100644
> --- a/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/rtl838x.h
> +++ b/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/rtl838x.h
> @@ -245,6 +245,12 @@
> #define RTL839X_L2_PORT_NEW_SALRN(p) (0x38F0 + (((p >> 4) << 2)))
> #define RTL930X_L2_PORT_SALRN(p) (0x8FEC + (((p >> 4) << 2)))
> #define RTL931X_L2_PORT_NEW_SALRN(p) (0xC820 + (((p >> 4) << 2)))
> +
> +#define SALRN_PORT_SHIFT(p) ((p % 16) * 2)
> +#define SALRN_MODE_MASK 0x3
> +#define SALRN_MODE_HARDWARE 0
> +#define SALRN_MODE_DISABLED 2
> +
> #define RTL838X_L2_PORT_NEW_SA_FWD(p) (0x3294 + (((p >> 4) << 2)))
> #define RTL839X_L2_PORT_NEW_SA_FWD(p) (0x3900 + (((p >> 4) << 2)))
> #define RTL930X_L2_PORT_NEW_SA_FWD(p) (0x8FF4 + (((p / 10) << 2)))
More information about the openwrt-devel
mailing list