From 4b7c8e03c752da78f5b933308f225742620d3cc7 Mon Sep 17 00:00:00 2001 From: Nachiket Kukade Date: Fri, 1 Jun 2018 22:53:06 +0530 Subject: [PATCH] qcacld-3.0: Port modulated dtim and override listen interval Port modulated dtim and override listen interval to PMO from WMA. Change-Id: Id965dd8ee0fbddfa563335fd2fe225dcd20cd162 CRs-Fixed: 2252788 --- components/pmo/core/inc/wlan_pmo_priv.h | 8 +- .../pmo/core/inc/wlan_pmo_suspend_resume.h | 43 +-- .../pmo/core/src/wlan_pmo_suspend_resume.c | 184 +++++++++- .../inc/wlan_pmo_common_public_struct.h | 2 + .../pmo/dispatcher/inc/wlan_pmo_ucfg_api.h | 55 ++- .../pmo/dispatcher/src/wlan_pmo_ucfg_api.c | 17 +- core/hdd/src/wlan_hdd_cfg80211.c | 12 +- core/sme/inc/sme_api.h | 6 - core/sme/src/common/sme_api.c | 114 ------- core/wma/inc/wma.h | 4 - core/wma/inc/wma_internal.h | 4 - core/wma/src/wma_main.c | 126 +------ core/wma/src/wma_power.c | 319 ------------------ 13 files changed, 259 insertions(+), 635 deletions(-) diff --git a/components/pmo/core/inc/wlan_pmo_priv.h b/components/pmo/core/inc/wlan_pmo_priv.h index 2cd3c3674be2..fbf65d78541d 100644 --- a/components/pmo/core/inc/wlan_pmo_priv.h +++ b/components/pmo/core/inc/wlan_pmo_priv.h @@ -109,8 +109,10 @@ struct wlan_pmo_ctx { * @p2plo_in_progress: true when p2plo_in_progress in progress else false * @dtim_period: dtim period for vdev * @beacon_interval: vdev beacon interval - * @alt_modulated_dtim_enabled:dynamic modulated dtim enabled + * @dyn_modulated_dtim: dynamically configured modulated dtim value + * @dyn_modulated_dtim_enabled: if dynamically modulated dtim is set or not * @dtim_policy: tells vdev beacon dtim policy + * @dyn_listen_interval: dynamically user configured listen interval * @pmo_vdev_lock: spin lock for pmo vdev priv ctx */ struct pmo_vdev_priv_obj { @@ -131,8 +133,10 @@ struct pmo_vdev_priv_obj { bool p2plo_in_progress; uint8_t dtim_period; uint8_t beacon_interval; - bool alt_modulated_dtim_enable; + uint32_t dyn_modulated_dtim; + bool dyn_modulated_dtim_enabled; uint32_t dtim_policy; + uint32_t dyn_listen_interval; qdf_spinlock_t pmo_vdev_lock; }; diff --git a/components/pmo/core/inc/wlan_pmo_suspend_resume.h b/components/pmo/core/inc/wlan_pmo_suspend_resume.h index f70a0285db78..bc9b78869e2c 100644 --- a/components/pmo/core/inc/wlan_pmo_suspend_resume.h +++ b/components/pmo/core/inc/wlan_pmo_suspend_resume.h @@ -140,25 +140,6 @@ QDF_STATUS pmo_core_psoc_suspend_target(struct wlan_objmgr_psoc *psoc, QDF_STATUS pmo_core_psoc_bus_resume_req(struct wlan_objmgr_psoc *psoc, enum qdf_suspend_type type); -/** - * pmo_core_update_alt_modulated_dtim_enable() - update alt modulatate dtim - * @vdev: objmgr vdev handle - * @value: true when alt modulated dtim enable else false - * - * Return: None - */ -static inline -void pmo_core_update_alt_modulated_dtim_enable(struct wlan_objmgr_vdev *vdev, - bool value) -{ - 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->alt_modulated_dtim_enable = value; - qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); -} - /** * pmo_core_vdev_set_dtim_policy() - Set vdev beacon dtim policy * @vdev: objmgr vdev handle @@ -388,6 +369,30 @@ void pmo_core_psoc_target_suspend_acknowledge(void *context, bool wow_nack); */ void pmo_core_psoc_wakeup_host_event_received(struct wlan_objmgr_psoc *psoc); +/** + * pmo_core_config_listen_interval() - function to dynamically configure + * listen interval + * @vdev: objmgr vdev + * @listen_interval: new listen interval passed by user + * + * This function allows user to configure listen interval dynamically + * + * Return: QDF_STATUS + */ +QDF_STATUS pmo_core_config_listen_interval(struct wlan_objmgr_vdev *vdev, + uint32_t listen_interval); + +/** + * pmo_core_config_modulated_dtim() - function to configure modulated dtim + * @vdev: objmgr vdev handle + * @mod_dtim: New modulated dtim value passed by user + * + * This function configures the modulated dtim in firmware + * + * Return: QDF_STATUS + */ +QDF_STATUS pmo_core_config_modulated_dtim(struct wlan_objmgr_vdev *vdev, + uint32_t mod_dtim); #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */ #endif /* end of _WLAN_PMO_SUSPEND_RESUME_H_ */ diff --git a/components/pmo/core/src/wlan_pmo_suspend_resume.c b/components/pmo/core/src/wlan_pmo_suspend_resume.c index 2214774ad6cd..c1d5127fae4d 100644 --- a/components/pmo/core/src/wlan_pmo_suspend_resume.c +++ b/components/pmo/core/src/wlan_pmo_suspend_resume.c @@ -214,6 +214,26 @@ static void pmo_core_set_vdev_suspend_dtim(struct wlan_objmgr_psoc *psoc, } } +/* + * pmo_is_listen_interval_user_set() - Check if listen interval is configured + * by user or not + * @vdev_ctx: PMO vdev private object + * + * Return: true if listen interval is user configured else false + */ +static inline +bool pmo_is_listen_interval_user_set(struct pmo_vdev_priv_obj *vdev_ctx) +{ + bool retval; + + qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); + retval = vdev_ctx->dyn_modulated_dtim_enabled + || vdev_ctx->dyn_listen_interval; + qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + + return retval; +} + /** * pmo_core_set_suspend_dtim() - set suspend dtim * @psoc: objmgr psoc handle @@ -225,9 +245,17 @@ static void pmo_core_set_suspend_dtim(struct wlan_objmgr_psoc *psoc) uint8_t vdev_id; struct wlan_objmgr_vdev *vdev; struct pmo_vdev_priv_obj *vdev_ctx; - bool alt_mdtim_enabled; + struct pmo_psoc_priv_obj *psoc_ctx; + bool li_offload_support = false; QDF_STATUS status; + pmo_psoc_with_ctx(psoc, psoc_ctx) { + li_offload_support = psoc_ctx->caps.li_offload; + } + + if (li_offload_support) + pmo_debug("listen interval offload support is enabled"); + /* Iterate through VDEV list */ for (vdev_id = 0; vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS; vdev_id++) { vdev = pmo_psoc_get_vdev(psoc, vdev_id); @@ -239,11 +267,8 @@ static void pmo_core_set_suspend_dtim(struct wlan_objmgr_psoc *psoc) continue; vdev_ctx = pmo_vdev_get_priv(vdev); - qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); - alt_mdtim_enabled = vdev_ctx->alt_modulated_dtim_enable; - qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); - - if (!alt_mdtim_enabled) + if (!pmo_is_listen_interval_user_set(vdev_ctx) + && !li_offload_support) pmo_core_set_vdev_suspend_dtim(psoc, vdev, vdev_ctx); pmo_vdev_put_ref(vdev); @@ -482,9 +507,17 @@ static void pmo_core_set_resume_dtim(struct wlan_objmgr_psoc *psoc) uint8_t vdev_id; struct wlan_objmgr_vdev *vdev; struct pmo_vdev_priv_obj *vdev_ctx; - bool alt_mdtim_enabled; + struct pmo_psoc_priv_obj *psoc_ctx; + bool li_offload_support = false; QDF_STATUS status; + pmo_psoc_with_ctx(psoc, psoc_ctx) { + li_offload_support = psoc_ctx->caps.li_offload; + } + + if (li_offload_support) + pmo_debug("listen interval offload support is enabled"); + /* Iterate through VDEV list */ for (vdev_id = 0; vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS; vdev_id++) { vdev = pmo_psoc_get_vdev(psoc, vdev_id); @@ -496,13 +529,9 @@ static void pmo_core_set_resume_dtim(struct wlan_objmgr_psoc *psoc) continue; vdev_ctx = pmo_vdev_get_priv(vdev); - qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); - alt_mdtim_enabled = vdev_ctx->alt_modulated_dtim_enable; - qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); - - if (!alt_mdtim_enabled) + if (!pmo_is_listen_interval_user_set(vdev_ctx) + && !li_offload_support) pmo_core_set_vdev_resume_dtim(psoc, vdev, vdev_ctx); - pmo_vdev_put_ref(vdev); } } @@ -1270,3 +1299,132 @@ out: pmo_exit(); } +QDF_STATUS pmo_core_config_listen_interval(struct wlan_objmgr_vdev *vdev, + uint32_t new_li) +{ + uint32_t listen_interval; + QDF_STATUS status; + struct pmo_vdev_priv_obj *vdev_ctx; + struct pmo_psoc_priv_obj *psoc_ctx; + uint8_t vdev_id; + + pmo_enter(); + + status = pmo_vdev_get_ref(vdev); + if (QDF_IS_STATUS_ERROR(status)) + goto out; + + vdev_ctx = pmo_vdev_get_priv(vdev); + vdev_id = pmo_vdev_get_id(vdev); + + qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); + if (vdev_ctx->dyn_listen_interval == new_li) { + qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + status = QDF_STATUS_SUCCESS; + pmo_debug("Listen Interval(%d) already set for vdev id %d", + new_li, vdev_id); + goto dec_ref; + } + + vdev_ctx->dyn_listen_interval = new_li; + qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + + listen_interval = new_li ? new_li : PMO_DEFAULT_LISTEN_INTERVAL; + + if (!new_li) { + /* Configure default LI as we do on resume */ + pmo_psoc_with_ctx(pmo_vdev_get_psoc(vdev), psoc_ctx) { + if (psoc_ctx->get_cfg_int && + (QDF_STATUS_SUCCESS != psoc_ctx->get_cfg_int( + PMO_CFG_LISTEN_INTERVAL, + &listen_interval))) { + pmo_err("Failed to get listen interval"); + } + } + } + + pmo_debug("Set Listen Interval %d for vdevId %d", listen_interval, + vdev_id); + status = pmo_tgt_vdev_update_param_req(vdev, + pmo_vdev_param_listen_interval, + listen_interval); + if (QDF_IS_STATUS_ERROR(status)) { + /* even it fails continue fwr will take default LI */ + pmo_err("Failed to Set Listen Interval"); + } + + /* Set it to Normal DTIM */ + status = pmo_tgt_vdev_update_param_req(vdev, + pmo_vdev_param_dtim_policy, + pmo_normal_dtim); + if (QDF_IS_STATUS_ERROR(status)) { + pmo_err("Failed to set Normal DTIM for vdev id %d", vdev_id); + } else { + pmo_debug("Set DTIM Policy to Normal for vdev id %d", vdev_id); + pmo_core_vdev_set_dtim_policy(vdev, pmo_normal_dtim); + } + +dec_ref: + pmo_vdev_put_ref(vdev); +out: + pmo_exit(); + + return status; +} + +QDF_STATUS pmo_core_config_modulated_dtim(struct wlan_objmgr_vdev *vdev, + uint32_t mod_dtim) +{ + struct pmo_vdev_priv_obj *vdev_ctx; + bool prev_dtim_enabled; + uint32_t listen_interval; + QDF_STATUS status; + uint8_t vdev_id; + + pmo_enter(); + + status = pmo_vdev_get_ref(vdev); + if (status != QDF_STATUS_SUCCESS) + goto out; + + vdev_id = pmo_vdev_get_id(vdev); + vdev_ctx = pmo_vdev_get_priv(vdev); + + qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); + vdev_ctx->dyn_modulated_dtim = mod_dtim; + prev_dtim_enabled = vdev_ctx->dyn_modulated_dtim_enabled; + vdev_ctx->dyn_modulated_dtim_enabled = mod_dtim != 1; + listen_interval = vdev_ctx->dyn_modulated_dtim * + pmo_core_get_vdev_dtim_period(vdev); + qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + + if (prev_dtim_enabled || mod_dtim != 1) { + status = pmo_tgt_vdev_update_param_req(vdev, + pmo_vdev_param_listen_interval, + listen_interval); + if (QDF_IS_STATUS_ERROR(status)) + /* even it fails continue fwr will take default LI */ + pmo_err("Failed to set Listen Interval for vdev id %d", + vdev_id); + else + pmo_debug("Set Listen Interval %d for vdev id %d", + listen_interval, vdev_id); + + status = pmo_tgt_vdev_update_param_req(vdev, + pmo_vdev_param_dtim_policy, + pmo_normal_dtim); + if (QDF_IS_STATUS_ERROR(status)) { + pmo_err("Failed to set Normal DTIM for vdev id %d", + vdev_id); + } else { + pmo_debug("Set DTIM Policy to Normal for vdev id %d", + vdev_id); + pmo_core_vdev_set_dtim_policy(vdev, pmo_normal_dtim); + } + } + + pmo_vdev_put_ref(vdev); +out: + pmo_exit(); + return status; +} 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 d6cc392870a5..97904910e5a2 100644 --- a/components/pmo/dispatcher/inc/wlan_pmo_common_public_struct.h +++ b/components/pmo/dispatcher/inc/wlan_pmo_common_public_struct.h @@ -322,12 +322,14 @@ struct pmo_psoc_cfg { * @unified_wow: Firmware supports "interface pause" flag in WoW command. * This allows both D0-WoW (bus up) and Non-D0-WoW (bus down) to use one * unified command + * @li_offload: Firmware has listen interval offload support */ struct pmo_device_caps { bool apf; bool arp_ns_offload; bool packet_filter; bool unified_wow; + bool li_offload; }; #endif /* end of _WLAN_PMO_COMMONP_STRUCT_H_ */ diff --git a/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h b/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h index 6c52c4ac3a6e..8d5ed65b890a 100644 --- a/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h +++ b/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h @@ -425,16 +425,6 @@ QDF_STATUS pmo_ucfg_lphb_config_req(struct wlan_objmgr_psoc *psoc, struct pmo_lphb_req *lphb_req, void *lphb_cb_ctx, pmo_lphb_callback callback); -/** - * pmo_ucfg_update_alt_modulated_dtim_enable() - update alt modulatate dtim - * @vdev: objmgr vdev handle - * @value: true for alt_modulated_dtim enable else false - * - * Return: QDF status - */ -void pmo_ucfg_update_alt_modulated_dtim_enable(struct wlan_objmgr_vdev *vdev, - bool value); - /** * pmo_ucfg_psoc_update_power_save_mode() - update power save mode * @vdev: objmgr vdev handle @@ -619,6 +609,30 @@ void pmo_ucfg_psoc_target_suspend_acknowledge(void *context, bool wow_nack); * Return: None */ void pmo_ucfg_psoc_wakeup_host_event_received(struct wlan_objmgr_psoc *psoc); + +/** + * pmo_ucfg_config_listen_interval() - function to configure listen interval + * @vdev: objmgr vdev + * @listen_interval: new listen interval passed by user + * + * This function allows user to configure listen interval dynamically + * + * Return: QDF_STATUS + */ +QDF_STATUS pmo_ucfg_config_listen_interval(struct wlan_objmgr_vdev *vdev, + uint32_t listen_interval); + +/** + * pmo_ucfg_config_modulated_dtim() - function to configure modulated dtim + * @vdev: objmgr vdev handle + * @param_value: New modulated dtim value passed by user + * + * This function configures the modulated dtim in firmware + * + * Return: QDF_STATUS + */ +QDF_STATUS pmo_ucfg_config_modulated_dtim(struct wlan_objmgr_vdev *vdev, + uint32_t mod_dtim); #else static inline uint32_t ucfg_pmo_get_apf_instruction_size(struct wlan_objmgr_psoc *psoc) @@ -866,13 +880,6 @@ pmo_ucfg_lphb_config_req( return QDF_STATUS_SUCCESS; } -static inline void -pmo_ucfg_update_alt_modulated_dtim_enable( - struct wlan_objmgr_vdev *vdev, - bool value) -{ -} - static inline void pmo_ucfg_psoc_update_power_save_mode( struct wlan_objmgr_psoc *psoc, @@ -1046,6 +1053,20 @@ pmo_ucfg_enhanced_mc_filter_disable(struct wlan_objmgr_vdev *vdev) { return QDF_STATUS_SUCCESS; } + +static inline QDF_STATUS +pmo_ucfg_config_listen_interval(struct wlan_objmgr_vdev *vdev, + uint32_t listen_interval) +{ + return QDF_STATUS_SUCCESS; +} + +static inline QDF_STATUS +pmo_ucfg_config_modulated_dtim(struct wlan_objmgr_vdev *vdev, + uint32_t mod_dtim) +{ + return QDF_STATUS_SUCCESS; +} #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */ #endif /* end of _WLAN_PMO_UCFG_API_H_ */ diff --git a/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c b/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c index 36fdb3a860c2..a5e00646ab63 100644 --- a/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c +++ b/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c @@ -255,12 +255,6 @@ QDF_STATUS pmo_ucfg_lphb_config_req(struct wlan_objmgr_psoc *psoc, return pmo_core_lphb_config_req(psoc, lphb_req, lphb_cb_ctx, callback); } -void pmo_ucfg_update_alt_modulated_dtim_enable(struct wlan_objmgr_vdev *vdev, - bool value) -{ - pmo_core_update_alt_modulated_dtim_enable(vdev, value); -} - void pmo_ucfg_psoc_update_power_save_mode(struct wlan_objmgr_psoc *psoc, uint8_t value) { @@ -389,4 +383,15 @@ QDF_STATUS pmo_ucfg_disable_hw_filter_in_fwr(struct wlan_objmgr_vdev *vdev) return pmo_core_disable_hw_filter_in_fwr(vdev); } +QDF_STATUS pmo_ucfg_config_listen_interval(struct wlan_objmgr_vdev *vdev, + uint32_t listen_interval) +{ + return pmo_core_config_listen_interval(vdev, listen_interval); +} + +QDF_STATUS pmo_ucfg_config_modulated_dtim(struct wlan_objmgr_vdev *vdev, + uint32_t mod_dtim) +{ + return pmo_core_config_modulated_dtim(vdev, mod_dtim); +} diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 1ed31610529a..94a7a45caf8c 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -6707,10 +6707,8 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy, modulated_dtim = nla_get_u32( tb[QCA_WLAN_VENDOR_ATTR_CONFIG_MODULATED_DTIM]); - status = sme_configure_modulated_dtim(hdd_ctx->hHal, - adapter->session_id, - modulated_dtim); - + status = pmo_ucfg_config_modulated_dtim(adapter->hdd_vdev, + modulated_dtim); if (QDF_STATUS_SUCCESS != status) ret_val = -EPERM; } @@ -6719,10 +6717,8 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy, override_li = nla_get_u32( tb[QCA_WLAN_VENDOR_ATTR_CONFIG_LISTEN_INTERVAL]); - status = sme_override_listen_interval(hdd_ctx->hHal, - adapter->session_id, - override_li); - + status = pmo_ucfg_config_listen_interval(adapter->hdd_vdev, + override_li); if (status != QDF_STATUS_SUCCESS) ret_val = -EPERM; } diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index 771daba12e02..02783954921b 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -1033,12 +1033,6 @@ QDF_STATUS sme_set_miracast(tHalHandle hal, uint8_t filter_type); QDF_STATUS sme_ext_change_channel(tHalHandle hHal, uint32_t channel, uint8_t session_id); -QDF_STATUS sme_configure_modulated_dtim(tHalHandle hal, uint8_t session_id, - uint32_t modulated_dtim); - -QDF_STATUS sme_override_listen_interval(tHalHandle h_hal, uint8_t session_id, - uint32_t override_li); - QDF_STATUS sme_configure_stats_avg_factor(tHalHandle hal, uint8_t session_id, uint16_t stats_avg_factor); diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index d5096a0a082f..b78a6f94a7dd 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -12530,120 +12530,6 @@ QDF_STATUS sme_configure_guard_time(tHalHandle hal, uint8_t session_id, return status; } -/** - * sme_configure_modulated_dtim() - function to configure modulated dtim - * @h_hal: SME API to enable/disable modulated DTIM instantaneously - * @session_id: session ID - * @modulated_dtim: modulated dtim value - * - * This function configures the modulated dtim in firmware - * - * Return: QDF_STATUS - */ -QDF_STATUS sme_configure_modulated_dtim(tHalHandle h_hal, uint8_t session_id, - uint32_t modulated_dtim) -{ - struct scheduler_msg msg = {0}; - QDF_STATUS status = QDF_STATUS_SUCCESS; - tpAniSirGlobal mac = PMAC_STRUCT(h_hal); - wma_cli_set_cmd_t *iwcmd; - - iwcmd = qdf_mem_malloc(sizeof(*iwcmd)); - if (NULL == iwcmd) { - QDF_TRACE(QDF_MODULE_ID_SME, - QDF_TRACE_LEVEL_FATAL, - "%s: qdf_mem_malloc failed", __func__); - return QDF_STATUS_E_NOMEM; - } - - status = sme_acquire_global_lock(&mac->sme); - - if (QDF_STATUS_SUCCESS == status) { - - iwcmd->param_value = modulated_dtim; - iwcmd->param_vdev_id = session_id; - iwcmd->param_id = GEN_PARAM_MODULATED_DTIM; - iwcmd->param_vp_dev = GEN_CMD; - msg.type = WMA_CLI_SET_CMD; - msg.reserved = 0; - msg.bodyptr = (void *)iwcmd; - - if (!QDF_IS_STATUS_SUCCESS( - scheduler_post_msg(QDF_MODULE_ID_WMA, &msg))) { - QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, - "%s: Not able to post GEN_PARAM_DYNAMIC_DTIM to WMA!", - __func__); - qdf_mem_free(iwcmd); - status = QDF_STATUS_E_FAILURE; - } - sme_release_global_lock(&mac->sme); - } else { - QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, - "%s: sme_acquire_global_lock error!", - __func__); - qdf_mem_free(iwcmd); - } - - return status; -} - -/** - * sme_override_listen_interval() - function to override static LI - * @h_hal: SME API to override listen interval - * @session_id: session ID - * @override_li: new LI value passed by user - * - * This function override (enable/disable) static a.k.a ini based LI - * - * Return: QDF_STATUS - */ -QDF_STATUS sme_override_listen_interval(tHalHandle h_hal, uint8_t session_id, - uint32_t override_li) -{ - struct scheduler_msg msg = {0}; - QDF_STATUS status = QDF_STATUS_SUCCESS; - tpAniSirGlobal mac = PMAC_STRUCT(h_hal); - wma_cli_set_cmd_t *iwcmd; - - iwcmd = qdf_mem_malloc(sizeof(*iwcmd)); - if (!iwcmd) { - QDF_TRACE(QDF_MODULE_ID_SME, - QDF_TRACE_LEVEL_FATAL, - "%s: qdf_mem_malloc failed", __func__); - return QDF_STATUS_E_NOMEM; - } - - status = sme_acquire_global_lock(&mac->sme); - - if (status == QDF_STATUS_SUCCESS) { - - iwcmd->param_value = override_li; - iwcmd->param_vdev_id = session_id; - iwcmd->param_id = GEN_PARAM_LISTEN_INTERVAL; - iwcmd->param_vp_dev = GEN_CMD; - msg.type = WMA_CLI_SET_CMD; - msg.reserved = 0; - msg.bodyptr = (void *)iwcmd; - - if (!QDF_IS_STATUS_SUCCESS( - scheduler_post_msg(QDF_MODULE_ID_WMA, &msg))) { - QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, - "%s: Can't post GEN_PARAM_LISTEN_INTERVAL", - __func__); - qdf_mem_free(iwcmd); - status = QDF_STATUS_E_FAILURE; - } - sme_release_global_lock(&mac->sme); - } else { - QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, - "%s: sme_acquire_global_lock error!", - __func__); - qdf_mem_free(iwcmd); - } - - return status; -} - /* * sme_wifi_start_logger() - Send the start/stop logging command to WMA * to either start/stop logging diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index f2d2c4d26b50..3f042ec37397 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -1020,7 +1020,6 @@ struct roam_synch_frame_ind { * @plink_status_req: link status request * @psnr_req: snr request * @delay_before_vdev_stop: delay - * @override_li: dynamically user configured listen interval * @tx_streams: number of tx streams can be used by the vdev * @rx_streams: number of rx streams can be used by the vdev * @chain_mask: chain mask can be used by the vdev @@ -1096,9 +1095,6 @@ struct wma_txrx_node { #ifdef FEATURE_WLAN_EXTSCAN bool extscan_in_progress; #endif - uint32_t alt_modulated_dtim; - bool alt_modulated_dtim_enabled; - uint32_t override_li; uint32_t tx_streams; uint32_t rx_streams; uint32_t chain_mask; diff --git a/core/wma/inc/wma_internal.h b/core/wma/inc/wma_internal.h index 15ece44d5498..5351a13ea610 100644 --- a/core/wma/inc/wma_internal.h +++ b/core/wma/inc/wma_internal.h @@ -698,10 +698,6 @@ QDF_STATUS wma_notify_modem_power_state(void *wma_ptr, QDF_STATUS wma_set_smps_params(tp_wma_handle wma, uint8_t vdev_id, int value); -void wma_set_suspend_dtim(tp_wma_handle wma); - -void wma_set_resume_dtim(tp_wma_handle wma); - /* * wma_data.c functions declarations */ diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 027dfdfac9b9..af37e12ed15f 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -946,123 +946,6 @@ static void wma_set_dtim_period(tp_wma_handle wma, iface->dtimPeriod = dtim_params->dtim_period; } -/** - * wma_set_modulated_dtim() - function to configure modulated dtim - * @wma: wma handle - * @privcmd: structure containing parameters - * - * This function configures the modulated dtim in firmware - * - * Return: none - */ -static void wma_set_modulated_dtim(tp_wma_handle wma, - wma_cli_set_cmd_t *privcmd) -{ - uint8_t vdev_id = privcmd->param_vdev_id; - struct wma_txrx_node *iface = - &wma->interfaces[vdev_id]; - bool prev_dtim_enabled; - uint32_t listen_interval; - QDF_STATUS ret; - - iface->alt_modulated_dtim = privcmd->param_value; - - prev_dtim_enabled = iface->alt_modulated_dtim_enabled; - - if (1 != privcmd->param_value) - iface->alt_modulated_dtim_enabled = true; - else - iface->alt_modulated_dtim_enabled = false; - - if ((true == iface->alt_modulated_dtim_enabled) || - (true == prev_dtim_enabled)) { - - listen_interval = iface->alt_modulated_dtim - * iface->dtimPeriod; - - ret = wma_vdev_set_param(wma->wmi_handle, - privcmd->param_vdev_id, - WMI_VDEV_PARAM_LISTEN_INTERVAL, - listen_interval); - if (QDF_IS_STATUS_ERROR(ret)) - /* Even if it fails, continue */ - WMA_LOGW("Failed to set listen interval %d", - listen_interval); - - ret = wma_vdev_set_param(wma->wmi_handle, - privcmd->param_vdev_id, - WMI_VDEV_PARAM_DTIM_POLICY, - NORMAL_DTIM); - if (QDF_IS_STATUS_ERROR(ret)) - WMA_LOGE("Failed to Set to Normal DTIM policy"); - } -} - -/** - * wma_override_listen_interval() - function to override static/ini based LI - * @wma: wma handle - * @privcmd: structure containing parameters - * - * This function override static/ini based LI in firmware - * - * Return: none - */ -static void wma_override_listen_interval(tp_wma_handle wma, - wma_cli_set_cmd_t *privcmd) -{ - uint8_t vdev_id = privcmd->param_vdev_id; - struct wma_txrx_node *iface = - &wma->interfaces[vdev_id]; - u32 old_override_li, new_override_li, listen_interval; - struct sAniSirGlobal *mac; - QDF_STATUS ret; - - mac = cds_get_context(QDF_MODULE_ID_PE); - if (!mac) { - WMA_LOGE(FL("Failed to get mac context")); - return; - } - - old_override_li = iface->override_li; - new_override_li = privcmd->param_value; - iface->override_li = new_override_li; - - if (new_override_li && - (new_override_li != old_override_li)) { - listen_interval = new_override_li; - } else if (!new_override_li && - (new_override_li != old_override_li)) { - /* Configure default LI as we do on resume */ - ret = wlan_cfg_get_int(mac, WNI_CFG_LISTEN_INTERVAL, - &listen_interval); - if (ret != QDF_STATUS_SUCCESS) { - QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR, - "Failed to get value for listen interval"); - listen_interval = POWERSAVE_DEFAULT_LISTEN_INTERVAL; - } - } else { - return; - } - - ret = wma_vdev_set_param(wma->wmi_handle, vdev_id, - WMI_VDEV_PARAM_LISTEN_INTERVAL, - listen_interval); - if (QDF_IS_STATUS_ERROR(ret)) { - /* Even it fails continue Fw will take default LI */ - WMA_LOGE("Failed to Set Listen Interval vdevId %d", - vdev_id); - } - WMA_LOGD("%s: Set Listen Interval vdevId %d Listen Intv %d", - __func__, vdev_id, listen_interval); - ret = wma_vdev_set_param(wma->wmi_handle, - privcmd->param_vdev_id, - WMI_VDEV_PARAM_DTIM_POLICY, - NORMAL_DTIM); - if (QDF_IS_STATUS_ERROR(ret)) - WMA_LOGE("Failed to Set to Normal DTIM policy"); - -} - /** * wma_process_cli_set_cmd() - set parameters to fw @@ -1214,12 +1097,6 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma, case GEN_PARAM_RESET_TSF_GPIO: ret = wma_reset_tsf_gpio(wma, privcmd->param_value); break; - case GEN_PARAM_MODULATED_DTIM: - wma_set_modulated_dtim(wma, privcmd); - break; - case GEN_PARAM_LISTEN_INTERVAL: - wma_override_listen_interval(wma, privcmd); - break; default: WMA_LOGE("Invalid param id 0x%x", privcmd->param_id); @@ -5654,6 +5531,9 @@ static void wma_set_pmo_caps(struct wlan_objmgr_psoc *psoc) wma_is_service_enabled(wmi_service_packet_filter_offload); caps.unified_wow = wma_is_service_enabled(wmi_service_unified_wow_capability); + caps.li_offload = + wma_is_service_enabled( + wmi_service_listen_interval_offload_support); status = ucfg_pmo_psoc_set_caps(psoc, &caps); if (QDF_IS_STATUS_ERROR(status)) diff --git a/core/wma/src/wma_power.c b/core/wma/src/wma_power.c index e2f7fd323383..35e3abef808e 100644 --- a/core/wma/src/wma_power.c +++ b/core/wma/src/wma_power.c @@ -1690,325 +1690,6 @@ QDF_STATUS wma_set_smps_params(tp_wma_handle wma, uint8_t vdev_id, return ret; } -/** - * wma_configure_vdev_suspend_params() - set suspend related parameters in fw - * @wma: wma handle - * @vdev_id: vdev id - * - * Return: none - */ -static void wma_configure_vdev_suspend_params(tp_wma_handle wma, - uint8_t vdev_id) -{ - uint32_t cfg_data_val = 0; - struct wma_txrx_node *iface = &wma->interfaces[vdev_id]; - struct sAniSirGlobal *mac; - QDF_STATUS ret; - uint8_t ito_repeat_count_value = 0; - uint32_t inactivity_time; - - if (iface->type != WMI_VDEV_TYPE_STA) - return; - - mac = cds_get_context(QDF_MODULE_ID_PE); - if (!mac) { - WMA_LOGE(FL("Failed to get mac context")); - return; - } - - if (wlan_cfg_get_int(mac, - WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT, - &cfg_data_val) != QDF_STATUS_SUCCESS) { - QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR, - "Can't get WNI_CFG_PS_WOW_DATA_INACTIVITY_TO"); - cfg_data_val = WOW_POWERSAVE_DEFAULT_INACTIVITY_TIME; - } - - WMA_LOGD("%s: Set inactivity_time for wow: %d", __func__, - cfg_data_val); - ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id, - WMI_STA_PS_PARAM_INACTIVITY_TIME, cfg_data_val); - if (ret) - WMA_LOGE("%s: Setting InActivity time Failed.", - __func__); - - if (wlan_cfg_get_int(mac, WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT, - &inactivity_time) != QDF_STATUS_SUCCESS) { - QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR, - "Failed to get WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT"); - inactivity_time = POWERSAVE_DEFAULT_INACTIVITY_TIME; - } - - /* - * To keep ito repeat count same in wow mode as in non wow mode, - * modulating ito repeat count value. - */ - ito_repeat_count_value = (inactivity_time / cfg_data_val) * - wma->ito_repeat_count; - - if (ito_repeat_count_value) { - ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id, - WMI_STA_PS_PARAM_MAX_RESET_ITO_COUNT_ON_TIM_NO_TXRX, - ito_repeat_count_value); - WMA_LOGD("%s: Setting ito_repeat_count_value %d.", __func__, - ito_repeat_count_value); - - if (ret) - WMA_LOGE("%s: Setting ITO count failed.", __func__); - } - -} - -/** - * wma_set_vdev_suspend_dtim() - set suspend dtim parameters in fw - * @wma: wma handle - * @vdev_id: vdev id - * - * Return: none - */ -static void wma_set_vdev_suspend_dtim(tp_wma_handle wma, uint8_t vdev_id) -{ - struct wma_txrx_node *iface = &wma->interfaces[vdev_id]; - uint32_t cfg_data_val = 0; - - if ((iface->type == WMI_VDEV_TYPE_STA) && - (iface->dtimPeriod != 0)) { - QDF_STATUS ret; - uint32_t listen_interval; - uint32_t max_mod_dtim; - uint32_t beacon_interval_mod; - - /* get mac to access CFG data base */ - struct sAniSirGlobal *mac = cds_get_context(QDF_MODULE_ID_PE); - - if (!mac) { - WMA_LOGE(FL("Failed to get mac context")); - return; - } - - if (wma->staDynamicDtim) { - listen_interval = wma->staDynamicDtim; - } else if ((wma->staModDtim) && - (wma->staMaxLIModDtim)) { - /* - * When the system is in suspend - * (maximum beacon will be at 1s == 10) - * If maxModulatedDTIM ((MAX_LI_VAL = 10) / AP_DTIM) - * equal or larger than MDTIM - * (configured in WCNSS_qcom_cfg.ini) - * Set LI to MDTIM * AP_DTIM - * If Dtim = 2 and Mdtim = 2 then LI is 4 - * Else - * Set LI to maxModulatedDTIM * AP_DTIM - */ - - beacon_interval_mod = iface->beaconInterval / 100; - if (beacon_interval_mod == 0) - beacon_interval_mod = 1; - - max_mod_dtim = wma->staMaxLIModDtim - / (iface->dtimPeriod*beacon_interval_mod); - - if (max_mod_dtim <= 0) - max_mod_dtim = 1; - - if (max_mod_dtim >= wma->staModDtim) { - listen_interval = - (wma->staModDtim * iface->dtimPeriod); - } else { - listen_interval = - (max_mod_dtim * iface->dtimPeriod); - } - } else { - /* Set Listen Interval */ - if ((wlan_cfg_get_int(mac, WNI_CFG_LISTEN_INTERVAL, - &cfg_data_val) != QDF_STATUS_SUCCESS)) { - QDF_TRACE(QDF_MODULE_ID_WMA, - QDF_TRACE_LEVEL_ERROR, - "Failed to listen interval"); - cfg_data_val = - POWERSAVE_DEFAULT_LISTEN_INTERVAL; - } - listen_interval = cfg_data_val; - } - ret = wma_vdev_set_param(wma->wmi_handle, vdev_id, - WMI_VDEV_PARAM_LISTEN_INTERVAL, - listen_interval); - if (QDF_IS_STATUS_ERROR(ret)) { - /* Even it fails continue Fw will take default LI */ - WMA_LOGE("Failed to Set Listen Interval vdevId %d", - vdev_id); - } - - WMA_LOGD("%s: Set Listen Interval vdevId %d Listen Intv %d", - __func__, vdev_id, listen_interval); - - iface->restore_dtim_setting = true; - } -} - -/* - * wma_is_user_set_li_params() - Check LI related params are set by user or not - * @iface: wma vdev handle - * - * Return: 1 if true else 0 - */ -static inline uint8_t wma_is_user_set_li_params(struct wma_txrx_node *iface) -{ - return iface->alt_modulated_dtim_enabled || iface->override_li ? 1 : 0; -} - -/** - * wma_set_suspend_dtim() - set suspend dtim - * @wma: wma handle - * - * Return: none - */ -void wma_set_suspend_dtim(tp_wma_handle wma) -{ - uint8_t i; - bool li_offload_support = false; - - if (NULL == wma) { - WMA_LOGE("%s: wma is NULL", __func__); - return; - } - if (WMI_SERVICE_EXT_IS_ENABLED(wma->wmi_service_bitmap, - wma->wmi_service_ext_bitmap, - WMI_SERVICE_LISTEN_INTERVAL_OFFLOAD_SUPPORT)) { - WMA_LOGD("%s: listen interval support is enabled", __func__); - li_offload_support = true; - } - - for (i = 0; i < wma->max_bssid; i++) { - if (wma->interfaces[i].handle) { - if (!wma_is_user_set_li_params(&wma->interfaces[i]) && - !li_offload_support) - wma_set_vdev_suspend_dtim(wma, i); - wma_configure_vdev_suspend_params(wma, i); - } - } -} - -/** - * wma_configure_vdev_resume_params() - set resume related parameters in fw - * @wma: wma handle - * @vdev_id: vdev id - * - * Return: none - */ -static void wma_configure_vdev_resume_params(tp_wma_handle wma, uint8_t vdev_id) -{ - struct wma_txrx_node *iface = &wma->interfaces[vdev_id]; - u_int32_t cfg_data_val; - struct sAniSirGlobal *mac; - QDF_STATUS ret; - - if (iface->type != WMI_VDEV_TYPE_STA) - return; - - mac = cds_get_context(QDF_MODULE_ID_PE); - if (!mac) { - WMA_LOGE(FL("Failed to get mac context")); - return; - } - - if (wlan_cfg_get_int(mac, WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT, - &cfg_data_val) != QDF_STATUS_SUCCESS) { - QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR, - "Failed to get WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT"); - cfg_data_val = POWERSAVE_DEFAULT_INACTIVITY_TIME; - } - - WMA_LOGD("%s: Setting InActivity time %d.", __func__, cfg_data_val); - ret = wma_unified_set_sta_ps_param(wma->wmi_handle, vdev_id, - WMI_STA_PS_PARAM_INACTIVITY_TIME, - cfg_data_val); - if (ret) - WMA_LOGE("%s: Setting InActivity time Failed.", - __func__); - -} - -/** - * wma_set_vdev_resume_dtim() - set resume dtim parameters in fw - * @wma: wma handle - * @vdev_id: vdev id - * - * Return: none - */ -static void wma_set_vdev_resume_dtim(tp_wma_handle wma, uint8_t vdev_id) -{ - struct wma_txrx_node *iface = &wma->interfaces[vdev_id]; - - if ((iface->type == WMI_VDEV_TYPE_STA) && - (iface->restore_dtim_setting)) { - QDF_STATUS ret; - uint32_t cfg_data_val = 0; - /* get mac to access CFG data base */ - struct sAniSirGlobal *mac = cds_get_context(QDF_MODULE_ID_PE); - - if (!mac) { - WMA_LOGE(FL("Failed to get mac context")); - return; - } - /* Set Listen Interval */ - if ((wlan_cfg_get_int(mac, WNI_CFG_LISTEN_INTERVAL, - &cfg_data_val) != QDF_STATUS_SUCCESS)) { - QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR, - "Failed to get value for listen interval"); - cfg_data_val = POWERSAVE_DEFAULT_LISTEN_INTERVAL; - } - - ret = wma_vdev_set_param(wma->wmi_handle, vdev_id, - WMI_VDEV_PARAM_LISTEN_INTERVAL, - cfg_data_val); - if (QDF_IS_STATUS_ERROR(ret)) { - /* Even it fails continue Fw will take default LI */ - WMA_LOGE("Failed to Set Listen Interval vdevId %d", - vdev_id); - } - - WMA_LOGD("%s: Set Listen Interval vdevId %d Listen Intv %d", - __func__, vdev_id, cfg_data_val); - - iface->restore_dtim_setting = false; - - } -} - -/** - * wma_set_resume_dtim() - set resume dtim - * @wma: wma handle - * - * Return: none - */ -void wma_set_resume_dtim(tp_wma_handle wma) -{ - uint8_t i; - bool li_offload_support = false; - - if (NULL == wma) { - WMA_LOGE("%s: wma is NULL", __func__); - return; - } - if (WMI_SERVICE_EXT_IS_ENABLED(wma->wmi_service_bitmap, - wma->wmi_service_ext_bitmap, - WMI_SERVICE_LISTEN_INTERVAL_OFFLOAD_SUPPORT)) { - WMA_LOGD("%s: listen interval support is enabled", __func__); - li_offload_support = true; - } - - for (i = 0; i < wma->max_bssid; i++) { - if (wma->interfaces[i].handle) { - if (!wma_is_user_set_li_params(&wma->interfaces[i]) && - !li_offload_support) - wma_set_vdev_resume_dtim(wma, i); - wma_configure_vdev_resume_params(wma, i); - } - } -} - /** * wma_set_tx_power_scale() - set tx power scale * @vdev_id: vdev id