qcacld-3.0: Move OPM parameters to PMO module
Store OPM parameters in PMO per vdev context. Change-Id: I97b84171db434af0e43246d61416b37849728a6d CRs-Fixed: 3567042
This commit is contained in:

committad av
Rahul Choudhary

förälder
6a7f372d75
incheckning
a9c42d3d8f
@@ -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;
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
@@ -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_ */
|
||||
|
@@ -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_ */
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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;
|
||||
|
@@ -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))
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
Referens i nytt ärende
Block a user