diff options
| author | Mukul Sharma <mukul@qti.qualcomm.com> | 2016-03-30 14:57:55 +0530 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-04-05 12:56:37 +0530 |
| commit | 2727c2ac0233b8cf0fac9c79cfb5d1fc835eb2b4 (patch) | |
| tree | 3a0a32bb7f312cd9cc5c5e20e947262bd0cf2313 | |
| parent | d7b8b37e22998595c1364b44a83bf40a4e59a8ec (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.h | 1 | ||||
| -rw-r--r-- | CORE/VOSS/src/vos_lock.c | 94 |
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) |
