summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKomal Seelam <kseelam@codeaurora.org>2016-09-29 12:32:13 +0530
committerqcabuildsw <qcabuildsw@localhost>2016-10-17 21:57:53 -0700
commitaa75f26bff3877c8d4d707b92948e6c4bf021368 (patch)
tree3870cd20f9634ee3ffa692376eaf964ceb03b1e7
parent8634b7772ebb41f07a5d454681c4180ac88430af (diff)
qcacld-3.0: Disable Runtime PM when ROC in progress
During ROC, runtime pm needs to be disabled to allow FW send the packets to host. Change-Id: Ib51321f105b5a57df2d67c0ff1502dc4c051a5da CRs-Fixed: 1072520
-rw-r--r--core/hdd/inc/wlan_hdd_main.h1
-rw-r--r--core/hdd/src/wlan_hdd_main.c3
-rw-r--r--core/hdd/src/wlan_hdd_p2p.c14
3 files changed, 17 insertions, 1 deletions
diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h
index 2f83159d779a..eccc4de357b3 100644
--- a/core/hdd/inc/wlan_hdd_main.h
+++ b/core/hdd/inc/wlan_hdd_main.h
@@ -862,6 +862,7 @@ struct hdd_chan_change_params {
*/
struct hdd_runtime_pm_context {
qdf_runtime_lock_t scan;
+ qdf_runtime_lock_t roc;
};
/**
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index 99ecaa22814c..a35ea1832bbe 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -2463,6 +2463,7 @@ static void hdd_runtime_suspend_context_init(hdd_context_t *hdd_ctx)
struct hdd_runtime_pm_context *ctx = &hdd_ctx->runtime_context;
ctx->scan = qdf_runtime_lock_init("scan");
+ ctx->roc = qdf_runtime_lock_init("roc");
}
/**
@@ -2477,6 +2478,8 @@ static void hdd_runtime_suspend_context_deinit(hdd_context_t *hdd_ctx)
qdf_runtime_lock_deinit(ctx->scan);
ctx->scan = NULL;
+ qdf_runtime_lock_deinit(ctx->roc);
+ ctx->roc = NULL;
}
static void hdd_adapter_runtime_suspend_init(hdd_adapter_t *adapter)
diff --git a/core/hdd/src/wlan_hdd_p2p.c b/core/hdd/src/wlan_hdd_p2p.c
index 1587d02fbb46..967cbc1638d3 100644
--- a/core/hdd/src/wlan_hdd_p2p.c
+++ b/core/hdd/src/wlan_hdd_p2p.c
@@ -193,6 +193,7 @@ QDF_STATUS wlan_hdd_remain_on_channel_callback(tHalHandle hHal, void *pCtx,
* roc requests are immediately processed without being queued
*/
pAdapter->is_roc_inprogress = false;
+ qdf_runtime_pm_allow_suspend(hdd_ctx->runtime_context.roc);
/*
* If the allow suspend is done later, the scheduled roc wil prevent
* the system from going into suspend and immediately this logic
@@ -266,6 +267,7 @@ void wlan_hdd_cancel_existing_remain_on_channel(hdd_adapter_t *pAdapter)
{
hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR(pAdapter);
hdd_remain_on_chan_ctx_t *pRemainChanCtx;
+ hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
unsigned long rc;
mutex_lock(&cfgState->remain_on_chan_ctx_lock);
@@ -340,6 +342,7 @@ void wlan_hdd_cancel_existing_remain_on_channel(hdd_adapter_t *pAdapter)
if (!rc) {
hdd_err("timeout waiting for cancel remain on channel ready indication");
}
+ qdf_runtime_pm_allow_suspend(hdd_ctx->runtime_context.roc);
hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_ROC);
} else
mutex_unlock(&cfgState->remain_on_chan_ctx_lock);
@@ -468,6 +471,7 @@ static void wlan_hdd_remain_on_chan_timeout(void *data)
hdd_adapter_t *pAdapter = (hdd_adapter_t *) data;
hdd_remain_on_chan_ctx_t *pRemainChanCtx;
hdd_cfg80211_state_t *cfgState;
+ hdd_context_t *hdd_ctx;
if ((NULL == pAdapter) ||
(WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic)) {
@@ -475,6 +479,7 @@ static void wlan_hdd_remain_on_chan_timeout(void *data)
return;
}
+ hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
cfgState = WLAN_HDD_GET_CFG_STATE_PTR(pAdapter);
mutex_lock(&cfgState->remain_on_chan_ctx_lock);
pRemainChanCtx = cfgState->remain_on_chan_ctx;
@@ -510,8 +515,8 @@ static void wlan_hdd_remain_on_chan_timeout(void *data)
pRemainChanCtx->scan_id);
}
+ qdf_runtime_pm_allow_suspend(hdd_ctx->runtime_context.roc);
hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_ROC);
-
}
static int wlan_hdd_execute_remain_on_channel(hdd_adapter_t *pAdapter,
@@ -571,6 +576,7 @@ static int wlan_hdd_execute_remain_on_channel(hdd_adapter_t *pAdapter,
duration = P2P_ROC_DURATION_MULTIPLIER_GO_ABSENT * duration;
hdd_prevent_suspend(WIFI_POWER_EVENT_WAKELOCK_ROC);
+ qdf_runtime_pm_prevent_suspend(pHddCtx->runtime_context.roc);
INIT_COMPLETION(pAdapter->rem_on_chan_ready_event);
/* call sme API to start remain on channel. */
@@ -598,6 +604,8 @@ static int wlan_hdd_execute_remain_on_channel(hdd_adapter_t *pAdapter,
qdf_mc_timer_destroy(
&pRemainChanCtx->hdd_remain_on_chan_timer);
qdf_mem_free(pRemainChanCtx);
+ qdf_runtime_pm_allow_suspend(pHddCtx->runtime_context.
+ roc);
hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_ROC);
return -EINVAL;
}
@@ -629,6 +637,8 @@ static int wlan_hdd_execute_remain_on_channel(hdd_adapter_t *pAdapter,
qdf_mc_timer_destroy(
&pRemainChanCtx->hdd_remain_on_chan_timer);
qdf_mem_free(pRemainChanCtx);
+ qdf_runtime_pm_allow_suspend(pHddCtx->runtime_context.
+ roc);
hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_ROC);
return -EINVAL;
}
@@ -641,6 +651,8 @@ static int wlan_hdd_execute_remain_on_channel(hdd_adapter_t *pAdapter,
wlansap_cancel_remain_on_channel(
WLAN_HDD_GET_SAP_CTX_PTR(pAdapter),
pRemainChanCtx->scan_id);
+ qdf_runtime_pm_allow_suspend(pHddCtx->runtime_context.
+ roc);
hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_ROC);
return -EINVAL;
}