cxgb4: update LE-TCAM collection for T6
authorRahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Wed, 16 May 2018 14:21:15 +0000 (19:51 +0530)
committerDavid S. Miller <davem@davemloft.net>
Wed, 16 May 2018 19:01:30 +0000 (15:01 -0400)
For T6, clip table is separated from main TCAM. So, update LE-TCAM
collection logic to collect clip table TCAM as well. IPv6 takes
4 entries in clip table TCAM compared to 2 entries in main TCAM.

Also, in case of errors, keep LE-TCAM collected so far and set the
status to partial dump.

Signed-off-by: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Signed-off-by: Ganesh Goudar <ganeshgr@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/chelsio/cxgb4/cudbg_entity.h
drivers/net/ethernet/chelsio/cxgb4/cudbg_if.h
drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c
drivers/net/ethernet/chelsio/cxgb4/t4_regs.h

index b57acb8dc35bd1325d2e1932b9280d49c61d243f..740a18ba422935ea06a2e3977f3f57a544cd76be 100644 (file)
@@ -235,6 +235,9 @@ struct cudbg_vpd_data {
 };
 
 #define CUDBG_MAX_TCAM_TID 0x800
+#define CUDBG_T6_CLIP 1536
+#define CUDBG_MAX_TID_COMP_EN 6144
+#define CUDBG_MAX_TID_COMP_DIS 3072
 
 enum cudbg_le_entry_types {
        LE_ET_UNKNOWN = 0,
index 8568a51f641483ac1ec352ef0d4b0f28dac35102..215fe6260fd75d348b93558e8f354e6a7359bdc8 100644 (file)
@@ -24,6 +24,7 @@
 #define CUDBG_STATUS_NOT_IMPLEMENTED -28
 #define CUDBG_SYSTEM_ERROR -29
 #define CUDBG_STATUS_CCLK_NOT_DEFINED -32
+#define CUDBG_STATUS_PARTIAL_DATA -41
 
 #define CUDBG_MAJOR_VERSION 1
 #define CUDBG_MINOR_VERSION 14
index 9da6f57901a9ae8317d0a8fe74066772a971d0fa..4feb7eca0acf6167dd7473a7152429d083923284 100644 (file)
@@ -2366,8 +2366,11 @@ void cudbg_fill_le_tcam_info(struct adapter *padap,
        value = t4_read_reg(padap, LE_DB_ROUTING_TABLE_INDEX_A);
        tcam_region->routing_start = value;
 
-       /*Get clip table index */
-       value = t4_read_reg(padap, LE_DB_CLIP_TABLE_INDEX_A);
+       /* Get clip table index. For T6 there is separate CLIP TCAM */
+       if (is_t6(padap->params.chip))
+               value = t4_read_reg(padap, LE_DB_CLCAM_TID_BASE_A);
+       else
+               value = t4_read_reg(padap, LE_DB_CLIP_TABLE_INDEX_A);
        tcam_region->clip_start = value;
 
        /* Get filter table index */
@@ -2392,8 +2395,16 @@ void cudbg_fill_le_tcam_info(struct adapter *padap,
                                               tcam_region->tid_hash_base;
                }
        } else { /* hash not enabled */
-               tcam_region->max_tid = CUDBG_MAX_TCAM_TID;
+               if (is_t6(padap->params.chip))
+                       tcam_region->max_tid = (value & ASLIPCOMPEN_F) ?
+                                              CUDBG_MAX_TID_COMP_EN :
+                                              CUDBG_MAX_TID_COMP_DIS;
+               else
+                       tcam_region->max_tid = CUDBG_MAX_TCAM_TID;
        }
+
+       if (is_t6(padap->params.chip))
+               tcam_region->max_tid += CUDBG_T6_CLIP;
 }
 
 int cudbg_collect_le_tcam(struct cudbg_init *pdbg_init,
@@ -2423,18 +2434,31 @@ int cudbg_collect_le_tcam(struct cudbg_init *pdbg_init,
        for (i = 0; i < tcam_region.max_tid; ) {
                rc = cudbg_read_tid(pdbg_init, i, tid_data);
                if (rc) {
-                       cudbg_err->sys_err = rc;
-                       cudbg_put_buff(pdbg_init, &temp_buff);
-                       return rc;
+                       cudbg_err->sys_warn = CUDBG_STATUS_PARTIAL_DATA;
+                       /* Update tcam header and exit */
+                       tcam_region.max_tid = i;
+                       memcpy(temp_buff.data, &tcam_region,
+                              sizeof(struct cudbg_tcam));
+                       goto out;
                }
 
-               /* ipv6 takes two tids */
-               cudbg_is_ipv6_entry(tid_data, tcam_region) ? i += 2 : i++;
+               if (cudbg_is_ipv6_entry(tid_data, tcam_region)) {
+                       /* T6 CLIP TCAM: ipv6 takes 4 entries */
+                       if (is_t6(padap->params.chip) &&
+                           i >= tcam_region.clip_start &&
+                           i < tcam_region.clip_start + CUDBG_T6_CLIP)
+                               i += 4;
+                       else /* Main TCAM: ipv6 takes two tids */
+                               i += 2;
+               } else {
+                       i++;
+               }
 
                tid_data++;
                bytes += sizeof(struct cudbg_tid_data);
        }
 
+out:
        return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
index 843f8cada1deba40b6f38cf475f472d53e6938d5..6b55aa2eb2a5a8be6e93bd82ca6c535086eb307a 100644 (file)
 #define LE_DB_HASH_TID_BASE_A 0x19c30
 #define LE_DB_HASH_TBL_BASE_ADDR_A 0x19c30
 #define LE_DB_INT_CAUSE_A 0x19c3c
+#define LE_DB_CLCAM_TID_BASE_A 0x19df4
 #define LE_DB_TID_HASHBASE_A 0x19df8
 #define T6_LE_DB_HASH_TID_BASE_A 0x19df8