summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/net/dsa/mv88e6xxx/chip.c1
-rw-r--r--include/net/dsa.h1
-rw-r--r--net/dsa/slave.c12
3 files changed, 10 insertions, 4 deletions
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 2b4a723c8306..7c535936c431 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -3037,6 +3037,7 @@ static int mv88e6xxx_setup(struct dsa_switch *ds)
chip->ds = ds;
ds->slave_mii_bus = mv88e6xxx_default_mdio_bus(chip);
+ ds->vlan_bridge_vtu = true;
mv88e6xxx_reg_lock(chip);
diff --git a/include/net/dsa.h b/include/net/dsa.h
index fb3f9222f2a1..62445442b091 100644
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
@@ -281,6 +281,7 @@ struct dsa_switch {
* settings on ports if not hardware-supported
*/
bool vlan_filtering_is_global;
+ bool vlan_bridge_vtu;
/* In case vlan_filtering_is_global is set, the VLAN awareness state
* should be retrieved from here and not from the per-port settings.
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index fcfe2fedf1ff..4ece0e8d843e 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -314,7 +314,8 @@ static int dsa_slave_vlan_add(struct net_device *dev,
if (obj->orig_dev != dev)
return -EOPNOTSUPP;
- if (dp->bridge_dev && !br_vlan_enabled(dp->bridge_dev))
+ if (dp->bridge_dev && !dp->ds->vlan_bridge_vtu &&
+ !br_vlan_enabled(dp->bridge_dev))
return 0;
vlan = *SWITCHDEV_OBJ_PORT_VLAN(obj);
@@ -381,7 +382,8 @@ static int dsa_slave_vlan_del(struct net_device *dev,
if (obj->orig_dev != dev)
return -EOPNOTSUPP;
- if (dp->bridge_dev && !br_vlan_enabled(dp->bridge_dev))
+ if (dp->bridge_dev && !dp->ds->vlan_bridge_vtu &&
+ !br_vlan_enabled(dp->bridge_dev))
return 0;
/* Do not deprogram the CPU port as it may be shared with other user
@@ -1241,7 +1243,8 @@ static int dsa_slave_vlan_rx_add_vid(struct net_device *dev, __be16 proto,
* need to emulate the switchdev prepare + commit phase.
*/
if (dp->bridge_dev) {
- if (!br_vlan_enabled(dp->bridge_dev))
+ if (!dp->ds->vlan_bridge_vtu &&
+ !br_vlan_enabled(dp->bridge_dev))
return 0;
/* br_vlan_get_info() returns -EINVAL or -ENOENT if the
@@ -1275,7 +1278,8 @@ static int dsa_slave_vlan_rx_kill_vid(struct net_device *dev, __be16 proto,
* need to emulate the switchdev prepare + commit phase.
*/
if (dp->bridge_dev) {
- if (!br_vlan_enabled(dp->bridge_dev))
+ if (!dp->ds->vlan_bridge_vtu &&
+ !br_vlan_enabled(dp->bridge_dev))
return 0;
/* br_vlan_get_info() returns -EINVAL or -ENOENT if the