Przeglądaj źródła

qcacmn: Add support for run-time enablement of MGMT Rx REO feature

Add INI and WMI service bit based enablement support for
MGMT Rx REO feature.

CRs-Fixed: 3014353
Change-Id: I95650718d69b70f119621a9481dbf1518bc5500b
Shiva Krishna Pittala 3 lat temu
rodzic
commit
81f3009593

+ 3 - 1
cfg/inc/cfg_converged.h

@@ -50,6 +50,7 @@
 #else
 #define CFG_WLAN_CM_UTF_PARAM
 #endif
+#include <cfg_mgmt_txrx.h>
 
 #define CFG_CONVERGED_ALL \
 		CFG_SCAN_ALL \
@@ -62,7 +63,8 @@
 		CFG_CFR_ALL \
 		CFG_MLME_SCORE_ALL \
 		CFG_WLAN_CM_UTF_PARAM \
-		CFG_CMN_MLME_ALL
+		CFG_CMN_MLME_ALL \
+		CFG_MGMT_TXRX_ALL
 
 #endif /* __CFG_CONVERGED_H */
 

+ 5 - 0
target_if/init_deinit/src/init_event_handler.c

@@ -185,6 +185,11 @@ static int init_deinit_service_ready_event_handler(ol_scn_t scn_handle,
 
 	target_if_atf_cfg_enable(psoc, tgt_hdl, event);
 
+	if (wmi_service_enabled(wmi_handle,
+				wmi_service_mgmt_rx_reo_supported))
+		wlan_psoc_nif_fw_ext_cap_set(psoc,
+					     WLAN_SOC_F_MGMT_RX_REO_CAPABLE);
+
 	if (!wmi_service_enabled(wmi_handle, wmi_service_ext_msg))
 		target_if_qwrap_cfg_enable(psoc, tgt_hdl, event);
 

+ 18 - 1
target_if/mgmt_txrx/src/target_if_mgmt_txrx_rx_reo.c

@@ -340,9 +340,26 @@ target_if_mgmt_rx_reo_extract_reo_params(
 	wmi_unified_t wmi_handle, void *evt_buf,
 	struct mgmt_rx_event_params *params)
 {
+	struct wlan_objmgr_psoc *psoc;
+
+	if (!wmi_handle) {
+		mgmt_rx_reo_err("wmi_handle is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	psoc = target_if_get_psoc_from_scn_hdl(wmi_handle->scn_handle);
+	if (!psoc) {
+		mgmt_rx_reo_err("null psoc");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	/* If REO feature is not enabled, no need to extract REO params */
+	if (!wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(psoc))
+		return QDF_STATUS_SUCCESS;
+
 	if (!params) {
 		mgmt_rx_reo_err("MGMT Rx event parameters is NULL");
-		return QDF_STATUS_E_INVAL;
+		return QDF_STATUS_E_NULL_VALUE;
 	}
 
 	return wmi_extract_mgmt_rx_reo_params(wmi_handle, evt_buf,

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

@@ -21,6 +21,7 @@
 
 #include "wlan_mgmt_txrx_rx_reo_i.h"
 #include <wlan_mgmt_txrx_rx_reo_tgt_api.h>
+#include "wlan_mgmt_txrx_main_i.h"
 #include <qdf_util.h>
 
 static struct mgmt_rx_reo_context g_rx_reo_ctx;
@@ -1266,3 +1267,99 @@ mgmt_rx_reo_deinit_context(void)
 
 	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
+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;
+	}
+
+	if (!wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(pdev)) {
+		status = QDF_STATUS_SUCCESS;
+		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
+mgmt_rx_reo_pdev_obj_destroy_notification(
+	struct wlan_objmgr_pdev *pdev,
+	struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx)
+{
+	if (!wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(pdev))
+		return QDF_STATUS_SUCCESS;
+
+	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;
+}

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

@@ -55,6 +55,58 @@
 	(mgmt_rx_reo_compare_global_timestamps_gte(                            \
 	 (ts)->global_ts, mgmt_rx_reo_get_global_ts((entry)->rx_params)))
 
+/*
+ * struct mgmt_rx_reo_pdev_info - Pdev information required by the Management
+ * Rx REO module
+ * @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_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;
+};
+
+/**
+ * mgmt_rx_reo_pdev_obj_create_notification() - pdev create handler for
+ * management rx-reorder module
+ * @pdev: pointer to pdev object
+ * @mgmt_txrx_pdev_ctx: pdev private object of mgmt txrx module
+ *
+ * This function gets called from object manager when pdev is being created and
+ * creates management rx-reorder pdev context
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+mgmt_rx_reo_pdev_obj_create_notification(
+	struct wlan_objmgr_pdev *pdev,
+	struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx);
+
+/**
+ * mgmt_rx_reo_pdev_obj_destroy_notification() - pdev destroy handler for
+ * management rx-reorder feature
+ * @pdev: pointer to pdev object
+ * @mgmt_txrx_pdev_ctx: pdev private object of mgmt txrx module
+ *
+ * This function gets called from object manager when pdev is being destroyed
+ * and destroys management rx-reorder pdev context
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+mgmt_rx_reo_pdev_obj_destroy_notification(
+	struct wlan_objmgr_pdev *pdev,
+	struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx);
+
 /**
  * enum mgmt_rx_reo_frame_descriptor_type - Enumeration for management frame
  * descriptor type.
@@ -260,10 +312,11 @@ static inline bool is_mgmt_rx_reo_required(
 			struct mgmt_rx_reo_frame_descriptor *desc)
 {
 	/**
-	 * TODO: Need to implement the actual policy based on WMI service bit.
-	 * For now, returning false so that algorithm won't kick in on mainline.
+	 * NOTE: Implementing a simple policy based on INI and WMI serive bit
+	 * for now. Finer policies like checking whether this pdev has
+	 * any MLO VAPs or checking the frame type can be implemented later.
 	 */
-	return false;
+	return wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(pdev);
 }
 
 /**

+ 55 - 0
umac/cmn_services/mgmt_txrx/dispatcher/inc/cfg_mgmt_rx_reo.h

@@ -0,0 +1,55 @@
+/*
+ * 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: cfg_mgmt_txrx.h
+ *  This file contains cfg definitions of mgmt rx reo sub-component
+ */
+
+#ifndef __CFG_MGMT_RX_REO_H
+#define __CFG_MGMT_RX_REO_H
+
+#ifdef WLAN_MGMT_RX_REO_SUPPORT
+
+/*
+ * <ini>
+ * mgmt_rx_reo_enable - Enable MGMT Rx REO feature
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to enable MGMT Rx REO feature
+ *
+ * Related: None
+ *
+ * Supported Feature: MGMT Rx REO
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_MGMT_RX_REO_ENABLE \
+	CFG_INI_BOOL("mgmt_rx_reo_enable", false, \
+			"Enable MGMT Rx REO feature")
+
+#define CFG_MGMT_RX_REO_ALL \
+	CFG(CFG_MGMT_RX_REO_ENABLE)
+#else
+
+#define CFG_MGMT_RX_REO_ALL
+
+#endif /* WLAN_MGMT_RX_REO_SUPPORT */
+#endif /* __CFG_MGMT_RX_REO_H */

+ 30 - 0
umac/cmn_services/mgmt_txrx/dispatcher/inc/cfg_mgmt_txrx.h

@@ -0,0 +1,30 @@
+/*
+ * 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: cfg_mgmt_txrx.h
+ *  This file contains cfg definitions of mgmt txrx component
+ */
+
+#ifndef __CFG_MGMT_TXRX_H
+#define __CFG_MGMT_TXRX_H
+
+#include <cfg_mgmt_rx_reo.h>
+
+#define CFG_MGMT_TXRX_ALL \
+	CFG_MGMT_RX_REO_ALL
+
+#endif

+ 0 - 20
umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_rx_reo_public_structs.h

@@ -91,25 +91,5 @@ struct mgmt_rx_reo_filter {
 	uint32_t low;
 	uint32_t high;
 };
-
-/*
- * struct mgmt_rx_reo_pdev_info - Pdev information required by the Management
- * Rx REO module
- * @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_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 */
 #endif /* _WLAN_MGMT_TXRX_RX_REO_PUBLIC_STRUCTS_H */

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

@@ -85,6 +85,7 @@ wlan_mgmt_rx_reo_deinit(void);
  * wlan_mgmt_rx_reo_pdev_obj_create_notification() - pdev create handler for
  * management rx-reorder module
  * @pdev: pointer to pdev object
+ * @mgmt_txrx_pdev_ctx: pdev private object of mgmt txrx module
  *
  * This function gets called from object manager when pdev is being created and
  * creates management rx-reorder pdev context
@@ -100,6 +101,7 @@ wlan_mgmt_rx_reo_pdev_obj_create_notification(
  * wlan_mgmt_rx_reo_pdev_obj_destroy_notification() - pdev destroy handler for
  * management rx-reorder feature
  * @pdev: pointer to pdev object
+ * @mgmt_txrx_pdev_ctx: pdev private object of mgmt txrx module
  *
  * This function gets called from object manager when pdev is being destroyed
  * and destroys management rx-reorder pdev context
@@ -112,19 +114,30 @@ wlan_mgmt_rx_reo_pdev_obj_destroy_notification(
 			struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx);
 
 /**
- * wlan_mgmt_rx_reo_get_priv_object() - Get the pdev private object of
- * MGMT Rx REO module
- * @pdev: pointer to pdev object
- * Return: Pointer to pdev private object of MGMT Rx REO module on success,
- * else NULL
+ * wlan_mgmt_rx_reo_is_feature_enabled_at_psoc() - Check if MGMT Rx REO feature
+ * is enabled on a given psoc
+ * @psoc: pointer to psoc object
+ *
+ * Return: true if the feature is enabled, else false
+ */
+bool
+wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(struct wlan_objmgr_psoc *psoc);
+
+/**
+ * wlan_mgmt_rx_reo_is_feature_enabled_at_pdev() - Check if MGMT Rx REO feature
+ * is enabled on a given pdev
+ * @psoc: pointer to pdev object
+ *
+ * Return: true if the feature is enabled, else false
  */
-struct mgmt_rx_reo_pdev_info *
-wlan_mgmt_rx_reo_get_priv_object(struct wlan_objmgr_pdev *pdev);
+bool
+wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(struct wlan_objmgr_pdev *pdev);
 #else
 /**
  * wlan_mgmt_rx_reo_pdev_obj_create_notification() - pdev create handler for
  * management rx-reorder feature
  * @pdev: pointer to pdev object
+ * @mgmt_txrx_pdev_ctx: pdev private object of mgmt txrx module
  *
  * This function gets called from object manager when pdev is being created and
  * creates management rx-reorder pdev context
@@ -143,6 +156,7 @@ wlan_mgmt_rx_reo_pdev_obj_create_notification(
  * wlan_mgmt_rx_reo_pdev_obj_destroy_notification() - pdev destroy handler for
  * management rx-reorder feature
  * @pdev: pointer to pdev object
+ * @mgmt_txrx_pdev_ctx: pdev private object of mgmt txrx module
  *
  * This function gets called from object manager when pdev is being destroyed
  * and destroys management rx-reorder pdev context

+ 30 - 122
umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_rx_reo_utils_api.c

@@ -20,71 +20,19 @@
  */
 
 #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;
-}
+#include <cfg_ucfg_api.h>
 
 QDF_STATUS
-wlan_mgmt_rx_reo_set_priv_object(struct wlan_objmgr_pdev *pdev,
-				 struct mgmt_rx_reo_pdev_info *reo_pdev_context)
+wlan_mgmt_rx_reo_deinit(void)
 {
-	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;
+	return mgmt_rx_reo_deinit_context();
 }
 
-/**
- * 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)
+QDF_STATUS
+wlan_mgmt_rx_reo_init(void)
 {
-	snapshot_params->valid = false;
-	snapshot_params->mgmt_pkt_ctr = 0;
-	snapshot_params->global_timestamp = 0;
+	return mgmt_rx_reo_init_context();
 }
 
 QDF_STATUS
@@ -92,60 +40,8 @@ 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;
+	return mgmt_rx_reo_pdev_obj_create_notification(pdev,
+							mgmt_txrx_pdev_ctx);
 }
 
 QDF_STATUS
@@ -153,20 +49,32 @@ 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;
+	return mgmt_rx_reo_pdev_obj_destroy_notification(pdev,
+							 mgmt_txrx_pdev_ctx);
 }
 
-QDF_STATUS
-wlan_mgmt_rx_reo_deinit(void)
+bool
+wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(struct wlan_objmgr_psoc *psoc)
 {
-	return mgmt_rx_reo_deinit_context();
+	if (!psoc) {
+		mgmt_rx_reo_err("psoc is NULL!");
+		return false;
+	}
+
+	if (!cfg_get(psoc, CFG_MGMT_RX_REO_ENABLE))
+		return false;
+
+	return wlan_psoc_nif_feat_cap_get(psoc, WLAN_SOC_F_MGMT_RX_REO_CAPABLE);
 }
 
-QDF_STATUS
-wlan_mgmt_rx_reo_init(void)
+bool
+wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(struct wlan_objmgr_pdev *pdev)
 {
-	return mgmt_rx_reo_init_context();
+	if (!pdev) {
+		mgmt_rx_reo_err("pdev is NULL!");
+		return false;
+	}
+
+	return wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(
+			wlan_pdev_get_psoc(pdev));
 }

+ 2 - 1
umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h

@@ -218,7 +218,8 @@
 #define WLAN_SOC_F_PEER_CREATE_RESP    0x10000000
 /* Strict channel mode */
 #define WLAN_SOC_F_STRICT_CHANNEL      0x20000000
-
+/* MGMT Rx REO feature capability */
+#define WLAN_SOC_F_MGMT_RX_REO_CAPABLE  0x40000000
 
 /* PSOC op flags */
 

+ 1 - 0
wmi/inc/wmi_unified_param.h

@@ -5298,6 +5298,7 @@ typedef enum {
 	wmi_service_thermal_stats_temp_range_supported,
 #endif
 	wmi_service_hw_mode_policy_offload_support,
+	wmi_service_mgmt_rx_reo_supported,
 	wmi_services_max,
 } wmi_conv_service_ids;
 #define WMI_SERVICE_UNAVAILABLE 0xFFFF

+ 2 - 0
wmi/src/wmi_unified_tlv.c

@@ -17320,6 +17320,8 @@ static void populate_tlv_service(uint32_t *wmi_service)
 #endif
 	wmi_service[wmi_service_hw_mode_policy_offload_support] =
 			WMI_SERVICE_HW_MODE_POLICY_OFFLOAD_SUPPORT;
+	wmi_service[wmi_service_mgmt_rx_reo_supported] =
+			WMI_SERVICE_MGMT_RX_REO_SUPPORTED;
 }
 
 /**