qcacmn: Add multi group support for MGMT Rx Reordering

Add multi group support for MGMT Rx Re-ordering.

Change-Id: I2b172d1f0db58afee06db3eefc06b618fcf9a627
CRs-Fixed: 3343170
This commit is contained in:
Surya Prakash Raajen
2022-12-20 15:09:00 +05:30
committed by Madan Koyyalamudi
parent 4d5db3f69b
commit 6ef9d4cb8e
11 changed files with 392 additions and 121 deletions

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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;

View File

@@ -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");

View File

@@ -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)

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;
}
return grp_id;
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 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(void)
wlan_mgmt_rx_reo_is_simulation_in_progress(uint8_t ml_grp_id)
{
return mgmt_rx_reo_is_simulation_in_progress();
return mgmt_rx_reo_is_simulation_in_progress(ml_grp_id);
}
#else
bool
wlan_mgmt_rx_reo_is_simulation_in_progress(uint8_t ml_grp_id)
{
return false;
}
#endif
QDF_STATUS
wlan_mgmt_rx_reo_print_ingress_frame_stats(uint8_t ml_grp_id)
{
return mgmt_rx_reo_print_ingress_frame_stats(ml_grp_id);
}
QDF_STATUS
wlan_mgmt_rx_reo_print_ingress_frame_stats(void)
wlan_mgmt_rx_reo_print_ingress_frame_info(uint8_t ml_grp_id,
uint16_t num_frames)
{
return mgmt_rx_reo_print_ingress_frame_stats();
return mgmt_rx_reo_print_ingress_frame_info(ml_grp_id, num_frames);
}
QDF_STATUS
wlan_mgmt_rx_reo_print_ingress_frame_info(uint16_t num_frames)
wlan_mgmt_rx_reo_print_egress_frame_stats(uint8_t ml_grp_id)
{
return mgmt_rx_reo_print_ingress_frame_info(num_frames);
return mgmt_rx_reo_print_egress_frame_stats(ml_grp_id);
}
QDF_STATUS
wlan_mgmt_rx_reo_print_egress_frame_stats(void)
wlan_mgmt_rx_reo_print_egress_frame_info(uint8_t ml_grp_id, uint16_t num_frames)
{
return mgmt_rx_reo_print_egress_frame_stats();
}
QDF_STATUS
wlan_mgmt_rx_reo_print_egress_frame_info(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);
}

View File

@@ -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);

View File

@@ -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

View File

@@ -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,