net: dsa: b53: Let DSA handle mismatched VLAN filtering settings
authorVladimir Oltean <olteanv@gmail.com>
Sun, 28 Apr 2019 18:45:45 +0000 (21:45 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 1 May 2019 03:05:28 +0000 (23:05 -0400)
The DSA core is now able to do this check prior to calling the
.port_vlan_filtering callback, so tell it that VLAN filtering is global
for this particular hardware.

Signed-off-by: Vladimir Oltean <olteanv@gmail.com>
Suggested-by: Florian Fainelli <f.fainelli@gmail.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/b53/b53_common.c

index 0852e5e0817721448c5cab9de89423a45181d6f6..a779b9c3ab6e689f37d2f0889919018a4712038f 100644 (file)
@@ -966,6 +966,13 @@ static int b53_setup(struct dsa_switch *ds)
                        b53_disable_port(ds, port);
        }
 
+       /* Let DSA handle the case were multiple bridges span the same switch
+        * device and different VLAN awareness settings are requested, which
+        * would be breaking filtering semantics for any of the other bridge
+        * devices. (not hardware supported)
+        */
+       ds->vlan_filtering_is_global = true;
+
        return ret;
 }
 
@@ -1275,26 +1282,8 @@ EXPORT_SYMBOL(b53_phylink_mac_link_up);
 int b53_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering)
 {
        struct b53_device *dev = ds->priv;
-       struct net_device *bridge_dev;
-       unsigned int i;
        u16 pvid, new_pvid;
 
-       /* Handle the case were multiple bridges span the same switch device
-        * and one of them has a different setting than what is being requested
-        * which would be breaking filtering semantics for any of the other
-        * bridge devices.
-        */
-       b53_for_each_port(dev, i) {
-               bridge_dev = dsa_to_port(ds, i)->bridge_dev;
-               if (bridge_dev &&
-                   bridge_dev != dsa_to_port(ds, port)->bridge_dev &&
-                   br_vlan_enabled(bridge_dev) != vlan_filtering) {
-                       netdev_err(bridge_dev,
-                                  "VLAN filtering is global to the switch!\n");
-                       return -EINVAL;
-               }
-       }
-
        b53_read16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port), &pvid);
        new_pvid = pvid;
        if (dev->vlan_filtering_enabled && !vlan_filtering) {