Browse Source

qcacld-3.0: Move OPM parameters to PMO module

Store OPM parameters in PMO per vdev context.

Change-Id: I97b84171db434af0e43246d61416b37849728a6d
CRs-Fixed: 3567042
Vishal Miskin 1 year ago
parent
commit
a9c42d3d8f

+ 5 - 0
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;

+ 42 - 0
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

+ 3 - 3
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);

+ 13 - 0
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_ */

+ 32 - 0
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_ */

+ 21 - 0
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

+ 21 - 0
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);
+}

+ 13 - 0
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)
 {

+ 1 - 1
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;

+ 0 - 6
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))

+ 0 - 2
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;

+ 6 - 0
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

+ 0 - 9
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);

+ 97 - 44
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;