|
@@ -459,14 +459,15 @@ static inline uint32_t wma_get_uapsd_mask(tpUapsd_Params uapsd_params)
|
|
|
* @wma: wma handle
|
|
|
* @vdev_id: vdev id
|
|
|
* @enable: enable/disable
|
|
|
- * @power_config: power configuration
|
|
|
+ * @ps_param: OPM params
|
|
|
+ * @enable_ps: enable power save
|
|
|
*
|
|
|
* Return: QDF_STATUS_SUCCESS for success or error code
|
|
|
*/
|
|
|
static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma,
|
|
|
uint32_t vdev_id,
|
|
|
uint8_t enable,
|
|
|
- enum powersave_mode power_config,
|
|
|
+ struct wma_ps_params *ps_params,
|
|
|
bool enable_ps)
|
|
|
{
|
|
|
QDF_STATUS ret;
|
|
@@ -475,7 +476,6 @@ static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma,
|
|
|
uint32_t rx_wake_policy;
|
|
|
uint32_t tx_wake_threshold;
|
|
|
uint32_t pspoll_count;
|
|
|
- uint32_t inactivity_time;
|
|
|
uint32_t psmode;
|
|
|
struct wlan_objmgr_vdev *vdev;
|
|
|
u32 listen_interval = 0;
|
|
@@ -487,8 +487,6 @@ static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma,
|
|
|
return QDF_STATUS_E_NOMEM;
|
|
|
}
|
|
|
|
|
|
- inactivity_time = PS_DATA_INACTIVITY_TIMEOUT;
|
|
|
-
|
|
|
if (enable) {
|
|
|
/* override normal configuration and force station asleep */
|
|
|
rx_wake_policy = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
|
|
@@ -522,17 +520,42 @@ static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma,
|
|
|
* So Disable advanced power save explicitly
|
|
|
*/
|
|
|
ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id,
|
|
|
- WMI_STA_PS_ENABLE_QPOWER,
|
|
|
- power_config);
|
|
|
+ WMI_STA_PS_ENABLE_OPM,
|
|
|
+ ps_params->opm_mode);
|
|
|
if (QDF_IS_STATUS_ERROR(ret)) {
|
|
|
wma_err("%s(%d) Power Failed vdevId %d",
|
|
|
- power_config ? "Enable" : "Disable",
|
|
|
- power_config, vdev_id);
|
|
|
+ ps_params->opm_mode ? "Enable" : "Disable",
|
|
|
+ ps_params->opm_mode, vdev_id);
|
|
|
return ret;
|
|
|
}
|
|
|
wma_debug("Power %s(%d) vdevId %d",
|
|
|
- power_config ? "Enabled" : "Disabled",
|
|
|
- power_config, vdev_id);
|
|
|
+ ps_params->opm_mode ? "Enabled" : "Disabled",
|
|
|
+ ps_params->opm_mode, vdev_id);
|
|
|
+
|
|
|
+ /* Set the Tx/Rx InActivity */
|
|
|
+ ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id,
|
|
|
+ WMI_STA_PS_PARAM_INACTIVITY_TIME,
|
|
|
+ ps_params->ps_ito);
|
|
|
+
|
|
|
+ if (QDF_IS_STATUS_ERROR(ret)) {
|
|
|
+ wma_err("Setting Tx/Rx InActivity Failed vdevId %d InAct %d",
|
|
|
+ vdev_id, ps_params->ps_ito);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ wma_debug("Set Tx/Rx InActivity vdevId %d InAct %d",
|
|
|
+ vdev_id, ps_params->ps_ito);
|
|
|
+
|
|
|
+ ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id,
|
|
|
+ WMI_STA_PS_PARAM_SPEC_WAKE_INTERVAL,
|
|
|
+ ps_params->spec_wake);
|
|
|
+
|
|
|
+ if (QDF_IS_STATUS_ERROR(ret)) {
|
|
|
+ wma_err("Setting Spec wake Failed vdevId %d InAct %d",
|
|
|
+ vdev_id, ps_params->spec_wake);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ wma_debug("Set Spec wake vdevId %d InAct %d",
|
|
|
+ vdev_id, ps_params->spec_wake);
|
|
|
|
|
|
/* Set the Wake Policy to WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD */
|
|
|
ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id,
|
|
@@ -571,19 +594,6 @@ static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma,
|
|
|
wma_debug("Set Ps Poll Count vdevId %d ps poll cnt %d",
|
|
|
vdev_id, pspoll_count);
|
|
|
|
|
|
- /* Set the Tx/Rx InActivity */
|
|
|
- ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id,
|
|
|
- WMI_STA_PS_PARAM_INACTIVITY_TIME,
|
|
|
- inactivity_time);
|
|
|
-
|
|
|
- if (QDF_IS_STATUS_ERROR(ret)) {
|
|
|
- wma_err("Setting Tx/Rx InActivity Failed vdevId %d InAct %d",
|
|
|
- vdev_id, inactivity_time);
|
|
|
- return ret;
|
|
|
- }
|
|
|
- wma_debug("Set Tx/Rx InActivity vdevId %d InAct %d",
|
|
|
- vdev_id, inactivity_time);
|
|
|
-
|
|
|
/* Enable Sta Mode Power save */
|
|
|
if (enable_ps) {
|
|
|
ret = wmi_unified_set_sta_ps(wma->wmi_handle, vdev_id, true);
|
|
@@ -622,20 +632,43 @@ static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma,
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|
|
|
-static uint8_t wma_get_power_config(tp_wma_handle wma)
|
|
|
+static QDF_STATUS wma_wlan_pmo_get_ps_params(struct wlan_objmgr_vdev *vdev,
|
|
|
+ struct wma_ps_params *ps_params)
|
|
|
{
|
|
|
- wma_debug("POWER mode is %d", wma->powersave_mode);
|
|
|
+ struct pmo_ps_params pmo_ps_param = {0};
|
|
|
+ QDF_STATUS status;
|
|
|
|
|
|
- return wma->powersave_mode;
|
|
|
+ status = wlan_pmo_get_ps_params(vdev, &pmo_ps_param);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status))
|
|
|
+ return status;
|
|
|
+
|
|
|
+ switch (pmo_ps_param.opm_mode) {
|
|
|
+ case PMO_PS_ADVANCED_POWER_SAVE_DISABLE:
|
|
|
+ ps_params->opm_mode = WMI_STA_PS_OPM_CONSERVATIVE;
|
|
|
+ break;
|
|
|
+ case PMO_PS_ADVANCED_POWER_SAVE_ENABLE:
|
|
|
+ ps_params->opm_mode = WMI_STA_PS_OPM_AGGRESSIVE;
|
|
|
+ break;
|
|
|
+ case PMO_PS_ADVANCED_POWER_SAVE_USER_DEFINED:
|
|
|
+ ps_params->opm_mode = WMI_STA_PS_USER_DEF;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ wma_err("Invalid opm_mode:%d", pmo_ps_param.opm_mode);
|
|
|
+ return QDF_STATUS_E_INVAL;
|
|
|
+ }
|
|
|
+ ps_params->ps_ito = pmo_ps_param.ps_ito;
|
|
|
+ ps_params->spec_wake = pmo_ps_param.spec_wake;
|
|
|
+
|
|
|
+ return status;
|
|
|
}
|
|
|
|
|
|
void wma_enable_sta_ps_mode(tpEnablePsParams ps_req)
|
|
|
{
|
|
|
uint32_t vdev_id = ps_req->sessionid;
|
|
|
QDF_STATUS ret;
|
|
|
- enum powersave_mode power_config;
|
|
|
struct wma_txrx_node *iface;
|
|
|
t_wma_handle *wma_handle;
|
|
|
+ struct wma_ps_params ps_params = {0};
|
|
|
|
|
|
wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
|
|
|
if (!wma_handle)
|
|
@@ -648,10 +681,13 @@ void wma_enable_sta_ps_mode(tpEnablePsParams ps_req)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- power_config = wma_get_power_config(wma_handle);
|
|
|
+ ret = wma_wlan_pmo_get_ps_params(iface->vdev, &ps_params);
|
|
|
+ if (QDF_IS_STATUS_ERROR(ret))
|
|
|
+ return;
|
|
|
+
|
|
|
if (eSIR_ADDON_NOTHING == ps_req->psSetting) {
|
|
|
- if (power_config && iface->uapsd_cached_val) {
|
|
|
- power_config = 0;
|
|
|
+ if (ps_params.opm_mode && iface->uapsd_cached_val) {
|
|
|
+ ps_params.opm_mode = WMI_STA_PS_OPM_CONSERVATIVE;
|
|
|
wma_debug("Advanced power save is disabled");
|
|
|
}
|
|
|
wma_debug("Enable Sta Mode Ps vdevId %d", vdev_id);
|
|
@@ -664,7 +700,7 @@ void wma_enable_sta_ps_mode(tpEnablePsParams ps_req)
|
|
|
}
|
|
|
|
|
|
ret = wma_set_force_sleep(wma_handle, vdev_id, false,
|
|
|
- power_config, true);
|
|
|
+ &ps_params, true);
|
|
|
if (QDF_IS_STATUS_ERROR(ret)) {
|
|
|
wma_err("Enable Sta Ps Failed vdevId %d", vdev_id);
|
|
|
return;
|
|
@@ -693,13 +729,13 @@ void wma_enable_sta_ps_mode(tpEnablePsParams ps_req)
|
|
|
vdev_id, uapsd_val);
|
|
|
}
|
|
|
|
|
|
- if (power_config && iface->uapsd_cached_val) {
|
|
|
- power_config = 0;
|
|
|
+ if (ps_params.opm_mode && iface->uapsd_cached_val) {
|
|
|
+ ps_params.opm_mode = WMI_STA_PS_OPM_CONSERVATIVE;
|
|
|
wma_debug("Qpower is disabled");
|
|
|
}
|
|
|
wma_debug("Enable Forced Sleep vdevId %d", vdev_id);
|
|
|
ret = wma_set_force_sleep(wma_handle, vdev_id, true,
|
|
|
- power_config, true);
|
|
|
+ &ps_params, true);
|
|
|
|
|
|
if (QDF_IS_STATUS_ERROR(ret)) {
|
|
|
wma_err("Enable Forced Sleep Failed vdevId %d",
|
|
@@ -782,11 +818,10 @@ QDF_STATUS wma_set_power_config(uint8_t vdev_id, enum powersave_mode power)
|
|
|
return QDF_STATUS_E_INVAL;
|
|
|
|
|
|
wma_info("configuring power: %d", power);
|
|
|
- wma->powersave_mode = power;
|
|
|
return wma_unified_set_sta_ps_param(wma->wmi_handle,
|
|
|
vdev_id,
|
|
|
- WMI_STA_PS_ENABLE_QPOWER,
|
|
|
- wma_get_power_config(wma));
|
|
|
+ WMI_STA_PS_ENABLE_OPM,
|
|
|
+ power);
|
|
|
}
|
|
|
|
|
|
void wma_enable_uapsd_mode(tp_wma_handle wma, tpEnableUapsdParams ps_req)
|
|
@@ -794,7 +829,7 @@ void wma_enable_uapsd_mode(tp_wma_handle wma, tpEnableUapsdParams ps_req)
|
|
|
QDF_STATUS ret;
|
|
|
uint32_t vdev_id = ps_req->sessionid;
|
|
|
uint32_t uapsd_val = 0;
|
|
|
- enum powersave_mode power_config = wma_get_power_config(wma);
|
|
|
+ struct wma_ps_params ps_params = {0};
|
|
|
struct wma_txrx_node *iface = &wma->interfaces[vdev_id];
|
|
|
|
|
|
if (!iface->vdev) {
|
|
@@ -802,6 +837,12 @@ void wma_enable_uapsd_mode(tp_wma_handle wma, tpEnableUapsdParams ps_req)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ ret = wma_wlan_pmo_get_ps_params(iface->vdev, &ps_params);
|
|
|
+ if (QDF_IS_STATUS_ERROR(ret)) {
|
|
|
+ wma_err("ps_param is invalid for vdev_%d", vdev_id);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
/* Disable Sta Mode Power save */
|
|
|
ret = wmi_unified_set_sta_ps(wma->wmi_handle, vdev_id, false);
|
|
|
if (QDF_IS_STATUS_ERROR(ret)) {
|
|
@@ -819,14 +860,14 @@ void wma_enable_uapsd_mode(tp_wma_handle wma, tpEnableUapsdParams ps_req)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (power_config && uapsd_val) {
|
|
|
- power_config = 0;
|
|
|
+ if (ps_params.opm_mode && uapsd_val) {
|
|
|
+ ps_params.opm_mode = 0;
|
|
|
wma_debug("Disable power %d", vdev_id);
|
|
|
}
|
|
|
iface->uapsd_cached_val = uapsd_val;
|
|
|
wma_debug("Enable Forced Sleep vdevId %d", vdev_id);
|
|
|
ret = wma_set_force_sleep(wma, vdev_id, true,
|
|
|
- power_config, ps_req->uapsdParams.enable_ps);
|
|
|
+ &ps_params, ps_req->uapsdParams.enable_ps);
|
|
|
if (QDF_IS_STATUS_ERROR(ret)) {
|
|
|
wma_err("Enable Forced Sleep Failed vdevId %d", vdev_id);
|
|
|
return;
|
|
@@ -846,10 +887,22 @@ void wma_disable_uapsd_mode(tp_wma_handle wma,
|
|
|
{
|
|
|
QDF_STATUS ret;
|
|
|
uint32_t vdev_id = ps_req->sessionid;
|
|
|
- enum powersave_mode power_config = wma_get_power_config(wma);
|
|
|
+ struct wma_ps_params ps_params = {0};
|
|
|
+ struct wma_txrx_node *iface = &wma->interfaces[vdev_id];
|
|
|
+
|
|
|
+ if (!iface->vdev) {
|
|
|
+ wma_err("vdev is null for vdev_%d", vdev_id);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
wma_debug("Disable Uapsd vdevId %d", vdev_id);
|
|
|
|
|
|
+ ret = wma_wlan_pmo_get_ps_params(iface->vdev, &ps_params);
|
|
|
+ if (QDF_IS_STATUS_ERROR(ret)) {
|
|
|
+ wma_err("ps_param is invalid for vdev_%d", vdev_id);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
/* Disable Sta Mode Power save */
|
|
|
ret = wmi_unified_set_sta_ps(wma->wmi_handle, vdev_id, false);
|
|
|
if (QDF_IS_STATUS_ERROR(ret)) {
|
|
@@ -866,7 +919,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,
|
|
|
- power_config, true);
|
|
|
+ &ps_params, true);
|
|
|
if (QDF_IS_STATUS_ERROR(ret)) {
|
|
|
wma_err("Disable Forced Sleep Failed vdevId %d", vdev_id);
|
|
|
return;
|