From 61a91c820de4bfe94c8863821e1131c632dee548 Mon Sep 17 00:00:00 2001 From: Gururaj Pandurangi Date: Tue, 28 Mar 2023 19:45:45 -0700 Subject: [PATCH] qcacmn: Add WMI support to force power save active MLO links Add WMI command support to force power save on all the active MLO links for a defined number of beacon periods. Force power save allows the firmware to suspend STA links for X beacon periods and remain asleep even if the AP advertises TIM as opposed to regular power save mode where STA links wake up if the AP indicates that it has buffered data to send. Change-Id: I381a107f3f5f479b0eee4f526a49d6fc886aced0 CRs-Fixed: 3509543 --- wmi/inc/wmi_unified_11be_api.h | 10 +++++++ wmi/inc/wmi_unified_priv.h | 4 +++ wmi/src/wmi_unified_11be_api.c | 9 ++++++ wmi/src/wmi_unified_11be_tlv.c | 55 ++++++++++++++++++++++++++++++++++ 4 files changed, 78 insertions(+) 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; }