hal_be_rx_tlv.h 70 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582
  1. /*
  2. * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
  3. * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for
  6. * any purpose with or without fee is hereby granted, provided that the
  7. * above copyright notice and this permission notice appear in all
  8. * copies.
  9. *
  10. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  11. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  12. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  13. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  14. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  15. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  16. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  17. * PERFORMANCE OF THIS SOFTWARE.
  18. */
  19. #ifndef _HAL_BE_RX_TLV_H_
  20. #define _HAL_BE_RX_TLV_H_
  21. #include "hal_api_mon.h"
  22. /*
  23. * Structures & Macros to obtain fields from the TLV's in the Rx packet
  24. * pre-header.
  25. */
  26. #ifdef CONFIG_4_BYTES_TLV_TAG
  27. #define TLV_TAG_T uint32_t
  28. #else
  29. #define TLV_TAG_T uint64_t
  30. #endif
  31. #define HAL_RX_BE_PKT_HDR_TLV_LEN 112
  32. #ifndef BIG_ENDIAN_HOST
  33. struct rx_pkt_hdr_tlv {
  34. TLV_TAG_T tag; /* TLV_TAG_T B */
  35. uint32_t reserved_0 : 16, /* 4 B */
  36. phy_ppdu_id : 16;
  37. uint32_t reserved_1a; /* 4 B */
  38. char rx_pkt_hdr[HAL_RX_BE_PKT_HDR_TLV_LEN]; /* 112 B */
  39. };
  40. #else
  41. struct rx_pkt_hdr_tlv {
  42. TLV_TAG_T tag; /* TLV_TAG_T B */
  43. uint32_t phy_ppdu_id : 16, /* 4 B */
  44. reserved_0 : 16;
  45. uint32_t reserved_1a; /* 4 B */
  46. char rx_pkt_hdr[HAL_RX_BE_PKT_HDR_TLV_LEN]; /* 112 B */
  47. };
  48. #endif
  49. #ifdef CONFIG_WORD_BASED_TLV
  50. #ifndef BIG_ENDIAN_HOST
  51. struct rx_msdu_end_compact {
  52. uint32_t sa_sw_peer_id : 16,
  53. sa_idx_timeout : 1,
  54. da_idx_timeout : 1,
  55. to_ds : 1,
  56. tid : 4,
  57. sa_is_valid : 1,
  58. da_is_valid : 1,
  59. da_is_mcbc : 1,
  60. l3_header_padding : 2,
  61. first_msdu : 1,
  62. last_msdu : 1,
  63. fr_ds : 1,
  64. ip_chksum_fail_copy : 1;
  65. uint32_t sa_idx : 16,
  66. da_idx_or_sw_peer_id : 16;
  67. uint32_t msdu_drop : 1,
  68. reo_destination_indication : 5,
  69. flow_idx : 20,
  70. use_ppe : 1,
  71. mesh_sta : 2,
  72. vlan_ctag_stripped : 1,
  73. vlan_stag_stripped : 1,
  74. fragment_flag : 1;
  75. uint32_t fse_metadata : 32;
  76. uint32_t cce_metadata : 16,
  77. tcp_udp_chksum : 16;
  78. uint32_t aggregation_count : 8,
  79. flow_aggregation_continuation : 1,
  80. fisa_timeout : 1,
  81. tcp_udp_chksum_fail_copy : 1,
  82. msdu_limit_error : 1,
  83. flow_idx_timeout : 1,
  84. flow_idx_invalid : 1,
  85. cce_match : 1,
  86. amsdu_parser_error : 1,
  87. cumulative_ip_length : 16;
  88. uint32_t key_id_octet : 8,
  89. reserved_8a : 24;
  90. uint32_t reserved_9a : 6,
  91. service_code : 9,
  92. priority_valid : 1,
  93. intra_bss : 1,
  94. dest_chip_id : 2,
  95. multicast_echo : 1,
  96. wds_learning_event : 1,
  97. wds_roaming_event : 1,
  98. wds_keep_alive_event : 1,
  99. dest_chip_pmac_id : 1,
  100. reserved_9b : 8;
  101. uint32_t msdu_length : 14,
  102. stbc : 1,
  103. ipsec_esp : 1,
  104. l3_offset : 7,
  105. ipsec_ah : 1,
  106. l4_offset : 8;
  107. uint32_t msdu_number : 8,
  108. decap_format : 2,
  109. ipv4_proto : 1,
  110. ipv6_proto : 1,
  111. tcp_proto : 1,
  112. udp_proto : 1,
  113. ip_frag : 1,
  114. tcp_only_ack : 1,
  115. da_is_bcast_mcast : 1,
  116. toeplitz_hash_sel : 2,
  117. ip_fixed_header_valid : 1,
  118. ip_extn_header_valid : 1,
  119. tcp_udp_header_valid : 1,
  120. mesh_control_present : 1,
  121. ldpc : 1,
  122. ip4_protocol_ip6_next_header : 8;
  123. uint32_t vlan_ctag_ci : 16,
  124. vlan_stag_ci : 16;
  125. uint32_t peer_meta_data : 32;
  126. uint32_t user_rssi : 8,
  127. pkt_type : 4,
  128. sgi : 2,
  129. rate_mcs : 4,
  130. receive_bandwidth : 3,
  131. reception_type : 3,
  132. mimo_ss_bitmap : 7,
  133. msdu_done_copy : 1;
  134. uint32_t flow_id_toeplitz : 32;
  135. uint32_t ppdu_start_timestamp_63_32;
  136. uint32_t sw_phy_meta_data : 32;
  137. uint32_t first_mpdu : 1,
  138. reserved_16a : 1,
  139. mcast_bcast : 1,
  140. ast_index_not_found : 1,
  141. ast_index_timeout : 1,
  142. power_mgmt : 1,
  143. non_qos : 1,
  144. null_data : 1,
  145. mgmt_type : 1,
  146. ctrl_type : 1,
  147. more_data : 1,
  148. eosp : 1,
  149. a_msdu_error : 1,
  150. reserved_16b : 1,
  151. order : 1,
  152. wifi_parser_error : 1,
  153. overflow_err : 1,
  154. msdu_length_err : 1,
  155. tcp_udp_chksum_fail : 1,
  156. ip_chksum_fail : 1,
  157. sa_idx_invalid : 1,
  158. da_idx_invalid : 1,
  159. amsdu_addr_mismatch : 1,
  160. rx_in_tx_decrypt_byp : 1,
  161. encrypt_required : 1,
  162. directed : 1,
  163. buffer_fragment : 1,
  164. mpdu_length_err : 1,
  165. tkip_mic_err : 1,
  166. decrypt_err : 1,
  167. unencrypted_frame_err : 1,
  168. fcs_err : 1;
  169. uint32_t reserved_17a : 10,
  170. decrypt_status_code : 3,
  171. rx_bitmap_not_updated : 1,
  172. reserved_17b : 17,
  173. msdu_done : 1;
  174. };
  175. struct rx_mpdu_start_compact {
  176. uint32_t rx_reo_queue_desc_addr_39_32 : 8,
  177. receive_queue_number : 16,
  178. pre_delim_err_warning : 1,
  179. first_delim_err : 1,
  180. reserved_0 : 6;
  181. uint32_t pn_31_0 : 32;
  182. uint32_t pn_63_32 : 32;
  183. uint32_t pn_95_64 : 32;
  184. uint32_t ast_index : 16,
  185. sw_peer_id : 16;
  186. uint32_t mpdu_frame_control_valid : 1,
  187. mpdu_duration_valid : 1,
  188. mac_addr_ad1_valid : 1,
  189. mac_addr_ad2_valid : 1,
  190. mac_addr_ad3_valid : 1,
  191. mac_addr_ad4_valid : 1,
  192. mpdu_sequence_control_valid : 1,
  193. mpdu_qos_control_valid : 1,
  194. mpdu_ht_control_valid : 1,
  195. frame_encryption_info_valid : 1,
  196. mpdu_fragment_number : 4,
  197. more_fragment_flag : 1,
  198. reserved_7a : 1,
  199. fr_ds : 1,
  200. to_ds : 1,
  201. encrypted : 1,
  202. mpdu_retry : 1,
  203. mpdu_sequence_number : 12;
  204. uint32_t mpdu_frame_control_field : 16,
  205. mpdu_duration_field : 16;
  206. uint32_t mac_addr_ad1_31_0 : 32;
  207. uint32_t mac_addr_ad1_47_32 : 16,
  208. mac_addr_ad2_15_0 : 16;
  209. uint32_t mac_addr_ad2_47_16 : 32;
  210. uint32_t mac_addr_ad3_31_0 : 32;
  211. uint32_t mac_addr_ad3_47_32 : 16,
  212. mpdu_sequence_control_field : 16;
  213. };
  214. #else
  215. struct rx_msdu_end_compact {
  216. uint32_t ip_chksum_fail_copy : 1,
  217. fr_ds : 1,
  218. last_msdu : 1,
  219. first_msdu : 1,
  220. l3_header_padding : 2,
  221. da_is_mcbc : 1,
  222. da_is_valid : 1,
  223. sa_is_valid : 1,
  224. tid : 4,
  225. to_ds : 1,
  226. da_idx_timeout : 1,
  227. sa_idx_timeout : 1,
  228. sa_sw_peer_id : 16;
  229. uint32_t da_idx_or_sw_peer_id : 16,
  230. sa_idx : 16;
  231. uint32_t fragment_flag : 1,
  232. vlan_stag_stripped : 1,
  233. vlan_ctag_stripped : 1,
  234. mesh_sta : 2,
  235. use_ppe : 1,
  236. flow_idx : 20,
  237. reo_destination_indication : 5,
  238. msdu_drop : 1;
  239. uint32_t fse_metadata : 32;
  240. uint32_t tcp_udp_chksum : 16,
  241. cce_metadata : 16;
  242. uint32_t cumulative_ip_length : 16,
  243. amsdu_parser_error : 1,
  244. cce_match : 1,
  245. flow_idx_invalid : 1,
  246. flow_idx_timeout : 1,
  247. msdu_limit_error : 1,
  248. tcp_udp_chksum_fail_copy : 1,
  249. fisa_timeout : 1,
  250. flow_aggregation_continuation : 1,
  251. aggregation_count : 8;
  252. uint32_t reserved_8a : 24,
  253. key_id_octet : 8;
  254. uint32_t reserved_9b : 8,
  255. dest_chip_pmac_id : 1,
  256. wds_keep_alive_event : 1,
  257. wds_roaming_event : 1,
  258. wds_learning_event : 1,
  259. multicast_echo : 1,
  260. dest_chip_id : 2,
  261. intra_bss : 1,
  262. priority_valid : 1,
  263. service_code : 9,
  264. reserved_9a : 6;
  265. uint32_t l4_offset : 8,
  266. ipsec_ah : 1,
  267. l3_offset : 7,
  268. ipsec_esp : 1,
  269. stbc : 1,
  270. msdu_length : 14;
  271. uint32_t ip4_protocol_ip6_next_header : 8,
  272. ldpc : 1,
  273. mesh_control_present : 1,
  274. tcp_udp_header_valid : 1,
  275. ip_extn_header_valid : 1,
  276. ip_fixed_header_valid : 1,
  277. toeplitz_hash_sel : 2,
  278. da_is_bcast_mcast : 1,
  279. tcp_only_ack : 1,
  280. ip_frag : 1,
  281. udp_proto : 1,
  282. tcp_proto : 1,
  283. ipv6_proto : 1,
  284. ipv4_proto : 1,
  285. decap_format : 2,
  286. msdu_number : 8;
  287. uint32_t vlan_stag_ci : 16,
  288. vlan_ctag_ci : 16;
  289. uint32_t peer_meta_data : 32;
  290. uint32_t msdu_done_copy : 1,
  291. mimo_ss_bitmap : 7,
  292. reception_type : 3,
  293. receive_bandwidth : 3,
  294. rate_mcs : 4,
  295. sgi : 2,
  296. pkt_type : 4,
  297. user_rssi : 8;
  298. uint32_t flow_id_toeplitz : 32;
  299. uint32_t ppdu_start_timestamp_63_32;
  300. uint32_t sw_phy_meta_data : 32;
  301. uint32_t fcs_err : 1,
  302. unencrypted_frame_err : 1,
  303. decrypt_err : 1,
  304. tkip_mic_err : 1,
  305. mpdu_length_err : 1,
  306. buffer_fragment : 1,
  307. directed : 1,
  308. encrypt_required : 1,
  309. rx_in_tx_decrypt_byp : 1,
  310. amsdu_addr_mismatch : 1,
  311. da_idx_invalid : 1,
  312. sa_idx_invalid : 1,
  313. ip_chksum_fail : 1,
  314. tcp_udp_chksum_fail : 1,
  315. msdu_length_err : 1,
  316. overflow_err : 1,
  317. wifi_parser_error : 1,
  318. order : 1,
  319. reserved_16b : 1,
  320. a_msdu_error : 1,
  321. eosp : 1,
  322. more_data : 1,
  323. ctrl_type : 1,
  324. mgmt_type : 1,
  325. null_data : 1,
  326. non_qos : 1,
  327. power_mgmt : 1,
  328. ast_index_timeout : 1,
  329. ast_index_not_found : 1,
  330. mcast_bcast : 1,
  331. reserved_16a : 1,
  332. first_mpdu : 1;
  333. uint32_t msdu_done : 1,
  334. reserved_17b : 17,
  335. rx_bitmap_not_updated : 1,
  336. decrypt_status_code : 3,
  337. reserved_17a : 10;
  338. };
  339. struct rx_mpdu_start_compact {
  340. uint32_t reserved_0 : 6,
  341. first_delim_err : 1,
  342. pre_delim_err_warning : 1,
  343. receive_queue_number : 16,
  344. rx_reo_queue_desc_addr_39_32 : 8;
  345. uint32_t pn_31_0 : 32;
  346. uint32_t pn_63_32 : 32;
  347. uint32_t pn_95_64 : 32;
  348. uint32_t sw_peer_id : 16,
  349. ast_index : 16;
  350. uint32_t mpdu_sequence_number : 12,
  351. mpdu_retry : 1,
  352. encrypted : 1,
  353. to_ds : 1,
  354. fr_ds : 1,
  355. reserved_7a : 1,
  356. more_fragment_flag : 1,
  357. mpdu_fragment_number : 4,
  358. frame_encryption_info_valid : 1,
  359. mpdu_ht_control_valid : 1,
  360. mpdu_qos_control_valid : 1,
  361. mpdu_sequence_control_valid : 1,
  362. mac_addr_ad4_valid : 1,
  363. mac_addr_ad3_valid : 1,
  364. mac_addr_ad2_valid : 1,
  365. mac_addr_ad1_valid : 1,
  366. mpdu_duration_valid : 1,
  367. mpdu_frame_control_valid : 1;
  368. uint32_t mpdu_duration_field : 16,
  369. mpdu_frame_control_field : 16;
  370. uint32_t mac_addr_ad1_31_0 : 32;
  371. uint32_t mac_addr_ad2_15_0 : 16,
  372. mac_addr_ad1_47_32 : 16;
  373. uint32_t mac_addr_ad2_47_16 : 32;
  374. uint32_t mac_addr_ad3_31_0 : 32;
  375. uint32_t mpdu_sequence_control_field : 16,
  376. mac_addr_ad3_47_32 : 16;
  377. };
  378. #endif
  379. #define RX_BE_PADDING0_BYTES 4
  380. typedef struct rx_mpdu_start_compact hal_rx_mpdu_start_t;
  381. typedef struct rx_msdu_end_compact hal_rx_msdu_end_t;
  382. struct rx_mpdu_start_tlv {
  383. hal_rx_mpdu_start_t rx_mpdu_start;
  384. };
  385. struct rx_msdu_end_tlv {
  386. TLV_TAG_T tag; /* TLV_TAG_T B */
  387. hal_rx_msdu_end_t rx_msdu_end;
  388. };
  389. struct rx_pkt_tlvs {
  390. struct rx_msdu_end_tlv msdu_end_tlv; /* 80 bytes */
  391. struct rx_mpdu_start_tlv mpdu_start_tlv; /* 48 bytes */
  392. #ifndef NO_RX_PKT_HDR_TLV
  393. struct rx_pkt_hdr_tlv pkt_hdr_tlv; /* 128 bytes */
  394. #endif
  395. };
  396. #define HAL_RX_MSDU_END(_rx_pkt_tlv) \
  397. (((struct rx_pkt_tlvs *)_rx_pkt_tlv)->msdu_end_tlv.rx_msdu_end)
  398. #define HAL_RX_MPDU_START(_rx_pkt_tlv) \
  399. (((struct rx_pkt_tlvs *)_rx_pkt_tlv)->mpdu_start_tlv. \
  400. rx_mpdu_start)
  401. #define HAL_RX_TLV_TID_GET(_rx_pkt_tlv) \
  402. HAL_RX_MSDU_END(_rx_pkt_tlv).tid
  403. #define HAL_RX_TLV_FIRST_MPDU_GET(_rx_pkt_tlv) \
  404. HAL_RX_MSDU_END(_rx_pkt_tlv).first_mpdu
  405. #else /* CONFIG_WORD_BASED_TLV */
  406. typedef struct rx_mpdu_start hal_rx_mpdu_start_t;
  407. typedef struct rx_msdu_end hal_rx_msdu_end_t;
  408. #define RX_BE_PADDING0_BYTES 8
  409. /*
  410. * Each RX descriptor TLV is preceded by sizeof TLV_TAG_T "tag"
  411. */
  412. #ifndef CONFIG_NO_TLV_TAGS
  413. struct rx_mpdu_start_tlv {
  414. TLV_TAG_T tag;
  415. hal_rx_mpdu_start_t rx_mpdu_start;
  416. };
  417. struct rx_msdu_end_tlv {
  418. TLV_TAG_T tag;
  419. hal_rx_msdu_end_t rx_msdu_end;
  420. };
  421. struct rx_pkt_tlvs {
  422. struct rx_msdu_end_tlv msdu_end_tlv; /* 128 + TLV_TAG_T bytes */
  423. uint8_t rx_padding0[RX_BE_PADDING0_BYTES];/* 8 bytes */
  424. struct rx_mpdu_start_tlv mpdu_start_tlv;/* 120 + TLV_TAG_T bytes */
  425. #ifndef NO_RX_PKT_HDR_TLV
  426. struct rx_pkt_hdr_tlv pkt_hdr_tlv; /* 128 bytes */
  427. #endif
  428. };
  429. #else
  430. struct rx_mpdu_start_tlv {
  431. hal_rx_mpdu_start_t rx_mpdu_start;
  432. };
  433. struct rx_msdu_end_tlv {
  434. hal_rx_msdu_end_t rx_msdu_end;
  435. };
  436. struct rx_pkt_tlvs {
  437. struct rx_msdu_end_tlv msdu_end_tlv; /* 128 bytes */
  438. struct rx_mpdu_start_tlv mpdu_start_tlv; /* 120 bytes */
  439. uint8_t rx_padding0[RX_BE_PADDING0_BYTES]; /* 8 bytes */
  440. #ifndef NO_RX_PKT_HDR_TLV
  441. struct rx_pkt_hdr_tlv pkt_hdr_tlv; /* 128 bytes */
  442. #endif
  443. };
  444. #endif /*CONFIG_NO_TLV_TAGS */
  445. #define HAL_RX_MSDU_END(_rx_pkt_tlv) \
  446. (((struct rx_pkt_tlvs *)_rx_pkt_tlv)->msdu_end_tlv.rx_msdu_end)
  447. #define HAL_RX_MPDU_START(_rx_pkt_tlv) \
  448. (((struct rx_pkt_tlvs *)_rx_pkt_tlv)->mpdu_start_tlv. \
  449. rx_mpdu_start.rx_mpdu_info_details)
  450. #define HAL_RX_REO_QUEUE_DESC_ADDR_31_0_GET(_rx_pkt_tlv) \
  451. HAL_RX_MPDU_START(_rx_pkt_tlv).rx_reo_queue_desc_addr_31_0
  452. #define HAL_RX_TLV_AMPDU_FLAG_GET(_rx_pkt_tlv) \
  453. HAL_RX_MPDU_START(_rx_pkt_tlv).ampdu_flag
  454. #define HAL_RX_TLV_MPDU_PN_127_96_GET(_rx_pkt_tlv) \
  455. HAL_RX_MPDU_START(_rx_pkt_tlv).pn_127_96
  456. #define HAL_RX_TLV_TID_GET(_rx_pkt_tlv) \
  457. HAL_RX_MPDU_START(_rx_pkt_tlv).tid
  458. #define HAL_RX_TLV_FIRST_MPDU_GET(_rx_pkt_tlv) \
  459. HAL_RX_MPDU_START(_rx_pkt_tlv).first_mpdu
  460. #define HAL_RX_TLV_L3_TYPE_GET(_rx_pkt_tlv) \
  461. HAL_RX_MSDU_END(_rx_pkt_tlv).l3_type
  462. #define HAL_RX_GET_PPDU_ID(_rx_pkt_tlv) \
  463. HAL_RX_MPDU_START(_rx_pkt_tlv).phy_ppdu_id
  464. #define HAL_RX_TLV_PHY_PPDU_ID_GET(_rx_pkt_tlv) \
  465. HAL_RX_MSDU_END(_rx_pkt_tlv).phy_ppdu_id
  466. #define HAL_RX_GET_FILTER_CATEGORY(_rx_pkt_tlv) \
  467. HAL_RX_MPDU_START(_rx_pkt_tlv).rxpcu_mpdu_filter_in_category
  468. #define HAL_RX_TLV_SW_FRAME_GROUP_ID_GET(_rx_pkt_tlv) \
  469. HAL_RX_MPDU_START(_rx_pkt_tlv).sw_frame_group_id
  470. #endif /* CONFIG_WORD_BASED_TLV */
  471. #ifndef NO_RX_PKT_HDR_TLV
  472. #define HAL_RX_PKT_HDR_TLV(_rx_pkt_tlv) \
  473. (((struct rx_pkt_tlvs *)_rx_pkt_tlv)->pkt_hdr_tlv)
  474. #define HAL_RX_PKT_HDR_TLV_PHY_PPDU_ID_GET(_rx_pkt_tlv) \
  475. HAL_RX_PKT_HDR_TLV(_rx_pkt_tlv).phy_ppdu_id
  476. #endif
  477. /**
  478. * struct rx_mon_pkt_tlvs - RX packet data structure for DEST ring in the
  479. * monitor mode.
  480. * @msdu_end_tlv: MSDU end TLV
  481. * @rx_padding0: Padding bytes
  482. * @mpdu_start_tlv: MPDU start TLV
  483. * @pkt_hdr_tlv: 802.11 packet header TLV
  484. */
  485. struct rx_mon_pkt_tlvs {
  486. struct rx_msdu_end_tlv msdu_end_tlv; /* 128B + sizeof(tag) */
  487. uint8_t rx_padding0[RX_BE_PADDING0_BYTES]; /* 8B */
  488. struct rx_mpdu_start_tlv mpdu_start_tlv; /* 120B + sizeof(tag) */
  489. struct rx_pkt_hdr_tlv pkt_hdr_tlv; /* 120B + sizeof(tag) */
  490. };
  491. #define SIZE_OF_DATA_RX_TLV sizeof(struct rx_pkt_tlvs)
  492. #define SIZE_OF_MON_DATA_RX_TLV sizeof(struct rx_mon_pkt_tlvs)
  493. #define RX_PKT_TLVS_LEN SIZE_OF_DATA_RX_TLV
  494. #define MON_RX_PKT_TLVS_LEN SIZE_OF_MON_DATA_RX_TLV
  495. #define RX_PKT_TLV_OFFSET(field) qdf_offsetof(struct rx_pkt_tlvs, field)
  496. #define HAL_RX_TLV_MSDU_DONE_GET(_rx_pkt_tlv) \
  497. HAL_RX_MSDU_END(_rx_pkt_tlv).msdu_done
  498. #define HAL_RX_TLV_DECAP_FORMAT_GET(_rx_pkt_tlv) \
  499. HAL_RX_MSDU_END(_rx_pkt_tlv).decap_format
  500. #ifdef RECEIVE_OFFLOAD
  501. #define HAL_RX_TLV_GET_TCP_PURE_ACK(_rx_pkt_tlv) \
  502. HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_only_ack
  503. #define HAL_RX_TLV_GET_TCP_PROTO(_rx_pkt_tlv) \
  504. HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_proto
  505. #define HAL_RX_TLV_GET_UDP_PROTO(_rx_pkt_tlv) \
  506. HAL_RX_MSDU_END(_rx_pkt_tlv).udp_proto
  507. #define HAL_RX_TLV_GET_IPV6(_rx_pkt_tlv) \
  508. HAL_RX_MSDU_END(_rx_pkt_tlv).ipv6_proto
  509. #define HAL_RX_TLV_GET_IP_OFFSET(_rx_pkt_tlv) \
  510. HAL_RX_MSDU_END(_rx_pkt_tlv).l3_offset
  511. #define HAL_RX_TLV_GET_TCP_OFFSET(_rx_pkt_tlv) \
  512. HAL_RX_MSDU_END(_rx_pkt_tlv).l4_offset
  513. #endif /* RECEIVE_OFFLOAD */
  514. #define HAL_RX_TLV_GET_FLOW_ID_TOEPLITZ(_rx_pkt_tlv) \
  515. HAL_RX_MSDU_END(_rx_pkt_tlv).flow_id_toeplitz
  516. #define HAL_RX_TLV_MSDU_LEN_GET(_rx_pkt_tlv) \
  517. HAL_RX_MSDU_END(_rx_pkt_tlv).msdu_length
  518. #define HAL_RX_TLV_CCE_MATCH_GET(_rx_pkt_tlv) \
  519. HAL_RX_MSDU_END(_rx_pkt_tlv).cce_match
  520. #define HAL_RX_TLV_BW_GET(_rx_pkt_tlv) \
  521. HAL_RX_MSDU_END(_rx_pkt_tlv).receive_bandwidth
  522. #define HAL_RX_TLV_FLOWID_TOEPLITZ_GET(_rx_pkt_tlv) \
  523. HAL_RX_MSDU_END(_rx_pkt_tlv).flow_id_toeplitz
  524. #define HAL_RX_TLV_SGI_GET(_rx_pkt_tlv) \
  525. HAL_RX_MSDU_END(_rx_pkt_tlv).sgi
  526. #define HAL_RX_TLV_RATE_MCS_GET(_rx_pkt_tlv) \
  527. HAL_RX_MSDU_END(_rx_pkt_tlv).rate_mcs
  528. #define HAL_RX_TLV_DECRYPT_STATUS_GET(_rx_pkt_tlv) \
  529. HAL_RX_MSDU_END(_rx_pkt_tlv).decrypt_status_code
  530. #define HAL_RX_TLV_RSSI_GET(_rx_pkt_tlv) \
  531. HAL_RX_MSDU_END(_rx_pkt_tlv).user_rssi
  532. #define HAL_RX_TLV_FREQ_GET(_rx_pkt_tlv) \
  533. HAL_RX_MSDU_END(_rx_pkt_tlv).sw_phy_meta_data
  534. #define HAL_RX_TLV_PKT_TYPE_GET(_rx_pkt_tlv) \
  535. HAL_RX_MSDU_END(_rx_pkt_tlv).pkt_type
  536. #define HAL_RX_TLV_DECRYPT_ERR_GET(_rx_pkt_tlv) \
  537. HAL_RX_MSDU_END(_rx_pkt_tlv).decrypt_err
  538. #define HAL_RX_TLV_MIC_ERR_GET(_rx_pkt_tlv) \
  539. HAL_RX_MSDU_END(_rx_pkt_tlv).tkip_mic_err
  540. #define HAL_RX_TLV_MIMO_SS_BITMAP(_rx_pkt_tlv)\
  541. HAL_RX_MSDU_END(_rx_pkt_tlv).mimo_ss_bitmap
  542. #define HAL_RX_TLV_ANT_SIGNAL_DB_GET(_rx_pkt_tlv) \
  543. HAL_RX_MSDU_END(_rx_pkt_tlv).user_rssi
  544. #define HAL_RX_TLV_STBC_GET(_rx_pkt_tlv) \
  545. HAL_RX_MSDU_END(_rx_pkt_tlv).stbc
  546. #define HAL_RX_TLV_RECEPTION_TYPE_GET(_rx_pkt_tlv) \
  547. HAL_RX_MSDU_END(_rx_pkt_tlv).reception_type
  548. #define HAL_RX_TLV_IP_CSUM_FAIL_GET(_rx_pkt_tlv) \
  549. HAL_RX_MSDU_END(_rx_pkt_tlv).ip_chksum_fail
  550. #define HAL_RX_TLV_TCP_UDP_CSUM_FAIL_GET(_rx_pkt_tlv) \
  551. HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_udp_chksum_fail
  552. #define HAL_RX_TLV_MPDU_LEN_ERR_GET(_rx_pkt_tlv) \
  553. HAL_RX_MSDU_END(_rx_pkt_tlv).mpdu_length_err
  554. #define HAL_RX_TLV_MPDU_FCS_ERR_GET(_rx_pkt_tlv) \
  555. HAL_RX_MSDU_END(_rx_pkt_tlv).fcs_err
  556. #define HAL_RX_TLV_IS_MCAST_GET(_rx_pkt_tlv) \
  557. HAL_RX_MSDU_END(_rx_pkt_tlv).mcast_bcast
  558. #ifdef RECEIVE_OFFLOAD
  559. /*
  560. * LRO information needed from the TLVs
  561. */
  562. #define HAL_RX_TLV_GET_LRO_ELIGIBLE(_rx_pkt_tlv) \
  563. HAL_RX_MSDU_END(_rx_pkt_tlv).lro_eligible
  564. #define HAL_RX_TLV_GET_TCP_ACK(_rx_pkt_tlv) \
  565. HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_ack_number
  566. #define HAL_RX_TLV_GET_TCP_SEQ(_rx_pkt_tlv) \
  567. HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_seq_number
  568. #define HAL_RX_TLV_GET_TCP_WIN(_rx_pkt_tlv) \
  569. HAL_RX_MSDU_END(_rx_pkt_tlv).window_size
  570. #endif
  571. #define HAL_RX_TLV_L3_TYPE_GET(_rx_pkt_tlv) \
  572. HAL_RX_MSDU_END(_rx_pkt_tlv).l3_type
  573. #ifdef RX_MSDU_END_PEER_META_DATA_OFFSET
  574. #define HAL_RX_TLV_MSDU_PEER_META_DATA_GET(_rx_pkt_tlv) \
  575. HAL_RX_MSDU_END(_rx_pkt_tlv).peer_meta_data
  576. #endif
  577. #define HAL_RX_TLV_PEER_META_DATA_GET(_rx_pkt_tlv) \
  578. HAL_RX_MPDU_START(_rx_pkt_tlv).peer_meta_data
  579. #define HAL_RX_TLV_KEYID_OCTET_GET(_rx_pkt_tlv) \
  580. HAL_RX_MSDU_END(_rx_pkt_tlv).key_id_octet
  581. #define HAL_RX_MPDU_SEQUENCE_NUMBER_GET(_rx_pkt_tlv) \
  582. HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_sequence_number
  583. #define HAL_RX_TLV_SA_SW_PEER_ID_GET(_rx_pkt_tlv) \
  584. HAL_RX_MSDU_END(_rx_pkt_tlv).sa_sw_peer_id
  585. #define HAL_RX_TLV_L3_HEADER_PADDING_GET(_rx_pkt_tlv) \
  586. HAL_RX_MSDU_END(_rx_pkt_tlv).l3_header_padding
  587. #define HAL_RX_TLV_SA_IDX_GET(_rx_pkt_tlv) \
  588. HAL_RX_MSDU_END(_rx_pkt_tlv).sa_idx
  589. #define HAL_RX_TLV_DA_IDX_GET(_rx_pkt_tlv) \
  590. HAL_RX_MSDU_END(_rx_pkt_tlv).da_idx_or_sw_peer_id
  591. #define HAL_RX_TLV_FIRST_MSDU_GET(_rx_pkt_tlv) \
  592. HAL_RX_MSDU_END(_rx_pkt_tlv).first_msdu
  593. #define HAL_RX_TLV_LAST_MSDU_GET(_rx_pkt_tlv) \
  594. HAL_RX_MSDU_END(_rx_pkt_tlv).last_msdu
  595. #define HAL_RX_TLV_DA_IS_MCBC_GET(_rx_pkt_tlv) \
  596. HAL_RX_MSDU_END(_rx_pkt_tlv).da_is_mcbc
  597. #define HAL_RX_TLV_IS_TKIP_MIC_ERR_GET(_rx_pkt_tlv) \
  598. HAL_RX_MSDU_END(_rx_pkt_tlv).tkip_mic_err
  599. #define HAL_RX_TLV_SA_IS_VALID_GET(_rx_pkt_tlv) \
  600. HAL_RX_MSDU_END(_rx_pkt_tlv).sa_is_valid
  601. #define HAL_RX_TLV_MPDU_ENCRYPTION_INFO_VALID(_rx_pkt_tlv) \
  602. HAL_RX_MPDU_START(_rx_pkt_tlv).frame_encryption_info_valid
  603. #define HAL_RX_TLV_MPDU_PN_31_0_GET(_rx_pkt_tlv) \
  604. HAL_RX_MPDU_START(_rx_pkt_tlv).pn_31_0
  605. #define HAL_RX_TLV_MPDU_PN_63_32_GET(_rx_pkt_tlv) \
  606. HAL_RX_MPDU_START(_rx_pkt_tlv).pn_63_32
  607. #define HAL_RX_TLV_MPDU_PN_95_64_GET(_rx_pkt_tlv) \
  608. HAL_RX_MPDU_START(_rx_pkt_tlv).pn_95_64
  609. #define HAL_RX_TLV_DA_IS_VALID_GET(_rx_pkt_tlv) \
  610. HAL_RX_MSDU_END(_rx_pkt_tlv).da_is_valid
  611. #define HAL_RX_TLV_MPDU_MAC_ADDR_AD4_VALID_GET(_rx_pkt_tlv) \
  612. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad4_valid
  613. #define HAL_RX_TLV_SW_PEER_ID_GET(_rx_pkt_tlv) \
  614. HAL_RX_MPDU_START(_rx_pkt_tlv).sw_peer_id
  615. #define HAL_RX_TLV_MPDU_GET_TODS(_rx_pkt_tlv) \
  616. HAL_RX_MPDU_START(_rx_pkt_tlv).to_ds
  617. #define HAL_RX_TLV_MPDU_GET_FROMDS(_rx_pkt_tlv) \
  618. HAL_RX_MPDU_START(_rx_pkt_tlv).fr_ds
  619. #define HAL_RX_TLV_MPDU_GET_FRAME_CONTROL_VALID(_rx_pkt_tlv) \
  620. HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_frame_control_valid
  621. #define HAL_RX_TLV_MPDU_MAC_ADDR_AD1_VALID_GET(_rx_pkt_tlv) \
  622. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad1_valid
  623. #define HAL_RX_TLV_MPDU_AD1_31_0_GET(_rx_pkt_tlv) \
  624. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad1_31_0
  625. #define HAL_RX_TLV_MPDU_AD1_47_32_GET(_rx_pkt_tlv) \
  626. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad1_47_32
  627. #define HAL_RX_TLV_MPDU_MAC_ADDR_AD2_VALID_GET(_rx_pkt_tlv) \
  628. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad2_valid
  629. #define HAL_RX_TLV_MPDU_AD2_15_0_GET(_rx_pkt_tlv) \
  630. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad2_15_0
  631. #define HAL_RX_TLV_MPDU_AD2_47_16_GET(_rx_pkt_tlv) \
  632. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad2_47_16
  633. #define HAL_RX_TLV_MPDU_MAC_ADDR_AD3_VALID_GET(_rx_pkt_tlv) \
  634. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad3_valid
  635. #define HAL_RX_TLV_MPDU_AD3_31_0_GET(_rx_pkt_tlv) \
  636. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad3_31_0
  637. #define HAL_RX_TLV_MPDU_AD3_47_32_GET(_rx_pkt_tlv) \
  638. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad3_47_32
  639. #define HAL_RX_TLV_MPDU_AD4_31_0_GET(_rx_pkt_tlv) \
  640. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad4_31_0
  641. #define HAL_RX_TLV_MPDU_AD4_47_32_GET(_rx_pkt_tlv) \
  642. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad4_47_32
  643. #define HAL_RX_TLV_MPDU_GET_SEQUENCE_CONTROL_VALID(_rx_pkt_tlv) \
  644. HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_sequence_control_valid
  645. #define HAL_RX_TLV_MPDU_QOS_CONTROL_VALID_GET(_rx_pkt_tlv) \
  646. HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_qos_control_valid
  647. #define HAL_RX_TLV_GET_FC_VALID(_rx_pkt_tlv) \
  648. HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_frame_control_valid
  649. #define HAL_RX_TLV_GET_TO_DS_FLAG(_rx_pkt_tlv) \
  650. HAL_RX_MPDU_START(_rx_pkt_tlv).to_ds
  651. #define HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(_rx_pkt_tlv) \
  652. HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_frame_control_field
  653. #define HAL_RX_TLV_FLOW_IDX_GET(_rx_pkt_tlv) \
  654. HAL_RX_MSDU_END(_rx_pkt_tlv).flow_idx
  655. #define HAL_RX_TLV_REO_DEST_IND_GET(_rx_pkt_tlv) \
  656. HAL_RX_MSDU_END(_rx_pkt_tlv).reo_destination_indication
  657. #define HAL_RX_TLV_FLOW_IDX_INVALID_GET(_rx_pkt_tlv) \
  658. HAL_RX_MSDU_END(_rx_pkt_tlv).flow_idx_invalid
  659. #define HAL_RX_TLV_FLOW_IDX_TIMEOUT_GET(_rx_pkt_tlv) \
  660. HAL_RX_MSDU_END(_rx_pkt_tlv).flow_idx_timeout
  661. #define HAL_RX_TLV_FSE_METADATA_GET(_rx_pkt_tlv) \
  662. HAL_RX_MSDU_END(_rx_pkt_tlv).fse_metadata
  663. #define HAL_RX_TLV_CCE_METADATA_GET(_rx_pkt_tlv) \
  664. HAL_RX_MSDU_END(_rx_pkt_tlv).cce_metadata
  665. #define HAL_RX_TLV_DECRYPT_STATUS_GET(_rx_pkt_tlv) \
  666. HAL_RX_MSDU_END(_rx_pkt_tlv).decrypt_status_code
  667. #define HAL_RX_TLV_GET_TCP_CHKSUM(_rx_pkt_tlv) \
  668. HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_udp_chksum
  669. #define HAL_RX_TLV_GET_FLOW_AGGR_CONT(_rx_pkt_tlv) \
  670. HAL_RX_MSDU_END(_rx_pkt_tlv).flow_aggregation_continuation
  671. #define HAL_RX_TLV_GET_FLOW_AGGR_COUNT(_rx_pkt_tlv) \
  672. HAL_RX_MSDU_END(_rx_pkt_tlv).aggregation_count
  673. #define HAL_RX_TLV_GET_FISA_TIMEOUT(_rx_pkt_tlv) \
  674. HAL_RX_MSDU_END(_rx_pkt_tlv).fisa_timeout
  675. #define HAL_RX_TLV_GET_FISA_CUMULATIVE_L4_CHECKSUM(_rx_pkt_tlv) \
  676. HAL_RX_MSDU_END(_rx_pkt_tlv).cumulative_l4_checksum
  677. #define HAL_RX_TLV_GET_FISA_CUMULATIVE_IP_LENGTH(_rx_pkt_tlv) \
  678. HAL_RX_MSDU_END(_rx_pkt_tlv).cumulative_ip_length
  679. #define HAL_RX_MPDU_INFO_QOS_CONTROL_VALID_GET(_rx_pkt_tlv) \
  680. HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_qos_control_valid
  681. #define HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(_rx_pkt_tlv) \
  682. HAL_RX_MSDU_END(_rx_pkt_tlv).sa_sw_peer_id
  683. #define HAL_RX_REO_QUEUE_DESC_ADDR_39_32_GET(_rx_pkt_tlv) \
  684. HAL_RX_MPDU_START(_rx_pkt_tlv).rx_reo_queue_desc_addr_39_32
  685. /* used by monitor mode for parsing from full TLV */
  686. #define HAL_RX_MON_GET_FC_VALID(_rx_mpdu_start) \
  687. HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO, MPDU_FRAME_CONTROL_VALID)
  688. #define HAL_RX_MON_GET_TO_DS_FLAG(_rx_mpdu_start) \
  689. HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO, TO_DS)
  690. #define HAL_RX_MON_GET_MAC_ADDR2_VALID(_rx_mpdu_start) \
  691. HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO, MAC_ADDR_AD2_VALID)
  692. static inline
  693. uint32_t hal_rx_tlv_decap_format_get_be(void *hw_desc_addr)
  694. {
  695. struct rx_pkt_tlvs *rx_pkt_tlvs =
  696. (struct rx_pkt_tlvs *)hw_desc_addr;
  697. return HAL_RX_TLV_DECAP_FORMAT_GET(rx_pkt_tlvs);
  698. }
  699. static inline uint32_t hal_rx_tlv_msdu_done_get_be(uint8_t *buf)
  700. {
  701. return HAL_RX_TLV_MSDU_DONE_GET(buf);
  702. }
  703. /**
  704. * hal_rx_tlv_first_mpdu_get_be() - get first_mpdu bit from rx attention
  705. * @buf: pointer to rx_pkt_tlvs
  706. *
  707. * Return: uint32_t(first_msdu)
  708. */
  709. static inline uint32_t hal_rx_tlv_first_mpdu_get_be(uint8_t *buf)
  710. {
  711. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  712. return HAL_RX_TLV_FIRST_MPDU_GET(rx_pkt_tlvs);
  713. }
  714. /**
  715. * hal_rx_msdu_cce_match_get_be() - get CCE match bit from rx attention
  716. * @buf: pointer to rx_pkt_tlvs
  717. *
  718. * Return: CCE match value
  719. */
  720. static inline bool hal_rx_msdu_cce_match_get_be(uint8_t *buf)
  721. {
  722. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  723. return HAL_RX_TLV_CCE_MATCH_GET(rx_pkt_tlvs);
  724. }
  725. #ifdef RX_MSDU_END_PEER_META_DATA_OFFSET
  726. /*
  727. * Get peer_meta_data from RX_MSDU_END
  728. */
  729. static inline uint32_t hal_rx_msdu_peer_meta_data_get_be(uint8_t *buf)
  730. {
  731. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  732. return HAL_RX_TLV_MSDU_PEER_META_DATA_GET(rx_pkt_tlvs);
  733. }
  734. #endif
  735. /**
  736. * hal_rx_mpdu_get_addr1_be() - API to check get address1 of the mpdu
  737. * @buf: pointer to the start of RX PKT TLV headera
  738. * @mac_addr: pointer to mac address
  739. *
  740. * Return: success/failure
  741. */
  742. static inline QDF_STATUS hal_rx_mpdu_get_addr1_be(uint8_t *buf,
  743. uint8_t *mac_addr)
  744. {
  745. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  746. struct __attribute__((__packed__)) hal_addr1 {
  747. uint32_t ad1_31_0;
  748. uint16_t ad1_47_32;
  749. };
  750. struct hal_addr1 *addr = (struct hal_addr1 *)mac_addr;
  751. uint32_t mac_addr_ad1_valid;
  752. mac_addr_ad1_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD1_VALID_GET(
  753. rx_pkt_tlvs);
  754. if (mac_addr_ad1_valid) {
  755. addr->ad1_31_0 = HAL_RX_TLV_MPDU_AD1_31_0_GET(rx_pkt_tlvs);
  756. addr->ad1_47_32 = HAL_RX_TLV_MPDU_AD1_47_32_GET(rx_pkt_tlvs);
  757. return QDF_STATUS_SUCCESS;
  758. }
  759. return QDF_STATUS_E_FAILURE;
  760. }
  761. #ifndef CONFIG_WORD_BASED_TLV
  762. /**
  763. * hal_rx_mpdu_info_ampdu_flag_get_be() - get ampdu flag bit
  764. * from rx mpdu info
  765. * @buf: pointer to rx_pkt_tlvs
  766. *
  767. * Return: ampdu flag
  768. */
  769. static inline bool hal_rx_mpdu_info_ampdu_flag_get_be(uint8_t *buf)
  770. {
  771. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  772. return !!HAL_RX_TLV_AMPDU_FLAG_GET(rx_pkt_tlvs);
  773. }
  774. /**
  775. * hal_rx_get_qdesc_addr_be() - API to get qdesc address of reo
  776. * entrance ring desc
  777. *
  778. * @dst_ring_desc: reo dest ring descriptor (used for Lithium DP)
  779. * @buf: pointer to the start of RX PKT TLV headers
  780. * Return: qdesc address in reo destination ring buffer
  781. */
  782. static inline uint64_t hal_rx_get_qdesc_addr_be(uint8_t *dst_ring_desc,
  783. uint8_t *buf)
  784. {
  785. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  786. return (uint64_t)HAL_RX_REO_QUEUE_DESC_ADDR_31_0_GET(rx_pkt_tlvs);
  787. }
  788. /**
  789. * hal_rx_print_pn_be() - Prints the PN of rx packet.
  790. * @buf: rx_tlv_hdr of the received packet
  791. *
  792. * Return: void
  793. */
  794. static inline void hal_rx_print_pn_be(uint8_t *buf)
  795. {
  796. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  797. uint32_t pn_31_0 = HAL_RX_TLV_MPDU_PN_31_0_GET(rx_pkt_tlvs);
  798. uint32_t pn_63_32 = HAL_RX_TLV_MPDU_PN_63_32_GET(rx_pkt_tlvs);
  799. uint32_t pn_95_64 = HAL_RX_TLV_MPDU_PN_95_64_GET(rx_pkt_tlvs);
  800. uint32_t pn_127_96 = HAL_RX_TLV_MPDU_PN_127_96_GET(rx_pkt_tlvs);
  801. hal_debug("PN number pn_127_96 0x%x pn_95_64 0x%x pn_63_32 0x%x pn_31_0 0x%x",
  802. pn_127_96, pn_95_64, pn_63_32, pn_31_0);
  803. }
  804. static inline void hal_rx_tlv_get_pn_num_be(uint8_t *buf, uint64_t *pn_num)
  805. {
  806. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  807. pn_num[0] = HAL_RX_TLV_MPDU_PN_31_0_GET(pkt_tlvs);
  808. pn_num[0] |= ((uint64_t)HAL_RX_TLV_MPDU_PN_63_32_GET(pkt_tlvs) << 32);
  809. pn_num[1] = HAL_RX_TLV_MPDU_PN_95_64_GET(pkt_tlvs);
  810. pn_num[1] |= ((uint64_t)HAL_RX_TLV_MPDU_PN_127_96_GET(pkt_tlvs) << 32);
  811. }
  812. /**
  813. * hal_rx_mpdu_get_addr4_be() - API to get address4 of the mpdu
  814. * in the packet
  815. * @buf: pointer to the start of RX PKT TLV header
  816. * @mac_addr: pointer to mac address
  817. *
  818. * Return: success/failure
  819. */
  820. static inline QDF_STATUS hal_rx_mpdu_get_addr4_be(uint8_t *buf,
  821. uint8_t *mac_addr)
  822. {
  823. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  824. struct __attribute__((__packed__)) hal_addr4 {
  825. uint32_t ad4_31_0;
  826. uint16_t ad4_47_32;
  827. };
  828. struct hal_addr4 *addr = (struct hal_addr4 *)mac_addr;
  829. uint32_t mac_addr_ad4_valid;
  830. mac_addr_ad4_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD4_VALID_GET(pkt_tlvs);
  831. if (mac_addr_ad4_valid) {
  832. addr->ad4_31_0 = HAL_RX_TLV_MPDU_AD4_31_0_GET(pkt_tlvs);
  833. addr->ad4_47_32 = HAL_RX_TLV_MPDU_AD4_47_32_GET(pkt_tlvs);
  834. return QDF_STATUS_SUCCESS;
  835. }
  836. return QDF_STATUS_E_FAILURE;
  837. }
  838. /**
  839. * hal_rx_priv_info_set_in_tlv_be() - Save the private info to
  840. * the reserved bytes of rx_tlv_hdr
  841. * @buf: start of rx_tlv_hdr
  842. * @priv_data: hal_wbm_err_desc_info structure
  843. * @len: length of the private data
  844. * Return: void
  845. */
  846. static inline void hal_rx_priv_info_set_in_tlv_be(uint8_t *buf,
  847. uint8_t *priv_data,
  848. uint32_t len)
  849. {
  850. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  851. uint32_t copy_len = (len > RX_BE_PADDING0_BYTES) ?
  852. RX_BE_PADDING0_BYTES : len;
  853. qdf_mem_copy(pkt_tlvs->rx_padding0, priv_data, copy_len);
  854. }
  855. /**
  856. * hal_rx_priv_info_get_from_tlv_be() - retrieve the private data from
  857. * the reserved bytes of rx_tlv_hdr.
  858. * @buf: start of rx_tlv_hdr
  859. * @priv_data: Handle to get the private data, output parameter.
  860. * @len: length of the private data
  861. * Return: void
  862. */
  863. static inline void hal_rx_priv_info_get_from_tlv_be(uint8_t *buf,
  864. uint8_t *priv_data,
  865. uint32_t len)
  866. {
  867. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  868. uint32_t copy_len = (len > RX_BE_PADDING0_BYTES) ?
  869. RX_BE_PADDING0_BYTES : len;
  870. qdf_mem_copy(priv_data, pkt_tlvs->rx_padding0, copy_len);
  871. }
  872. /**
  873. * hal_rx_tlv_l3_type_get_be() - API to get the l3 type from
  874. * rx_msdu_start TLV
  875. * @buf: pointer to the start of RX PKT TLV headers
  876. *
  877. * Return: uint32_t(l3 type)
  878. */
  879. static inline uint32_t hal_rx_tlv_l3_type_get_be(uint8_t *buf)
  880. {
  881. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  882. return HAL_RX_TLV_L3_TYPE_GET(rx_pkt_tlvs);
  883. }
  884. /**
  885. * hal_rx_hw_desc_get_ppduid_get_be() - retrieve ppdu id
  886. * @rx_tlv_hdr: start address of rx_pkt_tlvs
  887. * @rxdma_dst_ring_desc: Rx HW descriptor
  888. *
  889. * Return: ppdu id
  890. */
  891. static inline uint32_t
  892. hal_rx_hw_desc_get_ppduid_get_be(void *rx_tlv_hdr, void *rxdma_dst_ring_desc)
  893. {
  894. struct rx_pkt_tlvs *rx_pkt_tlvs =
  895. (struct rx_pkt_tlvs *)rx_tlv_hdr;
  896. return HAL_RX_TLV_PHY_PPDU_ID_GET(rx_pkt_tlvs);
  897. }
  898. /**
  899. * hal_rx_tlv_phy_ppdu_id_get_be() - get phy_ppdu_id value
  900. * from rx attention
  901. * @buf: pointer to rx_pkt_tlvs
  902. *
  903. * Return: phy_ppdu_id
  904. */
  905. static inline uint16_t hal_rx_tlv_phy_ppdu_id_get_be(uint8_t *buf)
  906. {
  907. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  908. return HAL_RX_TLV_PHY_PPDU_ID_GET(rx_pkt_tlvs);
  909. }
  910. /**
  911. * hal_rx_attn_phy_ppdu_id_get_be() - get phy_ppdu_id value
  912. * from rx attention
  913. * @buf: pointer to rx_pkt_tlvs
  914. *
  915. * Return: phy_ppdu_id
  916. */
  917. static inline uint16_t hal_rx_attn_phy_ppdu_id_get_be(uint8_t *buf)
  918. {
  919. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  920. uint16_t phy_ppdu_id;
  921. phy_ppdu_id = HAL_RX_TLV_PHY_PPDU_ID_GET(rx_pkt_tlvs);
  922. return phy_ppdu_id;
  923. }
  924. static inline uint32_t
  925. hal_rx_get_ppdu_id_be(uint8_t *buf)
  926. {
  927. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  928. return HAL_RX_GET_PPDU_ID(rx_pkt_tlvs);
  929. }
  930. /**
  931. * hal_rx_mpdu_peer_meta_data_set_be() - set peer meta data in RX mpdu start tlv
  932. * @buf: rx_tlv_hdr of the received packet
  933. * @peer_mdata: peer meta data to be set.
  934. *
  935. * Return: void
  936. */
  937. static inline void
  938. hal_rx_mpdu_peer_meta_data_set_be(uint8_t *buf, uint32_t peer_mdata)
  939. {
  940. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  941. HAL_RX_TLV_PEER_META_DATA_GET(rx_pkt_tlvs) = peer_mdata;
  942. }
  943. /*
  944. * Get peer_meta_data from RX_MPDU_INFO within RX_MPDU_START
  945. */
  946. static inline uint32_t hal_rx_mpdu_peer_meta_data_get_be(uint8_t *buf)
  947. {
  948. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  949. return HAL_RX_TLV_PEER_META_DATA_GET(rx_pkt_tlvs);
  950. }
  951. static inline uint8_t hal_rx_get_filter_category_be(uint8_t *buf)
  952. {
  953. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  954. return HAL_RX_GET_FILTER_CATEGORY(rx_pkt_tlvs);
  955. }
  956. /**
  957. * hal_rx_is_unicast_be() - check packet is unicast frame or not.
  958. * @buf: pointer to rx pkt TLV.
  959. *
  960. * Return: true on unicast.
  961. */
  962. static inline bool hal_rx_is_unicast_be(uint8_t *buf)
  963. {
  964. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  965. uint32_t grp_id;
  966. grp_id = HAL_RX_TLV_SW_FRAME_GROUP_ID_GET(rx_pkt_tlvs);
  967. return (HAL_MPDU_SW_FRAME_GROUP_UNICAST_DATA == grp_id) ? true : false;
  968. }
  969. #else
  970. #define IS_ADDR_MULTICAST(_a) (*(_a) & 0x01)
  971. static inline bool hal_rx_is_unicast_be(uint8_t *buf)
  972. {
  973. uint8_t mac[QDF_MAC_ADDR_SIZE] = {0};
  974. hal_rx_mpdu_get_addr1_be(buf, &mac[0]);
  975. return !IS_ADDR_MULTICAST(mac);
  976. }
  977. /**
  978. * hal_rx_priv_info_set_in_tlv_be() - Save the private info to
  979. * the reserved bytes of rx_tlv_hdr
  980. * @buf: start of rx_tlv_hdr
  981. * @priv_data: hal_wbm_err_desc_info structure
  982. * @len: length of the private data
  983. *
  984. * Return: void
  985. */
  986. static inline void hal_rx_priv_info_set_in_tlv_be(uint8_t *buf,
  987. uint8_t *priv_data,
  988. uint32_t len)
  989. {
  990. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  991. uint32_t copy_len = (len > RX_BE_PADDING0_BYTES) ?
  992. RX_BE_PADDING0_BYTES : len;
  993. qdf_mem_copy(&(HAL_RX_MSDU_END(pkt_tlvs).ppdu_start_timestamp_63_32),
  994. priv_data, copy_len);
  995. }
  996. /**
  997. * hal_rx_priv_info_get_from_tlv_be() - retrieve the private data from
  998. * the reserved bytes of rx_tlv_hdr.
  999. * @buf: start of rx_tlv_hdr
  1000. * @priv_data: Handle to get the private data, output parameter.
  1001. * @len: length of the private data
  1002. *
  1003. * Return: void
  1004. */
  1005. static inline void hal_rx_priv_info_get_from_tlv_be(uint8_t *buf,
  1006. uint8_t *priv_data,
  1007. uint32_t len)
  1008. {
  1009. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1010. uint32_t copy_len = (len > RX_BE_PADDING0_BYTES) ?
  1011. RX_BE_PADDING0_BYTES : len;
  1012. qdf_mem_copy(priv_data,
  1013. &(HAL_RX_MSDU_END(pkt_tlvs).ppdu_start_timestamp_63_32),
  1014. copy_len);
  1015. }
  1016. /**
  1017. * hal_rx_print_pn_be() - Prints the PN of rx packet.
  1018. * @buf: rx_tlv_hdr of the received packet
  1019. *
  1020. * Return: void
  1021. */
  1022. static inline void hal_rx_print_pn_be(uint8_t *buf)
  1023. {
  1024. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1025. uint32_t pn_31_0 = HAL_RX_TLV_MPDU_PN_31_0_GET(rx_pkt_tlvs);
  1026. uint32_t pn_63_32 = HAL_RX_TLV_MPDU_PN_63_32_GET(rx_pkt_tlvs);
  1027. uint32_t pn_95_64 = HAL_RX_TLV_MPDU_PN_95_64_GET(rx_pkt_tlvs);
  1028. hal_debug("PN number pn_95_64 0x%x pn_63_32 0x%x pn_31_0 0x%x",
  1029. pn_95_64, pn_63_32, pn_31_0);
  1030. }
  1031. static inline void hal_rx_tlv_get_pn_num_be(uint8_t *buf, uint64_t *pn_num)
  1032. {
  1033. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1034. pn_num[0] = HAL_RX_TLV_MPDU_PN_31_0_GET(pkt_tlvs);
  1035. pn_num[0] |= ((uint64_t)HAL_RX_TLV_MPDU_PN_63_32_GET(pkt_tlvs) << 32);
  1036. pn_num[1] = HAL_RX_TLV_MPDU_PN_95_64_GET(pkt_tlvs);
  1037. }
  1038. #ifdef NO_RX_PKT_HDR_TLV
  1039. static inline uint32_t
  1040. hal_rx_get_ppdu_id_be(uint8_t *buf)
  1041. {
  1042. /* If CONFIG_WORD_BASED_TLV and NO_RX_PKT_HDR_TLV are enabled
  1043. * phy_ppdu_id is not available
  1044. */
  1045. hal_alert_rl("PPDU_ID is not subscribed check build flags");
  1046. return 0;
  1047. }
  1048. #else
  1049. static inline uint32_t
  1050. hal_rx_get_ppdu_id_be(uint8_t *buf)
  1051. {
  1052. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1053. return HAL_RX_PKT_HDR_TLV_PHY_PPDU_ID_GET(rx_pkt_tlvs);
  1054. }
  1055. #endif
  1056. #endif
  1057. /**
  1058. * hal_rx_tlv_msdu_len_get_be() - API to get the MSDU length from
  1059. * rx_msdu_start TLV
  1060. * @buf: pointer to the start of RX PKT TLV headers
  1061. *
  1062. * Return: msdu length
  1063. */
  1064. static inline uint32_t hal_rx_tlv_msdu_len_get_be(uint8_t *buf)
  1065. {
  1066. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1067. return HAL_RX_TLV_MSDU_LEN_GET(rx_pkt_tlvs);
  1068. }
  1069. /**
  1070. * hal_rx_tlv_msdu_len_set_be() - API to set the MSDU length from
  1071. * rx_msdu_start TLV
  1072. * @buf: pointer to the start of RX PKT TLV headers
  1073. * @len: msdu length
  1074. *
  1075. * Return: none
  1076. */
  1077. static inline void hal_rx_tlv_msdu_len_set_be(uint8_t *buf, uint32_t len)
  1078. {
  1079. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1080. HAL_RX_TLV_MSDU_LEN_GET(rx_pkt_tlvs) = len;
  1081. }
  1082. /**
  1083. * hal_rx_tlv_bw_get_be() - API to get the Bandwidth Interval from
  1084. * rx_msdu_start
  1085. * @buf: pointer to the start of RX PKT TLV header
  1086. *
  1087. * Return: uint32_t(bw)
  1088. */
  1089. static inline uint32_t hal_rx_tlv_bw_get_be(uint8_t *buf)
  1090. {
  1091. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1092. return HAL_RX_TLV_BW_GET(rx_pkt_tlvs);
  1093. }
  1094. /**
  1095. * hal_rx_tlv_toeplitz_get_be() - API to get the toeplitz hash from
  1096. * rx_msdu_start TLV
  1097. * @buf: pointer to the start of RX PKT TLV headers
  1098. *
  1099. * Return: toeplitz hash
  1100. */
  1101. static inline uint32_t hal_rx_tlv_toeplitz_get_be(uint8_t *buf)
  1102. {
  1103. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1104. return HAL_RX_TLV_FLOWID_TOEPLITZ_GET(rx_pkt_tlvs);
  1105. }
  1106. /**
  1107. * hal_rx_tlv_sgi_get_be() - API to get the Short Guard Interval from
  1108. * rx_msdu_start TLV
  1109. * @buf: pointer to the start of RX PKT TLV headers
  1110. *
  1111. * Return: uint32_t(sgi)
  1112. */
  1113. static inline uint32_t hal_rx_tlv_sgi_get_be(uint8_t *buf)
  1114. {
  1115. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1116. return HAL_RX_TLV_SGI_GET(rx_pkt_tlvs);
  1117. }
  1118. /**
  1119. * hal_rx_tlv_rate_mcs_get_be() - API to get the MCS rate from
  1120. * rx_msdu_start TLV
  1121. * @buf: pointer to the start of RX PKT TLV headers
  1122. *
  1123. * Return: uint32_t(rate_mcs)
  1124. */
  1125. static inline uint32_t hal_rx_tlv_rate_mcs_get_be(uint8_t *buf)
  1126. {
  1127. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1128. uint32_t rate_mcs;
  1129. rate_mcs = HAL_RX_TLV_RATE_MCS_GET(rx_pkt_tlvs);
  1130. return rate_mcs;
  1131. }
  1132. /**
  1133. * hal_rx_msdu_get_keyid_be() - API to get the key id of the decrypted packet
  1134. * from rx_msdu_end
  1135. * @buf: pointer to the start of RX PKT TLV header
  1136. *
  1137. * Return: uint32_t(key id)
  1138. */
  1139. static inline uint8_t hal_rx_msdu_get_keyid_be(uint8_t *buf)
  1140. {
  1141. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1142. uint32_t keyid_octet;
  1143. keyid_octet = HAL_RX_TLV_KEYID_OCTET_GET(rx_pkt_tlvs);
  1144. return keyid_octet & 0x3;
  1145. }
  1146. /**
  1147. * hal_rx_tlv_get_rssi_be() - API to get the rssi of received pkt from
  1148. * rx_msdu_start
  1149. * @buf: pointer to the start of RX PKT TLV header
  1150. *
  1151. * Return: uint32_t(rssi)
  1152. */
  1153. static inline uint32_t hal_rx_tlv_get_rssi_be(uint8_t *buf)
  1154. {
  1155. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1156. uint32_t rssi;
  1157. rssi = HAL_RX_TLV_RSSI_GET(rx_pkt_tlvs);
  1158. return rssi;
  1159. }
  1160. /**
  1161. * hal_rx_tlv_get_freq_be() - API to get the frequency of operating
  1162. * channel from rx_msdu_start
  1163. * @buf: pointer to the start of RX PKT TLV header
  1164. *
  1165. * Return: uint32_t(frequency)
  1166. */
  1167. static inline uint32_t hal_rx_tlv_get_freq_be(uint8_t *buf)
  1168. {
  1169. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1170. uint32_t freq;
  1171. freq = HAL_RX_TLV_FREQ_GET(rx_pkt_tlvs);
  1172. return freq;
  1173. }
  1174. /**
  1175. * hal_rx_tlv_get_pkt_type_be() - API to get the pkt type from
  1176. * rx_msdu_start
  1177. * @buf: pointer to the start of RX PKT TLV header
  1178. *
  1179. * Return: uint32_t(pkt type)
  1180. */
  1181. static inline uint32_t hal_rx_tlv_get_pkt_type_be(uint8_t *buf)
  1182. {
  1183. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1184. uint32_t pkt_type;
  1185. pkt_type = HAL_RX_TLV_PKT_TYPE_GET(rx_pkt_tlvs);
  1186. return pkt_type;
  1187. }
  1188. /*******************************************************************************
  1189. * RX ERROR APIS
  1190. ******************************************************************************/
  1191. /**
  1192. * hal_rx_tlv_decrypt_err_get_be() - API to get the Decrypt ERR from
  1193. * rx_mpdu_end TLV
  1194. * @buf: pointer to the start of RX PKT TLV headers
  1195. *
  1196. * Return: uint32_t(decrypt_err)
  1197. */
  1198. static inline uint32_t hal_rx_tlv_decrypt_err_get_be(uint8_t *buf)
  1199. {
  1200. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1201. uint32_t decrypt_err;
  1202. decrypt_err = HAL_RX_TLV_DECRYPT_ERR_GET(rx_pkt_tlvs);
  1203. return decrypt_err;
  1204. }
  1205. /**
  1206. * hal_rx_tlv_mic_err_get_be() - API to get the MIC ERR from rx_tlv TLV
  1207. * @buf: pointer to the start of RX PKT TLV headers
  1208. *
  1209. * Return: uint32_t(mic_err)
  1210. */
  1211. static inline uint32_t hal_rx_tlv_mic_err_get_be(uint8_t *buf)
  1212. {
  1213. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1214. uint32_t mic_err;
  1215. mic_err = HAL_RX_TLV_MIC_ERR_GET(rx_pkt_tlvs);
  1216. return mic_err;
  1217. }
  1218. /**
  1219. * hal_get_reo_ent_desc_qdesc_addr_be() - API to get qdesc address of
  1220. * reo entrance ring desc
  1221. * @desc: reo entrance ring descriptor
  1222. *
  1223. * Return: qdesc address
  1224. */
  1225. static inline uint8_t *hal_get_reo_ent_desc_qdesc_addr_be(uint8_t *desc)
  1226. {
  1227. return desc + REO_ENTRANCE_RING_RX_REO_QUEUE_DESC_ADDR_31_0_OFFSET;
  1228. }
  1229. /**
  1230. * hal_set_reo_ent_desc_reo_dest_ind_be() - API to set reo destination
  1231. * indication of reo entrance ring desc
  1232. * @desc: reo ent ring descriptor
  1233. * @dst_ind: reo destination indication value
  1234. *
  1235. * Return: None
  1236. */
  1237. static inline void
  1238. hal_set_reo_ent_desc_reo_dest_ind_be(uint8_t *desc, uint32_t dst_ind)
  1239. {
  1240. HAL_RX_FLD_SET(desc, REO_ENTRANCE_RING,
  1241. REO_DESTINATION_INDICATION, dst_ind);
  1242. }
  1243. /**
  1244. * hal_rx_mpdu_sequence_number_get_be() - Get mpdu sequence number
  1245. * @buf: pointer to packet buffer
  1246. *
  1247. * Return: mpdu sequence
  1248. */
  1249. static inline int hal_rx_mpdu_sequence_number_get_be(uint8_t *buf)
  1250. {
  1251. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1252. return HAL_RX_MPDU_SEQUENCE_NUMBER_GET(rx_pkt_tlvs);
  1253. }
  1254. /**
  1255. * hal_rx_msdu_packet_metadata_get_generic_be() - API to get the msdu
  1256. * information from
  1257. * rx_msdu_end TLV
  1258. * @buf: pointer to the start of RX PKT TLV headers
  1259. * @pkt_msdu_metadata: pointer to the msdu info structure
  1260. */
  1261. static inline void
  1262. hal_rx_msdu_packet_metadata_get_generic_be(uint8_t *buf,
  1263. void *pkt_msdu_metadata)
  1264. {
  1265. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1266. struct hal_rx_msdu_metadata *msdu_metadata =
  1267. (struct hal_rx_msdu_metadata *)pkt_msdu_metadata;
  1268. msdu_metadata->l3_hdr_pad =
  1269. HAL_RX_TLV_L3_HEADER_PADDING_GET(rx_pkt_tlvs);
  1270. msdu_metadata->sa_idx = HAL_RX_TLV_SA_IDX_GET(rx_pkt_tlvs);
  1271. msdu_metadata->da_idx = HAL_RX_TLV_DA_IDX_GET(rx_pkt_tlvs);
  1272. msdu_metadata->sa_sw_peer_id =
  1273. HAL_RX_TLV_SA_SW_PEER_ID_GET(rx_pkt_tlvs);
  1274. }
  1275. /**
  1276. * hal_rx_tlv_nss_get_be() - API to get the NSS Interval from
  1277. * rx_msdu_start
  1278. * @buf: pointer to the start of RX PKT TLV header
  1279. *
  1280. * Return: uint32_t(nss)
  1281. */
  1282. static inline uint32_t hal_rx_tlv_nss_get_be(uint8_t *buf)
  1283. {
  1284. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1285. uint8_t mimo_ss_bitmap;
  1286. mimo_ss_bitmap = HAL_RX_TLV_MIMO_SS_BITMAP(rx_pkt_tlvs);
  1287. return qdf_get_hweight8(mimo_ss_bitmap);
  1288. }
  1289. #ifdef GET_MSDU_AGGREGATION
  1290. #define HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs)\
  1291. {\
  1292. bool first_msdu, last_msdu; \
  1293. first_msdu = HAL_RX_TLV_FIRST_MSDU_GET(rx_desc);\
  1294. last_msdu = HAL_RX_TLV_LAST_MSDU_GET(rx_desc);\
  1295. if (first_msdu && last_msdu)\
  1296. rs->rs_flags &= (~IEEE80211_AMSDU_FLAG);\
  1297. else\
  1298. rs->rs_flags |= (IEEE80211_AMSDU_FLAG); \
  1299. } \
  1300. #define HAL_RX_SET_MSDU_AGGREGATION((rs_mpdu), (rs_ppdu))\
  1301. {\
  1302. if (rs_mpdu->rs_flags & IEEE80211_AMSDU_FLAG)\
  1303. rs_ppdu->rs_flags |= IEEE80211_AMSDU_FLAG;\
  1304. } \
  1305. #else
  1306. #define HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs)
  1307. #define HAL_RX_SET_MSDU_AGGREGATION(rs_mpdu, rs_ppdu)
  1308. #endif
  1309. /**
  1310. * hal_rx_mon_hw_desc_get_mpdu_status_be() - Retrieve MPDU status
  1311. * @hw_desc_addr: Start address of Rx HW TLVs
  1312. * @rs: Status for monitor mode
  1313. *
  1314. * Return: void
  1315. */
  1316. static inline void
  1317. hal_rx_mon_hw_desc_get_mpdu_status_be(void *hw_desc_addr,
  1318. struct mon_rx_status *rs)
  1319. {
  1320. uint32_t reg_value;
  1321. struct rx_pkt_tlvs *rx_desc =
  1322. (struct rx_pkt_tlvs *)hw_desc_addr;
  1323. const uint32_t sgi_hw_to_cdp[] = {
  1324. CDP_SGI_0_8_US,
  1325. CDP_SGI_0_4_US,
  1326. CDP_SGI_1_6_US,
  1327. CDP_SGI_3_2_US,
  1328. };
  1329. HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs);
  1330. rs->ant_signal_db = HAL_RX_TLV_ANT_SIGNAL_DB_GET(rx_desc);
  1331. rs->is_stbc = HAL_RX_TLV_STBC_GET(rx_desc);
  1332. reg_value = HAL_RX_TLV_SGI_GET(rx_desc);
  1333. rs->sgi = sgi_hw_to_cdp[reg_value];
  1334. reg_value = HAL_RX_TLV_RECEPTION_TYPE_GET(rx_desc);
  1335. rs->beamformed = (reg_value == HAL_RX_RECEPTION_TYPE_MU_MIMO) ? 1 : 0;
  1336. /* TODO: rs->beamformed should be set for SU beamforming also */
  1337. }
  1338. static inline uint32_t hal_rx_tlv_tid_get_be(uint8_t *buf)
  1339. {
  1340. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1341. uint32_t tid;
  1342. tid = HAL_RX_TLV_TID_GET(rx_pkt_tlvs);
  1343. return tid;
  1344. }
  1345. /**
  1346. * hal_rx_tlv_reception_type_get_be() - API to get the reception type
  1347. * Interval from rx_msdu_start
  1348. * @buf: pointer to the start of RX PKT TLV header
  1349. *
  1350. * Return: uint32_t(reception_type)
  1351. */
  1352. static inline
  1353. uint32_t hal_rx_tlv_reception_type_get_be(uint8_t *buf)
  1354. {
  1355. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1356. uint32_t reception_type;
  1357. reception_type = HAL_RX_TLV_RECEPTION_TYPE_GET(rx_pkt_tlvs);
  1358. return reception_type;
  1359. }
  1360. /**
  1361. * hal_rx_msdu_end_da_idx_get_be() - API to get da_idx from
  1362. * rx_msdu_end TLV
  1363. * @buf: pointer to the start of RX PKT TLV headers
  1364. *
  1365. * Return: da index
  1366. */
  1367. static inline uint16_t hal_rx_msdu_end_da_idx_get_be(uint8_t *buf)
  1368. {
  1369. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1370. uint16_t da_idx;
  1371. da_idx = HAL_RX_TLV_DA_IDX_GET(rx_pkt_tlvs);
  1372. return da_idx;
  1373. }
  1374. /**
  1375. * hal_rx_get_rx_fragment_number_be() - Function to retrieve rx fragment number
  1376. * @buf: Network buffer
  1377. *
  1378. * Return: rx fragment number
  1379. */
  1380. static inline
  1381. uint8_t hal_rx_get_rx_fragment_number_be(uint8_t *buf)
  1382. {
  1383. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1384. /* Return first 4 bits as fragment number */
  1385. return (HAL_RX_MPDU_SEQUENCE_NUMBER_GET(rx_pkt_tlvs) &
  1386. DOT11_SEQ_FRAG_MASK);
  1387. }
  1388. /**
  1389. * hal_rx_tlv_da_is_mcbc_get_be() - API to check if pkt is MCBC from
  1390. * rx_msdu_end TLV
  1391. * @buf: pointer to the start of RX PKT TLV headers
  1392. *
  1393. * Return: da_is_mcbc
  1394. */
  1395. static inline uint8_t
  1396. hal_rx_tlv_da_is_mcbc_get_be(uint8_t *buf)
  1397. {
  1398. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1399. return HAL_RX_TLV_DA_IS_MCBC_GET(rx_pkt_tlvs);
  1400. }
  1401. /**
  1402. * hal_rx_tlv_is_tkip_mic_err_get_be() - API to get tkip Mic error
  1403. * from rx_msdu_end TLV
  1404. * @buf: pointer to the start of RX PKT TLV headers
  1405. *
  1406. * Return: tkip_mic_err
  1407. */
  1408. static inline uint8_t
  1409. hal_rx_tlv_is_tkip_mic_err_get_be(uint8_t *buf)
  1410. {
  1411. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1412. return HAL_RX_TLV_IS_TKIP_MIC_ERR_GET(rx_pkt_tlvs);
  1413. }
  1414. /**
  1415. * hal_rx_tlv_sa_is_valid_get_be() - API to get the sa_is_valid bit from
  1416. * rx_msdu_end TLV
  1417. * @buf: pointer to the start of RX PKT TLV headers
  1418. *
  1419. * Return: sa_is_valid bit
  1420. */
  1421. static inline uint8_t
  1422. hal_rx_tlv_sa_is_valid_get_be(uint8_t *buf)
  1423. {
  1424. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1425. uint8_t sa_is_valid;
  1426. sa_is_valid = HAL_RX_TLV_SA_IS_VALID_GET(rx_pkt_tlvs);
  1427. return sa_is_valid;
  1428. }
  1429. /**
  1430. * hal_rx_tlv_sa_idx_get_be() - API to get the sa_idx from rx_msdu_end TLV
  1431. * @buf: pointer to the start of RX PKT TLV headers
  1432. *
  1433. * Return: sa_idx (SA AST index)
  1434. */
  1435. static inline
  1436. uint16_t hal_rx_tlv_sa_idx_get_be(uint8_t *buf)
  1437. {
  1438. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1439. uint16_t sa_idx;
  1440. sa_idx = HAL_RX_TLV_SA_IDX_GET(rx_pkt_tlvs);
  1441. return sa_idx;
  1442. }
  1443. /**
  1444. * hal_rx_desc_is_first_msdu_be() - Check if first msdu
  1445. * @hw_desc_addr: hardware descriptor address
  1446. *
  1447. * Return: 0 - success/ non-zero failure
  1448. */
  1449. static inline uint32_t hal_rx_desc_is_first_msdu_be(void *hw_desc_addr)
  1450. {
  1451. struct rx_pkt_tlvs *rx_pkt_tlvs =
  1452. (struct rx_pkt_tlvs *)hw_desc_addr;
  1453. return HAL_RX_TLV_FIRST_MSDU_GET(rx_pkt_tlvs);
  1454. }
  1455. /**
  1456. * hal_rx_tlv_l3_hdr_padding_get_be() - API to get the l3_header padding
  1457. * from rx_msdu_end TLV
  1458. * @buf: pointer to the start of RX PKT TLV headers
  1459. *
  1460. * Return: number of l3 header padding bytes
  1461. */
  1462. static inline uint32_t hal_rx_tlv_l3_hdr_padding_get_be(uint8_t *buf)
  1463. {
  1464. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1465. uint32_t l3_header_padding;
  1466. l3_header_padding = HAL_RX_TLV_L3_HEADER_PADDING_GET(rx_pkt_tlvs);
  1467. return l3_header_padding;
  1468. }
  1469. /**
  1470. * hal_rx_encryption_info_valid_be() - Returns encryption type.
  1471. * @buf: rx_tlv_hdr of the received packet
  1472. *
  1473. * Return: encryption type
  1474. */
  1475. static inline uint32_t hal_rx_encryption_info_valid_be(uint8_t *buf)
  1476. {
  1477. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1478. uint32_t encryption_info =
  1479. HAL_RX_TLV_MPDU_ENCRYPTION_INFO_VALID(rx_pkt_tlvs);
  1480. return encryption_info;
  1481. }
  1482. /**
  1483. * hal_rx_tlv_first_msdu_get_be() - API to get first msdu status from
  1484. * rx_msdu_end TLV
  1485. * @buf: pointer to the start of RX PKT TLV headers
  1486. *
  1487. * Return: first_msdu
  1488. */
  1489. static inline uint8_t hal_rx_tlv_first_msdu_get_be(uint8_t *buf)
  1490. {
  1491. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1492. uint8_t first_msdu;
  1493. first_msdu = HAL_RX_TLV_FIRST_MSDU_GET(rx_pkt_tlvs);
  1494. return first_msdu;
  1495. }
  1496. /**
  1497. * hal_rx_tlv_da_is_valid_get_be() - API to check if da is valid from
  1498. * rx_msdu_end TLV
  1499. * @buf: pointer to the start of RX PKT TLV headers
  1500. *
  1501. * Return: da_is_valid
  1502. */
  1503. static inline uint8_t hal_rx_tlv_da_is_valid_get_be(uint8_t *buf)
  1504. {
  1505. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1506. uint8_t da_is_valid;
  1507. da_is_valid = HAL_RX_TLV_DA_IS_VALID_GET(rx_pkt_tlvs);
  1508. return da_is_valid;
  1509. }
  1510. /**
  1511. * hal_rx_tlv_last_msdu_get_be() - API to get last msdu status from
  1512. * rx_msdu_end TLV
  1513. * @buf: pointer to the start of RX PKT TLV headers
  1514. *
  1515. * Return: last_msdu
  1516. */
  1517. static inline uint8_t hal_rx_tlv_last_msdu_get_be(uint8_t *buf)
  1518. {
  1519. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1520. uint8_t last_msdu;
  1521. last_msdu = HAL_RX_TLV_LAST_MSDU_GET(rx_pkt_tlvs);
  1522. return last_msdu;
  1523. }
  1524. /**
  1525. * hal_rx_get_mpdu_mac_ad4_valid_be() - Retrieves if mpdu 4th addr is valid
  1526. * @buf: Network buffer
  1527. *
  1528. * Return: value of mpdu 4th address valid field
  1529. */
  1530. static inline bool hal_rx_get_mpdu_mac_ad4_valid_be(uint8_t *buf)
  1531. {
  1532. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1533. bool ad4_valid = 0;
  1534. ad4_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD4_VALID_GET(rx_pkt_tlvs);
  1535. return ad4_valid;
  1536. }
  1537. /**
  1538. * hal_rx_mpdu_start_sw_peer_id_get_be() - Retrieve sw peer_id
  1539. * @buf: network buffer
  1540. *
  1541. * Return: sw peer_id
  1542. */
  1543. static inline uint32_t hal_rx_mpdu_start_sw_peer_id_get_be(uint8_t *buf)
  1544. {
  1545. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1546. return HAL_RX_TLV_SW_PEER_ID_GET(rx_pkt_tlvs);
  1547. }
  1548. /**
  1549. * hal_rx_mpdu_get_to_ds_be() - API to get the tods info
  1550. * from rx_mpdu_start
  1551. *
  1552. * @buf: pointer to the start of RX PKT TLV header
  1553. * Return: uint32_t(to_ds)
  1554. */
  1555. static inline uint32_t hal_rx_mpdu_get_to_ds_be(uint8_t *buf)
  1556. {
  1557. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1558. return HAL_RX_TLV_MPDU_GET_TODS(rx_pkt_tlvs);
  1559. }
  1560. /**
  1561. * hal_rx_mpdu_get_fr_ds_be() - API to get the from ds info
  1562. * from rx_mpdu_start
  1563. * @buf: pointer to the start of RX PKT TLV header
  1564. *
  1565. * Return: uint32_t(fr_ds)
  1566. */
  1567. static inline uint32_t hal_rx_mpdu_get_fr_ds_be(uint8_t *buf)
  1568. {
  1569. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1570. return HAL_RX_TLV_MPDU_GET_FROMDS(rx_pkt_tlvs);
  1571. }
  1572. /**
  1573. * hal_rx_get_mpdu_frame_control_valid_be() - Retrieves mpdu frame
  1574. * control valid
  1575. * @buf: Network buffer
  1576. *
  1577. * Return: value of frame control valid field
  1578. */
  1579. static inline uint8_t hal_rx_get_mpdu_frame_control_valid_be(uint8_t *buf)
  1580. {
  1581. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1582. return HAL_RX_TLV_MPDU_GET_FRAME_CONTROL_VALID(rx_pkt_tlvs);
  1583. }
  1584. /**
  1585. * hal_rx_phy_legacy_get_rssi_be() - API to get RSSI from TLV
  1586. * WIFIPHYRX_RSSI_LEGACY_E
  1587. * @buf: pointer to the start of WIFIPHYRX_RSSI_LEGACY_E TLV
  1588. *
  1589. * Return: value of RSSI
  1590. */
  1591. static inline int8_t hal_rx_phy_legacy_get_rssi_be(uint8_t *buf)
  1592. {
  1593. return HAL_RX_GET_64(buf, PHYRX_RSSI_LEGACY, RSSI_COMB);
  1594. }
  1595. /**
  1596. * hal_rx_mpdu_get_addr2_be() - API to check get address2 of the mpdu
  1597. * in the packet
  1598. * @buf: pointer to the start of RX PKT TLV header
  1599. * @mac_addr: pointer to mac address
  1600. *
  1601. * Return: success/failure
  1602. */
  1603. static inline QDF_STATUS hal_rx_mpdu_get_addr2_be(uint8_t *buf,
  1604. uint8_t *mac_addr)
  1605. {
  1606. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1607. struct __attribute__((__packed__)) hal_addr2 {
  1608. uint16_t ad2_15_0;
  1609. uint32_t ad2_47_16;
  1610. };
  1611. struct hal_addr2 *addr = (struct hal_addr2 *)mac_addr;
  1612. uint32_t mac_addr_ad2_valid;
  1613. mac_addr_ad2_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD2_VALID_GET(rx_pkt_tlvs);
  1614. if (mac_addr_ad2_valid) {
  1615. addr->ad2_15_0 = HAL_RX_TLV_MPDU_AD2_15_0_GET(rx_pkt_tlvs);
  1616. addr->ad2_47_16 = HAL_RX_TLV_MPDU_AD2_47_16_GET(rx_pkt_tlvs);
  1617. return QDF_STATUS_SUCCESS;
  1618. }
  1619. return QDF_STATUS_E_FAILURE;
  1620. }
  1621. /**
  1622. * hal_rx_mpdu_get_addr3_be() - API to get address3 of the mpdu in the
  1623. * packet
  1624. * @buf: pointer to the start of RX PKT TLV header
  1625. * @mac_addr: pointer to mac address
  1626. *
  1627. * Return: success/failure
  1628. */
  1629. static inline QDF_STATUS hal_rx_mpdu_get_addr3_be(uint8_t *buf,
  1630. uint8_t *mac_addr)
  1631. {
  1632. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1633. struct __attribute__((__packed__)) hal_addr3 {
  1634. uint32_t ad3_31_0;
  1635. uint16_t ad3_47_32;
  1636. };
  1637. struct hal_addr3 *addr = (struct hal_addr3 *)mac_addr;
  1638. uint32_t mac_addr_ad3_valid;
  1639. mac_addr_ad3_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD3_VALID_GET(rx_pkt_tlvs);
  1640. if (mac_addr_ad3_valid) {
  1641. addr->ad3_31_0 = HAL_RX_TLV_MPDU_AD3_31_0_GET(rx_pkt_tlvs);
  1642. addr->ad3_47_32 = HAL_RX_TLV_MPDU_AD3_47_32_GET(rx_pkt_tlvs);
  1643. return QDF_STATUS_SUCCESS;
  1644. }
  1645. return QDF_STATUS_E_FAILURE;
  1646. }
  1647. /**
  1648. * hal_rx_get_mpdu_sequence_control_valid_be() - Get mpdu sequence
  1649. * control valid
  1650. * @buf: Network buffer
  1651. *
  1652. * Return: value of sequence control valid field
  1653. */
  1654. static inline uint8_t hal_rx_get_mpdu_sequence_control_valid_be(uint8_t *buf)
  1655. {
  1656. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1657. return HAL_RX_TLV_MPDU_GET_SEQUENCE_CONTROL_VALID(rx_pkt_tlvs);
  1658. }
  1659. /**
  1660. * hal_rx_tid_get_be() - get tid based on qos control valid.
  1661. * @hal_soc_hdl: hal_soc handle
  1662. * @buf: pointer to rx pkt TLV.
  1663. *
  1664. * Return: tid
  1665. */
  1666. static inline uint32_t hal_rx_tid_get_be(hal_soc_handle_t hal_soc_hdl,
  1667. uint8_t *buf)
  1668. {
  1669. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1670. uint8_t qos_control_valid =
  1671. HAL_RX_TLV_MPDU_QOS_CONTROL_VALID_GET(rx_pkt_tlvs);
  1672. if (qos_control_valid)
  1673. return hal_rx_tlv_tid_get_be(buf);
  1674. return HAL_RX_NON_QOS_TID;
  1675. }
  1676. static inline
  1677. uint8_t hal_rx_get_fc_valid_be(uint8_t *buf)
  1678. {
  1679. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1680. return HAL_RX_TLV_GET_FC_VALID(rx_pkt_tlvs);
  1681. }
  1682. static inline uint8_t hal_rx_get_to_ds_flag_be(uint8_t *buf)
  1683. {
  1684. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1685. return HAL_RX_TLV_GET_TO_DS_FLAG(rx_pkt_tlvs);
  1686. }
  1687. static inline uint8_t hal_rx_get_mac_addr2_valid_be(uint8_t *buf)
  1688. {
  1689. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1690. return HAL_RX_TLV_MPDU_MAC_ADDR_AD2_VALID_GET(rx_pkt_tlvs);
  1691. }
  1692. /**
  1693. * hal_rx_msdu_flow_idx_get_be() - API to get flow index from
  1694. * rx_msdu_end TLV
  1695. * @buf: pointer to the start of RX PKT TLV headers
  1696. *
  1697. * Return: flow index value from MSDU END TLV
  1698. */
  1699. static inline uint32_t hal_rx_msdu_flow_idx_get_be(uint8_t *buf)
  1700. {
  1701. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1702. return HAL_RX_TLV_FLOW_IDX_GET(pkt_tlvs);
  1703. }
  1704. /**
  1705. * hal_rx_msdu_get_reo_destination_indication_be() - API to get
  1706. * reo_destination_indication
  1707. * from rx_msdu_end
  1708. * TLV
  1709. * @buf: pointer to the start of RX PKT TLV headers
  1710. * @reo_destination_indication: pointer to return value of
  1711. * reo_destination_indication
  1712. *
  1713. * Return: none
  1714. */
  1715. static inline void
  1716. hal_rx_msdu_get_reo_destination_indication_be(uint8_t *buf,
  1717. uint32_t *reo_destination_indication)
  1718. {
  1719. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1720. *reo_destination_indication = HAL_RX_TLV_REO_DEST_IND_GET(pkt_tlvs);
  1721. }
  1722. /**
  1723. * hal_rx_msdu_flow_idx_invalid_be() - API to get flow index invalid
  1724. * from rx_msdu_end TLV
  1725. * @buf: pointer to the start of RX PKT TLV headers
  1726. *
  1727. * Return: flow index invalid value from MSDU END TLV
  1728. */
  1729. static inline bool hal_rx_msdu_flow_idx_invalid_be(uint8_t *buf)
  1730. {
  1731. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1732. return HAL_RX_TLV_FLOW_IDX_INVALID_GET(pkt_tlvs);
  1733. }
  1734. /**
  1735. * hal_rx_msdu_flow_idx_timeout_be() - API to get flow index timeout
  1736. * from rx_msdu_end TLV
  1737. * @buf: pointer to the start of RX PKT TLV headers
  1738. *
  1739. * Return: flow index timeout value from MSDU END TLV
  1740. */
  1741. static inline bool hal_rx_msdu_flow_idx_timeout_be(uint8_t *buf)
  1742. {
  1743. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1744. return HAL_RX_TLV_FLOW_IDX_TIMEOUT_GET(pkt_tlvs);
  1745. }
  1746. /**
  1747. * hal_rx_msdu_fse_metadata_get_be() - API to get FSE metadata from
  1748. * rx_msdu_end TLV
  1749. * @buf: pointer to the start of RX PKT TLV headers
  1750. *
  1751. * Return: fse metadata value from MSDU END TLV
  1752. */
  1753. static inline uint32_t hal_rx_msdu_fse_metadata_get_be(uint8_t *buf)
  1754. {
  1755. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1756. return HAL_RX_TLV_FSE_METADATA_GET(pkt_tlvs);
  1757. }
  1758. /**
  1759. * hal_rx_msdu_cce_metadata_get_be() - API to get CCE metadata from
  1760. * rx_msdu_end TLV
  1761. * @buf: pointer to the start of RX PKT TLV headers
  1762. *
  1763. * Return: cce_metadata
  1764. */
  1765. static inline uint16_t
  1766. hal_rx_msdu_cce_metadata_get_be(uint8_t *buf)
  1767. {
  1768. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1769. return HAL_RX_TLV_CCE_METADATA_GET(pkt_tlvs);
  1770. }
  1771. /**
  1772. * hal_rx_msdu_get_flow_params_be() - API to get flow index, flow
  1773. * index invalid and flow index
  1774. * timeout from rx_msdu_end TLV
  1775. * @buf: pointer to the start of RX PKT TLV headers
  1776. * @flow_invalid: pointer to return value of flow_idx_valid
  1777. * @flow_timeout: pointer to return value of flow_idx_timeout
  1778. * @flow_index: pointer to return value of flow_idx
  1779. *
  1780. * Return: none
  1781. */
  1782. static inline void
  1783. hal_rx_msdu_get_flow_params_be(uint8_t *buf,
  1784. bool *flow_invalid,
  1785. bool *flow_timeout,
  1786. uint32_t *flow_index)
  1787. {
  1788. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1789. *flow_invalid = HAL_RX_TLV_FLOW_IDX_INVALID_GET(pkt_tlvs);
  1790. *flow_timeout = HAL_RX_TLV_FLOW_IDX_TIMEOUT_GET(pkt_tlvs);
  1791. *flow_index = HAL_RX_TLV_FLOW_IDX_GET(pkt_tlvs);
  1792. }
  1793. /**
  1794. * hal_rx_tlv_get_tcp_chksum_be() - API to get tcp checksum
  1795. * @buf: rx_tlv_hdr
  1796. *
  1797. * Return: tcp checksum
  1798. */
  1799. static inline uint16_t
  1800. hal_rx_tlv_get_tcp_chksum_be(uint8_t *buf)
  1801. {
  1802. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1803. return HAL_RX_TLV_GET_TCP_CHKSUM(rx_pkt_tlvs);
  1804. }
  1805. /**
  1806. * hal_rx_get_rx_sequence_be() - Function to retrieve rx sequence number
  1807. * @buf: Network buffer
  1808. *
  1809. * Return: rx sequence number
  1810. */
  1811. static inline
  1812. uint16_t hal_rx_get_rx_sequence_be(uint8_t *buf)
  1813. {
  1814. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1815. return HAL_RX_MPDU_SEQUENCE_NUMBER_GET(rx_pkt_tlvs);
  1816. }
  1817. #ifdef RECEIVE_OFFLOAD
  1818. #ifdef QCA_WIFI_KIWI_V2
  1819. static inline
  1820. uint16_t hal_rx_get_fisa_cumulative_l4_checksum_be(uint8_t *buf)
  1821. {
  1822. /*
  1823. * cumulative l4 checksum is not supported in V2 and
  1824. * cumulative_l4_checksum field is not present
  1825. */
  1826. return 0;
  1827. }
  1828. #else
  1829. /**
  1830. * hal_rx_get_fisa_cumulative_l4_checksum_be() - Retrieve cumulative
  1831. * checksum
  1832. * @buf: buffer pointer
  1833. *
  1834. * Return: cumulative checksum
  1835. */
  1836. static inline
  1837. uint16_t hal_rx_get_fisa_cumulative_l4_checksum_be(uint8_t *buf)
  1838. {
  1839. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1840. return HAL_RX_TLV_GET_FISA_CUMULATIVE_L4_CHECKSUM(rx_pkt_tlvs);
  1841. }
  1842. #endif
  1843. /**
  1844. * hal_rx_get_fisa_cumulative_ip_length_be() - Retrieve cumulative
  1845. * ip length
  1846. * @buf: buffer pointer
  1847. *
  1848. * Return: cumulative length
  1849. */
  1850. static inline
  1851. uint16_t hal_rx_get_fisa_cumulative_ip_length_be(uint8_t *buf)
  1852. {
  1853. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1854. return HAL_RX_TLV_GET_FISA_CUMULATIVE_IP_LENGTH(rx_pkt_tlvs);
  1855. }
  1856. /**
  1857. * hal_rx_get_udp_proto_be() - Retrieve udp proto value
  1858. * @buf: buffer
  1859. *
  1860. * Return: udp proto bit
  1861. */
  1862. static inline
  1863. bool hal_rx_get_udp_proto_be(uint8_t *buf)
  1864. {
  1865. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1866. return HAL_RX_TLV_GET_UDP_PROTO(rx_pkt_tlvs);
  1867. }
  1868. #endif
  1869. /**
  1870. * hal_rx_get_flow_agg_continuation_be() - retrieve flow agg
  1871. * continuation
  1872. * @buf: buffer
  1873. *
  1874. * Return: flow agg
  1875. */
  1876. static inline
  1877. bool hal_rx_get_flow_agg_continuation_be(uint8_t *buf)
  1878. {
  1879. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1880. return HAL_RX_TLV_GET_FLOW_AGGR_CONT(rx_pkt_tlvs);
  1881. }
  1882. /**
  1883. * hal_rx_get_flow_agg_count_be()- Retrieve flow agg count
  1884. * @buf: buffer
  1885. *
  1886. * Return: flow agg count
  1887. */
  1888. static inline
  1889. uint8_t hal_rx_get_flow_agg_count_be(uint8_t *buf)
  1890. {
  1891. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1892. return HAL_RX_TLV_GET_FLOW_AGGR_COUNT(rx_pkt_tlvs);
  1893. }
  1894. /**
  1895. * hal_rx_get_fisa_timeout_be() - Retrieve fisa timeout
  1896. * @buf: buffer
  1897. *
  1898. * Return: fisa timeout
  1899. */
  1900. static inline
  1901. bool hal_rx_get_fisa_timeout_be(uint8_t *buf)
  1902. {
  1903. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1904. return HAL_RX_TLV_GET_FISA_TIMEOUT(rx_pkt_tlvs);
  1905. }
  1906. /**
  1907. * hal_rx_mpdu_start_tlv_tag_valid_be () - API to check if RX_MPDU_START
  1908. * tlv tag is valid
  1909. *
  1910. *@rx_tlv_hdr: start address of rx_pkt_tlvs
  1911. *
  1912. * Return: true if RX_MPDU_START is valid, else false.
  1913. */
  1914. static inline uint8_t hal_rx_mpdu_start_tlv_tag_valid_be(void *rx_tlv_hdr)
  1915. {
  1916. struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr;
  1917. uint32_t tlv_tag;
  1918. tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(&rx_desc->mpdu_start_tlv);
  1919. return tlv_tag == WIFIRX_MPDU_START_E ? true : false;
  1920. }
  1921. /**
  1922. * hal_rx_msdu_end_offset_get_generic() - API to get the
  1923. * msdu_end structure offset rx_pkt_tlv structure
  1924. *
  1925. * NOTE: API returns offset of msdu_end TLV from structure
  1926. * rx_pkt_tlvs
  1927. */
  1928. static inline uint32_t hal_rx_msdu_end_offset_get_generic(void)
  1929. {
  1930. return RX_PKT_TLV_OFFSET(msdu_end_tlv);
  1931. }
  1932. /**
  1933. * hal_rx_mpdu_start_offset_get_generic() - API to get the
  1934. * mpdu_start structure offset rx_pkt_tlv structure
  1935. *
  1936. * NOTE: API returns offset of attn TLV from structure
  1937. * rx_pkt_tlvs
  1938. */
  1939. static inline uint32_t hal_rx_mpdu_start_offset_get_generic(void)
  1940. {
  1941. return RX_PKT_TLV_OFFSET(mpdu_start_tlv);
  1942. }
  1943. #ifndef NO_RX_PKT_HDR_TLV
  1944. static inline uint32_t hal_rx_pkt_tlv_offset_get_generic(void)
  1945. {
  1946. return RX_PKT_TLV_OFFSET(pkt_hdr_tlv);
  1947. }
  1948. #endif
  1949. #ifdef CONFIG_WORD_BASED_TLV
  1950. #define MPDU_START_WMASK 0x074C
  1951. #define MSDU_END_WMASK 0x13FC1
  1952. /**
  1953. * hal_rx_mpdu_start_wmask_get_be() - API to get the mpdu_start_tlv word mask
  1954. *
  1955. * return: Word mask for MPDU start tlv
  1956. */
  1957. static inline uint32_t hal_rx_mpdu_start_wmask_get_be(void)
  1958. {
  1959. return MPDU_START_WMASK;
  1960. }
  1961. /**
  1962. * hal_rx_msdu_end_wmask_get_be() - API to get the msdu_end_tlv word mask
  1963. *
  1964. * return: Word mask for MSDU end tlv
  1965. */
  1966. static inline uint32_t hal_rx_msdu_end_wmask_get_be(void)
  1967. {
  1968. return MSDU_END_WMASK;
  1969. }
  1970. #endif
  1971. #ifdef RECEIVE_OFFLOAD
  1972. static inline int
  1973. hal_rx_tlv_get_offload_info_be(uint8_t *rx_tlv,
  1974. struct hal_offload_info *offload_info)
  1975. {
  1976. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)rx_tlv;
  1977. offload_info->lro_eligible = HAL_RX_TLV_GET_LRO_ELIGIBLE(rx_pkt_tlvs);
  1978. offload_info->flow_id = HAL_RX_TLV_GET_FLOW_ID_TOEPLITZ(rx_pkt_tlvs);
  1979. offload_info->ipv6_proto = HAL_RX_TLV_GET_IPV6(rx_pkt_tlvs);
  1980. offload_info->tcp_proto = HAL_RX_TLV_GET_TCP_PROTO(rx_pkt_tlvs);
  1981. if (offload_info->tcp_proto) {
  1982. offload_info->tcp_pure_ack =
  1983. HAL_RX_TLV_GET_TCP_PURE_ACK(rx_pkt_tlvs);
  1984. offload_info->tcp_offset =
  1985. HAL_RX_TLV_GET_TCP_OFFSET(rx_pkt_tlvs);
  1986. offload_info->tcp_win = HAL_RX_TLV_GET_TCP_WIN(rx_pkt_tlvs);
  1987. offload_info->tcp_seq_num = HAL_RX_TLV_GET_TCP_SEQ(rx_pkt_tlvs);
  1988. offload_info->tcp_ack_num = HAL_RX_TLV_GET_TCP_ACK(rx_pkt_tlvs);
  1989. }
  1990. return 0;
  1991. }
  1992. static inline int hal_rx_get_proto_params_be(uint8_t *buf, void *proto_params)
  1993. {
  1994. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1995. struct hal_proto_params *param =
  1996. (struct hal_proto_params *)proto_params;
  1997. param->tcp_proto = HAL_RX_TLV_GET_TCP_PROTO(rx_pkt_tlvs);
  1998. param->udp_proto = HAL_RX_TLV_GET_UDP_PROTO(rx_pkt_tlvs);
  1999. param->ipv6_proto = HAL_RX_TLV_GET_IPV6(rx_pkt_tlvs);
  2000. return 0;
  2001. }
  2002. static inline int hal_rx_get_l3_l4_offsets_be(uint8_t *buf,
  2003. uint32_t *l3_hdr_offset,
  2004. uint32_t *l4_hdr_offset)
  2005. {
  2006. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  2007. *l3_hdr_offset = HAL_RX_TLV_GET_IP_OFFSET(rx_pkt_tlvs);
  2008. *l4_hdr_offset = HAL_RX_TLV_GET_TCP_OFFSET(rx_pkt_tlvs);
  2009. return 0;
  2010. }
  2011. #endif
  2012. /**
  2013. * hal_rx_msdu_start_msdu_len_get_be() - API to get the MSDU length from
  2014. * rx_msdu_start TLV
  2015. * @buf: pointer to the start of RX PKT TLV headers
  2016. *
  2017. * Return: msdu length
  2018. */
  2019. static inline uint32_t hal_rx_msdu_start_msdu_len_get_be(uint8_t *buf)
  2020. {
  2021. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  2022. uint32_t msdu_len;
  2023. msdu_len = HAL_RX_TLV_MSDU_LEN_GET(rx_pkt_tlvs);
  2024. return msdu_len;
  2025. }
  2026. /**
  2027. * hal_rx_get_frame_ctrl_field_be() - Function to retrieve frame control field
  2028. * @buf: Network buffer
  2029. *
  2030. * Return: frame control field
  2031. */
  2032. static inline uint16_t hal_rx_get_frame_ctrl_field_be(uint8_t *buf)
  2033. {
  2034. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  2035. uint16_t frame_ctrl = 0;
  2036. frame_ctrl = HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(rx_pkt_tlvs);
  2037. return frame_ctrl;
  2038. }
  2039. /**
  2040. * hal_rx_tlv_get_is_decrypted_be() - API to get the decrypt status of
  2041. * the packet from msdu_end
  2042. * @buf: pointer to the start of RX PKT TLV header
  2043. *
  2044. * Return: uint32_t(decryt status)
  2045. */
  2046. static inline uint32_t hal_rx_tlv_get_is_decrypted_be(uint8_t *buf)
  2047. {
  2048. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  2049. uint32_t is_decrypt = 0;
  2050. uint32_t decrypt_status;
  2051. decrypt_status = HAL_RX_TLV_DECRYPT_STATUS_GET(rx_pkt_tlvs);
  2052. if (!decrypt_status)
  2053. is_decrypt = 1;
  2054. return is_decrypt;
  2055. }
  2056. #ifdef NO_RX_PKT_HDR_TLV
  2057. /**
  2058. * hal_rx_pkt_hdr_get_be() - API to get 80211 header
  2059. * @buf: start of rx_pkt_tlv
  2060. *
  2061. * If NO_RX_PKT_HDR_TLV is enabled, then this API assume caller gives a raw
  2062. * data, get 80211 header from packet data directly.
  2063. * If NO_RX_PKT_HDR_TLV is disabled, then get it from rx_pkt_hdr_tlv in
  2064. * rx_pkt_tlvs.
  2065. *
  2066. * Return: pointer to start of 80211 header
  2067. */
  2068. static inline uint8_t *hal_rx_pkt_hdr_get_be(uint8_t *buf)
  2069. {
  2070. return buf + RX_PKT_TLVS_LEN;
  2071. }
  2072. #else
  2073. static inline uint8_t *hal_rx_pkt_hdr_get_be(uint8_t *buf)
  2074. {
  2075. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  2076. return pkt_tlvs->pkt_hdr_tlv.rx_pkt_hdr;
  2077. }
  2078. #endif
  2079. /**
  2080. * hal_rx_tlv_csum_err_get_be() - Get IP and tcp-udp checksum fail flag
  2081. * @rx_tlv_hdr: start address of rx_tlv_hdr
  2082. * @ip_csum_err: buffer to return ip_csum_fail flag
  2083. * @tcp_udp_csum_err: placeholder to return tcp-udp checksum fail flag
  2084. *
  2085. * Return: None
  2086. */
  2087. static inline void
  2088. hal_rx_tlv_csum_err_get_be(uint8_t *rx_tlv_hdr, uint32_t *ip_csum_err,
  2089. uint32_t *tcp_udp_csum_err)
  2090. {
  2091. struct rx_pkt_tlvs *rx_pkt_tlvs =
  2092. (struct rx_pkt_tlvs *)rx_tlv_hdr;
  2093. *ip_csum_err = HAL_RX_TLV_IP_CSUM_FAIL_GET(rx_pkt_tlvs);
  2094. *tcp_udp_csum_err = HAL_RX_TLV_TCP_UDP_CSUM_FAIL_GET(rx_pkt_tlvs);
  2095. }
  2096. static inline
  2097. uint32_t hal_rx_tlv_mpdu_len_err_get_be(void *hw_desc_addr)
  2098. {
  2099. struct rx_pkt_tlvs *rx_pkt_tlvs =
  2100. (struct rx_pkt_tlvs *)hw_desc_addr;
  2101. return HAL_RX_TLV_MPDU_LEN_ERR_GET(rx_pkt_tlvs);
  2102. }
  2103. static inline
  2104. uint32_t hal_rx_tlv_mpdu_fcs_err_get_be(void *hw_desc_addr)
  2105. {
  2106. struct rx_pkt_tlvs *rx_pkt_tlvs =
  2107. (struct rx_pkt_tlvs *)hw_desc_addr;
  2108. return HAL_RX_TLV_MPDU_FCS_ERR_GET(rx_pkt_tlvs);
  2109. }
  2110. /**
  2111. * hal_rx_get_rx_more_frag_bit() - Function to retrieve more fragment bit
  2112. * @buf: Network buffer
  2113. *
  2114. * Return: rx more fragment bit
  2115. */
  2116. static inline
  2117. uint8_t hal_rx_get_rx_more_frag_bit(uint8_t *buf)
  2118. {
  2119. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  2120. uint16_t frame_ctrl = 0;
  2121. frame_ctrl = HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(pkt_tlvs) >>
  2122. DOT11_FC1_MORE_FRAG_OFFSET;
  2123. /* more fragment bit if at offset bit 4 */
  2124. return frame_ctrl;
  2125. }
  2126. /**
  2127. * hal_rx_msdu_is_wlan_mcast_generic_be() - Check if the buffer is for
  2128. * multicast address
  2129. * @nbuf: Network buffer
  2130. *
  2131. * Return: flag to indicate whether the nbuf has MC/BC address
  2132. */
  2133. static inline uint32_t hal_rx_msdu_is_wlan_mcast_generic_be(qdf_nbuf_t nbuf)
  2134. {
  2135. uint8_t *buf = qdf_nbuf_data(nbuf);
  2136. return HAL_RX_TLV_IS_MCAST_GET(buf);;
  2137. }
  2138. /**
  2139. * hal_rx_msdu_start_msdu_len_set_be() - API to set the MSDU length
  2140. * from rx_msdu_start TLV
  2141. * @buf: pointer to the start of RX PKT TLV headers
  2142. * @len: msdu length
  2143. *
  2144. * Return: none
  2145. */
  2146. static inline void
  2147. hal_rx_msdu_start_msdu_len_set_be(uint8_t *buf, uint32_t len)
  2148. {
  2149. HAL_RX_TLV_MSDU_LEN_GET(buf) = len;
  2150. }
  2151. /**
  2152. * hal_rx_mpdu_start_mpdu_qos_control_valid_get_be() -
  2153. * Retrieve qos control valid bit from the tlv.
  2154. * @buf: pointer to rx pkt TLV.
  2155. *
  2156. * Return: qos control value.
  2157. */
  2158. static inline uint32_t
  2159. hal_rx_mpdu_start_mpdu_qos_control_valid_get_be(uint8_t *buf)
  2160. {
  2161. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  2162. return HAL_RX_MPDU_INFO_QOS_CONTROL_VALID_GET(pkt_tlvs);
  2163. }
  2164. /**
  2165. * hal_rx_msdu_end_sa_sw_peer_id_get_be() - API to get the
  2166. * sa_sw_peer_id from rx_msdu_end TLV
  2167. * @buf: pointer to the start of RX PKT TLV headers
  2168. *
  2169. * Return: sa_sw_peer_id index
  2170. */
  2171. static inline uint32_t
  2172. hal_rx_msdu_end_sa_sw_peer_id_get_be(uint8_t *buf)
  2173. {
  2174. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  2175. hal_rx_msdu_end_t *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  2176. return HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(msdu_end);
  2177. }
  2178. #endif /* _HAL_BE_RX_TLV_H_ */