diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index dc83af3489..d055626f54 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -416,6 +416,12 @@ QDF_STATUS wmi_unified_stats_request_send(void *wmi_hdl, QDF_STATUS wmi_unified_green_ap_ps_send(void *wmi_hdl, uint32_t value, uint8_t mac_id); +#ifdef FEATURE_WLAN_D0WOW +QDF_STATUS wmi_unified_d0wow_enable_send(void *wmi_hdl, + uint8_t mac_id); +QDF_STATUS wmi_unified_d0wow_disable_send(void *wmi_hdl, + uint8_t mac_id); +#endif QDF_STATUS wmi_unified_wow_enable_send(void *wmi_hdl, struct wow_cmd_params *param, diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index b0f3d9ef6a..3c20e9edfd 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -234,6 +234,13 @@ QDF_STATUS (*send_suspend_cmd)(wmi_unified_t wmi_handle, QDF_STATUS (*send_resume_cmd)(wmi_unified_t wmi_handle, uint8_t mac_id); +#ifdef FEATURE_WLAN_D0WOW +QDF_STATUS (*send_d0wow_enable_cmd)(wmi_unified_t wmi_handle, + uint8_t mac_id); +QDF_STATUS (*send_d0wow_disable_cmd)(wmi_unified_t wmi_handle, + uint8_t mac_id); +#endif + QDF_STATUS (*send_wow_enable_cmd)(wmi_unified_t wmi_handle, struct wow_cmd_params *param, uint8_t mac_id); diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index cff120fa95..fe14027ea1 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -398,6 +398,46 @@ QDF_STATUS wmi_unified_resume_send(void *wmi_hdl, return QDF_STATUS_E_FAILURE; } +#ifdef FEATURE_WLAN_D0WOW +/** + * wmi_unified_d0wow_enable_send() - WMI d0 wow enable function + * @param wmi_handle: handle to WMI. + * @mac_id: radio context + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_unified_d0wow_enable_send(void *wmi_hdl, + uint8_t mac_id) +{ + wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl; + + if (wmi_handle->ops->send_d0wow_enable_cmd) + return wmi_handle->ops->send_d0wow_enable_cmd( + wmi_handle, mac_id); + + return QDF_STATUS_E_FAILURE; +} + +/** + * wmi_unified_d0wow_disable_send() - WMI d0 wow disable function + * @param wmi_handle: handle to WMI. + * @mac_id: radio context + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_unified_d0wow_disable_send(void *wmi_hdl, + uint8_t mac_id) +{ + wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl; + + if (wmi_handle->ops->send_d0wow_disable_cmd) + return wmi_handle->ops->send_d0wow_disable_cmd( + wmi_handle, mac_id); + + return QDF_STATUS_E_FAILURE; +} +#endif + /** * wmi_unified_wow_enable_send() - WMI wow enable function * @param wmi_handle : handle to WMI. diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index b06959648e..03cc684e04 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -1247,6 +1247,84 @@ static QDF_STATUS send_resume_cmd_tlv(wmi_unified_t wmi_handle, return ret; } +#ifdef FEATURE_WLAN_D0WOW +/** + * send_d0wow_enable_cmd_tlv() - WMI d0 wow enable function + * @param wmi_handle: handle to WMI. + * @mac_id: radio context + * + * Return: 0 on success and error code on failure. + */ +static QDF_STATUS send_d0wow_enable_cmd_tlv(wmi_unified_t wmi_handle, + uint8_t mac_id) +{ + wmi_d0_wow_enable_disable_cmd_fixed_param *cmd; + wmi_buf_t buf; + int32_t len; + QDF_STATUS status; + + len = sizeof(wmi_d0_wow_enable_disable_cmd_fixed_param); + + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + WMI_LOGE("%s: Failed allocate wmi buffer", __func__); + return QDF_STATUS_E_NOMEM; + } + cmd = (wmi_d0_wow_enable_disable_cmd_fixed_param *) wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_d0_wow_enable_disable_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN + (wmi_d0_wow_enable_disable_cmd_fixed_param)); + + cmd->enable = true; + + status = wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_D0_WOW_ENABLE_DISABLE_CMDID); + if (QDF_IS_STATUS_ERROR(status)) + wmi_buf_free(buf); + + return status; +} + +/** + * send_d0wow_disable_cmd_tlv() - WMI d0 wow disable function + * @param wmi_handle: handle to WMI. + * @mac_id: radio context + * + * Return: 0 on success and error code on failure. + */ +static QDF_STATUS send_d0wow_disable_cmd_tlv(wmi_unified_t wmi_handle, + uint8_t mac_id) +{ + wmi_d0_wow_enable_disable_cmd_fixed_param *cmd; + wmi_buf_t buf; + int32_t len; + QDF_STATUS status; + + len = sizeof(wmi_d0_wow_enable_disable_cmd_fixed_param); + + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + WMI_LOGE("%s: Failed allocate wmi buffer", __func__); + return QDF_STATUS_E_NOMEM; + } + cmd = (wmi_d0_wow_enable_disable_cmd_fixed_param *) wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_d0_wow_enable_disable_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN + (wmi_d0_wow_enable_disable_cmd_fixed_param)); + + cmd->enable = false; + + status = wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_D0_WOW_ENABLE_DISABLE_CMDID); + if (QDF_IS_STATUS_ERROR(status)) + wmi_buf_free(buf); + + return status; +} +#endif + /** * send_wow_enable_cmd_tlv() - WMI wow enable function * @param wmi_handle : handle to WMI. @@ -19810,6 +19888,10 @@ struct wmi_ops tlv_ops = { .send_pdev_param_cmd = send_pdev_param_cmd_tlv, .send_suspend_cmd = send_suspend_cmd_tlv, .send_resume_cmd = send_resume_cmd_tlv, +#ifdef FEATURE_WLAN_D0WOW + .send_d0wow_enable_cmd = send_d0wow_enable_cmd_tlv, + .send_d0wow_disable_cmd = send_d0wow_disable_cmd_tlv, +#endif .send_wow_enable_cmd = send_wow_enable_cmd_tlv, .send_set_ap_ps_param_cmd = send_set_ap_ps_param_cmd_tlv, .send_set_sta_ps_param_cmd = send_set_sta_ps_param_cmd_tlv,