net: dsa: mt7530: manually set up VLAN ID 0
authorDENG Qingfang <dqfext@gmail.com>
Tue, 24 Aug 2021 16:52:52 +0000 (00:52 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 25 Aug 2021 10:09:31 +0000 (11:09 +0100)
The driver was relying on dsa_slave_vlan_rx_add_vid to add VLAN ID 0. After
the blamed commit, VLAN ID 0 won't be set up anymore, breaking software
bridging fallback on VLAN-unaware bridges.

Manually set up VLAN ID 0 to fix this.

Fixes: 06cfb2df7eb0 ("net: dsa: don't advertise 'rx-vlan-filter' when not needed")
Signed-off-by: DENG Qingfang <dqfext@gmail.com>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/mt7530.c
drivers/net/dsa/mt7530.h

index d757d9dcba514122045e926f93e1f6e8ef42d985..d0cba2d1cd681645415a83d681a79bd4d8428e21 100644 (file)
@@ -1599,6 +1599,21 @@ mt7530_hw_vlan_update(struct mt7530_priv *priv, u16 vid,
        mt7530_vlan_cmd(priv, MT7530_VTCR_WR_VID, vid);
 }
 
+static int
+mt7530_setup_vlan0(struct mt7530_priv *priv)
+{
+       u32 val;
+
+       /* Validate the entry with independent learning, keep the original
+        * ingress tag attribute.
+        */
+       val = IVL_MAC | EG_CON | PORT_MEM(MT7530_ALL_MEMBERS) | FID(FID_BRIDGED) |
+             VLAN_VALID;
+       mt7530_write(priv, MT7530_VAWD1, val);
+
+       return mt7530_vlan_cmd(priv, MT7530_VTCR_WR_VID, 0);
+}
+
 static int
 mt7530_port_vlan_add(struct dsa_switch *ds, int port,
                     const struct switchdev_obj_port_vlan *vlan,
@@ -2174,6 +2189,11 @@ mt7530_setup(struct dsa_switch *ds)
                           PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT));
        }
 
+       /* Setup VLAN ID 0 for VLAN-unaware bridges */
+       ret = mt7530_setup_vlan0(priv);
+       if (ret)
+               return ret;
+
        /* Setup port 5 */
        priv->p5_intf_sel = P5_DISABLED;
        interface = PHY_INTERFACE_MODE_NA;
@@ -2346,6 +2366,11 @@ mt7531_setup(struct dsa_switch *ds)
                           PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT));
        }
 
+       /* Setup VLAN ID 0 for VLAN-unaware bridges */
+       ret = mt7530_setup_vlan0(priv);
+       if (ret)
+               return ret;
+
        ds->assisted_learning_on_cpu_port = true;
        ds->mtu_enforcement_ingress = true;
 
index fe4cd2ac26d090ade810cffdb13f51d38bc35a45..91508e2feef95606b7a259a94b90f32c6c92ff03 100644 (file)
@@ -145,6 +145,8 @@ enum mt7530_vlan_cmd {
 #define  PORT_STAG                     BIT(31)
 /* Independent VLAN Learning */
 #define  IVL_MAC                       BIT(30)
+/* Egress Tag Consistent */
+#define  EG_CON                                BIT(29)
 /* Per VLAN Egress Tag Control */
 #define  VTAG_EN                       BIT(28)
 /* VLAN Member Control */