hal_be_rx.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. /*
  2. * Copyright (c) 2016-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. #ifndef _HAL_BE_RX_H_
  20. #define _HAL_BE_RX_H_
  21. #include "hal_be_hw_headers.h"
  22. #include "hal_be_rx_tlv.h"
  23. #include "hal_rx.h"
  24. #include <wbm_release_ring_rx.h>
  25. #define HAL_RX_DA_IDX_CHIP_ID_OFFSET 14
  26. #define HAL_RX_DA_IDX_CHIP_ID_MASK 0x3
  27. #define HAL_RX_DA_IDX_PEER_ID_MASK 0x3fff
  28. #define HAL_RX_DA_IDX_ML_PEER_MASK 0x2000
  29. /*
  30. * macro to set the cookie into the rxdma ring entry
  31. */
  32. #define HAL_RXDMA_COOKIE_SET(buff_addr_info, cookie) \
  33. ((*(((unsigned int *)buff_addr_info) + \
  34. (BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_OFFSET >> 2))) &= \
  35. ~BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_MASK); \
  36. ((*(((unsigned int *)buff_addr_info) + \
  37. (BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_OFFSET >> 2))) |= \
  38. (cookie << BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_LSB) & \
  39. BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_MASK)
  40. /*
  41. * macro to set the manager into the rxdma ring entry
  42. */
  43. #define HAL_RXDMA_MANAGER_SET(buff_addr_info, manager) \
  44. ((*(((unsigned int *)buff_addr_info) + \
  45. (BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_OFFSET >> 2))) &= \
  46. ~BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_MASK); \
  47. ((*(((unsigned int *)buff_addr_info) + \
  48. (BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_OFFSET >> 2))) |= \
  49. (manager << BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_LSB) & \
  50. BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_MASK)
  51. #define HAL_RX_ERROR_STATUS_GET(reo_desc) \
  52. (_HAL_MS((*_OFFSET_TO_WORD_PTR(reo_desc, \
  53. REO_DESTINATION_RING_REO_PUSH_REASON_OFFSET)),\
  54. REO_DESTINATION_RING_REO_PUSH_REASON_MASK, \
  55. REO_DESTINATION_RING_REO_PUSH_REASON_LSB))
  56. #define HAL_RX_BUF_COOKIE_GET(buff_addr_info) \
  57. (_HAL_MS((*_OFFSET_TO_WORD_PTR(buff_addr_info, \
  58. BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_OFFSET)), \
  59. BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_MASK, \
  60. BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_LSB))
  61. #define HAL_RX_BUF_RBM_GET(buff_addr_info) \
  62. (_HAL_MS((*_OFFSET_TO_WORD_PTR(buff_addr_info, \
  63. BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_OFFSET)),\
  64. BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_MASK, \
  65. BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_LSB))
  66. /* TODO: Convert the following structure fields accesseses to offsets */
  67. #define HAL_RX_REO_BUF_COOKIE_GET(reo_desc) \
  68. (HAL_RX_BUF_COOKIE_GET(& \
  69. (((struct reo_destination_ring *) \
  70. reo_desc)->buf_or_link_desc_addr_info)))
  71. #define HAL_RX_MSDU_DESC_IP_CHKSUM_FAIL_GET(msdu_desc_info_ptr) \
  72. (_HAL_MS((*_OFFSET_TO_WORD_PTR((msdu_desc_info_ptr), \
  73. RX_MSDU_DESC_INFO_IP_CHKSUM_FAIL_OFFSET)), \
  74. RX_MSDU_DESC_INFO_IP_CHKSUM_FAIL_MASK, \
  75. RX_MSDU_DESC_INFO_IP_CHKSUM_FAIL_LSB))
  76. #define HAL_RX_REO_IP_CHKSUM_FAIL_GET(ring_desc) \
  77. (HAL_RX_MSDU_DESC_IP_CHKSUM_FAIL_GET(& \
  78. ((struct reo_destination_ring *)ring_desc)->rx_msdu_desc_info_details))
  79. #define HAL_RX_MSDU_DESC_TCP_UDP_CHKSUM_FAIL_GET(msdu_desc_info_ptr) \
  80. (_HAL_MS((*_OFFSET_TO_WORD_PTR((msdu_desc_info_ptr), \
  81. RX_MSDU_DESC_INFO_TCP_UDP_CHKSUM_FAIL_OFFSET)), \
  82. RX_MSDU_DESC_INFO_TCP_UDP_CHKSUM_FAIL_MASK, \
  83. RX_MSDU_DESC_INFO_TCP_UDP_CHKSUM_FAIL_LSB))
  84. #define HAL_RX_REO_TCP_UDP_CHKSUM_FAIL_GET(ring_desc) \
  85. (HAL_RX_MSDU_DESC_TCP_UDP_CHKSUM_FAIL_GET(& \
  86. ((struct reo_destination_ring *)ring_desc)->rx_msdu_desc_info_details))
  87. #define HAL_RX_MSDU_DESC_AMPDU_FLAG_GET(mpdu_info_ptr) \
  88. (_HAL_MS((*_OFFSET_TO_WORD_PTR((mpdu_info_ptr), \
  89. RX_MPDU_DESC_INFO_AMPDU_FLAG_OFFSET)), \
  90. RX_MPDU_DESC_INFO_AMPDU_FLAG_MASK, \
  91. RX_MPDU_DESC_INFO_AMPDU_FLAG_LSB))
  92. #define HAL_RX_MPDU_DESC_PEER_META_DATA_GET(mpdu_info_ptr) \
  93. ((mpdu_info_ptr \
  94. [RX_MPDU_DESC_INFO_PEER_META_DATA_OFFSET >> 2] & \
  95. RX_MPDU_DESC_INFO_PEER_META_DATA_MASK) >> \
  96. RX_MPDU_DESC_INFO_PEER_META_DATA_LSB)
  97. #define HAL_RX_MPDU_MSDU_COUNT_GET(mpdu_info_ptr) \
  98. ((mpdu_info_ptr[RX_MPDU_DESC_INFO_MSDU_COUNT_OFFSET >> 2] & \
  99. RX_MPDU_DESC_INFO_MSDU_COUNT_MASK) >> \
  100. RX_MPDU_DESC_INFO_MSDU_COUNT_LSB)
  101. #define HAL_RX_MPDU_FRAGMENT_FLAG_GET(mpdu_info_ptr) \
  102. (mpdu_info_ptr[RX_MPDU_DESC_INFO_FRAGMENT_FLAG_OFFSET >> 2] & \
  103. RX_MPDU_DESC_INFO_FRAGMENT_FLAG_MASK)
  104. #define HAL_RX_MPDU_RETRY_BIT_GET(mpdu_info_ptr) \
  105. (mpdu_info_ptr[RX_MPDU_DESC_INFO_MPDU_RETRY_BIT_OFFSET >> 2] & \
  106. RX_MPDU_DESC_INFO_MPDU_RETRY_BIT_MASK)
  107. #define HAL_RX_MPDU_AMPDU_FLAG_GET(mpdu_info_ptr) \
  108. (mpdu_info_ptr[RX_MPDU_DESC_INFO_AMPDU_FLAG_OFFSET >> 2] & \
  109. RX_MPDU_DESC_INFO_AMPDU_FLAG_MASK)
  110. #define HAL_RX_MPDU_RAW_MPDU_GET(mpdu_info_ptr) \
  111. (mpdu_info_ptr[RX_MPDU_DESC_INFO_RAW_MPDU_OFFSET >> 2] & \
  112. RX_MPDU_DESC_INFO_RAW_MPDU_MASK)
  113. #define HAL_RX_MPDU_BAR_FRAME_GET(mpdu_info_ptr) \
  114. ((mpdu_info_ptr[RX_MPDU_DESC_INFO_BAR_FRAME_OFFSET >> 2] & \
  115. RX_MPDU_DESC_INFO_BAR_FRAME_MASK) >> \
  116. RX_MPDU_DESC_INFO_BAR_FRAME_LSB)
  117. #define HAL_RX_MPDU_TID_GET(mpdu_info_ptr) \
  118. ((mpdu_info_ptr[RX_MPDU_DESC_INFO_TID_OFFSET >> 2] & \
  119. RX_MPDU_DESC_INFO_TID_MASK) >> \
  120. RX_MPDU_DESC_INFO_TID_LSB)
  121. #define HAL_RX_MPDU_MPDU_QOS_CONTROL_VALID_GET(mpdu_info_ptr) \
  122. ((mpdu_info_ptr[RX_MPDU_DESC_INFO_MPDU_QOS_CONTROL_VALID_OFFSET >> 2] &\
  123. RX_MPDU_DESC_INFO_MPDU_QOS_CONTROL_VALID_MASK) >> \
  124. RX_MPDU_DESC_INFO_MPDU_QOS_CONTROL_VALID_LSB)
  125. /*
  126. * NOTE: None of the following _GET macros need a right
  127. * shift by the corresponding _LSB. This is because, they are
  128. * finally taken and "OR'ed" into a single word again.
  129. */
  130. #define HAL_RX_MSDU_CONTINUATION_FLAG_SET(msdu_info_ptr, val) \
  131. ((*(((uint32_t *)msdu_info_ptr) + \
  132. (RX_MSDU_DESC_INFO_MSDU_CONTINUATION_OFFSET >> 2))) |= \
  133. ((val) << RX_MSDU_DESC_INFO_MSDU_CONTINUATION_LSB) & \
  134. RX_MSDU_DESC_INFO_MSDU_CONTINUATION_MASK)
  135. #define HAL_RX_MSDU_CONTINUATION_FLAG_GET(msdu_info_ptr) \
  136. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  137. RX_MSDU_DESC_INFO_MSDU_CONTINUATION_OFFSET)) & \
  138. RX_MSDU_DESC_INFO_MSDU_CONTINUATION_MASK)
  139. #define HAL_RX_MSDU_REO_DST_IND_GET(msdu_info_ptr) \
  140. (_HAL_MS((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  141. RX_MSDU_EXT_DESC_INFO_REO_DESTINATION_INDICATION_OFFSET)), \
  142. RX_MSDU_EXT_DESC_INFO_REO_DESTINATION_INDICATION_MASK, \
  143. RX_MSDU_EXT_DESC_INFO_REO_DESTINATION_INDICATION_LSB))
  144. #define HAL_RX_MSDU_SA_IS_VALID_FLAG_GET(msdu_info_ptr) \
  145. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  146. RX_MSDU_DESC_INFO_SA_IS_VALID_OFFSET)) & \
  147. RX_MSDU_DESC_INFO_SA_IS_VALID_MASK)
  148. #define HAL_RX_MSDU_DA_IS_VALID_FLAG_GET(msdu_info_ptr) \
  149. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  150. RX_MSDU_DESC_INFO_DA_IS_VALID_OFFSET)) & \
  151. RX_MSDU_DESC_INFO_DA_IS_VALID_MASK)
  152. #define HAL_RX_MSDU_DA_IS_MCBC_FLAG_GET(msdu_info_ptr) \
  153. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  154. RX_MSDU_DESC_INFO_DA_IS_MCBC_OFFSET)) & \
  155. RX_MSDU_DESC_INFO_DA_IS_MCBC_MASK)
  156. #define HAL_RX_MSDU_INTRA_BSS_FLAG_GET(msdu_info_ptr) \
  157. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  158. RX_MSDU_DESC_INFO_INTRA_BSS_OFFSET)) & \
  159. RX_MSDU_DESC_INFO_INTRA_BSS_MASK)
  160. #define HAL_RX_MSDU_DEST_CHIP_ID_GET(msdu_info_ptr) \
  161. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  162. RX_MSDU_DESC_INFO_DEST_CHIP_ID_OFFSET)) & \
  163. RX_MSDU_DESC_INFO_DEST_CHIP_ID_MASK)
  164. #define HAL_RX_MPDU_ENCRYPT_TYPE_GET(_rx_mpdu_info) \
  165. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info, \
  166. RX_MPDU_INFO_ENCRYPT_TYPE_OFFSET)), \
  167. RX_MPDU_INFO_ENCRYPT_TYPE_MASK, \
  168. RX_MPDU_INFO_ENCRYPT_TYPE_LSB))
  169. #define HAL_RX_MSDU_DESC_INFO_SET(_msdu_info_ptr, _field, _val) \
  170. HAL_RX_FLD_SET(_msdu_info_ptr, RX_MSDU_DESC_INFO, \
  171. _field, _val)
  172. #define HAL_RX_MPDU_DESC_INFO_SET(_mpdu_info_ptr, _field, _val) \
  173. HAL_RX_FLD_SET(_mpdu_info_ptr, RX_MPDU_DESC_INFO, \
  174. _field, _val)
  175. #define HAL_RX_MSDU_REO_DST_IND_SET(_msdu_ext_desc_info_ptr, _field, _val) \
  176. HAL_RX_FLD_SET(_msdu_ext_desc_info_ptr, RX_MSDU_EXT_DESC_INFO, \
  177. _field, _val)
  178. #define HAL_RX_REO_MSDU_REO_DST_IND_GET(reo_desc) \
  179. (HAL_RX_MSDU_REO_DST_IND_GET(& \
  180. (((struct reo_destination_ring *) \
  181. reo_desc)->rx_msdu_desc_info_details)))
  182. #define HAL_RX_DEST_CHIP_ID_GET(msdu_metadata) \
  183. (((msdu_metadata)->da_idx >> HAL_RX_DA_IDX_CHIP_ID_OFFSET) & \
  184. HAL_RX_DA_IDX_CHIP_ID_MASK)
  185. #define HAL_RX_PEER_ID_GET(msdu_metadata) \
  186. (((msdu_metadata)->da_idx) & HAL_RX_DA_IDX_PEER_ID_MASK)
  187. #define HAL_RX_TLV_DEST_CHIP_ID_GET(_rx_pkt_tlv) \
  188. HAL_RX_MSDU_END(_rx_pkt_tlv).dest_chip_id
  189. #ifdef INTRA_BSS_FWD_OFFLOAD
  190. #define HAL_RX_TLV_DEST_CHIP_PMAC_ID_GET(_rx_pkt_tlv) \
  191. HAL_RX_MSDU_END(_rx_pkt_tlv).dest_chip_pmac_id
  192. #endif
  193. /**
  194. * enum hal_be_rx_wbm_error_source: Indicates which module initiated the
  195. * release of this buffer or descriptor
  196. *
  197. * @HAL_BE_RX_WBM_ERR_SRC_RXDMA: RXDMA released this buffer or descriptor
  198. * @HAL_BE_RX_WBM_ERR_SRC_REO: REO released this buffer or descriptor
  199. * @HAL_BE_RX_WBM_ERR_SRC_FW_RX: FW released this buffer or descriptor from the
  200. * RX path
  201. * @HAL_BE_RX_WBM_ERR_SRC_SW_RX: SW released this buffer or descriptor from the
  202. * RX path
  203. * @HAL_BE_RX_WBM_ERR_SRC_TQM : TQM released this buffer or descriptor
  204. * @HAL_BE_RX_WBM_ERR_SRC_FW_TX: FW released this buffer or descriptor from the
  205. * RX path
  206. * @HAL_BE_RX_WBM_ERR_SRC_SW_TX: SW released this buffer or descriptor from the
  207. * RX path
  208. */
  209. enum hal_be_rx_wbm_error_source {
  210. HAL_BE_RX_WBM_ERR_SRC_RXDMA = 0,
  211. HAL_BE_RX_WBM_ERR_SRC_REO,
  212. HAL_BE_RX_WBM_ERR_SRC_FW_RX,
  213. HAL_BE_RX_WBM_ERR_SRC_SW_RX,
  214. HAL_BE_RX_WBM_ERR_SRC_TQM,
  215. HAL_BE_RX_WBM_ERR_SRC_FW_TX,
  216. HAL_BE_RX_WBM_ERR_SRC_SW_TX,
  217. };
  218. /**
  219. * enum hal_be_wbm_release_dir - Direction of the buffer which was released to
  220. * wbm.
  221. * @HAL_BE_WBM_RELEASE_DIR_RX: Buffer released to WBM due to error
  222. * @HAL_BE_WBM_RELEASE_DIR_TX: Buffer released to WBM from TX path
  223. */
  224. enum hal_be_wbm_release_dir {
  225. HAL_BE_WBM_RELEASE_DIR_RX,
  226. HAL_BE_WBM_RELEASE_DIR_TX,
  227. };
  228. static inline uint32_t hal_rx_get_mpdu_flags(uint32_t *mpdu_info)
  229. {
  230. uint32_t mpdu_flags = 0;
  231. if (HAL_RX_MPDU_FRAGMENT_FLAG_GET(mpdu_info))
  232. mpdu_flags |= HAL_MPDU_F_FRAGMENT;
  233. if (HAL_RX_MPDU_RETRY_BIT_GET(mpdu_info))
  234. mpdu_flags |= HAL_MPDU_F_RETRY_BIT;
  235. if (HAL_RX_MPDU_AMPDU_FLAG_GET(mpdu_info))
  236. mpdu_flags |= HAL_MPDU_F_AMPDU_FLAG;
  237. if (HAL_RX_MPDU_RAW_MPDU_GET(mpdu_info))
  238. mpdu_flags |= HAL_MPDU_F_RAW_AMPDU;
  239. if (HAL_RX_MPDU_MPDU_QOS_CONTROL_VALID_GET(mpdu_info))
  240. mpdu_flags |= HAL_MPDU_F_QOS_CONTROL_VALID;
  241. return mpdu_flags;
  242. }
  243. /*******************************************************************************
  244. * RX REO ERROR APIS
  245. ******************************************************************************/
  246. #define HAL_RX_REO_BUF_TYPE_GET(reo_desc) (((*(((uint32_t *)reo_desc) + \
  247. (REO_DESTINATION_RING_REO_DEST_BUFFER_TYPE_OFFSET >> 2))) & \
  248. REO_DESTINATION_RING_REO_DEST_BUFFER_TYPE_MASK) >> \
  249. REO_DESTINATION_RING_REO_DEST_BUFFER_TYPE_LSB)
  250. #define HAL_RX_REO_ERROR_GET(reo_desc) (((*(((uint32_t *)reo_desc) + \
  251. (REO_DESTINATION_RING_REO_ERROR_CODE_OFFSET >> 2))) & \
  252. REO_DESTINATION_RING_REO_ERROR_CODE_MASK) >> \
  253. REO_DESTINATION_RING_REO_ERROR_CODE_LSB)
  254. /*
  255. * hal_rx_msdu_link_desc_reinject: Re-injects the MSDU link descriptor to
  256. * REO entrance ring
  257. *
  258. * @ soc: HAL version of the SOC pointer
  259. * @ pa: Physical address of the MSDU Link Descriptor
  260. * @ cookie: SW cookie to get to the virtual address
  261. * @ error_enabled_reo_q: Argument to determine whether this needs to go
  262. * to the error enabled REO queue
  263. *
  264. * Return: void
  265. */
  266. static inline void
  267. hal_rx_msdu_link_desc_reinject(struct hal_soc *soc, uint64_t pa,
  268. uint32_t cookie, bool error_enabled_reo_q)
  269. {
  270. /* TODO */
  271. }
  272. #ifdef DP_HW_COOKIE_CONVERT_EXCEPTION
  273. /* HW set dowrd-2 bit16 to 1 if HW CC is done */
  274. #define HAL_WBM2SW_COMPLETION_RING_RX_CC_DONE_OFFSET 0x8
  275. #define HAL_WBM2SW_COMPLETION_RING_RX_CC_DONE_MASK 0x10000
  276. #define HAL_WBM2SW_COMPLETION_RING_RX_CC_DONE_LSB 0x10
  277. /**
  278. * hal_rx_wbm_get_cookie_convert_done() - Get cookie conversion done flag
  279. * @hal_desc: wbm Rx ring descriptor pointer
  280. *
  281. * This function will get the bit value that indicate HW cookie
  282. * conversion done or not
  283. *
  284. * Return: 1 - HW cookie conversion done, 0 - not
  285. */
  286. static inline uint8_t hal_rx_wbm_get_cookie_convert_done(void *hal_desc)
  287. {
  288. return HAL_RX_GET(hal_desc, HAL_WBM2SW_COMPLETION_RING_RX,
  289. CC_DONE);
  290. }
  291. #endif
  292. /**
  293. * hal_rx_wbm_get_desc_va() - Get Desc virtual address within WBM Desc
  294. * @hal_desc: RX WBM2SW ring descriptor pointer
  295. *
  296. * Return: RX descriptor virtual address
  297. */
  298. static inline uintptr_t hal_rx_wbm_get_desc_va(void *hal_desc)
  299. {
  300. uint64_t va_from_desc;
  301. va_from_desc = qdf_le64_to_cpu(HAL_RX_GET(hal_desc,
  302. WBM2SW_COMPLETION_RING_RX,
  303. BUFFER_VIRT_ADDR_31_0) |
  304. (((uint64_t)HAL_RX_GET(hal_desc,
  305. WBM2SW_COMPLETION_RING_RX,
  306. BUFFER_VIRT_ADDR_63_32)) << 32));
  307. return (uintptr_t)va_from_desc;
  308. }
  309. #define HAL_RX_WBM_FIRST_MSDU_GET(wbm_desc) \
  310. (((*(((uint32_t *)wbm_desc) + \
  311. (WBM_RELEASE_RING_FIRST_MSDU_OFFSET >> 2))) & \
  312. WBM_RELEASE_RING_FIRST_MSDU_MASK) >> \
  313. WBM_RELEASE_RING_FIRST_MSDU_LSB)
  314. #define HAL_RX_WBM_LAST_MSDU_GET(wbm_desc) \
  315. (((*(((uint32_t *)wbm_desc) + \
  316. (WBM_RELEASE_RING_LAST_MSDU_OFFSET >> 2))) & \
  317. WBM_RELEASE_RING_LAST_MSDU_MASK) >> \
  318. WBM_RELEASE_RING_LAST_MSDU_LSB)
  319. #define HAL_RX_WBM_BUF_ADDR_39_32_GET(wbm_desc) \
  320. (HAL_RX_BUFFER_ADDR_39_32_GET(& \
  321. (((struct wbm_release_ring_rx *) \
  322. wbm_desc)->released_buff_or_desc_addr_info)))
  323. #define HAL_RX_WBM_BUF_ADDR_31_0_GET(wbm_desc) \
  324. (HAL_RX_BUFFER_ADDR_31_0_GET(& \
  325. (((struct wbm_release_ring_rx *) \
  326. wbm_desc)->released_buff_or_desc_addr_info)))
  327. #define HAL_RX_WBM_BUF_COOKIE_GET(wbm_desc) \
  328. HAL_RX_BUF_COOKIE_GET(&((struct wbm_release_ring_rx *) \
  329. wbm_desc)->released_buff_or_desc_addr_info)
  330. #define HAL_RX_WBM_COMP_BUF_ADDR_31_0_GET(wbm_desc) \
  331. HAL_RX_GET(wbm_desc, WBM2SW_COMPLETION_RING_RX, BUFFER_PHYS_ADDR_31_0)
  332. #define HAL_RX_WBM_COMP_BUF_ADDR_39_32_GET(wbm_desc) \
  333. HAL_RX_GET(wbm_desc, WBM2SW_COMPLETION_RING_RX, BUFFER_PHYS_ADDR_39_32)
  334. #define HAL_RX_WBM_COMP_BUF_COOKIE_GET(wbm_desc) \
  335. HAL_RX_GET(wbm_desc, WBM2SW_COMPLETION_RING_RX, SW_BUFFER_COOKIE)
  336. /**
  337. * hal_rx_msdu_flags_get_be() - Get msdu flags from ring desc
  338. * @msdu_desc_info_hdl: msdu desc info handle
  339. *
  340. * Return: msdu flags
  341. */
  342. static inline
  343. uint32_t hal_rx_msdu_flags_get_be(rx_msdu_desc_info_t msdu_desc_info_hdl)
  344. {
  345. struct rx_msdu_desc_info *msdu_desc_info =
  346. (struct rx_msdu_desc_info *)msdu_desc_info_hdl;
  347. uint32_t flags = 0;
  348. if (HAL_RX_FIRST_MSDU_IN_MPDU_FLAG_GET(msdu_desc_info))
  349. flags |= HAL_MSDU_F_FIRST_MSDU_IN_MPDU;
  350. if (HAL_RX_LAST_MSDU_IN_MPDU_FLAG_GET(msdu_desc_info))
  351. flags |= HAL_MSDU_F_LAST_MSDU_IN_MPDU;
  352. if (HAL_RX_MSDU_CONTINUATION_FLAG_GET(msdu_desc_info))
  353. flags |= HAL_MSDU_F_MSDU_CONTINUATION;
  354. if (HAL_RX_MSDU_SA_IS_VALID_FLAG_GET(msdu_desc_info))
  355. flags |= HAL_MSDU_F_SA_IS_VALID;
  356. if (HAL_RX_MSDU_DA_IS_VALID_FLAG_GET(msdu_desc_info))
  357. flags |= HAL_MSDU_F_DA_IS_VALID;
  358. if (HAL_RX_MSDU_DA_IS_MCBC_FLAG_GET(msdu_desc_info))
  359. flags |= HAL_MSDU_F_DA_IS_MCBC;
  360. if (HAL_RX_MSDU_INTRA_BSS_FLAG_GET(msdu_desc_info))
  361. flags |= HAL_MSDU_F_INTRA_BSS;
  362. return flags;
  363. }
  364. static inline
  365. void hal_rx_mpdu_desc_info_get_be(void *desc_addr,
  366. void *mpdu_desc_info_hdl)
  367. {
  368. struct reo_destination_ring *reo_dst_ring;
  369. struct hal_rx_mpdu_desc_info *mpdu_desc_info =
  370. (struct hal_rx_mpdu_desc_info *)mpdu_desc_info_hdl;
  371. uint32_t *mpdu_info;
  372. reo_dst_ring = (struct reo_destination_ring *)desc_addr;
  373. mpdu_info = (uint32_t *)&reo_dst_ring->rx_mpdu_desc_info_details;
  374. mpdu_desc_info->msdu_count = HAL_RX_MPDU_MSDU_COUNT_GET(mpdu_info);
  375. mpdu_desc_info->mpdu_flags = hal_rx_get_mpdu_flags(mpdu_info);
  376. mpdu_desc_info->peer_meta_data =
  377. HAL_RX_MPDU_DESC_PEER_META_DATA_GET(mpdu_info);
  378. mpdu_desc_info->bar_frame = HAL_RX_MPDU_BAR_FRAME_GET(mpdu_info);
  379. mpdu_desc_info->tid = HAL_RX_MPDU_TID_GET(mpdu_info);
  380. }
  381. /*
  382. *hal_rx_msdu_desc_info_get_be: Gets the flags related to MSDU descriptor.
  383. *@desc_addr: REO ring descriptor addr
  384. *@msdu_desc_info: Holds MSDU descriptor info from HAL Rx descriptor
  385. *
  386. * Specifically flags needed are: first_msdu_in_mpdu,
  387. * last_msdu_in_mpdu, msdu_continuation, sa_is_valid,
  388. * sa_idx_timeout, da_is_valid, da_idx_timeout, da_is_MCBC
  389. *
  390. *Return: void
  391. */
  392. static inline void
  393. hal_rx_msdu_desc_info_get_be(void *desc_addr,
  394. struct hal_rx_msdu_desc_info *msdu_desc_info)
  395. {
  396. struct reo_destination_ring *reo_dst_ring;
  397. uint32_t *msdu_info;
  398. reo_dst_ring = (struct reo_destination_ring *)desc_addr;
  399. msdu_info = (uint32_t *)&reo_dst_ring->rx_msdu_desc_info_details;
  400. msdu_desc_info->msdu_flags =
  401. hal_rx_msdu_flags_get_be((struct rx_msdu_desc_info *)msdu_info);
  402. msdu_desc_info->msdu_len = HAL_RX_MSDU_PKT_LENGTH_GET(msdu_info);
  403. }
  404. /**
  405. * hal_rx_get_reo_desc_va() - Get Desc virtual address within REO Desc
  406. * @reo_desc: REO2SW ring descriptor pointer
  407. *
  408. * Return: RX descriptor virtual address
  409. */
  410. static inline uintptr_t hal_rx_get_reo_desc_va(void *reo_desc)
  411. {
  412. uint64_t va_from_desc;
  413. va_from_desc = qdf_le64_to_cpu(HAL_RX_GET(reo_desc,
  414. REO_DESTINATION_RING,
  415. BUFFER_VIRT_ADDR_31_0) |
  416. (((uint64_t)HAL_RX_GET(reo_desc,
  417. REO_DESTINATION_RING,
  418. BUFFER_VIRT_ADDR_63_32)) << 32));
  419. return (uintptr_t)va_from_desc;
  420. }
  421. /**
  422. * hal_rx_sw_exception_get_be() - Get sw_exception bit value from REO Desc
  423. * @reo_desc: REO2SW ring descriptor pointer
  424. *
  425. * sw_exception bit might not exist in reo destination ring descriptor
  426. * for some chipset, so just restrict this function for BE only.
  427. *
  428. * Return: sw_exception bit value
  429. */
  430. static inline uint8_t hal_rx_sw_exception_get_be(void *reo_desc)
  431. {
  432. return HAL_RX_GET(reo_desc, REO_DESTINATION_RING, SW_EXCEPTION);
  433. }
  434. #ifdef INTRA_BSS_FWD_OFFLOAD
  435. /**
  436. * hal_rx_tlv_get_dest_chip_pmac_id() - Get destination chip and PMAC ID
  437. * @buf: Rx TLV buffer
  438. * @d_chip_id: chip id being filled in
  439. * @d_chip_pmac_id: chip pmac id being filled in
  440. *
  441. * Return: void
  442. */
  443. static inline void
  444. hal_rx_tlv_get_dest_chip_pmac_id(uint8_t *buf,
  445. uint8_t *d_chip_id, uint8_t *d_chip_pmac_id)
  446. {
  447. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  448. *d_chip_id = HAL_RX_TLV_DEST_CHIP_ID_GET(rx_pkt_tlvs);
  449. *d_chip_pmac_id = HAL_RX_TLV_DEST_CHIP_PMAC_ID_GET(rx_pkt_tlvs);
  450. }
  451. #endif /* INTRA_BSS_FWD_OFFLOAD */
  452. static inline uint8_t hal_rx_get_reo_push_rsn(void *desc_addr)
  453. {
  454. struct reo_destination_ring *reo_dst_ring;
  455. reo_dst_ring = (struct reo_destination_ring *)desc_addr;
  456. return reo_dst_ring->reo_push_reason;
  457. }
  458. /**
  459. * hal_rx_get_mpdu_msdu_desc_info_be() - get msdu, mpdu, peer meta data info
  460. * from HAL Desc.
  461. * @desc_addr: REO ring descriptor addr
  462. * @mpdu_info: pointer to MPDU info
  463. * @peer_mdata: pointer to peer meta data info
  464. * @msdu_info: pointer to msdu info
  465. *
  466. * Return: void
  467. */
  468. static inline void
  469. hal_rx_get_mpdu_msdu_desc_info_be(void *desc_addr,
  470. uint32_t *mpdu_info,
  471. uint32_t *peer_mdata,
  472. uint32_t *msdu_info)
  473. {
  474. struct reo_destination_ring *reo_dst_ring;
  475. reo_dst_ring = (struct reo_destination_ring *)desc_addr;
  476. *mpdu_info = *(uint32_t *)(&reo_dst_ring->rx_mpdu_desc_info_details);
  477. *peer_mdata = *((uint32_t *)
  478. &reo_dst_ring->rx_mpdu_desc_info_details + 1);
  479. *msdu_info = *(uint32_t *)(&reo_dst_ring->rx_msdu_desc_info_details);
  480. }
  481. /**
  482. * hal_rx_wbm_err_mpdu_msdu_info_get_be() - Copies wbm, msdu, mpdu info
  483. * from HAL desc
  484. * @desc_addr: WBM2SW Rx Error ring descriptor addr
  485. * @wbm_err_info: Holds WBM Error info from HAL Rx descriptor
  486. * @mpdu_info: Holds MPDU descriptor info from HAL Rx descriptor
  487. * @msdu_info: Holds MSDU descriptor info from HAL Rx descriptor
  488. * @peer_meta_data: Holds Peer Meta data from HAL Rx descriptor
  489. *
  490. * This function copies the WBM error information, MSDU desc info,
  491. * MPDU Desc info and peer meta data from HAL RX Desc.
  492. *
  493. * Return: void
  494. */
  495. static inline void
  496. hal_rx_wbm_err_mpdu_msdu_info_get_be(void *desc_addr,
  497. uint32_t *wbm_err_info,
  498. uint32_t *mpdu_info,
  499. uint32_t *msdu_info,
  500. uint32_t *peer_meta_data)
  501. {
  502. struct wbm2sw_completion_ring_rx *wbm_rx_err_ring;
  503. wbm_rx_err_ring = (struct wbm2sw_completion_ring_rx *)desc_addr;
  504. *msdu_info = *(uint32_t *)&wbm_rx_err_ring->rx_msdu_desc_info_details;
  505. *mpdu_info = *(uint32_t *)&wbm_rx_err_ring->rx_mpdu_desc_info_details;
  506. *peer_meta_data =
  507. *((uint32_t *)&wbm_rx_err_ring->rx_mpdu_desc_info_details + 1);
  508. *wbm_err_info = *((uint32_t *)wbm_rx_err_ring + 2);
  509. }
  510. #endif /* _HAL_BE_RX_H_ */