mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-14 00:24:41 -04:00
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:
parent
80897d86c9
commit
830ba16663
3 changed files with 118 additions and 52 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue