Răsfoiți Sursa

qcacmn: Expose the external APIs from MLO global shared memory handling

Expose the following APIs from MLO global shared memory handling
    - APIs required by the REO logic
    - APIs required to invoke the MLO global shared memory parsing

Change-Id: Ia2fb0b0fee5d3904bae8cd70ce3364360d5ea16e
CRs-Fixed: 3014343
Shiva Krishna Pittala 3 ani în urmă
părinte
comite
b0384b31da

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

@@ -70,10 +70,12 @@ struct wlan_host_mlo_glb_rx_reo_snapshot_info {
  * wlan_host_mlo_glb_h_shmem_arena_ctx - MLO Global shared memory arena context
  * @shmem_params: shared memory parameters
  * @rx_reo_snapshot_info: MGMT Rx REO snapshot information
+ * @init_count: Number of init calls
  */
 struct wlan_host_mlo_glb_h_shmem_arena_ctx {
 	struct wlan_host_mlo_glb_h_shmem_params shmem_params;
 	struct wlan_host_mlo_glb_rx_reo_snapshot_info rx_reo_snapshot_info;
+	qdf_atomic_t init_count;
 };
 
 /**
@@ -94,4 +96,21 @@ QDF_STATUS mlo_glb_h_shmem_arena_ctx_init(void *arena_vaddr,
  * Return: QDF_STATUS of operation
  */
 QDF_STATUS mlo_glb_h_shmem_arena_ctx_deinit(void);
+
+/**
+ * mgmt_rx_reo_get_num_links() - Get number of links to be used by MGMT Rx REO
+ *
+ * Return: number of links in case of success, else -1
+ */
+int mgmt_rx_reo_get_num_links(void);
+
+/**
+ * mgmt_rx_reo_get_snapshot_address() - Get the address of MGMT Rx REO snapshot
+ * @link_id: Link ID of the radio to which this snapshot belongs
+ * @snapshot_id: ID of the snapshot
+ *
+ * Return: virtual address of the snapshot on success, else NULL
+ */
+void *mgmt_rx_reo_get_snapshot_address(
+	uint8_t link_id, enum mgmt_rx_reo_shared_snapshot_id snapshot_id);
 #endif

+ 11 - 16
target_if/init_deinit/inc/mlo_global_h_shmem_arena_api.h

@@ -20,27 +20,22 @@
  *  global shared memory arena.
  */
 
-#include<qdf_types.h>
-
 #ifndef _MLO_GLOBAL_H_SHMEM_ARENA_API_H_
 #define _MLO_GLOBAL_H_SHMEM_ARENA_API_H_
-/**
- * wlan_host_mlo_glb_h_shmem_arena_ctx_init() - Initialize MLO Global shared
- * memory arena context on Host
- * @arena_vaddr: Virtual address of the MLO Global shared memory arena
- * @arena_len: Length (in bytes) of the MLO Global shared memory arena
- *
- * Return: QDF_STATUS of operation
- */
-QDF_STATUS
-wlan_host_mlo_glb_h_shmem_arena_ctx_init(void *arena_vaddr,
-					 size_t arena_len);
+
+#include<qdf_types.h>
+#include<wlan_lmac_if_def.h>
 
 /**
- * wlan_host_mlo_glb_h_shmem_arena_deinit() - De-initialize MLO Global shared
- * memory arena context on Host
+ * mgmt_rx_reo_register_wifi3_0_ops() - Register wifi3.0 operations of MGMT Rx
+ * REO module
+ * @reo_low_level_ops: Pointer to low level ops table of MGMT Rx REO module.
+ *
+ * This API fills @reo_low_level_ops table with the wifi3.0 layer functions of
+ * MGMT Rx REO module.
  *
  * Return: QDF_STATUS of operation
  */
-QDF_STATUS wlan_host_mlo_glb_h_shmem_arena_ctx_deinit(void);
+QDF_STATUS mgmt_rx_reo_register_wifi3_0_ops(
+	struct wlan_lmac_if_mgmt_rx_reo_low_level_ops *reo_low_level_ops);
 #endif

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

@@ -447,6 +447,10 @@ QDF_STATUS mlo_glb_h_shmem_arena_ctx_init(uint8_t *arena_vaddr,
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
+	/* We need to initialize only for the first invocation */
+	if (qdf_atomic_read(&shmem_arena_ctx->init_count))
+		goto success;
+
 	if (parse_mlo_glb_h_shmem_arena(arena_vaddr, arena_len,
 					shmem_arena_ctx) < 0) {
 		free_mlo_glb_rx_reo_per_link_info(
@@ -454,6 +458,8 @@ QDF_STATUS mlo_glb_h_shmem_arena_ctx_init(uint8_t *arena_vaddr,
 		return QDF_STATUS_E_FAILURE;
 	}
 
+success:
+	qdf_atomic_inc(&shmem_arena_ctx->init_count);
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -467,8 +473,82 @@ QDF_STATUS mlo_glb_h_shmem_arena_deinit(void)
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
+	if (!qdf_atomic_read(&shmem_arena_ctx->init_count)) {
+		target_if_fatal("shmem_arena_ctx ref cnt is 0");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	/* We need to de-initialize only for the last invocation */
+	if (qdf_atomic_dec_and_test(&shmem_arena_ctx->init_count))
+		goto success;
+
 	free_mlo_glb_rx_reo_per_link_info(
 		&shmem_arena_ctx->rx_reo_snapshot_info);
 
+success:
 	return QDF_STATUS_SUCCESS;
 }
+
+int mgmt_rx_reo_get_num_links(void)
+{
+	struct wlan_host_mlo_glb_h_shmem_arena_ctx *shmem_arena_ctx;
+
+	shmem_arena_ctx = get_shmem_arena_ctx();
+	if (!shmem_arena_ctx) {
+		target_if_err("mlo_glb_h_shmem_arena context is NULL");
+		return qdf_status_to_os_return(QDF_STATUS_E_FAILURE);
+	}
+
+	return shmem_arena_ctx->rx_reo_snapshot_info.num_links;
+}
+
+void *mgmt_rx_reo_get_snapshot_address(
+	uint8_t link_id, enum mgmt_rx_reo_shared_snapshot_id snapshot_id)
+{
+	struct wlan_host_mlo_glb_h_shmem_arena_ctx *shmem_arena_ctx;
+	struct wlan_host_mlo_glb_rx_reo_snapshot_info *snapshot_info;
+	struct wlan_host_mlo_glb_rx_reo_per_link_info *snapshot_link_info;
+	uint8_t link;
+
+	if (snapshot_id >= MGMT_RX_REO_SHARED_SNAPSHOT_MAX) {
+		target_if_err("Invalid snapshot ID: %d", snapshot_id);
+		return NULL;
+	}
+
+	shmem_arena_ctx = get_shmem_arena_ctx();
+	if (!shmem_arena_ctx) {
+		target_if_err("mlo_glb_h_shmem_arena context is NULL");
+		return NULL;
+	}
+
+	snapshot_info = &shmem_arena_ctx->rx_reo_snapshot_info;
+
+	for (link = 0; link < snapshot_info->num_links; ++link) {
+		snapshot_link_info = &snapshot_info->link_info[link];
+
+		if (link_id == snapshot_link_info->link_id)
+			break;
+	}
+
+	if (link == snapshot_info->num_links) {
+		target_if_err("Couldn't find the snapshot link info"
+			      "corresponding to the link %d", link_id);
+		return NULL;
+	}
+
+	switch (snapshot_id) {
+	case MGMT_RX_REO_SHARED_SNAPSHOT_MAC_HW:
+		return snapshot_link_info->hw_forwarded;
+
+	case MGMT_RX_REO_SHARED_SNAPSHOT_FW_CONSUMED:
+		return snapshot_link_info->fw_consumed;
+
+	case MGMT_RX_REO_SHARED_SNAPSHOT_FW_FORWADED:
+		return snapshot_link_info->fw_forwarded;
+
+	default:
+		qdf_assert_always(0);
+	}
+
+	return NULL;
+}

+ 93 - 6
target_if/init_deinit/src/mlo_global_h_shmem_arena_api.c

@@ -21,14 +21,101 @@
  */
 #include <mlo_global_h_shmem_arena.h>
 
-QDF_STATUS
-wlan_host_mlo_glb_h_shmem_arena_ctx_init(uint8_t *arena_vaddr,
-					 size_t arena_len)
+/**
+ * mgmt_rx_reo_snapshot_is_valid() - Check if an MGMT Rx REO snapshot is valid
+ * @snapshot_low: lower 32-bits of the snapshot
+ *
+ * Return: true if snapshot is valid, else false
+ */
+static bool mgmt_rx_reo_snapshot_is_valid(uint32_t snapshot_low)
+{
+	return MLO_SHMEM_MGMT_RX_REO_SNAPSHOT_PARAM_VALID_GET(snapshot_low);
+}
+
+/**
+ * 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
+ *
+ * Return: Management packet counter of the snapshot
+ */
+static uint16_t mgmt_rx_reo_snapshot_get_mgmt_pkt_ctr(uint32_t snapshot_low)
+{
+	return MLO_SHMEM_MGMT_RX_REO_SNAPSHOT_PARAM_MGMT_PKT_CTR_GET(
+			snapshot_low);
+}
+
+/**
+ * mgmt_rx_reo_snapshot_get_mgmt_pkt_ctr() - Get the redundant management packet
+ * counter from MGMT Rx REO snapshot
+ * @snapshot_high: higher 32-bits of the snapshot
+ *
+ * Return: Redundant management packet counter of the snapshot
+ */
+static uint16_t mgmt_rx_reo_snapshot_get_redundant_mgmt_pkt_ctr(
+	uint32_t snapshot_high)
 {
-	return mlo_glb_h_shmem_arena_ctx_init(arena_vaddr, arena_len);
+	return MLO_SHMEM_MGMT_RX_REO_SNAPSHOT_PARAM_MGMT_PKT_CTR_REDUNDANT_GET(
+			snapshot_high);
 }
 
-QDF_STATUS wlan_host_mlo_glb_h_shmem_arena_ctx_deinit(void)
+/**
+ * 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
+ *
+ * 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)
 {
-	return mlo_glb_h_shmem_arena_ctx_deinit();
+	return MLO_SHMEM_MGMT_RX_REO_SNAPSHOT_IS_CONSISTENT(
+			mgmt_pkt_ctr, redundant_mgmt_pkt_ctr);
+}
+
+/**
+ * mgmt_rx_reo_snapshot_get_global_timestamp() - Get the global timestamp from
+ * MGMT Rx REO snapshot
+ * @snapshot_low: lower 32-bits of the snapshot
+ * @snapshot_high: higher 32-bits of the snapshot
+ *
+ * Return: Global timestamp of the snapshot
+ */
+static uint32_t mgmt_rx_reo_snapshot_get_global_timestamp(
+	uint32_t snapshot_low, uint32_t snapshot_high)
+{
+	return MLO_SHMEM_MGMT_RX_REO_SNAPSHOT_PARAM_GLOBAL_TIMESTAMP_GET_FROM_DWORDS(
+		snapshot_low, snapshot_high);
+}
+
+QDF_STATUS mgmt_rx_reo_register_wifi3_0_ops(
+	struct wlan_lmac_if_mgmt_rx_reo_low_level_ops *reo_low_level_ops)
+{
+	if (!reo_low_level_ops) {
+		target_if_err("Low level ops of MGMT Rx REO is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	reo_low_level_ops->init_shmem_arena_ctx =
+		mlo_glb_h_shmem_arena_ctx_init;
+	reo_low_level_ops->deinit_shmem_arena_ctx =
+		mlo_glb_h_shmem_arena_ctx_deinit;
+	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->snapshot_is_valid =
+		mgmt_rx_reo_snapshot_is_valid;
+	reo_low_level_ops->snapshot_get_mgmt_pkt_ctr =
+		mgmt_rx_reo_snapshot_get_mgmt_pkt_ctr;
+	reo_low_level_ops->snapshot_get_redundant_mgmt_pkt_ctr =
+		mgmt_rx_reo_snapshot_get_redundant_mgmt_pkt_ctr;
+	reo_low_level_ops->snapshot_is_consistent =
+		mgmt_rx_reo_snapshot_is_consistent;
+	reo_low_level_ops->snapshot_get_global_timestamp =
+		mgmt_rx_reo_snapshot_get_global_timestamp;
+
+	reo_low_level_ops->implemented = true;
+
+	return QDF_STATUS_SUCCESS;
 }

+ 22 - 5
target_if/mgmt_txrx/inc/target_if_mgmt_txrx_rx_reo.h

@@ -25,6 +25,7 @@
 #include <qdf_types.h>
 #include <wlan_objmgr_psoc_obj.h>
 #include <wlan_mgmt_txrx_rx_reo_utils_api.h>
+#include <wlan_mgmt_txrx_rx_reo_tgt_api.h>
 #include <wlan_lmac_if_api.h>
 #include <wlan_lmac_if_def.h>
 #include <wmi_unified_param.h>
@@ -32,11 +33,27 @@
 #ifdef WLAN_MGMT_RX_REO_SUPPORT
 
 #define MGMT_RX_REO_SNAPSHOT_READ_RETRY_LIMIT (5)
-#define REO_SNAPSHOT_GET_VALID(l)  (1)
-#define REO_SNAPSHOT_GET_MGMT_PKT_CTR(l)  (1)
-#define REO_SNAPSHOT_GET_REDUNDANT_MGMT_PKT_CTR(h) (1)
-#define REO_SNAPSHOT_IS_CONSISTENT(c, rc)  (1)
-#define REO_SNAPSHOT_GET_GLOBAL_TIMESTAMP(l, h)  (1)
+
+/**
+ * target_if_get_mgmt_rx_reo_low_level_ops() - Get low-level ops of management
+ * rx-reorder module
+ * @psoc: Pointer to psoc object
+ *
+ * Return: Pointer to management rx-reorder low-level ops
+ */
+static inline struct wlan_lmac_if_mgmt_rx_reo_low_level_ops *
+target_if_get_mgmt_rx_reo_low_level_ops(struct wlan_objmgr_psoc *psoc)
+{
+	struct wlan_lmac_if_mgmt_rx_reo_tx_ops *mgmt_rx_reo_tx_ops;
+
+	mgmt_rx_reo_tx_ops = wlan_psoc_get_mgmt_rx_reo_txops(psoc);
+	if (!mgmt_rx_reo_tx_ops) {
+		mgmt_txrx_err("txops is null for mgmt rx reo module");
+		return NULL;
+	}
+
+	return &mgmt_rx_reo_tx_ops->low_level_ops;
+}
 
 /**
  * target_if_mgmt_rx_reo_register_event_handlers() - Register management

+ 42 - 10
target_if/mgmt_txrx/src/target_if_mgmt_txrx_rx_reo.c

@@ -145,6 +145,7 @@ target_if_mgmt_rx_reo_unregister_event_handlers(struct wlan_objmgr_psoc *psoc)
 
 /**
  * target_if_mgmt_rx_reo_read_snapshot() - Read management rx-reorder snapshot
+ * @pdev: pdev pointer
  * @snapshot_address: Snapshot address
  * @id: Snapshot ID
  * @snapshot_value: Pointer to snapshot value
@@ -155,6 +156,7 @@ target_if_mgmt_rx_reo_unregister_event_handlers(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,
 			enum mgmt_rx_reo_shared_snapshot_id id,
 			struct mgmt_rx_reo_snapshot_params *snapshot_value)
@@ -167,6 +169,7 @@ target_if_mgmt_rx_reo_read_snapshot(
 	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;
 
 	if (!snapshot_address) {
 		mgmt_rx_reo_err("Mgmt Rx REO snapshot address null");
@@ -178,6 +181,17 @@ target_if_mgmt_rx_reo_read_snapshot(
 		return QDF_STATUS_E_INVAL;
 	}
 
+	low_level_ops = target_if_get_mgmt_rx_reo_low_level_ops(
+				wlan_pdev_get_psoc(pdev));
+
+	if (!low_level_ops) {
+		mgmt_rx_reo_err("Low level ops of MGMT Rx REO is null");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	/* Make sure that function pointers are populated */
+	qdf_assert_always(low_level_ops->implemented);
+
 	switch (id) {
 	case MGMT_RX_REO_SHARED_SNAPSHOT_MAC_HW:
 	case MGMT_RX_REO_SHARED_SNAPSHOT_FW_CONSUMED:
@@ -190,7 +204,7 @@ target_if_mgmt_rx_reo_read_snapshot(
 			mgmt_rx_reo_snapshot_high =
 				snapshot_address->mgmt_rx_reo_snapshot_high;
 
-			snapshot_valid = REO_SNAPSHOT_GET_VALID(
+			snapshot_valid = low_level_ops->snapshot_is_valid(
 						mgmt_rx_reo_snapshot_low);
 			if (!snapshot_valid) {
 				mgmt_rx_reo_debug("Invalid REO snapshot value");
@@ -198,16 +212,20 @@ target_if_mgmt_rx_reo_read_snapshot(
 				return QDF_STATUS_SUCCESS;
 			}
 
-			global_timestamp = REO_SNAPSHOT_GET_GLOBAL_TIMESTAMP(
-						mgmt_rx_reo_snapshot_low,
-						mgmt_rx_reo_snapshot_high);
-			mgmt_pkt_ctr = REO_SNAPSHOT_GET_MGMT_PKT_CTR(
-						mgmt_rx_reo_snapshot_low);
+			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 =
-					REO_SNAPSHOT_GET_REDUNDANT_MGMT_PKT_CTR(
+			     low_level_ops->snapshot_get_redundant_mgmt_pkt_ctr(
 					mgmt_rx_reo_snapshot_high);
-			if (REO_SNAPSHOT_IS_CONSISTENT(
-			    mgmt_pkt_ctr, redundant_mgmt_pkt_ctr))
+
+			if (low_level_ops->snapshot_is_consistent(
+					mgmt_pkt_ctr, redundant_mgmt_pkt_ctr))
 				break;
 
 			mgmt_rx_reo_info("Inconsistent snapshot value low=0x%x high=0x%x",
@@ -252,6 +270,9 @@ target_if_mgmt_rx_reo_get_snapshot_address(
 			enum mgmt_rx_reo_shared_snapshot_id id,
 			struct mgmt_rx_reo_snapshot **snapshot_address)
 {
+	struct wlan_lmac_if_mgmt_rx_reo_low_level_ops *low_level_ops;
+	uint8_t link_id;
+
 	if (!pdev) {
 		mgmt_rx_reo_err("pdev is null");
 		return QDF_STATUS_E_NULL_VALUE;
@@ -267,7 +288,18 @@ target_if_mgmt_rx_reo_get_snapshot_address(
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	/* Get address here */
+	low_level_ops = target_if_get_mgmt_rx_reo_low_level_ops(
+				wlan_pdev_get_psoc(pdev));
+
+	if (!low_level_ops) {
+		mgmt_rx_reo_err("Low level ops of MGMT Rx REO is null");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	qdf_assert_always(low_level_ops->implemented);
+
+	link_id = wlan_get_mlo_link_id_from_pdev(pdev);
+	*snapshot_address = low_level_ops->get_snapshot_address(link_id, id);
 
 	return QDF_STATUS_SUCCESS;
 }

+ 0 - 22
umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo.c

@@ -100,28 +100,6 @@ mgmt_rx_reo_compare_global_timestamps_gte(uint32_t ts1, uint32_t ts2)
 	return delta <= MGMT_RX_REO_GLOBAL_TS_HALF_RANGE;
 }
 
-/**
- * TODO: Dummy function to get the MLO link ID from the pdev.
- * This is added only as a place holder for the time being.
- * Remove this once this API is implemented in MLO manager.
- */
-static inline uint8_t
-wlan_get_mlo_link_id_from_pdev(struct wlan_objmgr_pdev *pdev)
-{
-	return 0;
-}
-
-/**
- * TODO: Dummy function to get pdev handle from MLO link ID.
- * This is added only as a place holder for the time being.
- * Remove this once this API is implemented in MLO manager.
- */
-static inline struct wlan_objmgr_pdev *
-wlan_get_pdev_from_mlo_link_id(uint8_t mlo_lin_id)
-{
-	return NULL;
-}
-
 /**
  * wlan_mgmt_rx_reo_algo_calculate_wait_count() - Calculates the number of
  * frames an incoming frame should wait for before it gets delivered.

+ 22 - 0
umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_rx_reo_utils_api.h

@@ -29,6 +29,28 @@
 
 struct mgmt_txrx_priv_pdev_context;
 
+/**
+ * TODO: Dummy function to get the MLO link ID from the pdev.
+ * This is added only as a place holder for the time being.
+ * Remove this once this API is implemented in MLO manager.
+ */
+static inline uint8_t
+wlan_get_mlo_link_id_from_pdev(struct wlan_objmgr_pdev *pdev)
+{
+	return 0;
+}
+
+/**
+ * TODO: Dummy function to get pdev handle from MLO link ID.
+ * This is added only as a place holder for the time being.
+ * Remove this once this API is implemented in MLO manager.
+ */
+static inline struct wlan_objmgr_pdev *
+wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id)
+{
+	return NULL;
+}
+
 #ifdef WLAN_MGMT_RX_REO_SUPPORT
 #define mgmt_rx_reo_alert mgmt_txrx_alert
 #define mgmt_rx_reo_err mgmt_txrx_err

+ 2 - 1
umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_rx_reo_tgt_api.c

@@ -42,7 +42,8 @@ tgt_mgmt_rx_reo_read_snapshot(
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	return mgmt_rx_reo_txops->read_mgmt_rx_reo_snapshot(address, id, value);
+	return mgmt_rx_reo_txops->read_mgmt_rx_reo_snapshot(pdev, address, id,
+							    value);
 }
 
 /**

+ 37 - 1
umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h

@@ -211,16 +211,51 @@ struct wlan_target_if_dcs_rx_ops {
 #endif
 
 #ifdef WLAN_MGMT_RX_REO_SUPPORT
+/**
+ * struct wlan_lmac_if_mgmt_rx_reo_low_level_ops - Low level function pointer
+ * table of MGMT Rx REO module
+ * @implemented: Whether functions pointers are implemented
+ * @init_shmem_arena_ctx: Initialize shmem arena context
+ * @deinit_shmem_arena_ctx: De-initialize shmem arena context
+ * @get_num_links: Get number of links to be used by MGMT Rx REO module
+ * @get_snapshot_address: Get address of an 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
+ * from snapshot
+ * @snapshot_is_consistent: Check if a snapshot is consistent
+ * @snapshot_get_global_timestamp: Get global timestamp from snapshot
+ */
+struct wlan_lmac_if_mgmt_rx_reo_low_level_ops {
+	bool implemented;
+	QDF_STATUS (*init_shmem_arena_ctx)(void *arena_vaddr,
+					   size_t arena_len);
+	QDF_STATUS (*deinit_shmem_arena_ctx)(void);
+	int (*get_num_links)(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);
+	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);
+	uint32_t (*snapshot_get_global_timestamp)(uint32_t snapshot_low,
+						  uint32_t snapshot_high);
+};
+
 /**
  * struct wlan_lmac_if_mgmt_txrx_tx_ops - structure of tx function
  * pointers for mgmt rx reo
  * @read_mgmt_rx_reo_snapshot: Read rx-reorder snapshots
  * @get_mgmt_rx_reo_snapshot_address: Get rx-reorder snapshot address
  * @mgmt_rx_reo_filter_config:  Configure MGMT Rx REO filter
+ * @low_level_ops:  Low level operations of MGMT Rx REO module
  */
 struct wlan_lmac_if_mgmt_rx_reo_tx_ops {
 	QDF_STATUS (*read_mgmt_rx_reo_snapshot)
-			(struct mgmt_rx_reo_snapshot *address,
+			(struct wlan_objmgr_pdev *pdev,
+			 struct mgmt_rx_reo_snapshot *address,
 			 enum mgmt_rx_reo_shared_snapshot_id id,
 			 struct mgmt_rx_reo_snapshot_params *value);
 	QDF_STATUS (*get_mgmt_rx_reo_snapshot_address)
@@ -230,6 +265,7 @@ struct wlan_lmac_if_mgmt_rx_reo_tx_ops {
 	QDF_STATUS (*mgmt_rx_reo_filter_config)(
 					struct wlan_objmgr_pdev *pdev,
 					struct mgmt_rx_reo_filter *filter);
+	struct wlan_lmac_if_mgmt_rx_reo_low_level_ops low_level_ops;
 };
 
 /**