qcacmn: Add wakeup source tracker
Enable debug for wakeup source tracker. Change-Id: I28983b5b6cbc15e71753264504e28fccba8a79cc CRs-Fixed: 2760401
This commit is contained in:
@@ -487,7 +487,55 @@ static inline int qdf_semaphore_acquire_intr(qdf_semaphore_t *m)
|
|||||||
return __qdf_semaphore_acquire_intr(m);
|
return __qdf_semaphore_acquire_intr(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
QDF_STATUS qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name);
|
#ifdef WLAN_WAKE_LOCK_DEBUG
|
||||||
|
/**
|
||||||
|
* qdf_wake_lock_check_for_leaks() - assert no wake lock leaks
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void qdf_wake_lock_check_for_leaks(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qdf_wake_lock_feature_init() - global init logic for wake lock
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void qdf_wake_lock_feature_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qdf_wake_lock_feature_deinit() - global de-init logic for wake lock
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void qdf_wake_lock_feature_deinit(void);
|
||||||
|
#else
|
||||||
|
static inline void qdf_wake_lock_check_for_leaks(void) { }
|
||||||
|
static inline void qdf_wake_lock_feature_init(void) { }
|
||||||
|
static inline void qdf_wake_lock_feature_deinit(void) { }
|
||||||
|
#endif /* WLAN_WAKE_LOCK_DEBUG */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __qdf_wake_lock_create() - initialize a wake lock
|
||||||
|
* @lock: The wake lock to initialize
|
||||||
|
* @name: Name of wake lock
|
||||||
|
* @func: caller function
|
||||||
|
* @line: caller line
|
||||||
|
* Return:
|
||||||
|
* QDF status success: if wake lock is initialized
|
||||||
|
* QDF status failure: if wake lock was not initialized
|
||||||
|
*/
|
||||||
|
QDF_STATUS __qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name,
|
||||||
|
const char *func, uint32_t line);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qdf_wake_lock_create() - initialized a wakeup source lock
|
||||||
|
* @lock: the wakeup source lock to initialize
|
||||||
|
* @name: the name of wakeup source lock
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
#define qdf_wake_lock_create(lock, name) \
|
||||||
|
__qdf_wake_lock_create(lock, name, __func__, __LINE__)
|
||||||
|
|
||||||
QDF_STATUS qdf_wake_lock_acquire(qdf_wake_lock_t *lock, uint32_t reason);
|
QDF_STATUS qdf_wake_lock_acquire(qdf_wake_lock_t *lock, uint32_t reason);
|
||||||
|
|
||||||
@@ -497,7 +545,25 @@ QDF_STATUS qdf_wake_lock_timeout_acquire(qdf_wake_lock_t *lock,
|
|||||||
|
|
||||||
QDF_STATUS qdf_wake_lock_release(qdf_wake_lock_t *lock, uint32_t reason);
|
QDF_STATUS qdf_wake_lock_release(qdf_wake_lock_t *lock, uint32_t reason);
|
||||||
|
|
||||||
QDF_STATUS qdf_wake_lock_destroy(qdf_wake_lock_t *lock);
|
/**
|
||||||
|
* __qdf_wake_lock_destroy() - destroy a wake lock
|
||||||
|
* @lock: The wake lock to destroy
|
||||||
|
* @func: caller function
|
||||||
|
* @line: caller line
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void __qdf_wake_lock_destroy(qdf_wake_lock_t *lock,
|
||||||
|
const char *func, uint32_t line);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qdf_wake_lock_destroy() - deinitialize a wakeup source lock
|
||||||
|
* @lock: the wakeup source lock to de-initialize
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
#define qdf_wake_lock_destroy(lock) \
|
||||||
|
__qdf_wake_lock_destroy(lock, __func__, __LINE__)
|
||||||
|
|
||||||
void qdf_pm_system_wakeup(void);
|
void qdf_pm_system_wakeup(void);
|
||||||
|
|
||||||
|
@@ -233,6 +233,54 @@ QDF_STATUS qdf_mutex_release(qdf_mutex_t *lock)
|
|||||||
}
|
}
|
||||||
qdf_export_symbol(qdf_mutex_release);
|
qdf_export_symbol(qdf_mutex_release);
|
||||||
|
|
||||||
|
#ifdef WLAN_WAKE_LOCK_DEBUG
|
||||||
|
#include "qdf_tracker.h"
|
||||||
|
|
||||||
|
#define qdf_wake_lock_tracker_bits 2 /* 4 buckets */
|
||||||
|
static qdf_tracker_declare(qdf_wake_lock_tracker, qdf_wake_lock_tracker_bits,
|
||||||
|
"wake lock leaks", "wake lock create",
|
||||||
|
"wake lock destroy");
|
||||||
|
|
||||||
|
void qdf_wake_lock_feature_init(void)
|
||||||
|
{
|
||||||
|
qdf_tracker_init(&qdf_wake_lock_tracker);
|
||||||
|
}
|
||||||
|
|
||||||
|
void qdf_wake_lock_feature_deinit(void)
|
||||||
|
{
|
||||||
|
qdf_tracker_deinit(&qdf_wake_lock_tracker);
|
||||||
|
}
|
||||||
|
|
||||||
|
void qdf_wake_lock_check_for_leaks(void)
|
||||||
|
{
|
||||||
|
qdf_tracker_check_for_leaks(&qdf_wake_lock_tracker);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline QDF_STATUS qdf_wake_lock_dbg_track(qdf_wake_lock_t *lock,
|
||||||
|
const char *func,
|
||||||
|
uint32_t line)
|
||||||
|
{
|
||||||
|
return qdf_tracker_track(&qdf_wake_lock_tracker, lock, func, line);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void qdf_wake_lock_dbg_untrack(qdf_wake_lock_t *lock,
|
||||||
|
const char *func, uint32_t line)
|
||||||
|
{
|
||||||
|
qdf_tracker_untrack(&qdf_wake_lock_tracker, lock, func, line);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline QDF_STATUS qdf_wake_lock_dbg_track(qdf_wake_lock_t *lock,
|
||||||
|
const char *func,
|
||||||
|
uint32_t line)
|
||||||
|
{
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void qdf_wake_lock_dbg_untrack(qdf_wake_lock_t *lock,
|
||||||
|
const char *func, uint32_t line)
|
||||||
|
{ }
|
||||||
|
#endif /* WLAN_WAKE_LOCK_DEBUG */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qdf_wake_lock_name() - This function returns the name of the wakelock
|
* qdf_wake_lock_name() - This function returns the name of the wakelock
|
||||||
* @lock: Pointer to the wakelock
|
* @lock: Pointer to the wakelock
|
||||||
@@ -256,19 +304,17 @@ const char *qdf_wake_lock_name(qdf_wake_lock_t *lock)
|
|||||||
#endif
|
#endif
|
||||||
qdf_export_symbol(qdf_wake_lock_name);
|
qdf_export_symbol(qdf_wake_lock_name);
|
||||||
|
|
||||||
/**
|
|
||||||
* qdf_wake_lock_create() - initializes a wake lock
|
|
||||||
* @lock: The wake lock to initialize
|
|
||||||
* @name: Name of wake lock
|
|
||||||
*
|
|
||||||
* Return:
|
|
||||||
* QDF status success: if wake lock is initialized
|
|
||||||
* QDF status failure: if wake lock was not initialized
|
|
||||||
*/
|
|
||||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 110)) || \
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 110)) || \
|
||||||
defined(WAKEUP_SOURCE_DEV)
|
defined(WAKEUP_SOURCE_DEV)
|
||||||
QDF_STATUS qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name)
|
QDF_STATUS __qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name,
|
||||||
|
const char *func, uint32_t line)
|
||||||
{
|
{
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
status = qdf_wake_lock_dbg_track(lock, func, line);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
|
return status;
|
||||||
|
|
||||||
qdf_mem_zero(lock, sizeof(*lock));
|
qdf_mem_zero(lock, sizeof(*lock));
|
||||||
lock->priv = wakeup_source_register(lock->lock.dev, name);
|
lock->priv = wakeup_source_register(lock->lock.dev, name);
|
||||||
if (!(lock->priv)) {
|
if (!(lock->priv)) {
|
||||||
@@ -281,19 +327,28 @@ QDF_STATUS qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name)
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))
|
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))
|
||||||
QDF_STATUS qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name)
|
QDF_STATUS __qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name,
|
||||||
|
const char *func, uint32_t line)
|
||||||
{
|
{
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
status = qdf_wake_lock_dbg_track(lock, func, line);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
|
return status;
|
||||||
|
|
||||||
wakeup_source_init(&(lock->lock), name);
|
wakeup_source_init(&(lock->lock), name);
|
||||||
lock->priv = &(lock->lock);
|
lock->priv = &(lock->lock);
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
QDF_STATUS qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name)
|
QDF_STATUS __qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name,
|
||||||
|
const char *func, uint32_t line)
|
||||||
{
|
{
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
qdf_export_symbol(qdf_wake_lock_create);
|
qdf_export_symbol(__qdf_wake_lock_create);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qdf_wake_lock_acquire() - acquires a wake lock
|
* qdf_wake_lock_acquire() - acquires a wake lock
|
||||||
@@ -381,34 +436,28 @@ QDF_STATUS qdf_wake_lock_release(qdf_wake_lock_t *lock, uint32_t reason)
|
|||||||
#endif
|
#endif
|
||||||
qdf_export_symbol(qdf_wake_lock_release);
|
qdf_export_symbol(qdf_wake_lock_release);
|
||||||
|
|
||||||
/**
|
|
||||||
* qdf_wake_lock_destroy() - destroys a wake lock
|
|
||||||
* @lock: The wake lock to destroy
|
|
||||||
*
|
|
||||||
* Return:
|
|
||||||
* QDF status success: if wake lock is acquired
|
|
||||||
* QDF status failure: if wake lock was not acquired
|
|
||||||
*/
|
|
||||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 110)) || \
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 110)) || \
|
||||||
defined(WAKEUP_SOURCE_DEV)
|
defined(WAKEUP_SOURCE_DEV)
|
||||||
QDF_STATUS qdf_wake_lock_destroy(qdf_wake_lock_t *lock)
|
void __qdf_wake_lock_destroy(qdf_wake_lock_t *lock,
|
||||||
|
const char *func, uint32_t line)
|
||||||
{
|
{
|
||||||
wakeup_source_unregister(lock->priv);
|
wakeup_source_unregister(lock->priv);
|
||||||
return QDF_STATUS_SUCCESS;
|
qdf_wake_lock_dbg_untrack(lock, func, line);
|
||||||
}
|
}
|
||||||
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))
|
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))
|
||||||
QDF_STATUS qdf_wake_lock_destroy(qdf_wake_lock_t *lock)
|
void __qdf_wake_lock_destroy(qdf_wake_lock_t *lock,
|
||||||
|
const char *func, uint32_t line)
|
||||||
{
|
{
|
||||||
wakeup_source_trash(&(lock->lock));
|
wakeup_source_trash(&(lock->lock));
|
||||||
return QDF_STATUS_SUCCESS;
|
qdf_wake_lock_dbg_untrack(lock, func, line);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
QDF_STATUS qdf_wake_lock_destroy(qdf_wake_lock_t *lock)
|
void __qdf_wake_lock_destroy(qdf_wake_lock_t *lock,
|
||||||
|
const char *func, uint32_t line)
|
||||||
{
|
{
|
||||||
return QDF_STATUS_SUCCESS;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
qdf_export_symbol(qdf_wake_lock_destroy);
|
qdf_export_symbol(__qdf_wake_lock_destroy);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qdf_pm_system_wakeup() - wakeup system
|
* qdf_pm_system_wakeup() - wakeup system
|
||||||
|
Reference in New Issue
Block a user