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:

committed by
Madan Koyyalamudi

parent
4d5db3f69b
commit
6ef9d4cb8e
@@ -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;
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
@@ -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");
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
@@ -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,
|
||||
|
Reference in New Issue
Block a user