qdf_util.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. /*
  2. * Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
  3. *
  4. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  5. *
  6. *
  7. * Permission to use, copy, modify, and/or distribute this software for
  8. * any purpose with or without fee is hereby granted, provided that the
  9. * above copyright notice and this permission notice appear in all
  10. * copies.
  11. *
  12. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  13. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  14. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  15. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  16. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  17. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  18. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  19. * PERFORMANCE OF THIS SOFTWARE.
  20. */
  21. /*
  22. * This file was originally distributed by Qualcomm Atheros, Inc.
  23. * under proprietary terms before Copyright ownership was assigned
  24. * to the Linux Foundation.
  25. */
  26. /**
  27. * DOC: qdf_util.h
  28. * This file defines utility functions.
  29. */
  30. #ifndef _QDF_UTIL_H
  31. #define _QDF_UTIL_H
  32. #include <i_qdf_util.h>
  33. /**
  34. * qdf_unlikely - Compiler-dependent macro denoting code likely to execute
  35. * @_expr: expression to be checked
  36. */
  37. #define qdf_unlikely(_expr) __qdf_unlikely(_expr)
  38. /**
  39. * qdf_likely - Compiler-dependent macro denoting code unlikely to execute
  40. * @_expr: expression to be checked
  41. */
  42. #define qdf_likely(_expr) __qdf_likely(_expr)
  43. /**
  44. * qdf_mb - read + write memory barrier.
  45. */
  46. #define qdf_mb() __qdf_mb()
  47. /**
  48. * qdf_assert - assert "expr" evaluates to false.
  49. */
  50. #ifdef QDF_DEBUG
  51. #define qdf_assert(expr) __qdf_assert(expr)
  52. #else
  53. #define qdf_assert(expr)
  54. #endif /* QDF_DEBUG */
  55. /**
  56. * qdf_assert_always - alway assert "expr" evaluates to false.
  57. */
  58. #define qdf_assert_always(expr) __qdf_assert(expr)
  59. /**
  60. * qdf_target_assert_always - alway target assert "expr" evaluates to false.
  61. */
  62. #define qdf_target_assert_always(expr) __qdf_target_assert(expr)
  63. /**
  64. * QDF_MAX - get maximum of two values
  65. * @_x: 1st arguement
  66. * @_y: 2nd arguement
  67. */
  68. #define QDF_MAX(_x, _y) (((_x) > (_y)) ? (_x) : (_y))
  69. /**
  70. * QDF_MIN - get minimum of two values
  71. * @_x: 1st arguement
  72. * @_y: 2nd arguement
  73. */
  74. #define QDF_MIN(_x, _y) (((_x) < (_y)) ? (_x) : (_y))
  75. /**
  76. * qdf_status_to_os_return - returns the status to OS.
  77. * @status: enum QDF_STATUS
  78. *
  79. * returns: int status success/failure
  80. */
  81. static inline int qdf_status_to_os_return(QDF_STATUS status)
  82. {
  83. return __qdf_status_to_os_return(status);
  84. }
  85. /**
  86. * qdf_container_of - cast a member of a structure out to the containing
  87. * structure
  88. * @ptr: the pointer to the member.
  89. * @type: the type of the container struct this is embedded in.
  90. * @member: the name of the member within the struct.
  91. */
  92. #define qdf_container_of(ptr, type, member) \
  93. __qdf_container_of(ptr, type, member)
  94. /**
  95. * qdf_is_pwr2 - test input value is power of 2 integer
  96. * @value: input integer
  97. */
  98. #define QDF_IS_PWR2(value) (((value) ^ ((value)-1)) == ((value) << 1) - 1)
  99. /**
  100. * qdf_roundup() - roundup the input value
  101. * @x: value to roundup
  102. * @y: input value rounded to multiple of this
  103. *
  104. * Return: rounded value
  105. */
  106. #define qdf_roundup(x, y) __qdf_roundup(x, y)
  107. /**
  108. * qdf_is_macaddr_equal() - compare two QDF MacAddress
  109. * @mac_addr1: Pointer to one qdf MacAddress to compare
  110. * @mac_addr2: Pointer to the other qdf MacAddress to compare
  111. *
  112. * This function returns a bool that tells if a two QDF MacAddress'
  113. * are equivalent.
  114. *
  115. * Return: true if the MacAddress's are equal
  116. * not true if the MacAddress's are not equal
  117. */
  118. static inline bool qdf_is_macaddr_equal(struct qdf_mac_addr *mac_addr1,
  119. struct qdf_mac_addr *mac_addr2)
  120. {
  121. return __qdf_is_macaddr_equal(mac_addr1, mac_addr2);
  122. }
  123. /**
  124. * qdf_is_macaddr_zero() - check for a MacAddress of all zeros.
  125. * @mac_addr: pointer to the struct qdf_mac_addr to check.
  126. *
  127. * This function returns a bool that tells if a MacAddress is made up of
  128. * all zeros.
  129. *
  130. * Return: true if the MacAddress is all Zeros
  131. * false if the MacAddress is not all Zeros.
  132. */
  133. static inline bool qdf_is_macaddr_zero(struct qdf_mac_addr *mac_addr)
  134. {
  135. struct qdf_mac_addr zero_mac_addr = QDF_MAC_ADDR_ZERO_INITIALIZER;
  136. return qdf_is_macaddr_equal(mac_addr, &zero_mac_addr);
  137. }
  138. /**
  139. * qdf_zero_macaddr() - zero out a MacAddress
  140. * @mac_addr: pointer to the struct qdf_mac_addr to zero.
  141. *
  142. * This function zeros out a QDF MacAddress type.
  143. *
  144. * Return: none
  145. */
  146. static inline void qdf_zero_macaddr(struct qdf_mac_addr *mac_addr)
  147. {
  148. __qdf_zero_macaddr(mac_addr);
  149. }
  150. /**
  151. * qdf_is_macaddr_group() - check for a MacAddress is a 'group' address
  152. * @mac_addr1: pointer to the qdf MacAddress to check
  153. *
  154. * This function returns a bool that tells if a the input QDF MacAddress
  155. * is a "group" address. Group addresses have the 'group address bit' turned
  156. * on in the MacAddress. Group addresses are made up of Broadcast and
  157. * Multicast addresses.
  158. *
  159. * Return: true if the input MacAddress is a Group address
  160. * false if the input MacAddress is not a Group address
  161. */
  162. static inline bool qdf_is_macaddr_group(struct qdf_mac_addr *mac_addr)
  163. {
  164. return mac_addr->bytes[0] & 0x01;
  165. }
  166. /**
  167. * qdf_is_macaddr_broadcast() - check for a MacAddress is a broadcast address
  168. * @mac_addr: Pointer to the qdf MacAddress to check
  169. *
  170. * This function returns a bool that tells if a the input QDF MacAddress
  171. * is a "broadcast" address.
  172. *
  173. * Return: true if the input MacAddress is a broadcast address
  174. * flase if the input MacAddress is not a broadcast address
  175. */
  176. static inline bool qdf_is_macaddr_broadcast(struct qdf_mac_addr *mac_addr)
  177. {
  178. struct qdf_mac_addr broadcast_mac_addr =
  179. QDF_MAC_ADDR_BROADCAST_INITIALIZER;
  180. return qdf_is_macaddr_equal(mac_addr, &broadcast_mac_addr);
  181. }
  182. /**
  183. * qdf_copy_macaddr() - copy a QDF MacAddress
  184. * @dst_addr: pointer to the qdf MacAddress to copy TO (the destination)
  185. * @src_addr: pointer to the qdf MacAddress to copy FROM (the source)
  186. *
  187. * This function copies a QDF MacAddress into another QDF MacAddress.
  188. *
  189. * Return: none
  190. */
  191. static inline void qdf_copy_macaddr(struct qdf_mac_addr *dst_addr,
  192. struct qdf_mac_addr *src_addr)
  193. {
  194. *dst_addr = *src_addr;
  195. }
  196. /**
  197. * qdf_set_macaddr_broadcast() - set a QDF MacAddress to the 'broadcast'
  198. * @mac_addr: pointer to the qdf MacAddress to set to broadcast
  199. *
  200. * This function sets a QDF MacAddress to the 'broadcast' MacAddress. Broadcast
  201. * MacAddress contains all 0xFF bytes.
  202. *
  203. * Return: none
  204. */
  205. static inline void qdf_set_macaddr_broadcast(struct qdf_mac_addr *mac_addr)
  206. {
  207. __qdf_set_macaddr_broadcast(mac_addr);
  208. }
  209. /**
  210. * qdf_set_u16() - Assign 16-bit unsigned value to a byte array base on CPU's
  211. * endianness.
  212. * @ptr: Starting address of a byte array
  213. * @value: The value to assign to the byte array
  214. *
  215. * Caller must validate the byte array has enough space to hold the vlaue
  216. *
  217. * Return: The address to the byte after the assignment. This may or may not
  218. * be valid. Caller to verify.
  219. */
  220. static inline uint8_t *qdf_set_u16(uint8_t *ptr, uint16_t value)
  221. {
  222. #if defined(ANI_BIG_BYTE_ENDIAN)
  223. *(ptr) = (uint8_t) (value >> 8);
  224. *(ptr + 1) = (uint8_t) (value);
  225. #else
  226. *(ptr + 1) = (uint8_t) (value >> 8);
  227. *(ptr) = (uint8_t) (value);
  228. #endif
  229. return ptr + 2;
  230. }
  231. /**
  232. * qdf_get_u16() - Retrieve a 16-bit unsigned value from a byte array base on
  233. * CPU's endianness.
  234. * @ptr: Starting address of a byte array
  235. * @value: Pointer to a caller allocated buffer for 16 bit value. Value is to
  236. * assign to this location.
  237. *
  238. * Caller must validate the byte array has enough space to hold the vlaue
  239. *
  240. * Return: The address to the byte after the assignment. This may or may not
  241. * be valid. Caller to verify.
  242. */
  243. static inline uint8_t *qdf_get_u16(uint8_t *ptr, uint16_t *value)
  244. {
  245. #if defined(ANI_BIG_BYTE_ENDIAN)
  246. *value = (((uint16_t) (*ptr << 8)) | ((uint16_t) (*(ptr + 1))));
  247. #else
  248. *value = (((uint16_t) (*(ptr + 1) << 8)) | ((uint16_t) (*ptr)));
  249. #endif
  250. return ptr + 2;
  251. }
  252. /**
  253. * qdf_get_u32() - retrieve a 32-bit unsigned value from a byte array base on
  254. * CPU's endianness.
  255. * @ptr: Starting address of a byte array
  256. * @value: Pointer to a caller allocated buffer for 32 bit value. Value is to
  257. * assign to this location.
  258. *
  259. * Caller must validate the byte array has enough space to hold the vlaue
  260. *
  261. * Return: The address to the byte after the assignment. This may or may not
  262. * be valid. Caller to verify.
  263. */
  264. static inline uint8_t *qdf_get_u32(uint8_t *ptr, uint32_t *value)
  265. {
  266. #if defined(ANI_BIG_BYTE_ENDIAN)
  267. *value = ((uint32_t) (*(ptr) << 24) |
  268. (uint32_t) (*(ptr + 1) << 16) |
  269. (uint32_t) (*(ptr + 2) << 8) | (uint32_t) (*(ptr + 3)));
  270. #else
  271. *value = ((uint32_t) (*(ptr + 3) << 24) |
  272. (uint32_t) (*(ptr + 2) << 16) |
  273. (uint32_t) (*(ptr + 1) << 8) | (uint32_t) (*(ptr)));
  274. #endif
  275. return ptr + 4;
  276. }
  277. /**
  278. * qdf_ntohs - Convert a 16-bit value from network byte order to host byte order
  279. */
  280. #define qdf_ntohs(x) __qdf_ntohs(x)
  281. /**
  282. * qdf_ntohl - Convert a 32-bit value from network byte order to host byte order
  283. */
  284. #define qdf_ntohl(x) __qdf_ntohl(x)
  285. /**
  286. * qdf_htons - Convert a 16-bit value from host byte order to network byte order
  287. */
  288. #define qdf_htons(x) __qdf_htons(x)
  289. /**
  290. * qdf_htonl - Convert a 32-bit value from host byte order to network byte order
  291. */
  292. #define qdf_htonl(x) __qdf_htonl(x)
  293. /**
  294. * qdf_cpu_to_le16 - Convert a 16-bit value from CPU byte order to
  295. * little-endian byte order
  296. */
  297. #define qdf_cpu_to_le16(x) __qdf_cpu_to_le16(x)
  298. /**
  299. * qdf_cpu_to_le32 - Convert a 32-bit value from CPU byte order to
  300. * little-endian byte order
  301. */
  302. #define qdf_cpu_to_le32(x) __qdf_cpu_to_le32(x)
  303. /**
  304. * qdf_cpu_to_le64 - Convert a 64-bit value from CPU byte order to
  305. * little-endian byte order
  306. */
  307. #define qdf_cpu_to_le64(x) __qdf_cpu_to_le64(x)
  308. /**
  309. * qdf_be32_to_cpu - Convert a 32-bit value from big-endian byte order
  310. * to CPU byte order
  311. */
  312. #define qdf_be32_to_cpu(x) __qdf_be32_to_cpu(x)
  313. /**
  314. * qdf_be64_to_cpu - Convert a 64-bit value from big-endian byte order
  315. * to CPU byte order
  316. */
  317. #define qdf_be64_to_cpu(x) __qdf_be64_to_cpu(x)
  318. /**
  319. * qdf_le32_to_cpu - Convert a 32-bit value from little-endian byte
  320. * order to CPU byte order
  321. */
  322. #define qdf_le32_to_cpu(x) __qdf_le32_to_cpu(x)
  323. /**
  324. * qdf_le64_to_cpu - Convert a 64-bit value from little-endian byte
  325. * order to CPU byte order
  326. */
  327. #define qdf_le64_to_cpu(x) __qdf_le64_to_cpu(x)
  328. /**
  329. * qdf_le16_to_cpu - Convert a 16-bit value from little-endian byte order
  330. * to CPU byte order
  331. * @x: value to be converted
  332. */
  333. #define qdf_le16_to_cpu(x) __qdf_le16_to_cpu(x)
  334. /**
  335. * qdf_function - replace with the name of the current function
  336. */
  337. #define qdf_function __qdf_function
  338. /**
  339. * qdf_get_pwr2() - get next power of 2 integer from input value
  340. * @value: input value to find next power of 2 integer
  341. *
  342. * Get next power of 2 integer from input value
  343. *
  344. * Return: Power of 2 integer
  345. */
  346. static inline int qdf_get_pwr2(int value)
  347. {
  348. int log2;
  349. if (QDF_IS_PWR2(value))
  350. return value;
  351. log2 = 0;
  352. while (value) {
  353. value >>= 1;
  354. log2++;
  355. }
  356. return 1 << log2;
  357. }
  358. #endif /*_QDF_UTIL_H*/