From: Kumar Sanghvi <kuma...@chelsio.com>

IPv6 uses 2 TIDs with CLIP enabled and 4 TIDs without CLIP.
Currently we are incrementing STIDs in use by 1 for both IPv4 and IPv6 which
is wrong.

Further, driver currently does not have interface to query if CLIP is programmed
for particular IPv6 address. So, in this patch we increment/decrement TIDs in 
use
by 4 for IPv6 assuming absence of CLIP. Such assumption keeps us on safe side 
and
we don't end up allocating more stids for IPv6 than actually supported.

Based on original work by Santosh Rastapur <sant...@chelsio.com>

Signed-off-by: Hariprasad Shenai <haripra...@chelsio.com>
Signed-off-by: Kumar Sanghvi <kuma...@chelsio.com>
---
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c 
b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
index 2cd7098..4bccfca 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
@@ -2986,7 +2986,14 @@ int cxgb4_alloc_stid(struct tid_info *t, int family, 
void *data)
        if (stid >= 0) {
                t->stid_tab[stid].data = data;
                stid += t->stid_base;
-               t->stids_in_use++;
+               /* IPv6 requires max of 520 bits or 16 cells in TCAM
+                * This is equivalent to 4 TIDs. With CLIP enabled it
+                * needs 2 TIDs.
+                */
+               if (family == PF_INET)
+                       t->stids_in_use++;
+               else
+                       t->stids_in_use += 4;
        }
        spin_unlock_bh(&t->stid_lock);
        return stid;
@@ -3032,10 +3039,14 @@ void cxgb4_free_stid(struct tid_info *t, unsigned int 
stid, int family)
                bitmap_release_region(t->stid_bmap, stid, 2);
        t->stid_tab[stid].data = NULL;
        t->stids_in_use--;
-       if (stid < t->nstids)
-               t->stids_in_use--;
-       else
+       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);
-- 
1.8.0

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to