Bladeren bron

qcacmn: Add API to get address of mgmt Rx REO snapshots

Add APIs to get address of management rx-reordering snapshots.

CRs-Fixed: 2963485
Change-Id: Idfe13425ad5f95f1a3d92edfc2d6d41aded5aec9
Edayilliam Jayadev 4 jaren geleden
bovenliggende
commit
9ccbe5a0fb

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

@@ -143,7 +143,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 mgmt_rx_reo_snapshot *snapshot_address,
-			enum mgmt_rx_reo_snapshot_id id,
+			enum mgmt_rx_reo_shared_snapshot_id id,
 			struct mgmt_rx_reo_snapshot_params *snapshot_value)
 {
 	bool snapshot_valid;
@@ -166,9 +166,9 @@ target_if_mgmt_rx_reo_read_snapshot(
 	}
 
 	switch (id) {
-	case MGMT_RX_REO_SNAPSHOT_MAC_HW:
-	case MGMT_RX_REO_SNAPSHOT_FW_CONSUMED:
-	case MGMT_RX_REO_SNAPSHOT_FW_FORWADED:
+	case MGMT_RX_REO_SHARED_SNAPSHOT_MAC_HW:
+	case MGMT_RX_REO_SHARED_SNAPSHOT_FW_CONSUMED:
+	case MGMT_RX_REO_SHARED_SNAPSHOT_FW_FORWADED:
 		retry_count = 0;
 		for (; retry_count < MGMT_RX_REO_SNAPSHOT_READ_RETRY_LIMIT;
 		     retry_count++) {
@@ -223,6 +223,42 @@ target_if_mgmt_rx_reo_read_snapshot(
 	return status;
 }
 
+/**
+ * target_if_mgmt_rx_reo_get_snapshot_address() - Get management rx-reorder
+ * snapshot address(virtual address) in host memory
+ * @pdev: Pointer to pdev object
+ * @id: Snapshot ID
+ * @snapshot_address: Pointer to snapshot address where the address needs
+ * to be written
+ *
+ * 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)
+{
+	if (!pdev) {
+		mgmt_rx_reo_err("pdev is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	if (id >= MGMT_RX_REO_SHARED_SNAPSHOT_MAX) {
+		mgmt_rx_reo_err("Mgmt RX REO snapshot id invalid %d", id);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	if (!snapshot_address) {
+		mgmt_rx_reo_err("Ref to mgmt RX REO snapshot address is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	/* Get address here */
+
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  * target_if_mgmt_rx_reo_filter_config() - Configure MGMT Rx REO filter
  * @pdev: Pointer to pdev objmgr
@@ -281,6 +317,8 @@ target_if_mgmt_rx_reo_tx_ops_register(
 	mgmt_rx_reo_tx_ops = &mgmt_txrx_tx_ops->mgmt_rx_reo_tx_ops;
 	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->mgmt_rx_reo_filter_config =
 					target_if_mgmt_rx_reo_filter_config;
 

+ 25 - 23
umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_rx_reo_public_structs.h

@@ -23,20 +23,21 @@
 #define _WLAN_MGMT_TXRX_RX_REO_PUBLIC_STRUCTS_H
 #ifdef WLAN_MGMT_RX_REO_SUPPORT
 /*
- * enum mgmt_rx_reo_snapshot_id - Represents the management rx-reorder
- * snapshot identifier.
- * @MGMT_RX_REO_SNAPSHOT_MAC_HW: MAC HW snapshot
- * @MGMT_RX_REO_SNAPSHOT_FW_CONSUMED: FW consumed snapshot
- * @MGMT_RX_REO_SNAPSHOT_FW_FORWADED: FW forwarded snapshot
- * @MGMT_RX_REO_SNAPSHOT_MAX: Max number of snapshots
- * @MGMT_RX_REO_SNAPSHOT_INVALID: Invalid snapshot
+ * enum mgmt_rx_reo_shared_snapshot_id - Represents the management
+ * rx-reorder snapshots shared between host and target in the host DDR.
+ * These snapshots are written by FW/HW and read by Host.
+ * @MGMT_RX_REO_SHARED_SNAPSHOT_MAC_HW: MAC HW snapshot
+ * @MGMT_RX_REO_SHARED_SNAPSHOT_FW_CONSUMED: FW consumed snapshot
+ * @MGMT_RX_REO_SHARED_SNAPSHOT_FW_FORWADED: FW forwarded snapshot
+ * @MGMT_RX_REO_SHARED_SNAPSHOT_MAX: Max number of snapshots
+ * @MGMT_RX_REO_SHARED_SNAPSHOT_INVALID: Invalid snapshot
  */
-enum mgmt_rx_reo_snapshot_id {
-	MGMT_RX_REO_SNAPSHOT_MAC_HW = 0,
-	MGMT_RX_REO_SNAPSHOT_FW_CONSUMED,
-	MGMT_RX_REO_SNAPSHOT_FW_FORWADED,
-	MGMT_RX_REO_SNAPSHOT_MAX,
-	MGMT_RX_REO_SNAPSHOT_INVALID,
+enum mgmt_rx_reo_shared_snapshot_id {
+	MGMT_RX_REO_SHARED_SNAPSHOT_MAC_HW = 0,
+	MGMT_RX_REO_SHARED_SNAPSHOT_FW_CONSUMED = 1,
+	MGMT_RX_REO_SHARED_SNAPSHOT_FW_FORWADED = 2,
+	MGMT_RX_REO_SHARED_SNAPSHOT_MAX = 3,
+	MGMT_RX_REO_SHARED_SNAPSHOT_INVALID,
 };
 
 /*
@@ -92,19 +93,20 @@ struct mgmt_rx_reo_filter {
 /*
  * struct mgmt_rx_reo_pdev_info - Pdev information required by the Management
  * Rx REO module
- * @host_or_fw_consumed_snapshot: Snapshot of latest frame consumed by Host/FW
- * @mac_hw_snapshot: Pointer to the snapshot of latest frame seen at the MAC HW
- * @fw_consumed_snapshot: Pointer to the snapshot of latest frame consumed
- * by the FW
- * @fw_forwarded_snapshot: Pointer to the snapshot of latest frame forwarded
- * to the Host by FW
+ * @host_snapshot: Latest snapshot seen at the Host.
+ * 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)
  * @filter: MGMT Rx REO filter
  */
 struct mgmt_rx_reo_pdev_info {
-	struct mgmt_rx_reo_snapshot_params host_or_fw_consumed_snapshot;
-	struct mgmt_rx_reo_snapshot *mac_hw_snapshot;
-	struct mgmt_rx_reo_snapshot *fw_consumed_snapshot;
-	struct mgmt_rx_reo_snapshot *fw_forwarded_snapshot;
+	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
+				[MGMT_RX_REO_SHARED_SNAPSHOT_MAX];
 	struct mgmt_rx_reo_filter filter;
 };
 #endif /* WLAN_MGMT_RX_REO_SUPPORT */

+ 21 - 4
umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_rx_reo_tgt_api.h

@@ -40,10 +40,11 @@
  * Return: QDF_STATUS
  */
 QDF_STATUS
-tgt_mgmt_rx_reo_read_snapshot(struct wlan_objmgr_pdev *pdev,
-			      struct mgmt_rx_reo_snapshot *address,
-			      enum mgmt_rx_reo_snapshot_id id,
-			      struct mgmt_rx_reo_snapshot_params *value);
+tgt_mgmt_rx_reo_read_snapshot(
+			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);
 /**
  * tgt_mgmt_rx_reo_fw_consumed_event_handler() - MGMT Rx REO FW consumed
  * event handler
@@ -65,5 +66,21 @@ tgt_mgmt_rx_reo_fw_consumed_event_handler(struct wlan_objmgr_psoc *psoc,
  */
 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
+ * @pdev: Pointer to pdev object
+ * @id: Snapshot ID
+ * @snapshot_address: Pointer to snapshot address where the address
+ * needs to be written
+ *
+ * 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);
 #endif /* WLAN_MGMT_RX_REO_SUPPORT */
 #endif /* _WLAN_MGMT_TXRX_RX_REO_TGT_API_H */

+ 69 - 1
umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_rx_reo_utils_api.h

@@ -27,6 +27,8 @@
 
 #include <wlan_mgmt_txrx_utils_api.h>
 
+struct mgmt_txrx_priv_pdev_context;
+
 #ifdef WLAN_MGMT_RX_REO_SUPPORT
 #define mgmt_rx_reo_alert mgmt_txrx_alert
 #define mgmt_rx_reo_err mgmt_txrx_err
@@ -34,5 +36,71 @@
 #define mgmt_rx_reo_notice mgmt_txrx_notice
 #define mgmt_rx_reo_info mgmt_txrx_info
 #define mgmt_rx_reo_debug mgmt_txrx_debug
-#endif /* WLAN_MGMT_RX_REO_SUPPORT*/
+
+/**
+ * wlan_mgmt_rx_reo_pdev_obj_create_notification() - pdev create handler for
+ * management rx-reorder module
+ * @pdev: pointer to pdev object
+ *
+ * This function gets called from object manager when pdev is being created and
+ * creates management rx-reorder pdev context
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+wlan_mgmt_rx_reo_pdev_obj_create_notification(
+			struct wlan_objmgr_pdev *pdev,
+			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx);
+
+/**
+ * wlan_mgmt_rx_reo_pdev_obj_destroy_notification() - pdev destroy handler for
+ * management rx-reorder feature
+ * @pdev: pointer to pdev object
+ *
+ * This function gets called from object manager when pdev is being destroyed
+ * and destroys management rx-reorder pdev context
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+wlan_mgmt_rx_reo_pdev_obj_destroy_notification(
+			struct wlan_objmgr_pdev *pdev,
+			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx);
+#else
+/**
+ * wlan_mgmt_rx_reo_pdev_obj_create_notification() - pdev create handler for
+ * management rx-reorder feature
+ * @pdev: pointer to pdev object
+ *
+ * This function gets called from object manager when pdev is being created and
+ * creates management rx-reorder pdev context
+ *
+ * Return: QDF_STATUS
+ */
+static inline QDF_STATUS
+wlan_mgmt_rx_reo_pdev_obj_create_notification(
+			struct wlan_objmgr_pdev *pdev,
+			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * wlan_mgmt_rx_reo_pdev_obj_destroy_notification() - pdev destroy handler for
+ * management rx-reorder feature
+ * @pdev: pointer to pdev object
+ *
+ * This function gets called from object manager when pdev is being destroyed
+ * and destroys management rx-reorder pdev context
+ *
+ * Return: QDF_STATUS
+ */
+static inline QDF_STATUS
+wlan_mgmt_rx_reo_pdev_obj_destroy_notification(
+			struct wlan_objmgr_pdev *pdev,
+			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif /* WLAN_MGMT_RX_REO_SUPPORT */
 #endif /* _WLAN_MGMT_TXRX_RX_REO_UTILS_API_H_ */

+ 28 - 4
umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_rx_reo_tgt_api.c

@@ -57,10 +57,11 @@ wlan_pdev_get_mgmt_rx_reo_txops(struct wlan_objmgr_pdev *pdev)
 }
 
 QDF_STATUS
-tgt_mgmt_rx_reo_read_snapshot(struct wlan_objmgr_pdev *pdev,
-			      struct mgmt_rx_reo_snapshot *address,
-			      enum mgmt_rx_reo_snapshot_id id,
-			      struct mgmt_rx_reo_snapshot_params *value)
+tgt_mgmt_rx_reo_read_snapshot(
+			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)
 {
 	struct wlan_lmac_if_mgmt_rx_reo_tx_ops *mgmt_rx_reo_txops;
 
@@ -103,3 +104,26 @@ QDF_STATUS tgt_mgmt_rx_reo_filter_config(struct wlan_objmgr_pdev *pdev,
 
 	return mgmt_rx_reo_txops->mgmt_rx_reo_filter_config(pdev, filter);
 }
+
+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)
+{
+	struct wlan_lmac_if_mgmt_rx_reo_tx_ops *mgmt_rx_reo_txops;
+
+	mgmt_rx_reo_txops = wlan_pdev_get_mgmt_rx_reo_txops(pdev);
+	if (!mgmt_rx_reo_txops) {
+		mgmt_rx_reo_err("mgmt rx reo txops is NULL");
+		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");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	return mgmt_rx_reo_txops->get_mgmt_rx_reo_snapshot_address(pdev, id,
+								   address);
+}

+ 160 - 0
umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_rx_reo_utils_api.c

@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 2021, The Linux Foundation. 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
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ *  DOC: wlan_mgmt_txrx_rx_reo_utils_api.c
+ *  This file contains mgmt rx re-ordering related public function definitions
+ */
+
+#include <wlan_mgmt_txrx_rx_reo_utils_api.h>
+#include <wlan_mgmt_txrx_rx_reo_tgt_api.h>
+#include "../../core/src/wlan_mgmt_txrx_rx_reo_i.h"
+#include "../../core/src/wlan_mgmt_txrx_main_i.h"
+
+struct mgmt_rx_reo_pdev_info *
+wlan_mgmt_rx_reo_get_priv_object(struct wlan_objmgr_pdev *pdev)
+{
+	struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx;
+
+	if (!pdev) {
+		mgmt_rx_reo_err("pdev is null");
+		return NULL;
+	}
+
+	mgmt_txrx_pdev_ctx = (struct mgmt_txrx_priv_pdev_context *)
+		wlan_objmgr_pdev_get_comp_private_obj(pdev,
+						      WLAN_UMAC_COMP_MGMT_TXRX);
+
+	if (!mgmt_txrx_pdev_ctx) {
+		mgmt_rx_reo_err("mgmt txrx context is NULL");
+		return NULL;
+	}
+
+	return mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx;
+}
+
+QDF_STATUS
+wlan_mgmt_rx_reo_set_priv_object(struct wlan_objmgr_pdev *pdev,
+				 struct mgmt_rx_reo_pdev_info *reo_pdev_context)
+{
+	struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx;
+
+	if (!pdev) {
+		mgmt_rx_reo_err("pdev is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	mgmt_txrx_pdev_ctx = (struct mgmt_txrx_priv_pdev_context *)
+		wlan_objmgr_pdev_get_comp_private_obj(pdev,
+						      WLAN_UMAC_COMP_MGMT_TXRX);
+
+	if (!mgmt_txrx_pdev_ctx) {
+		mgmt_rx_reo_err("mgmt txrx context is NULL");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx = reo_pdev_context;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * wlan_mgmt_rx_reo_initialize_snapshot_params() - Initialize a given snapshot
+ * params object
+ * @snapshot_params: Pointer to snapshot params object
+ *
+ * Return: void
+ */
+static void
+wlan_mgmt_rx_reo_initialize_snapshot_params(
+			struct mgmt_rx_reo_snapshot_params *snapshot_params)
+{
+	snapshot_params->valid = false;
+	snapshot_params->mgmt_pkt_ctr = 0;
+	snapshot_params->global_timestamp = 0;
+}
+
+QDF_STATUS
+wlan_mgmt_rx_reo_pdev_obj_create_notification(
+			struct wlan_objmgr_pdev *pdev,
+			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx)
+{
+	QDF_STATUS status;
+	QDF_STATUS temp_status;
+	struct mgmt_rx_reo_pdev_info *mgmt_rx_reo_pdev_ctx = NULL;
+	enum mgmt_rx_reo_shared_snapshot_id snapshot_id;
+
+	if (!pdev) {
+		mgmt_rx_reo_err("pdev is null");
+		status = QDF_STATUS_E_NULL_VALUE;
+		goto failure;
+	}
+
+	mgmt_rx_reo_pdev_ctx = qdf_mem_malloc(sizeof(*mgmt_rx_reo_pdev_ctx));
+	if (!mgmt_rx_reo_pdev_ctx) {
+		mgmt_rx_reo_err("Allocation failure for REO pdev context");
+		status = QDF_STATUS_E_NOMEM;
+		goto failure;
+	}
+
+	snapshot_id = 0;
+	while (snapshot_id < MGMT_RX_REO_SHARED_SNAPSHOT_MAX) {
+		struct mgmt_rx_reo_snapshot **snapshot_address;
+
+		snapshot_address = &mgmt_rx_reo_pdev_ctx->
+				host_target_shared_snapshot[snapshot_id];
+		temp_status = tgt_mgmt_rx_reo_get_snapshot_address(
+				pdev, snapshot_id, snapshot_address);
+		if (QDF_IS_STATUS_ERROR(temp_status)) {
+			mgmt_rx_reo_err("Get snapshot address failed, id = %u",
+					snapshot_id);
+			status = temp_status;
+			goto failure;
+		}
+
+		wlan_mgmt_rx_reo_initialize_snapshot_params(
+				&mgmt_rx_reo_pdev_ctx->
+				last_valid_shared_snapshot[snapshot_id]);
+		snapshot_id++;
+	}
+
+	/* Initialize Host snapshot params */
+	wlan_mgmt_rx_reo_initialize_snapshot_params(&mgmt_rx_reo_pdev_ctx->
+						    host_snapshot);
+
+	mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx = mgmt_rx_reo_pdev_ctx;
+
+	return QDF_STATUS_SUCCESS;
+
+failure:
+	if (mgmt_rx_reo_pdev_ctx)
+		qdf_mem_free(mgmt_rx_reo_pdev_ctx);
+
+	mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx = NULL;
+
+	return status;
+}
+
+QDF_STATUS
+wlan_mgmt_rx_reo_pdev_obj_destroy_notification(
+			struct wlan_objmgr_pdev *pdev,
+			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx)
+{
+	qdf_mem_free(mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx);
+	mgmt_txrx_pdev_ctx->mgmt_rx_reo_pdev_ctx = NULL;
+
+	return QDF_STATUS_SUCCESS;
+}

+ 20 - 0
umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_utils_api.c

@@ -32,6 +32,7 @@
 #include "wlan_objmgr_peer_obj.h"
 #include "qdf_nbuf.h"
 #include "wlan_lmac_if_api.h"
+#include <wlan_mgmt_txrx_rx_reo_utils_api.h>
 
 /**
  * wlan_mgmt_txrx_psoc_obj_create_notification() - called from objmgr when psoc
@@ -187,6 +188,13 @@ static QDF_STATUS wlan_mgmt_txrx_pdev_obj_create_notification(
 			     "mgmt_txrx tx_cmp");
 	qdf_runtime_lock_init(&mgmt_txrx_pdev_ctx->wakelock_tx_runtime_cmp);
 
+	status = wlan_mgmt_rx_reo_pdev_obj_create_notification(
+					pdev, mgmt_txrx_pdev_ctx);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		mgmt_txrx_err("Failed to create mgmt Rx REO pdev object");
+		goto err_mgmt_rx_reo_attach;
+	}
+
 	if (wlan_objmgr_pdev_component_obj_attach(pdev,
 			WLAN_UMAC_COMP_MGMT_TXRX,
 			mgmt_txrx_pdev_ctx, QDF_STATUS_SUCCESS)
@@ -203,6 +211,10 @@ static QDF_STATUS wlan_mgmt_txrx_pdev_obj_create_notification(
 	return QDF_STATUS_SUCCESS;
 
 err_pdev_attach:
+	/* Avoiding error check in an error handler */
+	wlan_mgmt_rx_reo_pdev_obj_destroy_notification(pdev,
+						       mgmt_txrx_pdev_ctx);
+err_mgmt_rx_reo_attach:
 	qdf_runtime_lock_deinit(&mgmt_txrx_pdev_ctx->wakelock_tx_runtime_cmp);
 	qdf_wake_lock_destroy(&mgmt_txrx_pdev_ctx->wakelock_tx_cmp);
 	qdf_mem_free(mgmt_txrx_stats);
@@ -230,6 +242,7 @@ static QDF_STATUS wlan_mgmt_txrx_pdev_obj_destroy_notification(
 			void *arg)
 {
 	struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx;
+	QDF_STATUS status;
 
 	if (!pdev) {
 		mgmt_txrx_err("pdev context passed is NULL");
@@ -252,6 +265,13 @@ static QDF_STATUS wlan_mgmt_txrx_pdev_obj_destroy_notification(
 		return QDF_STATUS_E_FAILURE;
 	}
 
+	status = wlan_mgmt_rx_reo_pdev_obj_destroy_notification(
+						pdev, mgmt_txrx_pdev_ctx);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		mgmt_txrx_err("Failed to destroy mgmt Rx REO pdev object");
+		return QDF_STATUS_E_FAILURE;
+	}
+
 	wlan_mgmt_txrx_desc_pool_deinit(mgmt_txrx_pdev_ctx);
 	qdf_mem_free(mgmt_txrx_pdev_ctx->mgmt_txrx_stats);
 	qdf_runtime_lock_deinit(&mgmt_txrx_pdev_ctx->wakelock_tx_runtime_cmp);

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

@@ -217,13 +217,18 @@ struct wlan_target_if_dcs_rx_ops {
  * 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
  */
 struct wlan_lmac_if_mgmt_rx_reo_tx_ops {
 	QDF_STATUS (*read_mgmt_rx_reo_snapshot)
 			(struct mgmt_rx_reo_snapshot *address,
-			 enum mgmt_rx_reo_snapshot_id id,
+			 enum mgmt_rx_reo_shared_snapshot_id id,
 			 struct mgmt_rx_reo_snapshot_params *value);
+	QDF_STATUS (*get_mgmt_rx_reo_snapshot_address)
+			(struct wlan_objmgr_pdev *pdev,
+			 enum mgmt_rx_reo_shared_snapshot_id id,
+			 struct mgmt_rx_reo_snapshot **address);
 	QDF_STATUS (*mgmt_rx_reo_filter_config)(
 					struct wlan_objmgr_pdev *pdev,
 					struct mgmt_rx_reo_filter *filter);