xref: /wlan-driver/qca-wifi-host-cmn/qdf/inc/qdf_lock.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  * DOC: qdf_lock.h
22*5113495bSYour Name  * This file abstracts locking operations.
23*5113495bSYour Name  */
24*5113495bSYour Name 
25*5113495bSYour Name #ifndef _QDF_LOCK_H
26*5113495bSYour Name #define _QDF_LOCK_H
27*5113495bSYour Name 
28*5113495bSYour Name #include <qdf_types.h>
29*5113495bSYour Name #include <qdf_mem.h>
30*5113495bSYour Name #include <qdf_time.h>
31*5113495bSYour Name #include <i_qdf_trace.h>
32*5113495bSYour Name 
33*5113495bSYour Name #ifndef QDF_LOCK_STATS
34*5113495bSYour Name #define QDF_LOCK_STATS 0
35*5113495bSYour Name #endif
36*5113495bSYour Name #ifndef QDF_LOCK_STATS_DESTROY_PRINT
37*5113495bSYour Name #define QDF_LOCK_STATS_DESTROY_PRINT 0
38*5113495bSYour Name #endif
39*5113495bSYour Name #ifndef QDF_LOCK_STATS_BUG_ON
40*5113495bSYour Name #define QDF_LOCK_STATS_BUG_ON 0
41*5113495bSYour Name #endif
42*5113495bSYour Name #ifndef QDF_LOCK_STATS_LIST
43*5113495bSYour Name #define QDF_LOCK_STATS_LIST 0
44*5113495bSYour Name #endif
45*5113495bSYour Name 
46*5113495bSYour Name /* Max hold time in micro seconds, 0 to disable detection*/
47*5113495bSYour Name #ifdef VCPU_TIMESTOLEN
48*5113495bSYour Name #define QDF_MAX_HOLD_TIME_ALOWED_SPINLOCK_IRQ         400000
49*5113495bSYour Name #else
50*5113495bSYour Name #define QDF_MAX_HOLD_TIME_ALOWED_SPINLOCK_IRQ         10000
51*5113495bSYour Name #endif
52*5113495bSYour Name #define QDF_MAX_HOLD_TIME_ALOWED_SPINLOCK                 0
53*5113495bSYour Name 
54*5113495bSYour Name #if QDF_LOCK_STATS
55*5113495bSYour Name #define QDF_MAX_HOLD_TIME_ALOWED_SPINLOCK_BH        2000000
56*5113495bSYour Name #else
57*5113495bSYour Name #define QDF_MAX_HOLD_TIME_ALOWED_SPINLOCK_BH        1000000
58*5113495bSYour Name #endif
59*5113495bSYour Name 
60*5113495bSYour Name #if !QDF_LOCK_STATS
61*5113495bSYour Name struct lock_stats {};
62*5113495bSYour Name #define BEFORE_LOCK(x...) do {} while (0)
63*5113495bSYour Name #define AFTER_LOCK(x...) do {} while (0)
64*5113495bSYour Name #define BEFORE_TRYLOCK(x...) do {} while (0)
65*5113495bSYour Name #define AFTER_TRYLOCK(x...) do {} while (0)
66*5113495bSYour Name #define BEFORE_UNLOCK(x...) do {} while (0)
67*5113495bSYour Name #define qdf_lock_stats_create(x...) do {} while (0)
68*5113495bSYour Name #define qdf_lock_stats_destroy(x...) do {} while (0)
69*5113495bSYour Name #define qdf_lock_stats_init(x...) do {} while (0)
70*5113495bSYour Name #define qdf_lock_stats_deinit(x...) do {} while (0)
71*5113495bSYour Name #else
72*5113495bSYour Name void qdf_lock_stats_init(void);
73*5113495bSYour Name void qdf_lock_stats_deinit(void);
74*5113495bSYour Name struct qdf_lock_cookie;
75*5113495bSYour Name struct lock_stats {
76*5113495bSYour Name 	const char *initialization_fn;
77*5113495bSYour Name 	const char *acquired_by;
78*5113495bSYour Name 	int line;
79*5113495bSYour Name 	int acquired;
80*5113495bSYour Name 	int contended;
81*5113495bSYour Name 	uint64_t contention_time;
82*5113495bSYour Name 	uint64_t non_contention_time;
83*5113495bSYour Name 	uint64_t held_time;
84*5113495bSYour Name 	uint64_t last_acquired;
85*5113495bSYour Name 	uint64_t max_contention_wait;
86*5113495bSYour Name 	uint64_t max_held_time;
87*5113495bSYour Name 	int num_large_contentions;
88*5113495bSYour Name 	int num_large_holds;
89*5113495bSYour Name 	struct qdf_lock_cookie *cookie;
90*5113495bSYour Name };
91*5113495bSYour Name #define LARGE_CONTENTION QDF_LOG_TIMESTAMP_CYCLES_PER_10_US
92*5113495bSYour Name 
93*5113495bSYour Name #define BEFORE_LOCK(lock, was_locked) \
94*5113495bSYour Name do { \
95*5113495bSYour Name 	uint64_t BEFORE_LOCK_time; \
96*5113495bSYour Name 	uint64_t AFTER_LOCK_time;  \
97*5113495bSYour Name 	bool BEFORE_LOCK_is_locked = was_locked; \
98*5113495bSYour Name 	BEFORE_LOCK_time = qdf_get_log_timestamp_lightweight(); \
99*5113495bSYour Name 	do {} while (0)
100*5113495bSYour Name 
101*5113495bSYour Name 
102*5113495bSYour Name #define AFTER_LOCK(lock, func) \
103*5113495bSYour Name 	lock->stats.acquired_by = func; \
104*5113495bSYour Name 	AFTER_LOCK_time = qdf_get_log_timestamp_lightweight(); \
105*5113495bSYour Name 	lock->stats.acquired++; \
106*5113495bSYour Name 	lock->stats.last_acquired = AFTER_LOCK_time; \
107*5113495bSYour Name 	if (BEFORE_LOCK_is_locked) { \
108*5113495bSYour Name 		lock->stats.contended++; \
109*5113495bSYour Name 		lock->stats.contention_time += \
110*5113495bSYour Name 			(AFTER_LOCK_time - BEFORE_LOCK_time); \
111*5113495bSYour Name 	} else { \
112*5113495bSYour Name 		lock->stats.non_contention_time += \
113*5113495bSYour Name 			(AFTER_LOCK_time - BEFORE_LOCK_time); \
114*5113495bSYour Name 	} \
115*5113495bSYour Name \
116*5113495bSYour Name 	if (AFTER_LOCK_time - BEFORE_LOCK_time > LARGE_CONTENTION) \
117*5113495bSYour Name 		lock->stats.num_large_contentions++; \
118*5113495bSYour Name \
119*5113495bSYour Name 	if (AFTER_LOCK_time - BEFORE_LOCK_time > \
120*5113495bSYour Name 	    lock->stats.max_contention_wait) \
121*5113495bSYour Name 		lock->stats.max_contention_wait = \
122*5113495bSYour Name 			AFTER_LOCK_time - BEFORE_LOCK_time; \
123*5113495bSYour Name } while (0)
124*5113495bSYour Name 
125*5113495bSYour Name #define BEFORE_TRYLOCK(lock) \
126*5113495bSYour Name do { \
127*5113495bSYour Name 	uint64_t BEFORE_LOCK_time; \
128*5113495bSYour Name 	uint64_t AFTER_LOCK_time;  \
129*5113495bSYour Name 	BEFORE_LOCK_time = qdf_get_log_timestamp_lightweight(); \
130*5113495bSYour Name 	do {} while (0)
131*5113495bSYour Name 
132*5113495bSYour Name #define AFTER_TRYLOCK(lock, trylock_return, func) \
133*5113495bSYour Name 	AFTER_LOCK_time = qdf_get_log_timestamp_lightweight(); \
134*5113495bSYour Name 	if (trylock_return) { \
135*5113495bSYour Name 		lock->stats.acquired++; \
136*5113495bSYour Name 		lock->stats.last_acquired = AFTER_LOCK_time; \
137*5113495bSYour Name 		lock->stats.non_contention_time += \
138*5113495bSYour Name 			(AFTER_LOCK_time - BEFORE_LOCK_time); \
139*5113495bSYour Name 		lock->stats.acquired_by = func; \
140*5113495bSYour Name 	} \
141*5113495bSYour Name } while (0)
142*5113495bSYour Name 
143*5113495bSYour Name /* max_hold_time in US */
144*5113495bSYour Name #define BEFORE_UNLOCK(lock, max_hold_time) \
145*5113495bSYour Name do {\
146*5113495bSYour Name 	uint64_t BEFORE_UNLOCK_time;  \
147*5113495bSYour Name 	uint64_t held_time;  \
148*5113495bSYour Name 	BEFORE_UNLOCK_time = qdf_get_log_timestamp_lightweight(); \
149*5113495bSYour Name \
150*5113495bSYour Name 	if (unlikely(BEFORE_UNLOCK_time < lock->stats.last_acquired)) \
151*5113495bSYour Name 		held_time = 0; \
152*5113495bSYour Name 	else \
153*5113495bSYour Name 		held_time = BEFORE_UNLOCK_time - lock->stats.last_acquired; \
154*5113495bSYour Name \
155*5113495bSYour Name 	lock->stats.held_time += held_time; \
156*5113495bSYour Name \
157*5113495bSYour Name 	if (held_time > lock->stats.max_held_time) \
158*5113495bSYour Name 		lock->stats.max_held_time = held_time; \
159*5113495bSYour Name \
160*5113495bSYour Name 	if (held_time > LARGE_CONTENTION) \
161*5113495bSYour Name 		lock->stats.num_large_holds++; \
162*5113495bSYour Name 	if (QDF_LOCK_STATS_BUG_ON && max_hold_time && \
163*5113495bSYour Name 	    held_time > qdf_usecs_to_log_timestamp(max_hold_time)) { \
164*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, \
165*5113495bSYour Name 			"BEFORE_UNLOCK: lock held too long (%lluus)", \
166*5113495bSYour Name 			qdf_log_timestamp_to_usecs(held_time)); \
167*5113495bSYour Name 		QDF_BUG(0); \
168*5113495bSYour Name 	} \
169*5113495bSYour Name 	lock->stats.acquired_by = NULL; \
170*5113495bSYour Name } while (0)
171*5113495bSYour Name 
172*5113495bSYour Name void qdf_lock_stats_cookie_destroy(struct lock_stats *stats);
173*5113495bSYour Name void qdf_lock_stats_cookie_create(struct lock_stats *stats,
174*5113495bSYour Name 				  const char *func, int line);
175*5113495bSYour Name 
qdf_lock_stats_destroy(struct lock_stats * stats)176*5113495bSYour Name static inline void qdf_lock_stats_destroy(struct lock_stats *stats)
177*5113495bSYour Name {
178*5113495bSYour Name 	if (QDF_LOCK_STATS_DESTROY_PRINT) {
179*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG,
180*5113495bSYour Name 			"%s: lock: %s %d \t"
181*5113495bSYour Name 			"acquired:\t%d\tcontended:\t%d\t"
182*5113495bSYour Name 			"contention_time\t%llu\tmax_contention_wait:\t%llu\t"
183*5113495bSYour Name 			"non_contention_time\t%llu\t"
184*5113495bSYour Name 			"held_time\t%llu\tmax_held:\t%llu"
185*5113495bSYour Name 			, __func__, stats->initialization_fn, stats->line,
186*5113495bSYour Name 			stats->acquired, stats->contended,
187*5113495bSYour Name 			qdf_log_timestamp_to_usecs(stats->contention_time),
188*5113495bSYour Name 			qdf_log_timestamp_to_usecs(stats->max_contention_wait),
189*5113495bSYour Name 			qdf_log_timestamp_to_usecs(stats->non_contention_time),
190*5113495bSYour Name 			qdf_log_timestamp_to_usecs(stats->held_time),
191*5113495bSYour Name 			qdf_log_timestamp_to_usecs(stats->max_held_time));
192*5113495bSYour Name 	}
193*5113495bSYour Name 
194*5113495bSYour Name 	if (QDF_LOCK_STATS_LIST)
195*5113495bSYour Name 		qdf_lock_stats_cookie_destroy(stats);
196*5113495bSYour Name }
197*5113495bSYour Name 
198*5113495bSYour Name #ifndef MEMORY_DEBUG
199*5113495bSYour Name #define qdf_mem_malloc_debug(x, y, z) qdf_mem_malloc(x)
200*5113495bSYour Name #endif
201*5113495bSYour Name 
202*5113495bSYour Name /**
203*5113495bSYour Name  * qdf_lock_stats_create() - initialize the lock stats structure
204*5113495bSYour Name  * @stats: stats to initialize
205*5113495bSYour Name  * @func: calling function
206*5113495bSYour Name  * @line: calling line number
207*5113495bSYour Name  */
qdf_lock_stats_create(struct lock_stats * stats,const char * func,int line)208*5113495bSYour Name static inline void qdf_lock_stats_create(struct lock_stats *stats,
209*5113495bSYour Name 					 const char *func, int line)
210*5113495bSYour Name {
211*5113495bSYour Name 	qdf_mem_zero(stats, sizeof(*stats));
212*5113495bSYour Name 	stats->initialization_fn = func;
213*5113495bSYour Name 	stats->line = line;
214*5113495bSYour Name 
215*5113495bSYour Name 	if (QDF_LOCK_STATS_LIST)
216*5113495bSYour Name 		qdf_lock_stats_cookie_create(stats, func, line);
217*5113495bSYour Name }
218*5113495bSYour Name #endif
219*5113495bSYour Name 
220*5113495bSYour Name #include <i_qdf_lock.h>
221*5113495bSYour Name 
222*5113495bSYour Name #define WIFI_POWER_EVENT_DEFAULT_WAKELOCK_TIMEOUT 0
223*5113495bSYour Name #define WIFI_POWER_EVENT_WAKELOCK_TAKEN 0
224*5113495bSYour Name #define WIFI_POWER_EVENT_WAKELOCK_RELEASED 1
225*5113495bSYour Name 
226*5113495bSYour Name /**
227*5113495bSYour Name  * qdf_semaphore_acquire_timeout() - Take the semaphore before timeout
228*5113495bSYour Name  * @m: semaphore to take
229*5113495bSYour Name  * @timeout: maximum time to try to take the semaphore
230*5113495bSYour Name  *
231*5113495bSYour Name  * Return: int
232*5113495bSYour Name  */
qdf_semaphore_acquire_timeout(struct semaphore * m,unsigned long timeout)233*5113495bSYour Name static inline int qdf_semaphore_acquire_timeout(struct semaphore *m,
234*5113495bSYour Name 						unsigned long timeout)
235*5113495bSYour Name {
236*5113495bSYour Name 	return __qdf_semaphore_acquire_timeout(m, timeout);
237*5113495bSYour Name }
238*5113495bSYour Name 
239*5113495bSYour Name struct qdf_spinlock {
240*5113495bSYour Name 	__qdf_spinlock_t lock;
241*5113495bSYour Name 	struct lock_stats stats;
242*5113495bSYour Name };
243*5113495bSYour Name 
244*5113495bSYour Name /**
245*5113495bSYour Name  * typedef qdf_spinlock_t - Abstracted spinlock object
246*5113495bSYour Name  *
247*5113495bSYour Name  * Abstracted object. Clients must not make any assumptions about the
248*5113495bSYour Name  * composition of this object
249*5113495bSYour Name  */
250*5113495bSYour Name typedef struct qdf_spinlock qdf_spinlock_t;
251*5113495bSYour Name 
252*5113495bSYour Name /**
253*5113495bSYour Name  * typedef qdf_semaphore_t - Abstracted semaphore object
254*5113495bSYour Name  *
255*5113495bSYour Name  * Abstracted object. Clients must not make any assumptions about the
256*5113495bSYour Name  * composition of this object
257*5113495bSYour Name  */
258*5113495bSYour Name typedef __qdf_semaphore_t qdf_semaphore_t;
259*5113495bSYour Name 
260*5113495bSYour Name /**
261*5113495bSYour Name  * typedef qdf_mutex_t - Abstracted mutex object
262*5113495bSYour Name  *
263*5113495bSYour Name  * Abstracted object. Clients must not make any assumptions about the
264*5113495bSYour Name  * composition of this object
265*5113495bSYour Name  */
266*5113495bSYour Name typedef __qdf_mutex_t qdf_mutex_t;
267*5113495bSYour Name 
268*5113495bSYour Name QDF_STATUS qdf_mutex_create(qdf_mutex_t *lock, const char *func, int line);
269*5113495bSYour Name 
270*5113495bSYour Name /**
271*5113495bSYour Name  * qdf_mutex_create() - Initialize a mutex
272*5113495bSYour Name  * @lock: pointer to the qdf_mutex_t mutex to initialize
273*5113495bSYour Name  *
274*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success, else QDF_STATUS failure
275*5113495bSYour Name  */
276*5113495bSYour Name #define qdf_mutex_create(lock) qdf_mutex_create(lock, __func__, __LINE__)
277*5113495bSYour Name 
278*5113495bSYour Name /**
279*5113495bSYour Name  * qdf_mutex_acquire() - acquire a QDF lock
280*5113495bSYour Name  * @lock: Pointer to the opaque lock object to acquire
281*5113495bSYour Name  *
282*5113495bSYour Name  * A lock object is acquired by calling qdf_mutex_acquire().  If the lock
283*5113495bSYour Name  * is already locked, the calling thread shall block until the lock becomes
284*5113495bSYour Name  * available. This operation shall return with the lock object referenced by
285*5113495bSYour Name  * lock in the locked state with the calling thread as its owner.
286*5113495bSYour Name  *
287*5113495bSYour Name  * Return:
288*5113495bSYour Name  * QDF_STATUS_SUCCESS if lock was successfully initialized
289*5113495bSYour Name  * QDF failure reason codes if lock is not initialized and can't be used
290*5113495bSYour Name  */
291*5113495bSYour Name QDF_STATUS qdf_mutex_acquire(qdf_mutex_t *lock);
292*5113495bSYour Name 
293*5113495bSYour Name /**
294*5113495bSYour Name  * qdf_mutex_release() - release a QDF lock
295*5113495bSYour Name  * @lock: Pointer to the opaque lock object to be released
296*5113495bSYour Name  *
297*5113495bSYour Name  * qdf_mutex_release() function shall release the lock object
298*5113495bSYour Name  * referenced by 'lock'.
299*5113495bSYour Name  *
300*5113495bSYour Name  * If a thread attempts to release a lock that it unlocked or is not
301*5113495bSYour Name  * initialized, an error is returned.
302*5113495bSYour Name  *
303*5113495bSYour Name  * Return:
304*5113495bSYour Name  * QDF_STATUS_SUCCESS if lock was successfully initialized
305*5113495bSYour Name  * QDF failure reason codes if lock is not initialized and can't be used
306*5113495bSYour Name  */
307*5113495bSYour Name QDF_STATUS qdf_mutex_release(qdf_mutex_t *lock);
308*5113495bSYour Name 
309*5113495bSYour Name /**
310*5113495bSYour Name  * qdf_mutex_destroy() - destroy a QDF lock
311*5113495bSYour Name  * @lock: Pointer to the opaque lock object to be destroyed
312*5113495bSYour Name  *
313*5113495bSYour Name  * function shall destroy the lock object referenced by lock. After a
314*5113495bSYour Name  * successful return from qdf_mutex_destroy()
315*5113495bSYour Name  * the lock object becomes, in effect, uninitialized.
316*5113495bSYour Name  *
317*5113495bSYour Name  * A destroyed lock object can be reinitialized using qdf_mutex_create();
318*5113495bSYour Name  * the results of otherwise referencing the object after it has been destroyed
319*5113495bSYour Name  * are undefined.  Calls to QDF lock functions to manipulate the lock such
320*5113495bSYour Name  * as qdf_mutex_acquire() will fail if the lock is destroyed.  Therefore,
321*5113495bSYour Name  * don't use the lock after it has been destroyed until it has
322*5113495bSYour Name  * been re-initialized.
323*5113495bSYour Name  *
324*5113495bSYour Name  * Return:
325*5113495bSYour Name  * QDF_STATUS_SUCCESS if lock was successfully initialized
326*5113495bSYour Name  * QDF failure reason codes if lock is not initialized and can't be used
327*5113495bSYour Name  */
328*5113495bSYour Name QDF_STATUS qdf_mutex_destroy(qdf_mutex_t *lock);
329*5113495bSYour Name 
qdf_spinlock_create(qdf_spinlock_t * lock,const char * func,int line)330*5113495bSYour Name static inline void qdf_spinlock_create(qdf_spinlock_t *lock, const char *func,
331*5113495bSYour Name 				       int line)
332*5113495bSYour Name {
333*5113495bSYour Name 	__qdf_spinlock_create(&lock->lock);
334*5113495bSYour Name 
335*5113495bSYour Name 	/* spinlock stats create relies on the spinlock working allread */
336*5113495bSYour Name 	qdf_lock_stats_create(&lock->stats, func, line);
337*5113495bSYour Name }
338*5113495bSYour Name 
339*5113495bSYour Name /**
340*5113495bSYour Name  * qdf_spinlock_create() - Initialize a spinlock
341*5113495bSYour Name  * @lock: spinlock object pointer
342*5113495bSYour Name  *
343*5113495bSYour Name  * Return: none
344*5113495bSYour Name  */
345*5113495bSYour Name #define qdf_spinlock_create(lock) qdf_spinlock_create(lock, __func__, __LINE__)
346*5113495bSYour Name 
347*5113495bSYour Name /**
348*5113495bSYour Name  * qdf_spinlock_destroy() - Delete a spinlock
349*5113495bSYour Name  * @lock: spinlock object pointer
350*5113495bSYour Name  *
351*5113495bSYour Name  * Return: none
352*5113495bSYour Name  */
qdf_spinlock_destroy(qdf_spinlock_t * lock)353*5113495bSYour Name static inline void qdf_spinlock_destroy(qdf_spinlock_t *lock)
354*5113495bSYour Name {
355*5113495bSYour Name 	qdf_lock_stats_destroy(&lock->stats);
356*5113495bSYour Name 	__qdf_spinlock_destroy(&lock->lock);
357*5113495bSYour Name }
358*5113495bSYour Name 
359*5113495bSYour Name /**
360*5113495bSYour Name  * qdf_spin_is_locked() - check if the spinlock is locked
361*5113495bSYour Name  * @lock: spinlock object
362*5113495bSYour Name  *
363*5113495bSYour Name  * Return: nonzero if lock is held.
364*5113495bSYour Name  */
qdf_spin_is_locked(qdf_spinlock_t * lock)365*5113495bSYour Name static inline int qdf_spin_is_locked(qdf_spinlock_t *lock)
366*5113495bSYour Name {
367*5113495bSYour Name 	return __qdf_spin_is_locked(&lock->lock);
368*5113495bSYour Name }
369*5113495bSYour Name 
qdf_spin_trylock_bh(qdf_spinlock_t * lock,const char * func)370*5113495bSYour Name static inline int qdf_spin_trylock_bh(qdf_spinlock_t *lock, const char *func)
371*5113495bSYour Name {
372*5113495bSYour Name 	int trylock_return;
373*5113495bSYour Name 
374*5113495bSYour Name 	BEFORE_TRYLOCK(lock);
375*5113495bSYour Name 	trylock_return = __qdf_spin_trylock_bh(&lock->lock);
376*5113495bSYour Name 	AFTER_TRYLOCK(lock, trylock_return, func);
377*5113495bSYour Name 
378*5113495bSYour Name 	return trylock_return;
379*5113495bSYour Name }
380*5113495bSYour Name 
381*5113495bSYour Name /**
382*5113495bSYour Name  * qdf_spin_trylock_bh() - spin trylock bottomhalf
383*5113495bSYour Name  * @lock: spinlock object
384*5113495bSYour Name  *
385*5113495bSYour Name  * Return: nonzero if lock is acquired
386*5113495bSYour Name  */
387*5113495bSYour Name #define qdf_spin_trylock_bh(lock) qdf_spin_trylock_bh(lock, __func__)
388*5113495bSYour Name 
qdf_spin_trylock(qdf_spinlock_t * lock,const char * func)389*5113495bSYour Name static inline int qdf_spin_trylock(qdf_spinlock_t *lock, const char *func)
390*5113495bSYour Name {
391*5113495bSYour Name 	int result = 0;
392*5113495bSYour Name 
393*5113495bSYour Name 	BEFORE_LOCK(lock, qdf_spin_is_locked(lock));
394*5113495bSYour Name 	result = __qdf_spin_trylock(&lock->lock);
395*5113495bSYour Name 	AFTER_LOCK(lock, func);
396*5113495bSYour Name 
397*5113495bSYour Name 	return result;
398*5113495bSYour Name }
399*5113495bSYour Name 
400*5113495bSYour Name /**
401*5113495bSYour Name  * qdf_spin_trylock() - spin trylock
402*5113495bSYour Name  * @lock: spinlock object
403*5113495bSYour Name  *
404*5113495bSYour Name  * Return: nonzero if lock is acquired
405*5113495bSYour Name  */
406*5113495bSYour Name #define qdf_spin_trylock(lock) qdf_spin_trylock(lock, __func__)
407*5113495bSYour Name 
qdf_spin_lock_bh(qdf_spinlock_t * lock,const char * func)408*5113495bSYour Name static inline void qdf_spin_lock_bh(qdf_spinlock_t *lock, const char *func)
409*5113495bSYour Name {
410*5113495bSYour Name 	BEFORE_LOCK(lock, qdf_spin_is_locked(lock));
411*5113495bSYour Name 	__qdf_spin_lock_bh(&lock->lock);
412*5113495bSYour Name 	AFTER_LOCK(lock, func);
413*5113495bSYour Name }
414*5113495bSYour Name 
415*5113495bSYour Name /**
416*5113495bSYour Name  * qdf_spin_lock_bh() - locks the spinlock mutex in soft irq context
417*5113495bSYour Name  * @lock: spinlock object pointer
418*5113495bSYour Name  *
419*5113495bSYour Name  * Return: none
420*5113495bSYour Name  */
421*5113495bSYour Name #define qdf_spin_lock_bh(lock) qdf_spin_lock_bh(lock, __func__)
422*5113495bSYour Name 
423*5113495bSYour Name /**
424*5113495bSYour Name  * qdf_spin_unlock_bh() - unlocks the spinlock mutex in soft irq context
425*5113495bSYour Name  * @lock: spinlock object pointer
426*5113495bSYour Name  *
427*5113495bSYour Name  * Return: none
428*5113495bSYour Name  */
qdf_spin_unlock_bh(qdf_spinlock_t * lock)429*5113495bSYour Name static inline void qdf_spin_unlock_bh(qdf_spinlock_t *lock)
430*5113495bSYour Name {
431*5113495bSYour Name 	BEFORE_UNLOCK(lock, QDF_MAX_HOLD_TIME_ALOWED_SPINLOCK_BH);
432*5113495bSYour Name 	__qdf_spin_unlock_bh(&lock->lock);
433*5113495bSYour Name }
434*5113495bSYour Name 
435*5113495bSYour Name /**
436*5113495bSYour Name  * qdf_spinlock_irq_exec() - Execute the input function with spinlock held
437*5113495bSYour Name  *                           and interrupt disabled.
438*5113495bSYour Name  * @hdl: OS handle
439*5113495bSYour Name  * @lock: spinlock to be held for the critical region
440*5113495bSYour Name  * @func: critical region function that to be executed
441*5113495bSYour Name  * @arg: argument of the critical region function
442*5113495bSYour Name  *
443*5113495bSYour Name  * Return: Boolean status returned by the critical region function
444*5113495bSYour Name  */
qdf_spinlock_irq_exec(qdf_handle_t hdl,qdf_spinlock_t * lock,qdf_irqlocked_func_t func,void * arg)445*5113495bSYour Name static inline bool qdf_spinlock_irq_exec(qdf_handle_t hdl,
446*5113495bSYour Name 					 qdf_spinlock_t *lock,
447*5113495bSYour Name 					 qdf_irqlocked_func_t func, void *arg)
448*5113495bSYour Name {
449*5113495bSYour Name 	return __qdf_spinlock_irq_exec(hdl, &lock->lock, func, arg);
450*5113495bSYour Name }
451*5113495bSYour Name 
qdf_spin_lock(qdf_spinlock_t * lock,const char * func)452*5113495bSYour Name static inline void qdf_spin_lock(qdf_spinlock_t *lock, const char *func)
453*5113495bSYour Name {
454*5113495bSYour Name 	BEFORE_LOCK(lock, qdf_spin_is_locked(lock));
455*5113495bSYour Name 	__qdf_spin_lock(&lock->lock);
456*5113495bSYour Name 	AFTER_LOCK(lock, func);
457*5113495bSYour Name }
458*5113495bSYour Name 
459*5113495bSYour Name /**
460*5113495bSYour Name  * qdf_spin_lock() - Acquire a Spinlock(SMP) & disable Preemption (Preemptive)
461*5113495bSYour Name  * @lock: Lock object
462*5113495bSYour Name  *
463*5113495bSYour Name  * Return: none
464*5113495bSYour Name  */
465*5113495bSYour Name #define qdf_spin_lock(lock) qdf_spin_lock(lock, __func__)
466*5113495bSYour Name 
467*5113495bSYour Name /**
468*5113495bSYour Name  * qdf_spin_unlock() - Unlock the spinlock and enables the Preemption
469*5113495bSYour Name  * @lock: Lock object
470*5113495bSYour Name  *
471*5113495bSYour Name  * Return: none
472*5113495bSYour Name  */
qdf_spin_unlock(qdf_spinlock_t * lock)473*5113495bSYour Name static inline void qdf_spin_unlock(qdf_spinlock_t *lock)
474*5113495bSYour Name {
475*5113495bSYour Name 	BEFORE_UNLOCK(lock, QDF_MAX_HOLD_TIME_ALOWED_SPINLOCK);
476*5113495bSYour Name 	__qdf_spin_unlock(&lock->lock);
477*5113495bSYour Name }
478*5113495bSYour Name 
qdf_spin_lock_irq(qdf_spinlock_t * lock,unsigned long flags,const char * func)479*5113495bSYour Name static inline void qdf_spin_lock_irq(qdf_spinlock_t *lock, unsigned long flags,
480*5113495bSYour Name 				     const char *func)
481*5113495bSYour Name {
482*5113495bSYour Name 	BEFORE_LOCK(lock, qdf_spin_is_locked(lock));
483*5113495bSYour Name 	__qdf_spin_lock_irq(&lock->lock.spinlock, flags);
484*5113495bSYour Name 	AFTER_LOCK(lock, func);
485*5113495bSYour Name }
486*5113495bSYour Name 
487*5113495bSYour Name /**
488*5113495bSYour Name  * qdf_spin_lock_irq() - Acquire a Spinlock(SMP) & save the irq state
489*5113495bSYour Name  * @lock: Lock object
490*5113495bSYour Name  * @flags: flags
491*5113495bSYour Name  *
492*5113495bSYour Name  * Return: none
493*5113495bSYour Name  */
494*5113495bSYour Name #define qdf_spin_lock_irq(lock, flags) qdf_spin_lock_irq(lock, flags, __func__)
495*5113495bSYour Name 
qdf_spin_lock_irqsave(qdf_spinlock_t * lock,const char * func)496*5113495bSYour Name static inline void qdf_spin_lock_irqsave(qdf_spinlock_t *lock, const char *func)
497*5113495bSYour Name {
498*5113495bSYour Name 	BEFORE_LOCK(lock, qdf_spin_is_locked(lock));
499*5113495bSYour Name 	__qdf_spin_lock_irqsave(&lock->lock);
500*5113495bSYour Name 	AFTER_LOCK(lock, func);
501*5113495bSYour Name }
502*5113495bSYour Name 
503*5113495bSYour Name /**
504*5113495bSYour Name  * qdf_spin_lock_irqsave() - Acquire a Spinlock (SMP) & disable Preemption
505*5113495bSYour Name  *                           (Preemptive) and disable IRQs
506*5113495bSYour Name  * @lock: Lock object
507*5113495bSYour Name  *
508*5113495bSYour Name  * Return: none
509*5113495bSYour Name  */
510*5113495bSYour Name #define qdf_spin_lock_irqsave(lock) qdf_spin_lock_irqsave(lock, __func__)
511*5113495bSYour Name 
512*5113495bSYour Name /**
513*5113495bSYour Name  * qdf_spin_unlock_irqrestore() - Unlock the spinlock and enables the
514*5113495bSYour Name  *                                Preemption and enable IRQ
515*5113495bSYour Name  * @lock: Lock object
516*5113495bSYour Name  *
517*5113495bSYour Name  * Return: none
518*5113495bSYour Name  */
qdf_spin_unlock_irqrestore(qdf_spinlock_t * lock)519*5113495bSYour Name static inline void qdf_spin_unlock_irqrestore(qdf_spinlock_t *lock)
520*5113495bSYour Name {
521*5113495bSYour Name 	BEFORE_UNLOCK(lock, QDF_MAX_HOLD_TIME_ALOWED_SPINLOCK_IRQ);
522*5113495bSYour Name 	__qdf_spin_unlock_irqrestore(&lock->lock);
523*5113495bSYour Name }
524*5113495bSYour Name 
525*5113495bSYour Name /**
526*5113495bSYour Name  * qdf_spin_unlock_irq() - Unlock a Spinlock(SMP) & save the restore state
527*5113495bSYour Name  * @lock: Lock object
528*5113495bSYour Name  * @flags: flags
529*5113495bSYour Name  *
530*5113495bSYour Name  * Return: none
531*5113495bSYour Name  */
qdf_spin_unlock_irq(qdf_spinlock_t * lock,unsigned long flags)532*5113495bSYour Name static inline void qdf_spin_unlock_irq(qdf_spinlock_t *lock,
533*5113495bSYour Name 				       unsigned long flags)
534*5113495bSYour Name {
535*5113495bSYour Name 	BEFORE_UNLOCK(lock, QDF_MAX_HOLD_TIME_ALOWED_SPINLOCK_IRQ);
536*5113495bSYour Name 	__qdf_spin_unlock_irq(&lock->lock.spinlock, flags);
537*5113495bSYour Name }
538*5113495bSYour Name 
539*5113495bSYour Name /**
540*5113495bSYour Name  * qdf_semaphore_init() - initialize a semaphore
541*5113495bSYour Name  * @m: Semaphore to initialize
542*5113495bSYour Name  * Return: None
543*5113495bSYour Name  */
qdf_semaphore_init(qdf_semaphore_t * m)544*5113495bSYour Name static inline void qdf_semaphore_init(qdf_semaphore_t *m)
545*5113495bSYour Name {
546*5113495bSYour Name 	__qdf_semaphore_init(m);
547*5113495bSYour Name }
548*5113495bSYour Name 
549*5113495bSYour Name /**
550*5113495bSYour Name  * qdf_semaphore_acquire() - take the semaphore
551*5113495bSYour Name  * @m: Semaphore to take
552*5113495bSYour Name  *
553*5113495bSYour Name  * Return: int
554*5113495bSYour Name  */
qdf_semaphore_acquire(qdf_semaphore_t * m)555*5113495bSYour Name static inline int qdf_semaphore_acquire(qdf_semaphore_t *m)
556*5113495bSYour Name {
557*5113495bSYour Name 	return __qdf_semaphore_acquire(m);
558*5113495bSYour Name }
559*5113495bSYour Name 
560*5113495bSYour Name /**
561*5113495bSYour Name  * qdf_semaphore_release() - give the semaphore
562*5113495bSYour Name  * @m: Semaphore to give
563*5113495bSYour Name  *
564*5113495bSYour Name  * Return: None
565*5113495bSYour Name  */
qdf_semaphore_release(qdf_semaphore_t * m)566*5113495bSYour Name static inline void qdf_semaphore_release(qdf_semaphore_t *m)
567*5113495bSYour Name {
568*5113495bSYour Name 	__qdf_semaphore_release(m);
569*5113495bSYour Name }
570*5113495bSYour Name 
571*5113495bSYour Name /**
572*5113495bSYour Name  * qdf_semaphore_acquire_intr() - Take the semaphore, interruptible
573*5113495bSYour Name  * @m: mutex to take
574*5113495bSYour Name  *
575*5113495bSYour Name  * This function allows a user-space process that is waiting on a
576*5113495bSYour Name  * semaphore to be interrupted by the user.  If the operation is
577*5113495bSYour Name  * interrupted, the function returns a nonzero value, and the caller
578*5113495bSYour Name  * does not hold the semaphore.  Always check the return value and
579*5113495bSYour Name  * responding accordingly.
580*5113495bSYour Name  *
581*5113495bSYour Name  * Return: 0 if the semaphore was acquired, non-zero if not acquired
582*5113495bSYour Name  */
qdf_semaphore_acquire_intr(qdf_semaphore_t * m)583*5113495bSYour Name static inline int qdf_semaphore_acquire_intr(qdf_semaphore_t *m)
584*5113495bSYour Name {
585*5113495bSYour Name 	return __qdf_semaphore_acquire_intr(m);
586*5113495bSYour Name }
587*5113495bSYour Name 
588*5113495bSYour Name #ifdef WLAN_WAKE_LOCK_DEBUG
589*5113495bSYour Name /**
590*5113495bSYour Name  * qdf_wake_lock_check_for_leaks() - assert no wake lock leaks
591*5113495bSYour Name  *
592*5113495bSYour Name  * Return: None
593*5113495bSYour Name  */
594*5113495bSYour Name void qdf_wake_lock_check_for_leaks(void);
595*5113495bSYour Name 
596*5113495bSYour Name /**
597*5113495bSYour Name  * qdf_wake_lock_feature_init() - global init logic for wake lock
598*5113495bSYour Name  *
599*5113495bSYour Name  * Return: None
600*5113495bSYour Name  */
601*5113495bSYour Name void qdf_wake_lock_feature_init(void);
602*5113495bSYour Name 
603*5113495bSYour Name /**
604*5113495bSYour Name  * qdf_wake_lock_feature_deinit() - global de-init logic for wake lock
605*5113495bSYour Name  *
606*5113495bSYour Name  * Return: None
607*5113495bSYour Name  */
608*5113495bSYour Name void qdf_wake_lock_feature_deinit(void);
609*5113495bSYour Name #else
qdf_wake_lock_check_for_leaks(void)610*5113495bSYour Name static inline void qdf_wake_lock_check_for_leaks(void) { }
qdf_wake_lock_feature_init(void)611*5113495bSYour Name static inline void qdf_wake_lock_feature_init(void) { }
qdf_wake_lock_feature_deinit(void)612*5113495bSYour Name static inline void qdf_wake_lock_feature_deinit(void) { }
613*5113495bSYour Name #endif /* WLAN_WAKE_LOCK_DEBUG */
614*5113495bSYour Name 
615*5113495bSYour Name /**
616*5113495bSYour Name  * __qdf_wake_lock_create() - initialize a wake lock
617*5113495bSYour Name  * @lock: The wake lock to initialize
618*5113495bSYour Name  * @name: Name of wake lock
619*5113495bSYour Name  * @func: caller function
620*5113495bSYour Name  * @line: caller line
621*5113495bSYour Name  * Return:
622*5113495bSYour Name  * QDF status success if wake lock is initialized
623*5113495bSYour Name  * QDF status failure if wake lock was not initialized
624*5113495bSYour Name  */
625*5113495bSYour Name QDF_STATUS __qdf_wake_lock_create(qdf_wake_lock_t *lock, const char *name,
626*5113495bSYour Name 				  const char *func, uint32_t line);
627*5113495bSYour Name 
628*5113495bSYour Name /**
629*5113495bSYour Name  * qdf_wake_lock_create() - initialized a wakeup source lock
630*5113495bSYour Name  * @lock: the wakeup source lock to initialize
631*5113495bSYour Name  * @name: the name of wakeup source lock
632*5113495bSYour Name  *
633*5113495bSYour Name  * Return: QDF_STATUS
634*5113495bSYour Name  */
635*5113495bSYour Name #define qdf_wake_lock_create(lock, name) \
636*5113495bSYour Name 	__qdf_wake_lock_create(lock, name, __func__, __LINE__)
637*5113495bSYour Name 
638*5113495bSYour Name /**
639*5113495bSYour Name  * qdf_wake_lock_acquire() - acquires a wake lock
640*5113495bSYour Name  * @lock: The wake lock to acquire
641*5113495bSYour Name  * @reason: Reason for wakelock
642*5113495bSYour Name  *
643*5113495bSYour Name  * Return:
644*5113495bSYour Name  * QDF status success if wake lock is acquired
645*5113495bSYour Name  * QDF status failure if wake lock was not acquired
646*5113495bSYour Name  */
647*5113495bSYour Name QDF_STATUS qdf_wake_lock_acquire(qdf_wake_lock_t *lock, uint32_t reason);
648*5113495bSYour Name 
649*5113495bSYour Name /**
650*5113495bSYour Name  * qdf_wake_lock_name() - This function returns the name of the wakelock
651*5113495bSYour Name  * @lock: Pointer to the wakelock
652*5113495bSYour Name  *
653*5113495bSYour Name  * This function returns the name of the wakelock
654*5113495bSYour Name  *
655*5113495bSYour Name  * Return: Pointer to the name if it is valid or a default string
656*5113495bSYour Name  */
657*5113495bSYour Name const char *qdf_wake_lock_name(qdf_wake_lock_t *lock);
658*5113495bSYour Name 
659*5113495bSYour Name /**
660*5113495bSYour Name  * qdf_wake_lock_timeout_acquire() - acquires a wake lock with a timeout
661*5113495bSYour Name  * @lock: The wake lock to acquire
662*5113495bSYour Name  * @msec: timeout in ms (0 for no timeout)
663*5113495bSYour Name  *
664*5113495bSYour Name  * Return:
665*5113495bSYour Name  * QDF status success if wake lock is acquired
666*5113495bSYour Name  * QDF status failure if wake lock was not acquired
667*5113495bSYour Name  */
668*5113495bSYour Name QDF_STATUS qdf_wake_lock_timeout_acquire(qdf_wake_lock_t *lock,
669*5113495bSYour Name 					 uint32_t msec);
670*5113495bSYour Name 
671*5113495bSYour Name /**
672*5113495bSYour Name  * qdf_wake_lock_release() - releases a wake lock
673*5113495bSYour Name  * @lock: the wake lock to release
674*5113495bSYour Name  * @reason: Reason for wakelock
675*5113495bSYour Name  *
676*5113495bSYour Name  * Return:
677*5113495bSYour Name  * QDF status success if wake lock is acquired
678*5113495bSYour Name  * QDF status failure if wake lock was not acquired
679*5113495bSYour Name  */
680*5113495bSYour Name QDF_STATUS qdf_wake_lock_release(qdf_wake_lock_t *lock, uint32_t reason);
681*5113495bSYour Name 
682*5113495bSYour Name /**
683*5113495bSYour Name  * __qdf_wake_lock_destroy() - destroy a wake lock
684*5113495bSYour Name  * @lock: The wake lock to destroy
685*5113495bSYour Name  * @func: caller function
686*5113495bSYour Name  * @line: caller line
687*5113495bSYour Name  *
688*5113495bSYour Name  * Return: None
689*5113495bSYour Name  */
690*5113495bSYour Name void __qdf_wake_lock_destroy(qdf_wake_lock_t *lock,
691*5113495bSYour Name 			     const char *func, uint32_t line);
692*5113495bSYour Name 
693*5113495bSYour Name /**
694*5113495bSYour Name  * qdf_wake_lock_destroy() - deinitialize a wakeup source lock
695*5113495bSYour Name  * @lock: the wakeup source lock to de-initialize
696*5113495bSYour Name  *
697*5113495bSYour Name  * Return: None
698*5113495bSYour Name  */
699*5113495bSYour Name #define qdf_wake_lock_destroy(lock) \
700*5113495bSYour Name 	__qdf_wake_lock_destroy(lock, __func__, __LINE__)
701*5113495bSYour Name 
702*5113495bSYour Name /**
703*5113495bSYour Name  * qdf_pm_system_wakeup() - wakeup system
704*5113495bSYour Name  *
705*5113495bSYour Name  * Return: None
706*5113495bSYour Name  */
707*5113495bSYour Name void qdf_pm_system_wakeup(void);
708*5113495bSYour Name 
709*5113495bSYour Name /**
710*5113495bSYour Name  * qdf_spinlock_acquire() - acquires a spin lock
711*5113495bSYour Name  * @lock: Spin lock to acquire
712*5113495bSYour Name  *
713*5113495bSYour Name  * Return: QDF status success if wake lock is acquired
714*5113495bSYour Name  */
715*5113495bSYour Name QDF_STATUS qdf_spinlock_acquire(qdf_spinlock_t *lock);
716*5113495bSYour Name 
717*5113495bSYour Name /**
718*5113495bSYour Name  * qdf_spinlock_release() - release a spin lock
719*5113495bSYour Name  * @lock: Spin lock to release
720*5113495bSYour Name  *
721*5113495bSYour Name  * Return: QDF status success if wake lock is acquired
722*5113495bSYour Name  */
723*5113495bSYour Name QDF_STATUS qdf_spinlock_release(qdf_spinlock_t *lock);
724*5113495bSYour Name 
725*5113495bSYour Name /**
726*5113495bSYour Name  * enum qdf_rtpm_call_type - Get and Put calls types
727*5113495bSYour Name  * @QDF_RTPM_GET: Increment usage count and when system is suspended
728*5113495bSYour Name  *               schedule resume process, return depends on pm state.
729*5113495bSYour Name  * @QDF_RTPM_GET_FORCE: Increment usage count and when system is suspended
730*5113495bSYour Name  *                     schedule resume process, returns success irrespective of
731*5113495bSYour Name  *                     pm_state.
732*5113495bSYour Name  * @QDF_RTPM_GET_SYNC: Increment usage count and when system is suspended,
733*5113495bSYour Name  *                    wait till process is resumed.
734*5113495bSYour Name  * @QDF_RTPM_GET_NORESUME: Only increments usage count.
735*5113495bSYour Name  * @QDF_RTPM_PUT: Decrements usage count and puts system in idle state.
736*5113495bSYour Name  * @QDF_RTPM_PUT_SYNC_SUSPEND: Decrements usage count and puts system in
737*5113495bSYour Name  *                            suspended state.
738*5113495bSYour Name  * @QDF_RTPM_PUT_NOIDLE: Decrements usage count.
739*5113495bSYour Name  */
740*5113495bSYour Name enum qdf_rtpm_call_type {
741*5113495bSYour Name 	QDF_RTPM_GET,
742*5113495bSYour Name 	QDF_RTPM_GET_FORCE,
743*5113495bSYour Name 	QDF_RTPM_GET_SYNC,
744*5113495bSYour Name 	QDF_RTPM_GET_NORESUME,
745*5113495bSYour Name 	QDF_RTPM_PUT,
746*5113495bSYour Name 	QDF_RTPM_PUT_SYNC_SUSPEND,
747*5113495bSYour Name 	QDF_RTPM_PUT_NOIDLE,
748*5113495bSYour Name };
749*5113495bSYour Name 
750*5113495bSYour Name /**
751*5113495bSYour Name  * enum qdf_rtpm_client_id - modules registered with runtime pm module
752*5113495bSYour Name  * @QDF_RTPM_ID_RESERVED: Reserved ID
753*5113495bSYour Name  * @QDF_RTPM_ID_PM_QOS_NOTIFY: PM QOS context
754*5113495bSYour Name  * @QDF_RTPM_ID_WIPHY_SUSPEND: APSS Bus suspend context
755*5113495bSYour Name  * @QDF_RTPM_ID_MAX: Max id
756*5113495bSYour Name  */
757*5113495bSYour Name enum qdf_rtpm_client_id {
758*5113495bSYour Name 	QDF_RTPM_ID_RESERVED,
759*5113495bSYour Name 	QDF_RTPM_ID_PM_QOS_NOTIFY,
760*5113495bSYour Name 	QDF_RTPM_ID_WIPHY_SUSPEND,
761*5113495bSYour Name 	QDF_RTPM_ID_MAX
762*5113495bSYour Name };
763*5113495bSYour Name 
764*5113495bSYour Name /**
765*5113495bSYour Name  * qdf_runtime_lock_init() - initialize runtime lock
766*5113495bSYour Name  * @lock: the lock to initialize
767*5113495bSYour Name  *
768*5113495bSYour Name  * Initialize a runtime pm lock.  This lock can be used
769*5113495bSYour Name  * to prevent the runtime pm system from putting the bus
770*5113495bSYour Name  * to sleep.
771*5113495bSYour Name  *
772*5113495bSYour Name  * Return: Success if lock initialized
773*5113495bSYour Name  */
774*5113495bSYour Name #define qdf_runtime_lock_init(lock) __qdf_runtime_lock_init(lock, #lock)
775*5113495bSYour Name 
776*5113495bSYour Name #ifdef FEATURE_RUNTIME_PM
777*5113495bSYour Name /**
778*5113495bSYour Name  * qdf_rtpm_register() - QDF wrapper to register a module with runtime PM.
779*5113495bSYour Name  * @id: ID of the module which needs to be registered
780*5113495bSYour Name  * @hif_rpm_cbk: callback to be called when get was called in suspended state.
781*5113495bSYour Name  *
782*5113495bSYour Name  * Return: success status if registered
783*5113495bSYour Name  */
784*5113495bSYour Name QDF_STATUS qdf_rtpm_register(uint32_t id, void (*hif_rpm_cbk)(void));
785*5113495bSYour Name 
786*5113495bSYour Name /**
787*5113495bSYour Name  * qdf_rtpm_deregister() - QDF wrapper to deregister the module
788*5113495bSYour Name  * @id: ID of the module which needs to be de-registered
789*5113495bSYour Name  *
790*5113495bSYour Name  * Return: success status if successfully de-registered
791*5113495bSYour Name  */
792*5113495bSYour Name QDF_STATUS qdf_rtpm_deregister(uint32_t id);
793*5113495bSYour Name 
794*5113495bSYour Name /**
795*5113495bSYour Name  * __qdf_runtime_lock_init() - initialize runtime lock
796*5113495bSYour Name  * @lock: the lock to initialize
797*5113495bSYour Name  * @name: name of the runtime lock
798*5113495bSYour Name  *
799*5113495bSYour Name  * Initialize a runtime pm lock.  This lock can be used
800*5113495bSYour Name  * to prevent the runtime pm system from putting the bus
801*5113495bSYour Name  * to sleep.
802*5113495bSYour Name  *
803*5113495bSYour Name  * Return: Success if lock initialized
804*5113495bSYour Name  */
805*5113495bSYour Name QDF_STATUS __qdf_runtime_lock_init(qdf_runtime_lock_t *lock, const char *name);
806*5113495bSYour Name 
807*5113495bSYour Name /**
808*5113495bSYour Name  * qdf_runtime_lock_deinit() - deinitialize runtime pm lock
809*5113495bSYour Name  * @lock: the lock to deinitialize
810*5113495bSYour Name  *
811*5113495bSYour Name  * Ensures the lock is released. Frees the runtime lock.
812*5113495bSYour Name  *
813*5113495bSYour Name  * Return: void
814*5113495bSYour Name  */
815*5113495bSYour Name void qdf_runtime_lock_deinit(qdf_runtime_lock_t *lock);
816*5113495bSYour Name 
817*5113495bSYour Name /**
818*5113495bSYour Name  * qdf_rtpm_get() - Increment usage_count on the device to avoid suspend.
819*5113495bSYour Name  * @type: get call types from hif_rpm_type
820*5113495bSYour Name  * @id: ID of the module calling qdf_rtpm_get()
821*5113495bSYour Name  *
822*5113495bSYour Name  * Return: success if a get has been issued, else error code.
823*5113495bSYour Name  */
824*5113495bSYour Name QDF_STATUS qdf_rtpm_get(uint8_t type, uint32_t id);
825*5113495bSYour Name 
826*5113495bSYour Name /**
827*5113495bSYour Name  * qdf_rtpm_put() - Decrement usage_count on the device to avoid suspend.
828*5113495bSYour Name  * @type: put call types from hif_rpm_type
829*5113495bSYour Name  * @id: ID of the module calling qdf_rtpm_put()
830*5113495bSYour Name  *
831*5113495bSYour Name  * Return: success if a put has been issued, else error code.
832*5113495bSYour Name  */
833*5113495bSYour Name QDF_STATUS qdf_rtpm_put(uint8_t type, uint32_t id);
834*5113495bSYour Name 
835*5113495bSYour Name /**
836*5113495bSYour Name  * qdf_runtime_pm_prevent_suspend() - Prevent Runtime suspend
837*5113495bSYour Name  * @lock: runtime PM lock
838*5113495bSYour Name  *
839*5113495bSYour Name  * This function will prevent runtime suspend, by incrementing
840*5113495bSYour Name  * device's usage count.
841*5113495bSYour Name  *
842*5113495bSYour Name  * Return: status
843*5113495bSYour Name  */
844*5113495bSYour Name QDF_STATUS qdf_runtime_pm_prevent_suspend(qdf_runtime_lock_t *lock);
845*5113495bSYour Name 
846*5113495bSYour Name /**
847*5113495bSYour Name  * qdf_runtime_pm_prevent_suspend_sync() - Synchronized Prevent Runtime suspend
848*5113495bSYour Name  * @lock: runtime PM lock
849*5113495bSYour Name  *
850*5113495bSYour Name  * This function will prevent runtime suspend, by incrementing
851*5113495bSYour Name  * device's usage count  and waits till system is in resumed state.
852*5113495bSYour Name  *
853*5113495bSYour Name  * Return: status
854*5113495bSYour Name  */
855*5113495bSYour Name QDF_STATUS qdf_runtime_pm_prevent_suspend_sync(qdf_runtime_lock_t *lock);
856*5113495bSYour Name 
857*5113495bSYour Name /**
858*5113495bSYour Name  * qdf_runtime_pm_allow_suspend() - Allow Runtime suspend
859*5113495bSYour Name  * @lock: runtime PM lock
860*5113495bSYour Name  *
861*5113495bSYour Name  * This function will allow runtime suspend, by decrementing
862*5113495bSYour Name  * device's usage count.
863*5113495bSYour Name  *
864*5113495bSYour Name  * Return: status
865*5113495bSYour Name  */
866*5113495bSYour Name QDF_STATUS qdf_runtime_pm_allow_suspend(qdf_runtime_lock_t *lock);
867*5113495bSYour Name 
868*5113495bSYour Name /**
869*5113495bSYour Name  * qdf_rtpm_sync_resume() - Invoke synchronous runtime resume.
870*5113495bSYour Name  *
871*5113495bSYour Name  * This function will invoke synchronous runtime resume.
872*5113495bSYour Name  *
873*5113495bSYour Name  * Return: Success if state is ON
874*5113495bSYour Name  */
875*5113495bSYour Name QDF_STATUS qdf_rtpm_sync_resume(void);
876*5113495bSYour Name 
877*5113495bSYour Name #else
878*5113495bSYour Name static inline
qdf_rtpm_register(uint32_t id,void (* hif_rpm_cbk)(void))879*5113495bSYour Name QDF_STATUS qdf_rtpm_register(uint32_t id, void (*hif_rpm_cbk)(void))
880*5113495bSYour Name {
881*5113495bSYour Name 	return 0;
882*5113495bSYour Name }
883*5113495bSYour Name 
884*5113495bSYour Name static inline
qdf_rtpm_deregister(uint32_t id)885*5113495bSYour Name QDF_STATUS qdf_rtpm_deregister(uint32_t id)
886*5113495bSYour Name {
887*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
888*5113495bSYour Name }
889*5113495bSYour Name 
890*5113495bSYour Name static inline
__qdf_runtime_lock_init(qdf_runtime_lock_t * lock,const char * name)891*5113495bSYour Name QDF_STATUS __qdf_runtime_lock_init(qdf_runtime_lock_t *lock, const char *name)
892*5113495bSYour Name {
893*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
894*5113495bSYour Name }
895*5113495bSYour Name 
896*5113495bSYour Name static inline
qdf_runtime_lock_deinit(qdf_runtime_lock_t * lock)897*5113495bSYour Name void qdf_runtime_lock_deinit(qdf_runtime_lock_t *lock)
898*5113495bSYour Name {
899*5113495bSYour Name }
900*5113495bSYour Name 
901*5113495bSYour Name static inline
qdf_rtpm_get(uint8_t type,uint32_t id)902*5113495bSYour Name QDF_STATUS qdf_rtpm_get(uint8_t type, uint32_t id)
903*5113495bSYour Name {
904*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
905*5113495bSYour Name }
906*5113495bSYour Name 
907*5113495bSYour Name static inline
qdf_rtpm_put(uint8_t type,uint32_t id)908*5113495bSYour Name QDF_STATUS qdf_rtpm_put(uint8_t type, uint32_t id)
909*5113495bSYour Name {
910*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
911*5113495bSYour Name }
912*5113495bSYour Name 
913*5113495bSYour Name static inline
qdf_runtime_pm_prevent_suspend(qdf_runtime_lock_t * lock)914*5113495bSYour Name QDF_STATUS qdf_runtime_pm_prevent_suspend(qdf_runtime_lock_t *lock)
915*5113495bSYour Name {
916*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
917*5113495bSYour Name }
918*5113495bSYour Name 
919*5113495bSYour Name static inline
qdf_runtime_pm_prevent_suspend_sync(qdf_runtime_lock_t * lock)920*5113495bSYour Name QDF_STATUS qdf_runtime_pm_prevent_suspend_sync(qdf_runtime_lock_t *lock)
921*5113495bSYour Name {
922*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
923*5113495bSYour Name }
924*5113495bSYour Name 
925*5113495bSYour Name static inline
qdf_runtime_pm_allow_suspend(qdf_runtime_lock_t * lock)926*5113495bSYour Name QDF_STATUS qdf_runtime_pm_allow_suspend(qdf_runtime_lock_t *lock)
927*5113495bSYour Name {
928*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
929*5113495bSYour Name }
930*5113495bSYour Name 
931*5113495bSYour Name static inline
qdf_rtpm_sync_resume(void)932*5113495bSYour Name QDF_STATUS qdf_rtpm_sync_resume(void)
933*5113495bSYour Name {
934*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
935*5113495bSYour Name }
936*5113495bSYour Name 
937*5113495bSYour Name #endif /* FEATURE_RUNTIME_PM */
938*5113495bSYour Name 
939*5113495bSYour Name #endif /* _QDF_LOCK_H */
940