qcacmn: Add vdev wmi cmd and event support t2lm ie info

Add support for vdev level WMI Command and event to send
and receive t2lm ie info

CRs-Fixed: 3339695
Change-Id: I8b896a961cba8f1d8e11111f900a98da090b9513
This commit is contained in:
Surya Prakash Raajen
2022-11-23 16:04:30 +05:30
committed by Madan Koyyalamudi
parent b673b97a2d
commit 6a2a1f1a5e
5 changed files with 393 additions and 2 deletions

View File

@@ -75,6 +75,49 @@ wmi_extract_mgmt_rx_ml_cu_params(wmi_unified_t wmi_handle, void *evt_buf,
QDF_STATUS wmi_send_mlo_peer_tid_to_link_map_cmd(
wmi_unified_t wmi,
struct wmi_host_tid_to_link_map_params *params);
/**
* wmi_send_mlo_vdev_tid_to_link_map_cmd() - send TID-to-link mapping command
* per vdev
* @wmi: WMI handle for this pdev
* @params: Pointer to TID-to-link mapping params
*/
QDF_STATUS wmi_send_mlo_vdev_tid_to_link_map_cmd(
wmi_unified_t wmi,
struct wmi_host_tid_to_link_map_ap_params *params);
/**
* 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
*
* This function gets called to extract mlo t2lm info for particular pdev
*
* Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
*/
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_extract_mlo_vdev_bcast_tid_to_link_map_event() - extract bcast mlo t2lm
* info for vdev
* @wmi: wmi handle
* @evt_buf: pointer to event buffer
* @bcast: Pointer to host structure to get the t2lm bcast info
*
* This function gets called to extract bcast mlo t2lm info for particular pdev
*
* Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
*/
QDF_STATUS
wmi_extract_mlo_vdev_bcast_tid_to_link_map_event(
wmi_unified_t wmi,
void *evt_buf,
struct wmi_host_bcast_t2lm_info *bcast);
#endif /* WLAN_FEATURE_11BE */
#endif /*_WMI_UNIFIED_11BE_API_H_*/

View File

@@ -1090,6 +1090,21 @@ 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
@@ -1117,6 +1132,46 @@ struct wmi_host_tid_to_link_map_params {
uint8_t num_dir;
struct wlan_host_t2lm_of_tids t2lm_info[WLAN_T2LM_MAX_DIRECTION];
};
/**
* struct wmi_host_tid_to_link_map_ap_params - TID-to-link mapping params
* @pdev_id: Pdev id
* @vdev_id: Vdev id
* @num_t2lm_info: Number of t2lm IEs
* @hw_link_id: HW link id
* @disabled_link_bitmap: Disabled link bitmap info
* @t2lm_info: TID-to-link mapping IE info
*/
struct wmi_host_tid_to_link_map_ap_params {
uint8_t pdev_id;
uint8_t vdev_id;
uint8_t num_t2lm_info;
uint16_t hw_link_id;
uint16_t disabled_link_bitmap;
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
* @expected_duration: Expected duration for vdev t2lm ie
*/
struct wmi_host_bcast_t2lm_info {
uint8_t vdev_id;
uint32_t expected_duration;
};
#endif /* WLAN_FEATURE_11BE */
#ifdef WLAN_FEATURE_11BE_MLO

View File

@@ -3094,6 +3094,20 @@ QDF_STATUS
QDF_STATUS (*send_mlo_peer_tid_to_link_map)(
wmi_unified_t wmi_handle,
struct wmi_host_tid_to_link_map_params *params);
QDF_STATUS (*send_mlo_vdev_tid_to_link_map)(
wmi_unified_t wmi_handle,
struct wmi_host_tid_to_link_map_ap_params *params);
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);
QDF_STATUS (*extract_mlo_vdev_bcast_tid_to_link_map_event)(
struct wmi_unified *wmi_handle,
void *buf,
struct wmi_host_bcast_t2lm_info *bcast_info);
#endif /* WLAN_FEATURE_11BE */
QDF_STATUS

View File

@@ -69,6 +69,45 @@ QDF_STATUS wmi_send_mlo_peer_tid_to_link_map_cmd(
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS wmi_send_mlo_vdev_tid_to_link_map_cmd(
wmi_unified_t wmi,
struct wmi_host_tid_to_link_map_ap_params *params)
{
if (wmi->ops->send_mlo_vdev_tid_to_link_map)
return wmi->ops->send_mlo_vdev_tid_to_link_map(wmi, params);
return QDF_STATUS_E_FAILURE;
}
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)
{
if (wmi->ops->extract_mlo_vdev_tid_to_link_map_event) {
return wmi->ops->extract_mlo_vdev_tid_to_link_map_event(wmi,
evt_buf,
resp);
}
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS
wmi_extract_mlo_vdev_bcast_tid_to_link_map_event(
wmi_unified_t wmi,
void *evt_buf,
struct wmi_host_bcast_t2lm_info *bcast)
{
if (wmi->ops->extract_mlo_vdev_bcast_tid_to_link_map_event) {
return wmi->ops->extract_mlo_vdev_bcast_tid_to_link_map_event(
wmi,
evt_buf,
bcast);
}
return QDF_STATUS_E_FAILURE;
}
#endif /* WLAN_FEATURE_11BE */
QDF_STATUS

View File

@@ -765,6 +765,240 @@ static QDF_STATUS send_mlo_peer_tid_to_link_map_cmd_tlv(
return ret;
}
static void update_t2lm_ie_info_params(
wmi_mlo_ap_vdev_tid_to_link_map_ie_info * info,
struct wlan_t2lm_info *params)
{
WMI_MLO_VDEV_TID_TO_LINK_MAP_CTRL_DIR_SET(
info->tid_to_link_map_ctrl,
params->direction);
WMI_MLO_VDEV_TID_TO_LINK_MAP_CTRL_DEF_LINK_SET(
info->tid_to_link_map_ctrl,
params->default_link_mapping);
info->map_switch_time = params->mapping_switch_time;
WMI_MLO_VDEV_TID_TO_LINK_MAP_CTRL_SWT_TIME_SET(
info->tid_to_link_map_ctrl,
params->mapping_switch_time_present);
info->expected_duration = params->expected_duration;
WMI_MLO_VDEV_TID_TO_LINK_MAP_CTRL_DUR_TIME_SET(
info->tid_to_link_map_ctrl,
params->expected_duration_present);
wmi_debug("tid_to_link_map_ctrl:%x map_switch_time:%d expected_duration:%d",
info->tid_to_link_map_ctrl, info->map_switch_time,
info->expected_duration);
/* Do not fill link mapping values when default mapping is set to 1 */
if (params->default_link_mapping)
return;
WMI_MLO_VDEV_TID_TO_LINK_MAP_CTRL_LINK_MAP_PRE_SET(
info->tid_to_link_map_ctrl, 0xff);
WMI_MLO_VDEV_TID_TO_LINK_MAP_IEEE_LINK_ID_0_SET(
info->ieee_tid_0_1_link_map,
params->ieee_link_map_tid[0]);
WMI_MLO_VDEV_TID_TO_LINK_MAP_IEEE_LINK_ID_1_SET(
info->ieee_tid_0_1_link_map,
params->ieee_link_map_tid[1]);
WMI_MLO_VDEV_TID_TO_LINK_MAP_IEEE_LINK_ID_2_SET(
info->ieee_tid_2_3_link_map,
params->ieee_link_map_tid[2]);
WMI_MLO_VDEV_TID_TO_LINK_MAP_IEEE_LINK_ID_3_SET(
info->ieee_tid_2_3_link_map,
params->ieee_link_map_tid[3]);
WMI_MLO_VDEV_TID_TO_LINK_MAP_IEEE_LINK_ID_4_SET(
info->ieee_tid_4_5_link_map,
params->ieee_link_map_tid[4]);
WMI_MLO_VDEV_TID_TO_LINK_MAP_IEEE_LINK_ID_5_SET(
info->ieee_tid_4_5_link_map,
params->ieee_link_map_tid[5]);
WMI_MLO_VDEV_TID_TO_LINK_MAP_IEEE_LINK_ID_6_SET(
info->ieee_tid_6_7_link_map,
params->ieee_link_map_tid[6]);
WMI_MLO_VDEV_TID_TO_LINK_MAP_IEEE_LINK_ID_7_SET(
info->ieee_tid_6_7_link_map,
params->ieee_link_map_tid[7]);
WMI_MLO_VDEV_TID_TO_LINK_MAP_HW_LINK_ID_0_SET(
info->hw_tid_0_1_link_map,
params->hw_link_map_tid[0]);
WMI_MLO_VDEV_TID_TO_LINK_MAP_HW_LINK_ID_1_SET(
info->hw_tid_0_1_link_map,
params->hw_link_map_tid[1]);
WMI_MLO_VDEV_TID_TO_LINK_MAP_HW_LINK_ID_2_SET(
info->hw_tid_2_3_link_map,
params->hw_link_map_tid[2]);
WMI_MLO_VDEV_TID_TO_LINK_MAP_HW_LINK_ID_3_SET(
info->hw_tid_2_3_link_map,
params->hw_link_map_tid[3]);
WMI_MLO_VDEV_TID_TO_LINK_MAP_HW_LINK_ID_4_SET(
info->hw_tid_4_5_link_map,
params->hw_link_map_tid[4]);
WMI_MLO_VDEV_TID_TO_LINK_MAP_HW_LINK_ID_5_SET(
info->hw_tid_4_5_link_map,
params->hw_link_map_tid[5]);
WMI_MLO_VDEV_TID_TO_LINK_MAP_HW_LINK_ID_6_SET(
info->hw_tid_6_7_link_map,
params->hw_link_map_tid[6]);
WMI_MLO_VDEV_TID_TO_LINK_MAP_HW_LINK_ID_7_SET(
info->hw_tid_6_7_link_map,
params->hw_link_map_tid[7]);
wmi_debug("tid_to_link_map_ctrl:%x", info->tid_to_link_map_ctrl);
wmi_debug("ieee_link_map: tid_0_1:%x tid_2_3:%x tid_4_5:%x tid_6_7:%x",
info->ieee_tid_0_1_link_map, info->ieee_tid_2_3_link_map,
info->ieee_tid_4_5_link_map, info->ieee_tid_6_7_link_map);
wmi_debug("hw_link_map: tid_0_1:%x tid_2_3:%x tid_4_5:%x tid_6_7:%x",
info->hw_tid_0_1_link_map, info->hw_tid_2_3_link_map,
info->hw_tid_4_5_link_map, info->hw_tid_6_7_link_map);
}
static QDF_STATUS send_mlo_vdev_tid_to_link_map_cmd_tlv(
wmi_unified_t wmi_handle,
struct wmi_host_tid_to_link_map_ap_params *params)
{
wmi_mlo_ap_vdev_tid_to_link_map_cmd_fixed_param *cmd;
wmi_mlo_ap_vdev_tid_to_link_map_ie_info *info;
wmi_buf_t buf;
uint8_t *buf_ptr;
QDF_STATUS ret = QDF_STATUS_SUCCESS;
uint32_t buf_len = 0;
uint32_t num_info = 0;
buf_len = sizeof(wmi_mlo_ap_vdev_tid_to_link_map_cmd_fixed_param) +
WMI_TLV_HDR_SIZE + (params->num_t2lm_info *
sizeof(wmi_mlo_ap_vdev_tid_to_link_map_ie_info));
buf = wmi_buf_alloc(wmi_handle, buf_len);
if (!buf) {
wmi_err("wmi buf alloc failed for vdev id %d while t2lm map cmd send: ",
params->vdev_id);
return QDF_STATUS_E_NOMEM;
}
buf_ptr = (uint8_t *)wmi_buf_data(buf);
cmd = (wmi_mlo_ap_vdev_tid_to_link_map_cmd_fixed_param *)buf_ptr;
WMITLV_SET_HDR(
&cmd->tlv_header,
WMITLV_TAG_STRUC_wmi_mlo_ap_vdev_tid_to_link_map_cmd_fixed_param,
WMITLV_GET_STRUCT_TLVLEN(
wmi_mlo_ap_vdev_tid_to_link_map_cmd_fixed_param));
cmd->pdev_id = wmi_handle->ops->convert_pdev_id_host_to_target(
wmi_handle, params->pdev_id);
cmd->vdev_id = params->vdev_id;
cmd->disabled_link_bitmap = params->disabled_link_bitmap;
wmi_debug("pdev_id:%d vdev_id:%d disabled_link_bitmap:%x num_t2lm_info:%d",
cmd->pdev_id, cmd->vdev_id, cmd->disabled_link_bitmap,
params->num_t2lm_info);
buf_ptr += sizeof(wmi_mlo_ap_vdev_tid_to_link_map_cmd_fixed_param);
WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
(params->num_t2lm_info *
sizeof(wmi_mlo_ap_vdev_tid_to_link_map_ie_info)));
buf_ptr += sizeof(uint32_t);
for (num_info = 0; num_info < params->num_t2lm_info; num_info++) {
info = (wmi_mlo_ap_vdev_tid_to_link_map_ie_info *)buf_ptr;
WMITLV_SET_HDR(
&info->tlv_header,
WMITLV_TAG_STRUC_wmi_mlo_ap_vdev_tid_to_link_map_ie_info,
WMITLV_GET_STRUCT_TLVLEN(
wmi_mlo_ap_vdev_tid_to_link_map_ie_info));
update_t2lm_ie_info_params(info, &params->info[num_info]);
buf_ptr += sizeof(wmi_mlo_ap_vdev_tid_to_link_map_ie_info);
}
wmi_mtrace(WMI_MLO_AP_VDEV_TID_TO_LINK_MAP_CMDID, cmd->vdev_id, 0);
ret = wmi_unified_cmd_send(wmi_handle, buf, buf_len,
WMI_MLO_AP_VDEV_TID_TO_LINK_MAP_CMDID);
if (ret) {
wmi_err("Failed to send T2LM command to FW: %d vdev id %d",
ret, cmd->vdev_id);
wmi_buf_free(buf);
}
return ret;
}
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)
{
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;
param_buf = (WMI_MLO_AP_VDEV_TID_TO_LINK_MAP_EVENTID_param_tlvs *)buf;
if (!param_buf) {
wmi_err_rl("Param_buf is NULL");
return QDF_STATUS_E_FAILURE;
}
ev = (wmi_mlo_ap_vdev_tid_to_link_map_evt_fixed_param *)
param_buf->fixed_param;
params->vdev_id = ev->vdev_id;
params->status = ev->status_type;
params->mapping_switch_tsf = ev->mapping_switch_tsf;
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS
extract_mlo_vdev_bcast_tid_to_link_map_event_tlv(
struct wmi_unified *wmi_handle,
void *buf,
struct wmi_host_bcast_t2lm_info *bcast_info)
{
WMI_MGMT_RX_EVENTID_param_tlvs *param_tlvs;
wmi_mlo_bcast_t2lm_info *info;
param_tlvs = (WMI_MGMT_RX_EVENTID_param_tlvs *)buf;
if (!param_tlvs) {
wmi_err(" MGMT RX param_tlvs is NULL");
return QDF_STATUS_E_INVAL;
}
info = param_tlvs->mlo_bcast_t2lm_info;
if (!info) {
wmi_debug("mgmt_ml_info TLV is not sent by FW");
return QDF_STATUS_E_INVAL;
}
bcast_info->vdev_id =
WMI_MLO_BROADCAST_TID_TO_LINK_MAP_INFO_VDEV_ID_GET(
info->vdev_id_expec_dur);
bcast_info->expected_duration =
WMI_MLO_BROADCAST_TID_TO_LINK_MAP_INFO_VDEV_ID_GET(
info->vdev_id_expec_dur);
return QDF_STATUS_SUCCESS;
}
#else
size_t peer_assoc_t2lm_params_size(struct peer_assoc_params *req)
{
@@ -1060,6 +1294,12 @@ void wmi_11be_attach_tlv(wmi_unified_t wmi_handle)
#ifdef WLAN_FEATURE_11BE
ops->send_mlo_peer_tid_to_link_map =
send_mlo_peer_tid_to_link_map_cmd_tlv;
ops->send_mlo_vdev_tid_to_link_map =
send_mlo_vdev_tid_to_link_map_cmd_tlv;
ops->extract_mlo_vdev_tid_to_link_map_event =
extract_mlo_vdev_tid_to_link_map_event_tlv;
ops->extract_mlo_vdev_bcast_tid_to_link_map_event =
extract_mlo_vdev_bcast_tid_to_link_map_event_tlv;
#endif /* WLAN_FEATURE_11BE */
ops->extract_mgmt_rx_ml_cu_params =
extract_mgmt_rx_ml_cu_params_tlv;