Ver Fonte

qcacmn: QDF wake lock API changes to support various kernel versions

Kernel 5.4+ is returning created wake lock pointer which needs to be
stored in driver wakelock structure, which needs to be used in
acquire, release, and destroy APIs. This change updates the QDF wake
lock structure accordingly to handle both older and new kernels.

Change-Id: Id0c5279613fa4c4c84205905fef7557c6b852017
CRs-Fixed: 2615065
Alan Chen há 5 anos atrás
pai
commit
4631007d0c
2 ficheiros alterados com 29 adições e 13 exclusões
  1. 10 2
      qdf/linux/src/i_qdf_lock.h
  2. 19 11
      qdf/linux/src/qdf_lock.c

+ 10 - 2
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 {

+ 19 - 11
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