Commit 085f5b91 authored by Vladimir Oltean's avatar Vladimir Oltean Committed by David S. Miller

net: mscc: ocelot: add a new ocelot_vcap_block_find_filter_by_id function

And rename the existing find to ocelot_vcap_block_find_filter_by_index.
The index is the position in the TCAM, and the id is the flow cookie
given by tc.
Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 64294263
...@@ -769,8 +769,8 @@ static int ocelot_vcap_block_get_filter_index(struct ocelot_vcap_block *block, ...@@ -769,8 +769,8 @@ static int ocelot_vcap_block_get_filter_index(struct ocelot_vcap_block *block,
} }
static struct ocelot_vcap_filter* static struct ocelot_vcap_filter*
ocelot_vcap_block_find_filter(struct ocelot_vcap_block *block, ocelot_vcap_block_find_filter_by_index(struct ocelot_vcap_block *block,
int index) int index)
{ {
struct ocelot_vcap_filter *tmp; struct ocelot_vcap_filter *tmp;
int i = 0; int i = 0;
...@@ -784,6 +784,18 @@ ocelot_vcap_block_find_filter(struct ocelot_vcap_block *block, ...@@ -784,6 +784,18 @@ ocelot_vcap_block_find_filter(struct ocelot_vcap_block *block,
return NULL; return NULL;
} }
struct ocelot_vcap_filter *
ocelot_vcap_block_find_filter_by_id(struct ocelot_vcap_block *block, int id)
{
struct ocelot_vcap_filter *filter;
list_for_each_entry(filter, &block->rules, list)
if (filter->id == id)
return filter;
return NULL;
}
/* If @on=false, then SNAP, ARP, IP and OAM frames will not match on keys based /* If @on=false, then SNAP, ARP, IP and OAM frames will not match on keys based
* on destination and source MAC addresses, but only on higher-level protocol * on destination and source MAC addresses, but only on higher-level protocol
* information. The only frame types to match on keys containing MAC addresses * information. The only frame types to match on keys containing MAC addresses
...@@ -865,7 +877,7 @@ ocelot_exclusive_mac_etype_filter_rules(struct ocelot *ocelot, ...@@ -865,7 +877,7 @@ ocelot_exclusive_mac_etype_filter_rules(struct ocelot *ocelot,
if (ocelot_vcap_is_problematic_mac_etype(filter)) { if (ocelot_vcap_is_problematic_mac_etype(filter)) {
/* Search for any non-MAC_ETYPE rules on the port */ /* Search for any non-MAC_ETYPE rules on the port */
for (i = 0; i < block->count; i++) { for (i = 0; i < block->count; i++) {
tmp = ocelot_vcap_block_find_filter(block, i); tmp = ocelot_vcap_block_find_filter_by_index(block, i);
if (tmp->ingress_port_mask & filter->ingress_port_mask && if (tmp->ingress_port_mask & filter->ingress_port_mask &&
ocelot_vcap_is_problematic_non_mac_etype(tmp)) ocelot_vcap_is_problematic_non_mac_etype(tmp))
return false; return false;
...@@ -877,7 +889,7 @@ ocelot_exclusive_mac_etype_filter_rules(struct ocelot *ocelot, ...@@ -877,7 +889,7 @@ ocelot_exclusive_mac_etype_filter_rules(struct ocelot *ocelot,
} else if (ocelot_vcap_is_problematic_non_mac_etype(filter)) { } else if (ocelot_vcap_is_problematic_non_mac_etype(filter)) {
/* Search for any MAC_ETYPE rules on the port */ /* Search for any MAC_ETYPE rules on the port */
for (i = 0; i < block->count; i++) { for (i = 0; i < block->count; i++) {
tmp = ocelot_vcap_block_find_filter(block, i); tmp = ocelot_vcap_block_find_filter_by_index(block, i);
if (tmp->ingress_port_mask & filter->ingress_port_mask && if (tmp->ingress_port_mask & filter->ingress_port_mask &&
ocelot_vcap_is_problematic_mac_etype(tmp)) ocelot_vcap_is_problematic_mac_etype(tmp))
return false; return false;
...@@ -916,7 +928,7 @@ int ocelot_vcap_filter_add(struct ocelot *ocelot, ...@@ -916,7 +928,7 @@ int ocelot_vcap_filter_add(struct ocelot *ocelot,
for (i = block->count - 1; i > index; i--) { for (i = block->count - 1; i > index; i--) {
struct ocelot_vcap_filter *tmp; struct ocelot_vcap_filter *tmp;
tmp = ocelot_vcap_block_find_filter(block, i); tmp = ocelot_vcap_block_find_filter_by_index(block, i);
is2_entry_set(ocelot, i, tmp); is2_entry_set(ocelot, i, tmp);
} }
...@@ -968,7 +980,7 @@ int ocelot_vcap_filter_del(struct ocelot *ocelot, ...@@ -968,7 +980,7 @@ int ocelot_vcap_filter_del(struct ocelot *ocelot,
for (i = index; i < block->count; i++) { for (i = index; i < block->count; i++) {
struct ocelot_vcap_filter *tmp; struct ocelot_vcap_filter *tmp;
tmp = ocelot_vcap_block_find_filter(block, i); tmp = ocelot_vcap_block_find_filter_by_index(block, i);
is2_entry_set(ocelot, i, tmp); is2_entry_set(ocelot, i, tmp);
} }
...@@ -992,7 +1004,7 @@ int ocelot_vcap_filter_stats_update(struct ocelot *ocelot, ...@@ -992,7 +1004,7 @@ int ocelot_vcap_filter_stats_update(struct ocelot *ocelot,
vcap_entry_get(ocelot, filter, index); vcap_entry_get(ocelot, filter, index);
/* After we get the result we need to clear the counters */ /* After we get the result we need to clear the counters */
tmp = ocelot_vcap_block_find_filter(block, index); tmp = ocelot_vcap_block_find_filter_by_index(block, index);
tmp->stats.pkts = 0; tmp->stats.pkts = 0;
is2_entry_set(ocelot, index, tmp); is2_entry_set(ocelot, index, tmp);
......
...@@ -221,6 +221,8 @@ int ocelot_vcap_filter_del(struct ocelot *ocelot, ...@@ -221,6 +221,8 @@ int ocelot_vcap_filter_del(struct ocelot *ocelot,
struct ocelot_vcap_filter *rule); struct ocelot_vcap_filter *rule);
int ocelot_vcap_filter_stats_update(struct ocelot *ocelot, int ocelot_vcap_filter_stats_update(struct ocelot *ocelot,
struct ocelot_vcap_filter *rule); struct ocelot_vcap_filter *rule);
struct ocelot_vcap_filter *
ocelot_vcap_block_find_filter_by_id(struct ocelot_vcap_block *block, int id);
void ocelot_detect_vcap_constants(struct ocelot *ocelot); void ocelot_detect_vcap_constants(struct ocelot *ocelot);
int ocelot_vcap_init(struct ocelot *ocelot); int ocelot_vcap_init(struct ocelot *ocelot);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment