diff --git a/components/mlme/core/inc/wlan_mlme_main.h b/components/mlme/core/inc/wlan_mlme_main.h index fa65d33555e7..f58eb86aa4c5 100644 --- a/components/mlme/core/inc/wlan_mlme_main.h +++ b/components/mlme/core/inc/wlan_mlme_main.h @@ -251,6 +251,7 @@ struct mscs_req_info { * requests from some IOT APs * @ba_2k_jump_iot_ap: This is set to true if connected to the ba 2k jump IOT AP * @bad_htc_he_iot_ap: Set to true if connected to AP who can't decode htc he + * @is_usr_ps_enabled: Is Power save enabled */ struct mlme_legacy_priv { bool chan_switch_in_progress; @@ -289,6 +290,7 @@ struct mlme_legacy_priv { qdf_time_t last_delba_sent_time; bool ba_2k_jump_iot_ap; bool bad_htc_he_iot_ap; + bool is_usr_ps_enabled; }; diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index 0ea9aaf61de4..bfe1a8073b20 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -3175,4 +3175,23 @@ wlan_mlme_set_last_delba_sent_time(struct wlan_objmgr_vdev *vdev, */ qdf_time_t wlan_mlme_get_last_delba_sent_time(struct wlan_objmgr_vdev *vdev); + +/** + * mlme_set_user_ps() - Set the PS user config + * @vdev: Vdev object pointer + * @ps_enable: User PS enable + * + * Return: QDF_STATUS + */ +QDF_STATUS mlme_set_user_ps(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, + bool ps_enable); + +/** + * mlme_get_user_ps() - Set the user ps flag + * @psoc: Pointer to psoc object + * @vdev_id: vdev id + * + * Return: True if user_ps flag is set + */ +bool mlme_get_user_ps(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id); #endif /* _WLAN_MLME_API_H_ */ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h index ffad81d56ebf..99f113f2acd3 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h @@ -4188,6 +4188,34 @@ ucfg_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc, #endif +/** + * ucfg_mlme_set_user_ps() - Set the PS user config + * @psoc: pointer to psoc object + * @vdev_id: Vdev id + * @ps_enable: Flag to indicate if user PS is enabled + * + * Return: QDF_STATUS + */ +static inline +QDF_STATUS ucfg_mlme_set_user_ps(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, + bool ps_enable) +{ + return mlme_set_user_ps(psoc, vdev_id, ps_enable); +} + +/** + * ucfg_mlme_get_user_ps() - Get user PS flag + * @psoc: pointer to psoc object + * @vdev_id: Vdev id + * + * Return: True if user ps is enabled else false + */ +static inline +bool ucfg_mlme_get_user_ps(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id) +{ + return mlme_get_user_ps(psoc, vdev_id); +} + /** * ucfg_mlme_is_sta_mon_conc_supported() - Check if STA + Monitor mode * concurrency is supported diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index 30d066587860..fd112f49cf51 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -4875,3 +4875,48 @@ wlan_mlme_get_last_delba_sent_time(struct wlan_objmgr_vdev *vdev) return mlme_priv->last_delba_sent_time; } + +QDF_STATUS mlme_set_user_ps(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, + bool ps_enable) +{ + struct wlan_objmgr_vdev *vdev; + struct mlme_legacy_priv *mlme_priv; + QDF_STATUS status = QDF_STATUS_E_FAILURE; + + vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, + WLAN_MLME_OBJMGR_ID); + if (!vdev) + return status; + + mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); + if (mlme_priv) { + mlme_priv->is_usr_ps_enabled = ps_enable; + status = QDF_STATUS_SUCCESS; + mlme_legacy_debug("vdev:%d user PS:%d", vdev_id, + mlme_priv->is_usr_ps_enabled); + } + + wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID); + + return status; +} + +bool mlme_get_user_ps(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id) +{ + struct wlan_objmgr_vdev *vdev; + struct mlme_legacy_priv *mlme_priv; + bool usr_ps_enable = false; + + vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, + WLAN_MLME_OBJMGR_ID); + if (!vdev) + return false; + + mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); + if (mlme_priv) + usr_ps_enable = mlme_priv->is_usr_ps_enabled; + + wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID); + + return usr_ps_enable; +} diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c index 27907fe3e8e5..f74dca2dee93 100644 --- a/core/hdd/src/wlan_hdd_power.c +++ b/core/hdd/src/wlan_hdd_power.c @@ -678,16 +678,16 @@ out: */ static void hdd_send_ps_config_to_fw(struct hdd_adapter *adapter) { - struct mac_context *mac_ctx; struct hdd_context *hdd_ctx; + bool usr_ps_cfg; if (hdd_validate_adapter(adapter)) return; hdd_ctx = WLAN_HDD_GET_CTX(adapter); - mac_ctx = MAC_CONTEXT(hdd_ctx->mac_handle); - if (mac_ctx->usr_cfg_ps_enable) + usr_ps_cfg = ucfg_mlme_get_user_ps(hdd_ctx->psoc, adapter->vdev_id); + if (usr_ps_cfg) sme_ps_enable_disable(hdd_ctx->mac_handle, adapter->vdev_id, SME_PS_ENABLE); else @@ -1944,7 +1944,7 @@ int wlan_hdd_set_powersave(struct hdd_adapter *adapter, goto end; } - sme_save_usr_ps_cfg(mac_handle, true); + ucfg_mlme_set_user_ps(hdd_ctx->psoc, adapter->vdev_id, true); ucfg_mlme_is_bmps_enabled(hdd_ctx->psoc, &is_bmps_enabled); if (is_bmps_enabled) { hdd_debug("Wlan driver Entering Power save"); @@ -1972,7 +1972,7 @@ int wlan_hdd_set_powersave(struct hdd_adapter *adapter, } else { hdd_debug("Wlan driver Entering Full Power"); - sme_save_usr_ps_cfg(mac_handle, false); + ucfg_mlme_set_user_ps(hdd_ctx->psoc, adapter->vdev_id, false); /* * Enter Full power command received from GUI * this means we are disconnected diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c index d78261b8bd83..9c2372bf8c80 100644 --- a/core/hdd/src/wlan_hdd_wext.c +++ b/core/hdd/src/wlan_hdd_wext.c @@ -3635,7 +3635,7 @@ static int hdd_we_set_power(struct hdd_adapter *adapter, int value) switch (value) { case 1: /* Enable PowerSave */ - sme_save_usr_ps_cfg(mac_handle, true); + ucfg_mlme_set_user_ps(hdd_ctx->psoc, adapter->vdev_id, true); sme_ps_enable_disable(mac_handle, adapter->vdev_id, SME_PS_ENABLE); return 0; @@ -3643,7 +3643,7 @@ static int hdd_we_set_power(struct hdd_adapter *adapter, int value) /* Disable PowerSave */ sme_ps_enable_disable(mac_handle, adapter->vdev_id, SME_PS_DISABLE); - sme_save_usr_ps_cfg(mac_handle, false); + ucfg_mlme_set_user_ps(hdd_ctx->psoc, adapter->vdev_id, false); return 0; case 3: /* Enable UASPD */ diff --git a/core/mac/inc/ani_global.h b/core/mac/inc/ani_global.h index 38c9b3dc6233..ed0dad085d3e 100644 --- a/core/mac/inc/ani_global.h +++ b/core/mac/inc/ani_global.h @@ -790,7 +790,6 @@ struct mac_context { /* 11k Offload Support */ bool is_11k_offload_supported; uint8_t reject_addba_req; - bool usr_cfg_ps_enable; uint16_t usr_cfg_ba_buff_size; bool is_usr_cfg_amsdu_enabled; uint8_t no_ack_policy_cfg[QCA_WLAN_AC_ALL]; diff --git a/core/sme/inc/sme_power_save_api.h b/core/sme/inc/sme_power_save_api.h index 74513126f8c0..1915f3335371 100644 --- a/core/sme/inc/sme_power_save_api.h +++ b/core/sme/inc/sme_power_save_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2021 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -82,15 +82,5 @@ void sme_auto_ps_entry_timer_expired(void *ps_param); QDF_STATUS sme_ps_close(mac_handle_t mac_handle); QDF_STATUS sme_ps_close_per_session(mac_handle_t mac_handle, uint32_t session_id); - -/** - * sme_save_usr_ps_cfg(): saves user power save config - * @mac_handle: Opaque handle to the global MAC context - * @val: set val - * - * Returns: QDF_STATUS - */ -void sme_save_usr_ps_cfg(mac_handle_t mac_handle, bool val); - #endif /* #if !defined(__SME_POWER_SAVE_API_H) */ diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index e51a5de5f503..8bfe1ffb356d 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -2431,7 +2431,7 @@ sme_process_sta_twt_del_dialog_event( struct wmi_twt_del_dialog_complete_event_param *param) { twt_del_dialog_cb callback; - bool is_evt_allowed; + bool is_evt_allowed, usr_cfg_ps_enable; enum wlan_twt_commands active_cmd = WLAN_TWT_NONE; is_evt_allowed = mlme_twt_is_command_in_progress( @@ -2450,7 +2450,8 @@ sme_process_sta_twt_del_dialog_event( return; } - if (!mac->usr_cfg_ps_enable && + usr_cfg_ps_enable = mlme_get_user_ps(mac->psoc, param->vdev_id); + if (!usr_cfg_ps_enable && param->status == WMI_HOST_DEL_TWT_STATUS_OK) param->status = WMI_HOST_DEL_TWT_STATUS_PS_DISABLE_TEARDOWN; @@ -14965,6 +14966,7 @@ QDF_STATUS sme_add_dialog_cmd(mac_handle_t mac_handle, struct mac_context *mac = MAC_CONTEXT(mac_handle); struct scheduler_msg twt_msg = {0}; bool is_twt_cmd_in_progress, is_twt_notify_in_progress; + bool usr_cfg_ps_enable; QDF_STATUS status; void *wma_handle; struct wmi_twt_add_dialog_param *cmd_params; @@ -14972,7 +14974,8 @@ QDF_STATUS sme_add_dialog_cmd(mac_handle_t mac_handle, SME_ENTER(); - if (!mac->usr_cfg_ps_enable) { + usr_cfg_ps_enable = mlme_get_user_ps(mac->psoc, twt_params->vdev_id); + if (!usr_cfg_ps_enable) { sme_debug("Power save mode disable"); return QDF_STATUS_E_INVAL; } diff --git a/core/sme/src/common/sme_power_save.c b/core/sme/src/common/sme_power_save.c index 403b76d83035..4f07f0dff022 100644 --- a/core/sme/src/common/sme_power_save.c +++ b/core/sme/src/common/sme_power_save.c @@ -333,6 +333,7 @@ QDF_STATUS sme_enable_sta_ps_check(struct mac_context *mac_ctx, uint32_t session_id, enum sme_ps_cmd command) { struct wlan_mlme_powersave *powersave_params; + bool usr_cfg_ps_enable; QDF_BUG(session_id < WLAN_MAX_VDEVS); if (session_id >= WLAN_MAX_VDEVS) @@ -345,8 +346,10 @@ QDF_STATUS sme_enable_sta_ps_check(struct mac_context *mac_ctx, return QDF_STATUS_E_FAILURE; } - if (command == SME_PS_ENABLE && !mac_ctx->usr_cfg_ps_enable) { - sme_debug("Cannot initiate PS. PS is disabled by usr(ioctl)"); + usr_cfg_ps_enable = mlme_get_user_ps(mac_ctx->psoc, session_id); + if (command == SME_PS_ENABLE && !usr_cfg_ps_enable) { + sme_debug("vdev:%d Cannot initiate PS. PS is disabled by usr(ioctl)", + session_id); return QDF_STATUS_E_FAILURE; } @@ -355,7 +358,7 @@ QDF_STATUS sme_enable_sta_ps_check(struct mac_context *mac_ctx, * for connected state as firmware can handle this */ if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) { - sme_debug("STA not infra/connected state Session_id: %d", + sme_debug("vdev:%d STA not infra/connected state", session_id); return QDF_STATUS_E_FAILURE; } @@ -363,14 +366,6 @@ QDF_STATUS sme_enable_sta_ps_check(struct mac_context *mac_ctx, return QDF_STATUS_SUCCESS; } -void sme_save_usr_ps_cfg(mac_handle_t mac_handle, bool val) -{ - struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle); - - mac_ctx->usr_cfg_ps_enable = val; - sme_debug("usr_cfg_ps_enable %d", val); -} - /** * sme_ps_enable_disable(): function to enable/disable PS. * @mac_handle: Opaque handle to the global MAC context @@ -751,8 +746,11 @@ QDF_STATUS sme_ps_enable_auto_ps_timer(mac_handle_t mac_handle, struct ps_params *ps_param = &ps_global_info->ps_params[session_id]; QDF_STATUS qdf_status; QDF_TIMER_STATE cur_state; + bool usr_cfg_ps_enable; - if (!timeout && !mac_ctx->usr_cfg_ps_enable) { + usr_cfg_ps_enable = + mlme_get_user_ps(mac_ctx->psoc, session_id); + if (!timeout && !usr_cfg_ps_enable) { sme_debug("auto_ps_timer called with timeout 0; ignore"); return QDF_STATUS_SUCCESS; } @@ -810,13 +808,12 @@ QDF_STATUS sme_ps_disable_auto_ps_timer(mac_handle_t mac_handle, QDF_STATUS sme_ps_open(mac_handle_t mac_handle) { - uint32_t i; - struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle); - - mac_ctx->usr_cfg_ps_enable = true; + struct mac_context *mac = MAC_CONTEXT(mac_handle); for (i = 0; i < WLAN_MAX_VDEVS; i++) { + mlme_set_user_ps(mac->psoc, i, true); + if (QDF_STATUS_SUCCESS != sme_ps_open_per_session(mac_handle, i)) { sme_err("PMC Init Failed for session: %d", i);