Commit ad103e03 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'sja1105-fixes'



Vladimir Oltean says:

====================
Fix VLAN checks for SJA1105 DSA tc-flower filters

This fixes a ridiculous situation where the driver, in VLAN-unaware
mode, would refuse accepting any tc filter:

tc filter replace dev sw1p3 ingress flower skip_sw \
	dst_mac 42:be:24:9b:76:20 \
	action gate (...)
Error: sja1105: Can only gate based on {DMAC, VID, PCP}.

tc filter replace dev sw1p3 ingress protocol 802.1Q flower skip_sw \
	vlan_id 1 vlan_prio 0 dst_mac 42:be:24:9b:76:20 \
	action gate (...)
Error: sja1105: Can only gate based on DMAC.

So, without changing the VLAN awareness state, it says it doesn't want
VLAN-aware rules, and it doesn't want VLAN-unaware rules either. One
would say it's in Schrodinger's state...

Now, the situation has been made worse by commit 7f14937f ("net:
dsa: sja1105: keep the VLAN awareness state in a driver variable"),
which made VLAN awareness a ternary attribute, but after inspecting the
code from before that patch with a truth table, it looks like the
logical bug was there even before.

While attempting to fix this, I also noticed some leftover debugging
code in one of the places that needed to be fixed. It would have
appeared in the context of patch 3/3 anyway, so I decided to create a
patch that removes it.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents b64ee485 5182a622
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -342,7 +342,9 @@ int sja1105_vl_redirect(struct sja1105_private *priv, int port,
		NL_SET_ERR_MSG_MOD(extack,
				   "Can only redirect based on DMAC");
		return -EOPNOTSUPP;
	} else if (key->type != SJA1105_KEY_VLAN_AWARE_VL) {
	} else if ((priv->vlan_state == SJA1105_VLAN_BEST_EFFORT ||
		    priv->vlan_state == SJA1105_VLAN_FILTERING_FULL) &&
		   key->type != SJA1105_KEY_VLAN_AWARE_VL) {
		NL_SET_ERR_MSG_MOD(extack,
				   "Can only redirect based on {DMAC, VID, PCP}");
		return -EOPNOTSUPP;
@@ -588,14 +590,12 @@ int sja1105_vl_gate(struct sja1105_private *priv, int port,

	if (priv->vlan_state == SJA1105_VLAN_UNAWARE &&
	    key->type != SJA1105_KEY_VLAN_UNAWARE_VL) {
		dev_err(priv->ds->dev, "1: vlan state %d key type %d\n",
			priv->vlan_state, key->type);
		NL_SET_ERR_MSG_MOD(extack,
				   "Can only gate based on DMAC");
		return -EOPNOTSUPP;
	} else if (key->type != SJA1105_KEY_VLAN_AWARE_VL) {
		dev_err(priv->ds->dev, "2: vlan state %d key type %d\n",
			priv->vlan_state, key->type);
	} else if ((priv->vlan_state == SJA1105_VLAN_BEST_EFFORT ||
		    priv->vlan_state == SJA1105_VLAN_FILTERING_FULL) &&
		   key->type != SJA1105_KEY_VLAN_AWARE_VL) {
		NL_SET_ERR_MSG_MOD(extack,
				   "Can only gate based on {DMAC, VID, PCP}");
		return -EOPNOTSUPP;