diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c index b0bfc50947820..d9dedc55d018a 100644 --- a/core/hdd/src/wlan_hdd_power.c +++ b/core/hdd/src/wlan_hdd_power.c @@ -1509,8 +1509,6 @@ int wlan_hdd_set_powersave(struct hdd_adapter *adapter, if (allow_power_save && adapter->device_mode == QDF_STA_MODE && !adapter->session.station.ap_supports_immediate_power_save) { - /* override user's requested flag */ - allow_power_save = false; timeout = AUTO_PS_DEFER_TIMEOUT_MS; hdd_debug("Defer power-save due to AP spec non-conformance"); } @@ -1531,8 +1529,13 @@ int wlan_hdd_set_powersave(struct hdd_adapter *adapter, * Enter Power Save command received from GUI * this means DHCP is completed */ - sme_ps_enable_disable(hal, adapter->session_id, - SME_PS_ENABLE); + if (timeout) + sme_ps_enable_auto_ps_timer(hal, + adapter->session_id, + timeout); + else + sme_ps_enable_disable(hal, adapter->session_id, + SME_PS_ENABLE); } else { hdd_debug("Power Save is not enabled in the cfg"); } @@ -1546,8 +1549,6 @@ int wlan_hdd_set_powersave(struct hdd_adapter *adapter, sme_ps_disable_auto_ps_timer(WLAN_HDD_GET_HAL_CTX(adapter), adapter->session_id); sme_ps_enable_disable(hal, adapter->session_id, SME_PS_DISABLE); - sme_ps_enable_auto_ps_timer(WLAN_HDD_GET_HAL_CTX(adapter), - adapter->session_id, timeout); } return 0; @@ -1969,9 +1970,9 @@ static int __wlan_hdd_cfg80211_set_power_mgmt(struct wiphy *wiphy, ENTER(); if (timeout < 0) { - hdd_debug("User space timeout: %d; Using default instead: %d", - timeout, AUTO_PS_ENTRY_USER_TIMER_DEFAULT_VALUE); - timeout = AUTO_PS_ENTRY_USER_TIMER_DEFAULT_VALUE; + hdd_debug("User space timeout: %d; Enter full power or power save", + timeout); + timeout = 0; } if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) { diff --git a/core/hdd/src/wlan_hdd_tx_rx.c b/core/hdd/src/wlan_hdd_tx_rx.c index d4ccb9983cc1a..1cb6eeb35f3e6 100644 --- a/core/hdd/src/wlan_hdd_tx_rx.c +++ b/core/hdd/src/wlan_hdd_tx_rx.c @@ -453,6 +453,9 @@ wlan_hdd_latency_opt(struct hdd_adapter *adapter, struct sk_buff *skb) QDF_NBUF_CB_PACKET_TYPE_ICMP) { wlan_hdd_set_powersave(adapter, false, hdd_ctx->config->icmp_disable_ps_val); + sme_ps_enable_auto_ps_timer(WLAN_HDD_GET_HAL_CTX(adapter), + adapter->session_id, + hdd_ctx->config->icmp_disable_ps_val); } } #else diff --git a/core/sme/inc/sme_power_save_api.h b/core/sme/inc/sme_power_save_api.h index 733d32c4d112c..e34f8edcd5ee0 100644 --- a/core/sme/inc/sme_power_save_api.h +++ b/core/sme/inc/sme_power_save_api.h @@ -42,7 +42,8 @@ QDF_STATUS sme_ps_uapsd_enable(tHalHandle hal_ctx, uint32_t session_id); QDF_STATUS sme_ps_uapsd_disable(tHalHandle hal_ctx, uint32_t session_id); /* Condition check if driver is ready to enter in PS */ -QDF_STATUS sme_enable_sta_ps_check(tpAniSirGlobal mac_ctx, uint32_t session_id); +QDF_STATUS sme_enable_sta_ps_check(tpAniSirGlobal mac_ctx, uint32_t session_id, + enum sme_ps_cmd command); QDF_STATUS sme_ps_process_command(tpAniSirGlobal mac_ctx, uint32_t session_id, diff --git a/core/sme/src/common/sme_power_save.c b/core/sme/src/common/sme_power_save.c index 34293e06cdd5a..2416e609bfddc 100644 --- a/core/sme/src/common/sme_power_save.c +++ b/core/sme/src/common/sme_power_save.c @@ -481,6 +481,7 @@ QDF_STATUS sme_ps_process_command(tpAniSirGlobal mac_ctx, uint32_t session_id, * sme_enable_sta_ps_check(): Checks if it is ok to enable power save or not. * @mac_ctx: global mac context * @session_id: session id + * @command: power save cmd of type enum sme_ps_cmd * *Pre Condition for enabling sta mode power save *1) Sta Mode Ps should be enabled in ini file. @@ -488,7 +489,8 @@ QDF_STATUS sme_ps_process_command(tpAniSirGlobal mac_ctx, uint32_t session_id, * * Return: QDF_STATUS */ -QDF_STATUS sme_enable_sta_ps_check(tpAniSirGlobal mac_ctx, uint32_t session_id) +QDF_STATUS sme_enable_sta_ps_check(tpAniSirGlobal mac_ctx, uint32_t session_id, + enum sme_ps_cmd command) { struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info; @@ -498,10 +500,14 @@ QDF_STATUS sme_enable_sta_ps_check(tpAniSirGlobal mac_ctx, uint32_t session_id) return QDF_STATUS_E_FAILURE; } - /* Check whether the given session is Infra and in Connected State */ - if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) { + /* Check whether the given session is Infra and in Connected State + * also if command is power save disable there is not need to check + * for connected state as firmware can handle this + */ + if ((command != SME_PS_DISABLE) && + !csr_is_conn_state_connected_infra(mac_ctx, session_id)) { sme_debug("STA not infra/connected state Session_id: %d", - session_id); + session_id); return QDF_STATUS_E_FAILURE; } return QDF_STATUS_SUCCESS; @@ -522,7 +528,7 @@ QDF_STATUS sme_ps_enable_disable(tHalHandle hal_ctx, uint32_t session_id, QDF_STATUS status = QDF_STATUS_E_FAILURE; tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx); - status = sme_enable_sta_ps_check(mac_ctx, session_id); + status = sme_enable_sta_ps_check(mac_ctx, session_id, command); if (status != QDF_STATUS_SUCCESS) return status; status = sme_ps_process_command(mac_ctx, session_id, command); @@ -539,7 +545,7 @@ QDF_STATUS sme_ps_timer_flush_sync(tHalHandle hal, uint8_t session_id) struct sEnablePsParams *req; t_wma_handle *wma; - status = sme_enable_sta_ps_check(mac_ctx, session_id); + status = sme_enable_sta_ps_check(mac_ctx, session_id, SME_PS_ENABLE); if (QDF_IS_STATUS_ERROR(status)) { sme_debug("Power save not allowed for vdev id %d", session_id); return QDF_STATUS_SUCCESS; @@ -599,7 +605,8 @@ QDF_STATUS sme_ps_uapsd_enable(tHalHandle hal_ctx, uint32_t session_id) QDF_STATUS status = QDF_STATUS_E_FAILURE; tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx); - status = sme_enable_sta_ps_check(mac_ctx, session_id); + status = sme_enable_sta_ps_check(mac_ctx, session_id, + SME_PS_UAPSD_ENABLE); if (status != QDF_STATUS_SUCCESS) return status; status = sme_ps_process_command(mac_ctx, session_id, @@ -623,7 +630,8 @@ QDF_STATUS sme_ps_uapsd_disable(tHalHandle hal_ctx, uint32_t session_id) QDF_STATUS status = QDF_STATUS_E_FAILURE; tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx); - status = sme_enable_sta_ps_check(mac_ctx, session_id); + status = sme_enable_sta_ps_check(mac_ctx, session_id, + SME_PS_UAPSD_DISABLE); if (status != QDF_STATUS_SUCCESS) return status; status = sme_ps_process_command(mac_ctx, session_id, @@ -982,7 +990,7 @@ void sme_auto_ps_entry_timer_expired(void *data) session_id = ps_params->session_id; sme_debug("auto_ps_timer expired, enabling powersave"); - status = sme_enable_sta_ps_check(mac_ctx, session_id); + status = sme_enable_sta_ps_check(mac_ctx, session_id, SME_PS_ENABLE); if (QDF_STATUS_SUCCESS == status) sme_ps_enable_disable((tHalHandle)mac_ctx, session_id, SME_PS_ENABLE);