OSDN Git Service

net: mscc: ocelot: add a new ocelot_vcap_block_find_filter_by_id function
authorVladimir Oltean <vladimir.oltean@nxp.com>
Tue, 29 Sep 2020 22:27:32 +0000 (01:27 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 30 Sep 2020 01:26:24 +0000 (18:26 -0700)
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: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mscc/ocelot_vcap.c
drivers/net/ethernet/mscc/ocelot_vcap.h

index 9e1b023..aa6f6a7 100644 (file)
@@ -769,8 +769,8 @@ static int ocelot_vcap_block_get_filter_index(struct ocelot_vcap_block *block,
 }
 
 static struct ocelot_vcap_filter*
-ocelot_vcap_block_find_filter(struct ocelot_vcap_block *block,
-                             int index)
+ocelot_vcap_block_find_filter_by_index(struct ocelot_vcap_block *block,
+                                      int index)
 {
        struct ocelot_vcap_filter *tmp;
        int i = 0;
@@ -784,6 +784,18 @@ ocelot_vcap_block_find_filter(struct ocelot_vcap_block *block,
        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
  * on destination and source MAC addresses, but only on higher-level protocol
  * 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,
        if (ocelot_vcap_is_problematic_mac_etype(filter)) {
                /* Search for any non-MAC_ETYPE rules on the port */
                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 &&
                            ocelot_vcap_is_problematic_non_mac_etype(tmp))
                                return false;
@@ -877,7 +889,7 @@ ocelot_exclusive_mac_etype_filter_rules(struct ocelot *ocelot,
        } else if (ocelot_vcap_is_problematic_non_mac_etype(filter)) {
                /* Search for any MAC_ETYPE rules on the port */
                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 &&
                            ocelot_vcap_is_problematic_mac_etype(tmp))
                                return false;
@@ -916,7 +928,7 @@ int ocelot_vcap_filter_add(struct ocelot *ocelot,
        for (i = block->count - 1; i > index; i--) {
                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);
        }
 
@@ -968,7 +980,7 @@ int ocelot_vcap_filter_del(struct ocelot *ocelot,
        for (i = index; i < block->count; i++) {
                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);
        }
 
@@ -992,7 +1004,7 @@ int ocelot_vcap_filter_stats_update(struct ocelot *ocelot,
        vcap_entry_get(ocelot, filter, index);
 
        /* 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;
        is2_entry_set(ocelot, index, tmp);
 
index 50742d1..7db6da6 100644 (file)
@@ -221,6 +221,8 @@ int ocelot_vcap_filter_del(struct ocelot *ocelot,
                           struct ocelot_vcap_filter *rule);
 int ocelot_vcap_filter_stats_update(struct ocelot *ocelot,
                                    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);
 int ocelot_vcap_init(struct ocelot *ocelot);