From a89be8d2b52c5037b6c543ae3840d34bde5e3b78 Mon Sep 17 00:00:00 2001 From: Komal Seelam Date: Thu, 29 Sep 2016 11:09:26 +0530 Subject: [PATCH] qcacld-3.0: Prevent Runtime PM when connection in progress Add logic to prevent runtime pm when connect and DHCP in progress. CRs-Fixed: 1072520 Change-Id: I3f44bb32aabe2d119c4bf3888f49891b44fc2c7b --- core/hdd/inc/wlan_hdd_main.h | 12 ++++++- core/hdd/src/wlan_hdd_cfg80211.c | 4 +++ core/hdd/src/wlan_hdd_main.c | 28 +++++++++++++++ core/hdd/src/wlan_hdd_power.c | 58 ++++++++++++++++++++++++-------- 4 files changed, 87 insertions(+), 15 deletions(-) diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index 41e16d0da753..b524f5385c16 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -854,8 +854,17 @@ struct hdd_chan_change_params { struct ch_params_s chan_params; }; -#define WLAN_HDD_ADAPTER_MAGIC 0x574c414e /* ASCII "WLAN" */ +/** + * struct hdd_connect_pm_context - Runtime PM connect context per adapter + * @connect: Runtime Connect Context + * + * Structure to hold runtime pm connect context for each adapter. + */ +struct hdd_connect_pm_context { + qdf_runtime_lock_t connect; +}; +#define WLAN_HDD_ADAPTER_MAGIC 0x574c414e /* ASCII "WLAN" */ struct hdd_adapter_s { /* Magic cookie for adapter sanity verification. Note that this @@ -1086,6 +1095,7 @@ struct hdd_adapter_s { * channel needs to be moved from the existing 2.4GHz channel. */ uint8_t pre_cac_chan; + struct hdd_connect_pm_context connect_rpm_ctx; }; #define WLAN_HDD_GET_STATION_CTX_PTR(pAdapter) (&(pAdapter)->sessionCtx.station) diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 115f69680fb6..c01fee7bc818 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -11436,6 +11436,8 @@ static int wlan_hdd_cfg80211_connect_start(hdd_adapter_t *pAdapter, hdd_conn_set_connection_state(pAdapter, eConnectionState_Connecting); + qdf_runtime_pm_prevent_suspend(pAdapter->connect_rpm_ctx. + connect); status = sme_roam_connect(WLAN_HDD_GET_HAL_CTX(pAdapter), pAdapter->sessionId, pRoamProfile, &roamId); @@ -11449,6 +11451,8 @@ static int wlan_hdd_cfg80211_connect_start(hdd_adapter_t *pAdapter, /* change back to NotAssociated */ hdd_conn_set_connection_state(pAdapter, eConnectionState_NotConnected); + qdf_runtime_pm_allow_suspend(pAdapter->connect_rpm_ctx. + connect); } pRoamProfile->ChannelInfo.ChannelList = NULL; diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index ff90a7d4d70f..a287ac4f3fcf 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -2451,6 +2451,25 @@ void hdd_set_station_ops(struct net_device *pWlanDev) pWlanDev->netdev_ops = &wlan_drv_ops; } +#ifdef FEATURE_RUNTIME_PM +static void hdd_adapter_runtime_suspend_init(hdd_adapter_t *adapter) +{ + struct hdd_connect_pm_context *ctx = &adapter->connect_rpm_ctx; + + ctx->connect = qdf_runtime_lock_init("connect"); +} + +static void hdd_adapter_runtime_suspend_denit(hdd_adapter_t *adapter) +{ + struct hdd_connect_pm_context *ctx = &adapter->connect_rpm_ctx; + + qdf_runtime_lock_deinit(ctx->connect); + ctx->connect = NULL; +} +#else /* FEATURE_RUNTIME_PM */ +static inline void hdd_adapter_runtime_suspend_init(hdd_adapter_t *adapter) {} +static inline void hdd_adapter_runtime_suspend_denit(hdd_adapter_t *adapter) {} +#endif /* FEATURE_RUNTIME_PM */ /** * hdd_alloc_station_adapter() - allocate the station hdd adapter * @hdd_ctx: global hdd context @@ -2542,6 +2561,7 @@ static hdd_adapter_t *hdd_alloc_station_adapter(hdd_context_t *hdd_ctx, /* set pWlanDev's parent to underlying device */ SET_NETDEV_DEV(pWlanDev, hdd_ctx->parent_dev); hdd_wmm_init(adapter); + hdd_adapter_runtime_suspend_init(adapter); spin_lock_init(&adapter->pause_map_lock); adapter->start_time = adapter->last_time = qdf_system_ticks(); } @@ -2916,6 +2936,8 @@ static void hdd_cleanup_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter, adapter->scan_info.default_scan_ies = NULL; } + hdd_adapter_runtime_suspend_denit(adapter); + /* * The adapter is marked as closed. When hdd_wlan_exit() call returns, * the driver is almost closed and cannot handle either control @@ -3943,9 +3965,12 @@ void hdd_connect_result(struct net_device *dev, const u8 *bssid, roam_info->u.pConnectedProfile->SSID.ssId, roam_info->u.pConnectedProfile->SSID.length); } + hdd_connect_bss(dev, bssid, bss, req_ie, req_ie_len, resp_ie, resp_ie_len, status, gfp, connect_timeout); + + qdf_runtime_pm_allow_suspend(padapter->connect_rpm_ctx.connect); } #else void hdd_connect_result(struct net_device *dev, const u8 *bssid, @@ -3954,8 +3979,11 @@ void hdd_connect_result(struct net_device *dev, const u8 *bssid, size_t resp_ie_len, u16 status, gfp_t gfp, bool connect_timeout) { + hdd_adapter_t *padapter = (hdd_adapter_t *) netdev_priv(dev); + cfg80211_connect_result(dev, bssid, req_ie, req_ie_len, resp_ie, resp_ie_len, status, gfp); + qdf_runtime_pm_allow_suspend(padapter->connect_rpm_ctx.connect); } #endif diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c index 2e625006e12c..207fbe78554c 100644 --- a/core/hdd/src/wlan_hdd_power.c +++ b/core/hdd/src/wlan_hdd_power.c @@ -2051,6 +2051,48 @@ int wlan_hdd_cfg80211_suspend_wlan(struct wiphy *wiphy, return ret; } +/** + * hdd_stop_dhcp_ind() - API to stop DHCP sequence + * @adapter: Adapter on which DHCP needs to be stopped + * + * Release the wakelock held for DHCP process and allow + * the runtime pm to continue + * + * Return: None + */ +static void hdd_stop_dhcp_ind(hdd_adapter_t *adapter) +{ + hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter); + + hdd_warn("DHCP stop indicated through power save"); + sme_dhcp_stop_ind(hdd_ctx->hHal, adapter->device_mode, + adapter->macAddressCurrent.bytes, + adapter->sessionId); + hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_DHCP); + qdf_runtime_pm_allow_suspend(adapter->connect_rpm_ctx.connect); +} + +/** + * hdd_start_dhcp_ind() - API to start DHCP sequence + * @adapter: Adapter on which DHCP needs to be stopped + * + * Prevent APPS suspend and the runtime suspend during + * DHCP sequence + * + * Return: None + */ +static void hdd_start_dhcp_ind(hdd_adapter_t *adapter) +{ + hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter); + + hdd_err("DHCP start indicated through power save"); + qdf_runtime_pm_prevent_suspend(adapter->connect_rpm_ctx.connect); + hdd_prevent_suspend_timeout(1000, WIFI_POWER_EVENT_WAKELOCK_DHCP); + sme_dhcp_start_ind(hdd_ctx->hHal, adapter->device_mode, + adapter->macAddressCurrent.bytes, + adapter->sessionId); +} + /** * __wlan_hdd_cfg80211_set_power_mgmt() - set cfg80211 power management config * @wiphy: Pointer to wiphy @@ -2117,20 +2159,8 @@ static int __wlan_hdd_cfg80211_set_power_mgmt(struct wiphy *wiphy, status = wlan_hdd_set_powersave(pAdapter, allow_power_save, timeout); - if (allow_power_save) { - hdd_warn("DHCP stop indicated through power save"); - sme_dhcp_stop_ind(pHddCtx->hHal, pAdapter->device_mode, - pAdapter->macAddressCurrent.bytes, - pAdapter->sessionId); - hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_DHCP); - } else { - hdd_err("DHCP start indicated through power save"); - hdd_prevent_suspend_timeout(1000, - WIFI_POWER_EVENT_WAKELOCK_DHCP); - sme_dhcp_start_ind(pHddCtx->hHal, pAdapter->device_mode, - pAdapter->macAddressCurrent.bytes, - pAdapter->sessionId); - } + allow_power_save ? hdd_stop_dhcp_ind(pAdapter) : + hdd_start_dhcp_ind(pAdapter); EXIT(); return status;