cxgb4: fix missed high priority region calculation
authorShahjada Abul Husain <shahjada@chelsio.com>
Tue, 17 Dec 2019 06:42:08 +0000 (12:12 +0530)
committerDavid S. Miller <davem@davemloft.net>
Wed, 18 Dec 2019 06:33:54 +0000 (22:33 -0800)
commit c21939998802 ("cxgb4: add support for high priority filters")
has missed considering high priority region calculation in some code
paths. This patch fixes them.

Fixes: c21939998802 ("cxgb4: add support for high priority filters")
Signed-off-by: Shahjada Abul Husain <shahjada@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c
drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c
drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_matchall.c

index 6a5b034..44deabf 100644 (file)
@@ -369,12 +369,16 @@ static int get_filter_count(struct adapter *adapter, unsigned int fidx,
                        return -E2BIG;
                }
        } else {
-               if ((fidx != (adapter->tids.nftids +
-                             adapter->tids.nsftids - 1)) &&
-                   fidx >= adapter->tids.nftids)
+               if ((fidx != (adapter->tids.nftids + adapter->tids.nsftids +
+                             adapter->tids.nhpftids - 1)) &&
+                   fidx >= (adapter->tids.nftids + adapter->tids.nhpftids))
                        return -E2BIG;
 
-               f = &adapter->tids.ftid_tab[fidx];
+               if (fidx < adapter->tids.nhpftids)
+                       f = &adapter->tids.hpftid_tab[fidx];
+               else
+                       f = &adapter->tids.ftid_tab[fidx -
+                                                   adapter->tids.nhpftids];
                if (!f->valid)
                        return -EINVAL;
        }
@@ -480,6 +484,7 @@ int cxgb4_get_free_ftid(struct net_device *dev, int family)
                ftid -= n;
        }
        spin_unlock_bh(&t->ftid_lock);
+       ftid += t->nhpftids;
 
        return found ? ftid : -ENOMEM;
 }
@@ -815,10 +820,14 @@ int delete_filter(struct adapter *adapter, unsigned int fidx)
        struct filter_entry *f;
        int ret;
 
-       if (fidx >= adapter->tids.nftids + adapter->tids.nsftids)
+       if (fidx >= adapter->tids.nftids + adapter->tids.nsftids +
+                   adapter->tids.nhpftids)
                return -EINVAL;
 
-       f = &adapter->tids.ftid_tab[fidx];
+       if (fidx < adapter->tids.nhpftids)
+               f = &adapter->tids.hpftid_tab[fidx];
+       else
+               f = &adapter->tids.ftid_tab[fidx - adapter->tids.nhpftids];
        ret = writable_filter(f);
        if (ret)
                return ret;
index 706b71e..bb5513b 100644 (file)
@@ -672,7 +672,8 @@ int cxgb4_tc_flower_replace(struct net_device *dev,
                 * 0 to driver. However, the hardware TCAM index
                 * starts from 0. Hence, the -1 here.
                 */
-               if (cls->common.prio <= adap->tids.nftids) {
+               if (cls->common.prio <= (adap->tids.nftids +
+                                        adap->tids.nhpftids)) {
                        fidx = cls->common.prio - 1;
                        if (fidx < adap->tids.nhpftids)
                                fs->prio = 1;
index 53e8db8..24c3c2d 100644 (file)
@@ -137,7 +137,7 @@ static int cxgb4_matchall_alloc_filter(struct net_device *dev,
         * -1 here. 1 slot is enough to create a wildcard matchall
         * VIID rule.
         */
-       if (cls->common.prio <= adap->tids.nftids)
+       if (cls->common.prio <= (adap->tids.nftids + adap->tids.nhpftids))
                fidx = cls->common.prio - 1;
        else
                fidx = cxgb4_get_free_ftid(dev, PF_INET);