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 */ 92 static inline void __qdf_set_bit(unsigned int nr, unsigned long *addr) 93 { 94 __set_bit(nr, addr); 95 } 96 97 static inline void __qdf_clear_bit(unsigned int nr, unsigned long *addr) 98 { 99 __clear_bit(nr, addr); 100 } 101 102 static inline bool __qdf_test_bit(unsigned int nr, unsigned long *addr) 103 { 104 return test_bit(nr, addr); 105 } 106 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 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 119 static inline bool __qdf_bitmap_empty(unsigned long *addr, 120 unsigned long nbits) 121 { 122 return bitmap_empty(addr, nbits); 123 } 124 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 */ 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 */ 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 */ 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 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 319 int __qdf_get_cpu(void) 320 { 321 return 0; 322 } 323 #endif 324 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 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 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 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 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 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 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 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 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 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 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 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 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 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 */ 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 */ 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