linux/drivers/net/dsa
Vladimir Oltean 3e85f580e3 net: dsa: mv88e6xxx: deny vid 0 on the CPU port and DSA links too
mv88e6xxx apparently has a problem offloading VID 0, which the 8021q
module tries to install as part of commit ad1afb0039 ("vlan_dev: VLAN
0 should be treated as "no vlan tag" (802.1p packet)"). That mv88e6xxx
restriction seems to have been introduced by the "VTU GetNext VID-1
trick to retrieve a single entry" - see commit 2fb5ef09de ("net: dsa:
mv88e6xxx: extract single VLAN retrieval").

There is one more problem. The mv88e6xxx CPU port and DSA links do not
report properly in the prepare phase what are the VLANs that they can
offload. They'll say they can offload everything:

mv88e6xxx_port_vlan_prepare
-> mv88e6xxx_port_check_hw_vlan:

	/* DSA and CPU ports have to be members of multiple vlans */
	if (dsa_is_dsa_port(ds, port) || dsa_is_cpu_port(ds, port))
		return 0;

Except that if you actually try to commit to it, they'll error out and
print this message:

[   32.802438] mv88e6085 d0032004.mdio-mii:12: p9: failed to add VLAN 0t

which comes from:

mv88e6xxx_port_vlan_add
-> mv88e6xxx_port_vlan_join:

	if (!vid)
		return -EOPNOTSUPP;

What prevents this condition from triggering in real life? The fact that
when a DSA_NOTIFIER_VLAN_ADD is emitted, it never targets a DSA link
directly. Instead, the notifier will always target either a user port or
a CPU port. DSA links just happen to get dragged in by:

static bool dsa_switch_vlan_match(struct dsa_switch *ds, int port,
				  struct dsa_notifier_vlan_info *info)
{
	...
	if (dsa_is_dsa_port(ds, port))
		return true;
	...
}

So for every DSA VLAN notifier, during the prepare phase, it will just
so happen that there will be somebody to say "no, don't do that".

This will become a problem when the switchdev prepare/commit transactional
model goes away. Every port needs to think on its own. DSA links can no
longer bluff and rely on the fact that the prepare phase will not go
through to the end, because there will be no prepare phase any longer.

Fix this issue before it becomes a problem, by having the "vid == 0"
check earlier than the check whether we are a CPU port / DSA link or not.
Also, the "vid == 0" check becomes unnecessary in the .port_vlan_add
callback, so we can remove it.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2021-01-11 16:00:56 -08:00
..
b53 net: switchdev: remove vid_begin -> vid_end range from VLAN objects 2021-01-11 16:00:56 -08:00
hirschmann net: switchdev: remove vid_begin -> vid_end range from VLAN objects 2021-01-11 16:00:56 -08:00
microchip net: switchdev: remove vid_begin -> vid_end range from VLAN objects 2021-01-11 16:00:56 -08:00
mv88e6xxx net: dsa: mv88e6xxx: deny vid 0 on the CPU port and DSA links too 2021-01-11 16:00:56 -08:00
ocelot net: switchdev: remove vid_begin -> vid_end range from VLAN objects 2021-01-11 16:00:56 -08:00
qca net: dsa: qca: ar9331: fix sleeping function called from invalid context bug 2020-12-16 10:57:35 -08:00
sja1105 net: switchdev: remove vid_begin -> vid_end range from VLAN objects 2021-01-11 16:00:56 -08:00
bcm_sf2_cfp.c net: switchdev: remove vid_begin -> vid_end range from VLAN objects 2021-01-11 16:00:56 -08:00
bcm_sf2_regs.h net: dsa: bcm_sf2: support BCM4908's integrated switch 2021-01-09 19:18:10 -08:00
bcm_sf2.c net: dsa: bcm_sf2: support BCM4908's integrated switch 2021-01-09 19:18:10 -08:00
bcm_sf2.h net: dsa: bcm_sf2: recalculate switch clock rate based on ports 2020-09-03 15:08:03 -07:00
dsa_loop_bdinfo.c treewide: Add SPDX license identifier for more missed files 2019-05-21 10:50:45 +02:00
dsa_loop.c net: switchdev: remove vid_begin -> vid_end range from VLAN objects 2021-01-11 16:00:56 -08:00
dsa_loop.h
Kconfig net: dsa: Add DSA driver for Hirschmann Hellcreek switches 2020-11-05 14:04:49 -08:00
lan9303_i2c.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 174 2019-05-30 11:26:41 -07:00
lan9303_mdio.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 174 2019-05-30 11:26:41 -07:00
lan9303-core.c net: dsa: lan9303: fix variable 'res' set but not used 2020-07-05 15:48:19 -07:00
lan9303.h
lantiq_gswip.c net: switchdev: remove vid_begin -> vid_end range from VLAN objects 2021-01-11 16:00:56 -08:00
lantiq_pce.h net: dsa: Use the correct style for SPDX License Identifier 2019-09-22 15:25:08 -07:00
Makefile net: dsa: Add DSA driver for Hirschmann Hellcreek switches 2020-11-05 14:04:49 -08:00
mt7530.c net: switchdev: remove vid_begin -> vid_end range from VLAN objects 2021-01-11 16:00:56 -08:00
mt7530.h net: dsa: mt7530: support setting ageing time 2020-12-08 16:18:26 -08:00
mv88e6060.c net: dsa: Get information about stacked DSA protocol 2020-01-08 16:01:13 -08:00
mv88e6060.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
qca8k.c net: switchdev: remove vid_begin -> vid_end range from VLAN objects 2021-01-11 16:00:56 -08:00
qca8k.h net: dsa: qca8k: Add 802.1q VLAN support 2020-08-03 15:45:39 -07:00
realtek-smi-core.c net: dsa: rtl8366rb: Roof MTU for switch 2020-10-10 11:25:05 -07:00
realtek-smi-core.h net: dsa: rtl8366rb: Roof MTU for switch 2020-10-10 11:25:05 -07:00
rtl8366.c net: switchdev: remove vid_begin -> vid_end range from VLAN objects 2021-01-11 16:00:56 -08:00
rtl8366rb.c net: dsa: rtl8366rb: Roof MTU for switch 2020-10-10 11:25:05 -07:00
vitesse-vsc73xx-core.c net: dsa: vsc73xx: make the MTU configurable 2020-03-27 16:07:25 -07:00
vitesse-vsc73xx-platform.c net: dsa: vitesse-vsc73xx: Convert to plain comments to avoid kerneldoc warnings 2020-07-05 15:49:03 -07:00
vitesse-vsc73xx-spi.c net: dsa: vitesse-vsc73xx: Convert to plain comments to avoid kerneldoc warnings 2020-07-05 15:49:03 -07:00
vitesse-vsc73xx.h net: dsa: vsc73xx: Split vsc73xx driver 2019-07-07 14:16:32 -07:00