realtek: remove rtl83xx vlan 1 special cases
authorThomas Nixon <tom@tomn.co.uk>
Sat, 26 Jun 2021 12:50:12 +0000 (12:50 +0000)
committerHauke Mehrtens <hauke@hauke-m.de>
Sun, 25 Jul 2021 11:52:38 +0000 (13:52 +0200)
On reset, the PVID of all ports is set to 1; if this is reset to 0,
the special cases for VLAN 1 are no longer required.

port_vlan_add is called with vid=0 when the DSA port interfaces are
enabled with no VLAN; previously the VLAN was not configured in this
case, relying on VLAN 1 being present, but with the PVID set to 0,
configuring VLAN 0 as normal works as expected.

Signed-off-by: Thomas Nixon <tom@tomn.co.uk>
target/linux/realtek/files-5.4/drivers/net/dsa/rtl83xx/dsa.c

index c5f243c55abd1315135a3db0d62b0ae3ee49bd8c..c2a230c4cbd54df327a6b795aac28edeb63c82ce 100644 (file)
@@ -134,6 +134,10 @@ static void rtl83xx_vlan_setup(struct rtl838x_switch_priv *priv)
        for (i = 0; i < MAX_VLANS; i ++)
                priv->r->vlan_set_tagged(i, &info);
 
+       // reset PVIDs; defaults to 1 on reset
+       for (i = 0; i <= priv->ds->num_ports; i++)
+               sw_w32(0, priv->r->vlan_port_pb + (i << 2));
+
        // Set forwarding action based on inner VLAN tag
        for (i = 0; i < priv->cpu_port; i++)
                priv->r->vlan_fwd_on_inner(i, true);
@@ -909,9 +913,6 @@ static void rtl83xx_vlan_add(struct dsa_switch *ds, int port,
        }
 
        for (v = vlan->vid_begin; v <= vlan->vid_end; v++) {
-               if (!v)
-                       continue;
-
                /* Get port memberships of this vlan */
                priv->r->vlan_tables_read(v, &info);
 
@@ -971,9 +972,7 @@ static int rtl83xx_vlan_del(struct dsa_switch *ds, int port,
 
                /* remove port from both tables */
                info.untagged_ports &= (~BIT_ULL(port));
-               /* always leave vid 1 */
-               if (v != 1)
-                       info.tagged_ports &= (~BIT_ULL(port));
+               info.tagged_ports &= (~BIT_ULL(port));
 
                priv->r->vlan_set_untagged(v, info.untagged_ports);
                pr_debug("Untagged ports, VLAN %d: %llx\n", v, info.untagged_ports);