diff --git a/wmi/inc/wmi_unified_11be_api.h b/wmi/inc/wmi_unified_11be_api.h index 890ba9c077..cd8d0fc51d 100644 --- a/wmi/inc/wmi_unified_11be_api.h +++ b/wmi/inc/wmi_unified_11be_api.h @@ -76,6 +76,16 @@ QDF_STATUS wmi_send_mlo_link_removal_cmd( wmi_unified_t wmi, const struct mlo_link_removal_cmd_params *param); +/** + * wmi_send_mlo_vdev_pause() - Send WMI command for MLO vdev pause + * @wmi: wmi handle + * @info: MLO vdev pause information + * + * Return: QDF_STATUS_SUCCESS of operation + */ +QDF_STATUS wmi_send_mlo_vdev_pause(wmi_unified_t wmi, + struct mlo_vdev_pause *info); + /** * wmi_extract_mlo_link_removal_evt_fixed_param() - Extract fixed parameters TLV * from the MLO link removal WMI event diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 71292e864b..f1578965a3 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -3099,6 +3099,10 @@ QDF_STATUS (*send_mlo_link_set_active_cmd)(wmi_unified_t wmi_handle, struct mlo_link_set_active_param *param); +QDF_STATUS +(*send_mlo_vdev_pause)(wmi_unified_t wmi_handle, + struct mlo_vdev_pause *info); + QDF_STATUS (*extract_mlo_link_set_active_resp)(wmi_unified_t wmi_handle, void *evt_buf, diff --git a/wmi/src/wmi_unified_11be_api.c b/wmi/src/wmi_unified_11be_api.c index 954dcf2c77..2925e10444 100644 --- a/wmi/src/wmi_unified_11be_api.c +++ b/wmi/src/wmi_unified_11be_api.c @@ -164,6 +164,15 @@ QDF_STATUS wmi_send_mlo_link_removal_cmd( return QDF_STATUS_E_FAILURE; } +QDF_STATUS wmi_send_mlo_vdev_pause(wmi_unified_t wmi, + struct mlo_vdev_pause *info) +{ + if (wmi->ops->send_mlo_vdev_pause) + return wmi->ops->send_mlo_vdev_pause(wmi, info); + + return QDF_STATUS_E_FAILURE; +} + QDF_STATUS wmi_extract_mlo_link_removal_evt_fixed_param( struct wmi_unified *wmi, void *buf, diff --git a/wmi/src/wmi_unified_11be_tlv.c b/wmi/src/wmi_unified_11be_tlv.c index ceb0b2313f..079736fc5a 100644 --- a/wmi/src/wmi_unified_11be_tlv.c +++ b/wmi/src/wmi_unified_11be_tlv.c @@ -720,6 +720,59 @@ static QDF_STATUS send_mlo_link_removal_cmd_tlv( return ret; } +/** + * send_mlo_vdev_pause_cmd_tlv() - Send WMI command for MLO vdev pause + * @wmi_handle: wmi handle + * @info: MLO vdev pause information + * + * Return: QDF_STATUS of operation + */ +static QDF_STATUS send_mlo_vdev_pause_cmd_tlv(wmi_unified_t wmi_handle, + struct mlo_vdev_pause *info) +{ + wmi_vdev_pause_cmd_fixed_param *fixed_params; + wmi_buf_t buf; + uint32_t buf_len = 0; + QDF_STATUS ret; + + if (!info) { + wmi_err("ML vdev pause info is NULL"); + return QDF_STATUS_E_NULL_VALUE; + } + + buf_len = sizeof(*fixed_params); + + buf = wmi_buf_alloc(wmi_handle, buf_len); + if (!buf) { + wmi_err("wmi buf alloc failed for vdev pause cmd: psoc (%pK) vdev(%u)", + wmi_handle->soc->wmi_psoc, info->vdev_id); + return QDF_STATUS_E_NOMEM; + } + + /* Populate fixed params TLV */ + fixed_params = (wmi_vdev_pause_cmd_fixed_param *)wmi_buf_data(buf); + WMITLV_SET_HDR(&fixed_params->tlv_header, + WMITLV_TAG_STRUC_wmi_vdev_pause_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN(wmi_vdev_pause_cmd_fixed_param)); + fixed_params->vdev_id = info->vdev_id; + fixed_params->pause_dur_ms = info->vdev_pause_duration; + fixed_params->pause_type = WMI_VDEV_PAUSE_TYPE_MLO_LINK; + wmi_debug("vdev id: %d pause duration: %d pause type %d", + fixed_params->vdev_id, fixed_params->pause_dur_ms, + fixed_params->pause_type); + + wmi_mtrace(WMI_VDEV_PAUSE_CMDID, fixed_params->vdev_id, 0); + ret = wmi_unified_cmd_send(wmi_handle, buf, buf_len, + WMI_VDEV_PAUSE_CMDID); + if (QDF_IS_STATUS_ERROR(ret)) { + wmi_err("Failed to send vdev pause cmd: psoc (%pK) vdev(%u)", + wmi_handle->soc->wmi_psoc, info->vdev_id); + wmi_buf_free(buf); + } + + return ret; +} + /** * extract_mlo_link_removal_evt_fixed_param_tlv() - Extract fixed parameters TLV * from the MLO link removal WMI event @@ -1848,4 +1901,6 @@ void wmi_11be_attach_tlv(wmi_unified_t wmi_handle) extract_mgmt_rx_mlo_link_removal_info_tlv; ops->extract_mlo_link_disable_request_evt_param = extract_mlo_link_disable_request_evt_param_tlv; + ops->send_mlo_vdev_pause = + send_mlo_vdev_pause_cmd_tlv; }