qcacld-3.0: Enable UAPSD only when device is in power save

Send UAPSD parameters to FW and enable it only if the device is
in power save mode.

Change-Id: I14ecfc8bace7ec15eebe18296355544cdbdf030e
CRs-Fixed: 991119
This commit is contained in:
Kiran Kumar Lokere 2016-03-11 17:28:28 -08:00 • committed by Gerrit - the friendly Code Review server
commit 830ba16663
3 changed files with 118 additions and 52 deletions

View file

@ -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;
}

View file

@ -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

View file

@ -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;