cxgb4: Differentiate between stids between server and filter region
authorHariprasad Shenai <hariprasad@chelsio.com>
Wed, 12 Aug 2015 11:25:06 +0000 (16:55 +0530)
committerDavid S. Miller <davem@davemloft.net>
Wed, 12 Aug 2015 23:42:12 +0000 (16:42 -0700)
For T4 adapter, offloaded servers tid for IPv4 connections are
allocated from filter region. So add a new field for server filter tid if
server tid is allocated from filter region.

Signed-off-by: Hariprasad Shenai <hariprasad@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h

index df6cba1..f35dd22 100644 (file)
@@ -1548,7 +1548,7 @@ int cxgb4_alloc_sftid(struct tid_info *t, int family, void *data)
                t->stid_tab[stid].data = data;
                stid -= t->nstids;
                stid += t->sftid_base;
-               t->stids_in_use++;
+               t->sftids_in_use++;
        }
        spin_unlock_bh(&t->stid_lock);
        return stid;
@@ -1573,10 +1573,14 @@ void cxgb4_free_stid(struct tid_info *t, unsigned int stid, int family)
        else
                bitmap_release_region(t->stid_bmap, stid, 2);
        t->stid_tab[stid].data = NULL;
-       if (family == PF_INET)
-               t->stids_in_use--;
-       else
-               t->stids_in_use -= 4;
+       if (stid < t->nstids) {
+               if (family == PF_INET)
+                       t->stids_in_use--;
+               else
+                       t->stids_in_use -= 4;
+       } else {
+               t->sftids_in_use--;
+       }
        spin_unlock_bh(&t->stid_lock);
 }
 EXPORT_SYMBOL(cxgb4_free_stid);
@@ -1707,6 +1711,7 @@ static int tid_init(struct tid_info *t)
        spin_lock_init(&t->atid_lock);
 
        t->stids_in_use = 0;
+       t->sftids_in_use = 0;
        t->afree = NULL;
        t->atids_in_use = 0;
        atomic_set(&t->tids_in_use, 0);
index f61fed1..c3a8be5 100644 (file)
@@ -117,6 +117,7 @@ struct tid_info {
 
        spinlock_t stid_lock;
        unsigned int stids_in_use;
+       unsigned int sftids_in_use;
 
        /* TIDs in the TCAM */
        atomic_t tids_in_use;