diff --git a/core/sme/src/common/sme_power_save.c b/core/sme/src/common/sme_power_save.c index 784270996a6f..3e7546b7ff82 100644 --- a/core/sme/src/common/sme_power_save.c +++ b/core/sme/src/common/sme_power_save.c @@ -62,6 +62,78 @@ QDF_STATUS sme_post_ps_msg_to_wma(uint16_t type, void *body) return QDF_STATUS_SUCCESS; } +/** + * sme_ps_enable_uapsd_req_params(): enables UASPD req params + * @mac_ctx: global mac context + * @session_id: session id + * + * Return: QDF_STATUS + */ +static void sme_ps_fill_uapsd_req_params(tpAniSirGlobal mac_ctx, + tUapsd_Params *uapsdParams, uint32_t session_id, + enum ps_state *ps_state) +{ + + uint8_t uapsd_delivery_mask = 0; + uint8_t uapsd_trigger_mask = 0; + struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info; + struct ps_params *ps_param = &ps_global_info->ps_params[session_id]; + + uapsd_delivery_mask = + ps_param->uapsd_per_ac_bit_mask | + ps_param->uapsd_per_ac_delivery_enable_mask; + + uapsd_trigger_mask = + ps_param->uapsd_per_ac_bit_mask | + ps_param->uapsd_per_ac_trigger_enable_mask; + + uapsdParams->bkDeliveryEnabled = + LIM_UAPSD_GET(ACBK, uapsd_delivery_mask); + + uapsdParams->beDeliveryEnabled = + LIM_UAPSD_GET(ACBE, uapsd_delivery_mask); + + uapsdParams->viDeliveryEnabled = + LIM_UAPSD_GET(ACVI, uapsd_delivery_mask); + + uapsdParams->voDeliveryEnabled = + LIM_UAPSD_GET(ACVO, uapsd_delivery_mask); + + uapsdParams->bkTriggerEnabled = + LIM_UAPSD_GET(ACBK, uapsd_trigger_mask); + + uapsdParams->beTriggerEnabled = + LIM_UAPSD_GET(ACBE, uapsd_trigger_mask); + + uapsdParams->viTriggerEnabled = + LIM_UAPSD_GET(ACVI, uapsd_trigger_mask); + + uapsdParams->voTriggerEnabled = + LIM_UAPSD_GET(ACVO, uapsd_trigger_mask); + if (ps_param->ps_state != FULL_POWER_MODE) { + uapsdParams->enable_ps = true; + *ps_state = UAPSD_MODE; + } else { + uapsdParams->enable_ps = false; + *ps_state = FULL_POWER_MODE; + } +} + +static void sme_set_ps_state(tpAniSirGlobal mac_ctx, + uint32_t session_id, enum ps_state ps_state) +{ + struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info; + struct ps_params *ps_param = &ps_global_info->ps_params[session_id]; + ps_param->ps_state = ps_state; +} + +static void sme_get_ps_state(tpAniSirGlobal mac_ctx, + uint32_t session_id, enum ps_state *ps_state) +{ + struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info; + struct ps_params *ps_param = &ps_global_info->ps_params[session_id]; + *ps_state = ps_param->ps_state; +} /** * sme_ps_enable_ps_req_params(): enables power save req params * @mac_ctx: global mac context @@ -74,6 +146,9 @@ QDF_STATUS sme_ps_enable_ps_req_params(tpAniSirGlobal mac_ctx, { struct sEnablePsParams *enable_ps_req_params; QDF_STATUS status = QDF_STATUS_SUCCESS; + struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info; + struct ps_params *ps_param = &ps_global_info->ps_params[session_id]; + enum ps_state ps_state; enable_ps_req_params = qdf_mem_malloc(sizeof(*enable_ps_req_params)); if (NULL == enable_ps_req_params) { @@ -81,7 +156,17 @@ QDF_STATUS sme_ps_enable_ps_req_params(tpAniSirGlobal mac_ctx, FL("Memory allocation failed for enable_ps_req_params")); return QDF_STATUS_E_NOMEM; } - enable_ps_req_params->psSetting = eSIR_ADDON_NOTHING; + if (ps_param->uapsd_per_ac_bit_mask) { + enable_ps_req_params->psSetting = eSIR_ADDON_ENABLE_UAPSD; + sme_ps_fill_uapsd_req_params(mac_ctx, + &enable_ps_req_params->uapsdParams, + session_id, &ps_state); + ps_state = UAPSD_MODE; + enable_ps_req_params->uapsdParams.enable_ps = true; + } else { + enable_ps_req_params->psSetting = eSIR_ADDON_NOTHING; + ps_state = LEGACY_POWER_SAVE_MODE; + } enable_ps_req_params->sessionid = session_id; status = sme_post_ps_msg_to_wma(WMA_ENTER_PS_REQ, enable_ps_req_params); @@ -89,6 +174,7 @@ QDF_STATUS sme_ps_enable_ps_req_params(tpAniSirGlobal mac_ctx, return QDF_STATUS_E_FAILURE; QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, FL("Message WMA_ENTER_PS_REQ Successfully sent to WMA")); + ps_param->ps_state = ps_state; return QDF_STATUS_SUCCESS; } @@ -120,6 +206,7 @@ QDF_STATUS sme_ps_disable_ps_req_params(tpAniSirGlobal mac_ctx, return QDF_STATUS_E_FAILURE; QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, FL("Message WMA_EXIT_PS_REQ Successfully sent to WMA")); + sme_set_ps_state(mac_ctx, session_id, FULL_POWER_MODE); return QDF_STATUS_SUCCESS; } @@ -135,11 +222,8 @@ QDF_STATUS sme_ps_enable_uapsd_req_params(tpAniSirGlobal mac_ctx, { struct sEnableUapsdParams *enable_uapsd_req_params; - uint8_t uapsd_delivery_mask = 0; - uint8_t uapsd_trigger_mask = 0; - struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info; - struct ps_params *ps_param = &ps_global_info->ps_params[session_id]; QDF_STATUS status = QDF_STATUS_SUCCESS; + enum ps_state ps_state; enable_uapsd_req_params = qdf_mem_malloc(sizeof(*enable_uapsd_req_params)); @@ -149,40 +233,9 @@ QDF_STATUS sme_ps_enable_uapsd_req_params(tpAniSirGlobal mac_ctx, return QDF_STATUS_E_NOMEM; } - - uapsd_delivery_mask = - ps_param->uapsd_per_ac_bit_mask | - ps_param->uapsd_per_ac_delivery_enable_mask; - - uapsd_trigger_mask = - ps_param->uapsd_per_ac_bit_mask | - ps_param->uapsd_per_ac_trigger_enable_mask; - - - enable_uapsd_req_params->uapsdParams.bkDeliveryEnabled = - LIM_UAPSD_GET(ACBK, uapsd_delivery_mask); - - enable_uapsd_req_params->uapsdParams.beDeliveryEnabled = - LIM_UAPSD_GET(ACBE, uapsd_delivery_mask); - - enable_uapsd_req_params->uapsdParams.viDeliveryEnabled = - LIM_UAPSD_GET(ACVI, uapsd_delivery_mask); - - enable_uapsd_req_params->uapsdParams.voDeliveryEnabled = - LIM_UAPSD_GET(ACVO, uapsd_delivery_mask); - - enable_uapsd_req_params->uapsdParams.bkTriggerEnabled = - LIM_UAPSD_GET(ACBK, uapsd_trigger_mask); - - enable_uapsd_req_params->uapsdParams.beTriggerEnabled = - LIM_UAPSD_GET(ACBE, uapsd_trigger_mask); - - enable_uapsd_req_params->uapsdParams.viTriggerEnabled = - LIM_UAPSD_GET(ACVI, uapsd_trigger_mask); - - enable_uapsd_req_params->uapsdParams.voTriggerEnabled = - LIM_UAPSD_GET(ACVO, uapsd_trigger_mask); - + sme_ps_fill_uapsd_req_params(mac_ctx, + &enable_uapsd_req_params->uapsdParams, + session_id, &ps_state); enable_uapsd_req_params->sessionid = session_id; status = sme_post_ps_msg_to_wma(WMA_ENABLE_UAPSD_REQ, @@ -192,6 +245,7 @@ QDF_STATUS sme_ps_enable_uapsd_req_params(tpAniSirGlobal mac_ctx, QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, FL("Msg WMA_ENABLE_UAPSD_REQ Successfully sent to WMA")); + sme_set_ps_state(mac_ctx, session_id, ps_state); return QDF_STATUS_SUCCESS; } @@ -207,12 +261,18 @@ QDF_STATUS sme_ps_disable_uapsd_req_params(tpAniSirGlobal mac_ctx, { struct sDisableUapsdParams *disable_uapsd_req_params; QDF_STATUS status = QDF_STATUS_SUCCESS; + enum ps_state ps_state; + sme_get_ps_state(mac_ctx, session_id, &ps_state); + if (ps_state != UAPSD_MODE) { + sms_log(mac_ctx, LOGE, FL("UAPSD is already disabled")); + return QDF_STATUS_SUCCESS; + } disable_uapsd_req_params = qdf_mem_malloc(sizeof(*disable_uapsd_req_params)); if (NULL == disable_uapsd_req_params) { sms_log(mac_ctx, LOGE, - FL("Memory allocation failed for disable_uapsd_req_params")); + FL("Mem alloc failed for disable_uapsd_req_params")); return QDF_STATUS_E_NOMEM; } @@ -224,6 +284,7 @@ QDF_STATUS sme_ps_disable_uapsd_req_params(tpAniSirGlobal mac_ctx, QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, FL("Message WMA_DISABLE_UAPSD_REQ Successfully sent to WMA")); + sme_set_ps_state(mac_ctx, session_id, LEGACY_POWER_SAVE_MODE); return QDF_STATUS_SUCCESS; } diff --git a/core/wma/inc/wma_types.h b/core/wma/inc/wma_types.h index 56575030e534..d58167928c1d 100644 --- a/core/wma/inc/wma_types.h +++ b/core/wma/inc/wma_types.h @@ -526,6 +526,7 @@ typedef struct sUapsd_Params { uint8_t beTriggerEnabled:1; uint8_t viTriggerEnabled:1; uint8_t voTriggerEnabled:1; + bool enable_ps; } tUapsd_Params, *tpUapsd_Params; /** @@ -706,15 +707,15 @@ QDF_STATUS wma_register_roaming_callbacks(void *cds_ctx, roam_offload_synch_ind *roam_synch_data, tpSirBssDescription bss_desc_ptr)); #else -static inline CDF_STATUS wma_register_roaming_callbacks(void *cds_ctx, +static inline QDF_STATUS wma_register_roaming_callbacks(void *cds_ctx, void (*csr_roam_synch_cb)(tpAniSirGlobal mac, roam_offload_synch_ind *roam_synch_data, tpSirBssDescription bss_desc_ptr, uint8_t reason), - CDF_STATUS (*pe_roam_synch_cb)(tpAniSirGlobal mac, + QDF_STATUS (*pe_roam_synch_cb)(tpAniSirGlobal mac, roam_offload_synch_ind *roam_synch_data, tpSirBssDescription bss_desc_ptr)) { - return CDF_STATUS_E_NOSUPPORT; + return QDF_STATUS_E_NOSUPPORT; } #endif diff --git a/core/wma/src/wma_power.c b/core/wma/src/wma_power.c index e383e3906d8f..05bed06f0ea9 100644 --- a/core/wma/src/wma_power.c +++ b/core/wma/src/wma_power.c @@ -552,7 +552,8 @@ static inline uint32_t wma_get_uapsd_mask(tpUapsd_Params uapsd_params) static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma, uint32_t vdev_id, uint8_t enable, - enum powersave_qpower_mode qpower_config) + enum powersave_qpower_mode qpower_config, + bool enable_ps) { QDF_STATUS ret; uint32_t cfg_data_val = 0; @@ -680,11 +681,14 @@ static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma, vdev_id, inactivity_time); /* Enable Sta Mode Power save */ - ret = wmi_unified_set_sta_ps(wma->wmi_handle, vdev_id, true); + if (enable_ps) { + ret = wmi_unified_set_sta_ps(wma->wmi_handle, vdev_id, true); - if (QDF_IS_STATUS_ERROR(ret)) { - WMA_LOGE("Enable Sta Mode Ps Failed vdevId %d", vdev_id); - return ret; + if (QDF_IS_STATUS_ERROR(ret)) { + WMA_LOGE("Enable Sta Mode Ps Failed vdevId %d", + vdev_id); + return ret; + } } /* Set Listen Interval */ @@ -886,7 +890,7 @@ void wma_enable_sta_ps_mode(tp_wma_handle wma, tpEnablePsParams ps_req) } ret = wma_set_force_sleep(wma, vdev_id, false, - qpower_config); + qpower_config, true); if (QDF_IS_STATUS_ERROR(ret)) { WMA_LOGE("Enable Sta Ps Failed vdevId %d", vdev_id); return; @@ -916,7 +920,7 @@ void wma_enable_sta_ps_mode(tp_wma_handle wma, tpEnablePsParams ps_req) WMA_LOGD("Enable Forced Sleep vdevId %d", vdev_id); ret = wma_set_force_sleep(wma, vdev_id, true, - qpower_config); + qpower_config, true); if (QDF_IS_STATUS_ERROR(ret)) { WMA_LOGE("Enable Forced Sleep Failed vdevId %d", @@ -996,7 +1000,7 @@ void wma_enable_uapsd_mode(tp_wma_handle wma, tpEnableUapsdParams ps_req) WMA_LOGD("Enable Forced Sleep vdevId %d", vdev_id); ret = wma_set_force_sleep(wma, vdev_id, true, - qpower_config); + qpower_config, ps_req->uapsdParams.enable_ps); if (QDF_IS_STATUS_ERROR(ret)) { WMA_LOGE("Enable Forced Sleep Failed vdevId %d", vdev_id); return; @@ -1036,7 +1040,7 @@ void wma_disable_uapsd_mode(tp_wma_handle wma, /* Re enable Sta Mode Powersave with proper configuration */ ret = wma_set_force_sleep(wma, vdev_id, false, - qpower_config); + qpower_config, true); if (QDF_IS_STATUS_ERROR(ret)) { WMA_LOGE("Disable Forced Sleep Failed vdevId %d", vdev_id); return;