summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKomal Seelam <kseelam@codeaurora.org>2016-09-29 12:39:08 +0530
committerqcabuildsw <qcabuildsw@localhost>2016-10-17 21:58:01 -0700
commit81cb16678fbc0b5943053e0dbbe8623e202f3fca (patch)
tree1d7bebc93243d79443d00741083ccf5f5c1a3ab9
parentaa75f26bff3877c8d4d707b92948e6c4bf021368 (diff)
qcacld-3.0: Disable Runtime PM when dfs channels are used
During DFS scanning FW needs host access. Hence disable Runtime PM to ensure link is active. Change-Id: I307cec1c3e8451758bf2fa44a8dd43f257ab8780 CRs-Fixed: 1072520
-rw-r--r--core/hdd/inc/wlan_hdd_main.h1
-rw-r--r--core/hdd/src/wlan_hdd_hostapd.c31
-rw-r--r--core/hdd/src/wlan_hdd_main.c3
3 files changed, 21 insertions, 14 deletions
diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h
index eccc4de357b3..e6d7cd9ee707 100644
--- a/core/hdd/inc/wlan_hdd_main.h
+++ b/core/hdd/inc/wlan_hdd_main.h
@@ -863,6 +863,7 @@ struct hdd_chan_change_params {
struct hdd_runtime_pm_context {
qdf_runtime_lock_t scan;
qdf_runtime_lock_t roc;
+ qdf_runtime_lock_t dfs;
};
/**
diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c
index bf299934952b..3145b14a65e8 100644
--- a/core/hdd/src/wlan_hdd_hostapd.c
+++ b/core/hdd/src/wlan_hdd_hostapd.c
@@ -149,14 +149,16 @@ static void hdd_hostapd_channel_allow_suspend(hdd_adapter_t *pAdapter,
if (pHostapdState->bssState == BSS_STOP)
return;
+ if (CHANNEL_STATE_DFS != cds_get_channel_state(channel))
+ return;
+
/* Release wakelock when no more DFS channels are used */
- if (CHANNEL_STATE_DFS == cds_get_channel_state(channel)) {
- if (atomic_dec_and_test(&pHddCtx->sap_dfs_ref_cnt)) {
- hdd_err("DFS: allowing suspend (chan %d)",
- channel);
- qdf_wake_lock_release(&pHddCtx->sap_dfs_wakelock,
- WIFI_POWER_EVENT_WAKELOCK_DFS);
- }
+ if (atomic_dec_and_test(&pHddCtx->sap_dfs_ref_cnt)) {
+ hdd_err("DFS: allowing suspend (chan %d)", channel);
+ qdf_wake_lock_release(&pHddCtx->sap_dfs_wakelock,
+ WIFI_POWER_EVENT_WAKELOCK_DFS);
+ qdf_runtime_pm_allow_suspend(pHddCtx->runtime_context.dfs);
+
}
}
@@ -185,14 +187,15 @@ static void hdd_hostapd_channel_prevent_suspend(hdd_adapter_t *pAdapter,
(atomic_read(&pHddCtx->sap_dfs_ref_cnt) >= 1))
return;
+ if (CHANNEL_STATE_DFS != cds_get_channel_state(channel))
+ return;
+
/* Acquire wakelock if we have at least one DFS channel in use */
- if (CHANNEL_STATE_DFS == cds_get_channel_state(channel)) {
- if (atomic_inc_return(&pHddCtx->sap_dfs_ref_cnt) == 1) {
- hdd_err("DFS: preventing suspend (chan %d)",
- channel);
- qdf_wake_lock_acquire(&pHddCtx->sap_dfs_wakelock,
- WIFI_POWER_EVENT_WAKELOCK_DFS);
- }
+ if (atomic_inc_return(&pHddCtx->sap_dfs_ref_cnt) == 1) {
+ hdd_err("DFS: preventing suspend (chan %d)", channel);
+ qdf_runtime_pm_prevent_suspend(pHddCtx->runtime_context.dfs);
+ qdf_wake_lock_acquire(&pHddCtx->sap_dfs_wakelock,
+ WIFI_POWER_EVENT_WAKELOCK_DFS);
}
}
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index a35ea1832bbe..d480dab1f386 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -2464,6 +2464,7 @@ static void hdd_runtime_suspend_context_init(hdd_context_t *hdd_ctx)
ctx->scan = qdf_runtime_lock_init("scan");
ctx->roc = qdf_runtime_lock_init("roc");
+ ctx->dfs = qdf_runtime_lock_init("dfs");
}
/**
@@ -2480,6 +2481,8 @@ static void hdd_runtime_suspend_context_deinit(hdd_context_t *hdd_ctx)
ctx->scan = NULL;
qdf_runtime_lock_deinit(ctx->roc);
ctx->roc = NULL;
+ qdf_runtime_lock_deinit(ctx->dfs);
+ ctx->dfs = NULL;
}
static void hdd_adapter_runtime_suspend_init(hdd_adapter_t *adapter)