hal_be_rx.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. /*
  2. * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for
  5. * any purpose with or without fee is hereby granted, provided that the
  6. * above copyright notice and this permission notice appear in all
  7. * copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  10. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  11. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  12. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  14. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  15. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  16. * PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. #ifndef _HAL_BE_RX_H_
  19. #define _HAL_BE_RX_H_
  20. #include "hal_be_hw_headers.h"
  21. #include "hal_rx.h"
  22. /*
  23. * macro to set the cookie into the rxdma ring entry
  24. */
  25. #define HAL_RXDMA_COOKIE_SET(buff_addr_info, cookie) \
  26. ((*(((unsigned int *)buff_addr_info) + \
  27. (BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_OFFSET >> 2))) &= \
  28. ~BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_MASK); \
  29. ((*(((unsigned int *)buff_addr_info) + \
  30. (BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_OFFSET >> 2))) |= \
  31. (cookie << BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_LSB) & \
  32. BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_MASK)
  33. /*
  34. * macro to set the manager into the rxdma ring entry
  35. */
  36. #define HAL_RXDMA_MANAGER_SET(buff_addr_info, manager) \
  37. ((*(((unsigned int *)buff_addr_info) + \
  38. (BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_OFFSET >> 2))) &= \
  39. ~BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_MASK); \
  40. ((*(((unsigned int *)buff_addr_info) + \
  41. (BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_OFFSET >> 2))) |= \
  42. (manager << BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_LSB) & \
  43. BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_MASK)
  44. #define HAL_RX_ERROR_STATUS_GET(reo_desc) \
  45. (_HAL_MS((*_OFFSET_TO_WORD_PTR(reo_desc, \
  46. REO_DESTINATION_RING_REO_PUSH_REASON_OFFSET)),\
  47. REO_DESTINATION_RING_REO_PUSH_REASON_MASK, \
  48. REO_DESTINATION_RING_REO_PUSH_REASON_LSB))
  49. #define HAL_RX_BUF_COOKIE_GET(buff_addr_info) \
  50. (_HAL_MS((*_OFFSET_TO_WORD_PTR(buff_addr_info, \
  51. BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_OFFSET)), \
  52. BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_MASK, \
  53. BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_LSB))
  54. #define HAL_RX_BUF_RBM_GET(buff_addr_info) \
  55. (_HAL_MS((*_OFFSET_TO_WORD_PTR(buff_addr_info, \
  56. BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_OFFSET)),\
  57. BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_MASK, \
  58. BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_LSB))
  59. /* TODO: Convert the following structure fields accesseses to offsets */
  60. #define HAL_RX_REO_BUF_COOKIE_GET(reo_desc) \
  61. (HAL_RX_BUF_COOKIE_GET(& \
  62. (((struct reo_destination_ring *) \
  63. reo_desc)->buf_or_link_desc_addr_info)))
  64. #define HAL_RX_MSDU_DESC_IP_CHKSUM_FAIL_GET(msdu_desc_info_ptr) \
  65. (_HAL_MS((*_OFFSET_TO_WORD_PTR((msdu_desc_info_ptr), \
  66. RX_MSDU_DESC_INFO_IP_CHKSUM_FAIL_OFFSET)), \
  67. RX_MSDU_DESC_INFO_IP_CHKSUM_FAIL_MASK, \
  68. RX_MSDU_DESC_INFO_IP_CHKSUM_FAIL_LSB))
  69. #define HAL_RX_REO_IP_CHKSUM_FAIL_GET(ring_desc) \
  70. (HAL_RX_MSDU_DESC_IP_CHKSUM_FAIL_GET(& \
  71. ((struct reo_destination_ring *)ring_desc)->rx_msdu_desc_info_details))
  72. #define HAL_RX_MSDU_DESC_TCP_UDP_CHKSUM_FAIL_GET(msdu_desc_info_ptr) \
  73. (_HAL_MS((*_OFFSET_TO_WORD_PTR((msdu_desc_info_ptr), \
  74. RX_MSDU_DESC_INFO_TCP_UDP_CHKSUM_FAIL_OFFSET)), \
  75. RX_MSDU_DESC_INFO_TCP_UDP_CHKSUM_FAIL_MASK, \
  76. RX_MSDU_DESC_INFO_TCP_UDP_CHKSUM_FAIL_LSB))
  77. #define HAL_RX_REO_TCP_UDP_CHKSUM_FAIL_GET(ring_desc) \
  78. (HAL_RX_MSDU_DESC_TCP_UDP_CHKSUM_FAIL_GET(& \
  79. ((struct reo_destination_ring *)ring_desc)->rx_msdu_desc_info_details))
  80. #define HAL_RX_MSDU_DESC_AMPDU_FLAG_GET(mpdu_info_ptr) \
  81. (_HAL_MS((*_OFFSET_TO_WORD_PTR((mpdu_info_ptr), \
  82. RX_MPDU_DESC_INFO_AMPDU_FLAG_OFFSET)), \
  83. RX_MPDU_DESC_INFO_AMPDU_FLAG_MASK, \
  84. RX_MPDU_DESC_INFO_AMPDU_FLAG_LSB))
  85. #define HAL_RX_MPDU_DESC_PEER_META_DATA_GET(mpdu_info_ptr) \
  86. ((mpdu_info_ptr \
  87. [RX_MPDU_DESC_INFO_PEER_META_DATA_OFFSET >> 2] & \
  88. RX_MPDU_DESC_INFO_PEER_META_DATA_MASK) >> \
  89. RX_MPDU_DESC_INFO_PEER_META_DATA_LSB)
  90. #define HAL_RX_MPDU_MSDU_COUNT_GET(mpdu_info_ptr) \
  91. ((mpdu_info_ptr[RX_MPDU_DESC_INFO_MSDU_COUNT_OFFSET >> 2] & \
  92. RX_MPDU_DESC_INFO_MSDU_COUNT_MASK) >> \
  93. RX_MPDU_DESC_INFO_MSDU_COUNT_LSB)
  94. #define HAL_RX_MPDU_FRAGMENT_FLAG_GET(mpdu_info_ptr) \
  95. (mpdu_info_ptr[RX_MPDU_DESC_INFO_FRAGMENT_FLAG_OFFSET >> 2] & \
  96. RX_MPDU_DESC_INFO_FRAGMENT_FLAG_MASK)
  97. #define HAL_RX_MPDU_RETRY_BIT_GET(mpdu_info_ptr) \
  98. (mpdu_info_ptr[RX_MPDU_DESC_INFO_MPDU_RETRY_BIT_OFFSET >> 2] & \
  99. RX_MPDU_DESC_INFO_MPDU_RETRY_BIT_MASK)
  100. #define HAL_RX_MPDU_AMPDU_FLAG_GET(mpdu_info_ptr) \
  101. (mpdu_info_ptr[RX_MPDU_DESC_INFO_AMPDU_FLAG_OFFSET >> 2] & \
  102. RX_MPDU_DESC_INFO_AMPDU_FLAG_MASK)
  103. #define HAL_RX_MPDU_RAW_MPDU_GET(mpdu_info_ptr) \
  104. (mpdu_info_ptr[RX_MPDU_DESC_INFO_RAW_MPDU_OFFSET >> 2] & \
  105. RX_MPDU_DESC_INFO_RAW_MPDU_MASK)
  106. #define HAL_RX_MPDU_BAR_FRAME_GET(mpdu_info_ptr) \
  107. ((mpdu_info_ptr[RX_MPDU_DESC_INFO_BAR_FRAME_OFFSET >> 2] & \
  108. RX_MPDU_DESC_INFO_BAR_FRAME_MASK) >> \
  109. RX_MPDU_DESC_INFO_BAR_FRAME_LSB)
  110. /*
  111. * NOTE: None of the following _GET macros need a right
  112. * shift by the corresponding _LSB. This is because, they are
  113. * finally taken and "OR'ed" into a single word again.
  114. */
  115. #define HAL_RX_MSDU_CONTINUATION_FLAG_SET(msdu_info_ptr, val) \
  116. ((*(((uint32_t *)msdu_info_ptr) + \
  117. (RX_MSDU_DESC_INFO_MSDU_CONTINUATION_OFFSET >> 2))) |= \
  118. ((val) << RX_MSDU_DESC_INFO_MSDU_CONTINUATION_LSB) & \
  119. RX_MSDU_DESC_INFO_MSDU_CONTINUATION_MASK)
  120. #define HAL_RX_MSDU_CONTINUATION_FLAG_GET(msdu_info_ptr) \
  121. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  122. RX_MSDU_DESC_INFO_MSDU_CONTINUATION_OFFSET)) & \
  123. RX_MSDU_DESC_INFO_MSDU_CONTINUATION_MASK)
  124. #define HAL_RX_MSDU_REO_DST_IND_GET(msdu_info_ptr) \
  125. (_HAL_MS((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  126. RX_MSDU_EXT_DESC_INFO_REO_DESTINATION_INDICATION_OFFSET)), \
  127. RX_MSDU_EXT_DESC_INFO_REO_DESTINATION_INDICATION_MASK, \
  128. RX_MSDU_EXT_DESC_INFO_REO_DESTINATION_INDICATION_LSB))
  129. #define HAL_RX_MSDU_SA_IS_VALID_FLAG_GET(msdu_info_ptr) \
  130. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  131. RX_MSDU_DESC_INFO_SA_IS_VALID_OFFSET)) & \
  132. RX_MSDU_DESC_INFO_SA_IS_VALID_MASK)
  133. #define HAL_RX_MSDU_DA_IS_VALID_FLAG_GET(msdu_info_ptr) \
  134. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  135. RX_MSDU_DESC_INFO_DA_IS_VALID_OFFSET)) & \
  136. RX_MSDU_DESC_INFO_DA_IS_VALID_MASK)
  137. #define HAL_RX_MSDU_DA_IS_MCBC_FLAG_GET(msdu_info_ptr) \
  138. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  139. RX_MSDU_DESC_INFO_DA_IS_MCBC_OFFSET)) & \
  140. RX_MSDU_DESC_INFO_DA_IS_MCBC_MASK)
  141. #define HAL_RX_MPDU_ENCRYPT_TYPE_GET(_rx_mpdu_info) \
  142. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info, \
  143. RX_MPDU_INFO_ENCRYPT_TYPE_OFFSET)), \
  144. RX_MPDU_INFO_ENCRYPT_TYPE_MASK, \
  145. RX_MPDU_INFO_ENCRYPT_TYPE_LSB))
  146. #define HAL_RX_MSDU_DESC_INFO_SET(_msdu_info_ptr, _field, _val) \
  147. HAL_RX_FLD_SET(_msdu_info_ptr, RX_MSDU_DESC_INFO, \
  148. _field, _val)
  149. #define HAL_RX_MPDU_DESC_INFO_SET(_mpdu_info_ptr, _field, _val) \
  150. HAL_RX_FLD_SET(_mpdu_info_ptr, RX_MPDU_DESC_INFO, \
  151. _field, _val)
  152. #define HAL_RX_REO_MSDU_REO_DST_IND_GET(reo_desc) \
  153. (HAL_RX_MSDU_REO_DST_IND_GET(& \
  154. (((struct reo_destination_ring *) \
  155. reo_desc)->rx_msdu_desc_info_details)))
  156. /**
  157. * enum hal_be_rx_wbm_error_source: Indicates which module initiated the
  158. * release of this buffer or descriptor
  159. *
  160. * @ HAL_BE_RX_WBM_ERR_SRC_RXDMA: RXDMA released this buffer or descriptor
  161. * @ HAL_BE_RX_WBM_ERR_SRC_REO: REO released this buffer or descriptor
  162. * @ HAL_BE_RX_WBM_ERR_SRC_FW_RX: FW released this buffer or descriptor from the
  163. * RX path
  164. * @ HAL_BE_RX_WBM_ERR_SRC_SW_RX: SW released this buffer or descriptor from the
  165. * RX path
  166. * @ HAL_BE_RX_WBM_ERR_SRC_TQM : TQM released this buffer or descriptor
  167. * @ HAL_BE_RX_WBM_ERR_SRC_FW_TX: FW released this buffer or descriptor from the
  168. * RX path
  169. * @ HAL_BE_RX_WBM_ERR_SRC_SW_TX: SW released this buffer or descriptor from the
  170. * RX path
  171. */
  172. enum hal_be_rx_wbm_error_source {
  173. HAL_BE_RX_WBM_ERR_SRC_RXDMA = 0,
  174. HAL_BE_RX_WBM_ERR_SRC_REO,
  175. HAL_BE_RX_WBM_ERR_SRC_FW_RX,
  176. HAL_BE_RX_WBM_ERR_SRC_SW_RX,
  177. HAL_BE_RX_WBM_ERR_SRC_TQM,
  178. HAL_BE_RX_WBM_ERR_SRC_FW_TX,
  179. HAL_BE_RX_WBM_ERR_SRC_SW_TX,
  180. };
  181. /**
  182. * enum hal_be_wbm_release_dir - Direction of the buffer which was released to
  183. * wbm.
  184. * @HAL_BE_WBM_RELEASE_DIR_RX: Buffer released to WBM due to error
  185. * @HAL_BE_WBM_RELEASE_DIR_TX: Buffer released to WBM from TX path
  186. */
  187. enum hal_be_wbm_release_dir {
  188. HAL_BE_WBM_RELEASE_DIR_RX,
  189. HAL_BE_WBM_RELEASE_DIR_TX,
  190. };
  191. static inline uint32_t hal_rx_get_mpdu_flags(uint32_t *mpdu_info)
  192. {
  193. uint32_t mpdu_flags = 0;
  194. if (HAL_RX_MPDU_FRAGMENT_FLAG_GET(mpdu_info))
  195. mpdu_flags |= HAL_MPDU_F_FRAGMENT;
  196. if (HAL_RX_MPDU_RETRY_BIT_GET(mpdu_info))
  197. mpdu_flags |= HAL_MPDU_F_RETRY_BIT;
  198. if (HAL_RX_MPDU_AMPDU_FLAG_GET(mpdu_info))
  199. mpdu_flags |= HAL_MPDU_F_AMPDU_FLAG;
  200. if (HAL_RX_MPDU_RAW_MPDU_GET(mpdu_info))
  201. mpdu_flags |= HAL_MPDU_F_RAW_AMPDU;
  202. return mpdu_flags;
  203. }
  204. /*******************************************************************************
  205. * RX REO ERROR APIS
  206. ******************************************************************************/
  207. #define HAL_RX_REO_BUF_TYPE_GET(reo_desc) (((*(((uint32_t *)reo_desc) + \
  208. (REO_DESTINATION_RING_REO_DEST_BUFFER_TYPE_OFFSET >> 2))) & \
  209. REO_DESTINATION_RING_REO_DEST_BUFFER_TYPE_MASK) >> \
  210. REO_DESTINATION_RING_REO_DEST_BUFFER_TYPE_LSB)
  211. #define HAL_RX_REO_QUEUE_NUMBER_GET(reo_desc) (((*(((uint32_t *)reo_desc) + \
  212. (REO_DESTINATION_RING_RX_MPDU_DESC_INFO_DETAILS_TID_OFFSET >> 2))) & \
  213. REO_DESTINATION_RING_RX_MPDU_DESC_INFO_DETAILS_TID_MASK) >> \
  214. REO_DESTINATION_RING_RX_MPDU_DESC_INFO_DETAILS_TID_LSB)
  215. #define HAL_RX_REO_ERROR_GET(reo_desc) (((*(((uint32_t *)reo_desc) + \
  216. (REO_DESTINATION_RING_REO_ERROR_CODE_OFFSET >> 2))) & \
  217. REO_DESTINATION_RING_REO_ERROR_CODE_MASK) >> \
  218. REO_DESTINATION_RING_REO_ERROR_CODE_LSB)
  219. /*
  220. * hal_rx_msdu_link_desc_reinject: Re-injects the MSDU link descriptor to
  221. * REO entrance ring
  222. *
  223. * @ soc: HAL version of the SOC pointer
  224. * @ pa: Physical address of the MSDU Link Descriptor
  225. * @ cookie: SW cookie to get to the virtual address
  226. * @ error_enabled_reo_q: Argument to determine whether this needs to go
  227. * to the error enabled REO queue
  228. *
  229. * Return: void
  230. */
  231. static inline void
  232. hal_rx_msdu_link_desc_reinject(struct hal_soc *soc, uint64_t pa,
  233. uint32_t cookie, bool error_enabled_reo_q)
  234. {
  235. /* TODO */
  236. }
  237. #ifdef DP_HW_COOKIE_CONVERT_EXCEPTION
  238. /* HW set dowrd-2 bit16 to 1 if HW CC is done */
  239. #define HAL_WBM2SW_COMPLETION_RING_RX_CC_DONE_OFFSET 0x8
  240. #define HAL_WBM2SW_COMPLETION_RING_RX_CC_DONE_MASK 0x10000
  241. #define HAL_WBM2SW_COMPLETION_RING_RX_CC_DONE_LSB 0x10
  242. /**
  243. * hal_rx_wbm_get_cookie_convert_done() - Get cookie conversion done flag
  244. * @hal_desc: wbm Rx ring descriptor pointer
  245. *
  246. * This function will get the bit value that indicate HW cookie
  247. * conversion done or not
  248. *
  249. * Return: 1 - HW cookie conversion done, 0 - not
  250. */
  251. static inline uint8_t hal_rx_wbm_get_cookie_convert_done(void *hal_desc)
  252. {
  253. return HAL_RX_GET(hal_desc, HAL_WBM2SW_COMPLETION_RING_RX,
  254. CC_DONE);
  255. }
  256. #endif
  257. /**
  258. * hal_rx_wbm_get_desc_va() - Get Desc virtual address within WBM Desc
  259. * @hal_desc: RX WBM2SW ring descriptor pointer
  260. *
  261. * Return: RX descriptor virtual address
  262. */
  263. static inline uintptr_t hal_rx_wbm_get_desc_va(void *hal_desc)
  264. {
  265. uint64_t va_from_desc;
  266. va_from_desc = HAL_RX_GET(hal_desc,
  267. WBM2SW_COMPLETION_RING_RX,
  268. BUFFER_VIRT_ADDR_31_0) |
  269. (((uint64_t)HAL_RX_GET(hal_desc,
  270. WBM2SW_COMPLETION_RING_RX,
  271. BUFFER_VIRT_ADDR_63_32)) << 32);
  272. return (uintptr_t)va_from_desc;
  273. }
  274. #define HAL_RX_WBM_FIRST_MSDU_GET(wbm_desc) \
  275. (((*(((uint32_t *)wbm_desc) + \
  276. (WBM_RELEASE_RING_FIRST_MSDU_OFFSET >> 2))) & \
  277. WBM_RELEASE_RING_FIRST_MSDU_MASK) >> \
  278. WBM_RELEASE_RING_FIRST_MSDU_LSB)
  279. #define HAL_RX_WBM_LAST_MSDU_GET(wbm_desc) \
  280. (((*(((uint32_t *)wbm_desc) + \
  281. (WBM_RELEASE_RING_LAST_MSDU_OFFSET >> 2))) & \
  282. WBM_RELEASE_RING_LAST_MSDU_MASK) >> \
  283. WBM_RELEASE_RING_LAST_MSDU_LSB)
  284. #define HAL_RX_WBM_BUF_COOKIE_GET(wbm_desc) \
  285. HAL_RX_BUF_COOKIE_GET(&((struct wbm_release_ring *) \
  286. wbm_desc)->released_buff_or_desc_addr_info)
  287. /**
  288. * hal_rx_msdu_flags_get_be() - Get msdu flags from ring desc
  289. * @msdu_desc_info_hdl: msdu desc info handle
  290. *
  291. * Return: msdu flags
  292. */
  293. static inline
  294. uint32_t hal_rx_msdu_flags_get_be(rx_msdu_desc_info_t msdu_desc_info_hdl)
  295. {
  296. struct rx_msdu_desc_info *msdu_desc_info =
  297. (struct rx_msdu_desc_info *)msdu_desc_info_hdl;
  298. uint32_t flags = 0;
  299. if (HAL_RX_FIRST_MSDU_IN_MPDU_FLAG_GET(msdu_desc_info))
  300. flags |= HAL_MSDU_F_FIRST_MSDU_IN_MPDU;
  301. if (HAL_RX_LAST_MSDU_IN_MPDU_FLAG_GET(msdu_desc_info))
  302. flags |= HAL_MSDU_F_LAST_MSDU_IN_MPDU;
  303. if (HAL_RX_MSDU_CONTINUATION_FLAG_GET(msdu_desc_info))
  304. flags |= HAL_MSDU_F_MSDU_CONTINUATION;
  305. if (HAL_RX_MSDU_SA_IS_VALID_FLAG_GET(msdu_desc_info))
  306. flags |= HAL_MSDU_F_SA_IS_VALID;
  307. if (HAL_RX_MSDU_DA_IS_VALID_FLAG_GET(msdu_desc_info))
  308. flags |= HAL_MSDU_F_DA_IS_VALID;
  309. if (HAL_RX_MSDU_DA_IS_MCBC_FLAG_GET(msdu_desc_info))
  310. flags |= HAL_MSDU_F_DA_IS_MCBC;
  311. return flags;
  312. }
  313. static inline
  314. void hal_rx_mpdu_desc_info_get_be(void *desc_addr,
  315. void *mpdu_desc_info_hdl)
  316. {
  317. struct reo_destination_ring *reo_dst_ring;
  318. struct hal_rx_mpdu_desc_info *mpdu_desc_info =
  319. (struct hal_rx_mpdu_desc_info *)mpdu_desc_info_hdl;
  320. uint32_t *mpdu_info;
  321. reo_dst_ring = (struct reo_destination_ring *)desc_addr;
  322. mpdu_info = (uint32_t *)&reo_dst_ring->rx_mpdu_desc_info_details;
  323. mpdu_desc_info->msdu_count = HAL_RX_MPDU_MSDU_COUNT_GET(mpdu_info);
  324. mpdu_desc_info->mpdu_flags = hal_rx_get_mpdu_flags(mpdu_info);
  325. mpdu_desc_info->peer_meta_data =
  326. HAL_RX_MPDU_DESC_PEER_META_DATA_GET(mpdu_info);
  327. mpdu_desc_info->bar_frame = HAL_RX_MPDU_BAR_FRAME_GET(mpdu_info);
  328. }
  329. /*
  330. *hal_rx_msdu_desc_info_get_be: Gets the flags related to MSDU descriptor.
  331. *@desc_addr: REO ring descriptor addr
  332. *@msdu_desc_info: Holds MSDU descriptor info from HAL Rx descriptor
  333. *
  334. * Specifically flags needed are: first_msdu_in_mpdu,
  335. * last_msdu_in_mpdu, msdu_continuation, sa_is_valid,
  336. * sa_idx_timeout, da_is_valid, da_idx_timeout, da_is_MCBC
  337. *
  338. *Return: void
  339. */
  340. static inline void
  341. hal_rx_msdu_desc_info_get_be(void *desc_addr,
  342. struct hal_rx_msdu_desc_info *msdu_desc_info)
  343. {
  344. struct reo_destination_ring *reo_dst_ring;
  345. uint32_t *msdu_info;
  346. reo_dst_ring = (struct reo_destination_ring *)desc_addr;
  347. msdu_info = (uint32_t *)&reo_dst_ring->rx_msdu_desc_info_details;
  348. msdu_desc_info->msdu_flags =
  349. hal_rx_msdu_flags_get_be((struct rx_msdu_desc_info *)msdu_info);
  350. msdu_desc_info->msdu_len = HAL_RX_MSDU_PKT_LENGTH_GET(msdu_info);
  351. }
  352. /**
  353. * hal_rx_get_reo_desc_va() - Get Desc virtual address within REO Desc
  354. * @reo_desc: REO2SW ring descriptor pointer
  355. *
  356. * Return: RX descriptor virtual address
  357. */
  358. static inline uintptr_t hal_rx_get_reo_desc_va(void *reo_desc)
  359. {
  360. uint64_t va_from_desc;
  361. va_from_desc = HAL_RX_GET(reo_desc,
  362. REO_DESTINATION_RING,
  363. BUFFER_VIRT_ADDR_31_0) |
  364. (((uint64_t)HAL_RX_GET(reo_desc,
  365. REO_DESTINATION_RING,
  366. BUFFER_VIRT_ADDR_63_32)) << 32);
  367. return (uintptr_t)va_from_desc;
  368. }
  369. #endif /* _HAL_BE_RX_H_ */