* default, and that means vlan_filtering is 0 since they're not under
         * a bridge, so it's safe to set up switch tagging at this time.
         */
-       return sja1105_setup_8021q_tagging(ds, true);
+       rtnl_lock();
+       rc = sja1105_setup_8021q_tagging(ds, true);
+       rtnl_unlock();
+
+       return rc;
 }
 
 static void sja1105_teardown(struct dsa_switch *ds)
                return -ENOMEM;
 
        priv->dsa_8021q_ctx->ops = &sja1105_dsa_8021q_ops;
+       priv->dsa_8021q_ctx->proto = htons(ETH_P_8021Q);
        priv->dsa_8021q_ctx->ds = ds;
 
        INIT_LIST_HEAD(&priv->dsa_8021q_ctx->crosschip_links);
 
        int upstream = dsa_upstream_port(ctx->ds, port);
        u16 rx_vid = dsa_8021q_rx_vid(ctx->ds, port);
        u16 tx_vid = dsa_8021q_tx_vid(ctx->ds, port);
-       int i, err;
+       struct net_device *master;
+       int i, err, subvlan;
 
        /* The CPU port is implicitly configured by
         * configuring the front-panel ports
        if (!dsa_is_user_port(ctx->ds, port))
                return 0;
 
+       master = dsa_to_port(ctx->ds, port)->cpu_dp->master;
+
        /* Add this user port's RX VID to the membership list of all others
         * (including itself). This is so that bridging will not be hindered.
         * L2 forwarding rules still take precedence when there are no VLAN
                return err;
        }
 
+       /* Add to the master's RX filter not only @rx_vid, but in fact
+        * the entire subvlan range, just in case this DSA switch might
+        * want to use sub-VLANs.
+        */
+       for (subvlan = 0; subvlan < DSA_8021Q_N_SUBVLAN; subvlan++) {
+               u16 vid = dsa_8021q_rx_vid_subvlan(ctx->ds, port, subvlan);
+
+               if (enabled)
+                       vlan_vid_add(master, ctx->proto, vid);
+               else
+                       vlan_vid_del(master, ctx->proto, vid);
+       }
+
        /* Finally apply the TX VID on this port and on the CPU port */
        err = dsa_8021q_vid_apply(ctx, port, tx_vid, BRIDGE_VLAN_INFO_UNTAGGED,
                                  enabled);
 {
        int rc, port;
 
+       ASSERT_RTNL();
+
        for (port = 0; port < ctx->ds->num_ports; port++) {
                rc = dsa_8021q_setup_port(ctx, port, enabled);
                if (rc < 0) {