From a9c42d3d8fe18326498d659a591e1f3143c0b2e1 Mon Sep 17 00:00:00 2001 From: Vishal Miskin Date: Wed, 5 Jul 2023 12:14:46 +0530 Subject: [PATCH] qcacld-3.0: Move OPM parameters to PMO module Store OPM parameters in PMO per vdev context. Change-Id: I97b84171db434af0e43246d61416b37849728a6d CRs-Fixed: 3567042 --- components/pmo/core/inc/wlan_pmo_priv.h | 5 + .../pmo/core/inc/wlan_pmo_static_config.h | 42 ++++++ .../pmo/core/src/wlan_pmo_suspend_resume.c | 6 +- .../inc/wlan_pmo_common_public_struct.h | 13 ++ .../dispatcher/inc/wlan_pmo_obj_mgmt_api.h | 32 ++++ .../pmo/dispatcher/inc/wlan_pmo_ucfg_api.h | 21 +++ .../dispatcher/src/wlan_pmo_obj_mgmt_api.c | 21 +++ .../pmo/dispatcher/src/wlan_pmo_ucfg_api.c | 13 ++ .../pmo/src/target_if_pmo_suspend_resume.c | 2 +- core/mac/inc/sir_api.h | 6 - core/wma/inc/wma.h | 2 - core/wma/inc/wma_api.h | 6 + core/wma/src/wma_main.c | 9 -- core/wma/src/wma_power.c | 141 ++++++++++++------ 14 files changed, 254 insertions(+), 65 deletions(-) diff --git a/components/pmo/core/inc/wlan_pmo_priv.h b/components/pmo/core/inc/wlan_pmo_priv.h index 93fd91382f..4d58a0f0c6 100644 --- a/components/pmo/core/inc/wlan_pmo_priv.h +++ b/components/pmo/core/inc/wlan_pmo_priv.h @@ -35,6 +35,9 @@ #include "wlan_pmo_wow_public_struct.h" #include "wlan_pmo_mc_addr_filtering_public_struct.h" +#define PMO_PS_DATA_INACTIVITY_TIMEOUT (200) +#define PMO_PS_DATA_SPEC_WAKE (0) + /** * struct pmo_psoc_priv_obj - psoc related data require for pmo * @psoc_cfg: place holder for psoc configuration @@ -100,6 +103,7 @@ struct wlan_pmo_ctx { * @addr_filter_pattern: addr filter pattern for vdev * @vdev_gtk_req: place holder for gtk request for vdev * @vdev_gtk_rsp_req: place holder for gtk response request for vdev + * @ps_params: OPM params * @gtk_err_enable: gtk error is enabled or not * @vdev_bpf_req: place holder for apf/bpf for vdev * @vdev_pkt_filter: place holder for vdev packet filter @@ -130,6 +134,7 @@ struct pmo_vdev_priv_obj { uint8_t addr_filter_pattern; struct pmo_gtk_req vdev_gtk_req; struct pmo_gtk_rsp_req vdev_gtk_rsp_req; + struct pmo_ps_params ps_params; qdf_atomic_t gtk_err_enable; bool magic_ptrn_enable; bool ptrn_match_enable; diff --git a/components/pmo/core/inc/wlan_pmo_static_config.h b/components/pmo/core/inc/wlan_pmo_static_config.h index 31ed642b45..ca87040a3e 100644 --- a/components/pmo/core/inc/wlan_pmo_static_config.h +++ b/components/pmo/core/inc/wlan_pmo_static_config.h @@ -106,6 +106,48 @@ void pmo_set_sta_wow_bitmask(uint32_t *bitmask, uint32_t wow_bitmask_size); */ void pmo_set_sap_wow_bitmask(uint32_t *bitmask, uint32_t wow_bitmask_size); +/** + * pmo_core_vdev_set_ps_params() - set vdev ps_params + * @vdev: objmgr vdev handle + * @ps_params: vdev OPM parameters + * + * Return: None + */ +static inline +void pmo_core_vdev_set_ps_params(struct wlan_objmgr_vdev *vdev, + struct pmo_ps_params *ps_params) +{ + struct pmo_vdev_priv_obj *vdev_ctx; + + vdev_ctx = pmo_vdev_get_priv(vdev); + qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); + vdev_ctx->ps_params = *ps_params; + qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); +} + +/** + * pmo_core_vdev_get_ps_params() - get vdev ps_params + * @vdev: objmgr vdev handle + * @ps_params: pointer to get vdev ps_params + * + * Return: QDF_STATUS + */ +static inline +QDF_STATUS pmo_core_vdev_get_ps_params(struct wlan_objmgr_vdev *vdev, + struct pmo_ps_params *ps_params) +{ + struct pmo_vdev_priv_obj *vdev_ctx; + + vdev_ctx = pmo_vdev_get_priv(vdev); + if (!vdev_ctx) + return QDF_STATUS_E_NULL_VALUE; + + qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); + *ps_params = vdev_ctx->ps_params; + qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + return QDF_STATUS_SUCCESS; +} + #ifdef WLAN_FEATURE_NAN /** * pmo_set_ndp_wow_bitmask() - set predefined NDP wow wakeup events diff --git a/components/pmo/core/src/wlan_pmo_suspend_resume.c b/components/pmo/core/src/wlan_pmo_suspend_resume.c index d3444d3d09..c53bb37f9a 100644 --- a/components/pmo/core/src/wlan_pmo_suspend_resume.c +++ b/components/pmo/core/src/wlan_pmo_suspend_resume.c @@ -207,7 +207,7 @@ static void pmo_configure_vdev_suspend_params( vdev_id); } - non_wow_inactivity_time = PS_DATA_INACTIVITY_TIMEOUT; + non_wow_inactivity_time = PMO_PS_DATA_INACTIVITY_TIMEOUT; wow_inactivity_time = psoc_cfg->wow_data_inactivity_timeout; /* * To keep ito repeat count same in wow mode as in non wow mode, @@ -244,14 +244,14 @@ static void pmo_configure_vdev_resume_params( return; ret = pmo_tgt_send_vdev_sta_ps_param(vdev, pmo_sta_ps_param_inactivity_time, - PS_DATA_INACTIVITY_TIMEOUT); + vdev_ctx->ps_params.ps_ito); if (QDF_IS_STATUS_ERROR(ret)) { pmo_err("Failed to Set inactivity timeout vdevId %d", vdev_id); } ret = pmo_tgt_send_vdev_sta_ps_param(vdev, pmo_sta_ps_param_spec_wake_interval, - PS_DATA_SPEC_WAKE); + vdev_ctx->ps_params.spec_wake); if (QDF_IS_STATUS_ERROR(ret)) { pmo_err("Failed to Set wow spec wake interval vdevId %d", vdev_id); diff --git a/components/pmo/dispatcher/inc/wlan_pmo_common_public_struct.h b/components/pmo/dispatcher/inc/wlan_pmo_common_public_struct.h index 43dd0b4120..481500737c 100644 --- a/components/pmo/dispatcher/inc/wlan_pmo_common_public_struct.h +++ b/components/pmo/dispatcher/inc/wlan_pmo_common_public_struct.h @@ -532,4 +532,17 @@ struct pmo_igmp_offload_req { uint32_t num_grp_ip_address; uint32_t grp_ip_address[MAX_MC_IP_ADDR]; }; + +/** + * struct pmo_ps_params - structure to hold OPM params + * + * @opm_mode: OPM mode + * @ps_ito: power save inactivity timeout + * @spec_wake: OPM speculative wake interval + */ +struct pmo_ps_params { + enum powersave_mode opm_mode; + uint16_t ps_ito; + uint16_t spec_wake; +}; #endif /* end of _WLAN_PMO_COMMONP_STRUCT_H_ */ diff --git a/components/pmo/dispatcher/inc/wlan_pmo_obj_mgmt_api.h b/components/pmo/dispatcher/inc/wlan_pmo_obj_mgmt_api.h index 3b0e5f3c6e..ef45e94c2b 100644 --- a/components/pmo/dispatcher/inc/wlan_pmo_obj_mgmt_api.h +++ b/components/pmo/dispatcher/inc/wlan_pmo_obj_mgmt_api.h @@ -325,6 +325,26 @@ wlan_pmo_get_interval_for_pagefault_wakeup_counts( QDF_STATUS wlan_pmo_get_listen_interval(struct wlan_objmgr_vdev *vdev, uint32_t *listen_interval); +/** + * wlan_pmo_set_ps_params() - Set vdev OPM params + * @vdev: pointer to vdev object + * @ps_params: pointer to OPM params + * + * Return: None + */ +void wlan_pmo_set_ps_params(struct wlan_objmgr_vdev *vdev, + struct pmo_ps_params *ps_params); + +/** + * wlan_pmo_get_ps_params() - Get vdev OPM params + * @vdev: pointer to vdev object + * @ps_params: Pointer to get OPM params + * + * Return: QDF Status + */ +QDF_STATUS wlan_pmo_get_ps_params(struct wlan_objmgr_vdev *vdev, + struct pmo_ps_params *ps_params); + #else /* WLAN_POWER_MANAGEMENT_OFFLOAD */ static inline QDF_STATUS pmo_init(void) @@ -512,6 +532,18 @@ static QDF_STATUS wlan_pmo_get_listen_interval(struct wlan_objmgr_vdev *vdev, return QDF_STATUS_SUCCESS; } +static inline +void wlan_pmo_set_ps_params(struct wlan_objmgr_vdev *vdev, + struct pmo_ps_params *ps_params) +{ +} + +static inline QDF_STATUS +wlan_pmo_get_ps_params(struct wlan_objmgr_vdev *vdev, + struct pmo_ps_params *ps_params) +{ + return QDF_STATUS_SUCCESS; +} #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */ #endif /* end of _WLAN_PMO_OBJ_MGMT_API_H_ */ diff --git a/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h b/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h index 466a639c84..6d33b4c535 100644 --- a/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h +++ b/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h @@ -808,6 +808,27 @@ void ucfg_pmo_set_wow_enable(struct wlan_objmgr_psoc *psoc, enum pmo_wow_enable_type val); +/** + * ucfg_pmo_set_ps_params() - Set vdev OPM params + * @vdev: pointer to vdev object + * @ps_params: pointer to OPM params + * + * Return: None + */ +void +ucfg_pmo_set_ps_params(struct wlan_objmgr_vdev *vdev, + struct pmo_ps_params *ps_params); + +/** + * ucfg_pmo_get_ps_params() - Get vdev OPM params + * @vdev: pointer to vdev object + * @ps_params: Pointer to get OPM params + * + * Return: QDF Status + */ +QDF_STATUS ucfg_pmo_get_ps_params(struct wlan_objmgr_vdev *vdev, + struct pmo_ps_params *ps_params); + /** * ucfg_pmo_get_gtk_rsp(): API to send gtk response request to fwr * @vdev: objmgr vdev handle diff --git a/components/pmo/dispatcher/src/wlan_pmo_obj_mgmt_api.c b/components/pmo/dispatcher/src/wlan_pmo_obj_mgmt_api.c index 5909d3e688..ef8bdf8764 100644 --- a/components/pmo/dispatcher/src/wlan_pmo_obj_mgmt_api.c +++ b/components/pmo/dispatcher/src/wlan_pmo_obj_mgmt_api.c @@ -285,6 +285,15 @@ QDF_STATUS pmo_vdev_object_created_notification( vdev_ctx->pmo_psoc_ctx = psoc_ctx; qdf_atomic_init(&vdev_ctx->gtk_err_enable); pmo_vdev_dynamic_arp_ns_offload_init(vdev_ctx); + /* + * Update Powersave mode + * 0 - PMO_PS_ADVANCED_POWER_SAVE_DISABLE + * 1 - PMO_PS_ADVANCED_POWER_SAVE_ENABLE + * 2 - PMO_PS_ADVANCED_POWER_SAVE_USER_DEFINED + */ + vdev_ctx->ps_params.opm_mode = psoc_ctx->psoc_cfg.power_save_mode; + vdev_ctx->ps_params.ps_ito = PMO_PS_DATA_INACTIVITY_TIMEOUT; + vdev_ctx->ps_params.spec_wake = PMO_PS_DATA_SPEC_WAKE; out: pmo_exit(); @@ -906,3 +915,15 @@ QDF_STATUS wlan_pmo_get_listen_interval(struct wlan_objmgr_vdev *vdev, { return pmo_core_get_listen_interval(vdev, listen_interval); } + +void wlan_pmo_set_ps_params(struct wlan_objmgr_vdev *vdev, + struct pmo_ps_params *ps_params) +{ + pmo_core_vdev_set_ps_params(vdev, ps_params); +} + +QDF_STATUS wlan_pmo_get_ps_params(struct wlan_objmgr_vdev *vdev, + struct pmo_ps_params *ps_params) +{ + return pmo_core_vdev_get_ps_params(vdev, ps_params); +} diff --git a/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c b/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c index 521ce72e27..14be19872a 100644 --- a/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c +++ b/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c @@ -594,6 +594,19 @@ ucfg_pmo_set_wow_enable(struct wlan_objmgr_psoc *psoc, pmo_psoc_ctx->psoc_cfg.wow_enable = val; } +void +ucfg_pmo_set_ps_params(struct wlan_objmgr_vdev *vdev, + struct pmo_ps_params *ps_params) +{ + pmo_core_vdev_set_ps_params(vdev, ps_params); +} + +QDF_STATUS ucfg_pmo_get_ps_params(struct wlan_objmgr_vdev *vdev, + struct pmo_ps_params *ps_params) +{ + return pmo_core_vdev_get_ps_params(vdev, ps_params); +} + bool ucfg_pmo_is_arp_offload_enabled(struct wlan_objmgr_psoc *psoc) { diff --git a/components/target_if/pmo/src/target_if_pmo_suspend_resume.c b/components/target_if/pmo/src/target_if_pmo_suspend_resume.c index 24f06412f0..a28a668eec 100644 --- a/components/target_if/pmo/src/target_if_pmo_suspend_resume.c +++ b/components/target_if/pmo/src/target_if_pmo_suspend_resume.c @@ -154,7 +154,7 @@ QDF_STATUS target_if_pmo_send_vdev_ps_param_req( */ switch (param_id) { case pmo_sta_ps_enable_advanced_power: - param_id = WMI_STA_PS_ENABLE_QPOWER; + param_id = WMI_STA_PS_ENABLE_OPM; break; case pmo_sta_ps_param_inactivity_time: param_id = WMI_STA_PS_PARAM_INACTIVITY_TIME; diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index 99a6cd9376..37e5c81143 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -54,12 +54,6 @@ struct mac_context; #include "wlan_mlo_mgr_public_structs.h" #endif -/* The ini gDataInactivityTimeout is deprecated. So, definng a new macro - * PS_DATA_INACTIVITY_TIMEOUT with the ini's default value. - */ -#define PS_DATA_INACTIVITY_TIMEOUT (200) -#define PS_DATA_SPEC_WAKE (0) - #define OFFSET_OF(structType, fldName) (&((structType *)0)->fldName) #define WLAN_DOT11_BASIC_RATE_MASK (0x80) #define BITS_ON(_Field, _Bitmask) ((_Field) |= (_Bitmask)) diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index 5741021d69..9bad36b094 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -836,7 +836,6 @@ struct wma_wlm_stats_data { * @vht_supp_mcs: VHT supported MCS * @is_fw_assert: is fw asserted * @ack_work_ctx: Context for deferred processing of TX ACK - * @powersave_mode: power save mode * @pGetRssiReq: get RSSI request * @get_one_peer_info: When a "get peer info" request is active, is * the request for a single peer? @@ -961,7 +960,6 @@ typedef struct { uint32_t vht_supp_mcs; uint8_t is_fw_assert; struct wma_tx_ack_work_ctx *ack_work_ctx; - uint8_t powersave_mode; void *pGetRssiReq; bool get_one_peer_info; struct qdf_mac_addr peer_macaddr; diff --git a/core/wma/inc/wma_api.h b/core/wma/inc/wma_api.h index 9d4c0c17a4..d4cb35e6c1 100644 --- a/core/wma/inc/wma_api.h +++ b/core/wma/inc/wma_api.h @@ -95,6 +95,12 @@ struct wma_caps_per_phy { uint32_t rx_chain_mask_5G; }; +struct wma_ps_params { + enum wmi_sta_ps_scheme_cfg opm_mode; + uint16_t ps_ito; + uint16_t spec_wake; +}; + #define VDEV_CMD 1 #define PDEV_CMD 2 diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index a5ae6167fb..74b797bdab 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -3795,15 +3795,6 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc, goto err_dbglog_init; } - /* - * Update Powersave mode - * 1 - Legacy Powersave + Deepsleep Disabled - * 2 - QPower + Deepsleep Disabled - * 3 - Legacy Powersave + Deepsleep Enabled - * 4 - QPower + Deepsleep Enabled - */ - wma_handle->powersave_mode = - ucfg_pmo_power_save_offload_enabled(wma_handle->psoc); wma_handle->staMaxLIModDtim = cds_cfg->sta_maxlimod_dtim; wma_handle->sta_max_li_mod_dtim_ms = cds_cfg->sta_maxlimod_dtim_ms; wma_handle->staModDtim = ucfg_pmo_get_sta_mod_dtim(wma_handle->psoc); diff --git a/core/wma/src/wma_power.c b/core/wma/src/wma_power.c index 4abcc206ad..c81f6ed2ac 100644 --- a/core/wma/src/wma_power.c +++ b/core/wma/src/wma_power.c @@ -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;