diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index bb8a4a14dd14..d7415d3ba3ef 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -4875,6 +4875,41 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params) if (params->enableAmpduPs && (params->htCapable || params->vhtCapable)) wma_set_ppsconfig(params->smesessionId, WMA_VHT_PPS_DELIM_CRC_FAIL, 1); + if (WMI_SERVICE_EXT_IS_ENABLED(wma->wmi_service_bitmap, + wma->wmi_service_ext_bitmap, + WMI_SERVICE_LISTEN_INTERVAL_OFFLOAD_SUPPORT)) { + WMA_LOGD("%s: listen interval offload enabled, setting params", + __func__); + status = wma_vdev_set_param(wma->wmi_handle, + params->smesessionId, + WMI_VDEV_PARAM_MAX_LI_OF_MODDTIM, + wma->staMaxLIModDtim); + if (status != QDF_STATUS_SUCCESS) { + WMA_LOGE(FL("can't set MAX_LI for session: %d"), + params->smesessionId); + } + status = wma_vdev_set_param(wma->wmi_handle, + params->smesessionId, + WMI_VDEV_PARAM_DYNDTIM_CNT, + wma->staDynamicDtim); + if (status != QDF_STATUS_SUCCESS) { + WMA_LOGE(FL("can't set DYNDTIM_CNT for session: %d"), + params->smesessionId); + } + status = wma_vdev_set_param(wma->wmi_handle, + params->smesessionId, + WMI_VDEV_PARAM_MODDTIM_CNT, + wma->staModDtim); + if (status != QDF_STATUS_SUCCESS) { + WMA_LOGE(FL("can't set DTIM_CNT for session: %d"), + params->smesessionId); + } + + } else { + WMA_LOGD("%s: listen interval offload is not set", + __func__); + } + iface->aid = params->assocId; params->nss = iface->nss; out: diff --git a/core/wma/src/wma_power.c b/core/wma/src/wma_power.c index 4fad5713e7d5..3d146776d5b0 100644 --- a/core/wma/src/wma_power.c +++ b/core/wma/src/wma_power.c @@ -1865,15 +1865,23 @@ static inline uint8_t wma_is_user_set_li_params(struct wma_txrx_node *iface) void wma_set_suspend_dtim(tp_wma_handle wma) { uint8_t i; + bool li_offload_support = false; if (NULL == wma) { WMA_LOGE("%s: wma is NULL", __func__); return; } + if (WMI_SERVICE_EXT_IS_ENABLED(wma->wmi_service_bitmap, + wma->wmi_service_ext_bitmap, + WMI_SERVICE_LISTEN_INTERVAL_OFFLOAD_SUPPORT)) { + WMA_LOGD("%s: listen interval support is enabled", __func__); + li_offload_support = true; + } for (i = 0; i < wma->max_bssid; i++) { if (wma->interfaces[i].handle) { - if (!wma_is_user_set_li_params(&wma->interfaces[i])) + if (!wma_is_user_set_li_params(&wma->interfaces[i]) && + !li_offload_support) wma_set_vdev_suspend_dtim(wma, i); wma_configure_vdev_suspend_params(wma, i); } @@ -1976,15 +1984,23 @@ static void wma_set_vdev_resume_dtim(tp_wma_handle wma, uint8_t vdev_id) void wma_set_resume_dtim(tp_wma_handle wma) { uint8_t i; + bool li_offload_support = false; if (NULL == wma) { WMA_LOGE("%s: wma is NULL", __func__); return; } + if (WMI_SERVICE_EXT_IS_ENABLED(wma->wmi_service_bitmap, + wma->wmi_service_ext_bitmap, + WMI_SERVICE_LISTEN_INTERVAL_OFFLOAD_SUPPORT)) { + WMA_LOGD("%s: listen interval support is enabled", __func__); + li_offload_support = true; + } for (i = 0; i < wma->max_bssid; i++) { if (wma->interfaces[i].handle) { - if (!wma_is_user_set_li_params(&wma->interfaces[i])) + if (!wma_is_user_set_li_params(&wma->interfaces[i]) && + !li_offload_support) wma_set_vdev_resume_dtim(wma, i); wma_configure_vdev_resume_params(wma, i); }