Ver código fonte

qcacmn: Add support for multi group in global memory region

Add support for multi group in global shared memory region.

Change-Id: Ib8920f9180b3ba50f3f8faf0d9b020abfd0bc150
CRs-Fixed: 3343170
Surya Prakash Raajen 2 anos atrás
pai
commit
93d7b3fc1a

+ 22 - 8
target_if/init_deinit/inc/mlo_global_h_shmem_arena.h

@@ -120,73 +120,87 @@ struct wlan_host_mlo_glb_h_shmem_arena_ctx {
  * context on Host
  * @arena_vaddr: Virtual address of the MLO Global shared memory arena
  * @arena_len: Length (in bytes) of the MLO Global shared memory arena
+ * @grp_id: Id of the required MLO Group
  *
  * Return: QDF_STATUS of operation
  */
 QDF_STATUS mlo_glb_h_shmem_arena_ctx_init(void *arena_vaddr,
-					  size_t arena_len);
+					  size_t arena_len,
+					  uint8_t grp_id);
 
 /**
  * mlo_glb_h_shmem_arena_ctx_deinit() - De-initialize MLO Global shared memory
  * arena context on Host
+ * @grp_id: Id of the required MLO Group
  *
  * Return: QDF_STATUS of operation
  */
-QDF_STATUS mlo_glb_h_shmem_arena_ctx_deinit(void);
+QDF_STATUS mlo_glb_h_shmem_arena_ctx_deinit(uint8_t grp_id);
 #endif
 
 #ifdef WLAN_MLO_GLOBAL_SHMEM_SUPPORT
 /**
  * mlo_glb_h_shmem_arena_get_crash_reason_address(): get the address of crash
  * reason associated with chip_id
+ * @grp_id: Id of the required MLO Group
+ * @chip_id: Id of the MLO chip
  *
  * Return: Address of crash_reason field from global shmem arena in case of
  * success, else returns NULL
  */
-void *mlo_glb_h_shmem_arena_get_crash_reason_address(uint8_t chip_id);
+void *mlo_glb_h_shmem_arena_get_crash_reason_address(uint8_t grp_id,
+						     uint8_t chip_id);
 
 /**
  * mlo_glb_h_shmem_arena_get_no_of_chips_from_crash_info() - Get number of chips
  * from crash info
+ * @grp_id: Id of the required MLO Group
  *
  * Return: number of chips participating in MLO from crash info shared by target
  * in case of sccess, else returns 0
  */
-uint8_t mlo_glb_h_shmem_arena_get_no_of_chips_from_crash_info(void);
+uint8_t mlo_glb_h_shmem_arena_get_no_of_chips_from_crash_info(uint8_t grp_id);
 #endif
 
 #ifdef WLAN_MGMT_RX_REO_SUPPORT
 /**
  * mgmt_rx_reo_get_valid_link_bitmap() - Get valid link bitmap
+ * @grp_id: Id of the required MLO Group
  *
  * Return: valid link bitmap
  */
-uint16_t mgmt_rx_reo_get_valid_link_bitmap(void);
+uint16_t mgmt_rx_reo_get_valid_link_bitmap(uint8_t grp_id);
 
 /**
  * mgmt_rx_reo_get_num_links() - Get number of links to be used by MGMT Rx REO
+ * @grp_id: Id of the required MLO Group
  *
  * Return: number of links in case of success, else -1
  */
-int mgmt_rx_reo_get_num_links(void);
+int mgmt_rx_reo_get_num_links(uint8_t grp_id);
 
 /**
  * mgmt_rx_reo_get_snapshot_address() - Get the address of MGMT Rx REO snapshot
+ * @grp_id: Id of the required MLO Group
  * @link_id: Link ID of the radio to which this snapshot belongs
  * @snapshot_id: ID of the snapshot
  *
  * Return: virtual address of the snapshot on success, else NULL
  */
 void *mgmt_rx_reo_get_snapshot_address(
-	uint8_t link_id, enum mgmt_rx_reo_shared_snapshot_id snapshot_id);
+		uint8_t grp_id,
+		uint8_t link_id,
+		enum mgmt_rx_reo_shared_snapshot_id snapshot_id);
 
 /**
  * mgmt_rx_reo_get_snapshot_version() - Get the version of MGMT Rx REO snapshot
+ * @grp_id: Id of the required MLO Group
  * @snapshot_id: ID of the snapshot
  *
  * Return: Snapshot version
  */
 int8_t mgmt_rx_reo_get_snapshot_version
-			(enum mgmt_rx_reo_shared_snapshot_id snapshot_id);
+			(uint8_t grp_id,
+			 enum mgmt_rx_reo_shared_snapshot_id snapshot_id);
 #endif /* WLAN_MGMT_RX_REO_SUPPORT */
 #endif

+ 52 - 19
target_if/init_deinit/src/mlo_global_h_shmem_arena.c

@@ -22,10 +22,11 @@
  */
 
 #include<mlo_global_h_shmem_arena.h>
+#include<wlan_mlo_mgr_public_structs.h>
+static struct wlan_host_mlo_glb_h_shmem_arena_ctx
+				g_shmem_arena_ctx[WLAN_MAX_MLO_GROUPS];
 
-static struct wlan_host_mlo_glb_h_shmem_arena_ctx g_shmem_arena_ctx;
-
-#define get_shmem_arena_ctx() (&g_shmem_arena_ctx)
+#define get_shmem_arena_ctx(__grp_id) (&g_shmem_arena_ctx[__grp_id])
 
 /**
  * is_field_present_in_tlv() - Check whether a given field is present
@@ -494,15 +495,19 @@ extract_mlo_glb_rx_reo_snapshot_info(
 /**
  * mlo_glb_h_shmem_arena_get_no_of_chips_from_crash_info() - get the number of
  * chips from crash info
+ * @grp_id: Id of the required MLO Group
  *
  * Return: number of chips participating in MLO from crash info shared by target
  * in case of success, else returns 0
  */
-uint8_t mlo_glb_h_shmem_arena_get_no_of_chips_from_crash_info(void)
+uint8_t mlo_glb_h_shmem_arena_get_no_of_chips_from_crash_info(uint8_t grp_id)
 {
 	struct wlan_host_mlo_glb_h_shmem_arena_ctx *shmem_arena_ctx;
 
-	shmem_arena_ctx = get_shmem_arena_ctx();
+	if (grp_id > WLAN_MAX_MLO_GROUPS)
+		return 0;
+
+	shmem_arena_ctx = get_shmem_arena_ctx(grp_id);
 
 	if (!shmem_arena_ctx) {
 		target_if_err("mlo_glb_h_shmem_arena context is NULL");
@@ -515,18 +520,24 @@ uint8_t mlo_glb_h_shmem_arena_get_no_of_chips_from_crash_info(void)
 /**
  * mlo_glb_h_shmem_arena_get_crash_reason_address() - get the address of crash
  * reason associated with chip_id
+ * @grp_id: Id of the required MLO Group
+ * @chip_id: MLO Chip Id
  *
  * Return: Address of crash_reason field from global shmem arena in case of
  * success, else returns NULL
  */
-void *mlo_glb_h_shmem_arena_get_crash_reason_address(uint8_t chip_id)
+void *mlo_glb_h_shmem_arena_get_crash_reason_address(uint8_t grp_id,
+						     uint8_t chip_id)
 {
 	struct wlan_host_mlo_glb_h_shmem_arena_ctx *shmem_arena_ctx;
 	struct wlan_host_mlo_glb_chip_crash_info *crash_info;
 	struct wlan_host_mlo_glb_per_chip_crash_info *per_chip_crash_info;
 	uint8_t chip;
 
-	shmem_arena_ctx = get_shmem_arena_ctx();
+	if (grp_id > WLAN_MAX_MLO_GROUPS)
+		return NULL;
+
+	shmem_arena_ctx = get_shmem_arena_ctx(grp_id);
 	if (!shmem_arena_ctx) {
 		target_if_err("mlo_glb_h_shmem_arena context is NULL");
 		return NULL;
@@ -780,11 +791,15 @@ static int parse_mlo_glb_h_shmem_arena(
 }
 
 QDF_STATUS mlo_glb_h_shmem_arena_ctx_init(void *arena_vaddr,
-					  size_t arena_len)
+					  size_t arena_len,
+					  uint8_t grp_id)
 {
 	struct wlan_host_mlo_glb_h_shmem_arena_ctx *shmem_arena_ctx;
 
-	shmem_arena_ctx = get_shmem_arena_ctx();
+	if (grp_id > WLAN_MAX_MLO_GROUPS)
+		return QDF_STATUS_E_INVAL;
+
+	shmem_arena_ctx = get_shmem_arena_ctx(grp_id);
 	if (!shmem_arena_ctx) {
 		target_if_err("mlo_glb_h_shmem_arena context is NULL");
 		return QDF_STATUS_E_NULL_VALUE;
@@ -810,11 +825,14 @@ success:
 
 qdf_export_symbol(mlo_glb_h_shmem_arena_ctx_init);
 
-QDF_STATUS mlo_glb_h_shmem_arena_ctx_deinit(void)
+QDF_STATUS mlo_glb_h_shmem_arena_ctx_deinit(uint8_t grp_id)
 {
 	struct wlan_host_mlo_glb_h_shmem_arena_ctx *shmem_arena_ctx;
 
-	shmem_arena_ctx = get_shmem_arena_ctx();
+	if (grp_id > WLAN_MAX_MLO_GROUPS)
+		return QDF_STATUS_E_INVAL;
+
+	shmem_arena_ctx = get_shmem_arena_ctx(grp_id);
 	if (!shmem_arena_ctx) {
 		target_if_err("mlo_glb_h_shmem_arena context is NULL");
 		return QDF_STATUS_E_NULL_VALUE;
@@ -841,11 +859,14 @@ 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)
+uint16_t mgmt_rx_reo_get_valid_link_bitmap(uint8_t grp_id)
 {
 	struct wlan_host_mlo_glb_h_shmem_arena_ctx *shmem_arena_ctx;
 
-	shmem_arena_ctx = get_shmem_arena_ctx();
+	if (grp_id > WLAN_MAX_MLO_GROUPS)
+		return 0;
+
+	shmem_arena_ctx = get_shmem_arena_ctx(grp_id);
 	if (!shmem_arena_ctx) {
 		target_if_err("mlo_glb_h_shmem_arena context is NULL");
 		return 0;
@@ -854,11 +875,14 @@ uint16_t mgmt_rx_reo_get_valid_link_bitmap(void)
 	return shmem_arena_ctx->rx_reo_snapshot_info.valid_link_bmap;
 }
 
-int mgmt_rx_reo_get_num_links(void)
+int mgmt_rx_reo_get_num_links(uint8_t grp_id)
 {
 	struct wlan_host_mlo_glb_h_shmem_arena_ctx *shmem_arena_ctx;
 
-	shmem_arena_ctx = get_shmem_arena_ctx();
+	if (grp_id > WLAN_MAX_MLO_GROUPS)
+		return -EINVAL;
+
+	shmem_arena_ctx = get_shmem_arena_ctx(grp_id);
 	if (!shmem_arena_ctx) {
 		target_if_err("mlo_glb_h_shmem_arena context is NULL");
 		return qdf_status_to_os_return(QDF_STATUS_E_FAILURE);
@@ -868,7 +892,9 @@ int mgmt_rx_reo_get_num_links(void)
 }
 
 void *mgmt_rx_reo_get_snapshot_address(
-	uint8_t link_id, enum mgmt_rx_reo_shared_snapshot_id snapshot_id)
+		uint8_t grp_id,
+		uint8_t link_id,
+		enum mgmt_rx_reo_shared_snapshot_id snapshot_id)
 {
 	struct wlan_host_mlo_glb_h_shmem_arena_ctx *shmem_arena_ctx;
 	struct wlan_host_mlo_glb_rx_reo_snapshot_info *snapshot_info;
@@ -880,7 +906,10 @@ void *mgmt_rx_reo_get_snapshot_address(
 		return NULL;
 	}
 
-	shmem_arena_ctx = get_shmem_arena_ctx();
+	if (grp_id > WLAN_MAX_MLO_GROUPS)
+		return NULL;
+
+	shmem_arena_ctx = get_shmem_arena_ctx(grp_id);
 	if (!shmem_arena_ctx) {
 		target_if_err("mlo_glb_h_shmem_arena context is NULL");
 		return NULL;
@@ -918,7 +947,8 @@ void *mgmt_rx_reo_get_snapshot_address(
 	return NULL;
 }
 
-int8_t mgmt_rx_reo_get_snapshot_version(enum mgmt_rx_reo_shared_snapshot_id id)
+int8_t mgmt_rx_reo_get_snapshot_version(uint8_t grp_id,
+					enum mgmt_rx_reo_shared_snapshot_id id)
 {
 	struct wlan_host_mlo_glb_h_shmem_arena_ctx *shmem_arena_ctx;
 	struct wlan_host_mlo_glb_rx_reo_snapshot_info *snapshot_info;
@@ -929,7 +959,10 @@ int8_t mgmt_rx_reo_get_snapshot_version(enum mgmt_rx_reo_shared_snapshot_id id)
 		return MGMT_RX_REO_INVALID_SNAPSHOT_VERSION;
 	}
 
-	shmem_arena_ctx = get_shmem_arena_ctx();
+	if (grp_id > WLAN_MAX_MLO_GROUPS)
+		return MGMT_RX_REO_INVALID_SNAPSHOT_VERSION;
+
+	shmem_arena_ctx = get_shmem_arena_ctx(grp_id);
 	if (!shmem_arena_ctx) {
 		target_if_err("mlo_glb_h_shmem_arena context is NULL");
 		return MGMT_RX_REO_INVALID_SNAPSHOT_VERSION;

+ 33 - 8
target_if/mgmt_txrx/src/target_if_mgmt_txrx_rx_reo.c

@@ -167,6 +167,7 @@ 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;
+	uint8_t grp_id;
 
 	if (!psoc) {
 		mgmt_rx_reo_err("psoc is null");
@@ -178,6 +179,11 @@ target_if_mgmt_rx_reo_get_num_active_hw_links(struct wlan_objmgr_psoc *psoc,
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
+	if (!mlo_psoc_get_grp_id(psoc, &grp_id)) {
+		mgmt_rx_reo_err("Failed to get valid MLO Group id");
+		return QDF_STATUS_E_INVAL;
+	}
+
 	low_level_ops = target_if_get_mgmt_rx_reo_low_level_ops(psoc);
 
 	if (!low_level_ops) {
@@ -187,7 +193,7 @@ target_if_mgmt_rx_reo_get_num_active_hw_links(struct wlan_objmgr_psoc *psoc,
 
 	qdf_assert_always(low_level_ops->implemented);
 
-	*num_active_hw_links = low_level_ops->get_num_links();
+	*num_active_hw_links = low_level_ops->get_num_links(grp_id);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -207,6 +213,7 @@ 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;
+	uint8_t grp_id;
 
 	if (!psoc) {
 		mgmt_rx_reo_err("psoc is null");
@@ -218,6 +225,11 @@ target_if_mgmt_rx_reo_get_valid_hw_link_bitmap(struct wlan_objmgr_psoc *psoc,
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
+	if (!mlo_psoc_get_grp_id(psoc, &grp_id)) {
+		mgmt_rx_reo_err("Failed to get valid MLO Group id");
+		return QDF_STATUS_E_INVAL;
+	}
+
 	low_level_ops = target_if_get_mgmt_rx_reo_low_level_ops(psoc);
 
 	if (!low_level_ops) {
@@ -227,7 +239,7 @@ target_if_mgmt_rx_reo_get_valid_hw_link_bitmap(struct wlan_objmgr_psoc *psoc,
 
 	qdf_assert_always(low_level_ops->implemented);
 
-	*valid_hw_link_bitmap = low_level_ops->get_valid_link_bitmap();
+	*valid_hw_link_bitmap = low_level_ops->get_valid_link_bitmap(grp_id);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -471,12 +483,20 @@ target_if_mgmt_rx_reo_get_snapshot_info
 	struct wlan_lmac_if_mgmt_rx_reo_low_level_ops *low_level_ops;
 	int8_t link_id;
 	int8_t snapshot_version;
+	uint8_t grp_id;
+	struct wlan_objmgr_psoc *psoc;
 
 	if (!pdev) {
 		mgmt_rx_reo_err("pdev is null");
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
+	psoc = wlan_pdev_get_psoc(pdev);
+	if (!psoc) {
+		mgmt_rx_reo_err("psoc 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;
@@ -487,8 +507,12 @@ target_if_mgmt_rx_reo_get_snapshot_info
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	low_level_ops = target_if_get_mgmt_rx_reo_low_level_ops(
-				wlan_pdev_get_psoc(pdev));
+	if (!mlo_psoc_get_grp_id(psoc, &grp_id)) {
+		mgmt_rx_reo_err("Failed to get valid MLO Group id");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	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");
@@ -501,12 +525,13 @@ target_if_mgmt_rx_reo_get_snapshot_info
 	qdf_assert_always(link_id >= 0);
 
 	snapshot_info->address =
-			low_level_ops->get_snapshot_address(link_id, id);
+			low_level_ops->get_snapshot_address(grp_id,
+							    link_id, id);
 
-	snapshot_version = low_level_ops->get_snapshot_version(id);
+	snapshot_version = low_level_ops->get_snapshot_version(grp_id, id);
 	if (snapshot_version < 0) {
-		mgmt_rx_reo_err("Invalid snapshot version %d",
-				snapshot_version);
+		mgmt_rx_reo_err("Invalid snapshot version %d MLO Group id %d",
+				snapshot_version, grp_id);
 		return QDF_STATUS_E_INVAL;
 	}
 

+ 11 - 8
umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h

@@ -251,10 +251,12 @@ struct wlan_lmac_if_global_shmem_local_ops {
 	bool implemented;
 
 	QDF_STATUS (*init_shmem_arena_ctx)(void *arena_vaddr,
-					   size_t arena_len);
-	QDF_STATUS (*deinit_shmem_arena_ctx)(void);
-	void *(*get_crash_reason_address)(uint8_t chip_id);
-	uint8_t (*get_no_of_chips_from_crash_info)(void);
+					   size_t arena_len,
+					   uint8_t grp_id);
+	QDF_STATUS (*deinit_shmem_arena_ctx)(uint8_t grp_id);
+	void *(*get_crash_reason_address)(uint8_t grp_id,
+					  uint8_t chip_id);
+	uint8_t (*get_no_of_chips_from_crash_info)(uint8_t grp_id);
 };
 #endif
 
@@ -277,13 +279,14 @@ 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);
+	int (*get_num_links)(uint8_t grp_id);
+	uint16_t (*get_valid_link_bitmap)(uint8_t grp_id);
 	void* (*get_snapshot_address)
-			(uint8_t link_id,
+			(uint8_t grp_id, uint8_t link_id,
 			 enum mgmt_rx_reo_shared_snapshot_id snapshot_id);
 	int8_t (*get_snapshot_version)
-			(enum mgmt_rx_reo_shared_snapshot_id snapshot_id);
+			(uint8_t grp_id,
+			 enum mgmt_rx_reo_shared_snapshot_id snapshot_id);
 	bool (*snapshot_is_valid)(uint32_t snapshot_low,
 				  uint8_t snapshot_version);
 	uint16_t (*snapshot_get_mgmt_pkt_ctr)(uint32_t snapshot_low,

+ 1 - 1
umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h

@@ -136,7 +136,7 @@ struct mlo_setup_info {
 	uint16_t valid_link_bitmap;
 	qdf_spinlock_t state_lock;
 	qdf_event_t event;
-	 struct cdp_mlo_ctxt *dp_handle;
+	struct cdp_mlo_ctxt *dp_handle;
 };
 
 /**

+ 6 - 0
umac/mlo_mgr/inc/wlan_mlo_mgr_setup.h

@@ -221,5 +221,11 @@ QDF_STATUS mlo_check_all_pdev_state(struct wlan_objmgr_psoc *psoc,
 {
 	return QDF_STATUS_SUCCESS;
 }
+
+static inline
+bool mlo_psoc_get_grp_id(struct wlan_objmgr_psoc *psoc, uint8_t *grp_id)
+{
+	return 0;
+}
 #endif /* WLAN_MLO_MULTI_CHIP */
 #endif /* _WLAN_MLO_MGR_SETUP_H_ */