mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
![]() 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:
|
||
---|---|---|
.. | ||
Kconfig | ||
Makefile | ||
ocelot.c | ||
ocelot.h | ||
ocelot_devlink.c | ||
ocelot_fdma.c | ||
ocelot_fdma.h | ||
ocelot_flower.c | ||
ocelot_io.c | ||
ocelot_mrp.c | ||
ocelot_net.c | ||
ocelot_police.c | ||
ocelot_police.h | ||
ocelot_ptp.c | ||
ocelot_qs.h | ||
ocelot_rew.h | ||
ocelot_vcap.c | ||
ocelot_vcap.h | ||
ocelot_vsc7514.c | ||
vsc7514_regs.c |