Просмотр исходного кода

qcacmn: Add support for multiple snapshot versions

Add support for multiple version of management Rx reorder
shared snapshots.

CRs-Fixed: 3171325
Change-Id: Idae8d3f8179dc4a60730033e55d5744324133839
Edayilliam Jayadev 3 лет назад
Родитель
Сommit
94d603ee9b

+ 17 - 0
target_if/init_deinit/inc/mlo_global_h_shmem_arena.h

@@ -29,6 +29,8 @@
 #include "wmi.h"
 #include <osdep.h>
 
+#define MGMT_RX_REO_INVALID_SNAPSHOT_VERSION      (-1)
+
 /**
  * wlan_host_mlo_glb_h_shmem_params - MLO global shared memory parameters
  * @major_version: Major version
@@ -60,11 +62,17 @@ struct wlan_host_mlo_glb_rx_reo_per_link_info {
  * @num_links: Number of valid links
  * @valid_link_bmap: Valid link bitmap
  * @link_info: pointer to an array of Rx REO per-link information
+ * @hw_forwaded_snapshot_ver: HW forwaded snapshot version
+ * @fw_forwaded_snapshot_ver: FW forwaded snapshot version
+ * @fw_consumed_snapshot_ver: FW consumed snapshot version
  */
 struct wlan_host_mlo_glb_rx_reo_snapshot_info {
 	uint8_t num_links;
 	uint16_t valid_link_bmap;
 	struct wlan_host_mlo_glb_rx_reo_per_link_info *link_info;
+	uint8_t hw_forwaded_snapshot_ver;
+	uint8_t fw_forwaded_snapshot_ver;
+	uint8_t fw_consumed_snapshot_ver;
 };
 
 /**
@@ -171,5 +179,14 @@ int mgmt_rx_reo_get_num_links(void);
  */
 void *mgmt_rx_reo_get_snapshot_address(
 	uint8_t link_id, enum mgmt_rx_reo_shared_snapshot_id snapshot_id);
+
+/**
+ * mgmt_rx_reo_get_snapshot_version() - Get the version of MGMT Rx REO snapshot
+ * @snapshot_id: ID of the snapshot
+ *
+ * Return: Snapshot version
+ */
+int8_t mgmt_rx_reo_get_snapshot_version
+			(enum mgmt_rx_reo_shared_snapshot_id snapshot_id);
 #endif /* WLAN_MGMT_RX_REO_SUPPORT */
 #endif

+ 68 - 0
target_if/init_deinit/src/mlo_global_h_shmem_arena.c

@@ -27,6 +27,20 @@ static struct wlan_host_mlo_glb_h_shmem_arena_ctx g_shmem_arena_ctx;
 
 #define get_shmem_arena_ctx() (&g_shmem_arena_ctx)
 
+/**
+ * is_field_present_in_tlv() - Check whether a given field is present
+ * in a given TLV
+ * @ptlv: Pointer to start of the TLV
+ * @field_name: name of the field in the TLV structure
+ * @tlv_len: Length of the TLV
+ *
+ * Return: true if the field is present within the TLV,
+ * else false
+ */
+#define is_field_present_in_tlv(ptlv, field_name, tlv_len) \
+	(qdf_offsetof(typeof(*(ptlv)), field_name) < (tlv_len) ? \
+		true : false)
+
 /**
  * get_field_value_in_tlv() - Get the value of a given field in a given TLV
  * @ptlv: Pointer to start of the TLV
@@ -268,6 +282,20 @@ extract_mlo_glb_rx_reo_snapshot_info_tlv(
 		MLO_SHMEM_GLB_LINK_INFO_PARAM_VALID_LINK_BMAP_GET(link_info);
 
 	snapshot_info->valid_link_bmap = valid_link_bmap;
+
+	if (is_field_present_in_tlv(ptlv, snapshot_ver_info, tlv_len)) {
+		uint32_t snapshot_ver_info;
+
+		snapshot_ver_info = get_field_value_in_tlv
+					(ptlv, snapshot_ver_info, tlv_len);
+		snapshot_info->hw_forwaded_snapshot_ver =
+			MLO_SHMEM_GLB_RX_REO_SNAPSHOT_PARAM_HW_FWD_SNAPSHOT_VER_GET(snapshot_ver_info);
+		snapshot_info->fw_forwaded_snapshot_ver =
+			MLO_SHMEM_GLB_RX_REO_SNAPSHOT_PARAM_FW_FWD_SNAPSHOT_VER_GET(snapshot_ver_info);
+		snapshot_info->fw_consumed_snapshot_ver =
+			MLO_SHMEM_GLB_RX_REO_SNAPSHOT_PARAM_FW_CONSUMED_SNAPSHOT_VER_GET(snapshot_ver_info);
+	}
+
 	snapshot_info->num_links =
 			get_num_links_from_valid_link_bitmap(valid_link_bmap);
 	snapshot_info->link_info = qdf_mem_malloc(
@@ -889,4 +917,44 @@ void *mgmt_rx_reo_get_snapshot_address(
 
 	return NULL;
 }
+
+int8_t mgmt_rx_reo_get_snapshot_version(enum mgmt_rx_reo_shared_snapshot_id id)
+{
+	struct wlan_host_mlo_glb_h_shmem_arena_ctx *shmem_arena_ctx;
+	struct wlan_host_mlo_glb_rx_reo_snapshot_info *snapshot_info;
+	int8_t snapshot_version;
+
+	if (id >= MGMT_RX_REO_SHARED_SNAPSHOT_MAX) {
+		target_if_err("Invalid snapshot ID: %d", id);
+		return MGMT_RX_REO_INVALID_SNAPSHOT_VERSION;
+	}
+
+	shmem_arena_ctx = get_shmem_arena_ctx();
+	if (!shmem_arena_ctx) {
+		target_if_err("mlo_glb_h_shmem_arena context is NULL");
+		return MGMT_RX_REO_INVALID_SNAPSHOT_VERSION;
+	}
+
+	snapshot_info = &shmem_arena_ctx->rx_reo_snapshot_info;
+
+	switch (id) {
+	case MGMT_RX_REO_SHARED_SNAPSHOT_MAC_HW:
+		snapshot_version = snapshot_info->hw_forwaded_snapshot_ver;
+		break;
+
+	case MGMT_RX_REO_SHARED_SNAPSHOT_FW_CONSUMED:
+		snapshot_version = snapshot_info->fw_consumed_snapshot_ver;
+		break;
+
+	case MGMT_RX_REO_SHARED_SNAPSHOT_FW_FORWADED:
+		snapshot_version = snapshot_info->fw_forwaded_snapshot_ver;
+		break;
+
+	default:
+		snapshot_version = MGMT_RX_REO_INVALID_SNAPSHOT_VERSION;
+		break;
+	}
+
+	return snapshot_version;
+}
 #endif /* WLAN_MGMT_RX_REO_SUPPORT */

+ 28 - 19
target_if/init_deinit/src/mlo_global_h_shmem_arena_api.c

@@ -26,25 +26,30 @@
 /**
  * mgmt_rx_reo_snapshot_is_valid() - Check if an MGMT Rx REO snapshot is valid
  * @snapshot_low: lower 32-bits of the snapshot
+ * @snapshot_version: snapshot version
  *
  * Return: true if snapshot is valid, else false
  */
-static bool mgmt_rx_reo_snapshot_is_valid(uint32_t snapshot_low)
+static bool mgmt_rx_reo_snapshot_is_valid(uint32_t snapshot_low,
+					  uint8_t snapshot_version)
 {
-	return MLO_SHMEM_MGMT_RX_REO_SNAPSHOT_PARAM_VALID_GET(snapshot_low);
+	return MLO_SHMEM_MGMT_RX_REO_SNAPSHOT_VALID_GET(snapshot_low,
+							snapshot_version);
 }
 
 /**
  * mgmt_rx_reo_snapshot_get_mgmt_pkt_ctr() - Get the management packet counter
  * from an MGMT Rx REO snapshot
  * @snapshot_low: lower 32-bits of the snapshot
+ * @snapshot_version: snapshot version
  *
  * Return: Management packet counter of the snapshot
  */
-static uint16_t mgmt_rx_reo_snapshot_get_mgmt_pkt_ctr(uint32_t snapshot_low)
+static uint16_t mgmt_rx_reo_snapshot_get_mgmt_pkt_ctr(uint32_t snapshot_low,
+						      uint8_t snapshot_version)
 {
-	return MLO_SHMEM_MGMT_RX_REO_SNAPSHOT_PARAM_MGMT_PKT_CTR_GET(
-			snapshot_low);
+	return MLO_SHMEM_MGMT_RX_REO_SNAPSHOT_MGMT_PKT_CTR_GET
+					(snapshot_low, snapshot_version);
 }
 
 /**
@@ -54,26 +59,28 @@ static uint16_t mgmt_rx_reo_snapshot_get_mgmt_pkt_ctr(uint32_t snapshot_low)
  *
  * Return: Redundant management packet counter of the snapshot
  */
-static uint16_t mgmt_rx_reo_snapshot_get_redundant_mgmt_pkt_ctr(
-	uint32_t snapshot_high)
+static uint16_t mgmt_rx_reo_snapshot_get_redundant_mgmt_pkt_ctr
+					(uint32_t snapshot_high)
 {
-	return MLO_SHMEM_MGMT_RX_REO_SNAPSHOT_PARAM_MGMT_PKT_CTR_REDUNDANT_GET(
-			snapshot_high);
+	return MLO_SHMEM_MGMT_RX_REO_SNAPSHOT_MGMT_PKT_CTR_REDUNDANT_GET
+							(snapshot_high);
 }
 
 /**
  * mgmt_rx_reo_snapshot_is_consistent() - Check if an MGMT Rx REO snapshot is
  * consistent
- * @mgmt_pkt_ctr: Management packet counter of the snapshot
- * @redundant_mgmt_pkt_ctr: Redundant management packet counter of the snapshot
+ * @snapshot_low: lower 32-bits of the snapshot
+ * @snapshot_high: higher 32-bits of the snapshot
+ * @snapshot_version: snapshot version
  *
  * Return: true if the snapshot is consistent, else false
  */
-static bool mgmt_rx_reo_snapshot_is_consistent(uint16_t mgmt_pkt_ctr,
-					       uint16_t redundant_mgmt_pkt_ctr)
+static bool mgmt_rx_reo_snapshot_is_consistent(uint32_t snapshot_low,
+					       uint32_t snapshot_high,
+					       uint8_t snapshot_version)
 {
-	return MLO_SHMEM_MGMT_RX_REO_SNAPSHOT_IS_CONSISTENT(
-			mgmt_pkt_ctr, redundant_mgmt_pkt_ctr);
+	return MLO_SHMEM_MGMT_RX_REO_SNAPSHOT_CHECK_CONSISTENCY(snapshot_low,
+					snapshot_high, snapshot_version);
 }
 
 /**
@@ -85,10 +92,10 @@ static bool mgmt_rx_reo_snapshot_is_consistent(uint16_t mgmt_pkt_ctr,
  * Return: Global timestamp of the snapshot
  */
 static uint32_t mgmt_rx_reo_snapshot_get_global_timestamp(
-	uint32_t snapshot_low, uint32_t snapshot_high)
+	uint32_t snapshot_low, uint32_t snapshot_high, uint8_t snapshot_version)
 {
-	return MLO_SHMEM_MGMT_RX_REO_SNAPSHOT_PARAM_GLOBAL_TIMESTAMP_GET_FROM_DWORDS(
-		snapshot_low, snapshot_high);
+	return MLO_SHMEM_MGMT_RX_REO_SNAPSHOT_GLOBAL_TIMESTAMP_GET_FROM_DWORDS
+		(snapshot_low, snapshot_high, snapshot_version);
 }
 
 QDF_STATUS mgmt_rx_reo_register_wifi3_0_ops(
@@ -104,6 +111,8 @@ QDF_STATUS mgmt_rx_reo_register_wifi3_0_ops(
 	reo_low_level_ops->get_num_links = mgmt_rx_reo_get_num_links;
 	reo_low_level_ops->get_snapshot_address =
 		mgmt_rx_reo_get_snapshot_address;
+	reo_low_level_ops->get_snapshot_version =
+		mgmt_rx_reo_get_snapshot_version;
 	reo_low_level_ops->snapshot_is_valid =
 		mgmt_rx_reo_snapshot_is_valid;
 	reo_low_level_ops->snapshot_get_mgmt_pkt_ctr =
@@ -152,7 +161,7 @@ void global_shmem_register_target_recovery_ops(
 #endif
 
 QDF_STATUS global_shmem_register_wifi3_0_ops(
-	struct wlan_lmac_if_global_shmem_local_ops *shmem_local_ops)
+		struct wlan_lmac_if_global_shmem_local_ops *shmem_local_ops)
 {
 	if (!shmem_local_ops) {
 		target_if_err("Low level ops of global shmem is NULL");

+ 64 - 36
target_if/mgmt_txrx/src/target_if_mgmt_txrx_rx_reo.c

@@ -227,7 +227,7 @@ target_if_mgmt_rx_reo_get_valid_hw_link_bitmap(struct wlan_objmgr_psoc *psoc,
 /**
  * target_if_mgmt_rx_reo_read_snapshot() - Read management rx-reorder snapshot
  * @pdev: pdev pointer
- * @snapshot_address: Snapshot address
+ * @snapshot_info: Snapshot info
  * @id: Snapshot ID
  * @snapshot_value: Pointer to snapshot value
  *
@@ -238,25 +238,34 @@ target_if_mgmt_rx_reo_get_valid_hw_link_bitmap(struct wlan_objmgr_psoc *psoc,
 static QDF_STATUS
 target_if_mgmt_rx_reo_read_snapshot(
 			struct wlan_objmgr_pdev *pdev,
-			struct mgmt_rx_reo_snapshot *snapshot_address,
+			struct mgmt_rx_reo_snapshot_info *snapshot_info,
 			enum mgmt_rx_reo_shared_snapshot_id id,
 			struct mgmt_rx_reo_snapshot_params *snapshot_value)
 {
 	bool snapshot_valid;
 	uint16_t mgmt_pkt_ctr;
-	uint16_t redundant_mgmt_pkt_ctr;
 	uint32_t global_timestamp;
 	uint32_t mgmt_rx_reo_snapshot_low;
 	uint32_t mgmt_rx_reo_snapshot_high;
 	uint8_t retry_count;
 	QDF_STATUS status;
 	struct wlan_lmac_if_mgmt_rx_reo_low_level_ops *low_level_ops;
+	struct mgmt_rx_reo_shared_snapshot *snapshot_address;
+	uint8_t snapshot_version;
 
+	if (!snapshot_info) {
+		mgmt_rx_reo_err("Mgmt Rx REO snapshot info null");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	snapshot_address = snapshot_info->address;
 	if (!snapshot_address) {
 		mgmt_rx_reo_err("Mgmt Rx REO snapshot address null");
 		return QDF_STATUS_E_INVAL;
 	}
 
+	snapshot_version = snapshot_info->version;
+
 	if (!snapshot_value) {
 		mgmt_rx_reo_err("Mgmt Rx REO snapshot null");
 		return QDF_STATUS_E_INVAL;
@@ -288,38 +297,47 @@ target_if_mgmt_rx_reo_read_snapshot(
 				snapshot_address->mgmt_rx_reo_snapshot_high;
 
 			snapshot_valid = low_level_ops->snapshot_is_valid(
-						mgmt_rx_reo_snapshot_low);
+						mgmt_rx_reo_snapshot_low,
+						snapshot_version);
+
 			if (!snapshot_valid) {
 				mgmt_rx_reo_debug("Invalid REO snapshot value");
 				snapshot_value->valid = false;
+				snapshot_value->mgmt_pkt_ctr = 0xFFFE;
+				snapshot_value->global_timestamp = 0xFFFFFFFE;
 				return QDF_STATUS_SUCCESS;
 			}
 
-			global_timestamp =
-				low_level_ops->snapshot_get_global_timestamp(
-					mgmt_rx_reo_snapshot_low,
-					mgmt_rx_reo_snapshot_high);
-			mgmt_pkt_ctr =
-				low_level_ops->snapshot_get_mgmt_pkt_ctr(
-					mgmt_rx_reo_snapshot_low);
-
-			redundant_mgmt_pkt_ctr =
-			     low_level_ops->snapshot_get_redundant_mgmt_pkt_ctr(
-					mgmt_rx_reo_snapshot_high);
-
-			if (low_level_ops->snapshot_is_consistent(
-					mgmt_pkt_ctr, redundant_mgmt_pkt_ctr))
+			if (low_level_ops->snapshot_is_consistent
+						(mgmt_rx_reo_snapshot_low,
+						 mgmt_rx_reo_snapshot_high,
+						 snapshot_version)) {
+				global_timestamp =
+				    low_level_ops->snapshot_get_global_timestamp
+						(mgmt_rx_reo_snapshot_low,
+						 mgmt_rx_reo_snapshot_high,
+						 snapshot_version);
+				mgmt_pkt_ctr =
+					low_level_ops->snapshot_get_mgmt_pkt_ctr
+						(mgmt_rx_reo_snapshot_low,
+						 snapshot_version);
 				break;
-
-			mgmt_rx_reo_info("Inconsistent snapshot value low=0x%x high=0x%x",
+			}
+			mgmt_rx_reo_info("Inconsistent snapshot %d, version=%u, low=0x%x, high=0x%x, retry=%u",
+					 id, snapshot_version,
 					 mgmt_rx_reo_snapshot_low,
-					 mgmt_rx_reo_snapshot_high);
+					 mgmt_rx_reo_snapshot_high,
+					 retry_count);
 		}
 
 		if (retry_count == MGMT_RX_REO_SNAPSHOT_READ_RETRY_LIMIT) {
-			mgmt_rx_reo_debug("Read retry limit reached");
+			mgmt_rx_reo_alert("Read retry limit, id = %d, ver = %u",
+					  id, snapshot_version);
 			snapshot_value->valid = false;
-			return QDF_STATUS_SUCCESS;
+			snapshot_value->mgmt_pkt_ctr = 0xFFFF;
+			snapshot_value->global_timestamp = 0xFFFFFFFF;
+			qdf_assert_always(0);
+			return QDF_STATUS_E_FAILURE;
 		}
 
 		snapshot_value->valid = true;
@@ -338,23 +356,23 @@ target_if_mgmt_rx_reo_read_snapshot(
 }
 
 /**
- * target_if_mgmt_rx_reo_get_snapshot_address() - Get management rx-reorder
- * snapshot address(virtual address) in host memory
+ * target_if_mgmt_rx_reo_get_snapshot_info() - Get information related to
+ * management rx-reorder snapshot
  * @pdev: Pointer to pdev object
  * @id: Snapshot ID
- * @snapshot_address: Pointer to snapshot address where the address needs
- * to be written
+ * @snapshot_info: Pointer to snapshot info
  *
  * Return: QDF_STATUS
  */
 static QDF_STATUS
-target_if_mgmt_rx_reo_get_snapshot_address(
-			struct wlan_objmgr_pdev *pdev,
-			enum mgmt_rx_reo_shared_snapshot_id id,
-			struct mgmt_rx_reo_snapshot **snapshot_address)
+target_if_mgmt_rx_reo_get_snapshot_info
+			(struct wlan_objmgr_pdev *pdev,
+			 enum mgmt_rx_reo_shared_snapshot_id id,
+			 struct mgmt_rx_reo_snapshot_info *snapshot_info)
 {
 	struct wlan_lmac_if_mgmt_rx_reo_low_level_ops *low_level_ops;
 	int8_t link_id;
+	int8_t snapshot_version;
 
 	if (!pdev) {
 		mgmt_rx_reo_err("pdev is null");
@@ -366,8 +384,8 @@ target_if_mgmt_rx_reo_get_snapshot_address(
 		return QDF_STATUS_E_INVAL;
 	}
 
-	if (!snapshot_address) {
-		mgmt_rx_reo_err("Ref to mgmt RX REO snapshot address is null");
+	if (!snapshot_info) {
+		mgmt_rx_reo_err("Ref to mgmt RX REO snapshot info is null");
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
@@ -384,7 +402,17 @@ target_if_mgmt_rx_reo_get_snapshot_address(
 	link_id = wlan_get_mlo_link_id_from_pdev(pdev);
 	qdf_assert_always(link_id >= 0);
 
-	*snapshot_address = low_level_ops->get_snapshot_address(link_id, id);
+	snapshot_info->address =
+			low_level_ops->get_snapshot_address(link_id, id);
+
+	snapshot_version = low_level_ops->get_snapshot_version(id);
+	if (snapshot_version < 0) {
+		mgmt_rx_reo_err("Invalid snapshot version %d",
+				snapshot_version);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	snapshot_info->version = snapshot_version;
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -468,8 +496,8 @@ target_if_mgmt_rx_reo_tx_ops_register(
 				target_if_mgmt_rx_reo_get_valid_hw_link_bitmap;
 	mgmt_rx_reo_tx_ops->read_mgmt_rx_reo_snapshot =
 				target_if_mgmt_rx_reo_read_snapshot;
-	mgmt_rx_reo_tx_ops->get_mgmt_rx_reo_snapshot_address =
-				target_if_mgmt_rx_reo_get_snapshot_address;
+	mgmt_rx_reo_tx_ops->get_mgmt_rx_reo_snapshot_info =
+				target_if_mgmt_rx_reo_get_snapshot_info;
 	mgmt_rx_reo_tx_ops->mgmt_rx_reo_filter_config =
 					target_if_mgmt_rx_reo_filter_config;
 

+ 21 - 20
umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo.c

@@ -651,9 +651,9 @@ wlan_mgmt_rx_reo_algo_calculate_wait_count(
 	uint8_t snapshot_id;
 	struct wlan_objmgr_pdev *pdev;
 	struct mgmt_rx_reo_pdev_info *rx_reo_pdev_ctx;
-	struct mgmt_rx_reo_snapshot *address;
+	struct mgmt_rx_reo_snapshot_info *snapshot_info;
 	struct mgmt_rx_reo_snapshot_params snapshot_params
-		[MGMT_RX_REO_SHARED_SNAPSHOT_MAX];
+				[MGMT_RX_REO_SHARED_SNAPSHOT_MAX];
 	struct mgmt_rx_reo_snapshot_params *mac_hw_ss, *fw_forwarded_ss,
 					    *fw_consumed_ss, *host_ss;
 	struct mgmt_rx_reo_params *in_frame_params;
@@ -754,15 +754,15 @@ wlan_mgmt_rx_reo_algo_calculate_wait_count(
 		/* Read all the shared snapshots */
 		while (snapshot_id <
 			MGMT_RX_REO_SHARED_SNAPSHOT_MAX) {
-			address = rx_reo_pdev_ctx->
-				   host_target_shared_snapshot[snapshot_id],
+			snapshot_info = &rx_reo_pdev_ctx->
+				host_target_shared_snapshot_info[snapshot_id];
 
 			qdf_mem_zero(&snapshot_params[snapshot_id],
 				     sizeof(snapshot_params[snapshot_id]));
 
 			status = tgt_mgmt_rx_reo_read_snapshot(
-						pdev, address, snapshot_id,
-						&snapshot_params[snapshot_id]);
+					pdev, snapshot_info, snapshot_id,
+					&snapshot_params[snapshot_id]);
 
 			/* Read operation shouldn't fail */
 			if (QDF_IS_STATUS_ERROR(status)) {
@@ -3344,10 +3344,10 @@ error_print:
 static QDF_STATUS
 mgmt_rx_reo_sim_write_snapshot(uint8_t link_id,
 			       enum mgmt_rx_reo_shared_snapshot_id id,
-			       struct mgmt_rx_reo_snapshot value)
+			       struct mgmt_rx_reo_shared_snapshot value)
 {
 	struct wlan_objmgr_pdev *pdev;
-	struct mgmt_rx_reo_snapshot *snapshot_address;
+	struct mgmt_rx_reo_shared_snapshot *snapshot_address;
 	QDF_STATUS status;
 
 	pdev = wlan_get_pdev_from_mlo_link_id(link_id, WLAN_MGMT_RX_REO_SIM_ID);
@@ -3397,13 +3397,13 @@ mgmt_rx_reo_sim_write_snapshot(uint8_t link_id,
  * This API gets the snapshot value for a frame with time stamp
  * @global_timestamp and sequence number @mgmt_pkt_ctr.
  *
- * Return: snapshot value (struct mgmt_rx_reo_snapshot)
+ * Return: snapshot value (struct mgmt_rx_reo_shared_snapshot)
  */
-static struct mgmt_rx_reo_snapshot
+static struct mgmt_rx_reo_shared_snapshot
 mgmt_rx_reo_sim_get_snapshot_value(uint32_t global_timestamp,
 				   uint16_t mgmt_pkt_ctr)
 {
-	struct mgmt_rx_reo_snapshot snapshot = {0};
+	struct mgmt_rx_reo_shared_snapshot snapshot = {0};
 
 	QDF_SET_BITS(snapshot.mgmt_rx_reo_snapshot_low,
 		     MGMT_RX_REO_SNAPSHOT_LOW_VALID_POS,
@@ -3449,7 +3449,7 @@ mgmt_rx_reo_sim_frame_handler_fw(void *arg)
 	QDF_STATUS status;
 	struct mgmt_rx_reo_sim_context *sim_context;
 	enum mgmt_rx_reo_shared_snapshot_id snapshot_id;
-	struct mgmt_rx_reo_snapshot snapshot_value;
+	struct mgmt_rx_reo_shared_snapshot snapshot_value;
 	bool ret;
 
 	if (!frame_hw) {
@@ -3691,7 +3691,7 @@ mgmt_rx_reo_sim_mac_hw_thread(void *data)
 		int8_t link_id = -1;
 		QDF_STATUS status;
 		enum mgmt_rx_reo_shared_snapshot_id snapshot_id;
-		struct mgmt_rx_reo_snapshot snapshot_value;
+		struct mgmt_rx_reo_shared_snapshot snapshot_value;
 		int8_t num_mlo_links;
 		bool ret;
 
@@ -4254,7 +4254,7 @@ QDF_STATUS
 mgmt_rx_reo_sim_get_snapshot_address(
 			struct wlan_objmgr_pdev *pdev,
 			enum mgmt_rx_reo_shared_snapshot_id id,
-			struct mgmt_rx_reo_snapshot **address)
+			struct mgmt_rx_reo_shared_snapshot **address)
 {
 	int8_t link_id;
 	struct mgmt_rx_reo_sim_context *sim_context;
@@ -4472,17 +4472,18 @@ mgmt_rx_reo_pdev_obj_open_notification
 
 	snapshot_id = 0;
 	while (snapshot_id < MGMT_RX_REO_SHARED_SNAPSHOT_MAX) {
-		struct mgmt_rx_reo_snapshot **snapshot_address;
+		struct mgmt_rx_reo_snapshot_info *snapshot_info;
 		struct mgmt_rx_reo_pdev_info *mgmt_rx_reo_pdev_ctx;
 
 		mgmt_rx_reo_pdev_ctx =
 				mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx;
-		snapshot_address =
-			&mgmt_rx_reo_pdev_ctx->host_target_shared_snapshot[snapshot_id];
-		status = wlan_mgmt_rx_reo_get_snapshot_address
-					(pdev, snapshot_id, snapshot_address);
+		snapshot_info =
+			&mgmt_rx_reo_pdev_ctx->host_target_shared_snapshot_info
+			[snapshot_id];
+		status = wlan_mgmt_rx_reo_get_snapshot_info
+					(pdev, snapshot_id, snapshot_info);
 		if (QDF_IS_STATUS_ERROR(status)) {
-			mgmt_rx_reo_err("Get snapshot address failed, id = %u",
+			mgmt_rx_reo_err("Get snapshot info failed, id = %u",
 					snapshot_id);
 			return status;
 		}

+ 3 - 3
umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo_i.h

@@ -88,15 +88,15 @@
  * It considers both MGMT Rx and MGMT FW consumed.
  * @last_valid_shared_snapshot: Array of last valid snapshots(for snapshots
  * shared between host and target)
- * @host_target_shared_snapshot: Array of snapshot addresses(for snapshots
- * shared between host and target)
+ * @host_target_shared_snapshot_info: Array of meta information related to
+ * snapshots(for snapshots shared between host and target)
  * @filter: MGMT Rx REO filter
  */
 struct mgmt_rx_reo_pdev_info {
 	struct mgmt_rx_reo_snapshot_params host_snapshot;
 	struct mgmt_rx_reo_snapshot_params last_valid_shared_snapshot
 				[MGMT_RX_REO_SHARED_SNAPSHOT_MAX];
-	struct mgmt_rx_reo_snapshot *host_target_shared_snapshot
+	struct mgmt_rx_reo_snapshot_info host_target_shared_snapshot_info
 				[MGMT_RX_REO_SHARED_SNAPSHOT_MAX];
 	struct mgmt_rx_reo_filter filter;
 };

+ 24 - 8
umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_rx_reo_public_structs.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -58,22 +58,38 @@ struct mgmt_rx_reo_snapshot_params {
 };
 
 /*
- * struct mgmt_rx_reo_snapshot - Represents the management rx-reorder snapshot
+ * struct mgmt_rx_reo_snapshot_info - Information related to management Rx
+ * reorder snapshot
+ * @address: Snapshot address
+ * @version: Snapshot version
+ */
+struct mgmt_rx_reo_snapshot_info {
+	struct mgmt_rx_reo_shared_snapshot *address;
+	uint8_t version;
+};
+
+/*
+ * struct mgmt_rx_reo_shared_snapshot - Represents the management rx-reorder
+ * shared snapshots
  * @mgmt_rx_reo_snapshot_low: Lower 32 bits of the reo snapshot
  * @mgmt_rx_reo_snapshot_high: Higher 32 bits of the reo snapshot
  */
-struct mgmt_rx_reo_snapshot {
+struct mgmt_rx_reo_shared_snapshot {
 	union {
 		uint32_t mgmt_rx_reo_snapshot_low;
-		uint32_t valid:1,
-			 mgmt_pkt_ctr:16,
-			 global_timestamp_low:15;
+		uint32_t mgmt_pkt_ctr_ver_a:16,
+			 global_timestamp_redundant_ver_a:15,
+			 valid_ver_a:1;
+		uint32_t global_timestamp_low_ver_b:15,
+			 mgmt_pkt_ctr_ver_b:16,
+			 valid_ver_b:1;
 	};
 
 	union {
 		uint32_t mgmt_rx_reo_snapshot_high;
-		uint32_t global_timestamp_high:17,
-			 mgmt_pkt_ctr_redundant:15;
+		uint32_t global_timestamp_ver_a;
+		uint32_t mgmt_pkt_ctr_redundant_ver_b:15,
+			 global_timestamp_high_ver_b:17;
 	};
 };
 

+ 9 - 10
umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_rx_reo_tgt_api.h

@@ -100,7 +100,7 @@ tgt_mgmt_rx_reo_get_valid_hw_link_bitmap(struct wlan_objmgr_psoc *psoc,
 /**
  * tgt_mgmt_rx_reo_read_snapshot() - Read management rx-reorder snapshot
  * @pdev: Pointer to pdev object
- * @address: Snapshot address
+ * @snapshot_info: Snapshot info
  * @id: Snapshot ID
  * @value: Pointer to the snapshot value where the snapshot
  * should be written
@@ -112,7 +112,7 @@ tgt_mgmt_rx_reo_get_valid_hw_link_bitmap(struct wlan_objmgr_psoc *psoc,
 QDF_STATUS
 tgt_mgmt_rx_reo_read_snapshot(
 			struct wlan_objmgr_pdev *pdev,
-			struct mgmt_rx_reo_snapshot *address,
+			struct mgmt_rx_reo_snapshot_info *snapshot_info,
 			enum mgmt_rx_reo_shared_snapshot_id id,
 			struct mgmt_rx_reo_snapshot_params *value);
 
@@ -139,20 +139,19 @@ QDF_STATUS tgt_mgmt_rx_reo_filter_config(struct wlan_objmgr_pdev *pdev,
 					 struct mgmt_rx_reo_filter *filter);
 
 /**
- * tgt_mgmt_rx_reo_get_snapshot_address() - Get management rx-reorder
- * snapshot address(virtual address) in host memory
+ * tgt_mgmt_rx_reo_get_snapshot_info() - Get information regarding management
+ * rx-reorder snapshot
  * @pdev: Pointer to pdev object
  * @id: Snapshot ID
- * @snapshot_address: Pointer to snapshot address where the address
- * needs to be written
+ * @snapshot_info: Pointer to snapshot info
  *
  * Return: QDF_STATUS
  */
 QDF_STATUS
-tgt_mgmt_rx_reo_get_snapshot_address(
-			struct wlan_objmgr_pdev *pdev,
-			enum mgmt_rx_reo_shared_snapshot_id id,
-			struct mgmt_rx_reo_snapshot **address);
+tgt_mgmt_rx_reo_get_snapshot_info
+			(struct wlan_objmgr_pdev *pdev,
+			 enum mgmt_rx_reo_shared_snapshot_id id,
+			 struct mgmt_rx_reo_snapshot_info *snapshot_info);
 
 /**
  * tgt_mgmt_rx_reo_frame_handler() - REO handler for management Rx frames.

+ 7 - 7
umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_rx_reo_utils_api.h

@@ -156,20 +156,20 @@ wlan_mgmt_rx_reo_sim_stop(void)
 #endif /* WLAN_MGMT_RX_REO_SIM_SUPPORT */
 
 /**
- * wlan_mgmt_rx_reo_get_snapshot_address() - Get snapshot address
+ * wlan_mgmt_rx_reo_get_snapshot_info() - Get snapshot info
  * @pdev: pointer to pdev
  * @id: snapshot identifier
- * @address: pointer to snapshot address
+ * @snapshot_info: pointer to snapshot info
  *
- * Helper API to get address of snapshot @id for pdev @pdev.
+ * Helper API to get information of snapshot @id for pdev @pdev.
  *
  * Return: QDF_STATUS
  */
 QDF_STATUS
-wlan_mgmt_rx_reo_get_snapshot_address(
-			struct wlan_objmgr_pdev *pdev,
-			enum mgmt_rx_reo_shared_snapshot_id id,
-			struct mgmt_rx_reo_snapshot **address);
+wlan_mgmt_rx_reo_get_snapshot_info
+			(struct wlan_objmgr_pdev *pdev,
+			 enum mgmt_rx_reo_shared_snapshot_id id,
+			 struct mgmt_rx_reo_snapshot_info *snapshot_info);
 
 /**
  * wlan_mgmt_txrx_process_rx_frame() - API to process the incoming management

+ 11 - 11
umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_rx_reo_tgt_api.c

@@ -69,7 +69,7 @@ tgt_mgmt_rx_reo_get_valid_hw_link_bitmap(struct wlan_objmgr_psoc *psoc,
 QDF_STATUS
 tgt_mgmt_rx_reo_read_snapshot(
 			struct wlan_objmgr_pdev *pdev,
-			struct mgmt_rx_reo_snapshot *address,
+			struct mgmt_rx_reo_snapshot_info *snapshot_info,
 			enum mgmt_rx_reo_shared_snapshot_id id,
 			struct mgmt_rx_reo_snapshot_params *value)
 {
@@ -86,8 +86,8 @@ tgt_mgmt_rx_reo_read_snapshot(
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	return mgmt_rx_reo_txops->read_mgmt_rx_reo_snapshot(pdev, address, id,
-							    value);
+	return mgmt_rx_reo_txops->read_mgmt_rx_reo_snapshot(pdev, snapshot_info,
+							    id, value);
 }
 
 /**
@@ -209,10 +209,10 @@ QDF_STATUS tgt_mgmt_rx_reo_filter_config(struct wlan_objmgr_pdev *pdev,
 }
 
 QDF_STATUS
-tgt_mgmt_rx_reo_get_snapshot_address(
-			struct wlan_objmgr_pdev *pdev,
-			enum mgmt_rx_reo_shared_snapshot_id id,
-			struct mgmt_rx_reo_snapshot **address)
+tgt_mgmt_rx_reo_get_snapshot_info
+			(struct wlan_objmgr_pdev *pdev,
+			 enum mgmt_rx_reo_shared_snapshot_id id,
+			 struct mgmt_rx_reo_snapshot_info *snapshot_info)
 {
 	struct wlan_lmac_if_mgmt_rx_reo_tx_ops *mgmt_rx_reo_txops;
 
@@ -222,13 +222,13 @@ tgt_mgmt_rx_reo_get_snapshot_address(
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	if (!mgmt_rx_reo_txops->get_mgmt_rx_reo_snapshot_address) {
-		mgmt_rx_reo_err("txops entry for get snapshot address is null");
+	if (!mgmt_rx_reo_txops->get_mgmt_rx_reo_snapshot_info) {
+		mgmt_rx_reo_err("txops entry for get snapshot info is null");
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	return mgmt_rx_reo_txops->get_mgmt_rx_reo_snapshot_address(pdev, id,
-								   address);
+	return mgmt_rx_reo_txops->get_mgmt_rx_reo_snapshot_info(pdev, id,
+								snapshot_info);
 }
 
 QDF_STATUS tgt_mgmt_rx_reo_frame_handler(

+ 10 - 10
umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_rx_reo_utils_api.c

@@ -50,12 +50,12 @@ QDF_STATUS wlan_mgmt_txrx_process_rx_frame(
 }
 
 QDF_STATUS
-wlan_mgmt_rx_reo_get_snapshot_address(
-			struct wlan_objmgr_pdev *pdev,
-			enum mgmt_rx_reo_shared_snapshot_id id,
-			struct mgmt_rx_reo_snapshot **address)
+wlan_mgmt_rx_reo_get_snapshot_info
+			(struct wlan_objmgr_pdev *pdev,
+			 enum mgmt_rx_reo_shared_snapshot_id id,
+			 struct mgmt_rx_reo_snapshot_info *snapshot_info)
 {
-	return tgt_mgmt_rx_reo_get_snapshot_address(pdev, id, address);
+	return tgt_mgmt_rx_reo_get_snapshot_info(pdev, id, snapshot_info);
 }
 
 /**
@@ -122,12 +122,12 @@ QDF_STATUS wlan_mgmt_txrx_process_rx_frame(
 }
 
 QDF_STATUS
-wlan_mgmt_rx_reo_get_snapshot_address(
-			struct wlan_objmgr_pdev *pdev,
-			enum mgmt_rx_reo_shared_snapshot_id id,
-			struct mgmt_rx_reo_snapshot **address)
+wlan_mgmt_rx_reo_get_snapshot_info
+			(struct wlan_objmgr_pdev *pdev,
+			 enum mgmt_rx_reo_shared_snapshot_id id,
+			 struct mgmt_rx_reo_snapshot_info *snapshot_info)
 {
-	return mgmt_rx_reo_sim_get_snapshot_address(pdev, id, address);
+	return mgmt_rx_reo_sim_get_snapshot_info(pdev, id, snapshot_info);
 }
 
 /**

+ 19 - 12
umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h

@@ -258,6 +258,7 @@ struct wlan_lmac_if_global_shmem_local_ops {
  * @get_valid_link_bitmap: Get valid link bitmap to be used by MGMT Rx
  * REO module
  * @get_snapshot_address: Get address of an MGMT Rx REO snapshot
+ * @get_snapshot_version: Get version of MGMT Rx REO snapshot
  * @snapshot_is_valid: Check if a snapshot is valid
  * @snapshot_get_mgmt_pkt_ctr: Get management packet counter from snapshot
  * @snapshot_get_redundant_mgmt_pkt_ctr: Get redundant management packet counter
@@ -269,16 +270,22 @@ struct wlan_lmac_if_mgmt_rx_reo_low_level_ops {
 	bool implemented;
 	int (*get_num_links)(void);
 	uint16_t (*get_valid_link_bitmap)(void);
-	void* (*get_snapshot_address)(
-			uint8_t link_id,
-			enum mgmt_rx_reo_shared_snapshot_id snapshot_id);
-	bool (*snapshot_is_valid)(uint32_t snapshot_low);
-	uint16_t (*snapshot_get_mgmt_pkt_ctr)(uint32_t snapshot_low);
+	void* (*get_snapshot_address)
+			(uint8_t link_id,
+			 enum mgmt_rx_reo_shared_snapshot_id snapshot_id);
+	int8_t (*get_snapshot_version)
+			(enum mgmt_rx_reo_shared_snapshot_id snapshot_id);
+	bool (*snapshot_is_valid)(uint32_t snapshot_low,
+				  uint8_t snapshot_version);
+	uint16_t (*snapshot_get_mgmt_pkt_ctr)(uint32_t snapshot_low,
+					      uint8_t snapshot_version);
 	uint16_t (*snapshot_get_redundant_mgmt_pkt_ctr)(uint32_t snapshot_high);
-	bool (*snapshot_is_consistent)(uint16_t mgmt_pkt_ctr,
-				       uint16_t redundant_mgmt_pkt_ctr);
+	bool (*snapshot_is_consistent)(uint32_t snapshot_low,
+				       uint32_t snapshot_high,
+				       uint8_t snapshot_version);
 	uint32_t (*snapshot_get_global_timestamp)(uint32_t snapshot_low,
-						  uint32_t snapshot_high);
+						  uint32_t snapshot_high,
+						  uint8_t snapshot_version);
 };
 
 /**
@@ -287,7 +294,7 @@ struct wlan_lmac_if_mgmt_rx_reo_low_level_ops {
  * @get_num_active_hw_links: Get number of active MLO HW links
  * @get_valid_hw_link_bitmap: Get valid MLO HW link bitmap
  * @read_mgmt_rx_reo_snapshot: Read rx-reorder snapshots
- * @get_mgmt_rx_reo_snapshot_address: Get rx-reorder snapshot address
+ * @get_mgmt_rx_reo_snapshot_info: Get rx-reorder snapshot info
  * @mgmt_rx_reo_filter_config:  Configure MGMT Rx REO filter
  * @low_level_ops:  Low level operations of MGMT Rx REO module
  */
@@ -298,13 +305,13 @@ struct wlan_lmac_if_mgmt_rx_reo_tx_ops {
 					       uint16_t *valid_hw_link_bitmap);
 	QDF_STATUS (*read_mgmt_rx_reo_snapshot)
 			(struct wlan_objmgr_pdev *pdev,
-			 struct mgmt_rx_reo_snapshot *address,
+			 struct mgmt_rx_reo_snapshot_info *snapshot_info,
 			 enum mgmt_rx_reo_shared_snapshot_id id,
 			 struct mgmt_rx_reo_snapshot_params *value);
-	QDF_STATUS (*get_mgmt_rx_reo_snapshot_address)
+	QDF_STATUS (*get_mgmt_rx_reo_snapshot_info)
 			(struct wlan_objmgr_pdev *pdev,
 			 enum mgmt_rx_reo_shared_snapshot_id id,
-			 struct mgmt_rx_reo_snapshot **address);
+			 struct mgmt_rx_reo_snapshot_info *snapshot_info);
 	QDF_STATUS (*mgmt_rx_reo_filter_config)(
 					struct wlan_objmgr_pdev *pdev,
 					struct mgmt_rx_reo_filter *filter);