diff --git a/drivers/net/bnxt/hsi_struct_def_dpdk.h b/drivers/net/bnxt/hsi_struct_def_dpdk.h
index 2a1e6ab97e..77981b5cdb 100644
--- a/drivers/net/bnxt/hsi_struct_def_dpdk.h
+++ b/drivers/net/bnxt/hsi_struct_def_dpdk.h
@@ -1058,8 +1058,8 @@ struct hwrm_err_output {
 #define HWRM_VERSION_MINOR 10
 #define HWRM_VERSION_UPDATE 2
 /* non-zero means beta version */
-#define HWRM_VERSION_RSVD 54
-#define HWRM_VERSION_STR "1.10.2.54"
+#define HWRM_VERSION_RSVD 55
+#define HWRM_VERSION_STR "1.10.2.55"
 
 /****************
  * hwrm_ver_get *
@@ -46253,13 +46253,22 @@ struct hwrm_tf_tbl_type_get_input {
 	/* Control flags. */
 	uint16_t	flags;
 	/* Indicates the flow direction. */
-	#define HWRM_TF_TBL_TYPE_GET_INPUT_FLAGS_DIR     UINT32_C(0x1)
+	#define HWRM_TF_TBL_TYPE_GET_INPUT_FLAGS_DIR \
+		UINT32_C(0x1)
 	/* If this bit set to 0, then it indicates rx flow. */
-	#define HWRM_TF_TBL_TYPE_GET_INPUT_FLAGS_DIR_RX    UINT32_C(0x0)
+	#define HWRM_TF_TBL_TYPE_GET_INPUT_FLAGS_DIR_RX \
+		UINT32_C(0x0)
 	/* If this bit is set to 1, then it indicates tx flow. */
-	#define HWRM_TF_TBL_TYPE_GET_INPUT_FLAGS_DIR_TX    UINT32_C(0x1)
+	#define HWRM_TF_TBL_TYPE_GET_INPUT_FLAGS_DIR_TX \
+		UINT32_C(0x1)
 	#define HWRM_TF_TBL_TYPE_GET_INPUT_FLAGS_DIR_LAST \
 		HWRM_TF_TBL_TYPE_GET_INPUT_FLAGS_DIR_TX
+	/*
+	 * When set use the special access register access to clear
+	 * the table entry on read.
+	 */
+	#define HWRM_TF_TBL_TYPE_GET_INPUT_FLAGS_CLEAR_ON_READ \
+		UINT32_C(0x2)
 	/* unused. */
 	uint8_t	unused0[2];
 	/*
@@ -48489,13 +48498,22 @@ struct hwrm_tf_tbl_type_bulk_get_input {
 	/* Control flags. */
 	uint16_t	flags;
 	/* Indicates the flow direction. */
-	#define HWRM_TF_TBL_TYPE_BULK_GET_INPUT_FLAGS_DIR     UINT32_C(0x1)
+	#define HWRM_TF_TBL_TYPE_BULK_GET_INPUT_FLAGS_DIR \
+		UINT32_C(0x1)
 	/* If this bit set to 0, then it indicates rx flow. */
-	#define HWRM_TF_TBL_TYPE_BULK_GET_INPUT_FLAGS_DIR_RX    UINT32_C(0x0)
+	#define HWRM_TF_TBL_TYPE_BULK_GET_INPUT_FLAGS_DIR_RX \
+		UINT32_C(0x0)
 	/* If this bit is set to 1, then it indicates tx flow. */
-	#define HWRM_TF_TBL_TYPE_BULK_GET_INPUT_FLAGS_DIR_TX    UINT32_C(0x1)
+	#define HWRM_TF_TBL_TYPE_BULK_GET_INPUT_FLAGS_DIR_TX \
+		UINT32_C(0x1)
 	#define HWRM_TF_TBL_TYPE_BULK_GET_INPUT_FLAGS_DIR_LAST \
 		HWRM_TF_TBL_TYPE_BULK_GET_INPUT_FLAGS_DIR_TX
+	/*
+	 * When set use the special access register access to clear
+	 * the table entries on read.
+	 */
+	#define HWRM_TF_TBL_TYPE_BULK_GET_INPUT_FLAGS_CLEAR_ON_READ \
+		UINT32_C(0x2)
 	/* unused. */
 	uint8_t	unused0[2];
 	/*
diff --git a/drivers/net/bnxt/tf_core/tf_msg.c b/drivers/net/bnxt/tf_core/tf_msg.c
index 0fbb2fe837..ea6e2af7ce 100644
--- a/drivers/net/bnxt/tf_core/tf_msg.c
+++ b/drivers/net/bnxt/tf_core/tf_msg.c
@@ -1851,7 +1851,8 @@ tf_msg_get_tbl_entry(struct tf *tfp,
 		     uint16_t hcapi_type,
 		     uint16_t size,
 		     uint8_t *data,
-		     uint32_t index)
+		     uint32_t index,
+		     bool clear_on_read)
 {
 	int rc;
 	struct hwrm_tf_tbl_type_get_input req = { 0 };
@@ -1860,6 +1861,7 @@ tf_msg_get_tbl_entry(struct tf *tfp,
 	uint8_t fw_session_id;
 	struct tf_dev_info *dev;
 	struct tf_session *tfs;
+	uint32_t flags = 0;
 
 	/* Retrieve the session information */
 	rc = tf_session_get_session_internal(tfp, &tfs);
@@ -1889,10 +1891,16 @@ tf_msg_get_tbl_entry(struct tf *tfp,
 			    strerror(-rc));
 		return rc;
 	}
+	flags = (dir == TF_DIR_TX ?
+		 HWRM_TF_TBL_TYPE_GET_INPUT_FLAGS_DIR_TX :
+		 HWRM_TF_TBL_TYPE_GET_INPUT_FLAGS_DIR_RX);
+
+	if (clear_on_read)
+		flags |= HWRM_TF_TBL_TYPE_GET_INPUT_FLAGS_CLEAR_ON_READ;
 
 	/* Populate the request */
 	req.fw_session_id = tfp_cpu_to_le_32(fw_session_id);
-	req.flags = tfp_cpu_to_le_16(dir);
+	req.flags = tfp_cpu_to_le_16(flags);
 	req.type = tfp_cpu_to_le_32(hcapi_type);
 	req.index = tfp_cpu_to_le_32(index);
 
@@ -2105,7 +2113,8 @@ tf_msg_bulk_get_tbl_entry(struct tf *tfp,
 			  uint32_t starting_idx,
 			  uint16_t num_entries,
 			  uint16_t entry_sz_in_bytes,
-			  uint64_t physical_mem_addr)
+			  uint64_t physical_mem_addr,
+			  bool clear_on_read)
 {
 	int rc;
 	struct tfp_send_msg_parms parms = { 0 };
@@ -2115,6 +2124,7 @@ tf_msg_bulk_get_tbl_entry(struct tf *tfp,
 	uint8_t fw_session_id;
 	struct tf_dev_info *dev;
 	struct tf_session *tfs;
+	uint32_t flags = 0;
 
 	/* Retrieve the session information */
 	rc = tf_session_get_session(tfp, &tfs);
@@ -2144,10 +2154,16 @@ tf_msg_bulk_get_tbl_entry(struct tf *tfp,
 			    strerror(-rc));
 		return rc;
 	}
+	flags = (dir == TF_DIR_TX ?
+		 HWRM_TF_TBL_TYPE_BULK_GET_INPUT_FLAGS_DIR_TX :
+		 HWRM_TF_TBL_TYPE_BULK_GET_INPUT_FLAGS_DIR_RX);
+
+	if (clear_on_read)
+		flags |= HWRM_TF_TBL_TYPE_BULK_GET_INPUT_FLAGS_CLEAR_ON_READ;
 
 	/* Populate the request */
 	req.fw_session_id = tfp_cpu_to_le_32(fw_session_id);
-	req.flags = tfp_cpu_to_le_16(dir);
+	req.flags = tfp_cpu_to_le_16(flags);
 	req.type = tfp_cpu_to_le_32(hcapi_type);
 	req.start_index = tfp_cpu_to_le_32(starting_idx);
 	req.num_entries = tfp_cpu_to_le_32(num_entries);
diff --git a/drivers/net/bnxt/tf_core/tf_msg.h b/drivers/net/bnxt/tf_core/tf_msg.h
index b26b15bfa3..718bc2f3b2 100644
--- a/drivers/net/bnxt/tf_core/tf_msg.h
+++ b/drivers/net/bnxt/tf_core/tf_msg.h
@@ -652,7 +652,8 @@ int tf_msg_get_tbl_entry(struct tf *tfp,
 			 uint16_t hcapi_type,
 			 uint16_t size,
 			 uint8_t *data,
-			 uint32_t index);
+			 uint32_t index,
+			 bool clear_on_read);
 
 /* HWRM Tunneled messages */
 
@@ -704,7 +705,8 @@ int tf_msg_bulk_get_tbl_entry(struct tf *tfp,
 			      uint32_t starting_idx,
 			      uint16_t num_entries,
 			      uint16_t entry_sz_in_bytes,
-			      uint64_t physical_mem_addr);
+			      uint64_t physical_mem_addr,
+			      bool clear_on_read);
 
 /**
  * Sends Set message of a IF Table Type element to the firmware.
diff --git a/drivers/net/bnxt/tf_core/tf_tbl.c b/drivers/net/bnxt/tf_core/tf_tbl.c
index 0a8720e7b6..12eca36491 100644
--- a/drivers/net/bnxt/tf_core/tf_tbl.c
+++ b/drivers/net/bnxt/tf_core/tf_tbl.c
@@ -441,7 +441,8 @@ tf_tbl_get(struct tf *tfp,
 				  hcapi_type,
 				  parms->data_sz_in_bytes,
 				  parms->data,
-				  parms->idx);
+				  parms->idx,
+				  false);
 	if (rc) {
 		TFP_DRV_LOG(ERR,
 			    "%s, Get failed, type:%s, rc:%s\n",
@@ -526,7 +527,8 @@ tf_tbl_bulk_get(struct tf *tfp,
 				       parms->starting_idx,
 				       parms->num_entries,
 				       parms->entry_sz_in_bytes,
-				       parms->physical_mem_addr);
+				       parms->physical_mem_addr,
+				       false);
 	if (rc) {
 		TFP_DRV_LOG(ERR,
 			    "%s, Bulk get failed, type:%s, rc:%s\n",
diff --git a/drivers/net/bnxt/tf_core/tf_tbl_sram.c b/drivers/net/bnxt/tf_core/tf_tbl_sram.c
index 636811bc2d..567f912dfa 100644
--- a/drivers/net/bnxt/tf_core/tf_tbl_sram.c
+++ b/drivers/net/bnxt/tf_core/tf_tbl_sram.c
@@ -539,6 +539,7 @@ tf_tbl_sram_get(struct tf *tfp,
 	struct tf_tbl_sram_get_info_parms iparms = { 0 };
 	struct tf_sram_mgr_is_allocated_parms aparms = { 0 };
 	void *sram_handle = NULL;
+	bool clear_on_read = false;
 
 	TF_CHECK_PARMS3(tfp, parms, parms->data);
 
@@ -608,6 +609,8 @@ tf_tbl_sram_get(struct tf *tfp,
 			    strerror(-rc));
 		return rc;
 	}
+	if (parms->type == TF_TBL_TYPE_ACT_STATS_64)
+		clear_on_read = true;
 
 	/* Get the entry */
 	rc = tf_msg_get_tbl_entry(tfp,
@@ -615,7 +618,8 @@ tf_tbl_sram_get(struct tf *tfp,
 				  hcapi_type,
 				  parms->data_sz_in_bytes,
 				  parms->data,
-				  parms->idx);
+				  parms->idx,
+				  clear_on_read);
 	if (rc) {
 		TFP_DRV_LOG(ERR,
 			    "%s, Get failed, type:%s, rc:%s\n",
@@ -643,6 +647,7 @@ tf_tbl_sram_bulk_get(struct tf *tfp,
 	struct tf_sram_mgr_is_allocated_parms aparms = { 0 };
 	bool allocated = false;
 	void *sram_handle = NULL;
+	bool clear_on_read = false;
 
 	TF_CHECK_PARMS2(tfp, parms);
 
@@ -728,6 +733,9 @@ tf_tbl_sram_bulk_get(struct tf *tfp,
 		return rc;
 	}
 
+	if (parms->type == TF_TBL_TYPE_ACT_STATS_64)
+		clear_on_read = true;
+
 	/* Get the entries */
 	rc = tf_msg_bulk_get_tbl_entry(tfp,
 				       parms->dir,
@@ -735,7 +743,8 @@ tf_tbl_sram_bulk_get(struct tf *tfp,
 				       parms->starting_idx,
 				       parms->num_entries,
 				       parms->entry_sz_in_bytes,
-				       parms->physical_mem_addr);
+				       parms->physical_mem_addr,
+				       clear_on_read);
 	if (rc) {
 		TFP_DRV_LOG(ERR,
 			    "%s, Bulk get failed, type:%s, rc:%s\n",
diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c
index dbc8a3c5bb..f1763e2519 100644
--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c
+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c
@@ -1483,7 +1483,8 @@ bnxt_ulp_port_init(struct bnxt *bp)
 		goto jump_to_error;
 	}
 
-	if (devid != BNXT_ULP_DEVICE_ID_THOR && BNXT_ACCUM_STATS_EN(bp))
+	/* set the accumulation of the stats */
+	if (BNXT_ACCUM_STATS_EN(bp))
 		bp->ulp_ctx->cfg_data->accum_stats = true;
 
 	BNXT_TF_DBG(DEBUG, "BNXT Port:%d ULP port init, accum_stats:%d\n",
