hal_rx.h 74 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448
  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. ~BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK); \
  156. ((*(((unsigned int *) buff_addr_info) + \
  157. (BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_OFFSET >> 2))) |= \
  158. (cookie << BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB) & \
  159. BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK)
  160. /*
  161. * macro to set the manager into the rxdma ring entry
  162. */
  163. #define HAL_RXDMA_MANAGER_SET(buff_addr_info, manager) \
  164. ((*(((unsigned int *) buff_addr_info) + \
  165. (BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_OFFSET >> 2))) &= \
  166. ~BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK); \
  167. ((*(((unsigned int *) buff_addr_info) + \
  168. (BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_OFFSET >> 2))) |= \
  169. (manager << BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB) & \
  170. BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK)
  171. #define HAL_RX_ERROR_STATUS_GET(reo_desc) \
  172. (_HAL_MS((*_OFFSET_TO_WORD_PTR(reo_desc, \
  173. REO_DESTINATION_RING_7_REO_PUSH_REASON_OFFSET)),\
  174. REO_DESTINATION_RING_7_REO_PUSH_REASON_MASK, \
  175. REO_DESTINATION_RING_7_REO_PUSH_REASON_LSB))
  176. #define HAL_RX_BUF_COOKIE_GET(buff_addr_info) \
  177. (_HAL_MS((*_OFFSET_TO_WORD_PTR(buff_addr_info, \
  178. BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_OFFSET)), \
  179. BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK, \
  180. BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB))
  181. #define HAL_RX_BUFFER_ADDR_39_32_GET(buff_addr_info) \
  182. (_HAL_MS((*_OFFSET_TO_WORD_PTR(buff_addr_info, \
  183. BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_OFFSET)), \
  184. BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK, \
  185. BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB))
  186. #define HAL_RX_BUFFER_ADDR_31_0_GET(buff_addr_info) \
  187. (_HAL_MS((*_OFFSET_TO_WORD_PTR(buff_addr_info, \
  188. BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_OFFSET)), \
  189. BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK, \
  190. BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB))
  191. #define HAL_RX_BUF_RBM_GET(buff_addr_info) \
  192. (_HAL_MS((*_OFFSET_TO_WORD_PTR(buff_addr_info, \
  193. BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_OFFSET)),\
  194. BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK, \
  195. BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB))
  196. /* TODO: Convert the following structure fields accesseses to offsets */
  197. #define HAL_RX_REO_BUFFER_ADDR_39_32_GET(reo_desc) \
  198. (HAL_RX_BUFFER_ADDR_39_32_GET(& \
  199. (((struct reo_destination_ring *) \
  200. reo_desc)->buf_or_link_desc_addr_info)))
  201. #define HAL_RX_REO_BUFFER_ADDR_31_0_GET(reo_desc) \
  202. (HAL_RX_BUFFER_ADDR_31_0_GET(& \
  203. (((struct reo_destination_ring *) \
  204. reo_desc)->buf_or_link_desc_addr_info)))
  205. #define HAL_RX_REO_BUF_COOKIE_GET(reo_desc) \
  206. (HAL_RX_BUF_COOKIE_GET(& \
  207. (((struct reo_destination_ring *) \
  208. reo_desc)->buf_or_link_desc_addr_info)))
  209. #define HAL_RX_MPDU_SEQUENCE_NUMBER_GET(mpdu_info_ptr) \
  210. ((mpdu_info_ptr \
  211. [RX_MPDU_DESC_INFO_0_MPDU_SEQUENCE_NUMBER_OFFSET >> 2] & \
  212. RX_MPDU_DESC_INFO_0_MPDU_SEQUENCE_NUMBER_MASK) >> \
  213. RX_MPDU_DESC_INFO_0_MPDU_SEQUENCE_NUMBER_LSB)
  214. #define HAL_RX_MPDU_DESC_PEER_META_DATA_GET(mpdu_info_ptr) \
  215. ((mpdu_info_ptr \
  216. [RX_MPDU_DESC_INFO_1_PEER_META_DATA_OFFSET >> 2] & \
  217. RX_MPDU_DESC_INFO_1_PEER_META_DATA_MASK) >> \
  218. RX_MPDU_DESC_INFO_1_PEER_META_DATA_LSB)
  219. #define HAL_RX_MPDU_MSDU_COUNT_GET(mpdu_info_ptr) \
  220. ((mpdu_info_ptr[RX_MPDU_DESC_INFO_0_MSDU_COUNT_OFFSET >> 2] & \
  221. RX_MPDU_DESC_INFO_0_MSDU_COUNT_MASK) >> \
  222. RX_MPDU_DESC_INFO_0_MSDU_COUNT_LSB)
  223. #define HAL_RX_MPDU_FRAGMENT_FLAG_GET(mpdu_info_ptr) \
  224. (mpdu_info_ptr[RX_MPDU_DESC_INFO_0_FRAGMENT_FLAG_OFFSET >> 2] & \
  225. RX_MPDU_DESC_INFO_0_FRAGMENT_FLAG_MASK)
  226. #define HAL_RX_MPDU_RETRY_BIT_GET(mpdu_info_ptr) \
  227. (mpdu_info_ptr[RX_MPDU_DESC_INFO_0_MPDU_RETRY_BIT_OFFSET >> 2] & \
  228. RX_MPDU_DESC_INFO_0_MPDU_RETRY_BIT_MASK)
  229. #define HAL_RX_MPDU_AMPDU_FLAG_GET(mpdu_info_ptr) \
  230. (mpdu_info_ptr[RX_MPDU_DESC_INFO_0_AMPDU_FLAG_OFFSET >> 2] & \
  231. RX_MPDU_DESC_INFO_0_AMPDU_FLAG_MASK)
  232. #define HAL_RX_MPDU_RAW_MPDU_GET(mpdu_info_ptr) \
  233. (mpdu_info_ptr[RX_MPDU_DESC_INFO_0_RAW_MPDU_OFFSET >> 2] & \
  234. RX_MPDU_DESC_INFO_0_RAW_MPDU_MASK)
  235. #define HAL_RX_MPDU_FLAGS_GET(mpdu_info_ptr) \
  236. (HAL_RX_MPDU_FRAGMENT_FLAG_GET(mpdu_info_ptr) | \
  237. HAL_RX_MPDU_RETRY_BIT_GET(mpdu_info_ptr) | \
  238. HAL_RX_MPDU_AMPDU_FLAG_GET(mpdu_info_ptr) | \
  239. HAL_RX_MPDU_RAW_MPDU_GET(mpdu_info_ptr))
  240. #define HAL_RX_MSDU_PKT_LENGTH_GET(msdu_info_ptr) \
  241. (_HAL_MS((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  242. RX_MSDU_DESC_INFO_0_MSDU_LENGTH_OFFSET)), \
  243. RX_MSDU_DESC_INFO_0_MSDU_LENGTH_MASK, \
  244. RX_MSDU_DESC_INFO_0_MSDU_LENGTH_LSB))
  245. /*
  246. * NOTE: None of the following _GET macros need a right
  247. * shift by the corresponding _LSB. This is because, they are
  248. * finally taken and "OR'ed" into a single word again.
  249. */
  250. #define HAL_RX_FIRST_MSDU_IN_MPDU_FLAG_GET(msdu_info_ptr) \
  251. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  252. RX_MSDU_DESC_INFO_0_FIRST_MSDU_IN_MPDU_FLAG_OFFSET)) & \
  253. RX_MSDU_DESC_INFO_0_FIRST_MSDU_IN_MPDU_FLAG_MASK)
  254. #define HAL_RX_LAST_MSDU_IN_MPDU_FLAG_GET(msdu_info_ptr) \
  255. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  256. RX_MSDU_DESC_INFO_0_LAST_MSDU_IN_MPDU_FLAG_OFFSET)) & \
  257. RX_MSDU_DESC_INFO_0_LAST_MSDU_IN_MPDU_FLAG_MASK)
  258. #define HAL_RX_MSDU_CONTINUATION_FLAG_GET(msdu_info_ptr) \
  259. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  260. RX_MSDU_DESC_INFO_0_MSDU_CONTINUATION_OFFSET)) & \
  261. RX_MSDU_DESC_INFO_0_MSDU_CONTINUATION_MASK)
  262. #define HAL_RX_MSDU_SA_IS_VALID_FLAG_GET(msdu_info_ptr) \
  263. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  264. RX_MSDU_DESC_INFO_0_SA_IS_VALID_OFFSET)) & \
  265. RX_MSDU_DESC_INFO_0_SA_IS_VALID_MASK)
  266. #define HAL_RX_MSDU_SA_IDX_TIMEOUT_FLAG_GET(msdu_info_ptr) \
  267. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  268. RX_MSDU_DESC_INFO_0_SA_IDX_TIMEOUT_OFFSET)) & \
  269. RX_MSDU_DESC_INFO_0_SA_IDX_TIMEOUT_MASK)
  270. #define HAL_RX_MSDU_DA_IS_VALID_FLAG_GET(msdu_info_ptr) \
  271. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  272. RX_MSDU_DESC_INFO_0_DA_IS_VALID_OFFSET)) & \
  273. RX_MSDU_DESC_INFO_0_DA_IS_VALID_MASK)
  274. #define HAL_RX_MSDU_DA_IS_MCBC_FLAG_GET(msdu_info_ptr) \
  275. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  276. RX_MSDU_DESC_INFO_0_DA_IS_MCBC_OFFSET)) & \
  277. RX_MSDU_DESC_INFO_0_DA_IS_MCBC_MASK)
  278. #define HAL_RX_MSDU_DA_IDX_TIMEOUT_FLAG_GET(msdu_info_ptr) \
  279. ((*_OFFSET_TO_WORD_PTR(msdu_info_ptr, \
  280. RX_MSDU_DESC_INFO_0_DA_IDX_TIMEOUT_OFFSET)) & \
  281. RX_MSDU_DESC_INFO_0_DA_IDX_TIMEOUT_MASK)
  282. #define HAL_RX_MSDU_FLAGS_GET(msdu_info_ptr) \
  283. (HAL_RX_FIRST_MSDU_IN_MPDU_FLAG_GET(msdu_info_ptr) | \
  284. HAL_RX_LAST_MSDU_IN_MPDU_FLAG_GET(msdu_info_ptr) | \
  285. HAL_RX_MSDU_CONTINUATION_FLAG_GET(msdu_info_ptr) | \
  286. HAL_RX_MSDU_SA_IS_VALID_FLAG_GET(msdu_info_ptr) | \
  287. HAL_RX_MSDU_SA_IDX_TIMEOUT_FLAG_GET(msdu_info_ptr) | \
  288. HAL_RX_MSDU_DA_IS_VALID_FLAG_GET(msdu_info_ptr) | \
  289. HAL_RX_MSDU_DA_IS_MCBC_FLAG_GET(msdu_info_ptr) | \
  290. HAL_RX_MSDU_DA_IDX_TIMEOUT_FLAG_GET(msdu_info_ptr))
  291. #define HAL_RX_MSDU_DESC_INFO_GET(msdu_details_ptr) \
  292. ((struct rx_msdu_desc_info *) \
  293. _OFFSET_TO_BYTE_PTR(msdu_details_ptr, \
  294. RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET))
  295. static inline void hal_rx_mpdu_desc_info_get(void *desc_addr,
  296. struct hal_rx_mpdu_desc_info *mpdu_desc_info)
  297. {
  298. struct reo_destination_ring *reo_dst_ring;
  299. uint32_t mpdu_info[NUM_OF_DWORDS_RX_MPDU_DESC_INFO];
  300. reo_dst_ring = (struct reo_destination_ring *) desc_addr;
  301. qdf_mem_copy(&mpdu_info,
  302. (const void *)&reo_dst_ring->rx_mpdu_desc_info_details,
  303. sizeof(struct rx_mpdu_desc_info));
  304. mpdu_desc_info->msdu_count = HAL_RX_MPDU_MSDU_COUNT_GET(mpdu_info);
  305. mpdu_desc_info->mpdu_seq = HAL_RX_MPDU_SEQUENCE_NUMBER_GET(mpdu_info);
  306. mpdu_desc_info->mpdu_flags = HAL_RX_MPDU_FLAGS_GET(mpdu_info);
  307. mpdu_desc_info->peer_meta_data =
  308. HAL_RX_MPDU_DESC_PEER_META_DATA_GET(mpdu_info);
  309. }
  310. /*
  311. * @ hal_rx_msdu_desc_info_get: Gets the flags related to MSDU desciptor.
  312. * @ Specifically flags needed are:
  313. * @ first_msdu_in_mpdu, last_msdu_in_mpdu,
  314. * @ msdu_continuation, sa_is_valid,
  315. * @ sa_idx_timeout, da_is_valid, da_idx_timeout,
  316. * @ da_is_MCBC
  317. *
  318. * @ hal_rx_desc_cookie: Opaque cookie pointer used by HAL to get to the current
  319. * @ descriptor
  320. * @ msdu_desc_info: Holds MSDU descriptor info from HAL Rx descriptor
  321. * @ Return: void
  322. */
  323. static inline void hal_rx_msdu_desc_info_get(void *desc_addr,
  324. struct hal_rx_msdu_desc_info *msdu_desc_info)
  325. {
  326. struct reo_destination_ring *reo_dst_ring;
  327. uint32_t msdu_info[NUM_OF_DWORDS_RX_MSDU_DESC_INFO];
  328. reo_dst_ring = (struct reo_destination_ring *) desc_addr;
  329. qdf_mem_copy(&msdu_info,
  330. (const void *)&reo_dst_ring->rx_msdu_desc_info_details,
  331. sizeof(struct rx_msdu_desc_info));
  332. msdu_desc_info->msdu_flags = HAL_RX_MSDU_FLAGS_GET(msdu_info);
  333. msdu_desc_info->msdu_len = HAL_RX_MSDU_PKT_LENGTH_GET(msdu_info);
  334. }
  335. /*
  336. * hal_rxdma_buff_addr_info_set() - set the buffer_addr_info of the
  337. * rxdma ring entry.
  338. * @rxdma_entry: descriptor entry
  339. * @paddr: physical address of nbuf data pointer.
  340. * @cookie: SW cookie used as a index to SW rx desc.
  341. * @manager: who owns the nbuf (host, NSS, etc...).
  342. *
  343. */
  344. static inline void hal_rxdma_buff_addr_info_set(void *rxdma_entry,
  345. qdf_dma_addr_t paddr, uint32_t cookie, uint8_t manager)
  346. {
  347. uint32_t paddr_lo = ((u64)paddr & 0x00000000ffffffff);
  348. uint32_t paddr_hi = ((u64)paddr & 0xffffffff00000000) >> 32;
  349. HAL_RXDMA_PADDR_LO_SET(rxdma_entry, paddr_lo);
  350. HAL_RXDMA_PADDR_HI_SET(rxdma_entry, paddr_hi);
  351. HAL_RXDMA_COOKIE_SET(rxdma_entry, cookie);
  352. HAL_RXDMA_MANAGER_SET(rxdma_entry, manager);
  353. }
  354. /*
  355. * Structures & Macros to obtain fields from the TLV's in the Rx packet
  356. * pre-header.
  357. */
  358. /*
  359. * Every Rx packet starts at an offset from the top of the buffer.
  360. * If the host hasn't subscribed to any specific TLV, there is
  361. * still space reserved for the following TLV's from the start of
  362. * the buffer:
  363. * -- RX ATTENTION
  364. * -- RX MPDU START
  365. * -- RX MSDU START
  366. * -- RX MSDU END
  367. * -- RX MPDU END
  368. * -- RX PACKET HEADER (802.11)
  369. * If the host subscribes to any of the TLV's above, that TLV
  370. * if populated by the HW
  371. */
  372. #define NUM_DWORDS_TAG 1
  373. /* By default the packet header TLV is 128 bytes */
  374. #define NUM_OF_BYTES_RX_802_11_HDR_TLV 128
  375. #define NUM_OF_DWORDS_RX_802_11_HDR_TLV \
  376. (NUM_OF_BYTES_RX_802_11_HDR_TLV >> 2)
  377. #define RX_PKT_OFFSET_WORDS \
  378. ( \
  379. NUM_OF_DWORDS_RX_ATTENTION + NUM_DWORDS_TAG \
  380. NUM_OF_DWORDS_RX_MPDU_START + NUM_DWORDS_TAG \
  381. NUM_OF_DWORDS_RX_MSDU_START + NUM_DWORDS_TAG \
  382. NUM_OF_DWORDS_RX_MSDU_END + NUM_DWORDS_TAG \
  383. NUM_OF_DWORDS_RX_MPDU_END + NUM_DWORDS_TAG \
  384. NUM_OF_DWORDS_RX_802_11_HDR_TLV + NUM_DWORDS_TAG \
  385. )
  386. #define RX_PKT_OFFSET_BYTES \
  387. (RX_PKT_OFFSET_WORDS << 2)
  388. #define RX_PKT_HDR_TLV_LEN 120
  389. /*
  390. * Each RX descriptor TLV is preceded by 1 DWORD "tag"
  391. */
  392. struct rx_attention_tlv {
  393. uint32_t tag;
  394. struct rx_attention rx_attn;
  395. };
  396. struct rx_mpdu_start_tlv {
  397. uint32_t tag;
  398. struct rx_mpdu_start rx_mpdu_start;
  399. };
  400. struct rx_msdu_start_tlv {
  401. uint32_t tag;
  402. struct rx_msdu_start rx_msdu_start;
  403. };
  404. struct rx_msdu_end_tlv {
  405. uint32_t tag;
  406. struct rx_msdu_end rx_msdu_end;
  407. };
  408. struct rx_mpdu_end_tlv {
  409. uint32_t tag;
  410. struct rx_mpdu_end rx_mpdu_end;
  411. };
  412. struct rx_pkt_hdr_tlv {
  413. uint32_t tag; /* 4 B */
  414. uint32_t phy_ppdu_id; /* 4 B */
  415. char rx_pkt_hdr[RX_PKT_HDR_TLV_LEN]; /* 120 B */
  416. };
  417. #define RXDMA_OPTIMIZATION
  418. #ifdef RXDMA_OPTIMIZATION
  419. /*
  420. * The RX_PADDING_BYTES is required so that the TLV's don't
  421. * spread across the 128 byte boundary
  422. * RXDMA optimization requires:
  423. * 1) MSDU_END & ATTENTION TLV's follow in that order
  424. * 2) TLV's don't span across 128 byte lines
  425. * 3) Rx Buffer is nicely aligned on the 128 byte boundary
  426. */
  427. #if defined(WCSS_VERSION) && \
  428. ((defined(CONFIG_WIN) && (WCSS_VERSION >= 96)) || \
  429. (defined(CONFIG_MCL) && (WCSS_VERSION >= 72)))
  430. #define RX_PADDING0_BYTES 4
  431. #endif
  432. #define RX_PADDING1_BYTES 16
  433. struct rx_pkt_tlvs {
  434. struct rx_msdu_end_tlv msdu_end_tlv; /* 72 bytes */
  435. struct rx_attention_tlv attn_tlv; /* 16 bytes */
  436. struct rx_msdu_start_tlv msdu_start_tlv;/* 40 bytes */
  437. #if defined(WCSS_VERSION) && \
  438. ((defined(CONFIG_WIN) && (WCSS_VERSION >= 96)) || \
  439. (defined(CONFIG_MCL) && (WCSS_VERSION >= 72)))
  440. uint8_t rx_padding0[RX_PADDING0_BYTES]; /* 4 bytes */
  441. #endif
  442. struct rx_mpdu_start_tlv mpdu_start_tlv;/* 96 bytes */
  443. struct rx_mpdu_end_tlv mpdu_end_tlv; /* 12 bytes */
  444. uint8_t rx_padding1[RX_PADDING1_BYTES]; /* 16 bytes */
  445. struct rx_pkt_hdr_tlv pkt_hdr_tlv; /* 128 bytes */
  446. };
  447. #else /* RXDMA_OPTIMIZATION */
  448. struct rx_pkt_tlvs {
  449. struct rx_attention_tlv attn_tlv;
  450. struct rx_mpdu_start_tlv mpdu_start_tlv;
  451. struct rx_msdu_start_tlv msdu_start_tlv;
  452. struct rx_msdu_end_tlv msdu_end_tlv;
  453. struct rx_mpdu_end_tlv mpdu_end_tlv;
  454. struct rx_pkt_hdr_tlv pkt_hdr_tlv;
  455. };
  456. #endif /* RXDMA_OPTIMIZATION */
  457. #define RX_PKT_TLVS_LEN (sizeof(struct rx_pkt_tlvs))
  458. /*
  459. * Get msdu_done bit from the RX_ATTENTION TLV
  460. */
  461. #define HAL_RX_ATTN_MSDU_DONE_GET(_rx_attn) \
  462. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn, \
  463. RX_ATTENTION_2_MSDU_DONE_OFFSET)), \
  464. RX_ATTENTION_2_MSDU_DONE_MASK, \
  465. RX_ATTENTION_2_MSDU_DONE_LSB))
  466. static inline uint32_t
  467. hal_rx_attn_msdu_done_get(uint8_t *buf)
  468. {
  469. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  470. struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
  471. uint32_t msdu_done;
  472. msdu_done = HAL_RX_ATTN_MSDU_DONE_GET(rx_attn);
  473. return msdu_done;
  474. }
  475. #define HAL_RX_ATTN_FIRST_MPDU_GET(_rx_attn) \
  476. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn, \
  477. RX_ATTENTION_1_FIRST_MPDU_OFFSET)), \
  478. RX_ATTENTION_1_FIRST_MPDU_MASK, \
  479. RX_ATTENTION_1_FIRST_MPDU_LSB))
  480. /*
  481. * hal_rx_attn_first_mpdu_get(): get fist_mpdu bit from rx attention
  482. * @buf: pointer to rx_pkt_tlvs
  483. *
  484. * reutm: uint32_t(first_msdu)
  485. */
  486. static inline uint32_t
  487. hal_rx_attn_first_mpdu_get(uint8_t *buf)
  488. {
  489. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  490. struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
  491. uint32_t first_mpdu;
  492. first_mpdu = HAL_RX_ATTN_FIRST_MPDU_GET(rx_attn);
  493. return first_mpdu;
  494. }
  495. /*
  496. * Get peer_meta_data from RX_MPDU_INFO within RX_MPDU_START
  497. */
  498. #define HAL_RX_MPDU_PEER_META_DATA_GET(_rx_mpdu_info) \
  499. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info, \
  500. RX_MPDU_INFO_8_PEER_META_DATA_OFFSET)), \
  501. RX_MPDU_INFO_8_PEER_META_DATA_MASK, \
  502. RX_MPDU_INFO_8_PEER_META_DATA_LSB))
  503. static inline uint32_t
  504. hal_rx_mpdu_peer_meta_data_get(uint8_t *buf)
  505. {
  506. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  507. struct rx_mpdu_start *mpdu_start =
  508. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  509. struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
  510. uint32_t peer_meta_data;
  511. peer_meta_data = HAL_RX_MPDU_PEER_META_DATA_GET(mpdu_info);
  512. return peer_meta_data;
  513. }
  514. #if defined(WCSS_VERSION) && \
  515. ((defined(CONFIG_WIN) && (WCSS_VERSION > 81)) || \
  516. (defined(CONFIG_MCL) && (WCSS_VERSION >= 72)))
  517. #define HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(_rx_msdu_end) \
  518. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end, \
  519. RX_MSDU_END_5_L3_HEADER_PADDING_OFFSET)), \
  520. RX_MSDU_END_5_L3_HEADER_PADDING_MASK, \
  521. RX_MSDU_END_5_L3_HEADER_PADDING_LSB))
  522. #else
  523. #define HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(_rx_msdu_end) \
  524. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end, \
  525. RX_MSDU_END_9_L3_HEADER_PADDING_OFFSET)), \
  526. RX_MSDU_END_9_L3_HEADER_PADDING_MASK, \
  527. RX_MSDU_END_9_L3_HEADER_PADDING_LSB))
  528. #endif
  529. /**
  530. * LRO information needed from the TLVs
  531. */
  532. #define HAL_RX_TLV_GET_LRO_ELIGIBLE(buf) \
  533. (_HAL_MS( \
  534. (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
  535. msdu_end_tlv.rx_msdu_end), \
  536. RX_MSDU_END_9_LRO_ELIGIBLE_OFFSET)), \
  537. RX_MSDU_END_9_LRO_ELIGIBLE_MASK, \
  538. RX_MSDU_END_9_LRO_ELIGIBLE_LSB))
  539. #define HAL_RX_TLV_GET_TCP_CHKSUM(buf) \
  540. (_HAL_MS( \
  541. (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
  542. msdu_end_tlv.rx_msdu_end), \
  543. RX_MSDU_END_1_TCP_UDP_CHKSUM_OFFSET)), \
  544. RX_MSDU_END_1_TCP_UDP_CHKSUM_MASK, \
  545. RX_MSDU_END_1_TCP_UDP_CHKSUM_LSB))
  546. #define HAL_RX_TLV_GET_TCP_ACK(buf) \
  547. (_HAL_MS( \
  548. (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
  549. msdu_end_tlv.rx_msdu_end), \
  550. RX_MSDU_END_8_TCP_ACK_NUMBER_OFFSET)), \
  551. RX_MSDU_END_8_TCP_ACK_NUMBER_MASK, \
  552. RX_MSDU_END_8_TCP_ACK_NUMBER_LSB))
  553. #define HAL_RX_TLV_GET_TCP_SEQ(buf) \
  554. (_HAL_MS( \
  555. (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
  556. msdu_end_tlv.rx_msdu_end), \
  557. RX_MSDU_END_7_TCP_SEQ_NUMBER_OFFSET)), \
  558. RX_MSDU_END_7_TCP_SEQ_NUMBER_MASK, \
  559. RX_MSDU_END_7_TCP_SEQ_NUMBER_LSB))
  560. #define HAL_RX_TLV_GET_TCP_WIN(buf) \
  561. (_HAL_MS( \
  562. (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
  563. msdu_end_tlv.rx_msdu_end), \
  564. RX_MSDU_END_9_WINDOW_SIZE_OFFSET)), \
  565. RX_MSDU_END_9_WINDOW_SIZE_MASK, \
  566. RX_MSDU_END_9_WINDOW_SIZE_LSB))
  567. #define HAL_RX_TLV_GET_TCP_PURE_ACK(buf) \
  568. (_HAL_MS( \
  569. (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
  570. msdu_start_tlv.rx_msdu_start), \
  571. RX_MSDU_START_2_TCP_ONLY_ACK_OFFSET)), \
  572. RX_MSDU_START_2_TCP_ONLY_ACK_MASK, \
  573. RX_MSDU_START_2_TCP_ONLY_ACK_LSB))
  574. #define HAL_RX_TLV_GET_TCP_PROTO(buf) \
  575. (_HAL_MS( \
  576. (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
  577. msdu_start_tlv.rx_msdu_start), \
  578. RX_MSDU_START_2_TCP_PROTO_OFFSET)), \
  579. RX_MSDU_START_2_TCP_PROTO_MASK, \
  580. RX_MSDU_START_2_TCP_PROTO_LSB))
  581. #define HAL_RX_TLV_GET_IPV6(buf) \
  582. (_HAL_MS( \
  583. (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
  584. msdu_start_tlv.rx_msdu_start), \
  585. RX_MSDU_START_2_IPV6_PROTO_OFFSET)), \
  586. RX_MSDU_START_2_IPV6_PROTO_MASK, \
  587. RX_MSDU_START_2_IPV6_PROTO_LSB))
  588. #define HAL_RX_TLV_GET_IP_OFFSET(buf) \
  589. (_HAL_MS( \
  590. (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
  591. msdu_start_tlv.rx_msdu_start), \
  592. RX_MSDU_START_1_L3_OFFSET_OFFSET)), \
  593. RX_MSDU_START_1_L3_OFFSET_MASK, \
  594. RX_MSDU_START_1_L3_OFFSET_LSB))
  595. #define HAL_RX_TLV_GET_TCP_OFFSET(buf) \
  596. (_HAL_MS( \
  597. (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
  598. msdu_start_tlv.rx_msdu_start), \
  599. RX_MSDU_START_1_L4_OFFSET_OFFSET)), \
  600. RX_MSDU_START_1_L4_OFFSET_MASK, \
  601. RX_MSDU_START_1_L4_OFFSET_LSB))
  602. #define HAL_RX_TLV_GET_FLOW_ID_TOEPLITZ(buf) \
  603. (_HAL_MS( \
  604. (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
  605. msdu_start_tlv.rx_msdu_start), \
  606. RX_MSDU_START_4_FLOW_ID_TOEPLITZ_OFFSET)), \
  607. RX_MSDU_START_4_FLOW_ID_TOEPLITZ_MASK, \
  608. RX_MSDU_START_4_FLOW_ID_TOEPLITZ_LSB))
  609. /**
  610. * hal_rx_msdu_end_l3_hdr_padding_get(): API to get the
  611. * l3_header padding from rx_msdu_end TLV
  612. *
  613. * @ buf: pointer to the start of RX PKT TLV headers
  614. * Return: number of l3 header padding bytes
  615. */
  616. static inline uint32_t
  617. hal_rx_msdu_end_l3_hdr_padding_get(uint8_t *buf)
  618. {
  619. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  620. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  621. uint32_t l3_header_padding;
  622. l3_header_padding = HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(msdu_end);
  623. return l3_header_padding;
  624. }
  625. #define HAL_RX_MSDU_END_SA_IS_VALID_GET(_rx_msdu_end) \
  626. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end, \
  627. RX_MSDU_END_5_SA_IS_VALID_OFFSET)), \
  628. RX_MSDU_END_5_SA_IS_VALID_MASK, \
  629. RX_MSDU_END_5_SA_IS_VALID_LSB))
  630. /**
  631. * hal_rx_msdu_end_sa_is_valid_get(): API to get the
  632. * sa_is_valid bit from rx_msdu_end TLV
  633. *
  634. * @ buf: pointer to the start of RX PKT TLV headers
  635. * Return: sa_is_valid bit
  636. */
  637. static inline uint8_t
  638. hal_rx_msdu_end_sa_is_valid_get(uint8_t *buf)
  639. {
  640. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  641. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  642. uint8_t sa_is_valid;
  643. sa_is_valid = HAL_RX_MSDU_END_SA_IS_VALID_GET(msdu_end);
  644. return sa_is_valid;
  645. }
  646. #define HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(_rx_msdu_end) \
  647. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end, \
  648. RX_MSDU_END_16_SA_SW_PEER_ID_OFFSET)), \
  649. RX_MSDU_END_16_SA_SW_PEER_ID_MASK, \
  650. RX_MSDU_END_16_SA_SW_PEER_ID_LSB))
  651. /**
  652. * hal_rx_msdu_end_sa_sw_peer_id_get(): API to get the
  653. * sa_sw_peer_id from rx_msdu_end TLV
  654. *
  655. * @ buf: pointer to the start of RX PKT TLV headers
  656. * Return: sa_sw_peer_id index
  657. */
  658. static inline uint32_t
  659. hal_rx_msdu_end_sa_sw_peer_id_get(uint8_t *buf)
  660. {
  661. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  662. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  663. uint32_t sa_sw_peer_id;
  664. sa_sw_peer_id = HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(msdu_end);
  665. return sa_sw_peer_id;
  666. }
  667. #define HAL_RX_MSDU_START_MSDU_LEN_GET(_rx_msdu_start) \
  668. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_start, \
  669. RX_MSDU_START_1_MSDU_LENGTH_OFFSET)), \
  670. RX_MSDU_START_1_MSDU_LENGTH_MASK, \
  671. RX_MSDU_START_1_MSDU_LENGTH_LSB))
  672. /**
  673. * hal_rx_msdu_start_msdu_len_get(): API to get the MSDU length
  674. * from rx_msdu_start TLV
  675. *
  676. * @ buf: pointer to the start of RX PKT TLV headers
  677. * Return: msdu length
  678. */
  679. static inline uint32_t
  680. hal_rx_msdu_start_msdu_len_get(uint8_t *buf)
  681. {
  682. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  683. struct rx_msdu_start *msdu_start =
  684. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  685. uint32_t msdu_len;
  686. msdu_len = HAL_RX_MSDU_START_MSDU_LEN_GET(msdu_start);
  687. return msdu_len;
  688. }
  689. #define HAL_RX_MSDU_START_BW_GET(_rx_msdu_start) \
  690. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start),\
  691. RX_MSDU_START_5_RECEIVE_BANDWIDTH_OFFSET)), \
  692. RX_MSDU_START_5_RECEIVE_BANDWIDTH_MASK, \
  693. RX_MSDU_START_5_RECEIVE_BANDWIDTH_LSB))
  694. /*
  695. * hal_rx_msdu_start_bw_get(): API to get the Bandwidth
  696. * Interval from rx_msdu_start
  697. *
  698. * @buf: pointer to the start of RX PKT TLV header
  699. * Return: uint32_t(bw)
  700. */
  701. static inline uint32_t
  702. hal_rx_msdu_start_bw_get(uint8_t *buf)
  703. {
  704. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  705. struct rx_msdu_start *msdu_start =
  706. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  707. uint32_t bw;
  708. bw = HAL_RX_MSDU_START_BW_GET(msdu_start);
  709. return bw;
  710. }
  711. #define HAL_RX_MSDU_START_RECEPTION_TYPE_GET(_rx_msdu_start) \
  712. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start), \
  713. RX_MSDU_START_5_RECEPTION_TYPE_OFFSET)), \
  714. RX_MSDU_START_5_RECEPTION_TYPE_MASK, \
  715. RX_MSDU_START_5_RECEPTION_TYPE_LSB))
  716. /*
  717. * hal_rx_msdu_start_reception_type_get(): API to get the reception type
  718. * Interval from rx_msdu_start
  719. *
  720. * @buf: pointer to the start of RX PKT TLV header
  721. * Return: uint32_t(reception_type)
  722. */
  723. static inline uint32_t
  724. hal_rx_msdu_start_reception_type_get(uint8_t *buf)
  725. {
  726. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  727. struct rx_msdu_start *msdu_start =
  728. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  729. uint32_t reception_type;
  730. reception_type = HAL_RX_MSDU_START_RECEPTION_TYPE_GET(msdu_start);
  731. return reception_type;
  732. }
  733. #define HAL_RX_MSDU_START_FLOWID_TOEPLITZ_GET(_rx_msdu_start) \
  734. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_start, \
  735. RX_MSDU_START_4_FLOW_ID_TOEPLITZ_OFFSET)), \
  736. RX_MSDU_START_4_FLOW_ID_TOEPLITZ_MASK, \
  737. RX_MSDU_START_4_FLOW_ID_TOEPLITZ_LSB))
  738. /**
  739. * hal_rx_msdu_start_toeplitz_get: API to get the toeplitz hash
  740. * from rx_msdu_start TLV
  741. *
  742. * @ buf: pointer to the start of RX PKT TLV headers
  743. * Return: toeplitz hash
  744. */
  745. static inline uint32_t
  746. hal_rx_msdu_start_toeplitz_get(uint8_t *buf)
  747. {
  748. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  749. struct rx_msdu_start *msdu_start =
  750. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  751. return HAL_RX_MSDU_START_FLOWID_TOEPLITZ_GET(msdu_start);
  752. }
  753. /*
  754. * Get qos_control_valid from RX_MPDU_START
  755. */
  756. #define HAL_RX_MPDU_INFO_QOS_CONTROL_VALID_GET(_rx_mpdu_info) \
  757. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_mpdu_info), \
  758. RX_MPDU_INFO_2_MPDU_SEQUENCE_CONTROL_VALID_OFFSET)), \
  759. RX_MPDU_INFO_2_MPDU_SEQUENCE_CONTROL_VALID_MASK, \
  760. RX_MPDU_INFO_2_MPDU_SEQUENCE_CONTROL_VALID_LSB))
  761. static inline uint32_t
  762. hal_rx_mpdu_start_mpdu_qos_control_valid_get(uint8_t *buf)
  763. {
  764. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  765. struct rx_mpdu_start *mpdu_start =
  766. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  767. uint32_t qos_control_valid;
  768. qos_control_valid = HAL_RX_MPDU_INFO_QOS_CONTROL_VALID_GET(
  769. &(mpdu_start->rx_mpdu_info_details));
  770. return qos_control_valid;
  771. }
  772. /*
  773. * Get tid from RX_MPDU_START
  774. */
  775. #define HAL_RX_MPDU_INFO_TID_GET(_rx_mpdu_info) \
  776. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_mpdu_info), \
  777. RX_MPDU_INFO_3_TID_OFFSET)), \
  778. RX_MPDU_INFO_3_TID_MASK, \
  779. RX_MPDU_INFO_3_TID_LSB))
  780. static inline uint32_t
  781. hal_rx_mpdu_start_tid_get(uint8_t *buf)
  782. {
  783. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  784. struct rx_mpdu_start *mpdu_start =
  785. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  786. uint32_t tid;
  787. tid = HAL_RX_MPDU_INFO_TID_GET(
  788. &(mpdu_start->rx_mpdu_info_details));
  789. return tid;
  790. }
  791. /*
  792. * Get SW peer id from RX_MPDU_START
  793. */
  794. #define HAL_RX_MPDU_INFO_SW_PEER_ID_GET(_rx_mpdu_info) \
  795. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_mpdu_info), \
  796. RX_MPDU_INFO_1_SW_PEER_ID_OFFSET)), \
  797. RX_MPDU_INFO_1_SW_PEER_ID_MASK, \
  798. RX_MPDU_INFO_1_SW_PEER_ID_LSB))
  799. static inline uint32_t
  800. hal_rx_mpdu_start_sw_peer_id_get(uint8_t *buf)
  801. {
  802. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  803. struct rx_mpdu_start *mpdu_start =
  804. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  805. uint32_t sw_peer_id;
  806. sw_peer_id = HAL_RX_MPDU_INFO_SW_PEER_ID_GET(
  807. &(mpdu_start->rx_mpdu_info_details));
  808. return sw_peer_id;
  809. }
  810. #if defined(WCSS_VERSION) && \
  811. ((defined(CONFIG_WIN) && (WCSS_VERSION > 81)) || \
  812. (defined(CONFIG_MCL) && (WCSS_VERSION >= 72)))
  813. #define HAL_RX_MSDU_START_SGI_GET(_rx_msdu_start) \
  814. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start),\
  815. RX_MSDU_START_5_SGI_OFFSET)), \
  816. RX_MSDU_START_5_SGI_MASK, \
  817. RX_MSDU_START_5_SGI_LSB))
  818. #else
  819. #define HAL_RX_MSDU_START_SGI_GET(_rx_msdu_start) \
  820. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start),\
  821. RX_MSDU_START_6_SGI_OFFSET)), \
  822. RX_MSDU_START_6_SGI_MASK, \
  823. RX_MSDU_START_6_SGI_LSB))
  824. #endif
  825. /**
  826. * hal_rx_msdu_start_msdu_sgi_get(): API to get the Short Gaurd
  827. * Interval from rx_msdu_start TLV
  828. *
  829. * @buf: pointer to the start of RX PKT TLV headers
  830. * Return: uint32_t(sgi)
  831. */
  832. static inline uint32_t
  833. hal_rx_msdu_start_sgi_get(uint8_t *buf)
  834. {
  835. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  836. struct rx_msdu_start *msdu_start =
  837. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  838. uint32_t sgi;
  839. sgi = HAL_RX_MSDU_START_SGI_GET(msdu_start);
  840. return sgi;
  841. }
  842. #if defined(WCSS_VERSION) && \
  843. ((defined(CONFIG_WIN) && (WCSS_VERSION > 81)) || \
  844. (defined(CONFIG_MCL) && (WCSS_VERSION >= 72)))
  845. #define HAL_RX_MSDU_START_RATE_MCS_GET(_rx_msdu_start) \
  846. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start),\
  847. RX_MSDU_START_5_RATE_MCS_OFFSET)), \
  848. RX_MSDU_START_5_RATE_MCS_MASK, \
  849. RX_MSDU_START_5_RATE_MCS_LSB))
  850. #else
  851. #define HAL_RX_MSDU_START_RATE_MCS_GET(_rx_msdu_start) \
  852. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start),\
  853. RX_MSDU_START_6_RATE_MCS_OFFSET)), \
  854. RX_MSDU_START_6_RATE_MCS_MASK, \
  855. RX_MSDU_START_6_RATE_MCS_LSB))
  856. #endif
  857. /**
  858. * hal_rx_msdu_start_msdu_rate_mcs_get(): API to get the MCS rate
  859. * from rx_msdu_start TLV
  860. *
  861. * @buf: pointer to the start of RX PKT TLV headers
  862. * Return: uint32_t(rate_mcs)
  863. */
  864. static inline uint32_t
  865. hal_rx_msdu_start_rate_mcs_get(uint8_t *buf)
  866. {
  867. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  868. struct rx_msdu_start *msdu_start =
  869. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  870. uint32_t rate_mcs;
  871. rate_mcs = HAL_RX_MSDU_START_RATE_MCS_GET(msdu_start);
  872. return rate_mcs;
  873. }
  874. #define HAL_RX_ATTN_DECRYPT_STATUS_GET(_rx_attn) \
  875. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn, \
  876. RX_ATTENTION_2_DECRYPT_STATUS_CODE_OFFSET)), \
  877. RX_ATTENTION_2_DECRYPT_STATUS_CODE_MASK, \
  878. RX_ATTENTION_2_DECRYPT_STATUS_CODE_LSB))
  879. /*
  880. * hal_rx_attn_msdu_get_is_decrypted(): API to get the decrypt status of the
  881. * packet from rx_attention
  882. *
  883. * @buf: pointer to the start of RX PKT TLV header
  884. * Return: uint32_t(decryt status)
  885. */
  886. static inline uint32_t
  887. hal_rx_attn_msdu_get_is_decrypted(uint8_t *buf)
  888. {
  889. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  890. struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
  891. uint32_t is_decrypt = 0;
  892. uint32_t decrypt_status;
  893. decrypt_status = HAL_RX_ATTN_DECRYPT_STATUS_GET(rx_attn);
  894. if (!decrypt_status)
  895. is_decrypt = 1;
  896. return is_decrypt;
  897. }
  898. /*
  899. * Get key index from RX_MSDU_END
  900. */
  901. #define HAL_RX_MSDU_END_KEYID_OCTET_GET(_rx_msdu_end) \
  902. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end, \
  903. RX_MSDU_END_2_KEY_ID_OCTET_OFFSET)), \
  904. RX_MSDU_END_2_KEY_ID_OCTET_MASK, \
  905. RX_MSDU_END_2_KEY_ID_OCTET_LSB))
  906. /*
  907. * hal_rx_msdu_get_keyid(): API to get the key id if the decrypted packet
  908. * from rx_msdu_end
  909. *
  910. * @buf: pointer to the start of RX PKT TLV header
  911. * Return: uint32_t(key id)
  912. */
  913. static inline uint32_t
  914. hal_rx_msdu_get_keyid(uint8_t *buf)
  915. {
  916. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  917. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  918. uint32_t keyid_octet;
  919. keyid_octet = HAL_RX_MSDU_END_KEYID_OCTET_GET(msdu_end);
  920. return (keyid_octet >> 6) & 0x3;
  921. }
  922. #define HAL_RX_MSDU_START_RSSI_GET(_rx_msdu_start) \
  923. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_start, \
  924. RX_MSDU_START_5_USER_RSSI_OFFSET)), \
  925. RX_MSDU_START_5_USER_RSSI_MASK, \
  926. RX_MSDU_START_5_USER_RSSI_LSB))
  927. /*
  928. * hal_rx_msdu_start_get_rssi(): API to get the rssi of received pkt
  929. * from rx_msdu_start
  930. *
  931. * @buf: pointer to the start of RX PKT TLV header
  932. * Return: uint32_t(rssi)
  933. */
  934. static inline uint32_t
  935. hal_rx_msdu_start_get_rssi(uint8_t *buf)
  936. {
  937. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  938. struct rx_msdu_start *msdu_start = &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  939. uint32_t rssi;
  940. rssi = HAL_RX_MSDU_START_RSSI_GET(msdu_start);
  941. return rssi;
  942. }
  943. #define HAL_RX_MSDU_START_FREQ_GET(_rx_msdu_start) \
  944. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_start, \
  945. RX_MSDU_START_7_SW_PHY_META_DATA_OFFSET)), \
  946. RX_MSDU_START_7_SW_PHY_META_DATA_MASK, \
  947. RX_MSDU_START_7_SW_PHY_META_DATA_LSB))
  948. /*
  949. * hal_rx_msdu_start_get_freq(): API to get the frequency of operating channel
  950. * from rx_msdu_start
  951. *
  952. * @buf: pointer to the start of RX PKT TLV header
  953. * Return: uint32_t(frequency)
  954. */
  955. static inline uint32_t
  956. hal_rx_msdu_start_get_freq(uint8_t *buf)
  957. {
  958. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  959. struct rx_msdu_start *msdu_start =
  960. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  961. uint32_t freq;
  962. freq = HAL_RX_MSDU_START_FREQ_GET(msdu_start);
  963. return freq;
  964. }
  965. #define HAL_RX_MSDU_START_PKT_TYPE_GET(_rx_msdu_start) \
  966. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_start, \
  967. RX_MSDU_START_5_PKT_TYPE_OFFSET)), \
  968. RX_MSDU_START_5_PKT_TYPE_MASK, \
  969. RX_MSDU_START_5_PKT_TYPE_LSB))
  970. /*
  971. * hal_rx_msdu_start_get_pkt_type(): API to get the pkt type
  972. * from rx_msdu_start
  973. *
  974. * @buf: pointer to the start of RX PKT TLV header
  975. * Return: uint32_t(pkt type)
  976. */
  977. static inline uint32_t
  978. hal_rx_msdu_start_get_pkt_type(uint8_t *buf)
  979. {
  980. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  981. struct rx_msdu_start *msdu_start = &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  982. uint32_t pkt_type;
  983. pkt_type = HAL_RX_MSDU_START_PKT_TYPE_GET(msdu_start);
  984. return pkt_type;
  985. }
  986. #define HAL_RX_MSDU_START_NSS_GET(_rx_msdu_start) \
  987. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start),\
  988. RX_MSDU_START_5_NSS_OFFSET)), \
  989. RX_MSDU_START_5_NSS_MASK, \
  990. RX_MSDU_START_5_NSS_LSB))
  991. /*
  992. * hal_rx_msdu_start_nss_get(): API to get the NSS
  993. * Interval from rx_msdu_start
  994. *
  995. * @buf: pointer to the start of RX PKT TLV header
  996. * Return: uint32_t(nss)
  997. */
  998. static inline uint32_t
  999. hal_rx_msdu_start_nss_get(uint8_t *buf)
  1000. {
  1001. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1002. struct rx_msdu_start *msdu_start =
  1003. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  1004. uint32_t nss;
  1005. nss = HAL_RX_MSDU_START_NSS_GET(msdu_start);
  1006. return nss;
  1007. }
  1008. #define HAL_RX_MPDU_GET_TODS(_rx_mpdu_info) \
  1009. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info, \
  1010. RX_MPDU_INFO_2_TO_DS_OFFSET)), \
  1011. RX_MPDU_INFO_2_TO_DS_MASK, \
  1012. RX_MPDU_INFO_2_TO_DS_LSB))
  1013. /*
  1014. * hal_rx_mpdu_get_tods(): API to get the tods info
  1015. * from rx_mpdu_start
  1016. *
  1017. * @buf: pointer to the start of RX PKT TLV header
  1018. * Return: uint32_t(to_ds)
  1019. */
  1020. static inline uint32_t
  1021. hal_rx_mpdu_get_to_ds(uint8_t *buf)
  1022. {
  1023. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1024. struct rx_mpdu_start *mpdu_start =
  1025. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  1026. struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
  1027. uint32_t to_ds;
  1028. to_ds = HAL_RX_MPDU_GET_TODS(mpdu_info);
  1029. return to_ds;
  1030. }
  1031. #define HAL_RX_MPDU_GET_FROMDS(_rx_mpdu_info) \
  1032. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info, \
  1033. RX_MPDU_INFO_2_FR_DS_OFFSET)), \
  1034. RX_MPDU_INFO_2_FR_DS_MASK, \
  1035. RX_MPDU_INFO_2_FR_DS_LSB))
  1036. /*
  1037. * hal_rx_mpdu_get_fr_ds(): API to get the from ds info
  1038. * from rx_mpdu_start
  1039. *
  1040. * @buf: pointer to the start of RX PKT TLV header
  1041. * Return: uint32_t(fr_ds)
  1042. */
  1043. static inline uint32_t
  1044. hal_rx_mpdu_get_fr_ds(uint8_t *buf)
  1045. {
  1046. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1047. struct rx_mpdu_start *mpdu_start =
  1048. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  1049. struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
  1050. uint32_t fr_ds;
  1051. fr_ds = HAL_RX_MPDU_GET_FROMDS(mpdu_info);
  1052. return fr_ds;
  1053. }
  1054. #define HAL_RX_MPDU_MAC_ADDR_AD1_VALID_GET(_rx_mpdu_info) \
  1055. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info, \
  1056. RX_MPDU_INFO_2_MAC_ADDR_AD1_VALID_OFFSET)), \
  1057. RX_MPDU_INFO_2_MAC_ADDR_AD1_VALID_MASK, \
  1058. RX_MPDU_INFO_2_MAC_ADDR_AD1_VALID_LSB))
  1059. #define HAL_RX_MPDU_MAC_ADDR_AD2_VALID_GET(_rx_mpdu_info) \
  1060. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info, \
  1061. RX_MPDU_INFO_2_MAC_ADDR_AD2_VALID_OFFSET)), \
  1062. RX_MPDU_INFO_2_MAC_ADDR_AD2_VALID_MASK, \
  1063. RX_MPDU_INFO_2_MAC_ADDR_AD2_VALID_LSB))
  1064. #define HAL_RX_MPDU_AD1_31_0_GET(_rx_mpdu_info) \
  1065. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info, \
  1066. RX_MPDU_INFO_15_MAC_ADDR_AD1_31_0_OFFSET)), \
  1067. RX_MPDU_INFO_15_MAC_ADDR_AD1_31_0_MASK, \
  1068. RX_MPDU_INFO_15_MAC_ADDR_AD1_31_0_LSB))
  1069. #define HAL_RX_MPDU_AD1_47_32_GET(_rx_mpdu_info) \
  1070. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info, \
  1071. RX_MPDU_INFO_16_MAC_ADDR_AD1_47_32_OFFSET)), \
  1072. RX_MPDU_INFO_16_MAC_ADDR_AD1_47_32_MASK, \
  1073. RX_MPDU_INFO_16_MAC_ADDR_AD1_47_32_LSB))
  1074. #define HAL_RX_MPDU_AD2_15_0_GET(_rx_mpdu_info) \
  1075. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info, \
  1076. RX_MPDU_INFO_16_MAC_ADDR_AD2_15_0_OFFSET)), \
  1077. RX_MPDU_INFO_16_MAC_ADDR_AD2_15_0_MASK, \
  1078. RX_MPDU_INFO_16_MAC_ADDR_AD2_15_0_LSB))
  1079. #define HAL_RX_MPDU_AD2_47_16_GET(_rx_mpdu_info) \
  1080. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info, \
  1081. RX_MPDU_INFO_17_MAC_ADDR_AD2_47_16_OFFSET)), \
  1082. RX_MPDU_INFO_17_MAC_ADDR_AD2_47_16_MASK, \
  1083. RX_MPDU_INFO_17_MAC_ADDR_AD2_47_16_LSB))
  1084. /*
  1085. * hal_rx_mpdu_get_addr1(): API to check get address1 of the mpdu
  1086. *
  1087. * @buf: pointer to the start of RX PKT TLV headera
  1088. * @mac_addr: pointer to mac address
  1089. * Return: sucess/failure
  1090. */
  1091. static inline
  1092. QDF_STATUS hal_rx_mpdu_get_addr1(uint8_t *buf, uint8_t *mac_addr)
  1093. {
  1094. struct __attribute__((__packed__)) hal_addr1 {
  1095. uint32_t ad1_31_0;
  1096. uint16_t ad1_47_32;
  1097. };
  1098. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1099. struct rx_mpdu_start *mpdu_start =
  1100. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  1101. struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
  1102. struct hal_addr1 *addr = (struct hal_addr1 *)mac_addr;
  1103. uint32_t mac_addr_ad1_valid;
  1104. mac_addr_ad1_valid = HAL_RX_MPDU_MAC_ADDR_AD1_VALID_GET(mpdu_info);
  1105. if (mac_addr_ad1_valid) {
  1106. addr->ad1_31_0 = HAL_RX_MPDU_AD1_31_0_GET(mpdu_info);
  1107. addr->ad1_47_32 = HAL_RX_MPDU_AD1_47_32_GET(mpdu_info);
  1108. return QDF_STATUS_SUCCESS;
  1109. }
  1110. return QDF_STATUS_E_FAILURE;
  1111. }
  1112. /*
  1113. * hal_rx_mpdu_get_addr2(): API to check get address2 of the mpdu
  1114. * in the packet
  1115. *
  1116. * @buf: pointer to the start of RX PKT TLV header
  1117. * @mac_addr: pointer to mac address
  1118. * Return: sucess/failure
  1119. */
  1120. static inline
  1121. QDF_STATUS hal_rx_mpdu_get_addr2(uint8_t *buf, uint8_t *mac_addr)
  1122. {
  1123. struct __attribute__((__packed__)) hal_addr2 {
  1124. uint16_t ad2_15_0;
  1125. uint32_t ad2_47_16;
  1126. };
  1127. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1128. struct rx_mpdu_start *mpdu_start =
  1129. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  1130. struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
  1131. struct hal_addr2 *addr = (struct hal_addr2 *)mac_addr;
  1132. uint32_t mac_addr_ad2_valid;
  1133. mac_addr_ad2_valid = HAL_RX_MPDU_MAC_ADDR_AD2_VALID_GET(mpdu_info);
  1134. if (mac_addr_ad2_valid) {
  1135. addr->ad2_15_0 = HAL_RX_MPDU_AD2_15_0_GET(mpdu_info);
  1136. addr->ad2_47_16 = HAL_RX_MPDU_AD2_47_16_GET(mpdu_info);
  1137. return QDF_STATUS_SUCCESS;
  1138. }
  1139. return QDF_STATUS_E_FAILURE;
  1140. }
  1141. #define HAL_RX_MSDU_END_DA_IDX_GET(_rx_msdu_end) \
  1142. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end, \
  1143. RX_MSDU_END_13_DA_IDX_OFFSET)), \
  1144. RX_MSDU_END_13_DA_IDX_MASK, \
  1145. RX_MSDU_END_13_DA_IDX_LSB))
  1146. /**
  1147. * hal_rx_msdu_end_da_idx_get: API to get da_idx
  1148. * from rx_msdu_end TLV
  1149. *
  1150. * @ buf: pointer to the start of RX PKT TLV headers
  1151. * Return: da index
  1152. */
  1153. static inline uint16_t
  1154. hal_rx_msdu_end_da_idx_get(uint8_t *buf)
  1155. {
  1156. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1157. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  1158. uint16_t da_idx;
  1159. da_idx = HAL_RX_MSDU_END_DA_IDX_GET(msdu_end);
  1160. return da_idx;
  1161. }
  1162. #define HAL_RX_MSDU_END_DA_IS_VALID_GET(_rx_msdu_end) \
  1163. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end, \
  1164. RX_MSDU_END_5_DA_IS_VALID_OFFSET)), \
  1165. RX_MSDU_END_5_DA_IS_VALID_MASK, \
  1166. RX_MSDU_END_5_DA_IS_VALID_LSB))
  1167. /**
  1168. * hal_rx_msdu_end_da_is_valid_get: API to check if da is valid
  1169. * from rx_msdu_end TLV
  1170. *
  1171. * @ buf: pointer to the start of RX PKT TLV headers
  1172. * Return: da_is_valid
  1173. */
  1174. static inline uint8_t
  1175. hal_rx_msdu_end_da_is_valid_get(uint8_t *buf)
  1176. {
  1177. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1178. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  1179. uint8_t da_is_valid;
  1180. da_is_valid = HAL_RX_MSDU_END_DA_IS_VALID_GET(msdu_end);
  1181. return da_is_valid;
  1182. }
  1183. #define HAL_RX_MSDU_END_DA_IS_MCBC_GET(_rx_msdu_end) \
  1184. (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end, \
  1185. RX_MSDU_END_5_DA_IS_MCBC_OFFSET)), \
  1186. RX_MSDU_END_5_DA_IS_MCBC_MASK, \
  1187. RX_MSDU_END_5_DA_IS_MCBC_LSB))
  1188. /**
  1189. * hal_rx_msdu_end_da_is_mcbc_get: API to check if pkt is MCBC
  1190. * from rx_msdu_end TLV
  1191. *
  1192. * @ buf: pointer to the start of RX PKT TLV headers
  1193. * Return: da_is_mcbc
  1194. */
  1195. static inline uint8_t
  1196. hal_rx_msdu_end_da_is_mcbc_get(uint8_t *buf)
  1197. {
  1198. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1199. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  1200. uint8_t da_is_mcbc;
  1201. da_is_mcbc = HAL_RX_MSDU_END_DA_IS_MCBC_GET(msdu_end);
  1202. return da_is_mcbc;
  1203. }
  1204. /*******************************************************************************
  1205. * RX ERROR APIS
  1206. ******************************************************************************/
  1207. #define HAL_RX_MPDU_END_DECRYPT_ERR_GET(_rx_mpdu_end) \
  1208. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_mpdu_end),\
  1209. RX_MPDU_END_1_RX_IN_TX_DECRYPT_BYP_OFFSET)), \
  1210. RX_MPDU_END_1_RX_IN_TX_DECRYPT_BYP_MASK, \
  1211. RX_MPDU_END_1_RX_IN_TX_DECRYPT_BYP_LSB))
  1212. /**
  1213. * hal_rx_mpdu_end_decrypt_err_get(): API to get the Decrypt ERR
  1214. * from rx_mpdu_end TLV
  1215. *
  1216. * @buf: pointer to the start of RX PKT TLV headers
  1217. * Return: uint32_t(decrypt_err)
  1218. */
  1219. static inline uint32_t
  1220. hal_rx_mpdu_end_decrypt_err_get(uint8_t *buf)
  1221. {
  1222. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1223. struct rx_mpdu_end *mpdu_end =
  1224. &pkt_tlvs->mpdu_end_tlv.rx_mpdu_end;
  1225. uint32_t decrypt_err;
  1226. decrypt_err = HAL_RX_MPDU_END_DECRYPT_ERR_GET(mpdu_end);
  1227. return decrypt_err;
  1228. }
  1229. #define HAL_RX_MPDU_END_MIC_ERR_GET(_rx_mpdu_end) \
  1230. (_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_mpdu_end),\
  1231. RX_MPDU_END_1_TKIP_MIC_ERR_OFFSET)), \
  1232. RX_MPDU_END_1_TKIP_MIC_ERR_MASK, \
  1233. RX_MPDU_END_1_TKIP_MIC_ERR_LSB))
  1234. /**
  1235. * hal_rx_mpdu_end_mic_err_get(): API to get the MIC ERR
  1236. * from rx_mpdu_end TLV
  1237. *
  1238. * @buf: pointer to the start of RX PKT TLV headers
  1239. * Return: uint32_t(mic_err)
  1240. */
  1241. static inline uint32_t
  1242. hal_rx_mpdu_end_mic_err_get(uint8_t *buf)
  1243. {
  1244. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1245. struct rx_mpdu_end *mpdu_end =
  1246. &pkt_tlvs->mpdu_end_tlv.rx_mpdu_end;
  1247. uint32_t mic_err;
  1248. mic_err = HAL_RX_MPDU_END_MIC_ERR_GET(mpdu_end);
  1249. return mic_err;
  1250. }
  1251. /*******************************************************************************
  1252. * RX REO ERROR APIS
  1253. ******************************************************************************/
  1254. #define HAL_RX_LINK_DESC_MSDU0_PTR(link_desc) \
  1255. ((struct rx_msdu_details *) \
  1256. _OFFSET_TO_BYTE_PTR((link_desc),\
  1257. RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET))
  1258. #define HAL_RX_NUM_MSDU_DESC 6
  1259. struct hal_rx_msdu_list {
  1260. struct hal_rx_msdu_desc_info msdu_info[HAL_RX_NUM_MSDU_DESC];
  1261. uint32_t sw_cookie[HAL_RX_NUM_MSDU_DESC];
  1262. };
  1263. struct hal_buf_info {
  1264. uint64_t paddr;
  1265. uint32_t sw_cookie;
  1266. };
  1267. /**
  1268. * hal_rx_msdu_link_desc_get: API to get the MSDU information
  1269. * from the MSDU link descriptor
  1270. *
  1271. * @ msdu_link_desc: Opaque pointer used by HAL to get to the
  1272. * MSDU link descriptor (struct rx_msdu_link)
  1273. * @ msdu_list: Return the list of MSDUs contained in this link descriptor
  1274. * Return: void
  1275. */
  1276. static inline void hal_rx_msdu_list_get(void *msdu_link_desc,
  1277. struct hal_rx_msdu_list *msdu_list, uint8_t *num_msdus)
  1278. {
  1279. struct rx_msdu_details *msdu_details;
  1280. struct rx_msdu_desc_info *msdu_desc_info;
  1281. struct rx_msdu_link *msdu_link = (struct rx_msdu_link *)msdu_link_desc;
  1282. int i;
  1283. if (*num_msdus > HAL_RX_NUM_MSDU_DESC)
  1284. *num_msdus = HAL_RX_NUM_MSDU_DESC;
  1285. msdu_details = HAL_RX_LINK_DESC_MSDU0_PTR(msdu_link);
  1286. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
  1287. "[%s][%d] msdu_link=%p msdu_details=%p\n",
  1288. __func__, __LINE__, msdu_link, msdu_details);
  1289. for (i = 0; i < *num_msdus; i++) {
  1290. msdu_desc_info = HAL_RX_MSDU_DESC_INFO_GET(&msdu_details[i]);
  1291. msdu_list->msdu_info[i].msdu_flags =
  1292. HAL_RX_MSDU_FLAGS_GET(msdu_desc_info);
  1293. msdu_list->msdu_info[i].msdu_len =
  1294. HAL_RX_MSDU_PKT_LENGTH_GET(msdu_desc_info);
  1295. msdu_list->sw_cookie[i] =
  1296. HAL_RX_BUF_COOKIE_GET(
  1297. &msdu_details[i].buffer_addr_info_details);
  1298. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
  1299. "[%s][%d] i=%d sw_cookie=%d\n",
  1300. __func__, __LINE__, i, msdu_list->sw_cookie[i]);
  1301. }
  1302. }
  1303. /**
  1304. * hal_rx_reo_buf_paddr_get: Gets the physical address and
  1305. * cookie from the REO destination ring element
  1306. *
  1307. * @ hal_rx_desc_cookie: Opaque cookie pointer used by HAL to get to
  1308. * the current descriptor
  1309. * @ buf_info: structure to return the buffer information
  1310. * Return: void
  1311. */
  1312. static inline void hal_rx_reo_buf_paddr_get(void *rx_desc,
  1313. struct hal_buf_info *buf_info)
  1314. {
  1315. struct reo_destination_ring *reo_ring =
  1316. (struct reo_destination_ring *)rx_desc;
  1317. buf_info->paddr =
  1318. (HAL_RX_REO_BUFFER_ADDR_31_0_GET(reo_ring) |
  1319. ((uint64_t)(HAL_RX_REO_BUFFER_ADDR_39_32_GET(reo_ring)) << 32));
  1320. buf_info->sw_cookie = HAL_RX_REO_BUF_COOKIE_GET(reo_ring);
  1321. }
  1322. /**
  1323. * enum hal_reo_error_code: Indicates that type of buffer or descriptor
  1324. *
  1325. * @ HAL_RX_MSDU_BUF_ADDR_TYPE : Reo buffer address points to the MSDU buffer
  1326. * @ HAL_RX_MSDU_LINK_DESC_TYPE: Reo buffer address points to the link
  1327. * descriptor
  1328. */
  1329. enum hal_rx_reo_buf_type {
  1330. HAL_RX_REO_MSDU_BUF_ADDR_TYPE = 0,
  1331. HAL_RX_REO_MSDU_LINK_DESC_TYPE,
  1332. };
  1333. #define HAL_RX_REO_BUF_TYPE_GET(reo_desc) (((*(((uint32_t *) reo_desc)+ \
  1334. (REO_DESTINATION_RING_7_REO_DEST_BUFFER_TYPE_OFFSET >> 2))) & \
  1335. REO_DESTINATION_RING_7_REO_DEST_BUFFER_TYPE_MASK) >> \
  1336. REO_DESTINATION_RING_7_REO_DEST_BUFFER_TYPE_LSB)
  1337. /**
  1338. * enum hal_reo_error_code: Error code describing the type of error detected
  1339. *
  1340. * @ HAL_REO_ERR_QUEUE_DESC_ADDR_0 : Reo queue descriptor provided in the
  1341. * REO_ENTRANCE ring is set to 0
  1342. * @ HAL_REO_ERR_QUEUE_DESC_INVALID: Reo queue descriptor valid bit is NOT set
  1343. * @ HAL_REO_ERR_AMPDU_IN_NON_BA : AMPDU frame received without BA session
  1344. * having been setup
  1345. * @ HAL_REO_ERR_NON_BA_DUPLICATE : Non-BA session, SN equal to SSN,
  1346. * Retry bit set: duplicate frame
  1347. * @ HAL_REO_ERR_BA_DUPLICATE : BA session, duplicate frame
  1348. * @ HAL_REO_ERR_REGULAR_FRAME_2K_JUMP : A normal (management/data frame)
  1349. * received with 2K jump in SN
  1350. * @ HAL_REO_ERR_BAR_FRAME_2K_JUMP : A bar received with 2K jump in SSN
  1351. * @ HAL_REO_ERR_REGULAR_FRAME_OOR : A normal (management/data frame) received
  1352. * with SN falling within the OOR window
  1353. * @ HAL_REO_ERR_BAR_FRAME_OOR : A bar received with SSN falling within the
  1354. * OOR window
  1355. * @ HAL_REO_ERR_BAR_FRAME_NO_BA_SESSION : A bar received without a BA session
  1356. * @ HAL_REO_ERR_BAR_FRAME_SN_EQUALS_SSN : A bar received with SSN equal to SN
  1357. * @ HAL_REO_ERR_PN_CHECK_FAILED : PN Check Failed packet
  1358. * @ HAL_REO_ERR_2K_ERROR_HANDLING_FLAG_SET : Frame is forwarded as a result
  1359. * of the Seq_2k_error_detected_flag been set in the REO Queue descriptor
  1360. * @ HAL_REO_ERR_PN_ERROR_HANDLING_FLAG_SET : Frame is forwarded as a result
  1361. * of the pn_error_detected_flag been set in the REO Queue descriptor
  1362. * @ HAL_REO_ERR_QUEUE_DESC_BLOCKED_SET : Frame is forwarded as a result of
  1363. * the queue descriptor(address) being blocked as SW/FW seems to be currently
  1364. * in the process of making updates to this descriptor
  1365. */
  1366. enum hal_reo_error_code {
  1367. HAL_REO_ERR_QUEUE_DESC_ADDR_0 = 0,
  1368. HAL_REO_ERR_QUEUE_DESC_INVALID,
  1369. HAL_REO_ERR_AMPDU_IN_NON_BA,
  1370. HAL_REO_ERR_NON_BA_DUPLICATE,
  1371. HAL_REO_ERR_BA_DUPLICATE,
  1372. HAL_REO_ERR_REGULAR_FRAME_2K_JUMP,
  1373. HAL_REO_ERR_BAR_FRAME_2K_JUMP,
  1374. HAL_REO_ERR_REGULAR_FRAME_OOR,
  1375. HAL_REO_ERR_BAR_FRAME_OOR,
  1376. HAL_REO_ERR_BAR_FRAME_NO_BA_SESSION,
  1377. HAL_REO_ERR_BAR_FRAME_SN_EQUALS_SSN,
  1378. HAL_REO_ERR_PN_CHECK_FAILED,
  1379. HAL_REO_ERR_2K_ERROR_HANDLING_FLAG_SET,
  1380. HAL_REO_ERR_PN_ERROR_HANDLING_FLAG_SET,
  1381. HAL_REO_ERR_QUEUE_DESC_BLOCKED_SET
  1382. };
  1383. #define HAL_RX_REO_ERROR_GET(reo_desc) (((*(((uint32_t *) reo_desc)+ \
  1384. (REO_DESTINATION_RING_7_REO_ERROR_CODE_OFFSET >> 2))) & \
  1385. REO_DESTINATION_RING_7_REO_ERROR_CODE_MASK) >> \
  1386. REO_DESTINATION_RING_7_REO_ERROR_CODE_LSB)
  1387. /**
  1388. * hal_rx_is_pn_error() - Indicate if this error was caused by a
  1389. * PN check failure
  1390. *
  1391. * @reo_desc: opaque pointer used by HAL to get the REO destination entry
  1392. *
  1393. * Return: true: error caused by PN check, false: other error
  1394. */
  1395. static inline bool hal_rx_reo_is_pn_error(void *rx_desc)
  1396. {
  1397. struct reo_destination_ring *reo_desc =
  1398. (struct reo_destination_ring *)rx_desc;
  1399. return ((HAL_RX_REO_ERROR_GET(reo_desc) ==
  1400. HAL_REO_ERR_PN_CHECK_FAILED) |
  1401. (HAL_RX_REO_ERROR_GET(reo_desc) ==
  1402. HAL_REO_ERR_PN_ERROR_HANDLING_FLAG_SET)) ?
  1403. true : false;
  1404. }
  1405. /**
  1406. * hal_rx_is_2k_jump() - Indicate if this error was caused by a 2K jump in
  1407. * the sequence number
  1408. *
  1409. * @ring_desc: opaque pointer used by HAL to get the REO destination entry
  1410. *
  1411. * Return: true: error caused by 2K jump, false: other error
  1412. */
  1413. static inline bool hal_rx_reo_is_2k_jump(void *rx_desc)
  1414. {
  1415. struct reo_destination_ring *reo_desc =
  1416. (struct reo_destination_ring *)rx_desc;
  1417. return ((HAL_RX_REO_ERROR_GET(reo_desc) ==
  1418. HAL_REO_ERR_REGULAR_FRAME_2K_JUMP) |
  1419. (HAL_RX_REO_ERROR_GET(reo_desc) ==
  1420. HAL_REO_ERR_2K_ERROR_HANDLING_FLAG_SET)) ?
  1421. true : false;
  1422. }
  1423. /**
  1424. * hal_rx_msdu_link_desc_set: Retrieves MSDU Link Descriptor to WBM
  1425. *
  1426. * @ soc : HAL version of the SOC pointer
  1427. * @ src_srng_desc : void pointer to the WBM Release Ring descriptor
  1428. * @ buf_addr_info : void pointer to the buffer_addr_info
  1429. *
  1430. * Return: void
  1431. */
  1432. /* look at implementation at dp_hw_link_desc_pool_setup()*/
  1433. static inline void hal_rx_msdu_link_desc_set(struct hal_soc *soc,
  1434. void *src_srng_desc, void *buf_addr_info)
  1435. {
  1436. struct wbm_release_ring *wbm_rel_srng =
  1437. (struct wbm_release_ring *)src_srng_desc;
  1438. /* Structure copy !!! */
  1439. wbm_rel_srng->released_buff_or_desc_addr_info =
  1440. *((struct buffer_addr_info *)buf_addr_info);
  1441. }
  1442. /*
  1443. * hal_rx_msdu_link_desc_reinject: Re-injects the MSDU link descriptor to
  1444. * REO entrance ring
  1445. *
  1446. * @ soc: HAL version of the SOC pointer
  1447. * @ pa: Physical address of the MSDU Link Descriptor
  1448. * @ cookie: SW cookie to get to the virtual address
  1449. * @ error_enabled_reo_q: Argument to determine whether this needs to go
  1450. * to the error enabled REO queue
  1451. *
  1452. * Return: void
  1453. */
  1454. static inline void hal_rx_msdu_link_desc_reinject(struct hal_soc *soc,
  1455. uint64_t pa, uint32_t cookie, bool error_enabled_reo_q)
  1456. {
  1457. /* TODO */
  1458. }
  1459. /**
  1460. * HAL_RX_BUF_ADDR_INFO_GET: Returns the address of the
  1461. * BUFFER_ADDR_INFO, give the RX descriptor
  1462. * (Assumption -- BUFFER_ADDR_INFO is the
  1463. * first field in the descriptor structure)
  1464. */
  1465. #define HAL_RX_BUF_ADDR_INFO_GET(ring_desc) ((void *)(ring_desc))
  1466. #define HAL_RX_REO_BUF_ADDR_INFO_GET HAL_RX_BUF_ADDR_INFO_GET
  1467. #define HAL_RX_WBM_BUF_ADDR_INFO_GET HAL_RX_BUF_ADDR_INFO_GET
  1468. /**
  1469. * hal_rx_ret_buf_manager_get: Returns the "return_buffer_manager"
  1470. * from the BUFFER_ADDR_INFO structure
  1471. * given a REO destination ring descriptor.
  1472. * @ ring_desc: RX(REO/WBM release) destination ring descriptor
  1473. *
  1474. * Return: uint8_t (value of the return_buffer_manager)
  1475. */
  1476. static inline
  1477. uint8_t hal_rx_ret_buf_manager_get(void *ring_desc)
  1478. {
  1479. /*
  1480. * The following macro takes buf_addr_info as argument,
  1481. * but since buf_addr_info is the first field in ring_desc
  1482. * Hence the following call is OK
  1483. */
  1484. return HAL_RX_BUF_RBM_GET(ring_desc);
  1485. }
  1486. /*******************************************************************************
  1487. * RX WBM ERROR APIS
  1488. ******************************************************************************/
  1489. /**
  1490. * enum hal_rx_wbm_error_source: Indicates which module initiated the
  1491. * release of this buffer or descriptor
  1492. *
  1493. * @ HAL_RX_WBM_ERR_SRC_TQM : TQM released this buffer or descriptor
  1494. * @ HAL_RX_WBM_ERR_SRC_RXDMA: RXDMA released this buffer or descriptor
  1495. * @ HAL_RX_WBM_ERR_SRC_REO: REO released this buffer or descriptor
  1496. * @ HAL_RX_WBM_ERR_SRC_FW: FW released this buffer or descriptor
  1497. * @ HAL_RX_WBM_ERR_SRC_SW: SW released this buffer or descriptor
  1498. */
  1499. enum hal_rx_wbm_error_source {
  1500. HAL_RX_WBM_ERR_SRC_TQM = 0,
  1501. HAL_RX_WBM_ERR_SRC_RXDMA,
  1502. HAL_RX_WBM_ERR_SRC_REO,
  1503. HAL_RX_WBM_ERR_SRC_FW,
  1504. HAL_RX_WBM_ERR_SRC_SW,
  1505. };
  1506. #define HAL_RX_WBM_ERR_SRC_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \
  1507. (WBM_RELEASE_RING_2_RELEASE_SOURCE_MODULE_OFFSET >> 2))) & \
  1508. WBM_RELEASE_RING_2_RELEASE_SOURCE_MODULE_MASK) >> \
  1509. WBM_RELEASE_RING_2_RELEASE_SOURCE_MODULE_LSB)
  1510. /**
  1511. * enum hal_rx_wbm_buf_type: Indicates that type of buffer or descriptor
  1512. * released
  1513. *
  1514. * @ HAL_RX_WBM_ERR_SRC_TQM : TQM released this buffer or descriptor
  1515. * @ HAL_RX_WBM_ERR_SRC_RXDMA: RXDMA released this buffer or descriptor
  1516. * @ HAL_RX_WBM_ERR_SRC_REO: REO released this buffer or descriptor
  1517. * @ HAL_RX_WBM_ERR_SRC_FW: FW released this buffer or descriptor
  1518. * @ HAL_RX_WBM_ERR_SRC_SW: SW released this buffer or descriptor
  1519. */
  1520. enum hal_rx_wbm_buf_type {
  1521. HAL_RX_WBM_BUF_TYPE_REL_BUF = 0,
  1522. HAL_RX_WBM_BUF_TYPE_MSDU_LINK_DESC,
  1523. HAL_RX_WBM_BUF_TYPE_MPDU_LINK_DESC,
  1524. HAL_RX_WBM_BUF_TYPE_MSDU_EXT_DESC,
  1525. HAL_RX_WBM_BUF_TYPE_Q_EXT_DESC,
  1526. };
  1527. #define HAL_RX_WBM_BUF_TYPE_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \
  1528. (WBM_RELEASE_RING_2_BUFFER_OR_DESC_TYPE_OFFSET >> 2))) & \
  1529. WBM_RELEASE_RING_2_BUFFER_OR_DESC_TYPE_MASK) >> \
  1530. WBM_RELEASE_RING_2_BUFFER_OR_DESC_TYPE_LSB)
  1531. /**
  1532. * enum - hal_rx_wbm_reo_push_reason: Indicates why REO pushed
  1533. * the frame to this release ring
  1534. *
  1535. * @ HAL_RX_WBM_REO_PSH_RSN_ERROR : Reo detected an error and pushed this
  1536. * frame to this queue
  1537. * @ HAL_RX_WBM_REO_PSH_RSN_ROUTE: Reo pushed the frame to this queue per
  1538. * received routing instructions. No error within REO was detected
  1539. */
  1540. enum hal_rx_wbm_reo_push_reason {
  1541. HAL_RX_WBM_REO_PSH_RSN_ERROR = 0,
  1542. HAL_RX_WBM_REO_PSH_RSN_ROUTE,
  1543. };
  1544. #define HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \
  1545. (WBM_RELEASE_RING_2_REO_PUSH_REASON_OFFSET >> 2))) & \
  1546. WBM_RELEASE_RING_2_REO_PUSH_REASON_MASK) >> \
  1547. WBM_RELEASE_RING_2_REO_PUSH_REASON_LSB)
  1548. #define HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \
  1549. (WBM_RELEASE_RING_2_REO_ERROR_CODE_OFFSET >> 2))) & \
  1550. WBM_RELEASE_RING_2_REO_ERROR_CODE_MASK) >> \
  1551. WBM_RELEASE_RING_2_REO_ERROR_CODE_LSB)
  1552. /**
  1553. * enum hal_rx_wbm_rxdma_push_reason: Indicates why REO pushed the frame to
  1554. * this release ring
  1555. *
  1556. * @ HAL_RX_WBM_RXDMA_PSH_RSN_ERROR : RXDMA detected an error and pushed
  1557. * this frame to this queue
  1558. * @ HAL_RX_WBM_RXDMA_PSH_RSN_ROUTE: RXDMA pushed the frame to this queue
  1559. * per received routing instructions. No error within RXDMA was detected
  1560. */
  1561. enum hal_rx_wbm_rxdma_push_reason {
  1562. HAL_RX_WBM_RXDMA_PSH_RSN_ERROR = 0,
  1563. HAL_RX_WBM_RXDMA_PSH_RSN_ROUTE,
  1564. };
  1565. #define HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc) \
  1566. (((*(((uint32_t *) wbm_desc) + \
  1567. (WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_OFFSET >> 2))) & \
  1568. WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_MASK) >> \
  1569. WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_LSB)
  1570. #define HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc) \
  1571. (((*(((uint32_t *) wbm_desc) + \
  1572. (WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_OFFSET >> 2))) & \
  1573. WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_MASK) >> \
  1574. WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_LSB)
  1575. #define HAL_RX_WBM_BUF_COOKIE_GET(wbm_desc) \
  1576. HAL_RX_BUF_COOKIE_GET(&((struct wbm_release_ring *) \
  1577. wbm_desc)->released_buff_or_desc_addr_info)
  1578. /**
  1579. * hal_rx_dump_rx_attention_tlv: dump RX attention TLV in structured
  1580. * humman readable format.
  1581. * @ rx_attn: pointer the rx_attention TLV in pkt.
  1582. * @ dbg_level: log level.
  1583. *
  1584. * Return: void
  1585. */
  1586. static inline void hal_rx_dump_rx_attention_tlv(struct rx_attention *rx_attn,
  1587. uint8_t dbg_level)
  1588. {
  1589. QDF_TRACE(QDF_MODULE_ID_DP, dbg_level,
  1590. "\n--------------------\n"
  1591. "rx_attention tlv \n"
  1592. "\n--------------------\n"
  1593. "rxpcu_mpdu_filter_in_category : %d\n"
  1594. "sw_frame_group_id : %d\n"
  1595. "reserved_0 : %d\n"
  1596. "phy_ppdu_id : %d\n"
  1597. "first_mpdu : %d\n"
  1598. "reserved_1a : %d\n"
  1599. "mcast_bcast : %d\n"
  1600. "ast_index_not_found : %d\n"
  1601. "ast_index_timeout : %d\n"
  1602. "power_mgmt : %d\n"
  1603. "non_qos : %d\n"
  1604. "null_data : %d\n"
  1605. "mgmt_type : %d\n"
  1606. "ctrl_type : %d\n"
  1607. "more_data : %d\n"
  1608. "eosp : %d\n"
  1609. "a_msdu_error : %d\n"
  1610. "fragment_flag : %d\n"
  1611. "order : %d\n"
  1612. "cce_match : %d\n"
  1613. "overflow_err : %d\n"
  1614. "msdu_length_err : %d\n"
  1615. "tcp_udp_chksum_fail : %d\n"
  1616. "ip_chksum_fail : %d\n"
  1617. "sa_idx_invalid : %d\n"
  1618. "da_idx_invalid : %d\n"
  1619. "reserved_1b : %d\n"
  1620. "rx_in_tx_decrypt_byp : %d\n"
  1621. "encrypt_required : %d\n"
  1622. "directed : %d\n"
  1623. "buffer_fragment : %d\n"
  1624. "mpdu_length_err : %d\n"
  1625. "tkip_mic_err : %d\n"
  1626. "decrypt_err : %d\n"
  1627. "unencrypted_frame_err : %d\n"
  1628. "fcs_err : %d\n"
  1629. "flow_idx_timeout : %d\n"
  1630. "flow_idx_invalid : %d\n"
  1631. "wifi_parser_error : %d\n"
  1632. "amsdu_parser_error : %d\n"
  1633. "sa_idx_timeout : %d\n"
  1634. "da_idx_timeout : %d\n"
  1635. "msdu_limit_error : %d\n"
  1636. "da_is_valid : %d\n"
  1637. "da_is_mcbc : %d\n"
  1638. "sa_is_valid : %d\n"
  1639. "decrypt_status_code : %d\n"
  1640. "rx_bitmap_not_updated : %d\n"
  1641. "reserved_2 : %d\n"
  1642. "msdu_done : %d\n",
  1643. rx_attn->rxpcu_mpdu_filter_in_category,
  1644. rx_attn->sw_frame_group_id,
  1645. rx_attn->reserved_0,
  1646. rx_attn->phy_ppdu_id,
  1647. rx_attn->first_mpdu,
  1648. rx_attn->reserved_1a,
  1649. rx_attn->mcast_bcast,
  1650. rx_attn->ast_index_not_found,
  1651. rx_attn->ast_index_timeout,
  1652. rx_attn->power_mgmt,
  1653. rx_attn->non_qos,
  1654. rx_attn->null_data,
  1655. rx_attn->mgmt_type,
  1656. rx_attn->ctrl_type,
  1657. rx_attn->more_data,
  1658. rx_attn->eosp,
  1659. rx_attn->a_msdu_error,
  1660. rx_attn->fragment_flag,
  1661. rx_attn->order,
  1662. rx_attn->cce_match,
  1663. rx_attn->overflow_err,
  1664. rx_attn->msdu_length_err,
  1665. rx_attn->tcp_udp_chksum_fail,
  1666. rx_attn->ip_chksum_fail,
  1667. rx_attn->sa_idx_invalid,
  1668. rx_attn->da_idx_invalid,
  1669. rx_attn->reserved_1b,
  1670. rx_attn->rx_in_tx_decrypt_byp,
  1671. rx_attn->encrypt_required,
  1672. rx_attn->directed,
  1673. rx_attn->buffer_fragment,
  1674. rx_attn->mpdu_length_err,
  1675. rx_attn->tkip_mic_err,
  1676. rx_attn->decrypt_err,
  1677. rx_attn->unencrypted_frame_err,
  1678. rx_attn->fcs_err,
  1679. rx_attn->flow_idx_timeout,
  1680. rx_attn->flow_idx_invalid,
  1681. rx_attn->wifi_parser_error,
  1682. rx_attn->amsdu_parser_error,
  1683. rx_attn->sa_idx_timeout,
  1684. rx_attn->da_idx_timeout,
  1685. rx_attn->msdu_limit_error,
  1686. rx_attn->da_is_valid,
  1687. rx_attn->da_is_mcbc,
  1688. rx_attn->sa_is_valid,
  1689. rx_attn->decrypt_status_code,
  1690. rx_attn->rx_bitmap_not_updated,
  1691. rx_attn->reserved_2,
  1692. rx_attn->msdu_done);
  1693. }
  1694. /**
  1695. * hal_rx_dump_mpdu_start_tlv: dump RX mpdu_start TLV in structured
  1696. * human readable format.
  1697. * @ mpdu_start: pointer the rx_attention TLV in pkt.
  1698. * @ dbg_level: log level.
  1699. *
  1700. * Return: void
  1701. */
  1702. static inline void hal_rx_dump_mpdu_start_tlv(struct rx_mpdu_start *mpdu_start,
  1703. uint8_t dbg_level)
  1704. {
  1705. struct rx_mpdu_info *mpdu_info =
  1706. (struct rx_mpdu_info *) &mpdu_start->rx_mpdu_info_details;
  1707. QDF_TRACE(QDF_MODULE_ID_DP, dbg_level,
  1708. "\n--------------------\n"
  1709. "rx_mpdu_start tlv \n"
  1710. "--------------------\n"
  1711. "rxpcu_mpdu_filter_in_category: %d\n"
  1712. "sw_frame_group_id: %d\n"
  1713. "ndp_frame: %d\n"
  1714. "phy_err: %d\n"
  1715. "phy_err_during_mpdu_header: %d\n"
  1716. "protocol_version_err: %d\n"
  1717. "ast_based_lookup_valid: %d\n"
  1718. "phy_ppdu_id: %d\n"
  1719. "ast_index: %d\n"
  1720. "sw_peer_id: %d\n"
  1721. "mpdu_frame_control_valid: %d\n"
  1722. "mpdu_duration_valid: %d\n"
  1723. "mac_addr_ad1_valid: %d\n"
  1724. "mac_addr_ad2_valid: %d\n"
  1725. "mac_addr_ad3_valid: %d\n"
  1726. "mac_addr_ad4_valid: %d\n"
  1727. "mpdu_sequence_control_valid: %d\n"
  1728. "mpdu_qos_control_valid: %d\n"
  1729. "mpdu_ht_control_valid: %d\n"
  1730. "frame_encryption_info_valid: %d\n"
  1731. "fr_ds: %d\n"
  1732. "to_ds: %d\n"
  1733. "encrypted: %d\n"
  1734. "mpdu_retry: %d\n"
  1735. "mpdu_sequence_number: %d\n"
  1736. "epd_en: %d\n"
  1737. "all_frames_shall_be_encrypted: %d\n"
  1738. "encrypt_type: %d\n"
  1739. "mesh_sta: %d\n"
  1740. "bssid_hit: %d\n"
  1741. "bssid_number: %d\n"
  1742. "tid: %d\n"
  1743. "pn_31_0: %d\n"
  1744. "pn_63_32: %d\n"
  1745. "pn_95_64: %d\n"
  1746. "pn_127_96: %d\n"
  1747. "peer_meta_data: %d\n"
  1748. "rxpt_classify_info.reo_destination_indication: %d\n"
  1749. "rxpt_classify_info.use_flow_id_toeplitz_clfy: %d\n"
  1750. "rx_reo_queue_desc_addr_31_0: %d\n"
  1751. "rx_reo_queue_desc_addr_39_32: %d\n"
  1752. "receive_queue_number: %d\n"
  1753. "pre_delim_err_warning: %d\n"
  1754. "first_delim_err: %d\n"
  1755. "key_id_octet: %d\n"
  1756. "new_peer_entry: %d\n"
  1757. "decrypt_needed: %d\n"
  1758. "decap_type: %d\n"
  1759. "rx_insert_vlan_c_tag_padding: %d\n"
  1760. "rx_insert_vlan_s_tag_padding: %d\n"
  1761. "strip_vlan_c_tag_decap: %d\n"
  1762. "strip_vlan_s_tag_decap: %d\n"
  1763. "pre_delim_count: %d\n"
  1764. "ampdu_flag: %d\n"
  1765. "bar_frame: %d\n"
  1766. "mpdu_length: %d\n"
  1767. "first_mpdu: %d\n"
  1768. "mcast_bcast: %d\n"
  1769. "ast_index_not_found: %d\n"
  1770. "ast_index_timeout: %d\n"
  1771. "power_mgmt: %d\n"
  1772. "non_qos: %d\n"
  1773. "null_data: %d\n"
  1774. "mgmt_type: %d\n"
  1775. "ctrl_type: %d\n"
  1776. "more_data: %d\n"
  1777. "eosp: %d\n"
  1778. "fragment_flag: %d\n"
  1779. "order: %d\n"
  1780. "u_apsd_trigger: %d\n"
  1781. "encrypt_required: %d\n"
  1782. "directed: %d\n"
  1783. "mpdu_frame_control_field: %d\n"
  1784. "mpdu_duration_field: %d\n"
  1785. "mac_addr_ad1_31_0: %d\n"
  1786. "mac_addr_ad1_47_32: %d\n"
  1787. "mac_addr_ad2_15_0: %d\n"
  1788. "mac_addr_ad2_47_16: %d\n"
  1789. "mac_addr_ad3_31_0: %d\n"
  1790. "mac_addr_ad3_47_32: %d\n"
  1791. "mpdu_sequence_control_field: %d\n"
  1792. "mac_addr_ad4_31_0: %d\n"
  1793. "mac_addr_ad4_47_32: %d\n"
  1794. "mpdu_qos_control_field: %d\n"
  1795. "mpdu_ht_control_field: %d\n",
  1796. mpdu_info->rxpcu_mpdu_filter_in_category,
  1797. mpdu_info->sw_frame_group_id,
  1798. mpdu_info->ndp_frame,
  1799. mpdu_info->phy_err,
  1800. mpdu_info->phy_err_during_mpdu_header,
  1801. mpdu_info->protocol_version_err,
  1802. mpdu_info->ast_based_lookup_valid,
  1803. mpdu_info->phy_ppdu_id,
  1804. mpdu_info->ast_index,
  1805. mpdu_info->sw_peer_id,
  1806. mpdu_info->mpdu_frame_control_valid,
  1807. mpdu_info->mpdu_duration_valid,
  1808. mpdu_info->mac_addr_ad1_valid,
  1809. mpdu_info->mac_addr_ad2_valid,
  1810. mpdu_info->mac_addr_ad3_valid,
  1811. mpdu_info->mac_addr_ad4_valid,
  1812. mpdu_info->mpdu_sequence_control_valid,
  1813. mpdu_info->mpdu_qos_control_valid,
  1814. mpdu_info->mpdu_ht_control_valid,
  1815. mpdu_info->frame_encryption_info_valid,
  1816. mpdu_info->fr_ds,
  1817. mpdu_info->to_ds,
  1818. mpdu_info->encrypted,
  1819. mpdu_info->mpdu_retry,
  1820. mpdu_info->mpdu_sequence_number,
  1821. mpdu_info->epd_en,
  1822. mpdu_info->all_frames_shall_be_encrypted,
  1823. mpdu_info->encrypt_type,
  1824. mpdu_info->mesh_sta,
  1825. mpdu_info->bssid_hit,
  1826. mpdu_info->bssid_number,
  1827. mpdu_info->tid,
  1828. mpdu_info->pn_31_0,
  1829. mpdu_info->pn_63_32,
  1830. mpdu_info->pn_95_64,
  1831. mpdu_info->pn_127_96,
  1832. mpdu_info->peer_meta_data,
  1833. mpdu_info->rxpt_classify_info_details.reo_destination_indication,
  1834. mpdu_info->rxpt_classify_info_details.use_flow_id_toeplitz_clfy,
  1835. mpdu_info->rx_reo_queue_desc_addr_31_0,
  1836. mpdu_info->rx_reo_queue_desc_addr_39_32,
  1837. mpdu_info->receive_queue_number,
  1838. mpdu_info->pre_delim_err_warning,
  1839. mpdu_info->first_delim_err,
  1840. mpdu_info->key_id_octet,
  1841. mpdu_info->new_peer_entry,
  1842. mpdu_info->decrypt_needed,
  1843. mpdu_info->decap_type,
  1844. mpdu_info->rx_insert_vlan_c_tag_padding,
  1845. mpdu_info->rx_insert_vlan_s_tag_padding,
  1846. mpdu_info->strip_vlan_c_tag_decap,
  1847. mpdu_info->strip_vlan_s_tag_decap,
  1848. mpdu_info->pre_delim_count,
  1849. mpdu_info->ampdu_flag,
  1850. mpdu_info->bar_frame,
  1851. mpdu_info->mpdu_length,
  1852. mpdu_info->first_mpdu,
  1853. mpdu_info->mcast_bcast,
  1854. mpdu_info->ast_index_not_found,
  1855. mpdu_info->ast_index_timeout,
  1856. mpdu_info->power_mgmt,
  1857. mpdu_info->non_qos,
  1858. mpdu_info->null_data,
  1859. mpdu_info->mgmt_type,
  1860. mpdu_info->ctrl_type,
  1861. mpdu_info->more_data,
  1862. mpdu_info->eosp,
  1863. mpdu_info->fragment_flag,
  1864. mpdu_info->order,
  1865. mpdu_info->u_apsd_trigger,
  1866. mpdu_info->encrypt_required,
  1867. mpdu_info->directed,
  1868. mpdu_info->mpdu_frame_control_field,
  1869. mpdu_info->mpdu_duration_field,
  1870. mpdu_info->mac_addr_ad1_31_0,
  1871. mpdu_info->mac_addr_ad1_47_32,
  1872. mpdu_info->mac_addr_ad2_15_0,
  1873. mpdu_info->mac_addr_ad2_47_16,
  1874. mpdu_info->mac_addr_ad3_31_0,
  1875. mpdu_info->mac_addr_ad3_47_32,
  1876. mpdu_info->mpdu_sequence_control_field,
  1877. mpdu_info->mac_addr_ad4_31_0,
  1878. mpdu_info->mac_addr_ad4_47_32,
  1879. mpdu_info->mpdu_qos_control_field,
  1880. mpdu_info->mpdu_ht_control_field);
  1881. }
  1882. /**
  1883. * hal_rx_dump_msdu_start_tlv: dump RX msdu_start TLV in structured
  1884. * human readable format.
  1885. * @ msdu_start: pointer the msdu_start TLV in pkt.
  1886. * @ dbg_level: log level.
  1887. *
  1888. * Return: void
  1889. */
  1890. static void hal_rx_dump_msdu_start_tlv(struct rx_msdu_start *msdu_start,
  1891. uint8_t dbg_level)
  1892. {
  1893. QDF_TRACE(QDF_MODULE_ID_DP, dbg_level,
  1894. "\n--------------------\n"
  1895. "rx_msdu_start tlv \n"
  1896. "--------------------\n"
  1897. "rxpcu_mpdu_filter_in_category: %d\n"
  1898. "sw_frame_group_id: %d\n"
  1899. "phy_ppdu_id: %d\n"
  1900. "msdu_length: %d\n"
  1901. "ipsec_esp: %d\n"
  1902. "l3_offset: %d\n"
  1903. "ipsec_ah: %d\n"
  1904. "l4_offset: %d\n"
  1905. "msdu_number: %d\n"
  1906. "decap_format: %d\n"
  1907. "ipv4_proto: %d\n"
  1908. "ipv6_proto: %d\n"
  1909. "tcp_proto: %d\n"
  1910. "udp_proto: %d\n"
  1911. "ip_frag: %d\n"
  1912. "tcp_only_ack: %d\n"
  1913. "da_is_bcast_mcast: %d\n"
  1914. "toeplitz_hash: %d\n"
  1915. "ip4_protocol_ip6_next_header: %d\n"
  1916. "toeplitz_hash_2_or_4: %d\n"
  1917. "flow_id_toeplitz: %d\n"
  1918. "user_rssi: %d\n"
  1919. "pkt_type: %d\n"
  1920. "stbc: %d\n"
  1921. "sgi: %d\n"
  1922. "rate_mcs: %d\n"
  1923. "receive_bandwidth: %d\n"
  1924. "reception_type: %d\n"
  1925. "nss: %d\n"
  1926. "ppdu_start_timestamp: %d\n"
  1927. "sw_phy_meta_data: %d\n",
  1928. msdu_start->rxpcu_mpdu_filter_in_category,
  1929. msdu_start->sw_frame_group_id,
  1930. msdu_start->phy_ppdu_id,
  1931. msdu_start->msdu_length,
  1932. msdu_start->ipsec_esp,
  1933. msdu_start->l3_offset,
  1934. msdu_start->ipsec_ah,
  1935. msdu_start->l4_offset,
  1936. msdu_start->msdu_number,
  1937. msdu_start->decap_format,
  1938. msdu_start->ipv4_proto,
  1939. msdu_start->ipv6_proto,
  1940. msdu_start->tcp_proto,
  1941. msdu_start->udp_proto,
  1942. msdu_start->ip_frag,
  1943. msdu_start->tcp_only_ack,
  1944. msdu_start->da_is_bcast_mcast,
  1945. msdu_start->toeplitz_hash,
  1946. msdu_start->ip4_protocol_ip6_next_header,
  1947. msdu_start->toeplitz_hash_2_or_4,
  1948. msdu_start->flow_id_toeplitz,
  1949. msdu_start->user_rssi,
  1950. msdu_start->pkt_type,
  1951. msdu_start->stbc,
  1952. msdu_start->sgi,
  1953. msdu_start->rate_mcs,
  1954. msdu_start->receive_bandwidth,
  1955. msdu_start->reception_type,
  1956. msdu_start->nss,
  1957. msdu_start->ppdu_start_timestamp,
  1958. msdu_start->sw_phy_meta_data);
  1959. }
  1960. /**
  1961. * hal_rx_dump_msdu_end_tlv: dump RX msdu_end TLV in structured
  1962. * human readable format.
  1963. * @ msdu_end: pointer the msdu_end TLV in pkt.
  1964. * @ dbg_level: log level.
  1965. *
  1966. * Return: void
  1967. */
  1968. static inline void hal_rx_dump_msdu_end_tlv(struct rx_msdu_end *msdu_end,
  1969. uint8_t dbg_level)
  1970. {
  1971. QDF_TRACE(QDF_MODULE_ID_DP, dbg_level,
  1972. "\n--------------------\n"
  1973. "rx_msdu_end tlv \n"
  1974. "--------------------\n"
  1975. "rxpcu_mpdu_filter_in_category: %d\n"
  1976. "sw_frame_group_id: %d\n"
  1977. "phy_ppdu_id: %d\n"
  1978. "ip_hdr_chksum: %d\n"
  1979. "tcp_udp_chksum: %d\n"
  1980. "key_id_octet: %d\n"
  1981. "cce_super_rule: %d\n"
  1982. "cce_classify_not_done_truncat: %d\n"
  1983. "cce_classify_not_done_cce_dis: %d\n"
  1984. "ext_wapi_pn_63_48: %d\n"
  1985. "ext_wapi_pn_95_64: %d\n"
  1986. "ext_wapi_pn_127_96: %d\n"
  1987. "reported_mpdu_length: %d\n"
  1988. "first_msdu: %d\n"
  1989. "last_msdu: %d\n"
  1990. "sa_idx_timeout: %d\n"
  1991. "da_idx_timeout: %d\n"
  1992. "msdu_limit_error: %d\n"
  1993. "flow_idx_timeout: %d\n"
  1994. "flow_idx_invalid: %d\n"
  1995. "wifi_parser_error: %d\n"
  1996. "amsdu_parser_error: %d\n"
  1997. "sa_is_valid: %d\n"
  1998. "da_is_valid: %d\n"
  1999. "da_is_mcbc: %d\n"
  2000. "l3_header_padding: %d\n"
  2001. "ipv6_options_crc: %d\n"
  2002. "tcp_seq_number: %d\n"
  2003. "tcp_ack_number: %d\n"
  2004. "tcp_flag: %d\n"
  2005. "lro_eligible: %d\n"
  2006. "window_size: %d\n"
  2007. "da_offset: %d\n"
  2008. "sa_offset: %d\n"
  2009. "da_offset_valid: %d\n"
  2010. "sa_offset_valid: %d\n"
  2011. "type_offset: %d\n"
  2012. "rule_indication_31_0: %d\n"
  2013. "rule_indication_63_32: %d\n"
  2014. "sa_idx: %d\n"
  2015. "da_idx: %d\n"
  2016. "msdu_drop: %d\n"
  2017. "reo_destination_indication: %d\n"
  2018. "flow_idx: %d\n"
  2019. "fse_metadata: %d\n"
  2020. "cce_metadata: %d\n"
  2021. "sa_sw_peer_id: %d\n",
  2022. msdu_end->rxpcu_mpdu_filter_in_category,
  2023. msdu_end->sw_frame_group_id,
  2024. msdu_end->phy_ppdu_id,
  2025. msdu_end->ip_hdr_chksum,
  2026. msdu_end->tcp_udp_chksum,
  2027. msdu_end->key_id_octet,
  2028. msdu_end->cce_super_rule,
  2029. msdu_end->cce_classify_not_done_truncate,
  2030. msdu_end->cce_classify_not_done_cce_dis,
  2031. msdu_end->ext_wapi_pn_63_48,
  2032. msdu_end->ext_wapi_pn_95_64,
  2033. msdu_end->ext_wapi_pn_127_96,
  2034. msdu_end->reported_mpdu_length,
  2035. msdu_end->first_msdu,
  2036. msdu_end->last_msdu,
  2037. msdu_end->sa_idx_timeout,
  2038. msdu_end->da_idx_timeout,
  2039. msdu_end->msdu_limit_error,
  2040. msdu_end->flow_idx_timeout,
  2041. msdu_end->flow_idx_invalid,
  2042. msdu_end->wifi_parser_error,
  2043. msdu_end->amsdu_parser_error,
  2044. msdu_end->sa_is_valid,
  2045. msdu_end->da_is_valid,
  2046. msdu_end->da_is_mcbc,
  2047. msdu_end->l3_header_padding,
  2048. msdu_end->ipv6_options_crc,
  2049. msdu_end->tcp_seq_number,
  2050. msdu_end->tcp_ack_number,
  2051. msdu_end->tcp_flag,
  2052. msdu_end->lro_eligible,
  2053. msdu_end->window_size,
  2054. msdu_end->da_offset,
  2055. msdu_end->sa_offset,
  2056. msdu_end->da_offset_valid,
  2057. msdu_end->sa_offset_valid,
  2058. msdu_end->type_offset,
  2059. msdu_end->rule_indication_31_0,
  2060. msdu_end->rule_indication_63_32,
  2061. msdu_end->sa_idx,
  2062. msdu_end->da_idx,
  2063. msdu_end->msdu_drop,
  2064. msdu_end->reo_destination_indication,
  2065. msdu_end->flow_idx,
  2066. msdu_end->fse_metadata,
  2067. msdu_end->cce_metadata,
  2068. msdu_end->sa_sw_peer_id);
  2069. }
  2070. /**
  2071. * hal_rx_dump_mpdu_end_tlv: dump RX mpdu_end TLV in structured
  2072. * human readable format.
  2073. * @ mpdu_end: pointer the mpdu_end TLV in pkt.
  2074. * @ dbg_level: log level.
  2075. *
  2076. * Return: void
  2077. */
  2078. static inline void hal_rx_dump_mpdu_end_tlv(struct rx_mpdu_end *mpdu_end,
  2079. uint8_t dbg_level)
  2080. {
  2081. QDF_TRACE(QDF_MODULE_ID_DP, dbg_level,
  2082. "\n--------------------\n"
  2083. "rx_mpdu_end tlv \n"
  2084. "--------------------\n"
  2085. "rxpcu_mpdu_filter_in_category: %d\n"
  2086. "sw_frame_group_id: %d\n"
  2087. "phy_ppdu_id: %d\n"
  2088. "unsup_ktype_short_frame: %d\n"
  2089. "rx_in_tx_decrypt_byp: %d\n"
  2090. "overflow_err: %d\n"
  2091. "mpdu_length_err: %d\n"
  2092. "tkip_mic_err: %d\n"
  2093. "decrypt_err: %d\n"
  2094. "unencrypted_frame_err: %d\n"
  2095. "pn_fields_contain_valid_info: %d\n"
  2096. "fcs_err: %d\n"
  2097. "msdu_length_err: %d\n"
  2098. "rxdma0_destination_ring: %d\n"
  2099. "rxdma1_destination_ring: %d\n"
  2100. "decrypt_status_code: %d\n"
  2101. "rx_bitmap_not_updated: %d\n",
  2102. mpdu_end->rxpcu_mpdu_filter_in_category,
  2103. mpdu_end->sw_frame_group_id,
  2104. mpdu_end->phy_ppdu_id,
  2105. mpdu_end->unsup_ktype_short_frame,
  2106. mpdu_end->rx_in_tx_decrypt_byp,
  2107. mpdu_end->overflow_err,
  2108. mpdu_end->mpdu_length_err,
  2109. mpdu_end->tkip_mic_err,
  2110. mpdu_end->decrypt_err,
  2111. mpdu_end->unencrypted_frame_err,
  2112. mpdu_end->pn_fields_contain_valid_info,
  2113. mpdu_end->fcs_err,
  2114. mpdu_end->msdu_length_err,
  2115. mpdu_end->rxdma0_destination_ring,
  2116. mpdu_end->rxdma1_destination_ring,
  2117. mpdu_end->decrypt_status_code,
  2118. mpdu_end->rx_bitmap_not_updated);
  2119. }
  2120. /**
  2121. * hal_rx_dump_pkt_hdr_tlv: dump RX pkt header TLV in hex format
  2122. * @ pkt_hdr_tlv: pointer the pkt_hdr_tlv in pkt.
  2123. * @ dbg_level: log level.
  2124. *
  2125. * Return: void
  2126. */
  2127. static inline void hal_rx_dump_pkt_hdr_tlv(struct rx_pkt_hdr_tlv *pkt_hdr_tlv,
  2128. uint8_t dbg_level)
  2129. {
  2130. QDF_TRACE(QDF_MODULE_ID_DP, dbg_level,
  2131. "\n---------------\n"
  2132. "rx_pkt_hdr_tlv \n"
  2133. "---------------\n"
  2134. "phy_ppdu_id %d \n",
  2135. pkt_hdr_tlv->phy_ppdu_id);
  2136. QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_DP, dbg_level,
  2137. pkt_hdr_tlv->rx_pkt_hdr, 128);
  2138. }
  2139. /**
  2140. * hal_rx_dump_pkt_tlvs: API to print all member elements of
  2141. * RX TLVs
  2142. * @ buf: pointer the pkt buffer.
  2143. * @ dbg_level: log level.
  2144. *
  2145. * Return: void
  2146. */
  2147. static inline void hal_rx_dump_pkt_tlvs(uint8_t *buf, uint8_t dbg_level)
  2148. {
  2149. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *) buf;
  2150. struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
  2151. struct rx_mpdu_start *mpdu_start =
  2152. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  2153. struct rx_msdu_start *msdu_start =
  2154. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  2155. struct rx_mpdu_end *mpdu_end = &pkt_tlvs->mpdu_end_tlv.rx_mpdu_end;
  2156. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  2157. struct rx_pkt_hdr_tlv *pkt_hdr_tlv = &pkt_tlvs->pkt_hdr_tlv;
  2158. hal_rx_dump_rx_attention_tlv(rx_attn, dbg_level);
  2159. hal_rx_dump_mpdu_start_tlv(mpdu_start, dbg_level);
  2160. hal_rx_dump_msdu_start_tlv(msdu_start, dbg_level);
  2161. hal_rx_dump_mpdu_end_tlv(mpdu_end, dbg_level);
  2162. hal_rx_dump_msdu_end_tlv(msdu_end, dbg_level);
  2163. hal_rx_dump_pkt_hdr_tlv(pkt_hdr_tlv, dbg_level);
  2164. }
  2165. #endif /* _HAL_RX_H */