summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/mscc/ocelot_vcap.c
diff options
context:
space:
mode:
authorXiaoliang Yang <xiaoliang.yang_1@nxp.com>2020-09-30 01:27:29 +0300
committerDavid S. Miller <davem@davemloft.net>2020-09-29 18:26:24 -0700
commite6ae7c506f801100ba7a1f9f6f0cfc2197bf1989 (patch)
tree250a927cac4e37c6aa7a3b00beb1a569586dfd74 /drivers/net/ethernet/mscc/ocelot_vcap.c
parent7a155fa3d84ef1418ded16ba477b20b2a4c0f528 (diff)
net: mscc: ocelot: calculate vcap offsets correctly for full and quarter entries
When calculating the offsets for the current entry within the row and placing them inside struct vcap_data, the function assumes half key entry (2 keys per row). This patch modifies the vcap_data_offset_get() function to calculate a correct data offset when the setting VCAP Type-Group of a key to VCAP_TG_FULL or VCAP_TG_QUARTER. This is needed because, for example, VCAP ES0 only supports full keys. Also rename the 'count' variable to 'num_entries_per_row' to make the function just one tiny bit easier to follow. Signed-off-by: Xiaoliang Yang <xiaoliang.yang_1@nxp.com> Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/mscc/ocelot_vcap.c')
-rw-r--r--drivers/net/ethernet/mscc/ocelot_vcap.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/net/ethernet/mscc/ocelot_vcap.c b/drivers/net/ethernet/mscc/ocelot_vcap.c
index b736c3d3df2f..3f7d3fbaa1fc 100644
--- a/drivers/net/ethernet/mscc/ocelot_vcap.c
+++ b/drivers/net/ethernet/mscc/ocelot_vcap.c
@@ -177,8 +177,21 @@ static void vcap_data_offset_get(const struct vcap_props *vcap,
int i, col, offset, count, cnt, base;
u32 width = vcap->tg_width;
- count = (data->tg_sw == VCAP_TG_HALF ? 2 : 4);
- col = (ix % 2);
+ switch (data->tg_sw) {
+ case VCAP_TG_FULL:
+ count = 1;
+ break;
+ case VCAP_TG_HALF:
+ count = 2;
+ break;
+ case VCAP_TG_QUARTER:
+ count = 4;
+ break;
+ default:
+ return;
+ }
+
+ col = (ix % count);
cnt = (vcap->sw_count / count);
base = (vcap->sw_count - col * cnt - cnt);
data->tg_value = 0;