net: dsa: b53: Let DSA handle mismatched VLAN filtering settings
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>
This commit is contained in:
parent
8f5d16f638
commit
7228b23e68
|
@ -966,6 +966,13 @@ static int b53_setup(struct dsa_switch *ds)
|
||||||
b53_disable_port(ds, port);
|
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;
|
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)
|
int b53_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering)
|
||||||
{
|
{
|
||||||
struct b53_device *dev = ds->priv;
|
struct b53_device *dev = ds->priv;
|
||||||
struct net_device *bridge_dev;
|
|
||||||
unsigned int i;
|
|
||||||
u16 pvid, new_pvid;
|
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);
|
b53_read16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port), &pvid);
|
||||||
new_pvid = pvid;
|
new_pvid = pvid;
|
||||||
if (dev->vlan_filtering_enabled && !vlan_filtering) {
|
if (dev->vlan_filtering_enabled && !vlan_filtering) {
|
||||||
|
|
Loading…
Reference in New Issue