diff --git a/qdf/linux/src/i_qdf_lock.h b/qdf/linux/src/i_qdf_lock.h index 98f499b1d93b..ecc7114d5d54 100644 --- a/qdf/linux/src/i_qdf_lock.h +++ b/qdf/linux/src/i_qdf_lock.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2018, 2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -84,7 +84,15 @@ typedef struct __qdf_spinlock { typedef struct semaphore __qdf_semaphore_t; -typedef struct wakeup_source qdf_wake_lock_t; +/** + * typedef struct - qdf_wake_lock_t + * @lock: this lock needs to be used in kernel version < 5.4 + * @priv: this lock pointer needs to be used in kernel version >= 5.4 + */ +typedef struct qdf_wake_lock { + struct wakeup_source lock; + struct wakeup_source *priv; +} qdf_wake_lock_t; struct hif_pm_runtime_lock; typedef struct qdf_runtime_lock { diff --git a/qdf/linux/src/qdf_lock.c b/qdf/linux/src/qdf_lock.c index 6a541d4163c3..611e2d98a01d 100644 --- a/qdf/linux/src/qdf_lock.c +++ b/qdf/linux/src/qdf_lock.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -244,8 +244,8 @@ qdf_export_symbol(qdf_mutex_release); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) const char *qdf_wake_lock_name(qdf_wake_lock_t *lock) { - if (lock->name) - return lock->name; + if (lock) + return lock->lock.name; return "UNNAMED_WAKELOCK"; } #else @@ -268,13 +268,21 @@ qdf_export_symbol(qdf_wake_lock_name); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)) QDF_STATUS qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name) { - wakeup_source_register(lock->dev, name); + lock->priv = wakeup_source_register(lock->lock.dev, name); + if (!(lock->priv)) { + QDF_BUG(0); + return QDF_STATUS_E_FAILURE; + } + + lock->lock = *(lock->priv); + return QDF_STATUS_SUCCESS; } #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) QDF_STATUS qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name) { - wakeup_source_init(lock, name); + wakeup_source_init(&(lock->lock), name); + lock->priv = &(lock->lock); return QDF_STATUS_SUCCESS; } #else @@ -300,7 +308,7 @@ QDF_STATUS qdf_wake_lock_acquire(qdf_wake_lock_t *lock, uint32_t reason) host_diag_log_wlock(reason, qdf_wake_lock_name(lock), WIFI_POWER_EVENT_DEFAULT_WAKELOCK_TIMEOUT, WIFI_POWER_EVENT_WAKELOCK_TAKEN); - __pm_stay_awake(lock); + __pm_stay_awake(lock->priv); return QDF_STATUS_SUCCESS; } @@ -324,7 +332,7 @@ qdf_export_symbol(qdf_wake_lock_acquire); #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) QDF_STATUS qdf_wake_lock_timeout_acquire(qdf_wake_lock_t *lock, uint32_t msec) { - pm_wakeup_ws_event(lock, msec, true); + pm_wakeup_ws_event(lock->priv, msec, true); return QDF_STATUS_SUCCESS; } #elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) @@ -333,7 +341,7 @@ QDF_STATUS qdf_wake_lock_timeout_acquire(qdf_wake_lock_t *lock, uint32_t msec) /* Wakelock for Rx is frequent. * It is reported only during active debug */ - __pm_wakeup_event(lock, msec); + __pm_wakeup_event(&(lock->lock), msec); return QDF_STATUS_SUCCESS; } #else /* LINUX_VERSION_CODE */ @@ -359,7 +367,7 @@ QDF_STATUS qdf_wake_lock_release(qdf_wake_lock_t *lock, uint32_t reason) host_diag_log_wlock(reason, qdf_wake_lock_name(lock), WIFI_POWER_EVENT_DEFAULT_WAKELOCK_TIMEOUT, WIFI_POWER_EVENT_WAKELOCK_RELEASED); - __pm_relax(lock); + __pm_relax(lock->priv); return QDF_STATUS_SUCCESS; } @@ -382,13 +390,13 @@ qdf_export_symbol(qdf_wake_lock_release); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)) QDF_STATUS qdf_wake_lock_destroy(qdf_wake_lock_t *lock) { - wakeup_source_unregister(lock); + wakeup_source_unregister(lock->priv); return QDF_STATUS_SUCCESS; } #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) QDF_STATUS qdf_wake_lock_destroy(qdf_wake_lock_t *lock) { - wakeup_source_trash(lock); + wakeup_source_trash(&(lock->lock)); return QDF_STATUS_SUCCESS; } #else