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:

committed by
Rahul Choudhary

parent
6a7f372d75
commit
a9c42d3d8f
@@ -35,6 +35,9 @@
|
|||||||
#include "wlan_pmo_wow_public_struct.h"
|
#include "wlan_pmo_wow_public_struct.h"
|
||||||
#include "wlan_pmo_mc_addr_filtering_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
|
* struct pmo_psoc_priv_obj - psoc related data require for pmo
|
||||||
* @psoc_cfg: place holder for psoc configuration
|
* @psoc_cfg: place holder for psoc configuration
|
||||||
@@ -100,6 +103,7 @@ struct wlan_pmo_ctx {
|
|||||||
* @addr_filter_pattern: addr filter pattern for vdev
|
* @addr_filter_pattern: addr filter pattern for vdev
|
||||||
* @vdev_gtk_req: place holder for gtk request for vdev
|
* @vdev_gtk_req: place holder for gtk request for vdev
|
||||||
* @vdev_gtk_rsp_req: place holder for gtk response 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
|
* @gtk_err_enable: gtk error is enabled or not
|
||||||
* @vdev_bpf_req: place holder for apf/bpf for vdev
|
* @vdev_bpf_req: place holder for apf/bpf for vdev
|
||||||
* @vdev_pkt_filter: place holder for vdev packet filter
|
* @vdev_pkt_filter: place holder for vdev packet filter
|
||||||
@@ -130,6 +134,7 @@ struct pmo_vdev_priv_obj {
|
|||||||
uint8_t addr_filter_pattern;
|
uint8_t addr_filter_pattern;
|
||||||
struct pmo_gtk_req vdev_gtk_req;
|
struct pmo_gtk_req vdev_gtk_req;
|
||||||
struct pmo_gtk_rsp_req vdev_gtk_rsp_req;
|
struct pmo_gtk_rsp_req vdev_gtk_rsp_req;
|
||||||
|
struct pmo_ps_params ps_params;
|
||||||
qdf_atomic_t gtk_err_enable;
|
qdf_atomic_t gtk_err_enable;
|
||||||
bool magic_ptrn_enable;
|
bool magic_ptrn_enable;
|
||||||
bool ptrn_match_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);
|
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
|
#ifdef WLAN_FEATURE_NAN
|
||||||
/**
|
/**
|
||||||
* pmo_set_ndp_wow_bitmask() - set predefined NDP wow wakeup events
|
* pmo_set_ndp_wow_bitmask() - set predefined NDP wow wakeup events
|
||||||
|
@@ -207,7 +207,7 @@ static void pmo_configure_vdev_suspend_params(
|
|||||||
vdev_id);
|
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;
|
wow_inactivity_time = psoc_cfg->wow_data_inactivity_timeout;
|
||||||
/*
|
/*
|
||||||
* To keep ito repeat count same in wow mode as in non wow mode,
|
* 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;
|
return;
|
||||||
ret = pmo_tgt_send_vdev_sta_ps_param(vdev,
|
ret = pmo_tgt_send_vdev_sta_ps_param(vdev,
|
||||||
pmo_sta_ps_param_inactivity_time,
|
pmo_sta_ps_param_inactivity_time,
|
||||||
PS_DATA_INACTIVITY_TIMEOUT);
|
vdev_ctx->ps_params.ps_ito);
|
||||||
if (QDF_IS_STATUS_ERROR(ret)) {
|
if (QDF_IS_STATUS_ERROR(ret)) {
|
||||||
pmo_err("Failed to Set inactivity timeout vdevId %d",
|
pmo_err("Failed to Set inactivity timeout vdevId %d",
|
||||||
vdev_id);
|
vdev_id);
|
||||||
}
|
}
|
||||||
ret = pmo_tgt_send_vdev_sta_ps_param(vdev,
|
ret = pmo_tgt_send_vdev_sta_ps_param(vdev,
|
||||||
pmo_sta_ps_param_spec_wake_interval,
|
pmo_sta_ps_param_spec_wake_interval,
|
||||||
PS_DATA_SPEC_WAKE);
|
vdev_ctx->ps_params.spec_wake);
|
||||||
if (QDF_IS_STATUS_ERROR(ret)) {
|
if (QDF_IS_STATUS_ERROR(ret)) {
|
||||||
pmo_err("Failed to Set wow spec wake interval vdevId %d",
|
pmo_err("Failed to Set wow spec wake interval vdevId %d",
|
||||||
vdev_id);
|
vdev_id);
|
||||||
|
@@ -532,4 +532,17 @@ struct pmo_igmp_offload_req {
|
|||||||
uint32_t num_grp_ip_address;
|
uint32_t num_grp_ip_address;
|
||||||
uint32_t grp_ip_address[MAX_MC_IP_ADDR];
|
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_ */
|
#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,
|
QDF_STATUS wlan_pmo_get_listen_interval(struct wlan_objmgr_vdev *vdev,
|
||||||
uint32_t *listen_interval);
|
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 */
|
#else /* WLAN_POWER_MANAGEMENT_OFFLOAD */
|
||||||
|
|
||||||
static inline QDF_STATUS pmo_init(void)
|
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;
|
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 /* WLAN_POWER_MANAGEMENT_OFFLOAD */
|
||||||
|
|
||||||
#endif /* end of _WLAN_PMO_OBJ_MGMT_API_H_ */
|
#endif /* end of _WLAN_PMO_OBJ_MGMT_API_H_ */
|
||||||
|
@@ -808,6 +808,27 @@ void
|
|||||||
ucfg_pmo_set_wow_enable(struct wlan_objmgr_psoc *psoc,
|
ucfg_pmo_set_wow_enable(struct wlan_objmgr_psoc *psoc,
|
||||||
enum pmo_wow_enable_type val);
|
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
|
* ucfg_pmo_get_gtk_rsp(): API to send gtk response request to fwr
|
||||||
* @vdev: objmgr vdev handle
|
* @vdev: objmgr vdev handle
|
||||||
|
@@ -285,6 +285,15 @@ QDF_STATUS pmo_vdev_object_created_notification(
|
|||||||
vdev_ctx->pmo_psoc_ctx = psoc_ctx;
|
vdev_ctx->pmo_psoc_ctx = psoc_ctx;
|
||||||
qdf_atomic_init(&vdev_ctx->gtk_err_enable);
|
qdf_atomic_init(&vdev_ctx->gtk_err_enable);
|
||||||
pmo_vdev_dynamic_arp_ns_offload_init(vdev_ctx);
|
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:
|
out:
|
||||||
pmo_exit();
|
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);
|
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;
|
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
|
bool
|
||||||
ucfg_pmo_is_arp_offload_enabled(struct wlan_objmgr_psoc *psoc)
|
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) {
|
switch (param_id) {
|
||||||
case pmo_sta_ps_enable_advanced_power:
|
case pmo_sta_ps_enable_advanced_power:
|
||||||
param_id = WMI_STA_PS_ENABLE_QPOWER;
|
param_id = WMI_STA_PS_ENABLE_OPM;
|
||||||
break;
|
break;
|
||||||
case pmo_sta_ps_param_inactivity_time:
|
case pmo_sta_ps_param_inactivity_time:
|
||||||
param_id = WMI_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"
|
#include "wlan_mlo_mgr_public_structs.h"
|
||||||
#endif
|
#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 OFFSET_OF(structType, fldName) (&((structType *)0)->fldName)
|
||||||
#define WLAN_DOT11_BASIC_RATE_MASK (0x80)
|
#define WLAN_DOT11_BASIC_RATE_MASK (0x80)
|
||||||
#define BITS_ON(_Field, _Bitmask) ((_Field) |= (_Bitmask))
|
#define BITS_ON(_Field, _Bitmask) ((_Field) |= (_Bitmask))
|
||||||
|
@@ -836,7 +836,6 @@ struct wma_wlm_stats_data {
|
|||||||
* @vht_supp_mcs: VHT supported MCS
|
* @vht_supp_mcs: VHT supported MCS
|
||||||
* @is_fw_assert: is fw asserted
|
* @is_fw_assert: is fw asserted
|
||||||
* @ack_work_ctx: Context for deferred processing of TX ACK
|
* @ack_work_ctx: Context for deferred processing of TX ACK
|
||||||
* @powersave_mode: power save mode
|
|
||||||
* @pGetRssiReq: get RSSI request
|
* @pGetRssiReq: get RSSI request
|
||||||
* @get_one_peer_info: When a "get peer info" request is active, is
|
* @get_one_peer_info: When a "get peer info" request is active, is
|
||||||
* the request for a single peer?
|
* the request for a single peer?
|
||||||
@@ -961,7 +960,6 @@ typedef struct {
|
|||||||
uint32_t vht_supp_mcs;
|
uint32_t vht_supp_mcs;
|
||||||
uint8_t is_fw_assert;
|
uint8_t is_fw_assert;
|
||||||
struct wma_tx_ack_work_ctx *ack_work_ctx;
|
struct wma_tx_ack_work_ctx *ack_work_ctx;
|
||||||
uint8_t powersave_mode;
|
|
||||||
void *pGetRssiReq;
|
void *pGetRssiReq;
|
||||||
bool get_one_peer_info;
|
bool get_one_peer_info;
|
||||||
struct qdf_mac_addr peer_macaddr;
|
struct qdf_mac_addr peer_macaddr;
|
||||||
|
@@ -95,6 +95,12 @@ struct wma_caps_per_phy {
|
|||||||
uint32_t rx_chain_mask_5G;
|
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 VDEV_CMD 1
|
||||||
#define PDEV_CMD 2
|
#define PDEV_CMD 2
|
||||||
|
@@ -3795,15 +3795,6 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc,
|
|||||||
goto err_dbglog_init;
|
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->staMaxLIModDtim = cds_cfg->sta_maxlimod_dtim;
|
||||||
wma_handle->sta_max_li_mod_dtim_ms = cds_cfg->sta_maxlimod_dtim_ms;
|
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);
|
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
|
* @wma: wma handle
|
||||||
* @vdev_id: vdev id
|
* @vdev_id: vdev id
|
||||||
* @enable: enable/disable
|
* @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
|
* Return: QDF_STATUS_SUCCESS for success or error code
|
||||||
*/
|
*/
|
||||||
static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma,
|
static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma,
|
||||||
uint32_t vdev_id,
|
uint32_t vdev_id,
|
||||||
uint8_t enable,
|
uint8_t enable,
|
||||||
enum powersave_mode power_config,
|
struct wma_ps_params *ps_params,
|
||||||
bool enable_ps)
|
bool enable_ps)
|
||||||
{
|
{
|
||||||
QDF_STATUS ret;
|
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 rx_wake_policy;
|
||||||
uint32_t tx_wake_threshold;
|
uint32_t tx_wake_threshold;
|
||||||
uint32_t pspoll_count;
|
uint32_t pspoll_count;
|
||||||
uint32_t inactivity_time;
|
|
||||||
uint32_t psmode;
|
uint32_t psmode;
|
||||||
struct wlan_objmgr_vdev *vdev;
|
struct wlan_objmgr_vdev *vdev;
|
||||||
u32 listen_interval = 0;
|
u32 listen_interval = 0;
|
||||||
@@ -487,8 +487,6 @@ static QDF_STATUS wma_set_force_sleep(tp_wma_handle wma,
|
|||||||
return QDF_STATUS_E_NOMEM;
|
return QDF_STATUS_E_NOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
inactivity_time = PS_DATA_INACTIVITY_TIMEOUT;
|
|
||||||
|
|
||||||
if (enable) {
|
if (enable) {
|
||||||
/* override normal configuration and force station asleep */
|
/* override normal configuration and force station asleep */
|
||||||
rx_wake_policy = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
|
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
|
* So Disable advanced power save explicitly
|
||||||
*/
|
*/
|
||||||
ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id,
|
ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id,
|
||||||
WMI_STA_PS_ENABLE_QPOWER,
|
WMI_STA_PS_ENABLE_OPM,
|
||||||
power_config);
|
ps_params->opm_mode);
|
||||||
if (QDF_IS_STATUS_ERROR(ret)) {
|
if (QDF_IS_STATUS_ERROR(ret)) {
|
||||||
wma_err("%s(%d) Power Failed vdevId %d",
|
wma_err("%s(%d) Power Failed vdevId %d",
|
||||||
power_config ? "Enable" : "Disable",
|
ps_params->opm_mode ? "Enable" : "Disable",
|
||||||
power_config, vdev_id);
|
ps_params->opm_mode, vdev_id);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
wma_debug("Power %s(%d) vdevId %d",
|
wma_debug("Power %s(%d) vdevId %d",
|
||||||
power_config ? "Enabled" : "Disabled",
|
ps_params->opm_mode ? "Enabled" : "Disabled",
|
||||||
power_config, vdev_id);
|
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 */
|
/* 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,
|
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",
|
wma_debug("Set Ps Poll Count vdevId %d ps poll cnt %d",
|
||||||
vdev_id, pspoll_count);
|
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 */
|
/* Enable Sta Mode Power save */
|
||||||
if (enable_ps) {
|
if (enable_ps) {
|
||||||
ret = wmi_unified_set_sta_ps(wma->wmi_handle, vdev_id, true);
|
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;
|
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)
|
void wma_enable_sta_ps_mode(tpEnablePsParams ps_req)
|
||||||
{
|
{
|
||||||
uint32_t vdev_id = ps_req->sessionid;
|
uint32_t vdev_id = ps_req->sessionid;
|
||||||
QDF_STATUS ret;
|
QDF_STATUS ret;
|
||||||
enum powersave_mode power_config;
|
|
||||||
struct wma_txrx_node *iface;
|
struct wma_txrx_node *iface;
|
||||||
t_wma_handle *wma_handle;
|
t_wma_handle *wma_handle;
|
||||||
|
struct wma_ps_params ps_params = {0};
|
||||||
|
|
||||||
wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
|
wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
|
||||||
if (!wma_handle)
|
if (!wma_handle)
|
||||||
@@ -648,10 +681,13 @@ void wma_enable_sta_ps_mode(tpEnablePsParams ps_req)
|
|||||||
return;
|
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 (eSIR_ADDON_NOTHING == ps_req->psSetting) {
|
||||||
if (power_config && iface->uapsd_cached_val) {
|
if (ps_params.opm_mode && iface->uapsd_cached_val) {
|
||||||
power_config = 0;
|
ps_params.opm_mode = WMI_STA_PS_OPM_CONSERVATIVE;
|
||||||
wma_debug("Advanced power save is disabled");
|
wma_debug("Advanced power save is disabled");
|
||||||
}
|
}
|
||||||
wma_debug("Enable Sta Mode Ps vdevId %d", vdev_id);
|
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,
|
ret = wma_set_force_sleep(wma_handle, vdev_id, false,
|
||||||
power_config, true);
|
&ps_params, true);
|
||||||
if (QDF_IS_STATUS_ERROR(ret)) {
|
if (QDF_IS_STATUS_ERROR(ret)) {
|
||||||
wma_err("Enable Sta Ps Failed vdevId %d", vdev_id);
|
wma_err("Enable Sta Ps Failed vdevId %d", vdev_id);
|
||||||
return;
|
return;
|
||||||
@@ -693,13 +729,13 @@ void wma_enable_sta_ps_mode(tpEnablePsParams ps_req)
|
|||||||
vdev_id, uapsd_val);
|
vdev_id, uapsd_val);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (power_config && iface->uapsd_cached_val) {
|
if (ps_params.opm_mode && iface->uapsd_cached_val) {
|
||||||
power_config = 0;
|
ps_params.opm_mode = WMI_STA_PS_OPM_CONSERVATIVE;
|
||||||
wma_debug("Qpower is disabled");
|
wma_debug("Qpower is disabled");
|
||||||
}
|
}
|
||||||
wma_debug("Enable Forced Sleep vdevId %d", vdev_id);
|
wma_debug("Enable Forced Sleep vdevId %d", vdev_id);
|
||||||
ret = wma_set_force_sleep(wma_handle, vdev_id, true,
|
ret = wma_set_force_sleep(wma_handle, vdev_id, true,
|
||||||
power_config, true);
|
&ps_params, true);
|
||||||
|
|
||||||
if (QDF_IS_STATUS_ERROR(ret)) {
|
if (QDF_IS_STATUS_ERROR(ret)) {
|
||||||
wma_err("Enable Forced Sleep Failed vdevId %d",
|
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;
|
return QDF_STATUS_E_INVAL;
|
||||||
|
|
||||||
wma_info("configuring power: %d", power);
|
wma_info("configuring power: %d", power);
|
||||||
wma->powersave_mode = power;
|
|
||||||
return wma_unified_set_sta_ps_param(wma->wmi_handle,
|
return wma_unified_set_sta_ps_param(wma->wmi_handle,
|
||||||
vdev_id,
|
vdev_id,
|
||||||
WMI_STA_PS_ENABLE_QPOWER,
|
WMI_STA_PS_ENABLE_OPM,
|
||||||
wma_get_power_config(wma));
|
power);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wma_enable_uapsd_mode(tp_wma_handle wma, tpEnableUapsdParams ps_req)
|
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;
|
QDF_STATUS ret;
|
||||||
uint32_t vdev_id = ps_req->sessionid;
|
uint32_t vdev_id = ps_req->sessionid;
|
||||||
uint32_t uapsd_val = 0;
|
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];
|
struct wma_txrx_node *iface = &wma->interfaces[vdev_id];
|
||||||
|
|
||||||
if (!iface->vdev) {
|
if (!iface->vdev) {
|
||||||
@@ -802,6 +837,12 @@ void wma_enable_uapsd_mode(tp_wma_handle wma, tpEnableUapsdParams ps_req)
|
|||||||
return;
|
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 */
|
/* Disable Sta Mode Power save */
|
||||||
ret = wmi_unified_set_sta_ps(wma->wmi_handle, vdev_id, false);
|
ret = wmi_unified_set_sta_ps(wma->wmi_handle, vdev_id, false);
|
||||||
if (QDF_IS_STATUS_ERROR(ret)) {
|
if (QDF_IS_STATUS_ERROR(ret)) {
|
||||||
@@ -819,14 +860,14 @@ void wma_enable_uapsd_mode(tp_wma_handle wma, tpEnableUapsdParams ps_req)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (power_config && uapsd_val) {
|
if (ps_params.opm_mode && uapsd_val) {
|
||||||
power_config = 0;
|
ps_params.opm_mode = 0;
|
||||||
wma_debug("Disable power %d", vdev_id);
|
wma_debug("Disable power %d", vdev_id);
|
||||||
}
|
}
|
||||||
iface->uapsd_cached_val = uapsd_val;
|
iface->uapsd_cached_val = uapsd_val;
|
||||||
wma_debug("Enable Forced Sleep vdevId %d", vdev_id);
|
wma_debug("Enable Forced Sleep vdevId %d", vdev_id);
|
||||||
ret = wma_set_force_sleep(wma, vdev_id, true,
|
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)) {
|
if (QDF_IS_STATUS_ERROR(ret)) {
|
||||||
wma_err("Enable Forced Sleep Failed vdevId %d", vdev_id);
|
wma_err("Enable Forced Sleep Failed vdevId %d", vdev_id);
|
||||||
return;
|
return;
|
||||||
@@ -846,10 +887,22 @@ void wma_disable_uapsd_mode(tp_wma_handle wma,
|
|||||||
{
|
{
|
||||||
QDF_STATUS ret;
|
QDF_STATUS ret;
|
||||||
uint32_t vdev_id = ps_req->sessionid;
|
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);
|
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 */
|
/* Disable Sta Mode Power save */
|
||||||
ret = wmi_unified_set_sta_ps(wma->wmi_handle, vdev_id, false);
|
ret = wmi_unified_set_sta_ps(wma->wmi_handle, vdev_id, false);
|
||||||
if (QDF_IS_STATUS_ERROR(ret)) {
|
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 */
|
/* Re enable Sta Mode Powersave with proper configuration */
|
||||||
ret = wma_set_force_sleep(wma, vdev_id, false,
|
ret = wma_set_force_sleep(wma, vdev_id, false,
|
||||||
power_config, true);
|
&ps_params, true);
|
||||||
if (QDF_IS_STATUS_ERROR(ret)) {
|
if (QDF_IS_STATUS_ERROR(ret)) {
|
||||||
wma_err("Disable Forced Sleep Failed vdevId %d", vdev_id);
|
wma_err("Disable Forced Sleep Failed vdevId %d", vdev_id);
|
||||||
return;
|
return;
|
||||||
|
Reference in New Issue
Block a user