summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMukul Sharma <mukul@qti.qualcomm.com>2016-03-30 14:57:55 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-04-05 12:56:37 +0530
commit2727c2ac0233b8cf0fac9c79cfb5d1fc835eb2b4 (patch)
tree3a0a32bb7f312cd9cc5c5e20e947262bd0cf2313
parentd7b8b37e22998595c1364b44a83bf40a4e59a8ec (diff)
qcacld-2.0: Check wakelock is initialized before destroying it
During wlan exit, host destroy multiple wake-locks. Consider a case where startup task stuck in some blocking call (like request_fwr bin ) which leads to timeout in insmod thread. In insmod thread on timeout, Host trigger wlan_exit for cleanup. In this scenario, host try to destroy wake-lock which is not initialized yet. As part of this fix, now host checks whether wakelock is initialized or not before destroying it. Change-Id: Id1d2df28e46e38baf43a6346ca1169c34e031b04 CRs-Fixed: 996709
-rw-r--r--CORE/VOSS/inc/i_vos_lock.h1
-rw-r--r--CORE/VOSS/src/vos_lock.c94
2 files changed, 63 insertions, 32 deletions
diff --git a/CORE/VOSS/inc/i_vos_lock.h b/CORE/VOSS/inc/i_vos_lock.h
index 25cdb8049786..ba5e53b0e5fd 100644
--- a/CORE/VOSS/inc/i_vos_lock.h
+++ b/CORE/VOSS/inc/i_vos_lock.h
@@ -70,6 +70,7 @@ typedef spinlock_t vos_spin_lock_t;
typedef struct wlan_wake_lock {
struct wakeup_source lock;
+ bool is_initialized;
} vos_wake_lock_t;
typedef void *runtime_pm_context_t;
diff --git a/CORE/VOSS/src/vos_lock.c b/CORE/VOSS/src/vos_lock.c
index 276d614331f1..f99fe25d83f5 100644
--- a/CORE/VOSS/src/vos_lock.c
+++ b/CORE/VOSS/src/vos_lock.c
@@ -503,9 +503,16 @@ VOS_STATUS vos_spin_lock_destroy(vos_spin_lock_t *pLock)
--------------------------------------------------------------------------*/
VOS_STATUS vos_wake_lock_init(vos_wake_lock_t *pLock, const char *name)
{
- vos_pm_wake_lock_init(&pLock->lock, name);
+ if (!pLock->is_initialized) {
+ vos_pm_wake_lock_init(&pLock->lock, name);
+ pLock->is_initialized = true;
- return VOS_STATUS_SUCCESS;
+ return VOS_STATUS_SUCCESS;
+ } else {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ FL("wakelock is already intialized"));
+ return VOS_STATUS_E_INVAL;
+ }
}
/**
@@ -520,7 +527,7 @@ VOS_STATUS vos_wake_lock_init(vos_wake_lock_t *pLock, const char *name)
static const char* vos_wake_lock_name(vos_wake_lock_t *pLock)
{
- if (pLock->lock.name)
+ if ((pLock->is_initialized) && (pLock->lock.name))
return pLock->lock.name;
else
return "UNNAMED_WAKELOCK";
@@ -538,13 +545,17 @@ static const char* vos_wake_lock_name(vos_wake_lock_t *pLock)
VOS_STATUS vos_wake_lock_acquire(vos_wake_lock_t *pLock,
uint32_t reason)
{
- vos_log_wlock_diag(reason, vos_wake_lock_name(pLock),
- WIFI_POWER_EVENT_DEFAULT_WAKELOCK_TIMEOUT,
- WIFI_POWER_EVENT_WAKELOCK_TAKEN);
-
- vos_pm_wake_lock(&pLock->lock);
-
- return VOS_STATUS_SUCCESS;
+ if (pLock->is_initialized) {
+ vos_log_wlock_diag(reason, vos_wake_lock_name(pLock),
+ WIFI_POWER_EVENT_DEFAULT_WAKELOCK_TIMEOUT,
+ WIFI_POWER_EVENT_WAKELOCK_TAKEN);
+ vos_pm_wake_lock(&pLock->lock);
+ return VOS_STATUS_SUCCESS;
+ } else {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ FL("wakelock is not intialized yet"));
+ return VOS_STATUS_E_INVAL;
+ }
}
/*--------------------------------------------------------------------------
@@ -559,19 +570,26 @@ VOS_STATUS vos_wake_lock_acquire(vos_wake_lock_t *pLock,
VOS_STATUS vos_wake_lock_timeout_acquire(vos_wake_lock_t *pLock, v_U32_t msec,
uint32_t reason)
{
- /* Wakelock for Rx is frequent.
- * It is reported only during active debug
- */
- if (((vos_get_ring_log_level(RING_ID_WAKELOCK) >= WLAN_LOG_LEVEL_ACTIVE)
- && (WIFI_POWER_EVENT_WAKELOCK_HOLD_RX == reason)) ||
- (WIFI_POWER_EVENT_WAKELOCK_HOLD_RX != reason)) {
- vos_log_wlock_diag(reason, vos_wake_lock_name(pLock), msec,
- WIFI_POWER_EVENT_WAKELOCK_TAKEN);
- }
-
- vos_pm_wake_lock_timeout(&pLock->lock, msec);
-
- return VOS_STATUS_SUCCESS;
+
+ /* Wakelock for Rx is frequent.
+ * It is reported only during active debug
+ */
+ if (pLock->is_initialized) {
+ if (((vos_get_ring_log_level(RING_ID_WAKELOCK) >=
+ WLAN_LOG_LEVEL_ACTIVE)
+ && (WIFI_POWER_EVENT_WAKELOCK_HOLD_RX == reason)) ||
+ (WIFI_POWER_EVENT_WAKELOCK_HOLD_RX != reason)) {
+ vos_log_wlock_diag(reason,
+ vos_wake_lock_name(pLock), msec,
+ WIFI_POWER_EVENT_WAKELOCK_TAKEN);
+ }
+ vos_pm_wake_lock_timeout(&pLock->lock, msec);
+ return VOS_STATUS_SUCCESS;
+ } else {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ FL("wakelock is not intialized yet"));
+ return VOS_STATUS_E_INVAL;
+ }
}
/*--------------------------------------------------------------------------
@@ -585,12 +603,17 @@ VOS_STATUS vos_wake_lock_timeout_acquire(vos_wake_lock_t *pLock, v_U32_t msec,
------------------------------------------------------------------------*/
VOS_STATUS vos_wake_lock_release(vos_wake_lock_t *pLock, uint32_t reason)
{
- vos_log_wlock_diag(reason, vos_wake_lock_name(pLock),
- WIFI_POWER_EVENT_DEFAULT_WAKELOCK_TIMEOUT,
- WIFI_POWER_EVENT_WAKELOCK_RELEASED);
- vos_pm_wake_lock_release(&pLock->lock);
-
- return VOS_STATUS_SUCCESS;
+ if (pLock->is_initialized) {
+ vos_log_wlock_diag(reason, vos_wake_lock_name(pLock),
+ WIFI_POWER_EVENT_DEFAULT_WAKELOCK_TIMEOUT,
+ WIFI_POWER_EVENT_WAKELOCK_RELEASED);
+ vos_pm_wake_lock_release(&pLock->lock);
+ return VOS_STATUS_SUCCESS;
+ } else {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ FL("wakelock is not intialized yet"));
+ return VOS_STATUS_E_INVAL;
+ }
}
/*--------------------------------------------------------------------------
@@ -604,9 +627,16 @@ VOS_STATUS vos_wake_lock_release(vos_wake_lock_t *pLock, uint32_t reason)
------------------------------------------------------------------------*/
VOS_STATUS vos_wake_lock_destroy(vos_wake_lock_t *pLock)
{
- vos_pm_wake_lock_destroy(&pLock->lock);
-
- return VOS_STATUS_SUCCESS;
+ if (pLock->is_initialized) {
+ vos_pm_wake_lock_destroy(&pLock->lock);
+ pLock->is_initialized = false;
+ return VOS_STATUS_SUCCESS;
+ }
+ else {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ FL("wakelock is not intialized yet"));
+ return VOS_STATUS_E_INVAL;
+ }
}
VOS_STATUS vos_runtime_pm_prevent_suspend(runtime_pm_context_t runtime_pm_ctx)