xref: /wlan-driver/qca-wifi-host-cmn/qdf/linux/src/i_qdf_util.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-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: i_qdf_util.h
22*5113495bSYour Name  * This file provides OS dependent API's.
23*5113495bSYour Name  */
24*5113495bSYour Name 
25*5113495bSYour Name #ifndef _I_QDF_UTIL_H
26*5113495bSYour Name #define _I_QDF_UTIL_H
27*5113495bSYour Name 
28*5113495bSYour Name #include <linux/compiler.h>
29*5113495bSYour Name #include <linux/kernel.h>
30*5113495bSYour Name #include <linux/types.h>
31*5113495bSYour Name #include <linux/mm.h>
32*5113495bSYour Name #include <linux/errno.h>
33*5113495bSYour Name #include <linux/average.h>
34*5113495bSYour Name 
35*5113495bSYour Name #include <linux/random.h>
36*5113495bSYour Name #include <linux/io.h>
37*5113495bSYour Name 
38*5113495bSYour Name #include <qdf_types.h>
39*5113495bSYour Name #include <asm/byteorder.h>
40*5113495bSYour Name 
41*5113495bSYour Name #if LINUX_VERSION_CODE  <= KERNEL_VERSION(3, 3, 8)
42*5113495bSYour Name #include <asm/system.h>
43*5113495bSYour Name #else
44*5113495bSYour Name #if defined(__LINUX_MIPS32_ARCH__) || defined(__LINUX_MIPS64_ARCH__)
45*5113495bSYour Name #include <asm/dec/system.h>
46*5113495bSYour Name #else
47*5113495bSYour Name #endif
48*5113495bSYour Name #endif
49*5113495bSYour Name 
50*5113495bSYour Name #include <qdf_types.h>
51*5113495bSYour Name #include <linux/io.h>
52*5113495bSYour Name #include <asm/byteorder.h>
53*5113495bSYour Name 
54*5113495bSYour Name #ifdef QCA_PARTNER_PLATFORM
55*5113495bSYour Name #include "ath_carr_pltfrm.h"
56*5113495bSYour Name #else
57*5113495bSYour Name #include <linux/byteorder/generic.h>
58*5113495bSYour Name #endif
59*5113495bSYour Name 
60*5113495bSYour Name #include <linux/rcupdate.h>
61*5113495bSYour Name 
62*5113495bSYour Name typedef wait_queue_head_t __qdf_wait_queue_head_t;
63*5113495bSYour Name 
64*5113495bSYour Name /* Generic compiler-dependent macros if defined by the OS */
65*5113495bSYour Name #define __qdf_wait_queue_interruptible(wait_queue, condition) \
66*5113495bSYour Name 	wait_event_interruptible(wait_queue, condition)
67*5113495bSYour Name 
68*5113495bSYour Name #define __qdf_wait_queue_timeout(wait_queue, condition, timeout) \
69*5113495bSYour Name 	wait_event_timeout(wait_queue, condition, timeout)
70*5113495bSYour Name 
71*5113495bSYour Name 
72*5113495bSYour Name #define __qdf_init_waitqueue_head(_q) init_waitqueue_head(_q)
73*5113495bSYour Name 
74*5113495bSYour Name #define __qdf_wake_up_interruptible(_q) wake_up_interruptible(_q)
75*5113495bSYour Name 
76*5113495bSYour Name #define __qdf_wake_up(_q) wake_up(_q)
77*5113495bSYour Name 
78*5113495bSYour Name #define __qdf_wake_up_completion(_q) wake_up_completion(_q)
79*5113495bSYour Name 
80*5113495bSYour Name #define __qdf_unlikely(_expr)   unlikely(_expr)
81*5113495bSYour Name #define __qdf_likely(_expr)     likely(_expr)
82*5113495bSYour Name 
83*5113495bSYour Name #define __qdf_bitmap(name, bits) DECLARE_BITMAP(name, bits)
84*5113495bSYour Name 
85*5113495bSYour Name /**
86*5113495bSYour Name  * __qdf_set_bit() - set bit in address
87*5113495bSYour Name  * @nr: bit number to be set
88*5113495bSYour Name  * @addr: address buffer pointer
89*5113495bSYour Name  *
90*5113495bSYour Name  * Return: none
91*5113495bSYour Name  */
__qdf_set_bit(unsigned int nr,unsigned long * addr)92*5113495bSYour Name static inline void __qdf_set_bit(unsigned int nr, unsigned long *addr)
93*5113495bSYour Name {
94*5113495bSYour Name 	__set_bit(nr, addr);
95*5113495bSYour Name }
96*5113495bSYour Name 
__qdf_clear_bit(unsigned int nr,unsigned long * addr)97*5113495bSYour Name static inline void __qdf_clear_bit(unsigned int nr, unsigned long *addr)
98*5113495bSYour Name {
99*5113495bSYour Name 	__clear_bit(nr, addr);
100*5113495bSYour Name }
101*5113495bSYour Name 
__qdf_test_bit(unsigned int nr,unsigned long * addr)102*5113495bSYour Name static inline bool __qdf_test_bit(unsigned int nr, unsigned long *addr)
103*5113495bSYour Name {
104*5113495bSYour Name 	return test_bit(nr, addr);
105*5113495bSYour Name }
106*5113495bSYour Name 
__qdf_test_and_clear_bit(unsigned int nr,unsigned long * addr)107*5113495bSYour Name static inline bool __qdf_test_and_clear_bit(unsigned int nr,
108*5113495bSYour Name 					unsigned long *addr)
109*5113495bSYour Name {
110*5113495bSYour Name 	return __test_and_clear_bit(nr, addr);
111*5113495bSYour Name }
112*5113495bSYour Name 
__qdf_find_first_bit(unsigned long * addr,unsigned long nbits)113*5113495bSYour Name static inline unsigned long __qdf_find_first_bit(unsigned long *addr,
114*5113495bSYour Name 					unsigned long nbits)
115*5113495bSYour Name {
116*5113495bSYour Name 	return find_first_bit(addr, nbits);
117*5113495bSYour Name }
118*5113495bSYour Name 
__qdf_bitmap_empty(unsigned long * addr,unsigned long nbits)119*5113495bSYour Name static inline bool __qdf_bitmap_empty(unsigned long *addr,
120*5113495bSYour Name 				      unsigned long nbits)
121*5113495bSYour Name {
122*5113495bSYour Name 	return bitmap_empty(addr, nbits);
123*5113495bSYour Name }
124*5113495bSYour Name 
__qdf_bitmap_and(unsigned long * dst,unsigned long * src1,unsigned long * src2,unsigned long nbits)125*5113495bSYour Name static inline int __qdf_bitmap_and(unsigned long *dst, unsigned long *src1,
126*5113495bSYour Name 				   unsigned long *src2, unsigned long nbits)
127*5113495bSYour Name {
128*5113495bSYour Name 	return bitmap_and(dst, src1, src2, nbits);
129*5113495bSYour Name }
130*5113495bSYour Name 
131*5113495bSYour Name /**
132*5113495bSYour Name  * __qdf_set_macaddr_broadcast() - set a QDF MacAddress to the 'broadcast'
133*5113495bSYour Name  * @mac_addr: pointer to the qdf MacAddress to set to broadcast
134*5113495bSYour Name  *
135*5113495bSYour Name  * This function sets a QDF MacAddress to the 'broadcast' MacAddress. Broadcast
136*5113495bSYour Name  * MacAddress contains all 0xFF bytes.
137*5113495bSYour Name  *
138*5113495bSYour Name  * Return: none
139*5113495bSYour Name  */
__qdf_set_macaddr_broadcast(struct qdf_mac_addr * mac_addr)140*5113495bSYour Name static inline void __qdf_set_macaddr_broadcast(struct qdf_mac_addr *mac_addr)
141*5113495bSYour Name {
142*5113495bSYour Name 	memset(mac_addr, 0xff, QDF_MAC_ADDR_SIZE);
143*5113495bSYour Name }
144*5113495bSYour Name 
145*5113495bSYour Name /**
146*5113495bSYour Name  * __qdf_zero_macaddr() - zero out a MacAddress
147*5113495bSYour Name  * @mac_addr: pointer to the struct qdf_mac_addr to zero.
148*5113495bSYour Name  *
149*5113495bSYour Name  * This function zeros out a QDF MacAddress type.
150*5113495bSYour Name  *
151*5113495bSYour Name  * Return: none
152*5113495bSYour Name  */
__qdf_zero_macaddr(struct qdf_mac_addr * mac_addr)153*5113495bSYour Name static inline void __qdf_zero_macaddr(struct qdf_mac_addr *mac_addr)
154*5113495bSYour Name {
155*5113495bSYour Name 	memset(mac_addr, 0, QDF_MAC_ADDR_SIZE);
156*5113495bSYour Name }
157*5113495bSYour Name 
158*5113495bSYour Name /**
159*5113495bSYour Name  * __qdf_is_macaddr_equal() - compare two QDF MacAddress
160*5113495bSYour Name  * @mac_addr1: Pointer to one qdf MacAddress to compare
161*5113495bSYour Name  * @mac_addr2: Pointer to the other qdf MacAddress to compare
162*5113495bSYour Name  *
163*5113495bSYour Name  * This function returns a bool that tells if a two QDF MacAddress'
164*5113495bSYour Name  * are equivalent.
165*5113495bSYour Name  *
166*5113495bSYour Name  * Return: true if the MacAddress's are equal
167*5113495bSYour Name  *      not true if the MacAddress's are not equal
168*5113495bSYour Name  */
__qdf_is_macaddr_equal(const struct qdf_mac_addr * mac_addr1,const struct qdf_mac_addr * mac_addr2)169*5113495bSYour Name static inline bool __qdf_is_macaddr_equal(const struct qdf_mac_addr *mac_addr1,
170*5113495bSYour Name 					  const struct qdf_mac_addr *mac_addr2)
171*5113495bSYour Name {
172*5113495bSYour Name 	return 0 == memcmp(mac_addr1, mac_addr2, QDF_MAC_ADDR_SIZE);
173*5113495bSYour Name }
174*5113495bSYour Name 
175*5113495bSYour Name #define __qdf_in_interrupt in_interrupt
176*5113495bSYour Name 
177*5113495bSYour Name #define __qdf_min(_a, _b) min(_a, _b)
178*5113495bSYour Name #define __qdf_max(_a, _b) max(_a, _b)
179*5113495bSYour Name 
180*5113495bSYour Name /*
181*5113495bSYour Name  * Setting it to blank as feature is not intended to be supported
182*5113495bSYour Name  * on linux version less than 4.3
183*5113495bSYour Name  */
184*5113495bSYour Name #if LINUX_VERSION_CODE  < KERNEL_VERSION(4, 3, 0)
185*5113495bSYour Name #define __QDF_DECLARE_EWMA(name, _factor, _weight)
186*5113495bSYour Name 
187*5113495bSYour Name #define __qdf_ewma_tx_lag int
188*5113495bSYour Name #define __qdf_ewma_rx_rssi int
189*5113495bSYour Name #else
190*5113495bSYour Name #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
191*5113495bSYour Name #define __QDF_DECLARE_EWMA(name, _factor, _weight) \
192*5113495bSYour Name 	DECLARE_EWMA(name, ilog2(_factor), _weight)
193*5113495bSYour Name #else
194*5113495bSYour Name #define __QDF_DECLARE_EWMA(name, _factor, _weight) \
195*5113495bSYour Name 	DECLARE_EWMA(name, _factor, _weight)
196*5113495bSYour Name #endif
197*5113495bSYour Name 
198*5113495bSYour Name #define __qdf_ewma_tx_lag struct ewma_tx_lag
199*5113495bSYour Name #define __qdf_ewma_rx_rssi struct ewma_rx_rssi
200*5113495bSYour Name #endif
201*5113495bSYour Name 
202*5113495bSYour Name #define __qdf_ffz(mask) (~(mask) == 0 ? -1 : ffz(mask))
203*5113495bSYour Name 
204*5113495bSYour Name #define MEMINFO_KB(x)  ((x) << (PAGE_SHIFT - 10))   /* In kilobytes */
205*5113495bSYour Name 
206*5113495bSYour Name #define __qdf_assert(expr)  do { \
207*5113495bSYour Name 		if (unlikely(!(expr))) { \
208*5113495bSYour Name 			pr_err("Assertion failed! %s:%s %s:%d\n", \
209*5113495bSYour Name 			       # expr, __func__, __FILE__, __LINE__); \
210*5113495bSYour Name 			dump_stack(); \
211*5113495bSYour Name 			QDF_BUG_ON_ASSERT(0); \
212*5113495bSYour Name 		} \
213*5113495bSYour Name } while (0)
214*5113495bSYour Name 
215*5113495bSYour Name #define __qdf_assert_with_debug(expr, debug_fp, ...)			\
216*5113495bSYour Name 	do {								\
217*5113495bSYour Name 		typeof(debug_fp) _debug_fp = debug_fp;			\
218*5113495bSYour Name 		if (unlikely(!(expr))) {				\
219*5113495bSYour Name 			pr_err("Assertion failed! %s:%s %s:%d\n",	\
220*5113495bSYour Name 			       # expr, __func__, __FILE__, __LINE__);	\
221*5113495bSYour Name 			if (_debug_fp)					\
222*5113495bSYour Name 				_debug_fp(__VA_ARGS__);			\
223*5113495bSYour Name 			QDF_BUG_ON_ASSERT(0);				\
224*5113495bSYour Name 		}							\
225*5113495bSYour Name 	} while (0)
226*5113495bSYour Name 
227*5113495bSYour Name #define __qdf_target_assert(expr)  do {    \
228*5113495bSYour Name 	if (unlikely(!(expr))) {                                 \
229*5113495bSYour Name 		qdf_err("Assertion failed! %s:%s %s:%d",   \
230*5113495bSYour Name 		#expr, __FUNCTION__, __FILE__, __LINE__);      \
231*5113495bSYour Name 		dump_stack();                                      \
232*5113495bSYour Name 		QDF_DEBUG_PANIC("Take care of the TARGET ASSERT first\n");  \
233*5113495bSYour Name 	}     \
234*5113495bSYour Name } while (0)
235*5113495bSYour Name 
236*5113495bSYour Name #define QDF_COMPILE_TIME_ASSERT(assertion_name, predicate) \
237*5113495bSYour Name     typedef char assertion_name[(predicate) ? 1 : -1]
238*5113495bSYour Name 
239*5113495bSYour Name #define __qdf_container_of(ptr, type, member) container_of(ptr, type, member)
240*5113495bSYour Name 
241*5113495bSYour Name #define __qdf_ntohs                      ntohs
242*5113495bSYour Name #define __qdf_ntohl                      ntohl
243*5113495bSYour Name 
244*5113495bSYour Name #define __qdf_htons                      htons
245*5113495bSYour Name #define __qdf_htonl                      htonl
246*5113495bSYour Name 
247*5113495bSYour Name #define __qdf_cpu_to_le16 cpu_to_le16
248*5113495bSYour Name #define __qdf_cpu_to_le32 cpu_to_le32
249*5113495bSYour Name #define __qdf_cpu_to_le64 cpu_to_le64
250*5113495bSYour Name 
251*5113495bSYour Name #define __qdf_le16_to_cpu le16_to_cpu
252*5113495bSYour Name #define __qdf_le32_to_cpu le32_to_cpu
253*5113495bSYour Name #define __qdf_le64_to_cpu le64_to_cpu
254*5113495bSYour Name 
255*5113495bSYour Name #define __qdf_cpu_to_be16 cpu_to_be16
256*5113495bSYour Name #define __qdf_cpu_to_be32 cpu_to_be32
257*5113495bSYour Name #define __qdf_cpu_to_be64 cpu_to_be64
258*5113495bSYour Name 
259*5113495bSYour Name #define __qdf_be16_to_cpu be16_to_cpu
260*5113495bSYour Name #define __qdf_be32_to_cpu be32_to_cpu
261*5113495bSYour Name #define __qdf_be64_to_cpu be64_to_cpu
262*5113495bSYour Name 
263*5113495bSYour Name #define __qdf_wmb()                wmb()
264*5113495bSYour Name #define __qdf_rmb()                rmb()
265*5113495bSYour Name #define __qdf_mb()                 mb()
266*5113495bSYour Name #define __qdf_ioread32(offset)             ioread32(offset)
267*5113495bSYour Name #define __qdf_iowrite32(offset, value)     iowrite32(value, offset)
268*5113495bSYour Name 
269*5113495bSYour Name #define __qdf_roundup(x, y) roundup(x, y)
270*5113495bSYour Name #define __qdf_ceil(x, y) DIV_ROUND_UP(x, y)
271*5113495bSYour Name #define __qdf_abs(x) abs(x)
272*5113495bSYour Name 
273*5113495bSYour Name #if LINUX_VERSION_CODE  < KERNEL_VERSION(4, 3, 0)
274*5113495bSYour Name #define  __qdf_ewma_tx_lag_init(tx_lag)
275*5113495bSYour Name #define  __qdf_ewma_tx_lag_add(tx_lag, value)
276*5113495bSYour Name #define  __qdf_ewma_tx_lag_read(tx_lag)
277*5113495bSYour Name 
278*5113495bSYour Name #define  __qdf_ewma_rx_rssi_init(rx_rssi)
279*5113495bSYour Name #define  __qdf_ewma_rx_rssi_add(rx_rssi, value)
280*5113495bSYour Name #define  __qdf_ewma_rx_rssi_read(rx_rssi)
281*5113495bSYour Name #else
282*5113495bSYour Name #define  __qdf_ewma_tx_lag_init(tx_lag) \
283*5113495bSYour Name 	ewma_tx_lag_init(tx_lag)
284*5113495bSYour Name 
285*5113495bSYour Name #define  __qdf_ewma_tx_lag_add(tx_lag, value) \
286*5113495bSYour Name 	ewma_tx_lag_add(tx_lag, value)
287*5113495bSYour Name 
288*5113495bSYour Name #define  __qdf_ewma_tx_lag_read(tx_lag) \
289*5113495bSYour Name 	ewma_tx_lag_read(tx_lag)
290*5113495bSYour Name 
291*5113495bSYour Name #define  __qdf_ewma_rx_rssi_init(rx_rssi) \
292*5113495bSYour Name 	ewma_rx_rssi_init(rx_rssi)
293*5113495bSYour Name 
294*5113495bSYour Name #define  __qdf_ewma_rx_rssi_add(rx_rssi, value) \
295*5113495bSYour Name 	ewma_rx_rssi_add(rx_rssi, value)
296*5113495bSYour Name 
297*5113495bSYour Name #define  __qdf_ewma_rx_rssi_read(rx_rssi) \
298*5113495bSYour Name 	ewma_rx_rssi_read(rx_rssi)
299*5113495bSYour Name #endif
300*5113495bSYour Name 
301*5113495bSYour Name #define __qdf_prefetch(x)     prefetch(x)
302*5113495bSYour Name 
303*5113495bSYour Name #ifdef QCA_CONFIG_SMP
304*5113495bSYour Name /**
305*5113495bSYour Name  * __qdf_get_cpu() - get cpu_index
306*5113495bSYour Name  *
307*5113495bSYour Name  * Return: cpu_index
308*5113495bSYour Name  */
309*5113495bSYour Name static inline
__qdf_get_cpu(void)310*5113495bSYour Name int __qdf_get_cpu(void)
311*5113495bSYour Name {
312*5113495bSYour Name 	int cpu_index = get_cpu();
313*5113495bSYour Name 
314*5113495bSYour Name 	put_cpu();
315*5113495bSYour Name 	return cpu_index;
316*5113495bSYour Name }
317*5113495bSYour Name #else
318*5113495bSYour Name static inline
__qdf_get_cpu(void)319*5113495bSYour Name int __qdf_get_cpu(void)
320*5113495bSYour Name {
321*5113495bSYour Name 	return 0;
322*5113495bSYour Name }
323*5113495bSYour Name #endif
324*5113495bSYour Name 
__qdf_device_init_wakeup(__qdf_device_t qdf_dev,bool enable)325*5113495bSYour Name static inline int __qdf_device_init_wakeup(__qdf_device_t qdf_dev, bool enable)
326*5113495bSYour Name {
327*5113495bSYour Name 	return device_init_wakeup(qdf_dev->dev, enable);
328*5113495bSYour Name }
329*5113495bSYour Name 
330*5113495bSYour Name /**
331*5113495bSYour Name  * __qdf_get_totalramsize() -  Get total ram size in Kb
332*5113495bSYour Name  *
333*5113495bSYour Name  * Return: Total ram size in Kb
334*5113495bSYour Name  */
335*5113495bSYour Name static inline uint64_t
__qdf_get_totalramsize(void)336*5113495bSYour Name __qdf_get_totalramsize(void)
337*5113495bSYour Name {
338*5113495bSYour Name 	struct sysinfo meminfo;
339*5113495bSYour Name 
340*5113495bSYour Name 	si_meminfo(&meminfo);
341*5113495bSYour Name 	return MEMINFO_KB(meminfo.totalram);
342*5113495bSYour Name }
343*5113495bSYour Name 
344*5113495bSYour Name /**
345*5113495bSYour Name  * __qdf_get_lower_32_bits() - get lower 32 bits from an address.
346*5113495bSYour Name  * @addr: address
347*5113495bSYour Name  *
348*5113495bSYour Name  * This api returns the lower 32 bits of an address.
349*5113495bSYour Name  *
350*5113495bSYour Name  * Return: lower 32 bits.
351*5113495bSYour Name  */
352*5113495bSYour Name static inline
__qdf_get_lower_32_bits(__qdf_dma_addr_t addr)353*5113495bSYour Name uint32_t __qdf_get_lower_32_bits(__qdf_dma_addr_t addr)
354*5113495bSYour Name {
355*5113495bSYour Name 	return lower_32_bits(addr);
356*5113495bSYour Name }
357*5113495bSYour Name 
358*5113495bSYour Name /**
359*5113495bSYour Name  * __qdf_get_upper_32_bits() - get upper 32 bits from an address.
360*5113495bSYour Name  * @addr: address
361*5113495bSYour Name  *
362*5113495bSYour Name  * This api returns the upper 32 bits of an address.
363*5113495bSYour Name  *
364*5113495bSYour Name  * Return: upper 32 bits.
365*5113495bSYour Name  */
366*5113495bSYour Name static inline
__qdf_get_upper_32_bits(__qdf_dma_addr_t addr)367*5113495bSYour Name uint32_t __qdf_get_upper_32_bits(__qdf_dma_addr_t addr)
368*5113495bSYour Name {
369*5113495bSYour Name 	return upper_32_bits(addr);
370*5113495bSYour Name }
371*5113495bSYour Name 
372*5113495bSYour Name /**
373*5113495bSYour Name  * __qdf_rounddown_pow_of_two() - Round down to nearest power of two
374*5113495bSYour Name  * @n: number to be tested
375*5113495bSYour Name  *
376*5113495bSYour Name  * Test if the input number is power of two, and return the nearest power of two
377*5113495bSYour Name  *
378*5113495bSYour Name  * Return: number rounded down to the nearest power of two
379*5113495bSYour Name  */
380*5113495bSYour Name static inline
__qdf_rounddown_pow_of_two(unsigned long n)381*5113495bSYour Name unsigned long __qdf_rounddown_pow_of_two(unsigned long n)
382*5113495bSYour Name {
383*5113495bSYour Name 	if (is_power_of_2(n))
384*5113495bSYour Name 		return n; /* already a power of 2 */
385*5113495bSYour Name 
386*5113495bSYour Name 	return __rounddown_pow_of_two(n);
387*5113495bSYour Name }
388*5113495bSYour Name 
389*5113495bSYour Name #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
390*5113495bSYour Name 
391*5113495bSYour Name /**
392*5113495bSYour Name  * __qdf_set_dma_coherent_mask() - set max number of bits allowed in dma addr
393*5113495bSYour Name  * @dev: device pointer
394*5113495bSYour Name  * @addr_bits: max number of bits allowed in dma address
395*5113495bSYour Name  *
396*5113495bSYour Name  * This API sets the maximum allowed number of bits in the dma address.
397*5113495bSYour Name  *
398*5113495bSYour Name  * Return: 0 - success, non zero - failure
399*5113495bSYour Name  */
400*5113495bSYour Name static inline
__qdf_set_dma_coherent_mask(struct device * dev,uint8_t addr_bits)401*5113495bSYour Name int __qdf_set_dma_coherent_mask(struct device *dev, uint8_t addr_bits)
402*5113495bSYour Name {
403*5113495bSYour Name 	return dma_set_mask_and_coherent(dev, DMA_BIT_MASK(addr_bits));
404*5113495bSYour Name }
405*5113495bSYour Name 
406*5113495bSYour Name #else
407*5113495bSYour Name 
408*5113495bSYour Name /**
409*5113495bSYour Name  * __qdf_set_dma_coherent_mask() - set max number of bits allowed in dma addr
410*5113495bSYour Name  * @dev: device pointer
411*5113495bSYour Name  * @addr_bits: max number of bits allowed in dma address
412*5113495bSYour Name  *
413*5113495bSYour Name  * This API sets the maximum allowed number of bits in the dma address.
414*5113495bSYour Name  *
415*5113495bSYour Name  * Return: 0 - success, non zero - failure
416*5113495bSYour Name  */
417*5113495bSYour Name static inline
__qdf_set_dma_coherent_mask(struct device * dev,uint8_t addr_bits)418*5113495bSYour Name int __qdf_set_dma_coherent_mask(struct device *dev, uint8_t addr_bits)
419*5113495bSYour Name {
420*5113495bSYour Name 	return dma_set_coherent_mask(dev, DMA_BIT_MASK(addr_bits));
421*5113495bSYour Name }
422*5113495bSYour Name #endif
423*5113495bSYour Name /**
424*5113495bSYour Name  * __qdf_get_random_bytes() - returns nbytes bytes of random data
425*5113495bSYour Name  * @buf: buffer to fill
426*5113495bSYour Name  * @nbytes: number of bytes to fill
427*5113495bSYour Name  *
428*5113495bSYour Name  * Return: void
429*5113495bSYour Name  */
430*5113495bSYour Name static inline
__qdf_get_random_bytes(void * buf,int nbytes)431*5113495bSYour Name void __qdf_get_random_bytes(void *buf, int nbytes)
432*5113495bSYour Name {
433*5113495bSYour Name 	return get_random_bytes(buf, nbytes);
434*5113495bSYour Name }
435*5113495bSYour Name 
436*5113495bSYour Name /**
437*5113495bSYour Name  * __qdf_do_div() - wrapper function for kernel macro(do_div).
438*5113495bSYour Name  * @dividend: Dividend value
439*5113495bSYour Name  * @divisor : Divisor value
440*5113495bSYour Name  *
441*5113495bSYour Name  * Return: Quotient
442*5113495bSYour Name  */
443*5113495bSYour Name static inline
__qdf_do_div(uint64_t dividend,uint32_t divisor)444*5113495bSYour Name uint64_t __qdf_do_div(uint64_t dividend, uint32_t divisor)
445*5113495bSYour Name {
446*5113495bSYour Name 	do_div(dividend, divisor);
447*5113495bSYour Name 	/*do_div macro updates dividend with Quotient of dividend/divisor */
448*5113495bSYour Name 	return dividend;
449*5113495bSYour Name }
450*5113495bSYour Name 
451*5113495bSYour Name /**
452*5113495bSYour Name  * __qdf_do_div_rem() - wrapper function for kernel macro(do_div)
453*5113495bSYour Name  *                      to get remainder.
454*5113495bSYour Name  * @dividend: Dividend value
455*5113495bSYour Name  * @divisor : Divisor value
456*5113495bSYour Name  *
457*5113495bSYour Name  * Return: remainder
458*5113495bSYour Name  */
459*5113495bSYour Name static inline
__qdf_do_div_rem(uint64_t dividend,uint32_t divisor)460*5113495bSYour Name uint64_t __qdf_do_div_rem(uint64_t dividend, uint32_t divisor)
461*5113495bSYour Name {
462*5113495bSYour Name 	return do_div(dividend, divisor);
463*5113495bSYour Name }
464*5113495bSYour Name 
465*5113495bSYour Name /**
466*5113495bSYour Name  * __qdf_hex_to_bin() - Wrapper function to kernel API to get unsigned
467*5113495bSYour Name  * integer from hexa decimal ASCII character.
468*5113495bSYour Name  * @ch: hexa decimal ASCII character
469*5113495bSYour Name  *
470*5113495bSYour Name  * Return: For hexa decimal ASCII char return actual decimal value
471*5113495bSYour Name  *	   else -1 for bad input.
472*5113495bSYour Name  */
473*5113495bSYour Name static inline
__qdf_hex_to_bin(char ch)474*5113495bSYour Name int __qdf_hex_to_bin(char ch)
475*5113495bSYour Name {
476*5113495bSYour Name 	return hex_to_bin(ch);
477*5113495bSYour Name }
478*5113495bSYour Name 
479*5113495bSYour Name /**
480*5113495bSYour Name  * __qdf_hex_str_to_binary() - Wrapper function to get array of unsigned
481*5113495bSYour Name  * integers from string of hexa decimal ASCII characters.
482*5113495bSYour Name  * @dst: output array to hold converted values
483*5113495bSYour Name  * @src: input string of hexa decimal ASCII characters
484*5113495bSYour Name  * @count: size of dst string
485*5113495bSYour Name  *
486*5113495bSYour Name  * Return: For a string of hexa decimal ASCII characters return 0
487*5113495bSYour Name  *	   else -1 for bad input.
488*5113495bSYour Name  */
489*5113495bSYour Name static inline
__qdf_hex_str_to_binary(u8 * dst,const char * src,size_t count)490*5113495bSYour Name int __qdf_hex_str_to_binary(u8 *dst, const char *src, size_t count)
491*5113495bSYour Name {
492*5113495bSYour Name 	return hex2bin(dst, src, count);
493*5113495bSYour Name }
494*5113495bSYour Name 
495*5113495bSYour Name /**
496*5113495bSYour Name  * __qdf_fls() - find last set bit in a given 32 bit input
497*5113495bSYour Name  * @x: 32 bit mask
498*5113495bSYour Name  *
499*5113495bSYour Name  * Return: zero if the input is zero, otherwise returns the bit
500*5113495bSYour Name  * position of the last set bit, where the LSB is 1 and MSB is 32.
501*5113495bSYour Name  */
502*5113495bSYour Name static inline
__qdf_fls(uint32_t x)503*5113495bSYour Name int __qdf_fls(uint32_t x)
504*5113495bSYour Name {
505*5113495bSYour Name 	return fls(x);
506*5113495bSYour Name }
507*5113495bSYour Name 
508*5113495bSYour Name /**
509*5113495bSYour Name  * __qdf_ffs() - find first set bit in a given 32 bit input
510*5113495bSYour Name  * @x: 32 bit mask
511*5113495bSYour Name  *
512*5113495bSYour Name  * Return: zero if the input is zero, otherwise returns the bit
513*5113495bSYour Name  * position of the first set bit, where the LSB is 1 and MSB is 32.
514*5113495bSYour Name  */
515*5113495bSYour Name static inline
__qdf_ffs(uint32_t x)516*5113495bSYour Name int __qdf_ffs(uint32_t x)
517*5113495bSYour Name {
518*5113495bSYour Name 	return ffs(x);
519*5113495bSYour Name }
520*5113495bSYour Name 
521*5113495bSYour Name /**
522*5113495bSYour Name  * __qdf_get_smp_processor_id() - Get the current CPU id
523*5113495bSYour Name  *
524*5113495bSYour Name  * Return: current CPU id
525*5113495bSYour Name  */
__qdf_get_smp_processor_id(void)526*5113495bSYour Name static inline int __qdf_get_smp_processor_id(void)
527*5113495bSYour Name {
528*5113495bSYour Name 	return smp_processor_id();
529*5113495bSYour Name }
530*5113495bSYour Name 
531*5113495bSYour Name /**
532*5113495bSYour Name  * __qdf_in_atomic: Check whether current thread running in atomic context
533*5113495bSYour Name  *
534*5113495bSYour Name  * Return: true if current thread is running in the atomic context
535*5113495bSYour Name  *	   else it will be return false.
536*5113495bSYour Name  */
__qdf_in_atomic(void)537*5113495bSYour Name static inline bool __qdf_in_atomic(void)
538*5113495bSYour Name {
539*5113495bSYour Name 	if (in_interrupt() || !preemptible() || rcu_preempt_depth())
540*5113495bSYour Name 		return true;
541*5113495bSYour Name 
542*5113495bSYour Name 	return false;
543*5113495bSYour Name }
544*5113495bSYour Name 
545*5113495bSYour Name #endif /*_I_QDF_UTIL_H*/
546