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