realtek: Fix bug in VLAN ingress and egress filtering
authorBirger Koblitz <git@birger-koblitz.de>
Wed, 8 Sep 2021 18:16:39 +0000 (20:16 +0200)
committerJohn Crispin <john@phrozen.org>
Sat, 9 Oct 2021 06:25:06 +0000 (08:25 +0200)
The ingress filter registers use 2 bits for each port to define the filtering
state, whereas the egress filter uses 1 bit. So for for the ingress filter
the register offset for a given port is:
(port >> 4) << 4: since there are 16 entries in a register of 32 bits
and for the egress filter:
(port >> 5) << 4: since there are 32 entries in a register of 32 bits

Signed-off-by: Birger Koblitz <git@birger-koblitz.de>
target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/dsa.c

index 8ed0e45bb99c8553c7defc8109ce02949fce7b74..8ad713163e7d177e2c6ca3dfb2434b59f94f5da7 100644 (file)
@@ -1071,14 +1071,14 @@ static int rtl83xx_vlan_filtering(struct dsa_switch *ds, int port,
                 */
                if (port != priv->cpu_port)
                        sw_w32_mask(0b10 << ((port % 16) << 1), 0b01 << ((port % 16) << 1),
-                                   priv->r->vlan_port_igr_filter + ((port >> 5) << 2));
-               sw_w32_mask(0, BIT(port % 32), priv->r->vlan_port_egr_filter + ((port >> 4) << 2));
+                                   priv->r->vlan_port_igr_filter + ((port >> 4) << 2));
+               sw_w32_mask(0, BIT(port % 32), priv->r->vlan_port_egr_filter + ((port >> 5) << 2));
        } else {
                /* Disable ingress and egress filtering */
                if (port != priv->cpu_port)
                        sw_w32_mask(0b11 << ((port % 16) << 1), 0,
-                                   priv->r->vlan_port_igr_filter + ((port >> 5) << 2));
-               sw_w32_mask(BIT(port % 32), 0, priv->r->vlan_port_egr_filter + ((port >> 4) << 2));
+                                   priv->r->vlan_port_igr_filter + ((port >> 4) << 2));
+               sw_w32_mask(BIT(port % 32), 0, priv->r->vlan_port_egr_filter + ((port >> 5) << 2));
        }
 
        /* Do we need to do something to the CPU-Port, too? */