hal_rx.h 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359
  1. /*
  2. * Copyright (c) 2016-2017 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_RX_H_
  19. #define _HAL_RX_H_
  20. #include <hal_internal.h>
  21. /**
  22. * enum hal_reo_error_code: Enum which encapsulates "reo_push_reason"
  23. *
  24. * @ HAL_REO_ERROR_DETECTED: Packets arrived because of an error detected
  25. * @ HAL_REO_ROUTING_INSTRUCTION: Packets arrived because of REO routing
  26. */
  27. enum hal_reo_error_status {
  28. HAL_REO_ERROR_DETECTED = 0,
  29. HAL_REO_ROUTING_INSTRUCTION = 1,
  30. };
  31. /**
  32. * @msdu_flags: [0] first_msdu_in_mpdu
  33. * [1] last_msdu_in_mpdu
  34. * [2] msdu_continuation - MSDU spread across buffers
  35. * [23] sa_is_valid - SA match in peer table
  36. * [24] sa_idx_timeout - Timeout while searching for SA match
  37. * [25] da_is_valid - Used to identtify intra-bss forwarding
  38. * [26] da_is_MCBC
  39. * [27] da_idx_timeout - Timeout while searching for DA match
  40. *
  41. */
  42. struct hal_rx_msdu_desc_info {
  43. uint32_t msdu_flags;
  44. uint16_t msdu_len; /* 14 bits for length */
  45. };
  46. /**
  47. * enum hal_rx_msdu_desc_flags: Enum for flags in MSDU_DESC_INFO
  48. *
  49. * @ HAL_MSDU_F_FIRST_MSDU_IN_MPDU: First MSDU in MPDU
  50. * @ HAL_MSDU_F_LAST_MSDU_IN_MPDU: Last MSDU in MPDU
  51. * @ HAL_MSDU_F_MSDU_CONTINUATION: MSDU continuation
  52. * @ HAL_MSDU_F_SA_IS_VALID: Found match for SA in AST
  53. * @ HAL_MSDU_F_SA_IDX_TIMEOUT: AST search for SA timed out
  54. * @ HAL_MSDU_F_DA_IS_VALID: Found match for DA in AST
  55. * @ HAL_MSDU_F_DA_IS_MCBC: DA is MC/BC address
  56. * @ HAL_MSDU_F_DA_IDX_TIMEOUT: AST search for DA timed out
  57. */
  58. enum hal_rx_msdu_desc_flags {
  59. HAL_MSDU_F_FIRST_MSDU_IN_MPDU = (0x1 << 0),
  60. HAL_MSDU_F_LAST_MSDU_IN_MPDU = (0x1 << 1),
  61. HAL_MSDU_F_MSDU_CONTINUATION = (0x1 << 2),
  62. HAL_MSDU_F_SA_IS_VALID = (0x1 << 23),
  63. HAL_MSDU_F_SA_IDX_TIMEOUT = (0x1 << 24),
  64. HAL_MSDU_F_DA_IS_VALID = (0x1 << 25),
  65. HAL_MSDU_F_DA_IS_MCBC = (0x1 << 26),
  66. HAL_MSDU_F_DA_IDX_TIMEOUT = (0x1 << 27)
  67. };
  68. /*
  69. * @msdu_count: no. of msdus in the MPDU
  70. * @mpdu_seq: MPDU sequence number
  71. * @mpdu_flags [0] Fragment flag
  72. * [1] MPDU_retry_bit
  73. * [2] AMPDU flag
  74. * [3] raw_ampdu
  75. * @peer_meta_data: Upper bits containing peer id, vdev id
  76. */
  77. struct hal_rx_mpdu_desc_info {
  78. uint16_t msdu_count;
  79. uint16_t mpdu_seq; /* 12 bits for length */
  80. uint32_t mpdu_flags;
  81. uint32_t peer_meta_data; /* sw progamed meta-data:MAC Id & peer Id */
  82. };
  83. /**
  84. * enum hal_rx_mpdu_desc_flags: Enum for flags in MPDU_DESC_INFO
  85. *
  86. * @ HAL_MPDU_F_FRAGMENT: Fragmented MPDU (802.11 fragemtation)
  87. * @ HAL_MPDU_F_RETRY_BIT: Retry bit is set in FC of MPDU
  88. * @ HAL_MPDU_F_AMPDU_FLAG: MPDU received as part of A-MPDU
  89. * @ HAL_MPDU_F_RAW_AMPDU: MPDU is a Raw MDPU
  90. */
  91. enum hal_rx_mpdu_desc_flags {
  92. HAL_MPDU_F_FRAGMENT = (0x1 << 20),
  93. HAL_MPDU_F_RETRY_BIT = (0x1 << 21),
  94. HAL_MPDU_F_AMPDU_FLAG = (0x1 << 22),
  95. HAL_MPDU_F_RAW_AMPDU = (0x1 << 30)
  96. };
  97. /**
  98. * enum hal_rx_ret_buf_manager: Enum for return_buffer_manager field in
  99. * BUFFER_ADDR_INFO structure
  100. *
  101. * @ HAL_RX_BUF_RBM_WBM_IDLE_BUF_LIST: Buffer returned to WBM idle buffer list
  102. * @ HAL_RX_BUF_RBM_WBM_IDLE_DESC_LIST: Descriptor returned to WBM idle
  103. * descriptor list
  104. * @ HAL_RX_BUF_RBM_FW_BM: Buffer returned to FW
  105. * @ HAL_RX_BUF_RBM_SW0_BM: For Tx completion -- returned to host
  106. * @ HAL_RX_BUF_RBM_SW1_BM: For Tx completion -- returned to host
  107. * @ HAL_RX_BUF_RBM_SW2_BM: For Tx completion -- returned to host
  108. * @ HAL_RX_BUF_RBM_SW3_BM: For Rx release -- returned to host
  109. */
  110. enum hal_rx_ret_buf_manager {
  111. HAL_RX_BUF_RBM_WBM_IDLE_BUF_LIST = 0,
  112. HAL_RX_BUF_RBM_WBM_IDLE_DESC_LIST = 1,
  113. HAL_RX_BUF_RBM_FW_BM = 2,
  114. HAL_RX_BUF_RBM_SW0_BM = 3,
  115. HAL_RX_BUF_RBM_SW1_BM = 4,
  116. HAL_RX_BUF_RBM_SW2_BM = 5,
  117. HAL_RX_BUF_RBM_SW3_BM = 6,
  118. };
  119. /*
  120. * Given the offset of a field in bytes, returns uint8_t *
  121. */
  122. #define _OFFSET_TO_BYTE_PTR(_ptr, _off_in_bytes) \
  123. (((uint8_t *)(_ptr)) + (_off_in_bytes))
  124. /*
  125. * Given the offset of a field in bytes, returns uint32_t *
  126. */
  127. #define _OFFSET_TO_WORD_PTR(_ptr, _off_in_bytes) \
  128. (((uint32_t *)(_ptr)) + ((_off_in_bytes) >> 2))
  129. #define _HAL_MS(_word, _mask, _shift) \
  130. (((_word) & (_mask)) >> (_shift))
  131. /*
  132. * macro to set the LSW of the nbuf data physical address
  133. * to the rxdma ring entry
  134. */
  135. #define HAL_RXDMA_PADDR_LO_SET(buff_addr_info, paddr_lo) \
  136. ((*(((unsigned int *) buff_addr_info) + \
  137. (BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_OFFSET >> 2))) = \
  138. (paddr_lo << BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB) & \
  139. BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK)
  140. /*
  141. * macro to set the LSB of MSW of the nbuf data physical address
  142. * to the rxdma ring entry
  143. */
  144. #define HAL_RXDMA_PADDR_HI_SET(buff_addr_info, paddr_hi) \
  145. ((*(((unsigned int *) buff_addr_info) + \
  146. (BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_OFFSET >> 2))) = \
  147. (paddr_hi << BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB) & \
  148. BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK)
  149. /*
  150. * macro to set the cookie into the rxdma ring entry
  151. */
  152. #define HAL_RXDMA_COOKIE_SET(buff_addr_info, cookie) \
  153. ((*(((unsigned int *) buff_addr_info) + \
  154. (BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_OFFSET >> 2))) &= \
  155. ~((cookie << BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB) & \
  156. BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK)); \
  157. ((*(((unsigned int *) buff_addr_info) + \
  158. (BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_OFFSET >> 2))) |= \
  159. (cookie << BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB) & \
  160. BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK)
  161. /*
  162. * macro to set the manager into the rxdma ring entry
  163. */
  164. #define HAL_RXDMA_MANAGER_SET(buff_addr_info, manager) \
  165. ((*(((unsigned int *) buff_addr_info) + \
  166. (BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_OFFSET >> 2))) &= \
  167. ~((manager << BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB) & \
  168. BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK)); \
  169. ((*(((unsigned int *) buff_addr_info) + \
  170. (BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_OFFSET >> 2))) |= \
  171. (manager << BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB) & \
  172. BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK)
  173. #define HAL_RX_ERROR_STATUS_GET(reo_desc) \
  174. (_HAL_MS((*_OFFSET_TO_WORD_PTR(reo_desc, \
  175. REO_DESTINATION_RING_7_REO_PUSH_REASON_OFFSET)),\
  176. REO_DESTINATION_RING_7_REO_PUSH_REASON_MASK, \
  177. REO_DESTINATION_RING_7_REO_PUSH_REASON_LSB))
  178. #define HAL_RX_BUF_COOKIE_GET(buff_addr_info) \
  179. (_HAL_MS((*_OFFSET_TO_WORD_PTR(buff_addr_info, \
  180. BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_OFFSET)), \
  181. BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK, \
  182. BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB))
  183. #define HAL_RX_BUFFER_ADDR_39_32_GET(buff_addr_info) \
  184. (_HAL_MS((*_OFFSET_TO_WORD_PTR(buff_addr_info, \
  185. BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_OFFSET)), \
  186. BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK, \
  187. BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB))
  188. #define HAL_RX_BUFFER_ADDR_31_0_GET(buff_addr_info) \
  189. (_HAL_MS((*_OFFSET_TO_WORD_PTR(buff_addr_info, \
  190. BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_OFFSET)), \
  191. BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK, \
  192. BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB))
  193. #define HAL_RX_BUF_RBM_GET(buff_addr_info) \
  194. (_HAL_MS((*_OFFSET_TO_WORD_PTR(buff_addr_info, \
  195. BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_OFFSET)),\
  196. BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK, \
  197. BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB))
  198. /* TODO: Convert the following structure fields accesseses to offsets */
  199. #define HAL_RX_REO_BUFFER_ADDR_39_32_GET(reo_desc) \
  200. (HAL_RX_BUFFER_ADDR_39_32_GET(& \
  201. (((struct reo_destination_ring *) \
  202. reo_desc)->buf_or_link_desc_addr_info)))
  203. #define HAL_RX_REO_BUFFER_ADDR_31_0_GET(reo_desc) \
  204. (HAL_RX_BUFFER_ADDR_31_0_GET(& \
  205. (((struct reo_destination_ring *) \
  206. reo_desc)->buf_or_link_desc_addr_info)))
  207. #define HAL_RX_REO_BUF_COOKIE_GET(reo_desc) \
  208. (HAL_RX_BUF_COOKIE_GET(& \
  209. (((struct reo_destination_ring *) \
  210. reo_desc)->buf_or_link_desc_addr_info)))
  211. #define HAL_RX_MPDU_SEQUENCE_NUMBER_GET(mpdu_info_ptr) \
  212. ((mpdu_info_ptr \
  213. [RX_MPDU_DESC_INFO_0_MPDU_SEQUENCE_NUMBER_OFFSET >> 2] & \
  214. RX_MPDU_DESC_INFO_0_MPDU_SEQUENCE_NUMBER_MASK) >> \
  215. RX_MPDU_DESC_INFO_0_MPDU_SEQUENCE_NUMBER_LSB)
  216. #define HAL_RX_MPDU_DESC_PEER_META_DATA_GET(mpdu_info_ptr) \
  217. ((mpdu_info_ptr \
  218. [RX_MPDU_DESC_INFO_1_PEER_META_DATA_OFFSET >> 2] & \
  219. RX_MPDU_DESC_INFO_1_PEER_META_DATA_MASK) >> \
  220. RX_MPDU_DESC_INFO_1_PEER_META_DATA_LSB)
  221. #define HAL_RX_MPDU_MSDU_COUNT_GET(mpdu_info_ptr) \
  222. ((mpdu_info_ptr[RX_MPDU_DESC_INFO_0_MSDU_COUNT_OFFSET >> 2] & \
  223. RX_MPDU_DESC_INFO_0_MSDU_COUNT_MASK) >> \
  224. RX_MPDU_DESC_INFO_0_MSDU_COUNT_LSB)
  225. #define HAL_RX_MPDU_FRAGMENT_FLAG_GET(mpdu_info_ptr) \
  226. (mpdu_info_ptr[RX_MPDU_DESC_INFO_0_FRAGMENT_FLAG_OFFSET >> 2] & \
  227. RX_MPDU_DESC_INFO_0_FRAGMENT_FLAG_MASK)
  228. #define HAL_RX_MPDU_RETRY_BIT_GET(mpdu_info_ptr) \
  229. (mpdu_info_ptr[RX_MPDU_DESC_INFO_0_MPDU_RETRY_BIT_OFFSET >> 2] & \
  230. RX_MPDU_DESC_INFO_0_MPDU_RETRY_BIT_MASK)
  231. #define HAL_RX_MPDU_AMPDU_FLAG_GET(mpdu_info_ptr) \
  232. (mpdu_info_ptr[RX_MPDU_DESC_INFO_0_AMPDU_FLAG_OFFSET >> 2] & \
  233. RX_MPDU_DESC_INFO_0_AMPDU_FLAG_MASK)
  234. #define HAL_RX_MPDU_RAW_MPDU_GET(mpdu_info_ptr) \
  235. (mpdu_info_ptr[RX_MPDU_DESC_INFO_0_RAW_MPDU_OFFSET >> 2] & \
  236. RX_MPDU_DESC_INFO_0_RAW_MPDU_MASK)
  237. #define HAL_RX_MPDU_FLAGS_GET(mpdu_info_ptr) \
  238. (HAL_RX_MPDU_FRAGMENT_FLAG_GET(mpdu_info_ptr) | \
  239. HAL_RX_MPDU_RETRY_BIT_GET(mpdu_info_ptr) | \
  240. HAL_RX_MPDU_AMPDU_FLAG_GET(mpdu_info_ptr) | \
  241. HAL_RX_MPDU_RAW_MPDU_GET(mpdu_info_ptr))
  242. #define HAL_RX_MSDU_PKT_LENGTH_GET(msdu_info_ptr) \
  243. (_HAL_MS((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  244. RX_MSDU_DESC_INFO_0_MSDU_LENGTH_OFFSET)), \
  245. RX_MSDU_DESC_INFO_0_MSDU_LENGTH_MASK, \
  246. RX_MSDU_DESC_INFO_0_MSDU_LENGTH_LSB))
  247. /*
  248. * NOTE: None of the following _GET macros need a right
  249. * shift by the corresponding _LSB. This is because, they are
  250. * finally taken and "OR'ed" into a single word again.
  251. */
  252. #define HAL_RX_FIRST_MSDU_IN_MPDU_FLAG_GET(msdu_info_ptr) \
  253. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  254. RX_MSDU_DESC_INFO_0_FIRST_MSDU_IN_MPDU_FLAG_OFFSET)) & \
  255. RX_MSDU_DESC_INFO_0_FIRST_MSDU_IN_MPDU_FLAG_MASK)
  256. #define HAL_RX_LAST_MSDU_IN_MPDU_FLAG_GET(msdu_info_ptr) \
  257. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  258. RX_MSDU_DESC_INFO_0_LAST_MSDU_IN_MPDU_FLAG_OFFSET)) & \
  259. RX_MSDU_DESC_INFO_0_LAST_MSDU_IN_MPDU_FLAG_MASK)
  260. #define HAL_RX_MSDU_CONTINUATION_FLAG_GET(msdu_info_ptr) \
  261. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  262. RX_MSDU_DESC_INFO_0_MSDU_CONTINUATION_OFFSET)) & \
  263. RX_MSDU_DESC_INFO_0_MSDU_CONTINUATION_MASK)
  264. #define HAL_RX_MSDU_SA_IS_VALID_FLAG_GET(msdu_info_ptr) \
  265. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  266. RX_MSDU_DESC_INFO_0_SA_IS_VALID_OFFSET)) & \
  267. RX_MSDU_DESC_INFO_0_SA_IS_VALID_MASK)
  268. #define HAL_RX_MSDU_SA_IDX_TIMEOUT_FLAG_GET(msdu_info_ptr) \
  269. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  270. RX_MSDU_DESC_INFO_0_SA_IDX_TIMEOUT_OFFSET)) & \
  271. RX_MSDU_DESC_INFO_0_SA_IDX_TIMEOUT_MASK)
  272. #define HAL_RX_MSDU_DA_IS_VALID_FLAG_GET(msdu_info_ptr) \
  273. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  274. RX_MSDU_DESC_INFO_0_DA_IS_VALID_OFFSET)) & \
  275. RX_MSDU_DESC_INFO_0_DA_IS_VALID_MASK)
  276. #define HAL_RX_MSDU_DA_IS_MCBC_FLAG_GET(msdu_info_ptr) \
  277. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  278. RX_MSDU_DESC_INFO_0_DA_IS_MCBC_OFFSET)) & \
  279. RX_MSDU_DESC_INFO_0_DA_IS_MCBC_MASK)
  280. #define HAL_RX_MSDU_DA_IDX_TIMEOUT_FLAG_GET(msdu_info_ptr) \
  281. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  282. RX_MSDU_DESC_INFO_0_DA_IDX_TIMEOUT_OFFSET)) & \
  283. RX_MSDU_DESC_INFO_0_DA_IDX_TIMEOUT_MASK)
  284. #define HAL_RX_MSDU_FLAGS_GET(msdu_info_ptr) \
  285. (HAL_RX_FIRST_MSDU_IN_MPDU_FLAG_GET(msdu_info_ptr) | \
  286. HAL_RX_LAST_MSDU_IN_MPDU_FLAG_GET(msdu_info_ptr) | \
  287. HAL_RX_MSDU_CONTINUATION_FLAG_GET(msdu_info_ptr) | \
  288. HAL_RX_MSDU_SA_IS_VALID_FLAG_GET(msdu_info_ptr) | \
  289. HAL_RX_MSDU_SA_IDX_TIMEOUT_FLAG_GET(msdu_info_ptr) | \
  290. HAL_RX_MSDU_DA_IS_VALID_FLAG_GET(msdu_info_ptr) | \
  291. HAL_RX_MSDU_DA_IS_MCBC_FLAG_GET(msdu_info_ptr) | \
  292. HAL_RX_MSDU_DA_IDX_TIMEOUT_FLAG_GET(msdu_info_ptr))
  293. #define HAL_RX_MSDU_DESC_INFO_GET(msdu_details_ptr) \
  294. ((struct rx_msdu_desc_info *) \
  295. _OFFSET_TO_BYTE_PTR(msdu_details_ptr, \
  296. RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET))
  297. static inline void hal_rx_mpdu_desc_info_get(void *desc_addr,
  298. struct hal_rx_mpdu_desc_info *mpdu_desc_info)
  299. {
  300. struct reo_destination_ring *reo_dst_ring;
  301. uint32_t mpdu_info[NUM_OF_DWORDS_RX_MPDU_DESC_INFO];
  302. reo_dst_ring = (struct reo_destination_ring *) desc_addr;
  303. qdf_mem_copy(&mpdu_info,
  304. (const void *)&reo_dst_ring->rx_mpdu_desc_info_details,
  305. sizeof(struct rx_mpdu_desc_info));
  306. mpdu_desc_info->msdu_count = HAL_RX_MPDU_MSDU_COUNT_GET(mpdu_info);
  307. mpdu_desc_info->mpdu_seq = HAL_RX_MPDU_SEQUENCE_NUMBER_GET(mpdu_info);
  308. mpdu_desc_info->mpdu_flags = HAL_RX_MPDU_FLAGS_GET(mpdu_info);
  309. mpdu_desc_info->peer_meta_data =
  310. HAL_RX_MPDU_DESC_PEER_META_DATA_GET(mpdu_info);
  311. }
  312. /*
  313. * @ hal_rx_msdu_desc_info_get: Gets the flags related to MSDU desciptor.
  314. * @ Specifically flags needed are:
  315. * @ first_msdu_in_mpdu, last_msdu_in_mpdu,
  316. * @ msdu_continuation, sa_is_valid,
  317. * @ sa_idx_timeout, da_is_valid, da_idx_timeout,
  318. * @ da_is_MCBC
  319. *
  320. * @ hal_rx_desc_cookie: Opaque cookie pointer used by HAL to get to the current
  321. * @ descriptor
  322. * @ msdu_desc_info: Holds MSDU descriptor info from HAL Rx descriptor
  323. * @ Return: void
  324. */
  325. static inline void hal_rx_msdu_desc_info_get(void *desc_addr,
  326. struct hal_rx_msdu_desc_info *msdu_desc_info)
  327. {
  328. struct reo_destination_ring *reo_dst_ring;
  329. uint32_t msdu_info[NUM_OF_DWORDS_RX_MSDU_DESC_INFO];
  330. reo_dst_ring = (struct reo_destination_ring *) desc_addr;
  331. qdf_mem_copy(&msdu_info,
  332. (const void *)&reo_dst_ring->rx_msdu_desc_info_details,
  333. sizeof(struct rx_msdu_desc_info));
  334. msdu_desc_info->msdu_flags = HAL_RX_MSDU_FLAGS_GET(msdu_info);
  335. msdu_desc_info->msdu_len = HAL_RX_MSDU_PKT_LENGTH_GET(msdu_info);
  336. }
  337. /*
  338. * hal_rxdma_buff_addr_info_set() - set the buffer_addr_info of the
  339. * rxdma ring entry.
  340. * @rxdma_entry: descriptor entry
  341. * @paddr: physical address of nbuf data pointer.
  342. * @cookie: SW cookie used as a index to SW rx desc.
  343. * @manager: who owns the nbuf (host, NSS, etc...).
  344. *
  345. */
  346. static inline void hal_rxdma_buff_addr_info_set(void *rxdma_entry,
  347. qdf_dma_addr_t paddr, uint32_t cookie, uint8_t manager)
  348. {
  349. uint32_t paddr_lo = ((u64)paddr & 0x00000000ffffffff);
  350. uint32_t paddr_hi = ((u64)paddr & 0xffffffff00000000) >> 32;
  351. HAL_RXDMA_PADDR_LO_SET(rxdma_entry, paddr_lo);
  352. HAL_RXDMA_PADDR_HI_SET(rxdma_entry, paddr_hi);
  353. HAL_RXDMA_COOKIE_SET(rxdma_entry, cookie);
  354. HAL_RXDMA_MANAGER_SET(rxdma_entry, manager);
  355. }
  356. /*
  357. * Structures & Macros to obtain fields from the TLV's in the Rx packet
  358. * pre-header.
  359. */
  360. /*
  361. * Every Rx packet starts at an offset from the top of the buffer.
  362. * If the host hasn't subscribed to any specific TLV, there is
  363. * still space reserved for the following TLV's from the start of
  364. * the buffer:
  365. * -- RX ATTENTION
  366. * -- RX MPDU START
  367. * -- RX MSDU START
  368. * -- RX MSDU END
  369. * -- RX MPDU END
  370. * -- RX PACKET HEADER (802.11)
  371. * If the host subscribes to any of the TLV's above, that TLV
  372. * if populated by the HW
  373. */
  374. #define NUM_DWORDS_TAG 1
  375. /* By default the packet header TLV is 128 bytes */
  376. #define NUM_OF_BYTES_RX_802_11_HDR_TLV 128
  377. #define NUM_OF_DWORDS_RX_802_11_HDR_TLV \
  378. (NUM_OF_BYTES_RX_802_11_HDR_TLV >> 2)
  379. #define RX_PKT_OFFSET_WORDS \
  380. ( \
  381. NUM_OF_DWORDS_RX_ATTENTION + NUM_DWORDS_TAG \
  382. NUM_OF_DWORDS_RX_MPDU_START + NUM_DWORDS_TAG \
  383. NUM_OF_DWORDS_RX_MSDU_START + NUM_DWORDS_TAG \
  384. NUM_OF_DWORDS_RX_MSDU_END + NUM_DWORDS_TAG \
  385. NUM_OF_DWORDS_RX_MPDU_END + NUM_DWORDS_TAG \
  386. NUM_OF_DWORDS_RX_802_11_HDR_TLV + NUM_DWORDS_TAG \
  387. )
  388. #define RX_PKT_OFFSET_BYTES \
  389. (RX_PKT_OFFSET_WORDS << 2)
  390. #define RX_PKT_HDR_TLV_LEN 120
  391. /*
  392. * Each RX descriptor TLV is preceded by 1 DWORD "tag"
  393. */
  394. struct rx_attention_tlv {
  395. uint32_t tag;
  396. struct rx_attention rx_attn;
  397. };
  398. struct rx_mpdu_start_tlv {
  399. uint32_t tag;
  400. struct rx_mpdu_start rx_mpdu_start;
  401. };
  402. struct rx_msdu_start_tlv {
  403. uint32_t tag;
  404. struct rx_msdu_start rx_msdu_start;
  405. };
  406. struct rx_msdu_end_tlv {
  407. uint32_t tag;
  408. struct rx_msdu_end rx_msdu_end;
  409. };
  410. struct rx_mpdu_end_tlv {
  411. uint32_t tag;
  412. struct rx_mpdu_end rx_mpdu_end;
  413. };
  414. struct rx_pkt_hdr_tlv {
  415. uint32_t tag; /* 4 B */
  416. uint32_t phy_ppdu_id; /* 4 B */
  417. char rx_pkt_hdr[RX_PKT_HDR_TLV_LEN]; /* 120 B */
  418. };
  419. #define RXDMA_OPTIMIZATION
  420. #ifdef RXDMA_OPTIMIZATION
  421. /*
  422. * The RX_PADDING_BYTES is required so that the TLV's don't
  423. * spread across the 128 byte boundary
  424. * RXDMA optimization requires:
  425. * 1) MSDU_END & ATTENTION TLV's follow in that order
  426. * 2) TLV's don't span across 128 byte lines
  427. * 3) Rx Buffer is nicely aligned on the 128 byte boundary
  428. */
  429. #if defined(WCSS_VERSION) && \
  430. ((defined(CONFIG_WIN) && (WCSS_VERSION >= 96)) || \
  431. (defined(CONFIG_MCL) && (WCSS_VERSION >= 72)))
  432. #define RX_PADDING0_BYTES 4
  433. #endif
  434. #define RX_PADDING1_BYTES 16
  435. struct rx_pkt_tlvs {
  436. struct rx_msdu_end_tlv msdu_end_tlv; /* 72 bytes */
  437. struct rx_attention_tlv attn_tlv; /* 16 bytes */
  438. struct rx_msdu_start_tlv msdu_start_tlv;/* 40 bytes */
  439. #if defined(WCSS_VERSION) && \
  440. ((defined(CONFIG_WIN) && (WCSS_VERSION >= 96)) || \
  441. (defined(CONFIG_MCL) && (WCSS_VERSION >= 72)))
  442. uint8_t rx_padding0[RX_PADDING0_BYTES]; /* 4 bytes */
  443. #endif
  444. struct rx_mpdu_start_tlv mpdu_start_tlv;/* 96 bytes */
  445. struct rx_mpdu_end_tlv mpdu_end_tlv; /* 12 bytes */
  446. uint8_t rx_padding1[RX_PADDING1_BYTES]; /* 16 bytes */
  447. struct rx_pkt_hdr_tlv pkt_hdr_tlv; /* 128 bytes */
  448. };
  449. #else /* RXDMA_OPTIMIZATION */
  450. struct rx_pkt_tlvs {
  451. struct rx_attention_tlv attn_tlv;
  452. struct rx_mpdu_start_tlv mpdu_start_tlv;
  453. struct rx_msdu_start_tlv msdu_start_tlv;
  454. struct rx_msdu_end_tlv msdu_end_tlv;
  455. struct rx_mpdu_end_tlv mpdu_end_tlv;
  456. struct rx_pkt_hdr_tlv pkt_hdr_tlv;
  457. };
  458. #endif /* RXDMA_OPTIMIZATION */
  459. #define RX_PKT_TLVS_LEN (sizeof(struct rx_pkt_tlvs))
  460. /*
  461. * Get msdu_done bit from the RX_ATTENTION TLV
  462. */
  463. #define HAL_RX_ATTN_MSDU_DONE_GET(_rx_attn) \
  464. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn, \
  465. RX_ATTENTION_2_MSDU_DONE_OFFSET)), \
  466. RX_ATTENTION_2_MSDU_DONE_MASK, \
  467. RX_ATTENTION_2_MSDU_DONE_LSB))
  468. static inline uint32_t
  469. hal_rx_attn_msdu_done_get(uint8_t *buf)
  470. {
  471. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  472. struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
  473. uint32_t msdu_done;
  474. msdu_done = HAL_RX_ATTN_MSDU_DONE_GET(rx_attn);
  475. return msdu_done;
  476. }
  477. /*
  478. * Get peer_meta_data from RX_MPDU_INFO within RX_MPDU_START
  479. */
  480. #define HAL_RX_MPDU_PEER_META_DATA_GET(_rx_mpdu_info) \
  481. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info, \
  482. RX_MPDU_INFO_8_PEER_META_DATA_OFFSET)), \
  483. RX_MPDU_INFO_8_PEER_META_DATA_MASK, \
  484. RX_MPDU_INFO_8_PEER_META_DATA_LSB))
  485. static inline uint32_t
  486. hal_rx_mpdu_peer_meta_data_get(uint8_t *buf)
  487. {
  488. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  489. struct rx_mpdu_start *mpdu_start =
  490. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  491. struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
  492. uint32_t peer_meta_data;
  493. peer_meta_data = HAL_RX_MPDU_PEER_META_DATA_GET(mpdu_info);
  494. return peer_meta_data;
  495. }
  496. #if defined(WCSS_VERSION) && \
  497. ((defined(CONFIG_WIN) && (WCSS_VERSION > 81)) || \
  498. (defined(CONFIG_MCL) && (WCSS_VERSION >= 72)))
  499. #define HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(_rx_msdu_end) \
  500. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end, \
  501. RX_MSDU_END_5_L3_HEADER_PADDING_OFFSET)), \
  502. RX_MSDU_END_5_L3_HEADER_PADDING_MASK, \
  503. RX_MSDU_END_5_L3_HEADER_PADDING_LSB))
  504. #else
  505. #define HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(_rx_msdu_end) \
  506. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end, \
  507. RX_MSDU_END_9_L3_HEADER_PADDING_OFFSET)), \
  508. RX_MSDU_END_9_L3_HEADER_PADDING_MASK, \
  509. RX_MSDU_END_9_L3_HEADER_PADDING_LSB))
  510. #endif
  511. /**
  512. * hal_rx_msdu_end_l3_hdr_padding_get(): API to get the
  513. * l3_header padding from rx_msdu_end TLV
  514. *
  515. * @ buf: pointer to the start of RX PKT TLV headers
  516. * Return: number of l3 header padding bytes
  517. */
  518. static inline uint32_t
  519. hal_rx_msdu_end_l3_hdr_padding_get(uint8_t *buf)
  520. {
  521. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  522. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  523. uint32_t l3_header_padding;
  524. l3_header_padding = HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(msdu_end);
  525. return l3_header_padding;
  526. }
  527. #define HAL_RX_MSDU_END_SA_IS_VALID_GET(_rx_msdu_end) \
  528. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end, \
  529. RX_MSDU_END_5_SA_IS_VALID_OFFSET)), \
  530. RX_MSDU_END_5_SA_IS_VALID_MASK, \
  531. RX_MSDU_END_5_SA_IS_VALID_LSB))
  532. /**
  533. * hal_rx_msdu_end_sa_is_valid_get(): API to get the
  534. * sa_is_valid bit from rx_msdu_end TLV
  535. *
  536. * @ buf: pointer to the start of RX PKT TLV headers
  537. * Return: sa_is_valid bit
  538. */
  539. static inline uint8_t
  540. hal_rx_msdu_end_sa_is_valid_get(uint8_t *buf)
  541. {
  542. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  543. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  544. uint8_t sa_is_valid;
  545. sa_is_valid = HAL_RX_MSDU_END_SA_IS_VALID_GET(msdu_end);
  546. return sa_is_valid;
  547. }
  548. #define HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(_rx_msdu_end) \
  549. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end, \
  550. RX_MSDU_END_16_SA_SW_PEER_ID_OFFSET)), \
  551. RX_MSDU_END_16_SA_SW_PEER_ID_MASK, \
  552. RX_MSDU_END_16_SA_SW_PEER_ID_LSB))
  553. /**
  554. * hal_rx_msdu_end_sa_sw_peer_id_get(): API to get the
  555. * sa_sw_peer_id from rx_msdu_end TLV
  556. *
  557. * @ buf: pointer to the start of RX PKT TLV headers
  558. * Return: sa_sw_peer_id index
  559. */
  560. static inline uint32_t
  561. hal_rx_msdu_end_sa_sw_peer_id_get(uint8_t *buf)
  562. {
  563. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  564. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  565. uint32_t sa_sw_peer_id;
  566. sa_sw_peer_id = HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(msdu_end);
  567. return sa_sw_peer_id;
  568. }
  569. #define HAL_RX_MSDU_START_MSDU_LEN_GET(_rx_msdu_start) \
  570. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_start, \
  571. RX_MSDU_START_1_MSDU_LENGTH_OFFSET)), \
  572. RX_MSDU_START_1_MSDU_LENGTH_MASK, \
  573. RX_MSDU_START_1_MSDU_LENGTH_LSB))
  574. /**
  575. * hal_rx_msdu_start_msdu_len_get(): API to get the MSDU length
  576. * from rx_msdu_start TLV
  577. *
  578. * @ buf: pointer to the start of RX PKT TLV headers
  579. * Return: msdu length
  580. */
  581. static inline uint32_t
  582. hal_rx_msdu_start_msdu_len_get(uint8_t *buf)
  583. {
  584. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  585. struct rx_msdu_start *msdu_start =
  586. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  587. uint32_t msdu_len;
  588. msdu_len = HAL_RX_MSDU_START_MSDU_LEN_GET(msdu_start);
  589. return msdu_len;
  590. }
  591. /*
  592. * Get qos_control_valid from RX_MPDU_START
  593. */
  594. #define HAL_RX_MPDU_INFO_QOS_CONTROL_VALID_GET(_rx_mpdu_info) \
  595. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_mpdu_info), \
  596. RX_MPDU_INFO_2_MPDU_SEQUENCE_CONTROL_VALID_OFFSET)), \
  597. RX_MPDU_INFO_2_MPDU_SEQUENCE_CONTROL_VALID_MASK, \
  598. RX_MPDU_INFO_2_MPDU_SEQUENCE_CONTROL_VALID_LSB))
  599. static inline uint32_t
  600. hal_rx_mpdu_start_mpdu_qos_control_valid_get(uint8_t *buf)
  601. {
  602. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  603. struct rx_mpdu_start *mpdu_start =
  604. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  605. uint32_t qos_control_valid;
  606. qos_control_valid = HAL_RX_MPDU_INFO_QOS_CONTROL_VALID_GET(
  607. &(mpdu_start->rx_mpdu_info_details));
  608. return qos_control_valid;
  609. }
  610. /*
  611. * Get tid from RX_MPDU_START
  612. */
  613. #define HAL_RX_MPDU_INFO_TID_GET(_rx_mpdu_info) \
  614. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_mpdu_info), \
  615. RX_MPDU_INFO_3_TID_OFFSET)), \
  616. RX_MPDU_INFO_3_TID_MASK, \
  617. RX_MPDU_INFO_3_TID_LSB))
  618. static inline uint32_t
  619. hal_rx_mpdu_start_tid_get(uint8_t *buf)
  620. {
  621. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  622. struct rx_mpdu_start *mpdu_start =
  623. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  624. uint32_t tid;
  625. tid = HAL_RX_MPDU_INFO_TID_GET(
  626. &(mpdu_start->rx_mpdu_info_details));
  627. return tid;
  628. }
  629. /*
  630. * Get SW peer id from RX_MPDU_START
  631. */
  632. #define HAL_RX_MPDU_INFO_SW_PEER_ID_GET(_rx_mpdu_info) \
  633. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_mpdu_info), \
  634. RX_MPDU_INFO_1_SW_PEER_ID_OFFSET)), \
  635. RX_MPDU_INFO_1_SW_PEER_ID_MASK, \
  636. RX_MPDU_INFO_1_SW_PEER_ID_LSB))
  637. static inline uint32_t
  638. hal_rx_mpdu_start_sw_peer_id_get(uint8_t *buf)
  639. {
  640. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  641. struct rx_mpdu_start *mpdu_start =
  642. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  643. uint32_t sw_peer_id;
  644. sw_peer_id = HAL_RX_MPDU_INFO_SW_PEER_ID_GET(
  645. &(mpdu_start->rx_mpdu_info_details));
  646. return sw_peer_id;
  647. }
  648. #if defined(WCSS_VERSION) && \
  649. ((defined(CONFIG_WIN) && (WCSS_VERSION > 81)) || \
  650. (defined(CONFIG_MCL) && (WCSS_VERSION >= 72)))
  651. #define HAL_RX_MSDU_START_SGI_GET(_rx_msdu_start) \
  652. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start),\
  653. RX_MSDU_START_5_SGI_OFFSET)), \
  654. RX_MSDU_START_5_SGI_MASK, \
  655. RX_MSDU_START_5_SGI_LSB))
  656. #else
  657. #define HAL_RX_MSDU_START_SGI_GET(_rx_msdu_start) \
  658. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start),\
  659. RX_MSDU_START_6_SGI_OFFSET)), \
  660. RX_MSDU_START_6_SGI_MASK, \
  661. RX_MSDU_START_6_SGI_LSB))
  662. #endif
  663. /**
  664. * hal_rx_msdu_start_msdu_sgi_get(): API to get the Short Gaurd
  665. * Interval from rx_msdu_start TLV
  666. *
  667. * @buf: pointer to the start of RX PKT TLV headers
  668. * Return: uint32_t(sgi)
  669. */
  670. static inline uint32_t
  671. hal_rx_msdu_start_sgi_get(uint8_t *buf)
  672. {
  673. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  674. struct rx_msdu_start *msdu_start =
  675. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  676. uint32_t sgi;
  677. sgi = HAL_RX_MSDU_START_SGI_GET(msdu_start);
  678. return sgi;
  679. }
  680. #if defined(WCSS_VERSION) && \
  681. ((defined(CONFIG_WIN) && (WCSS_VERSION > 81)) || \
  682. (defined(CONFIG_MCL) && (WCSS_VERSION >= 72)))
  683. #define HAL_RX_MSDU_START_RATE_MCS_GET(_rx_msdu_start) \
  684. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start),\
  685. RX_MSDU_START_5_RATE_MCS_OFFSET)), \
  686. RX_MSDU_START_5_RATE_MCS_MASK, \
  687. RX_MSDU_START_5_RATE_MCS_LSB))
  688. #else
  689. #define HAL_RX_MSDU_START_RATE_MCS_GET(_rx_msdu_start) \
  690. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start),\
  691. RX_MSDU_START_6_RATE_MCS_OFFSET)), \
  692. RX_MSDU_START_6_RATE_MCS_MASK, \
  693. RX_MSDU_START_6_RATE_MCS_LSB))
  694. #endif
  695. /**
  696. * hal_rx_msdu_start_msdu_rate_mcs_get(): API to get the MCS rate
  697. * from rx_msdu_start TLV
  698. *
  699. * @buf: pointer to the start of RX PKT TLV headers
  700. * Return: uint32_t(rate_mcs)
  701. */
  702. static inline uint32_t
  703. hal_rx_msdu_start_rate_mcs_get(uint8_t *buf)
  704. {
  705. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  706. struct rx_msdu_start *msdu_start =
  707. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  708. uint32_t rate_mcs;
  709. rate_mcs = HAL_RX_MSDU_START_RATE_MCS_GET(msdu_start);
  710. return rate_mcs;
  711. }
  712. #define HAL_RX_ATTN_DECRYPT_STATUS_GET(_rx_attn) \
  713. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn, \
  714. RX_ATTENTION_2_DECRYPT_STATUS_CODE_OFFSET)), \
  715. RX_ATTENTION_2_DECRYPT_STATUS_CODE_MASK, \
  716. RX_ATTENTION_2_DECRYPT_STATUS_CODE_LSB))
  717. /*
  718. * hal_rx_attn_msdu_get_is_decrypted(): API to get the decrypt status of the
  719. * packet from rx_attention
  720. *
  721. * @buf: pointer to the start of RX PKT TLV header
  722. * Return: uint32_t(decryt status)
  723. */
  724. static inline uint32_t
  725. hal_rx_attn_msdu_get_is_decrypted(uint8_t *buf)
  726. {
  727. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  728. struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
  729. uint32_t is_decrypt = 0;
  730. uint32_t decrypt_status;
  731. decrypt_status = HAL_RX_ATTN_DECRYPT_STATUS_GET(rx_attn);
  732. if (!decrypt_status)
  733. is_decrypt = 1;
  734. return is_decrypt;
  735. }
  736. /*
  737. * Get key index from RX_MSDU_END
  738. */
  739. #define HAL_RX_MSDU_END_KEYID_OCTET_GET(_rx_msdu_end) \
  740. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end, \
  741. RX_MSDU_END_2_KEY_ID_OCTET_OFFSET)), \
  742. RX_MSDU_END_2_KEY_ID_OCTET_MASK, \
  743. RX_MSDU_END_2_KEY_ID_OCTET_LSB))
  744. /*
  745. * hal_rx_msdu_get_keyid(): API to get the key id if the decrypted packet
  746. * from rx_msdu_end
  747. *
  748. * @buf: pointer to the start of RX PKT TLV header
  749. * Return: uint32_t(key id)
  750. */
  751. static inline uint32_t
  752. hal_rx_msdu_get_keyid(uint8_t *buf)
  753. {
  754. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  755. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  756. uint32_t keyid_octet;
  757. keyid_octet = HAL_RX_MSDU_END_KEYID_OCTET_GET(msdu_end);
  758. return (keyid_octet >> 6) & 0x3;
  759. }
  760. #define HAL_RX_MSDU_START_RSSI_GET(_rx_msdu_start) \
  761. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_start, \
  762. RX_MSDU_START_5_USER_RSSI_OFFSET)), \
  763. RX_MSDU_START_5_USER_RSSI_MASK, \
  764. RX_MSDU_START_5_USER_RSSI_LSB))
  765. /*
  766. * hal_rx_msdu_start_get_rssi(): API to get the rssi of received pkt
  767. * from rx_msdu_start
  768. *
  769. * @buf: pointer to the start of RX PKT TLV header
  770. * Return: uint32_t(rssi)
  771. */
  772. static inline uint32_t
  773. hal_rx_msdu_start_get_rssi(uint8_t *buf)
  774. {
  775. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  776. struct rx_msdu_start *msdu_start = &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  777. uint32_t rssi;
  778. rssi = HAL_RX_MSDU_START_RSSI_GET(msdu_start);
  779. return rssi;
  780. }
  781. #define HAL_RX_MSDU_START_FREQ_GET(_rx_msdu_start) \
  782. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_start, \
  783. RX_MSDU_START_7_SW_PHY_META_DATA_OFFSET)), \
  784. RX_MSDU_START_7_SW_PHY_META_DATA_MASK, \
  785. RX_MSDU_START_7_SW_PHY_META_DATA_LSB))
  786. /*
  787. * hal_rx_msdu_start_get_freq(): API to get the frequency of operating channel
  788. * from rx_msdu_start
  789. *
  790. * @buf: pointer to the start of RX PKT TLV header
  791. * Return: uint32_t(frequency)
  792. */
  793. static inline uint32_t
  794. hal_rx_msdu_start_get_freq(uint8_t *buf)
  795. {
  796. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  797. struct rx_msdu_start *msdu_start =
  798. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  799. uint32_t freq;
  800. freq = HAL_RX_MSDU_START_FREQ_GET(msdu_start);
  801. return freq;
  802. }
  803. #define HAL_RX_MSDU_START_PKT_TYPE_GET(_rx_msdu_start) \
  804. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_start, \
  805. RX_MSDU_START_5_PKT_TYPE_OFFSET)), \
  806. RX_MSDU_START_5_PKT_TYPE_MASK, \
  807. RX_MSDU_START_5_PKT_TYPE_LSB))
  808. /*
  809. * hal_rx_msdu_start_get_pkt_type(): API to get the pkt type
  810. * from rx_msdu_start
  811. *
  812. * @buf: pointer to the start of RX PKT TLV header
  813. * Return: uint32_t(pkt type)
  814. */
  815. static inline uint32_t
  816. hal_rx_msdu_start_get_pkt_type(uint8_t *buf)
  817. {
  818. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  819. struct rx_msdu_start *msdu_start = &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  820. uint32_t pkt_type;
  821. pkt_type = HAL_RX_MSDU_START_PKT_TYPE_GET(msdu_start);
  822. return pkt_type;
  823. }
  824. #define HAL_RX_MSDU_START_NSS_GET(_rx_msdu_start) \
  825. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start),\
  826. RX_MSDU_START_5_NSS_OFFSET)), \
  827. RX_MSDU_START_5_NSS_MASK, \
  828. RX_MSDU_START_5_NSS_LSB))
  829. /*
  830. * hal_rx_msdu_start_nss_get(): API to get the NSS
  831. * Interval from rx_msdu_start
  832. *
  833. * @buf: pointer to the start of RX PKT TLV header
  834. * Return: uint32_t(nss)
  835. */
  836. static inline uint32_t
  837. hal_rx_msdu_start_nss_get(uint8_t *buf)
  838. {
  839. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  840. struct rx_msdu_start *msdu_start =
  841. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  842. uint32_t nss;
  843. nss = HAL_RX_MSDU_START_NSS_GET(msdu_start);
  844. return nss;
  845. }
  846. /*******************************************************************************
  847. * RX ERROR APIS
  848. ******************************************************************************/
  849. /*******************************************************************************
  850. * RX REO ERROR APIS
  851. ******************************************************************************/
  852. #define HAL_RX_LINK_DESC_MSDU0_PTR(link_desc) \
  853. ((struct rx_msdu_details *) \
  854. _OFFSET_TO_BYTE_PTR((link_desc),\
  855. RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET))
  856. #define HAL_RX_NUM_MSDU_DESC 6
  857. struct hal_rx_msdu_list {
  858. struct hal_rx_msdu_desc_info msdu_info[HAL_RX_NUM_MSDU_DESC];
  859. uint32_t sw_cookie[HAL_RX_NUM_MSDU_DESC];
  860. };
  861. struct hal_buf_info {
  862. uint64_t paddr;
  863. uint32_t sw_cookie;
  864. };
  865. /**
  866. * hal_rx_msdu_link_desc_get: API to get the MSDU information
  867. * from the MSDU link descriptor
  868. *
  869. * @ msdu_link_desc: Opaque pointer used by HAL to get to the
  870. * MSDU link descriptor (struct rx_msdu_link)
  871. * @ msdu_list: Return the list of MSDUs contained in this link descriptor
  872. * Return: void
  873. */
  874. static inline void hal_rx_msdu_list_get(void *msdu_link_desc,
  875. struct hal_rx_msdu_list *msdu_list, uint8_t *num_msdus)
  876. {
  877. struct rx_msdu_details *msdu_details;
  878. struct rx_msdu_desc_info *msdu_desc_info;
  879. struct rx_msdu_link *msdu_link = (struct rx_msdu_link *)msdu_link_desc;
  880. int i;
  881. *num_msdus = 0;
  882. msdu_details = HAL_RX_LINK_DESC_MSDU0_PTR(msdu_link);
  883. for (i = 0; i < HAL_RX_NUM_MSDU_DESC; i++) {
  884. msdu_desc_info = HAL_RX_MSDU_DESC_INFO_GET(&msdu_details[i]);
  885. msdu_list->msdu_info[i].msdu_flags =
  886. HAL_RX_MSDU_FLAGS_GET(msdu_desc_info);
  887. msdu_list->msdu_info[i].msdu_len =
  888. HAL_RX_MSDU_PKT_LENGTH_GET(msdu_desc_info);
  889. msdu_list->sw_cookie[i] =
  890. HAL_RX_BUF_COOKIE_GET(
  891. &msdu_details[i].buffer_addr_info_details);
  892. }
  893. *num_msdus = i;
  894. }
  895. /**
  896. * hal_rx_reo_buf_paddr_get: Gets the physical address and
  897. * cookie from the REO destination ring element
  898. *
  899. * @ hal_rx_desc_cookie: Opaque cookie pointer used by HAL to get to
  900. * the current descriptor
  901. * @ buf_info: structure to return the buffer information
  902. * Return: void
  903. */
  904. static inline void hal_rx_reo_buf_paddr_get(void *rx_desc,
  905. struct hal_buf_info *buf_info)
  906. {
  907. struct reo_destination_ring *reo_ring =
  908. (struct reo_destination_ring *)rx_desc;
  909. buf_info->paddr =
  910. (HAL_RX_REO_BUFFER_ADDR_31_0_GET(reo_ring) |
  911. ((uint64_t)(HAL_RX_REO_BUFFER_ADDR_39_32_GET(reo_ring)) << 32));
  912. buf_info->sw_cookie = HAL_RX_REO_BUF_COOKIE_GET(reo_ring);
  913. }
  914. /**
  915. * enum hal_reo_error_code: Indicates that type of buffer or descriptor
  916. *
  917. * @ HAL_RX_MSDU_BUF_ADDR_TYPE : Reo buffer address points to the MSDU buffer
  918. * @ HAL_RX_MSDU_LINK_DESC_TYPE: Reo buffer address points to the link
  919. * descriptor
  920. */
  921. enum hal_rx_reo_buf_type {
  922. HAL_RX_REO_MSDU_BUF_ADDR_TYPE = 0,
  923. HAL_RX_REO_MSDU_LINK_DESC_TYPE,
  924. };
  925. #define HAL_RX_REO_BUF_TYPE_GET(reo_desc) (((*(((uint32_t *) reo_desc)+ \
  926. (REO_DESTINATION_RING_7_REO_DEST_BUFFER_TYPE_OFFSET >> 2))) & \
  927. REO_DESTINATION_RING_7_REO_DEST_BUFFER_TYPE_MASK) >> \
  928. REO_DESTINATION_RING_7_REO_DEST_BUFFER_TYPE_LSB)
  929. /**
  930. * enum hal_reo_error_code: Error code describing the type of error detected
  931. *
  932. * @ HAL_REO_ERR_QUEUE_DESC_ADDR_0 : Reo queue descriptor provided in the
  933. * REO_ENTRANCE ring is set to 0
  934. * @ HAL_REO_ERR_QUEUE_DESC_INVALID: Reo queue descriptor valid bit is NOT set
  935. * @ HAL_REO_ERR_AMPDU_IN_NON_BA : AMPDU frame received without BA session
  936. * having been setup
  937. * @ HAL_REO_ERR_NON_BA_DUPLICATE : Non-BA session, SN equal to SSN,
  938. * Retry bit set: duplicate frame
  939. * @ HAL_REO_ERR_BA_DUPLICATE : BA session, duplicate frame
  940. * @ HAL_REO_ERR_REGULAR_FRAME_2K_JUMP : A normal (management/data frame)
  941. * received with 2K jump in SN
  942. * @ HAL_REO_ERR_BAR_FRAME_2K_JUMP : A bar received with 2K jump in SSN
  943. * @ HAL_REO_ERR_REGULAR_FRAME_OOR : A normal (management/data frame) received
  944. * with SN falling within the OOR window
  945. * @ HAL_REO_ERR_BAR_FRAME_OOR : A bar received with SSN falling within the
  946. * OOR window
  947. * @ HAL_REO_ERR_BAR_FRAME_NO_BA_SESSION : A bar received without a BA session
  948. * @ HAL_REO_ERR_BAR_FRAME_SN_EQUALS_SSN : A bar received with SSN equal to SN
  949. * @ HAL_REO_ERR_PN_CHECK_FAILED : PN Check Failed packet
  950. * @ HAL_REO_ERR_2K_ERROR_HANDLING_FLAG_SET : Frame is forwarded as a result
  951. * of the ‘Seq_2k_error_detected_flag’ been set in the REO Queue descriptor
  952. * @ HAL_REO_ERR_PN_ERROR_HANDLING_FLAG_SET : Frame is forwarded as a result
  953. * of the ‘pn_error_detected_flag’ been set in the REO Queue descriptor
  954. * @ HAL_REO_ERR_QUEUE_DESC_BLOCKED_SET : Frame is forwarded as a result of
  955. * the queue descriptor(address) being blocked as SW/FW seems to be currently
  956. * in the process of making updates to this descriptor
  957. */
  958. enum hal_reo_error_code {
  959. HAL_REO_ERR_QUEUE_DESC_ADDR_0 = 0,
  960. HAL_REO_ERR_QUEUE_DESC_INVALID,
  961. HAL_REO_ERR_AMPDU_IN_NON_BA,
  962. HAL_REO_ERR_NON_BA_DUPLICATE,
  963. HAL_REO_ERR_BA_DUPLICATE,
  964. HAL_REO_ERR_REGULAR_FRAME_2K_JUMP,
  965. HAL_REO_ERR_BAR_FRAME_2K_JUMP,
  966. HAL_REO_ERR_REGULAR_FRAME_OOR,
  967. HAL_REO_ERR_BAR_FRAME_OOR,
  968. HAL_REO_ERR_BAR_FRAME_NO_BA_SESSION,
  969. HAL_REO_ERR_BAR_FRAME_SN_EQUALS_SSN,
  970. HAL_REO_ERR_PN_CHECK_FAILED,
  971. HAL_REO_ERR_2K_ERROR_HANDLING_FLAG_SET,
  972. HAL_REO_ERR_PN_ERROR_HANDLING_FLAG_SET,
  973. HAL_REO_ERR_QUEUE_DESC_BLOCKED_SET
  974. };
  975. #define HAL_RX_REO_ERROR_GET(reo_desc) (((*(((uint32_t *) reo_desc)+ \
  976. (REO_DESTINATION_RING_7_REO_ERROR_CODE_OFFSET >> 2))) & \
  977. REO_DESTINATION_RING_7_REO_ERROR_CODE_MASK) >> \
  978. REO_DESTINATION_RING_7_REO_ERROR_CODE_LSB)
  979. /**
  980. * hal_rx_is_pn_error() - Indicate if this error was caused by a
  981. * PN check failure
  982. *
  983. * @reo_desc: opaque pointer used by HAL to get the REO destination entry
  984. *
  985. * Return: true: error caused by PN check, false: other error
  986. */
  987. static inline bool hal_rx_reo_is_pn_error(void *rx_desc)
  988. {
  989. struct reo_destination_ring *reo_desc =
  990. (struct reo_destination_ring *)rx_desc;
  991. return ((HAL_RX_REO_ERROR_GET(reo_desc) ==
  992. HAL_REO_ERR_PN_CHECK_FAILED) |
  993. (HAL_RX_REO_ERROR_GET(reo_desc) ==
  994. HAL_REO_ERR_PN_ERROR_HANDLING_FLAG_SET)) ?
  995. true : false;
  996. }
  997. /**
  998. * hal_rx_is_2k_jump() - Indicate if this error was caused by a 2K jump in
  999. * the sequence number
  1000. *
  1001. * @ring_desc: opaque pointer used by HAL to get the REO destination entry
  1002. *
  1003. * Return: true: error caused by 2K jump, false: other error
  1004. */
  1005. static inline bool hal_rx_reo_is_2k_jump(void *rx_desc)
  1006. {
  1007. struct reo_destination_ring *reo_desc =
  1008. (struct reo_destination_ring *)rx_desc;
  1009. return ((HAL_RX_REO_ERROR_GET(reo_desc) ==
  1010. HAL_REO_ERR_REGULAR_FRAME_2K_JUMP) |
  1011. (HAL_RX_REO_ERROR_GET(reo_desc) ==
  1012. HAL_REO_ERR_2K_ERROR_HANDLING_FLAG_SET)) ?
  1013. true : false;
  1014. }
  1015. /**
  1016. * hal_rx_msdu_link_desc_set: Retrieves MSDU Link Descriptor to WBM
  1017. *
  1018. * @ soc : HAL version of the SOC pointer
  1019. * @ src_srng_desc : void pointer to the WBM Release Ring descriptor
  1020. * @ buf_addr_info : void pointer to the buffer_addr_info
  1021. *
  1022. * Return: void
  1023. */
  1024. /* look at implementation at dp_hw_link_desc_pool_setup()*/
  1025. static inline void hal_rx_msdu_link_desc_set(struct hal_soc *soc,
  1026. void *src_srng_desc, void *buf_addr_info)
  1027. {
  1028. struct wbm_release_ring *wbm_rel_srng =
  1029. (struct wbm_release_ring *)src_srng_desc;
  1030. /* Structure copy !!! */
  1031. wbm_rel_srng->released_buff_or_desc_addr_info =
  1032. *((struct buffer_addr_info *)buf_addr_info);
  1033. }
  1034. /*
  1035. * hal_rx_msdu_link_desc_reinject: Re-injects the MSDU link descriptor to
  1036. * REO entrance ring
  1037. *
  1038. * @ soc: HAL version of the SOC pointer
  1039. * @ pa: Physical address of the MSDU Link Descriptor
  1040. * @ cookie: SW cookie to get to the virtual address
  1041. * @ error_enabled_reo_q: Argument to determine whether this needs to go
  1042. * to the error enabled REO queue
  1043. *
  1044. * Return: void
  1045. */
  1046. static inline void hal_rx_msdu_link_desc_reinject(struct hal_soc *soc,
  1047. uint64_t pa, uint32_t cookie, bool error_enabled_reo_q)
  1048. {
  1049. /* TODO */
  1050. }
  1051. /**
  1052. * HAL_RX_BUF_ADDR_INFO_GET: Returns the address of the
  1053. * BUFFER_ADDR_INFO, give the RX descriptor
  1054. * (Assumption -- BUFFER_ADDR_INFO is the
  1055. * first field in the descriptor structure)
  1056. */
  1057. #define HAL_RX_BUF_ADDR_INFO_GET(ring_desc) ((void *)(ring_desc))
  1058. #define HAL_RX_REO_BUF_ADDR_INFO_GET HAL_RX_BUF_ADDR_INFO_GET
  1059. #define HAL_RX_WBM_BUF_ADDR_INFO_GET HAL_RX_BUF_ADDR_INFO_GET
  1060. /**
  1061. * hal_rx_ret_buf_manager_get: Returns the "return_buffer_manager"
  1062. * from the BUFFER_ADDR_INFO structure
  1063. * given a REO destination ring descriptor.
  1064. * @ ring_desc: RX(REO/WBM release) destination ring descriptor
  1065. *
  1066. * Return: uint8_t (value of the return_buffer_manager)
  1067. */
  1068. static inline
  1069. uint8_t hal_rx_ret_buf_manager_get(void *ring_desc)
  1070. {
  1071. /*
  1072. * The following macro takes buf_addr_info as argument,
  1073. * but since buf_addr_info is the first field in ring_desc
  1074. * Hence the following call is OK
  1075. */
  1076. return HAL_RX_BUF_RBM_GET(ring_desc);
  1077. }
  1078. /*******************************************************************************
  1079. * RX WBM ERROR APIS
  1080. ******************************************************************************/
  1081. /**
  1082. * enum hal_rx_wbm_error_source: Indicates which module initiated the
  1083. * release of this buffer or descriptor
  1084. *
  1085. * @ HAL_RX_WBM_ERR_SRC_TQM : TQM released this buffer or descriptor
  1086. * @ HAL_RX_WBM_ERR_SRC_RXDMA: RXDMA released this buffer or descriptor
  1087. * @ HAL_RX_WBM_ERR_SRC_REO: REO released this buffer or descriptor
  1088. * @ HAL_RX_WBM_ERR_SRC_FW: FW released this buffer or descriptor
  1089. * @ HAL_RX_WBM_ERR_SRC_SW: SW released this buffer or descriptor
  1090. */
  1091. enum hal_rx_wbm_error_source {
  1092. HAL_RX_WBM_ERR_SRC_TQM = 0,
  1093. HAL_RX_WBM_ERR_SRC_RXDMA,
  1094. HAL_RX_WBM_ERR_SRC_REO,
  1095. HAL_RX_WBM_ERR_SRC_FW,
  1096. HAL_RX_WBM_ERR_SRC_SW,
  1097. };
  1098. #define HAL_RX_WBM_ERR_SRC_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \
  1099. (WBM_RELEASE_RING_2_RELEASE_SOURCE_MODULE_OFFSET >> 2))) & \
  1100. WBM_RELEASE_RING_2_RELEASE_SOURCE_MODULE_MASK) >> \
  1101. WBM_RELEASE_RING_2_RELEASE_SOURCE_MODULE_LSB)
  1102. /**
  1103. * enum hal_rx_wbm_buf_type: Indicates that type of buffer or descriptor
  1104. * released
  1105. *
  1106. * @ HAL_RX_WBM_ERR_SRC_TQM : TQM released this buffer or descriptor
  1107. * @ HAL_RX_WBM_ERR_SRC_RXDMA: RXDMA released this buffer or descriptor
  1108. * @ HAL_RX_WBM_ERR_SRC_REO: REO released this buffer or descriptor
  1109. * @ HAL_RX_WBM_ERR_SRC_FW: FW released this buffer or descriptor
  1110. * @ HAL_RX_WBM_ERR_SRC_SW: SW released this buffer or descriptor
  1111. */
  1112. enum hal_rx_wbm_buf_type {
  1113. HAL_RX_WBM_BUF_TYPE_REL_BUF = 0,
  1114. HAL_RX_WBM_BUF_TYPE_MSDU_LINK_DESC,
  1115. HAL_RX_WBM_BUF_TYPE_MPDU_LINK_DESC,
  1116. HAL_RX_WBM_BUF_TYPE_MSDU_EXT_DESC,
  1117. HAL_RX_WBM_BUF_TYPE_Q_EXT_DESC,
  1118. };
  1119. #define HAL_RX_WBM_BUF_TYPE_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \
  1120. (WBM_RELEASE_RING_2_BUFFER_OR_DESC_TYPE_OFFSET >> 2))) & \
  1121. WBM_RELEASE_RING_2_BUFFER_OR_DESC_TYPE_MASK) >> \
  1122. WBM_RELEASE_RING_2_BUFFER_OR_DESC_TYPE_LSB)
  1123. /**
  1124. * enum - hal_rx_wbm_reo_push_reason: Indicates why REO pushed
  1125. * the frame to this release ring
  1126. *
  1127. * @ HAL_RX_WBM_REO_PSH_RSN_ERROR : Reo detected an error and pushed this
  1128. * frame to this queue
  1129. * @ HAL_RX_WBM_REO_PSH_RSN_ROUTE: Reo pushed the frame to this queue per
  1130. * received routing instructions. No error within REO was detected
  1131. */
  1132. enum hal_rx_wbm_reo_push_reason {
  1133. HAL_RX_WBM_REO_PSH_RSN_ERROR = 0,
  1134. HAL_RX_WBM_REO_PSH_RSN_ROUTE,
  1135. };
  1136. #define HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \
  1137. (WBM_RELEASE_RING_2_REO_PUSH_REASON_OFFSET >> 2))) & \
  1138. WBM_RELEASE_RING_2_REO_PUSH_REASON_MASK) >> \
  1139. WBM_RELEASE_RING_2_REO_PUSH_REASON_LSB)
  1140. #define HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \
  1141. (WBM_RELEASE_RING_2_REO_ERROR_CODE_OFFSET >> 2))) & \
  1142. WBM_RELEASE_RING_2_REO_ERROR_CODE_MASK) >> \
  1143. WBM_RELEASE_RING_2_REO_ERROR_CODE_LSB)
  1144. /**
  1145. * enum hal_rx_wbm_rxdma_push_reason: Indicates why REO pushed the frame to
  1146. * this release ring
  1147. *
  1148. * @ HAL_RX_WBM_RXDMA_PSH_RSN_ERROR : RXDMA detected an error and pushed
  1149. * this frame to this queue
  1150. * @ HAL_RX_WBM_RXDMA_PSH_RSN_ROUTE: RXDMA pushed the frame to this queue
  1151. * per received routing instructions. No error within RXDMA was detected
  1152. */
  1153. enum hal_rx_wbm_rxdma_push_reason {
  1154. HAL_RX_WBM_RXDMA_PSH_RSN_ERROR = 0,
  1155. HAL_RX_WBM_RXDMA_PSH_RSN_ROUTE,
  1156. };
  1157. #define HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc) \
  1158. (((*(((uint32_t *) wbm_desc) + \
  1159. (WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_OFFSET >> 2))) & \
  1160. WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_MASK) >> \
  1161. WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_LSB)
  1162. #define HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc) \
  1163. (((*(((uint32_t *) wbm_desc) + \
  1164. (WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_OFFSET >> 2))) & \
  1165. WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_MASK) >> \
  1166. WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_LSB)
  1167. #define HAL_RX_WBM_BUF_COOKIE_GET(wbm_desc) \
  1168. HAL_RX_BUF_COOKIE_GET(&((struct wbm_release_ring *) \
  1169. wbm_desc)->released_buff_or_desc_addr_info)
  1170. #endif /* _HAL_RX_H */