*/
        bool                    vlan_filtering_is_global;
 
+       /* Pass .port_vlan_add and .port_vlan_del to drivers even for bridges
+        * that have vlan_filtering=0. All drivers should ideally set this (and
+        * then the option would get removed), but it is unknown whether this
+        * would break things or not.
+        */
+       bool                    configure_vlan_while_not_filtering;
+
        /* In case vlan_filtering_is_global is set, the VLAN awareness state
         * should be retrieved from here and not from the per-port settings.
         */
 
 void dsa_port_bridge_leave(struct dsa_port *dp, struct net_device *br);
 int dsa_port_vlan_filtering(struct dsa_port *dp, bool vlan_filtering,
                            struct switchdev_trans *trans);
+bool dsa_port_skip_vlan_configuration(struct dsa_port *dp);
 int dsa_port_ageing_time(struct dsa_port *dp, clock_t ageing_clock,
                         struct switchdev_trans *trans);
 int dsa_port_mtu_change(struct dsa_port *dp, int new_mtu,
 
        return 0;
 }
 
+/* This enforces legacy behavior for switch drivers which assume they can't
+ * receive VLAN configuration when enslaved to a bridge with vlan_filtering=0
+ */
+bool dsa_port_skip_vlan_configuration(struct dsa_port *dp)
+{
+       struct dsa_switch *ds = dp->ds;
+
+       if (!dp->bridge_dev)
+               return false;
+
+       return (!ds->configure_vlan_while_not_filtering &&
+               !br_vlan_enabled(dp->bridge_dev));
+}
+
 int dsa_port_ageing_time(struct dsa_port *dp, clock_t ageing_clock,
                         struct switchdev_trans *trans)
 {
 
        if (obj->orig_dev != dev)
                return -EOPNOTSUPP;
 
-       if (dp->bridge_dev && !br_vlan_enabled(dp->bridge_dev))
+       if (dsa_port_skip_vlan_configuration(dp))
                return 0;
 
        vlan = *SWITCHDEV_OBJ_PORT_VLAN(obj);
        if (obj->orig_dev != dev)
                return -EOPNOTSUPP;
 
-       if (dp->bridge_dev && !br_vlan_enabled(dp->bridge_dev))
+       if (dsa_port_skip_vlan_configuration(dp))
                return 0;
 
        /* Do not deprogram the CPU port as it may be shared with other user
         * need to emulate the switchdev prepare + commit phase.
         */
        if (dp->bridge_dev) {
-               if (!br_vlan_enabled(dp->bridge_dev))
+               if (dsa_port_skip_vlan_configuration(dp))
                        return 0;
 
                /* br_vlan_get_info() returns -EINVAL or -ENOENT if the
         * need to emulate the switchdev prepare + commit phase.
         */
        if (dp->bridge_dev) {
-               if (!br_vlan_enabled(dp->bridge_dev))
+               if (dsa_port_skip_vlan_configuration(dp))
                        return 0;
 
                /* br_vlan_get_info() returns -EINVAL or -ENOENT if the