Skip to content

Commit 277b7f6

Browse files
vladimirolteangregkh
authored andcommitted
net: mscc: ocelot: fix backwards compatibility with single-chain tc-flower offload
[ Upstream commit 8e0341a ] ACL rules can be offloaded to VCAP IS2 either through chain 0, or, since the blamed commit, through a chain index whose number encodes a specific PAG (Policy Action Group) and lookup number. The chain number is translated through ocelot_chain_to_pag() into a PAG, and through ocelot_chain_to_lookup() into a lookup number. The problem with the blamed commit is that the above 2 functions don't have special treatment for chain 0. So ocelot_chain_to_pag(0) returns filter->pag = 224, which is in fact -32, but the "pag" field is an u8. So we end up programming the hardware with VCAP IS2 entries having a PAG of 224. But the way in which the PAG works is that it defines a subset of VCAP IS2 filters which should match on a packet. The default PAG is 0, and previous VCAP IS1 rules (which we offload using 'goto') can modify it. So basically, we are installing filters with a PAG on which no packet will ever match. This is the hardware equivalent of adding filters to a chain which has no 'goto' to it. Restore the previous functionality by making ACL filters offloaded to chain 0 go to PAG 0 and lookup number 0. The choice of PAG is clearly correct, but the choice of lookup number isn't "as before" (which was to leave the lookup a "don't care"). However, lookup 0 should be fine, since even though there are ACL actions (policers) which have a requirement to be used in a specific lookup, that lookup is 0. Fixes: 226e9cd ("net: mscc: ocelot: only install TCAM entries into a specific lookup and PAG") Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Link: https://lore.kernel.org/r/20220316192117.2568261-1-vladimir.oltean@nxp.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 2550afb commit 277b7f6

1 file changed

Lines changed: 15 additions & 1 deletion

File tree

drivers/net/ethernet/mscc/ocelot_flower.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ static int ocelot_chain_to_block(int chain, bool ingress)
5454
*/
5555
static int ocelot_chain_to_lookup(int chain)
5656
{
57+
/* Backwards compatibility with older, single-chain tc-flower
58+
* offload support in Ocelot
59+
*/
60+
if (chain == 0)
61+
return 0;
62+
5763
return (chain / VCAP_LOOKUP) % 10;
5864
}
5965

@@ -62,7 +68,15 @@ static int ocelot_chain_to_lookup(int chain)
6268
*/
6369
static int ocelot_chain_to_pag(int chain)
6470
{
65-
int lookup = ocelot_chain_to_lookup(chain);
71+
int lookup;
72+
73+
/* Backwards compatibility with older, single-chain tc-flower
74+
* offload support in Ocelot
75+
*/
76+
if (chain == 0)
77+
return 0;
78+
79+
lookup = ocelot_chain_to_lookup(chain);
6680

6781
/* calculate PAG value as chain index relative to the first PAG */
6882
return chain - VCAP_IS2_CHAIN(lookup, 0);

0 commit comments

Comments
 (0)