瀏覽代碼

qcacmn: Add multi group support for MGMT Rx Reordering

Add multi group support for MGMT Rx Re-ordering.

Change-Id: I2b172d1f0db58afee06db3eefc06b618fcf9a627
CRs-Fixed: 3343170
Surya Prakash Raajen 2 年之前
父節點
當前提交
6ef9d4cb8e

+ 95 - 44
umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 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
@@ -27,14 +27,38 @@
 #include <wlan_mlo_mgr_cmn.h>
 #include <wlan_mlo_mgr_setup.h>
 
-static struct mgmt_rx_reo_context *g_rx_reo_ctx;
+static struct mgmt_rx_reo_context *g_rx_reo_ctx[WLAN_MAX_MLO_GROUPS];
 
-#define mgmt_rx_reo_get_context()        (g_rx_reo_ctx)
-#define mgmt_rx_reo_set_context(c)       (g_rx_reo_ctx = c)
+#define mgmt_rx_reo_get_context(_grp_id) (g_rx_reo_ctx[_grp_id])
+#define mgmt_rx_reo_set_context(grp_id, c)       (g_rx_reo_ctx[grp_id] = c)
 
 #define MGMT_RX_REO_PKT_CTR_HALF_RANGE (0x8000)
 #define MGMT_RX_REO_PKT_CTR_FULL_RANGE (MGMT_RX_REO_PKT_CTR_HALF_RANGE << 1)
 
+/**
+ * wlan_mgmt_rx_reo_get_ctx_from_pdev - Get MGMT Rx REO Context from pdev
+ * @pdev: Pointer to pdev structure object
+ *
+ * API to get the MGMT RX reo context of the pdev using the appropriate
+ * MLO group id.
+ *
+ * Return: Mgmt rx reo context for the pdev
+ */
+
+static inline struct mgmt_rx_reo_context*
+wlan_mgmt_rx_reo_get_ctx_from_pdev(struct wlan_objmgr_pdev *pdev)
+{
+	uint8_t ml_grp_id;
+
+	ml_grp_id = wlan_get_mlo_grp_id_from_pdev(pdev);
+	if (ml_grp_id >= WLAN_MAX_MLO_GROUPS) {
+		mgmt_rx_reo_err("REO context - Invalid ML Group ID");
+		return NULL;
+	}
+
+	return mgmt_rx_reo_get_context(ml_grp_id);
+}
+
 /**
  * mgmt_rx_reo_compare_pkt_ctrs_gte() - Compare given mgmt packet counters
  * @ctr1: Management packet counter1
@@ -309,15 +333,17 @@ mgmt_rx_reo_sim_is_valid_link(struct mgmt_rx_reo_sim_context *sim_context,
 
 /**
  * mgmt_rx_reo_is_valid_link() - Check whether the given HW link is valid
+ * @link_id: HW Link ID to be verified
+ * @grp_id: MLO Group id on which the Link ID  belongs to
  *
  * Return: true if @link_id is a valid link else false
  */
 static bool
-mgmt_rx_reo_is_valid_link(uint8_t link_id)
+mgmt_rx_reo_is_valid_link(uint8_t ml_grp_id, uint8_t link_id)
 {
 	struct mgmt_rx_reo_context *reo_context;
 
-	reo_context = mgmt_rx_reo_get_context();
+	reo_context = mgmt_rx_reo_get_context(ml_grp_id);
 
 	if (!reo_context) {
 		mgmt_rx_reo_err("Mgmt reo context is null");
@@ -382,16 +408,17 @@ mgmt_rx_reo_get_num_mlo_links(struct mgmt_rx_reo_context *reo_context,
 /**
  * mgmt_rx_reo_sim_get_context() - Helper API to get the management
  * rx reorder simulation context
+ * @ml_grp_id: MLO group id for the rx reordering
  *
  * Return: On success returns the pointer to management rx reorder
  * simulation context. On failure returns NULL.
  */
 static struct mgmt_rx_reo_sim_context *
-mgmt_rx_reo_sim_get_context(void)
+mgmt_rx_reo_sim_get_context(uint8_t ml_grp_id)
 {
 	struct mgmt_rx_reo_context *reo_context;
 
-	reo_context = mgmt_rx_reo_get_context();
+	reo_context = mgmt_rx_reo_get_context(ml_grp_id);
 	if (!reo_context) {
 		mgmt_rx_reo_err("Mgmt reo context is null");
 		return NULL;
@@ -1063,7 +1090,7 @@ wlan_mgmt_rx_reo_algo_calculate_wait_count(
 			goto update_pending_frames;
 		}
 
-		pdev = wlan_get_pdev_from_mlo_link_id(link,
+		pdev = wlan_get_pdev_from_mlo_link_id(link, grp_id,
 						      WLAN_MGMT_RX_REO_ID);
 
 		/* No need to wait for any frames if the pdev is not found */
@@ -2367,6 +2394,7 @@ mgmt_rx_reo_prepare_list_entry(
 	struct mgmt_rx_reo_list_entry *list_entry;
 	struct wlan_objmgr_pdev *pdev;
 	uint8_t link_id;
+	uint8_t ml_grp_id;
 
 	if (!frame_desc) {
 		mgmt_rx_reo_err("frame descriptor is null");
@@ -2379,8 +2407,10 @@ mgmt_rx_reo_prepare_list_entry(
 	}
 
 	link_id = mgmt_rx_reo_get_link_id(frame_desc->rx_params);
+	ml_grp_id = mgmt_rx_reo_get_mlo_grp_id(frame_desc->rx_params);
 
-	pdev = wlan_get_pdev_from_mlo_link_id(link_id, WLAN_MGMT_RX_REO_ID);
+	pdev = wlan_get_pdev_from_mlo_link_id(link_id, ml_grp_id,
+					      WLAN_MGMT_RX_REO_ID);
 	if (!pdev) {
 		mgmt_rx_reo_err("pdev corresponding to link %u is null",
 				link_id);
@@ -3359,7 +3389,7 @@ wlan_mgmt_rx_reo_algo_entry(struct wlan_objmgr_pdev *pdev,
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	reo_ctx = mgmt_rx_reo_get_context();
+	reo_ctx = wlan_mgmt_rx_reo_get_ctx_from_pdev(pdev);
 	if (!reo_ctx) {
 		mgmt_rx_reo_err("REO context is NULL");
 		return QDF_STATUS_E_NULL_VALUE;
@@ -3505,6 +3535,7 @@ failure:
  * mgmt_rx_reo_sim_init() - Initialize management rx reorder simulation
  * context.
  * @reo_context: Pointer to reo context
+ * @ml_grp_id: MLO group id which it belongs to
  *
  * Return: QDF_STATUS of operation
  */
@@ -3767,7 +3798,7 @@ mgmt_rx_reo_sim_process_rx_frame(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t buf,
 
 	reo_params = mgmt_rx_params->reo_params;
 
-	reo_context = mgmt_rx_reo_get_context();
+	reo_context = wlan_mgmt_rx_reo_get_ctx_from_pdev(pdev);
 	if (!reo_context) {
 		mgmt_rx_reo_err("Mgmt reo context is null");
 		return QDF_STATUS_E_NULL_VALUE;
@@ -3922,6 +3953,7 @@ mgmt_rx_reo_sim_frame_handler_host(void *arg)
 	QDF_STATUS status;
 	struct mgmt_rx_reo_sim_context *sim_context;
 	struct wlan_objmgr_pdev *pdev;
+	uint8_t ml_grp_id;
 
 	if (!frame_fw) {
 		mgmt_rx_reo_err("HOST-%d : Pointer to FW frame struct is null",
@@ -3938,6 +3970,8 @@ mgmt_rx_reo_sim_frame_handler_host(void *arg)
 		goto error_free_fw_frame;
 	}
 
+	ml_grp_id = sim_context->mlo_grp_id;
+
 	fw_to_host_delay_us = MGMT_RX_REO_SIM_DELAY_FW_TO_HOST_MIN +
 			      mgmt_rx_reo_sim_get_random_unsigned_int(
 			      MGMT_RX_REO_SIM_DELAY_FW_TO_HOST_MIN_MAX_DELTA);
@@ -3985,7 +4019,8 @@ mgmt_rx_reo_sim_frame_handler_host(void *arg)
 	rx_params->reo_params->mgmt_pkt_ctr = frame_fw->params.mgmt_pkt_ctr;
 	rx_params->reo_params->valid = true;
 
-	pdev = wlan_get_pdev_from_mlo_link_id(link_id, WLAN_MGMT_RX_REO_SIM_ID);
+	pdev = wlan_get_pdev_from_mlo_link_id(
+			link_id, ml_grp_id, WLAN_MGMT_RX_REO_SIM_ID);
 	if (!pdev) {
 		mgmt_rx_reo_err("No pdev corresponding to link_id %d", link_id);
 		goto error_free_mgmt_rx_event_params;
@@ -4029,6 +4064,7 @@ error_print:
  * @link_id: link id
  * @id: snapshot id
  * @value: snapshot value
+ * @ml_grp_id: MLO group id which it belongs to
  *
  * This API writes the snapshots used for management frame reordering. MAC HW
  * and FW can use this API to update the MAC HW/FW consumed/FW forwarded
@@ -4037,7 +4073,7 @@ error_print:
  * Return: QDF_STATUS
  */
 static QDF_STATUS
-mgmt_rx_reo_sim_write_snapshot(uint8_t link_id,
+mgmt_rx_reo_sim_write_snapshot(uint8_t link_id, uint8_t ml_grp_id,
 			       enum mgmt_rx_reo_shared_snapshot_id id,
 			       struct mgmt_rx_reo_shared_snapshot value)
 {
@@ -4045,7 +4081,9 @@ mgmt_rx_reo_sim_write_snapshot(uint8_t link_id,
 	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);
+	pdev = wlan_get_pdev_from_mlo_link_id(
+			link_id, ml_grp_id,
+			WLAN_MGMT_RX_REO_SIM_ID);
 
 	if (!pdev) {
 		mgmt_rx_reo_err("pdev is null");
@@ -4146,6 +4184,7 @@ mgmt_rx_reo_sim_frame_handler_fw(void *arg)
 	enum mgmt_rx_reo_shared_snapshot_id snapshot_id;
 	struct mgmt_rx_reo_shared_snapshot snapshot_value;
 	bool ret;
+	uint8_t ml_grp_id;
 
 	if (!frame_hw) {
 		mgmt_rx_reo_err("FW-%d : Pointer to HW frame struct is null",
@@ -4162,6 +4201,8 @@ mgmt_rx_reo_sim_frame_handler_fw(void *arg)
 		goto error_free_mac_hw_frame;
 	}
 
+	ml_grp_id = sim_context->mlo_grp_id;
+
 	mac_hw_to_fw_delay_us = MGMT_RX_REO_SIM_DELAY_MAC_HW_TO_FW_MIN +
 			mgmt_rx_reo_sim_get_random_unsigned_int(
 			MGMT_RX_REO_SIM_DELAY_MAC_HW_TO_FW_MIN_MAX_DELTA);
@@ -4211,8 +4252,9 @@ mgmt_rx_reo_sim_frame_handler_fw(void *arg)
 					frame_hw->params.global_timestamp,
 					frame_hw->params.mgmt_pkt_ctr);
 
-	status = mgmt_rx_reo_sim_write_snapshot(link_id, snapshot_id,
-						snapshot_value);
+	status = mgmt_rx_reo_sim_write_snapshot(
+			link_id, ml_grp_id,
+			snapshot_id, snapshot_value);
 
 	if (QDF_IS_STATUS_ERROR(status)) {
 		mgmt_rx_reo_err("FW-%d : Failed to write snapshot %d",
@@ -4389,6 +4431,7 @@ mgmt_rx_reo_sim_mac_hw_thread(void *data)
 		struct mgmt_rx_reo_shared_snapshot snapshot_value;
 		int8_t num_mlo_links;
 		bool ret;
+		uint8_t ml_grp_id;
 
 		num_mlo_links = mgmt_rx_reo_sim_get_num_mlo_links(sim_context);
 		if (num_mlo_links < 0 ||
@@ -4430,6 +4473,7 @@ mgmt_rx_reo_sim_mac_hw_thread(void *data)
 
 		frame_mac_hw->params = frame;
 		frame_mac_hw->sim_context = sim_context;
+		ml_grp_id = sim_context->ml_grp_id;
 
 		status = mgmt_rx_reo_sim_add_frame_to_pending_list(
 				&sim_context->master_frame_list, &frame);
@@ -4452,8 +4496,9 @@ mgmt_rx_reo_sim_mac_hw_thread(void *data)
 						frame.global_timestamp,
 						frame.mgmt_pkt_ctr);
 
-		status = mgmt_rx_reo_sim_write_snapshot(link_id, snapshot_id,
-							snapshot_value);
+		status = mgmt_rx_reo_sim_write_snapshot(
+				link_id, ml_grp_id
+				snapshot_id, snapshot_value);
 		if (QDF_IS_STATUS_ERROR(status)) {
 			mgmt_rx_reo_err("HW-%d : Failed to write snapshot %d",
 					link_id, snapshot_id);
@@ -4730,7 +4775,7 @@ mgmt_rx_reo_sim_pdev_object_destroy_notification(struct wlan_objmgr_pdev *pdev)
 }
 
 QDF_STATUS
-mgmt_rx_reo_sim_start(void)
+mgmt_rx_reo_sim_start(uint8_t ml_grp_id)
 {
 	struct mgmt_rx_reo_context *reo_context;
 	struct mgmt_rx_reo_sim_context *sim_context;
@@ -4739,7 +4784,7 @@ mgmt_rx_reo_sim_start(void)
 	uint8_t id;
 	QDF_STATUS status;
 
-	reo_context = mgmt_rx_reo_get_context();
+	reo_context = mgmt_rx_reo_get_context(ml_grp_id);
 	if (!reo_context) {
 		mgmt_rx_reo_err("reo context is null");
 		return QDF_STATUS_E_NULL_VALUE;
@@ -4806,7 +4851,7 @@ error_destroy_fw_and_host_work_queues_till_last_link:
 }
 
 QDF_STATUS
-mgmt_rx_reo_sim_stop(void)
+mgmt_rx_reo_sim_stop(uint8_t ml_grp_id)
 {
 	struct mgmt_rx_reo_context *reo_context;
 	struct mgmt_rx_reo_sim_context *sim_context;
@@ -4814,7 +4859,7 @@ mgmt_rx_reo_sim_stop(void)
 	uint8_t link_id;
 	QDF_STATUS status;
 
-	reo_context = mgmt_rx_reo_get_context();
+	reo_context = mgmt_rx_reo_get_context(ml_grp_id);
 	if (!reo_context) {
 		mgmt_rx_reo_err("reo context is null");
 		return QDF_STATUS_E_NULL_VALUE;
@@ -4878,6 +4923,7 @@ mgmt_rx_reo_sim_stop(void)
  * mgmt_rx_reo_sim_init() - Initialize management rx reorder simulation
  * context.
  * @reo_context: Pointer to reo context
+ * @ml_grp_id: MLO Group ID which it belongs to
  *
  * Return: QDF_STATUS of operation
  */
@@ -4896,6 +4942,7 @@ mgmt_rx_reo_sim_init(struct mgmt_rx_reo_context *reo_context)
 	sim_context = &reo_context->sim_context;
 
 	qdf_mem_zero(sim_context, sizeof(*sim_context));
+	sim_context->mlo_grp_id = reo_context->mlo_grp_id;
 
 	status = mgmt_rx_reo_sim_init_master_frame_list(
 					&sim_context->master_frame_list);
@@ -5118,7 +5165,7 @@ mgmt_rx_reo_debug_info_init(struct wlan_objmgr_pdev *pdev)
 	if (!wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(psoc))
 		return QDF_STATUS_SUCCESS;
 
-	reo_context = mgmt_rx_reo_get_context();
+	reo_context = wlan_mgmt_rx_reo_get_ctx_from_pdev(pdev);
 	if (!reo_context) {
 		mgmt_rx_reo_err("reo context is null");
 		return QDF_STATUS_E_NULL_VALUE;
@@ -5262,7 +5309,7 @@ mgmt_rx_reo_debug_info_deinit(struct wlan_objmgr_pdev *pdev)
 	if (!wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(psoc))
 		return QDF_STATUS_SUCCESS;
 
-	reo_context = mgmt_rx_reo_get_context();
+	reo_context = wlan_mgmt_rx_reo_get_ctx_from_pdev(pdev);
 	if (!reo_context) {
 		mgmt_rx_reo_err("reo context is null");
 		return QDF_STATUS_E_NULL_VALUE;
@@ -5368,12 +5415,12 @@ mgmt_rx_reo_list_deinit(struct mgmt_rx_reo_list *reo_list)
 }
 
 QDF_STATUS
-mgmt_rx_reo_deinit_context(void)
+mgmt_rx_reo_deinit_context(uint8_t ml_grp_id)
 {
 	QDF_STATUS status;
 	struct mgmt_rx_reo_context *reo_context;
 
-	reo_context = mgmt_rx_reo_get_context();
+	reo_context = mgmt_rx_reo_get_context(ml_grp_id);
 	if (!reo_context) {
 		mgmt_rx_reo_err("reo context is null");
 		return QDF_STATUS_E_NULL_VALUE;
@@ -5400,23 +5447,27 @@ mgmt_rx_reo_deinit_context(void)
 	}
 
 	qdf_mem_free(reo_context);
+	mgmt_rx_reo_set_context(ml_grp_id, NULL);
 
 	return QDF_STATUS_SUCCESS;
 }
 
 QDF_STATUS
-mgmt_rx_reo_init_context(void)
+mgmt_rx_reo_init_context(uint8_t ml_grp_id)
 {
 	QDF_STATUS status;
 	QDF_STATUS temp;
 	struct mgmt_rx_reo_context *reo_context;
 
-	reo_context = qdf_mem_malloc(sizeof(*reo_context));
+	reo_context = qdf_mem_malloc(sizeof(struct mgmt_rx_reo_context));
 	if (!reo_context) {
 		mgmt_rx_reo_err("Failed to allocate reo context");
 		return QDF_STATUS_E_NULL_VALUE;
 	}
-	mgmt_rx_reo_set_context(reo_context);
+
+	mgmt_rx_reo_set_context(ml_grp_id, reo_context);
+
+	reo_context->mlo_grp_id = ml_grp_id;
 
 	status = mgmt_rx_reo_list_init(&reo_context->reo_list);
 	if (QDF_IS_STATUS_ERROR(status)) {
@@ -5772,11 +5823,11 @@ mgmt_rx_reo_psoc_obj_destroy_notification(struct wlan_objmgr_psoc *psoc)
 }
 
 bool
-mgmt_rx_reo_is_simulation_in_progress(void)
+mgmt_rx_reo_is_simulation_in_progress(uint8_t ml_grp_id)
 {
 	struct mgmt_rx_reo_context *reo_context;
 
-	reo_context = mgmt_rx_reo_get_context();
+	reo_context = mgmt_rx_reo_get_context(ml_grp_id);
 	if (!reo_context) {
 		mgmt_rx_reo_err("reo context is null");
 		return false;
@@ -5787,12 +5838,12 @@ mgmt_rx_reo_is_simulation_in_progress(void)
 
 #ifdef WLAN_MGMT_RX_REO_DEBUG_SUPPORT
 QDF_STATUS
-mgmt_rx_reo_print_ingress_frame_stats(void)
+mgmt_rx_reo_print_ingress_frame_stats(uint8_t ml_grp_id)
 {
 	struct mgmt_rx_reo_context *reo_context;
 	QDF_STATUS status;
 
-	reo_context = mgmt_rx_reo_get_context();
+	reo_context = mgmt_rx_reo_get_context(ml_grp_id);
 	if (!reo_context) {
 		mgmt_rx_reo_err("reo context is null");
 		return QDF_STATUS_E_NULL_VALUE;
@@ -5808,12 +5859,12 @@ mgmt_rx_reo_print_ingress_frame_stats(void)
 }
 
 QDF_STATUS
-mgmt_rx_reo_print_ingress_frame_info(uint16_t num_frames)
+mgmt_rx_reo_print_ingress_frame_info(uint8_t ml_grp_id, uint16_t num_frames)
 {
 	struct mgmt_rx_reo_context *reo_context;
 	QDF_STATUS status;
 
-	reo_context = mgmt_rx_reo_get_context();
+	reo_context = mgmt_rx_reo_get_context(ml_grp_id);
 	if (!reo_context) {
 		mgmt_rx_reo_err("reo context is null");
 		return QDF_STATUS_E_NULL_VALUE;
@@ -5830,12 +5881,12 @@ mgmt_rx_reo_print_ingress_frame_info(uint16_t num_frames)
 }
 
 QDF_STATUS
-mgmt_rx_reo_print_egress_frame_stats(void)
+mgmt_rx_reo_print_egress_frame_stats(uint8_t ml_grp_id)
 {
 	struct mgmt_rx_reo_context *reo_context;
 	QDF_STATUS status;
 
-	reo_context = mgmt_rx_reo_get_context();
+	reo_context = mgmt_rx_reo_get_context(ml_grp_id);
 	if (!reo_context) {
 		mgmt_rx_reo_err("reo context is null");
 		return QDF_STATUS_E_NULL_VALUE;
@@ -5851,12 +5902,12 @@ mgmt_rx_reo_print_egress_frame_stats(void)
 }
 
 QDF_STATUS
-mgmt_rx_reo_print_egress_frame_info(uint16_t num_frames)
+mgmt_rx_reo_print_egress_frame_info(uint8_t ml_grp_id, uint16_t num_frames)
 {
 	struct mgmt_rx_reo_context *reo_context;
 	QDF_STATUS status;
 
-	reo_context = mgmt_rx_reo_get_context();
+	reo_context = mgmt_rx_reo_get_context(ml_grp_id);
 	if (!reo_context) {
 		mgmt_rx_reo_err("reo context is null");
 		return QDF_STATUS_E_NULL_VALUE;
@@ -5873,25 +5924,25 @@ mgmt_rx_reo_print_egress_frame_info(uint16_t num_frames)
 }
 #else
 QDF_STATUS
-mgmt_rx_reo_print_ingress_frame_stats(void)
+mgmt_rx_reo_print_ingress_frame_stats(uint8_t ml_grp_id)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 QDF_STATUS
-mgmt_rx_reo_print_ingress_frame_info(uint16_t num_frames)
+mgmt_rx_reo_print_ingress_frame_info(uint8_t ml_grp_id, uint16_t num_frames)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 QDF_STATUS
-mgmt_rx_reo_print_egress_frame_stats(void)
+mgmt_rx_reo_print_egress_frame_stats(uint8_t ml_grp_id)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 QDF_STATUS
-mgmt_rx_reo_print_egress_frame_info(uint16_t num_frames)
+mgmt_rx_reo_print_egress_frame_info(uint8_t ml_grp_id, uint16_t num_frames)
 {
 	return QDF_STATUS_SUCCESS;
 }

+ 42 - 12
umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo_i.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 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
@@ -443,6 +443,7 @@ struct mgmt_rx_reo_mac_hw_simulator {
  * @mac_hw_sim:  MAC HW simulation object
  * @snapshot: snapshots required for reo algorithm
  * @link_id_to_pdev_map: link_id to pdev object map
+ * @mlo_grp_id: MLO group id which it belongs to
  */
 struct mgmt_rx_reo_sim_context {
 	struct workqueue_struct *host_mgmt_frame_handler[MAX_MLO_LINKS];
@@ -452,6 +453,7 @@ struct mgmt_rx_reo_sim_context {
 	struct mgmt_rx_reo_snapshot snapshot[MAX_MLO_LINKS]
 					    [MGMT_RX_REO_SHARED_SNAPSHOT_MAX];
 	struct mgmt_rx_reo_sim_link_id_to_pdev_map link_id_to_pdev_map;
+	uint8_t mlo_grp_id;
 };
 #endif /* WLAN_MGMT_RX_REO_SIM_SUPPORT */
 
@@ -690,6 +692,7 @@ struct reo_egress_debug_info {
  * object @egress_frame_debug_info
  * @simulation_in_progress: Flag to indicate whether simulation is
  * in progress
+ * @mlo_grp_id: MLO Group ID which it belongs to
  */
 struct mgmt_rx_reo_context {
 	struct mgmt_rx_reo_list reo_list;
@@ -705,6 +708,7 @@ struct mgmt_rx_reo_context {
 	struct  reo_egress_debug_info egress_frame_debug_info;
 #endif /* WLAN_MGMT_RX_REO_DEBUG_SUPPORT */
 	bool simulation_in_progress;
+	uint8_t mlo_grp_id;
 };
 
 /**
@@ -870,6 +874,22 @@ mgmt_rx_reo_get_link_id(struct mgmt_rx_event_params *rx_params)
 	return rx_params->reo_params->link_id;
 }
 
+/**
+ * mgmt_rx_reo_get_mlo_grp_id() - Helper API to get MLO Group id
+ * corresponding to the mgmt rx event
+ * @rx_params: Management rx event params
+ *
+ * Return: MLO group id corresponding to the mgmt rx event
+ */
+static inline uint8_t
+mgmt_rx_reo_get_mlo_grp_id(struct mgmt_rx_event_params *rx_params)
+{
+	qdf_assert_always(rx_params);
+	qdf_assert_always(rx_params->reo_params);
+
+	return rx_params->reo_params->mlo_grp_id;
+}
+
 /**
  * mgmt_rx_reo_get_pdev_id() - Helper API to get pdev id corresponding to the
  * mgmt rx event
@@ -888,37 +908,42 @@ mgmt_rx_reo_get_pdev_id(struct mgmt_rx_event_params *rx_params)
 
 /**
  * mgmt_rx_reo_init_context() - Initialize the management rx-reorder context
+ * @ml_grp_id: MLO Group ID to be initialized
  *
- * API to initialize the global management rx-reorder context object.
+ * API to initialize each global management rx-reorder context object per group
  *
  * Return: QDF_STATUS
  */
 QDF_STATUS
-mgmt_rx_reo_init_context(void);
+mgmt_rx_reo_init_context(uint8_t ml_grp_id);
 
 /**
  * mgmt_rx_reo_deinit_context() - De initialize the management rx-reorder
  * context
+ * @ml_grp_id: MLO Group ID to be deinitialized
  *
- * API to de initialize the global management rx-reorder context object.
+ * API to de initialize each global management rx-reorder context object per
+ * group
  *
  * Return: QDF_STATUS
  */
 QDF_STATUS
-mgmt_rx_reo_deinit_context(void);
+mgmt_rx_reo_deinit_context(uint8_t ml_grp_id);
 
 /**
  * mgmt_rx_reo_is_simulation_in_progress() - API to check whether
  * simulation is in progress
+ * @ml_grp_id: MLO group id of mgmt rx reo
  *
  * Return: true if simulation is in progress, else false
  */
 bool
-mgmt_rx_reo_is_simulation_in_progress(void);
+mgmt_rx_reo_is_simulation_in_progress(uint8_t ml_grp_id);
 
 /**
  * mgmt_rx_reo_print_ingress_frame_stats() - Helper API to print
  * stats related to incoming management frames
+ * @ml_grp_id: MLO group id of mgmt rx reo
  *
  * This API prints stats related to management frames entering management
  * Rx reorder module.
@@ -926,11 +951,12 @@ mgmt_rx_reo_is_simulation_in_progress(void);
  * Return: QDF_STATUS
  */
 QDF_STATUS
-mgmt_rx_reo_print_ingress_frame_stats(void);
+mgmt_rx_reo_print_ingress_frame_stats(uint8_t ml_grp_id);
 
 /**
  * mgmt_rx_reo_print_ingress_frame_info() - Print the debug information
  * about the latest frames entered the reorder module
+ * @ml_grp_id: MLO group id of mgmt rx reo
  * @num_frames: Number of frames for which the debug information is to be
  * printed. If @num_frames is 0, then debug information about all the frames
  * in the ring buffer will be  printed.
@@ -938,11 +964,12 @@ mgmt_rx_reo_print_ingress_frame_stats(void);
  * Return: QDF_STATUS of operation
  */
 QDF_STATUS
-mgmt_rx_reo_print_ingress_frame_info(uint16_t num_frames);
+mgmt_rx_reo_print_ingress_frame_info(uint8_t ml_grp_id, uint16_t num_frames);
 
 /**
  * mgmt_rx_reo_print_egress_frame_stats() - Helper API to print
  * stats related to outgoing management frames
+ * @ml_grp_id: MLO group id of mgmt rx reo
  *
  * This API prints stats related to management frames exiting management
  * Rx reorder module.
@@ -950,11 +977,12 @@ mgmt_rx_reo_print_ingress_frame_info(uint16_t num_frames);
  * Return: QDF_STATUS
  */
 QDF_STATUS
-mgmt_rx_reo_print_egress_frame_stats(void);
+mgmt_rx_reo_print_egress_frame_stats(uint8_t ml_grp_id);
 
 /**
  * mgmt_rx_reo_print_egress_frame_info() - Print the debug information
  * about the latest frames leaving the reorder module
+ * @ml_grp_id: MLO group id of mgmt rx reo
  * @num_frames: Number of frames for which the debug information is to be
  * printed. If @num_frames is 0, then debug information about all the frames
  * in the ring buffer will be  printed.
@@ -962,12 +990,13 @@ mgmt_rx_reo_print_egress_frame_stats(void);
  * Return: QDF_STATUS of operation
  */
 QDF_STATUS
-mgmt_rx_reo_print_egress_frame_info(uint16_t num_frames);
+mgmt_rx_reo_print_egress_frame_info(uint8_t ml_grp_id, uint16_t num_frames);
 
 #ifdef WLAN_MGMT_RX_REO_SIM_SUPPORT
 /**
  * mgmt_rx_reo_sim_start() - Helper API to start management Rx reorder
  * simulation
+ * @ml_grp_id: MLO group id of mgmt rx reo
  *
  * This API starts the simulation framework which mimics the management frame
  * generation by target. MAC HW is modelled as a kthread. FW and host layers
@@ -976,11 +1005,12 @@ mgmt_rx_reo_print_egress_frame_info(uint16_t num_frames);
  * Return: QDF_STATUS
  */
 QDF_STATUS
-mgmt_rx_reo_sim_start(void);
+mgmt_rx_reo_sim_start(uint8_t ml_grp_id);
 
 /**
  * mgmt_rx_reo_sim_stop() - Helper API to stop management Rx reorder
  * simulation
+ * @ml_grp_id: MLO group id of mgmt rx reo
  *
  * This API stops the simulation framework which mimics the management frame
  * generation by target. MAC HW is modelled as a kthread. FW and host layers
@@ -989,7 +1019,7 @@ mgmt_rx_reo_sim_start(void);
  * Return: QDF_STATUS
  */
 QDF_STATUS
-mgmt_rx_reo_sim_stop(void);
+mgmt_rx_reo_sim_stop(uint8_t ml_grp_id);
 
 /**
  * mgmt_rx_reo_sim_process_rx_frame() - API to process the management frame

+ 3 - 1
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-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 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
@@ -109,6 +109,7 @@ struct mgmt_rx_reo_snapshot_info {
  * @valid: Whether these params are valid
  * @pdev_id: pdev ID for which FW consumed event is received
  * @link_id: link ID for which FW consumed event is received
+ * @mlo_grp_id: MLO group ID which it belongs to
  * @mgmt_pkt_ctr: MGMT packet counter of the frame that is consumed
  * @global_timestamp: Global timestamp of the frame that is consumed
  * @duration_us: duration in us
@@ -119,6 +120,7 @@ struct mgmt_rx_reo_params {
 	bool valid;
 	uint8_t pdev_id;
 	uint8_t link_id;
+	uint8_t mlo_grp_id;
 	uint16_t mgmt_pkt_ctr;
 	uint32_t global_timestamp;
 	uint16_t duration_us;

+ 14 - 6
umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_rx_reo_ucfg_api.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 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
@@ -28,6 +28,7 @@
 /**
  * ucfg_wlan_mgmt_rx_reo_sim_start() - Helper API to start mgmt rx reorder
  * simulation
+ * @ml_grp_id: MLO Group ID to be checked against.
  *
  * This API starts the simulation framework which mimics the management frame
  * generation by target. MAC HW is modelled as a kthread. FW and host layers
@@ -36,39 +37,44 @@
  * Return: QDF_STATUS
  */
 QDF_STATUS
-ucfg_wlan_mgmt_rx_reo_sim_start(void);
+ucfg_wlan_mgmt_rx_reo_sim_start(uint8_t ml_grp_id);
 
 /**
  * ucfg_wlan_mgmt_rx_reo_sim_stop() - Helper API to stop mgmt rx reorder
  * simulation
+ * @ml_grp_id: MLO Group ID to be checked against.
  *
  * This API stops the simulation framework which mimics the management frame
  * generation by target. MAC HW is modelled as a kthread. FW and host layers
  * are modelled as an ordered work queues.
+ *
  * Return: QDF_STATUS
  */
 QDF_STATUS
-ucfg_wlan_mgmt_rx_reo_sim_stop(void);
+ucfg_wlan_mgmt_rx_reo_sim_stop(uint8_t ml_grp_id);
 
 /**
  * ucfg_wlan_mgmt_rx_reo_is_simulation_in_progress() - API to check whether
  * simulation is in progress
+ * @ml_grp_id: MLO Group ID to be checked against.
  *
  * Return: true if simulation is in progress, else false
  */
 bool
-ucfg_wlan_mgmt_rx_reo_is_simulation_in_progress(void);
+ucfg_wlan_mgmt_rx_reo_is_simulation_in_progress(uint8_t ml_grp_id);
 
 #else
 /**
  * ucfg_wlan_mgmt_rx_reo_sim_start() - Helper API to start mgmt rx
  * reorder simulation
+ * @ml_grp_id: MLO Group ID to be checked against.
  *
  * Error print is added to indicate that simulation framework is not compiled.
+ *
  * Return: QDF_STATUS_E_INVAL
  */
 static inline QDF_STATUS
-ucfg_wlan_mgmt_rx_reo_sim_start(void)
+ucfg_wlan_mgmt_rx_reo_sim_start(uint8_t ml_grp_id)
 {
 	mgmt_txrx_err("Mgmt rx reo simulation is not compiled");
 
@@ -78,12 +84,14 @@ ucfg_wlan_mgmt_rx_reo_sim_start(void)
 /**
  * ucfg_wlan_mgmt_rx_reo_sim_stop() - Helper API to stop mgmt rx
  * reorder simulation
+ * @ml_grp_id: MLO Group ID to be checked against.
  *
  * Error print is added to indicate that simulation framework is not compiled.
+ *
  * Return: QDF_STATUS_E_INVAL
  */
 static inline QDF_STATUS
-ucfg_wlan_mgmt_rx_reo_sim_stop(void)
+ucfg_wlan_mgmt_rx_reo_sim_stop(uint8_t ml_grp_id)
 {
 	mgmt_txrx_err("Mgmt rx reo simulation is not compiled");
 

+ 23 - 11
umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_rx_reo_utils_api.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 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
@@ -56,13 +56,14 @@ wlan_get_mlo_grp_id_from_pdev(struct wlan_objmgr_pdev *pdev);
  * wlan_get_pdev_from_mlo_link_id() - Helper API to get the pdev
  * object from the link id.
  * @mlo_link_id: MLO HW link id
+ * @ml_grp_id: MLO Group id which it belongs to
  * @refdbgid: Reference debug id
  *
  * Return: On success returns the pdev object from the link_id.
  * On failure returns NULL.
  */
 struct wlan_objmgr_pdev *
-wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id,
+wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id, uint8_t ml_grp_id,
 			       wlan_objmgr_ref_dbgid refdbgid);
 
 #ifdef WLAN_MGMT_RX_REO_SUPPORT
@@ -114,15 +115,17 @@ wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id,
  * This API starts the simulation framework which mimics the management frame
  * generation by target. MAC HW is modelled as a kthread. FW and host layers
  * are modelled as an ordered work queues.
+ * @ml_grp_id: MLO group id of the required mlo context
  *
  * Return: QDF_STATUS
  */
 QDF_STATUS
-wlan_mgmt_rx_reo_sim_start(void);
+wlan_mgmt_rx_reo_sim_start(uint8_t ml_grp_id);
 
 /**
  * wlan_mgmt_rx_reo_sim_stop() - Helper API to stop management Rx reorder
  * simulation
+ * @ml_grp_id: MLO group id of the required mlo context
  *
  * This API stops the simulation framework which mimics the management frame
  * generation by target. MAC HW is modelled as a kthread. FW and host layers
@@ -131,18 +134,19 @@ wlan_mgmt_rx_reo_sim_start(void);
  * Return: QDF_STATUS
  */
 QDF_STATUS
-wlan_mgmt_rx_reo_sim_stop(void);
+wlan_mgmt_rx_reo_sim_stop(uint8_t ml_grp_id);
 #else
 /**
  * wlan_mgmt_rx_reo_sim_start() - Helper API to start management Rx reorder
  * simulation
+ * @ml_grp_id: MLO group id of the required mlo context
  *
  * Error print is added to indicate that simulation framework is not compiled.
  *
  * Return: QDF_STATUS_E_INVAL
  */
 static inline QDF_STATUS
-wlan_mgmt_rx_reo_sim_start(void)
+wlan_mgmt_rx_reo_sim_start(uint8_t ml_grp_id)
 {
 	mgmt_txrx_err("Mgmt rx reo simulation is not compiled");
 
@@ -152,13 +156,14 @@ wlan_mgmt_rx_reo_sim_start(void)
 /**
  * wlan_mgmt_rx_reo_sim_stop() - Helper API to stop management Rx reorder
  * simulation
+ * @ml_grp_id: MLO group id of the required mlo context
  *
  * Error print is added to indicate that simulation framework is not compiled.
  *
  * Return: QDF_STATUS_E_INVAL
  */
 static inline QDF_STATUS
-wlan_mgmt_rx_reo_sim_stop(void)
+wlan_mgmt_rx_reo_sim_stop(uint8_t ml_grp_id)
 {
 	mgmt_txrx_err("Mgmt rx reo simulation is not compiled");
 
@@ -366,15 +371,17 @@ wlan_mgmt_rx_reo_get_egress_frame_debug_list_size
 /**
  * wlan_mgmt_rx_reo_is_simulation_in_progress() - API to check whether
  * simulation is in progress
+ * @ml_grp_id: MLO group id of the required mlo context
  *
  * Return: true if simulation is in progress, else false
  */
 bool
-wlan_mgmt_rx_reo_is_simulation_in_progress(void);
+wlan_mgmt_rx_reo_is_simulation_in_progress(uint8_t ml_grp_id);
 
 /**
  * wlan_mgmt_rx_reo_print_ingress_frame_stats() - Helper API to print
  * stats related to incoming management frames
+ * @ml_grp_id: MLO group id of the required mlo context
  *
  * This API prints stats related to management frames entering management
  * Rx reorder module.
@@ -382,11 +389,12 @@ wlan_mgmt_rx_reo_is_simulation_in_progress(void);
  * Return: QDF_STATUS
  */
 QDF_STATUS
-wlan_mgmt_rx_reo_print_ingress_frame_stats(void);
+wlan_mgmt_rx_reo_print_ingress_frame_stats(uint8_t ml_grp_id);
 
 /**
  * wlan_mgmt_rx_reo_print_ingress_frame_info() - Print the debug information
  * about the latest frames entered the reorder module
+ * @ml_grp_id: MLO group id of the required mlo context
  * @num_frames: Number of frames for which the debug information is to be
  * printed. If @num_frames is 0, then debug information about all the frames
  * in the ring buffer will be  printed.
@@ -394,11 +402,13 @@ wlan_mgmt_rx_reo_print_ingress_frame_stats(void);
  * Return: QDF_STATUS of operation
  */
 QDF_STATUS
-wlan_mgmt_rx_reo_print_ingress_frame_info(uint16_t num_frames);
+wlan_mgmt_rx_reo_print_ingress_frame_info(uint8_t ml_grp_id,
+					  uint16_t num_frames);
 
 /**
  * wlan_mgmt_rx_reo_print_egress_frame_stats() - Helper API to print
  * stats related to outgoing management frames
+ * @ml_grp_id: MLO group id of the required mlo context
  *
  * This API prints stats related to management frames exiting management
  * Rx reorder module.
@@ -406,7 +416,7 @@ wlan_mgmt_rx_reo_print_ingress_frame_info(uint16_t num_frames);
  * Return: QDF_STATUS
  */
 QDF_STATUS
-wlan_mgmt_rx_reo_print_egress_frame_stats(void);
+wlan_mgmt_rx_reo_print_egress_frame_stats(uint8_t ml_grp_id);
 
 /**
  * wlan_mgmt_rx_reo_print_egress_frame_info() - Print the debug information
@@ -414,11 +424,13 @@ wlan_mgmt_rx_reo_print_egress_frame_stats(void);
  * @num_frames: Number of frames for which the debug information is to be
  * printed. If @num_frames is 0, then debug information about all the frames
  * in the ring buffer will be  printed.
+ * @ml_grp_id: MLO group id of the required mlo context
  *
  * Return: QDF_STATUS of operation
  */
 QDF_STATUS
-wlan_mgmt_rx_reo_print_egress_frame_info(uint16_t num_frames);
+wlan_mgmt_rx_reo_print_egress_frame_info(uint8_t ml_grp_id,
+					 uint16_t num_frames);
 #else
 static inline QDF_STATUS
 wlan_mgmt_rx_reo_validate_mlo_link_info(struct wlan_objmgr_psoc *psoc)

+ 46 - 3
umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_rx_reo_tgt_api.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 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
@@ -21,6 +21,7 @@
  *  definitions
  */
 #include <wlan_mgmt_txrx_rx_reo_tgt_api.h>
+#include <wlan_mlo_mgr_cmn.h>
 #include "../../core/src/wlan_mgmt_txrx_rx_reo_i.h"
 #include <../../core/src/wlan_mgmt_txrx_main_i.h>
 
@@ -113,6 +114,7 @@ tgt_mgmt_rx_reo_enter_algo_without_buffer(
 	bool is_frm_queued;
 	QDF_STATUS status;
 	int8_t link_id;
+	uint8_t ml_grp_id;
 
 	if (!pdev) {
 		mgmt_rx_reo_err("pdev is null");
@@ -139,8 +141,15 @@ tgt_mgmt_rx_reo_enter_algo_without_buffer(
 		return QDF_STATUS_E_INVAL;
 	}
 
-	reo_params->link_id = link_id;
+	ml_grp_id = wlan_get_mlo_grp_id_from_pdev(pdev);
+	if (ml_grp_id > WLAN_MAX_MLO_GROUPS) {
+		mgmt_rx_reo_err("Invalid MLO Group  %d for the pdev",
+				ml_grp_id);
+		return QDF_STATUS_E_INVAL;
+	}
 
+	reo_params->link_id = link_id;
+	reo_params->mlo_grp_id = ml_grp_id;
 	mgmt_rx_params.reo_params = reo_params;
 
 	desc.nbuf = NULL; /* No frame buffer */
@@ -219,6 +228,31 @@ tgt_mgmt_rx_reo_get_snapshot_info
 								snapshot_info);
 }
 
+bool
+wlan_mgmt_rx_reo_check_simulation_in_progress(struct wlan_objmgr_pdev *pdev)
+{
+	uint8_t ml_grp_id;
+	struct wlan_objmgr_psoc *psoc;
+
+	psoc = wlan_pdev_get_psoc(pdev);
+	if (!psoc)
+		return false;
+
+	if (!wlan_mlo_get_psoc_capable(psoc))
+		return false;
+
+	ml_grp_id = wlan_get_mlo_grp_id_from_pdev(pdev);
+	if (ml_grp_id > WLAN_MAX_MLO_GROUPS) {
+		mgmt_rx_reo_err("INVALID ML Group ID for the PDEV");
+		return false;
+	}
+
+	if (!wlan_mgmt_rx_reo_is_simulation_in_progress(ml_grp_id))
+		return false;
+
+	return true;
+}
+
 QDF_STATUS tgt_mgmt_rx_reo_frame_handler(
 				struct wlan_objmgr_pdev *pdev,
 				qdf_nbuf_t buf,
@@ -228,6 +262,7 @@ QDF_STATUS tgt_mgmt_rx_reo_frame_handler(
 	struct mgmt_rx_reo_frame_descriptor desc = {0};
 	bool is_queued;
 	int8_t link_id;
+	uint8_t ml_grp_id;
 	uint8_t frame_type;
 	uint8_t frame_subtype;
 	struct ieee80211_frame *wh;
@@ -238,7 +273,7 @@ QDF_STATUS tgt_mgmt_rx_reo_frame_handler(
 		goto cleanup;
 	}
 
-	if (!wlan_mgmt_rx_reo_is_simulation_in_progress() && !buf) {
+	if (!wlan_mgmt_rx_reo_check_simulation_in_progress(pdev) && !buf) {
 		mgmt_rx_reo_err("nbuf is NULL");
 		status = QDF_STATUS_E_NULL_VALUE;
 		goto cleanup;
@@ -274,7 +309,15 @@ QDF_STATUS tgt_mgmt_rx_reo_frame_handler(
 		goto cleanup;
 	}
 
+	ml_grp_id = wlan_get_mlo_grp_id_from_pdev(pdev);
+	if (ml_grp_id > WLAN_MAX_MLO_GROUPS) {
+		mgmt_rx_reo_err("Invalid MGMT rx reo Group id");
+		status = QDF_STATUS_E_INVAL;
+		goto cleanup;
+	}
+
 	mgmt_rx_params->reo_params->link_id = link_id;
+	mgmt_rx_params->reo_params->mlo_grp_id = ml_grp_id;
 
 	/* Populate frame descriptor */
 	desc.type = MGMT_RX_REO_FRAME_DESC_HOST_CONSUMED_FRAME;

+ 9 - 9
umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_rx_reo_ucfg_api.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 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
@@ -25,13 +25,13 @@
 #include <cfg_ucfg_api.h>
 
 QDF_STATUS
-ucfg_wlan_mgmt_rx_reo_sim_start(void)
+ucfg_wlan_mgmt_rx_reo_sim_start(uint8_t ml_grp_id)
 {
 	QDF_STATUS status;
 
-	if (!wlan_mgmt_rx_reo_is_simulation_in_progress()) {
+	if (!wlan_mgmt_rx_reo_is_simulation_in_progress(ml_grp_id)) {
 		mgmt_rx_reo_debug("Starting rx reo simulation");
-		status = wlan_mgmt_rx_reo_sim_start();
+		status = wlan_mgmt_rx_reo_sim_start(ml_grp_id);
 		if (QDF_IS_STATUS_ERROR(status)) {
 			mgmt_rx_reo_err("Failed to start rx reo sim");
 			return status;
@@ -45,13 +45,13 @@ ucfg_wlan_mgmt_rx_reo_sim_start(void)
 qdf_export_symbol(ucfg_wlan_mgmt_rx_reo_sim_start);
 
 QDF_STATUS
-ucfg_wlan_mgmt_rx_reo_sim_stop(void)
+ucfg_wlan_mgmt_rx_reo_sim_stop(uint8_t ml_grp_id)
 {
 	QDF_STATUS status;
 
-	if (wlan_mgmt_rx_reo_is_simulation_in_progress()) {
+	if (wlan_mgmt_rx_reo_is_simulation_in_progress(ml_grp_id)) {
 		mgmt_rx_reo_debug("Stopping simulation");
-		status = wlan_mgmt_rx_reo_sim_stop();
+		status = wlan_mgmt_rx_reo_sim_stop(ml_grp_id);
 		if (QDF_IS_STATUS_ERROR(status)) {
 			mgmt_rx_reo_err("Failed to stop rx reo sim");
 			return status;
@@ -65,9 +65,9 @@ ucfg_wlan_mgmt_rx_reo_sim_stop(void)
 qdf_export_symbol(ucfg_wlan_mgmt_rx_reo_sim_stop);
 
 bool
-ucfg_wlan_mgmt_rx_reo_is_simulation_in_progress(void)
+ucfg_wlan_mgmt_rx_reo_is_simulation_in_progress(uint8_t ml_grp_id)
 {
-	return wlan_mgmt_rx_reo_is_simulation_in_progress();
+	return wlan_mgmt_rx_reo_is_simulation_in_progress(ml_grp_id);
 }
 
 qdf_export_symbol(ucfg_wlan_mgmt_rx_reo_is_simulation_in_progress);

+ 66 - 25
umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_rx_reo_utils_api.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 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
@@ -32,13 +32,33 @@
 QDF_STATUS
 wlan_mgmt_rx_reo_deinit(void)
 {
-	return mgmt_rx_reo_deinit_context();
+	uint8_t ml_grp;
+	uint8_t total_mlo_grps = WLAN_MAX_MLO_GROUPS;
+
+	if (total_mlo_grps > WLAN_MAX_MLO_GROUPS)
+		return QDF_STATUS_E_INVAL;
+
+	for (ml_grp = 0; ml_grp < total_mlo_grps; ml_grp++)
+		if (mgmt_rx_reo_deinit_context(ml_grp))
+			return QDF_STATUS_E_INVAL;
+
+	return QDF_STATUS_SUCCESS;
 }
 
 QDF_STATUS
 wlan_mgmt_rx_reo_init(void)
 {
-	return mgmt_rx_reo_init_context();
+	uint8_t ml_grp;
+	uint8_t total_mlo_grps = WLAN_MAX_MLO_GROUPS;
+
+	if (total_mlo_grps > WLAN_MAX_MLO_GROUPS)
+		return QDF_STATUS_E_INVAL;
+
+	for (ml_grp = 0; ml_grp < total_mlo_grps; ml_grp++)
+		if (mgmt_rx_reo_init_context(ml_grp))
+			return QDF_STATUS_E_INVAL;
+
+	return QDF_STATUS_SUCCESS;
 }
 
 #ifndef WLAN_MGMT_RX_REO_SIM_SUPPORT
@@ -87,15 +107,22 @@ qdf_export_symbol(wlan_get_mlo_link_id_from_pdev);
 int8_t
 wlan_get_mlo_grp_id_from_pdev(struct wlan_objmgr_pdev *pdev)
 {
+	uint8_t ml_grp_id;
 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
-	uint8_t grp_id;
 
-	if (!mlo_psoc_get_grp_id(psoc, &grp_id)) {
-		mgmt_rx_reo_err("Failed to get valid MLO Group id");
+	if (!psoc) {
+		mgmt_rx_reo_err("PSOC is NUll");
+		return -EINVAL;
+	}
+
+	ml_grp_id = wlan_mlo_get_psoc_group_id(psoc);
+
+	if (ml_grp_id >= WLAN_MAX_MLO_GROUPS) {
+		mgmt_rx_reo_debug("Invalid MLO Group ID for the pdev");
 		return -EINVAL;
 	}
 
-	return grp_id;
+	return ml_grp_id;
 }
 
 qdf_export_symbol(wlan_get_mlo_grp_id_from_pdev);
@@ -104,16 +131,18 @@ qdf_export_symbol(wlan_get_mlo_grp_id_from_pdev);
  * wlan_get_pdev_from_mlo_link_id() - Helper API to get the pdev
  * object from the MLO HW link id.
  * @mlo_link_id: MLO HW link id
+ * @ml_grp_id: MLO Group id which it belongs to
  * @refdbgid: Reference debug id
  *
  * Return: On success returns the pdev object from the MLO HW link_id.
  * On failure returns NULL.
  */
 struct wlan_objmgr_pdev *
-wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id,
+wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id, uint8_t ml_grp_id,
 			       wlan_objmgr_ref_dbgid refdbgid)
 {
-	return wlan_mlo_get_pdev_by_hw_link_id(mlo_link_id, refdbgid);
+	return wlan_mlo_get_pdev_by_hw_link_id(
+			mlo_link_id, ml_grp_id, refdbgid);
 }
 
 qdf_export_symbol(wlan_get_pdev_from_mlo_link_id);
@@ -167,16 +196,18 @@ qdf_export_symbol(wlan_get_mlo_link_id_from_pdev);
  * wlan_get_pdev_from_mlo_link_id() - Helper API to get the pdev
  * object from the MLO HW link id.
  * @mlo_link_id: MLO HW link id
+ * @ml_grp_id: MLO Group id which it belongs to
  * @refdbgid: Reference debug id
  *
  * Return: On success returns the pdev object from the MLO HW link_id.
  * On failure returns NULL.
  */
 struct wlan_objmgr_pdev *
-wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id,
+wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id, uint8_t ml_grp_id,
 			       wlan_objmgr_ref_dbgid refdbgid)
 {
-	return mgmt_rx_reo_sim_get_pdev_from_mlo_link_id(mlo_link_id, refdbgid);
+	return mgmt_rx_reo_sim_get_pdev_from_mlo_link_id(
+			mlo_link_id, ml_grp_id, refdbgid);
 }
 
 qdf_export_symbol(wlan_get_pdev_from_mlo_link_id);
@@ -308,48 +339,58 @@ wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(struct wlan_objmgr_pdev *pdev)
 }
 
 QDF_STATUS
-wlan_mgmt_rx_reo_sim_start(void)
+wlan_mgmt_rx_reo_sim_start(uint8_t ml_grp_id)
 {
-	return mgmt_rx_reo_sim_start();
+	return mgmt_rx_reo_sim_start(ml_grp_id);
 }
 
 qdf_export_symbol(wlan_mgmt_rx_reo_sim_start);
 
 QDF_STATUS
-wlan_mgmt_rx_reo_sim_stop(void)
+wlan_mgmt_rx_reo_sim_stop(uint8_t ml_grp_id)
 {
-	return mgmt_rx_reo_sim_stop();
+	return mgmt_rx_reo_sim_stop(ml_grp_id);
 }
 
 qdf_export_symbol(wlan_mgmt_rx_reo_sim_stop);
 #endif /* WLAN_MGMT_RX_REO_SIM_SUPPORT */
 
+#ifdef WLAN_MLO_MULTI_CHIP
+bool
+wlan_mgmt_rx_reo_is_simulation_in_progress(uint8_t ml_grp_id)
+{
+	return mgmt_rx_reo_is_simulation_in_progress(ml_grp_id);
+}
+
+#else
 bool
-wlan_mgmt_rx_reo_is_simulation_in_progress(void)
+wlan_mgmt_rx_reo_is_simulation_in_progress(uint8_t ml_grp_id)
 {
-	return mgmt_rx_reo_is_simulation_in_progress();
+	return false;
 }
+#endif
 
 QDF_STATUS
-wlan_mgmt_rx_reo_print_ingress_frame_stats(void)
+wlan_mgmt_rx_reo_print_ingress_frame_stats(uint8_t ml_grp_id)
 {
-	return mgmt_rx_reo_print_ingress_frame_stats();
+	return mgmt_rx_reo_print_ingress_frame_stats(ml_grp_id);
 }
 
 QDF_STATUS
-wlan_mgmt_rx_reo_print_ingress_frame_info(uint16_t num_frames)
+wlan_mgmt_rx_reo_print_ingress_frame_info(uint8_t ml_grp_id,
+					  uint16_t num_frames)
 {
-	return mgmt_rx_reo_print_ingress_frame_info(num_frames);
+	return mgmt_rx_reo_print_ingress_frame_info(ml_grp_id, num_frames);
 }
 
 QDF_STATUS
-wlan_mgmt_rx_reo_print_egress_frame_stats(void)
+wlan_mgmt_rx_reo_print_egress_frame_stats(uint8_t ml_grp_id)
 {
-	return mgmt_rx_reo_print_egress_frame_stats();
+	return mgmt_rx_reo_print_egress_frame_stats(ml_grp_id);
 }
 
 QDF_STATUS
-wlan_mgmt_rx_reo_print_egress_frame_info(uint16_t num_frames)
+wlan_mgmt_rx_reo_print_egress_frame_info(uint8_t ml_grp_id, uint16_t num_frames)
 {
-	return mgmt_rx_reo_print_egress_frame_info(num_frames);
+	return mgmt_rx_reo_print_egress_frame_info(ml_grp_id, num_frames);
 }

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

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for
@@ -464,6 +464,7 @@ enum wlan_mlme_cfg_id;
  * @psoc_vdev_rsp_timer_mod: function to modify the time of vdev rsp timer
  * @psoc_wake_lock_init: Initialize psoc wake lock for vdev response timer
  * @psoc_wake_lock_deinit: De-Initialize psoc wake lock for vdev response timer
+ * @get_psoc_mlo_group_id: Get MLO Group ID for the psoc
  * @get_hw_link_id: Get hw_link_id for pdev
  * @vdev_send_set_mac_addr: API to send set MAC address request to FW
  * @vdev_peer_set_param_send: API to send peer param to FW
@@ -551,6 +552,7 @@ struct wlan_lmac_if_mlme_tx_ops {
 				enum wlan_vdev_mgr_tgt_if_rsp_bit clear_bit);
 #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
 	uint16_t (*get_hw_link_id)(struct wlan_objmgr_pdev *pdev);
+	uint8_t (*get_psoc_mlo_group_id)(struct wlan_objmgr_psoc *psoc);
 	QDF_STATUS (*target_if_mlo_setup_req)(struct wlan_objmgr_pdev **pdev,
 					      uint8_t num_pdevs,
 					      uint8_t grp_id);

+ 35 - 3
umac/mlo_mgr/inc/wlan_mlo_mgr_cmn.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 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
@@ -301,6 +301,7 @@ void mlo_mlme_handle_sta_csa_param(struct wlan_objmgr_vdev *vdev,
 #define INVALID_HW_LINK_ID 0xFFFF
 #define WLAN_MLO_INVALID_NUM_LINKS             (-1)
 #ifdef WLAN_MLO_MULTI_CHIP
+#define WLAN_MLO_GROUP_INVALID                 (-1)
 /**
  * wlan_mlo_get_max_num_links() - Get the maximum number of MLO links
  * possible in the system
@@ -337,16 +338,34 @@ uint16_t wlan_mlo_get_valid_link_bitmap(uint8_t grp_id);
  */
 uint16_t wlan_mlo_get_pdev_hw_link_id(struct wlan_objmgr_pdev *pdev);
 
+/**
+ * wlan_mlo_get_psoc_group_id() - Get MLO group id of psoc
+ * @psoc: psoc object
+ *
+ * Return: MLO group id of the psoc
+ */
+uint8_t wlan_mlo_get_psoc_group_id(struct wlan_objmgr_psoc *psoc);
+
+/**
+ * wlan_mlo_get_psoc_capable() - Get if MLO capable psoc
+ * @psoc: Pointer to psoc object
+ *
+ * Return: True if MLO capable else false
+ */
+bool wlan_mlo_get_psoc_capable(struct wlan_objmgr_psoc *psoc);
+
 /**
  * struct hw_link_id_iterator: Argument passed in psoc/pdev iterator to
  *                             find pdev from hw_link_id
  * @hw_link_id: HW link id of pdev to find
+ * @mlo_grp_id: MLO Group id which it belongs to
  * @dbgid: Module ref id used in iterator
  * @pdev: Pointer to pdev. This will be set inside itertor callback
  *        if hw_link_id match is found.
  */
 struct hw_link_id_iterator {
 	uint16_t hw_link_id;
+	uint8_t mlo_grp_id;
 	wlan_objmgr_ref_dbgid dbgid;
 	struct wlan_objmgr_pdev *pdev;
 };
@@ -354,6 +373,7 @@ struct hw_link_id_iterator {
 /**
  * wlan_objmgr_get_pdev_by_hw_link_id() - Get pdev object from hw_link_id
  * @hw_link_id: HW link id of the pdev
+ * @ml_grp_id: MLO Group id which it belongs to
  * @refdbgid: dbgid of module used for taking reference to pdev object
  *
  * Return: Pointer to pdev object if hw_link_id is valid. Else, NULL
@@ -361,7 +381,7 @@ struct hw_link_id_iterator {
  *         Caller should free this reference.
  */
 struct wlan_objmgr_pdev *
-wlan_mlo_get_pdev_by_hw_link_id(uint16_t hw_link_id,
+wlan_mlo_get_pdev_by_hw_link_id(uint16_t hw_link_id, uint8_t ml_grp_id,
 				wlan_objmgr_ref_dbgid refdbgid);
 
 #else
@@ -384,7 +404,7 @@ wlan_mlo_get_valid_link_bitmap(uint8_t grp_id)
 }
 
 static inline struct wlan_objmgr_pdev *
-wlan_mlo_get_pdev_by_hw_link_id(uint16_t hw_link_id,
+wlan_mlo_get_pdev_by_hw_link_id(uint16_t hw_link_id, uint8_t ml_grp_id,
 				wlan_objmgr_ref_dbgid refdbgid)
 {
 	return NULL;
@@ -395,6 +415,18 @@ uint16_t wlan_mlo_get_pdev_hw_link_id(struct wlan_objmgr_pdev *pdev)
 {
 	return INVALID_HW_LINK_ID;
 }
+
+static inline
+uint8_t wlan_mlo_get_psoc_group_id(struct wlan_objmgr_psoc *psoc)
+{
+	return -EINVAL;
+}
+
+static inline
+bool wlan_mlo_get_psoc_capable(struct wlan_objmgr_psoc *psoc)
+{
+	return false;
+}
 #endif/*WLAN_MLO_MULTI_CHIP*/
 
 #ifdef WLAN_FEATURE_11BE_MLO

+ 52 - 2
umac/mlo_mgr/src/wlan_mlo_mgr_cmn.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 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
@@ -354,6 +354,47 @@ uint16_t wlan_mlo_get_valid_link_bitmap(uint8_t grp_id)
 	return mlo_ctx->setup_info[grp_id].valid_link_bitmap;
 }
 
+uint8_t wlan_mlo_get_psoc_group_id(struct wlan_objmgr_psoc *psoc)
+{
+	struct wlan_lmac_if_tx_ops *tx_ops;
+	uint8_t ml_grp_id = WLAN_MLO_GROUP_INVALID;
+
+	if (!psoc) {
+		qdf_err("PSOC is NULL");
+		return -EINVAL;
+	}
+
+	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
+	if (tx_ops && tx_ops->mops.get_psoc_mlo_group_id)
+		ml_grp_id = tx_ops->mops.get_psoc_mlo_group_id(psoc);
+
+	return ml_grp_id;
+}
+
+qdf_export_symbol(wlan_mlo_get_psoc_group_id);
+
+bool wlan_mlo_get_psoc_capable(struct wlan_objmgr_psoc *psoc)
+{
+	struct target_psoc_info *tgt_hdl;
+
+	if (!psoc) {
+		qdf_err("PSOC is NULL");
+		return false;
+	}
+
+	tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
+	if (!tgt_hdl) {
+		target_if_err("target_psoc_info is null");
+		return false;
+	}
+
+	if ((tgt_hdl->tif_ops) &&
+	    (tgt_hdl->tif_ops->mlo_capable))
+		return tgt_hdl->tif_ops->mlo_capable(psoc);
+
+	return false;
+}
+
 uint16_t wlan_mlo_get_pdev_hw_link_id(struct wlan_objmgr_pdev *pdev)
 {
 	struct wlan_objmgr_psoc *psoc;
@@ -378,10 +419,18 @@ static void wlan_pdev_hw_link_iterator(struct wlan_objmgr_psoc *psoc,
 	struct hw_link_id_iterator *itr = (struct hw_link_id_iterator *)arg;
 	struct wlan_objmgr_pdev *pdev = (struct wlan_objmgr_pdev *)obj;
 	uint16_t hw_link_id;
+	uint8_t ml_grp_id;
 
 	if (itr->pdev)
 		return;
 
+	ml_grp_id = wlan_mlo_get_psoc_group_id(psoc);
+	if (ml_grp_id > WLAN_MAX_MLO_GROUPS)
+		return;
+
+	if (ml_grp_id != itr->mlo_grp_id)
+		return;
+
 	hw_link_id = wlan_mlo_get_pdev_hw_link_id(pdev);
 	if (hw_link_id == itr->hw_link_id) {
 		if (wlan_objmgr_pdev_try_get_ref(pdev, itr->dbgid) ==
@@ -402,13 +451,14 @@ static void wlan_mlo_find_hw_link_id(struct wlan_objmgr_psoc *psoc,
 }
 
 struct wlan_objmgr_pdev *
-wlan_mlo_get_pdev_by_hw_link_id(uint16_t hw_link_id,
+wlan_mlo_get_pdev_by_hw_link_id(uint16_t hw_link_id, uint8_t ml_grp_id,
 				wlan_objmgr_ref_dbgid refdbgid)
 {
 	struct hw_link_id_iterator itr;
 
 	itr.hw_link_id = hw_link_id;
 	itr.pdev = NULL;
+	itr.mlo_grp_id = ml_grp_id;
 	itr.dbgid = refdbgid;
 
 	wlan_objmgr_iterate_psoc_list(wlan_mlo_find_hw_link_id,