qcacmn: Add API to parse the T2LM event ID
Add API to parse the TID-to-link mapping event ID for the AP vaps. As part of this event, - Update the mapping switch time TSF value in host data structures. - When mapping switch time or expected duration expires in the FW, update the host data structure. Change-Id: I93232429fe5c2aa12dc4bf9f6a2f014761b7df15 CRs-Fixed: 3350697
This commit is contained in:

committed by
Madan Koyyalamudi

parent
1f137636fa
commit
952dd4de06
@@ -177,6 +177,67 @@ target_if_mlo_link_set_active(struct wlan_objmgr_psoc *psoc,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int target_if_mlo_vdev_tid_to_link_map_event_handler(
|
||||
ol_scn_t scn, uint8_t *event_buff, uint32_t len)
|
||||
{
|
||||
struct wlan_objmgr_psoc *psoc;
|
||||
struct mlo_vdev_host_tid_to_link_map_resp event = {0};
|
||||
struct wmi_unified *wmi_handle;
|
||||
struct wlan_lmac_if_mlo_rx_ops *rx_ops;
|
||||
QDF_STATUS status;
|
||||
|
||||
if (!event_buff) {
|
||||
mlme_err("Received NULL event ptr from FW");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
psoc = target_if_get_psoc_from_scn_hdl(scn);
|
||||
if (!psoc) {
|
||||
mlme_err("PSOC is NULL");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rx_ops = target_if_mlo_get_rx_ops(psoc);
|
||||
if (!rx_ops || !rx_ops->process_mlo_vdev_tid_to_link_map_event) {
|
||||
target_if_err("callback not registered");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
|
||||
if (!wmi_handle) {
|
||||
mlme_err("wmi_handle is null");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (wmi_extract_mlo_vdev_tid_to_link_map_event(wmi_handle, event_buff,
|
||||
&event)) {
|
||||
mlme_err("Failed to extract TID-to-link mapping event");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
status = rx_ops->process_mlo_vdev_tid_to_link_map_event(psoc, &event);
|
||||
|
||||
return qdf_status_to_os_return(status);
|
||||
}
|
||||
|
||||
static inline void
|
||||
target_if_mlo_register_vdev_tid_to_link_map_event(
|
||||
struct wmi_unified *wmi_handle)
|
||||
{
|
||||
wmi_unified_register_event_handler(
|
||||
wmi_handle, wmi_mlo_ap_vdev_tid_to_link_map_eventid,
|
||||
target_if_mlo_vdev_tid_to_link_map_event_handler,
|
||||
WMI_RX_EXECUTION_CTX);
|
||||
}
|
||||
|
||||
static inline void
|
||||
target_if_mlo_unregister_vdev_tid_to_link_map_event(
|
||||
struct wmi_unified *wmi_handle)
|
||||
{
|
||||
wmi_unified_unregister_event_handler(
|
||||
wmi_handle, wmi_mlo_ap_vdev_tid_to_link_map_eventid);
|
||||
}
|
||||
|
||||
/**
|
||||
* target_if_mlo_register_tx_ops() - lmac handler to register mlo tx ops
|
||||
* callback functions
|
||||
|
@@ -1401,11 +1401,15 @@ struct wlan_lmac_if_mlo_tx_ops {
|
||||
/**
|
||||
* struct wlan_lmac_if_mlo_rx_ops - defines southbound rx callbacks for mlo
|
||||
* @process_link_set_active_resp: function pointer to rx FW events
|
||||
* @process_mlo_vdev_tid_to_link_map_event: function pointer to rx T2LM event
|
||||
*/
|
||||
struct wlan_lmac_if_mlo_rx_ops {
|
||||
QDF_STATUS
|
||||
(*process_link_set_active_resp)(struct wlan_objmgr_psoc *psoc,
|
||||
struct mlo_link_set_active_resp *event);
|
||||
QDF_STATUS (*process_mlo_vdev_tid_to_link_map_event)(
|
||||
struct wlan_objmgr_psoc *psoc,
|
||||
struct mlo_vdev_host_tid_to_link_map_resp *event);
|
||||
};
|
||||
#endif
|
||||
|
||||
|
@@ -81,6 +81,7 @@
|
||||
|
||||
#ifdef WLAN_FEATURE_11BE_MLO
|
||||
#include "wlan_mlo_mgr_cmn.h"
|
||||
#include <wlan_mlo_t2lm.h>
|
||||
#endif
|
||||
|
||||
#include <wlan_twt_tgt_if_rx_api.h>
|
||||
@@ -966,6 +967,8 @@ wlan_lmac_if_mlo_mgr_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
|
||||
/* register handler for received mlo related events */
|
||||
rx_ops->mlo_rx_ops.process_link_set_active_resp =
|
||||
mlo_process_link_set_active_resp;
|
||||
rx_ops->mlo_rx_ops.process_mlo_vdev_tid_to_link_map_event =
|
||||
wlan_mlo_vdev_tid_to_link_map_event;
|
||||
}
|
||||
#else
|
||||
static void
|
||||
|
@@ -969,4 +969,31 @@ enum mlo_chip_recovery_type {
|
||||
/* Add new types above */
|
||||
MLO_RECOVERY_MODE_MAX = 0xf
|
||||
};
|
||||
|
||||
/**
|
||||
* enum wlan_t2lm_status - Target status codes in event of t2lm
|
||||
* @WLAN_MAP_SWITCH_TIMER_TSF: Mapping switch time value in TSF to be included
|
||||
* in probe response frames
|
||||
* @WLAN_MAP_SWITCH_TIMER_EXPIRED: Indication that the new proposed T2LM has
|
||||
* been applied, Update the required data structures and other modules.
|
||||
* @WLAN_EXPECTED_DUR_EXPIRED: Indication that the proposed T2LM ineffective
|
||||
* after this duration and all TIDs fall back to default mode.
|
||||
*/
|
||||
enum wlan_t2lm_status {
|
||||
WLAN_MAP_SWITCH_TIMER_TSF,
|
||||
WLAN_MAP_SWITCH_TIMER_EXPIRED,
|
||||
WLAN_EXPECTED_DUR_EXPIRED,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mlo_vdev_host_tid_to_link_map_resp - TID-to-link mapping response
|
||||
* @vdev_id: Vdev id
|
||||
* @wlan_t2lm_status: Target status for t2lm ie info
|
||||
* @mapping_switch_tsf: Mapping switch time in tsf for probe response frames
|
||||
*/
|
||||
struct mlo_vdev_host_tid_to_link_map_resp {
|
||||
uint8_t vdev_id;
|
||||
enum wlan_t2lm_status status;
|
||||
uint8_t mapping_switch_tsf;
|
||||
};
|
||||
#endif
|
||||
|
@@ -65,6 +65,18 @@ QDF_STATUS wlan_mlo_parse_t2lm_ie(
|
||||
uint8_t *wlan_mlo_add_t2lm_ie(uint8_t *frm,
|
||||
struct wlan_t2lm_onging_negotiation_info *t2lm);
|
||||
|
||||
/**
|
||||
* wlan_mlo_vdev_tid_to_link_map_event() - API to process the revceived T2LM
|
||||
* event.
|
||||
* @psoc: psoc object
|
||||
* @event: Pointer to received T2LM info
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS wlan_mlo_vdev_tid_to_link_map_event(
|
||||
struct wlan_objmgr_psoc *psoc,
|
||||
struct mlo_vdev_host_tid_to_link_map_resp *event);
|
||||
|
||||
/**
|
||||
* wlan_mlo_parse_t2lm_action_frame() - API to parse T2LM action frame
|
||||
* @t2lm: Pointer to T2LM structure
|
||||
|
@@ -567,3 +567,114 @@ uint8_t *wlan_mlo_add_t2lm_action_frame(
|
||||
|
||||
return frm;
|
||||
}
|
||||
|
||||
/**
|
||||
* wlan_mlo_t2lm_handle_mapping_switch_time_expiry() - API to handle the mapping
|
||||
* switch timer expiry.
|
||||
* @t2lm_ctx: Pointer to T2LM context
|
||||
* @vdev: Pointer to vdev structure
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
static void wlan_mlo_t2lm_handle_mapping_switch_time_expiry(
|
||||
struct wlan_t2lm_context *t2lm_ctx,
|
||||
struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
uint8_t vdev_id = wlan_vdev_get_id(vdev);
|
||||
int i = 0;
|
||||
|
||||
for (i = 0; i < t2lm_ctx->num_of_t2lm_ie; i++) {
|
||||
if (!t2lm_ctx->t2lm_ie[i].t2lm.mapping_switch_time_present)
|
||||
continue;
|
||||
|
||||
/* Mapping switch time will always present at index 1. Hence,
|
||||
* skip the index 0.
|
||||
*/
|
||||
if (i != 1)
|
||||
continue;
|
||||
|
||||
qdf_mem_copy(&t2lm_ctx->t2lm_ie[0], &t2lm_ctx->t2lm_ie[1],
|
||||
sizeof(struct wlan_mlo_t2lm_ie));
|
||||
t2lm_ctx->t2lm_ie[0].t2lm.mapping_switch_time_present = false;
|
||||
t2lm_ctx->t2lm_ie[0].t2lm.mapping_switch_time = 0;
|
||||
t2lm_debug("vdev_id:%d mark the advertised T2LM as established",
|
||||
vdev_id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* wlan_mlo_t2lm_handle_expected_duration_expiry() - API to handle the expected
|
||||
* duration timer expiry.
|
||||
* @t2lm_ctx: Pointer to T2LM context
|
||||
* @vdev: Pointer to vdev structure
|
||||
*
|
||||
* Return: none
|
||||
*/
|
||||
static void wlan_mlo_t2lm_handle_expected_duration_expiry(
|
||||
struct wlan_t2lm_context *t2lm_ctx,
|
||||
struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
uint8_t vdev_id = wlan_vdev_get_id(vdev);
|
||||
int i = 0;
|
||||
|
||||
for (i = 0; i < t2lm_ctx->num_of_t2lm_ie; i++) {
|
||||
if (!t2lm_ctx->t2lm_ie[i].t2lm.expected_duration_present)
|
||||
continue;
|
||||
|
||||
qdf_mem_zero(&t2lm_ctx->t2lm_ie[i],
|
||||
sizeof(struct wlan_mlo_t2lm_ie));
|
||||
t2lm_ctx->t2lm_ie[i].t2lm.direction = WLAN_T2LM_BIDI_DIRECTION;
|
||||
t2lm_ctx->t2lm_ie[i].t2lm.default_link_mapping = 1;
|
||||
t2lm_debug("vdev_id:%d Expected duration is expired",
|
||||
vdev_id);
|
||||
}
|
||||
}
|
||||
|
||||
QDF_STATUS wlan_mlo_vdev_tid_to_link_map_event(
|
||||
struct wlan_objmgr_psoc *psoc,
|
||||
struct mlo_vdev_host_tid_to_link_map_resp *event)
|
||||
{
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
struct wlan_t2lm_context *t2lm_ctx;
|
||||
int i = 0;
|
||||
|
||||
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, event->vdev_id,
|
||||
WLAN_MLO_MGR_ID);
|
||||
if (!vdev) {
|
||||
t2lm_err("null vdev");
|
||||
return QDF_STATUS_E_NULL_VALUE;
|
||||
}
|
||||
|
||||
if (!vdev->mlo_dev_ctx) {
|
||||
t2lm_err("null mlo_dev_ctx");
|
||||
return QDF_STATUS_E_NULL_VALUE;
|
||||
}
|
||||
|
||||
t2lm_ctx = &vdev->mlo_dev_ctx->t2lm_ctx;
|
||||
|
||||
switch (event->status) {
|
||||
case WLAN_MAP_SWITCH_TIMER_TSF:
|
||||
for (i = 0; i < t2lm_ctx->num_of_t2lm_ie; i++) {
|
||||
if (!t2lm_ctx->t2lm_ie[i].t2lm.mapping_switch_time_present)
|
||||
continue;
|
||||
|
||||
t2lm_ctx->t2lm_ie[i].t2lm.mapping_switch_time =
|
||||
event->mapping_switch_tsf;
|
||||
t2lm_debug("vdev_id:%d updated mapping switch time:%d",
|
||||
event->vdev_id, event->mapping_switch_tsf);
|
||||
}
|
||||
break;
|
||||
case WLAN_MAP_SWITCH_TIMER_EXPIRED:
|
||||
wlan_mlo_t2lm_handle_mapping_switch_time_expiry(t2lm_ctx, vdev);
|
||||
break;
|
||||
case WLAN_EXPECTED_DUR_EXPIRED:
|
||||
wlan_mlo_t2lm_handle_expected_duration_expiry(t2lm_ctx, vdev);
|
||||
break;
|
||||
default:
|
||||
t2lm_err("Invalid status");
|
||||
}
|
||||
|
||||
mlo_release_vdev_ref(vdev);
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
@@ -90,7 +90,7 @@ QDF_STATUS wmi_send_mlo_vdev_tid_to_link_map_cmd(
|
||||
* wmi_extract_mlo_vdev_tid_to_link_map_event() - extract mlo t2lm info for vdev
|
||||
* @wmi: wmi handle
|
||||
* @evt_buf: pointer to event buffer
|
||||
* @evt: Pointer to host structure to get the t2lm info
|
||||
* @resp: Pointer to host structure to get the t2lm info
|
||||
*
|
||||
* This function gets called to extract mlo t2lm info for particular pdev
|
||||
*
|
||||
@@ -98,9 +98,8 @@ QDF_STATUS wmi_send_mlo_vdev_tid_to_link_map_cmd(
|
||||
*/
|
||||
QDF_STATUS
|
||||
wmi_extract_mlo_vdev_tid_to_link_map_event(
|
||||
wmi_unified_t wmi,
|
||||
void *evt_buf,
|
||||
struct wmi_host_tid_to_link_map_resp *params);
|
||||
wmi_unified_t wmi, void *evt_buf,
|
||||
struct mlo_vdev_host_tid_to_link_map_resp *resp);
|
||||
|
||||
/**
|
||||
* wmi_extract_mlo_vdev_bcast_tid_to_link_map_event() - extract bcast mlo t2lm
|
||||
|
@@ -1090,21 +1090,6 @@ typedef struct {
|
||||
} wmi_host_mac_addr;
|
||||
|
||||
#ifdef WLAN_FEATURE_11BE
|
||||
/**
|
||||
* enum wlan_t2lm_status - Target status codes in event of t2lm
|
||||
* @WLAN_MAP_SWITCH_TIMER_TSF: Mapping switch time value in TSF to be included
|
||||
* in probe response frames
|
||||
* @WLAN_MAP_SWITCH_TIMER_EXPIRED: Indication that the new proposed T2LM has
|
||||
* been applied, Update the required data structures and other modules.
|
||||
* @WLAN_EXPECTED_DUR_EXPIRED: Indication that the proposed T2LM ineffective
|
||||
* after this duration and all TIDs fall back to default mode.
|
||||
*/
|
||||
enum wlan_t2lm_status {
|
||||
WLAN_MAP_SWITCH_TIMER_TSF,
|
||||
WLAN_MAP_SWITCH_TIMER_EXPIRED,
|
||||
WLAN_EXPECTED_DUR_EXPIRED,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct wlan_host_t2lm_of_tids - TID-to-link mapping info
|
||||
* @direction: 0 - Downlink, 1 - uplink 2 - Both uplink and downlink
|
||||
@@ -1151,18 +1136,6 @@ struct wmi_host_tid_to_link_map_ap_params {
|
||||
struct wlan_t2lm_info info[WLAN_MAX_T2LM_IE];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct wmi_host_tid_to_link_map_resp - TID-to-link mapping response
|
||||
* @vdev_id: Vdev id
|
||||
* @wlan_t2lm_status: Target status for t2lm ie info
|
||||
* @mapping_switch_tsf: Mapping switch time in tsf for probe response frames
|
||||
*/
|
||||
struct wmi_host_tid_to_link_map_resp {
|
||||
uint8_t vdev_id;
|
||||
enum wlan_t2lm_status status;
|
||||
uint8_t mapping_switch_tsf;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct wmi_host_bcast_t2lm_info - TID-to-link mapping broadcast info
|
||||
* @vdev_id: Vdev id
|
||||
@@ -5202,6 +5175,9 @@ typedef enum {
|
||||
#ifdef HEALTH_MON_SUPPORT
|
||||
wmi_extract_health_mon_init_done_info_eventid,
|
||||
#endif /* HEALTH_MON_SUPPORT */
|
||||
#ifdef WLAN_FEATURE_11BE_MLO
|
||||
wmi_mlo_ap_vdev_tid_to_link_map_eventid,
|
||||
#endif
|
||||
wmi_events_max,
|
||||
} wmi_conv_event_id;
|
||||
|
||||
|
@@ -3102,7 +3102,7 @@ QDF_STATUS (*send_mlo_vdev_tid_to_link_map)(
|
||||
QDF_STATUS (*extract_mlo_vdev_tid_to_link_map_event)(
|
||||
struct wmi_unified *wmi_handle,
|
||||
uint8_t *buf,
|
||||
struct wmi_host_tid_to_link_map_resp *params);
|
||||
struct mlo_vdev_host_tid_to_link_map_resp *params);
|
||||
|
||||
QDF_STATUS (*extract_mlo_vdev_bcast_tid_to_link_map_event)(
|
||||
struct wmi_unified *wmi_handle,
|
||||
|
@@ -82,9 +82,8 @@ QDF_STATUS wmi_send_mlo_vdev_tid_to_link_map_cmd(
|
||||
|
||||
QDF_STATUS
|
||||
wmi_extract_mlo_vdev_tid_to_link_map_event(
|
||||
wmi_unified_t wmi,
|
||||
void *evt_buf,
|
||||
struct wmi_host_tid_to_link_map_resp *resp)
|
||||
wmi_unified_t wmi, void *evt_buf,
|
||||
struct mlo_vdev_host_tid_to_link_map_resp *resp)
|
||||
{
|
||||
if (wmi->ops->extract_mlo_vdev_tid_to_link_map_event) {
|
||||
return wmi->ops->extract_mlo_vdev_tid_to_link_map_event(wmi,
|
||||
|
@@ -955,7 +955,7 @@ static QDF_STATUS
|
||||
extract_mlo_vdev_tid_to_link_map_event_tlv(
|
||||
struct wmi_unified *wmi_handle,
|
||||
uint8_t *buf,
|
||||
struct wmi_host_tid_to_link_map_resp *params)
|
||||
struct mlo_vdev_host_tid_to_link_map_resp *params)
|
||||
{
|
||||
WMI_MLO_AP_VDEV_TID_TO_LINK_MAP_EVENTID_param_tlvs *param_buf;
|
||||
wmi_mlo_ap_vdev_tid_to_link_map_evt_fixed_param *ev;
|
||||
|
@@ -20143,6 +20143,8 @@ static void populate_tlv_events_id_mlo(uint32_t *event_ids)
|
||||
WMI_MLO_LINK_SET_ACTIVE_RESP_EVENTID;
|
||||
event_ids[wmi_vdev_quiet_offload_eventid] =
|
||||
WMI_QUIET_HANDLING_EVENTID;
|
||||
event_ids[wmi_mlo_ap_vdev_tid_to_link_map_eventid] =
|
||||
WMI_MLO_AP_VDEV_TID_TO_LINK_MAP_EVENTID;
|
||||
}
|
||||
#else /* WLAN_FEATURE_11BE_MLO */
|
||||
static inline void populate_tlv_events_id_mlo(uint32_t *event_ids)
|
||||
|
Reference in New Issue
Block a user