Bläddra i källkod

qcacmn: Validate the MLO HW link info from global shmem

Validate the MLO HW link related info obtained from the global shared
memory arena of management Rx reorder feature.

CRs-Fixed: 3111549
Change-Id: I6fd7812dc49bfa8428b2ffbf66ae978592734bc0
Edayilliam Jayadev 3 år sedan
förälder
incheckning
b4d1204cad

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

@@ -148,6 +148,13 @@ uint8_t mlo_glb_h_shmem_arena_get_no_of_chips_from_crash_info(void);
 #endif
 
 #ifdef WLAN_MGMT_RX_REO_SUPPORT
+/**
+ * mgmt_rx_reo_get_valid_link_bitmap() - Get valid link bitmap
+ *
+ * Return: valid link bitmap
+ */
+uint16_t mgmt_rx_reo_get_valid_link_bitmap(void);
+
 /**
  * mgmt_rx_reo_get_num_links() - Get number of links to be used by MGMT Rx REO
  *

+ 14 - 1
target_if/init_deinit/src/mlo_global_h_shmem_arena.c

@@ -804,6 +804,19 @@ success:
 qdf_export_symbol(mlo_glb_h_shmem_arena_ctx_deinit);
 
 #ifdef WLAN_MGMT_RX_REO_SUPPORT
+uint16_t mgmt_rx_reo_get_valid_link_bitmap(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 0;
+	}
+
+	return shmem_arena_ctx->rx_reo_snapshot_info.valid_link_bmap;
+}
+
 int mgmt_rx_reo_get_num_links(void)
 {
 	struct wlan_host_mlo_glb_h_shmem_arena_ctx *shmem_arena_ctx;
@@ -867,4 +880,4 @@ void *mgmt_rx_reo_get_snapshot_address(
 
 	return NULL;
 }
-#endif
+#endif /* WLAN_MGMT_RX_REO_SUPPORT */

+ 2 - 0
target_if/init_deinit/src/mlo_global_h_shmem_arena_api.c

@@ -99,6 +99,8 @@ QDF_STATUS mgmt_rx_reo_register_wifi3_0_ops(
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
+	reo_low_level_ops->get_valid_link_bitmap =
+		mgmt_rx_reo_get_valid_link_bitmap;
 	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;

+ 85 - 0
target_if/mgmt_txrx/src/target_if_mgmt_txrx_rx_reo.c

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -143,6 +144,86 @@ target_if_mgmt_rx_reo_unregister_event_handlers(struct wlan_objmgr_psoc *psoc)
 	return status;
 }
 
+/**
+ * target_if_mgmt_rx_reo_get_num_active_hw_links() - Get number of active MLO HW
+ * links
+ * @psoc: Pointer to psoc object
+ * @num_active_hw_links: pointer to number of active MLO HW links
+ *
+ * Get number of active MLO HW links from the MLO global shared memory arena.
+ *
+ * Return: QDF_STATUS
+ */
+static QDF_STATUS
+target_if_mgmt_rx_reo_get_num_active_hw_links(struct wlan_objmgr_psoc *psoc,
+					      int8_t *num_active_hw_links)
+{
+	struct wlan_lmac_if_mgmt_rx_reo_low_level_ops *low_level_ops;
+
+	if (!psoc) {
+		mgmt_rx_reo_err("psoc is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	if (!num_active_hw_links) {
+		mgmt_rx_reo_err("Pointer to num_active_hw_links is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	low_level_ops = target_if_get_mgmt_rx_reo_low_level_ops(psoc);
+
+	if (!low_level_ops) {
+		mgmt_rx_reo_err("Low level ops of MGMT Rx REO is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	qdf_assert_always(low_level_ops->implemented);
+
+	*num_active_hw_links = low_level_ops->get_num_links();
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * target_if_mgmt_rx_reo_get_valid_hw_link_bitmap() - Get valid MLO HW link
+ * bitmap
+ * @psoc: Pointer to psoc object
+ * @valid_hw_link_bitmap: Pointer to valid MLO HW link bitmap
+ *
+ * Get valid MLO HW link bitmap from the MLO global shared memory arena.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+target_if_mgmt_rx_reo_get_valid_hw_link_bitmap(struct wlan_objmgr_psoc *psoc,
+					       uint16_t *valid_hw_link_bitmap)
+{
+	struct wlan_lmac_if_mgmt_rx_reo_low_level_ops *low_level_ops;
+
+	if (!psoc) {
+		mgmt_rx_reo_err("psoc is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	if (!valid_hw_link_bitmap) {
+		mgmt_rx_reo_err("Pointer to valid_hw_link_bitmap is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	low_level_ops = target_if_get_mgmt_rx_reo_low_level_ops(psoc);
+
+	if (!low_level_ops) {
+		mgmt_rx_reo_err("Low level ops of MGMT Rx REO is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	qdf_assert_always(low_level_ops->implemented);
+
+	*valid_hw_link_bitmap = low_level_ops->get_valid_link_bitmap();
+
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  * target_if_mgmt_rx_reo_read_snapshot() - Read management rx-reorder snapshot
  * @pdev: pdev pointer
@@ -381,6 +462,10 @@ target_if_mgmt_rx_reo_tx_ops_register(
 		return QDF_STATUS_E_FAILURE;
 	}
 	mgmt_rx_reo_tx_ops = &mgmt_txrx_tx_ops->mgmt_rx_reo_tx_ops;
+	mgmt_rx_reo_tx_ops->get_num_active_hw_links =
+				target_if_mgmt_rx_reo_get_num_active_hw_links;
+	mgmt_rx_reo_tx_ops->get_valid_hw_link_bitmap =
+				target_if_mgmt_rx_reo_get_valid_hw_link_bitmap;
 	mgmt_rx_reo_tx_ops->read_mgmt_rx_reo_snapshot =
 				target_if_mgmt_rx_reo_read_snapshot;
 	mgmt_rx_reo_tx_ops->get_mgmt_rx_reo_snapshot_address =

+ 58 - 10
umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo.c

@@ -24,6 +24,8 @@
 #include <wlan_mgmt_txrx_rx_reo_tgt_api.h>
 #include "wlan_mgmt_txrx_main_i.h"
 #include <qdf_util.h>
+#include <wlan_cfr_utils_api.h>
+#include <wlan_mlo_mgr_cmn.h>
 
 static struct mgmt_rx_reo_context g_rx_reo_ctx;
 
@@ -128,23 +130,69 @@ mgmt_rx_reo_is_stale_frame(
 					ts_last_released_frame->global_ts);
 }
 
+QDF_STATUS
+mgmt_rx_reo_validate_mlo_hw_link_info(struct wlan_objmgr_psoc *psoc)
+{
+	uint16_t valid_link_bitmap_shmem;
+	uint16_t valid_link_bitmap;
+	int8_t num_active_links_shmem;
+	int8_t num_active_links;
+	QDF_STATUS status;
+
+	if (!psoc) {
+		mgmt_rx_reo_err("psoc is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	if (!wlan_mgmt_rx_reo_is_feature_enabled_at_psoc(psoc))
+		return QDF_STATUS_SUCCESS;
+
+	status = tgt_mgmt_rx_reo_get_num_active_hw_links(psoc,
+							 &num_active_links_shmem);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		mgmt_rx_reo_err("Failed to get number of active MLO HW links");
+		return QDF_STATUS_E_FAILURE;
+	}
+	qdf_assert_always(num_active_links_shmem > 0);
+
+	num_active_links = wlan_mlo_get_num_active_hw_links();
+	qdf_assert_always(num_active_links > 0);
+
+	qdf_assert_always(num_active_links_shmem == num_active_links);
+
+	status = tgt_mgmt_rx_reo_get_valid_hw_link_bitmap(psoc,
+							  &valid_link_bitmap_shmem);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		mgmt_rx_reo_err("Failed to get valid MLO HW link bitmap");
+		return QDF_STATUS_E_INVAL;
+	}
+	qdf_assert_always(valid_link_bitmap_shmem != 0);
+
+	valid_link_bitmap = wlan_mlo_get_valid_hw_link_bitmap();
+	qdf_assert_always(valid_link_bitmap_shmem != 0);
+
+	qdf_assert_always(valid_link_bitmap_shmem == valid_link_bitmap);
+
+	return QDF_STATUS_SUCCESS;
+}
+
 #ifndef WLAN_MGMT_RX_REO_SIM_SUPPORT
 /**
- * mgmt_rx_reo_get_num_mlo_links() - Get number of MLO HW links from the reo
- * context object
+ * mgmt_rx_reo_get_num_mlo_links() - Get number of MLO HW links active in the
+ * system
  * @reo_context: Pointer to reo context object
  *
- * Return: On success returns number of MLO HW links. On failure
- * returns MGMT_RX_REO_INVALID_NUM_LINKS.
+ * Return: On success returns number of active MLO HW links. On failure
+ * returns WLAN_MLO_INVALID_NUM_HW_LINKS.
  */
 static int8_t
 mgmt_rx_reo_get_num_mlo_links(struct mgmt_rx_reo_context *reo_context) {
 	if (!reo_context) {
 		mgmt_rx_reo_err("Mgmt reo context is null");
-		return MGMT_RX_REO_INVALID_NUM_LINKS;
+		return WLAN_MLO_INVALID_NUM_HW_LINKS;
 	}
 
-	return reo_context->num_mlo_links;
+	return wlan_mlo_get_num_active_hw_links();
 }
 
 static QDF_STATUS
@@ -172,7 +220,7 @@ mgmt_rx_reo_handle_stale_frame(struct mgmt_rx_reo_list *reo_list,
  * to have MLO capability.
  *
  * Return: On success returns number of MLO HW links. On failure
- * returns -1.
+ * returns WLAN_MLO_INVALID_NUM_HW_LINKS.
  */
 static int8_t
 mgmt_rx_reo_sim_get_num_mlo_links(struct mgmt_rx_reo_sim_context *sim_context)
@@ -181,7 +229,7 @@ mgmt_rx_reo_sim_get_num_mlo_links(struct mgmt_rx_reo_sim_context *sim_context)
 
 	if (!sim_context) {
 		mgmt_rx_reo_err("Mgmt reo simulation context is null");
-		return MGMT_RX_REO_INVALID_NUM_LINKS;
+		return WLAN_MLO_INVALID_NUM_HW_LINKS;
 	}
 
 	qdf_spin_lock(&sim_context->link_id_to_pdev_map.lock);
@@ -199,13 +247,13 @@ mgmt_rx_reo_sim_get_num_mlo_links(struct mgmt_rx_reo_sim_context *sim_context)
  * @reo_context: Pointer to reo context object
  *
  * Return: On success returns number of MLO HW links. On failure
- * returns -1.
+ * returns WLAN_MLO_INVALID_NUM_HW_LINKS.
  */
 static int8_t
 mgmt_rx_reo_get_num_mlo_links(struct mgmt_rx_reo_context *reo_context) {
 	if (!reo_context) {
 		mgmt_rx_reo_err("Mgmt reo context is null");
-		return MGMT_RX_REO_INVALID_NUM_LINKS;
+		return WLAN_MLO_INVALID_NUM_HW_LINKS;
 	}
 
 	return mgmt_rx_reo_sim_get_num_mlo_links(&reo_context->sim_context);

+ 16 - 5
umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo_i.h

@@ -49,7 +49,6 @@
  * Remove this once the actual one is implemented.
  */
 #define MGMT_RX_REO_MAX_LINKS (4)
-#define MGMT_RX_REO_INVALID_NUM_LINKS (-1)
 #define MGMT_RX_REO_INVALID_LINK_ID   (-1)
 
 /* Reason to release an entry from the reorder list */
@@ -573,7 +572,6 @@ struct reo_egress_debug_info {
  * disconnection. Hence it is required to serialize the delivery
  * of management frames to upper layers in the strict order of MLO
  * global time stamp.
- * @num_mlo_links: Number of MLO links on the system
  * @sim_context: Management rx-reorder simulation context
  * @ingress_frame_debug_info: Debug object to log incoming frames
  * @egress_frame_debug_info: Debug object to log outgoing frames
@@ -584,9 +582,7 @@ struct mgmt_rx_reo_context {
 	struct mgmt_rx_reo_list reo_list;
 	qdf_spinlock_t reo_algo_entry_lock;
 	qdf_spinlock_t frame_release_lock;
-#ifndef WLAN_MGMT_RX_REO_SIM_SUPPORT
-	uint8_t num_mlo_links;
-#else
+#ifdef WLAN_MGMT_RX_REO_SIM_SUPPORT
 	struct mgmt_rx_reo_sim_context sim_context;
 #endif /* WLAN_MGMT_RX_REO_SIM_SUPPORT */
 #ifdef WLAN_MGMT_RX_REO_DEBUG_SUPPORT
@@ -908,5 +904,20 @@ mgmt_rx_reo_list_max_size_exceeded(struct mgmt_rx_reo_list *reo_list)
 {
 	return (qdf_list_size(&reo_list->list) > reo_list->max_list_size);
 }
+
+/**
+ * mgmt_rx_reo_validate_mlo_hw_link_info() - Validate the MLO HW link info
+ * obtained from the global shared memory arena
+ * @psoc: Pointer to psoc object
+ *
+ * Validate the following MLO HW link related information extracted from
+ * management Rx reorder related TLVs in global shared memory arena.
+ *         1. Number of active MLO HW links
+ *         2. Valid MLO HW link bitmap
+ *
+ * Return: QDF_STATUS of operation
+ */
+QDF_STATUS
+mgmt_rx_reo_validate_mlo_hw_link_info(struct wlan_objmgr_psoc *psoc);
 #endif /* WLAN_MGMT_RX_REO_SUPPORT */
 #endif /* _WLAN_MGMT_TXRX_RX_REO_I_H */

+ 28 - 0
umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_rx_reo_tgt_api.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -69,6 +70,33 @@ wlan_psoc_get_mgmt_rx_reo_txops(struct wlan_objmgr_psoc *psoc)
 	return &mgmt_txrx_tx_ops->mgmt_rx_reo_tx_ops;
 }
 
+/**
+ * tgt_mgmt_rx_reo_get_num_active_hw_links() - Get number of active MLO HW
+ * links
+ * @psoc: Pointer to psoc object
+ * @num_active_hw_links: pointer to number of active MLO HW links
+ *
+ * Get number of active MLO HW links from the MLO global shared memory arena.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+tgt_mgmt_rx_reo_get_num_active_hw_links(struct wlan_objmgr_psoc *psoc,
+					int8_t *num_active_hw_links);
+
+/**
+ * tgt_mgmt_rx_reo_get_valid_hw_link_bitmap() - Get valid MLO HW link bitmap
+ * @psoc: Pointer to psoc object
+ * @valid_hw_link_bitmap: Pointer to valid MLO HW link bitmap
+ *
+ * Get valid MLO HW link bitmap from the MLO global shared memory arena.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+tgt_mgmt_rx_reo_get_valid_hw_link_bitmap(struct wlan_objmgr_psoc *psoc,
+					 uint16_t *valid_hw_link_bitmap);
+
 /**
  * tgt_mgmt_rx_reo_read_snapshot() - Read management rx-reorder snapshot
  * @pdev: Pointer to pdev object

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

@@ -209,6 +209,21 @@ wlan_mgmt_rx_reo_init(void);
 QDF_STATUS
 wlan_mgmt_rx_reo_deinit(void);
 
+/**
+ * wlan_mgmt_rx_reo_validate_mlo_hw_link_info() - Validate the MLO HW link
+ * related information extracted from the MLO global shared memory arena
+ * @psoc: pointer to psoc object
+ *
+ * This function validates the MLO HW link related information extracted from
+ * the MLO global shared memory arena. This includes number of active HW links
+ * and the valid link bitmap. Same information is available with MLO manager and
+ * it is considered as the source of truth.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+wlan_mgmt_rx_reo_validate_mlo_hw_link_info(struct wlan_objmgr_psoc *psoc);
+
 /**
  * wlan_mgmt_rx_reo_pdev_obj_create_notification() - pdev create handler for
  * management rx-reorder module
@@ -270,6 +285,12 @@ wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(struct wlan_objmgr_pdev *pdev);
 bool
 wlan_mgmt_rx_reo_is_simulation_in_progress(void);
 #else
+static inline QDF_STATUS
+wlan_mgmt_rx_reo_validate_mlo_hw_link_info(struct wlan_objmgr_psoc *psoc)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  * wlan_mgmt_rx_reo_pdev_obj_create_notification() - pdev create handler for
  * management rx-reorder feature

+ 42 - 0
umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_rx_reo_tgt_api.c

@@ -23,6 +23,48 @@
 #include <wlan_mgmt_txrx_rx_reo_tgt_api.h>
 #include "../../core/src/wlan_mgmt_txrx_rx_reo_i.h"
 
+QDF_STATUS
+tgt_mgmt_rx_reo_get_num_active_hw_links(struct wlan_objmgr_psoc *psoc,
+					int8_t *num_active_hw_links)
+{
+	struct wlan_lmac_if_mgmt_rx_reo_tx_ops *mgmt_rx_reo_txops;
+
+	mgmt_rx_reo_txops = wlan_psoc_get_mgmt_rx_reo_txops(psoc);
+	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_num_active_hw_links) {
+		mgmt_rx_reo_err("get num active hw links txops is NULL");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	return mgmt_rx_reo_txops->get_num_active_hw_links(psoc,
+							  num_active_hw_links);
+}
+
+QDF_STATUS
+tgt_mgmt_rx_reo_get_valid_hw_link_bitmap(struct wlan_objmgr_psoc *psoc,
+					 uint16_t *valid_hw_link_bitmap)
+{
+	struct wlan_lmac_if_mgmt_rx_reo_tx_ops *mgmt_rx_reo_txops;
+
+	mgmt_rx_reo_txops = wlan_psoc_get_mgmt_rx_reo_txops(psoc);
+	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_valid_hw_link_bitmap) {
+		mgmt_rx_reo_err("get valid hw link bitmap txops is NULL");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	return mgmt_rx_reo_txops->get_valid_hw_link_bitmap(psoc,
+						valid_hw_link_bitmap);
+}
+
 QDF_STATUS
 tgt_mgmt_rx_reo_read_snapshot(
 			struct wlan_objmgr_pdev *pdev,

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

@@ -21,10 +21,12 @@
  */
 
 #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 <cfg_ucfg_api.h>
 #include <wlan_mgmt_txrx_tgt_api.h>
 #include<wlan_mgmt_txrx_rx_reo_tgt_api.h>
+#include <wlan_mlo_mgr_cmn.h>
 
 QDF_STATUS
 wlan_mgmt_rx_reo_deinit(void)
@@ -154,6 +156,12 @@ wlan_get_pdev_from_mlo_link_id(uint8_t mlo_link_id,
 qdf_export_symbol(wlan_get_pdev_from_mlo_link_id);
 #endif /* WLAN_MGMT_RX_REO_SIM_SUPPORT */
 
+QDF_STATUS
+wlan_mgmt_rx_reo_validate_mlo_hw_link_info(struct wlan_objmgr_psoc *psoc)
+{
+	return mgmt_rx_reo_validate_mlo_hw_link_info(psoc);
+}
+
 QDF_STATUS
 wlan_mgmt_rx_reo_pdev_obj_create_notification(
 			struct wlan_objmgr_pdev *pdev,

+ 9 - 0
umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h

@@ -255,6 +255,8 @@ struct wlan_lmac_if_global_shmem_local_ops {
  * table of MGMT Rx REO module
  * @implemented: Whether functions pointers are implemented
  * @get_num_links: Get number of links to be used by MGMT Rx REO module
+ * @get_valid_link_bitmap: Get valid link bitmap to be used by MGMT Rx
+ * REO module
  * @get_snapshot_address: Get address of an MGMT Rx REO snapshot
  * @snapshot_is_valid: Check if a snapshot is valid
  * @snapshot_get_mgmt_pkt_ctr: Get management packet counter from snapshot
@@ -266,6 +268,7 @@ struct wlan_lmac_if_global_shmem_local_ops {
 struct wlan_lmac_if_mgmt_rx_reo_low_level_ops {
 	bool implemented;
 	int (*get_num_links)(void);
+	uint16_t (*get_valid_link_bitmap)(void);
 	void* (*get_snapshot_address)(
 			uint8_t link_id,
 			enum mgmt_rx_reo_shared_snapshot_id snapshot_id);
@@ -281,12 +284,18 @@ struct wlan_lmac_if_mgmt_rx_reo_low_level_ops {
 /**
  * struct wlan_lmac_if_mgmt_txrx_tx_ops - structure of tx function
  * pointers for mgmt rx reo
+ * @get_num_active_hw_links: Get number of active MLO HW links
+ * @get_valid_hw_link_bitmap: Get valid MLO HW link bitmap
  * @read_mgmt_rx_reo_snapshot: Read rx-reorder snapshots
  * @get_mgmt_rx_reo_snapshot_address: Get rx-reorder snapshot address
  * @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 (*get_num_active_hw_links)(struct wlan_objmgr_psoc *psoc,
+					      int8_t *num_active_hw_links);
+	QDF_STATUS (*get_valid_hw_link_bitmap)(struct wlan_objmgr_psoc *psoc,
+					       uint16_t *valid_hw_link_bitmap);
 	QDF_STATUS (*read_mgmt_rx_reo_snapshot)
 			(struct wlan_objmgr_pdev *pdev,
 			 struct mgmt_rx_reo_snapshot *address,