hal_be_rx_tlv.h 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886
  1. /*
  2. * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for
  5. * any purpose with or without fee is hereby granted, provided that the
  6. * above copyright notice and this permission notice appear in all
  7. * copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  10. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  11. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  12. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  14. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  15. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  16. * PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. #ifndef _HAL_BE_RX_TLV_H_
  19. #define _HAL_BE_RX_TLV_H_
  20. #include "hal_api_mon.h"
  21. /*
  22. * Structures & Macros to obtain fields from the TLV's in the Rx packet
  23. * pre-header.
  24. */
  25. #define HAL_RX_BE_PKT_HDR_TLV_LEN 112
  26. #ifndef CONFIG_WORD_BASED_TLV
  27. typedef struct rx_mpdu_start hal_rx_mpdu_start_t;
  28. typedef struct rx_msdu_end hal_rx_msdu_end_t;
  29. #endif
  30. /*
  31. * Each RX descriptor TLV is preceded by 1 QWORD "tag"
  32. */
  33. struct rx_mpdu_start_tlv {
  34. uint64_t tag;
  35. hal_rx_mpdu_start_t rx_mpdu_start;
  36. };
  37. struct rx_msdu_end_tlv {
  38. uint64_t tag;
  39. hal_rx_msdu_end_t rx_msdu_end;
  40. };
  41. struct rx_pkt_hdr_tlv {
  42. uint64_t tag; /* 8 B */
  43. uint64_t phy_ppdu_id; /* 8 B */
  44. char rx_pkt_hdr[HAL_RX_BE_PKT_HDR_TLV_LEN]; /* 112 B */
  45. };
  46. #define RX_BE_PADDING0_BYTES 8
  47. #define RX_BE_PADDING1_BYTES 8
  48. struct rx_pkt_tlvs {
  49. struct rx_msdu_end_tlv msdu_end_tlv; /* 120 bytes */
  50. uint8_t rx_padding0[RX_BE_PADDING0_BYTES]; /* 8 bytes */
  51. struct rx_mpdu_start_tlv mpdu_start_tlv; /* 120 bytes */
  52. struct rx_pkt_hdr_tlv pkt_hdr_tlv; /* 128 bytes */
  53. };
  54. #define SIZE_OF_DATA_RX_TLV sizeof(struct rx_pkt_tlvs)
  55. #define RX_PKT_TLVS_LEN SIZE_OF_DATA_RX_TLV
  56. #define RX_PKT_TLV_OFFSET(field) qdf_offsetof(struct rx_pkt_tlvs, field)
  57. #ifndef CONFIG_WORD_BASED_TLV
  58. #define HAL_RX_MSDU_END(_rx_pkt_tlv) \
  59. (((struct rx_pkt_tlvs *)_rx_pkt_tlv)->msdu_end_tlv.rx_msdu_end)
  60. #define HAL_RX_MPDU_START(_rx_pkt_tlv) \
  61. (((struct rx_pkt_tlvs *)_rx_pkt_tlv)->mpdu_start_tlv. \
  62. rx_mpdu_start.rx_mpdu_info_details)
  63. #else /* CONFIG_WORD_BASED_TLV */
  64. #define HAL_RX_MSDU_END(_rx_pkt_tlv) \
  65. (((struct rx_pkt_tlvs *)_rx_pkt_tlv)->msdu_end_tlv.rx_msdu_end)
  66. #define HAL_RX_MPDU_START(_rx_pkt_tlv) \
  67. (((struct rx_pkt_tlvs *)_rx_pkt_tlv)->mpdu_start_tlv. \
  68. rx_mpdu_start)
  69. #endif /* CONFIG_WORD_BASED_TLV */
  70. #define HAL_RX_TLV_MSDU_DONE_GET(_rx_pkt_tlv) \
  71. HAL_RX_MSDU_END(_rx_pkt_tlv).msdu_done
  72. #define HAL_RX_TLV_DECAP_FORMAT_GET(_rx_pkt_tlv) \
  73. HAL_RX_MSDU_END(_rx_pkt_tlv).decap_format
  74. #ifdef RECEIVE_OFFLOAD
  75. #define HAL_RX_TLV_GET_TCP_PURE_ACK(_rx_pkt_tlv) \
  76. HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_only_ack
  77. #define HAL_RX_TLV_GET_TCP_PROTO(_rx_pkt_tlv) \
  78. HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_proto
  79. #define HAL_RX_TLV_GET_UDP_PROTO(_rx_pkt_tlv) \
  80. HAL_RX_MSDU_END(_rx_pkt_tlv).udp_proto
  81. #define HAL_RX_TLV_GET_IPV6(_rx_pkt_tlv) \
  82. HAL_RX_MSDU_END(_rx_pkt_tlv).ipv6_proto
  83. #define HAL_RX_TLV_GET_IP_OFFSET(_rx_pkt_tlv) \
  84. HAL_RX_MSDU_END(_rx_pkt_tlv).l3_offset
  85. #define HAL_RX_TLV_GET_TCP_OFFSET(_rx_pkt_tlv) \
  86. HAL_RX_MSDU_END(_rx_pkt_tlv).l4_offset
  87. #endif /* RECEIVE_OFFLOAD */
  88. #define HAL_RX_TLV_GET_FLOW_ID_TOEPLITZ(_rx_pkt_tlv) \
  89. HAL_RX_MSDU_END(_rx_pkt_tlv).flow_id_toeplitz
  90. #define HAL_RX_TLV_MSDU_LEN_GET(_rx_pkt_tlv) \
  91. HAL_RX_MSDU_END(_rx_pkt_tlv).msdu_length
  92. #define HAL_RX_TLV_CCE_MATCH_GET(_rx_pkt_tlv) \
  93. HAL_RX_MSDU_END(_rx_pkt_tlv).cce_match
  94. #define HAL_RX_TLV_PHY_PPDU_ID_GET(_rx_pkt_tlv) \
  95. HAL_RX_MSDU_END(_rx_pkt_tlv).phy_ppdu_id
  96. #define HAL_RX_TLV_BW_GET(_rx_pkt_tlv) \
  97. HAL_RX_MSDU_END(_rx_pkt_tlv).receive_bandwidth
  98. #define HAL_RX_TLV_FLOWID_TOEPLITZ_GET(_rx_pkt_tlv) \
  99. HAL_RX_MSDU_END(_rx_pkt_tlv).flow_id_toeplitz
  100. #define HAL_RX_TLV_SGI_GET(_rx_pkt_tlv) \
  101. HAL_RX_MSDU_END(_rx_pkt_tlv).sgi
  102. #define HAL_RX_TLV_RATE_MCS_GET(_rx_pkt_tlv) \
  103. HAL_RX_MSDU_END(_rx_pkt_tlv).rate_mcs
  104. #define HAL_RX_TLV_DECRYPT_STATUS_GET(_rx_pkt_tlv) \
  105. HAL_RX_MSDU_END(_rx_pkt_tlv).decrypt_status_code
  106. #define HAL_RX_TLV_RSSI_GET(_rx_pkt_tlv) \
  107. HAL_RX_MSDU_END(_rx_pkt_tlv).user_rssi
  108. #define HAL_RX_TLV_FREQ_GET(_rx_pkt_tlv) \
  109. HAL_RX_MSDU_END(_rx_pkt_tlv).sw_phy_meta_data
  110. #define HAL_RX_TLV_PKT_TYPE_GET(_rx_pkt_tlv) \
  111. HAL_RX_MSDU_END(_rx_pkt_tlv).pkt_type
  112. #define HAL_RX_TLV_DECRYPT_ERR_GET(_rx_pkt_tlv) \
  113. HAL_RX_MSDU_END(_rx_pkt_tlv).decrypt_err
  114. #define HAL_RX_TLV_MIC_ERR_GET(_rx_pkt_tlv) \
  115. HAL_RX_MSDU_END(_rx_pkt_tlv).tkip_mic_err
  116. #define HAL_RX_TLV_MIMO_SS_BITMAP(_rx_pkt_tlv)\
  117. HAL_RX_MSDU_END(_rx_pkt_tlv).mimo_ss_bitmap
  118. #define HAL_RX_TLV_ANT_SIGNAL_DB_GET(_rx_pkt_tlv) \
  119. HAL_RX_MSDU_END(_rx_pkt_tlv).user_rssi
  120. #define HAL_RX_TLV_STBC_GET(_rx_pkt_tlv) \
  121. HAL_RX_MSDU_END(_rx_pkt_tlv).stbc
  122. #define HAL_RX_TLV_RECEPTION_TYPE_GET(_rx_pkt_tlv) \
  123. HAL_RX_MSDU_END(_rx_pkt_tlv).reception_type
  124. #define HAL_RX_TLV_IP_CSUM_FAIL_GET(_rx_pkt_tlv) \
  125. HAL_RX_MSDU_END(_rx_pkt_tlv).ip_chksum_fail
  126. #define HAL_RX_TLV_TCP_UDP_CSUM_FAIL_GET(_rx_pkt_tlv) \
  127. HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_udp_chksum_fail
  128. #define HAL_RX_TLV_MPDU_LEN_ERR_GET(_rx_pkt_tlv) \
  129. HAL_RX_MSDU_END(_rx_pkt_tlv).mpdu_length_err
  130. #define HAL_RX_TLV_MPDU_FCS_ERR_GET(_rx_pkt_tlv) \
  131. HAL_RX_MSDU_END(_rx_pkt_tlv).fcs_err
  132. #define HAL_RX_TLV_IS_MCAST_GET(_rx_pkt_tlv) \
  133. HAL_RX_MSDU_END(_rx_pkt_tlv).mcast_bcast
  134. #ifndef CONFIG_WORD_BASED_TLV
  135. #define HAL_RX_TLV_FIRST_MPDU_GET(_rx_pkt_tlv) \
  136. HAL_RX_MPDU_START(_rx_pkt_tlv).first_mpdu
  137. #else
  138. #define HAL_RX_TLV_FIRST_MPDU_GET(_rx_pkt_tlv) \
  139. HAL_RX_MSDU_END(_rx_pkt_tlv).first_mpdu
  140. #endif
  141. #ifdef RECEIVE_OFFLOAD
  142. /**
  143. * LRO information needed from the TLVs
  144. */
  145. #define HAL_RX_TLV_GET_LRO_ELIGIBLE(_rx_pkt_tlv) \
  146. HAL_RX_MSDU_END(_rx_pkt_tlv).lro_eligible
  147. #define HAL_RX_TLV_GET_TCP_ACK(_rx_pkt_tlv) \
  148. HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_ack_number
  149. #define HAL_RX_TLV_GET_TCP_SEQ(_rx_pkt_tlv) \
  150. HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_seq_number
  151. #define HAL_RX_TLV_GET_TCP_WIN(_rx_pkt_tlv) \
  152. HAL_RX_MSDU_END(_rx_pkt_tlv).window_size
  153. #endif
  154. #define HAL_RX_GET_FILTER_CATEGORY(_rx_pkt_tlv) \
  155. HAL_RX_MPDU_START(_rx_pkt_tlv).rxpcu_mpdu_filter_in_category
  156. #define HAL_RX_GET_PPDU_ID(_rx_pkt_tlv) \
  157. HAL_RX_MPDU_START(_rx_pkt_tlv).phy_ppdu_id
  158. #define HAL_RX_TLV_PEER_META_DATA_GET(_rx_pkt_tlv) \
  159. HAL_RX_MPDU_START(_rx_pkt_tlv).peer_meta_data
  160. #define HAL_RX_TLV_AMPDU_FLAG_GET(_rx_pkt_tlv) \
  161. HAL_RX_MPDU_START(_rx_pkt_tlv).ampdu_flag
  162. #define HAL_RX_TLV_SW_FRAME_GROUP_ID_GET(_rx_pkt_tlv) \
  163. HAL_RX_MPDU_START(_rx_pkt_tlv).sw_frame_group_id
  164. #define HAL_RX_TLV_KEYID_OCTET_GET(_rx_pkt_tlv) \
  165. HAL_RX_MSDU_END(_rx_pkt_tlv).key_id_octet
  166. #define HAL_RX_MPDU_SEQUENCE_NUMBER_GET(_rx_pkt_tlv) \
  167. HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_sequence_number
  168. #define HAL_RX_TLV_SA_SW_PEER_ID_GET(_rx_pkt_tlv) \
  169. HAL_RX_MSDU_END(_rx_pkt_tlv).sa_sw_peer_id
  170. #define HAL_RX_TLV_L3_HEADER_PADDING_GET(_rx_pkt_tlv) \
  171. HAL_RX_MSDU_END(_rx_pkt_tlv).l3_header_padding
  172. #define HAL_RX_TLV_SA_IDX_GET(_rx_pkt_tlv) \
  173. HAL_RX_MSDU_END(_rx_pkt_tlv).sa_idx
  174. #define HAL_RX_TLV_DA_IDX_GET(_rx_pkt_tlv) \
  175. HAL_RX_MSDU_END(_rx_pkt_tlv).da_idx_or_sw_peer_id
  176. #define HAL_RX_TLV_FIRST_MSDU_GET(_rx_pkt_tlv) \
  177. HAL_RX_MSDU_END(_rx_pkt_tlv).first_msdu
  178. #define HAL_RX_TLV_LAST_MSDU_GET(_rx_pkt_tlv) \
  179. HAL_RX_MSDU_END(_rx_pkt_tlv).last_msdu
  180. /*
  181. * Get tid from RX_MPDU_START
  182. */
  183. #define HAL_RX_TLV_TID_GET(_rx_pkt_tlv) \
  184. HAL_RX_MPDU_START(_rx_pkt_tlv).tid
  185. #define HAL_RX_TLV_DA_IS_MCBC_GET(_rx_pkt_tlv) \
  186. HAL_RX_MSDU_END(_rx_pkt_tlv).da_is_mcbc
  187. #define HAL_RX_TLV_SA_IS_VALID_GET(_rx_pkt_tlv) \
  188. HAL_RX_MSDU_END(_rx_pkt_tlv).sa_is_valid
  189. #define HAL_RX_TLV_MPDU_ENCRYPTION_INFO_VALID(_rx_pkt_tlv) \
  190. HAL_RX_MPDU_START(_rx_pkt_tlv).frame_encryption_info_valid
  191. #define HAL_RX_TLV_MPDU_PN_31_0_GET(_rx_pkt_tlv) \
  192. HAL_RX_MPDU_START(_rx_pkt_tlv).pn_31_0
  193. #define HAL_RX_TLV_MPDU_PN_63_32_GET(_rx_pkt_tlv) \
  194. HAL_RX_MPDU_START(_rx_pkt_tlv).pn_63_32
  195. #define HAL_RX_TLV_MPDU_PN_95_64_GET(_rx_pkt_tlv) \
  196. HAL_RX_MPDU_START(_rx_pkt_tlv).pn_95_64
  197. #define HAL_RX_TLV_MPDU_PN_127_96_GET(_rx_pkt_tlv) \
  198. HAL_RX_MPDU_START(_rx_pkt_tlv).pn_127_96
  199. #define HAL_RX_TLV_DA_IS_VALID_GET(_rx_pkt_tlv) \
  200. HAL_RX_MSDU_END(_rx_pkt_tlv).da_is_valid
  201. #define HAL_RX_TLV_MPDU_MAC_ADDR_AD4_VALID_GET(_rx_pkt_tlv) \
  202. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad4_valid
  203. #define HAL_RX_TLV_SW_PEER_ID_GET(_rx_pkt_tlv) \
  204. HAL_RX_MPDU_START(_rx_pkt_tlv).sw_peer_id
  205. #define HAL_RX_TLV_MPDU_GET_TODS(_rx_pkt_tlv) \
  206. HAL_RX_MPDU_START(_rx_pkt_tlv).to_ds
  207. #define HAL_RX_TLV_MPDU_GET_FROMDS(_rx_pkt_tlv) \
  208. HAL_RX_MPDU_START(_rx_pkt_tlv).fr_ds
  209. #define HAL_RX_TLV_MPDU_GET_FRAME_CONTROL_VALID(_rx_pkt_tlv) \
  210. HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_frame_control_valid
  211. #define HAL_RX_TLV_MPDU_MAC_ADDR_AD1_VALID_GET(_rx_pkt_tlv) \
  212. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad1_valid
  213. #define HAL_RX_TLV_MPDU_AD1_31_0_GET(_rx_pkt_tlv) \
  214. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad1_31_0
  215. #define HAL_RX_TLV_MPDU_AD1_47_32_GET(_rx_pkt_tlv) \
  216. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad1_47_32
  217. #define HAL_RX_TLV_MPDU_MAC_ADDR_AD2_VALID_GET(_rx_pkt_tlv) \
  218. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad2_valid
  219. #define HAL_RX_TLV_MPDU_AD2_15_0_GET(_rx_pkt_tlv) \
  220. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad2_15_0
  221. #define HAL_RX_TLV_MPDU_AD2_47_16_GET(_rx_pkt_tlv) \
  222. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad2_47_16
  223. #define HAL_RX_TLV_MPDU_MAC_ADDR_AD3_VALID_GET(_rx_pkt_tlv) \
  224. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad3_valid
  225. #define HAL_RX_TLV_MPDU_AD3_31_0_GET(_rx_pkt_tlv) \
  226. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad3_31_0
  227. #define HAL_RX_TLV_MPDU_AD3_47_32_GET(_rx_pkt_tlv) \
  228. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad3_47_32
  229. #define HAL_RX_TLV_MPDU_AD4_31_0_GET(_rx_pkt_tlv) \
  230. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad4_31_0
  231. #define HAL_RX_TLV_MPDU_AD4_47_32_GET(_rx_pkt_tlv) \
  232. HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad4_47_32
  233. #define HAL_RX_TLV_MPDU_GET_SEQUENCE_CONTROL_VALID(_rx_pkt_tlv) \
  234. HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_sequence_control_valid
  235. #define HAL_RX_TLV_MPDU_QOS_CONTROL_VALID_GET(_rx_pkt_tlv) \
  236. HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_qos_control_valid
  237. #define HAL_RX_GET_FC_VALID(_rx_pkt_tlv) \
  238. HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_frame_control_valid
  239. #define HAL_RX_GET_TO_DS_FLAG(_rx_pkt_tlv) \
  240. HAL_RX_MPDU_START(_rx_pkt_tlv).to_ds
  241. #define HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(_rx_pkt_tlv) \
  242. HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_frame_control_field
  243. #define HAL_RX_TLV_FLOW_IDX_GET(_rx_pkt_tlv) \
  244. HAL_RX_MSDU_END(_rx_pkt_tlv).flow_idx
  245. #define HAL_RX_TLV_REO_DEST_IND_GET(_rx_pkt_tlv) \
  246. HAL_RX_MSDU_END(_rx_pkt_tlv).reo_destination_indication
  247. #define HAL_RX_TLV_FLOW_IDX_INVALID_GET(_rx_pkt_tlv) \
  248. HAL_RX_MSDU_END(_rx_pkt_tlv).flow_idx_invalid
  249. #define HAL_RX_TLV_FLOW_IDX_TIMEOUT_GET(_rx_pkt_tlv) \
  250. HAL_RX_MSDU_END(_rx_pkt_tlv).flow_idx_timeout
  251. #define HAL_RX_TLV_FSE_METADATA_GET(_rx_pkt_tlv) \
  252. HAL_RX_MSDU_END(_rx_pkt_tlv).fse_metadata
  253. #define HAL_RX_TLV_CCE_METADATA_GET(_rx_pkt_tlv) \
  254. HAL_RX_MSDU_END(_rx_pkt_tlv).cce_metadata
  255. #define HAL_RX_TLV_DECRYPT_STATUS_GET(_rx_pkt_tlv) \
  256. HAL_RX_MSDU_END(_rx_pkt_tlv).decrypt_status_code
  257. #define HAL_RX_TLV_GET_TCP_CHKSUM(_rx_pkt_tlv) \
  258. HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_udp_chksum
  259. #define HAL_RX_TLV_GET_FLOW_AGGR_CONT(_rx_pkt_tlv) \
  260. HAL_RX_MSDU_END(_rx_pkt_tlv).flow_aggregation_continuation
  261. #define HAL_RX_TLV_GET_FLOW_AGGR_COUNT(_rx_pkt_tlv) \
  262. HAL_RX_MSDU_END(_rx_pkt_tlv).aggregation_count
  263. #define HAL_RX_TLV_GET_FISA_TIMEOUT(_rx_pkt_tlv) \
  264. HAL_RX_MSDU_END(_rx_pkt_tlv).fisa_timeout
  265. #define HAL_RX_TLV_GET_FISA_CUMULATIVE_L4_CHECKSUM(_rx_pkt_tlv) \
  266. HAL_RX_MSDU_END(_rx_pkt_tlv).cumulative_l4_checksum
  267. #define HAL_RX_TLV_GET_FISA_CUMULATIVE_IP_LENGTH(_rx_pkt_tlv) \
  268. HAL_RX_MSDU_END(_rx_pkt_tlv).cumulative_ip_length
  269. #define HAL_RX_MPDU_INFO_QOS_CONTROL_VALID_GET(_rx_pkt_tlv) \
  270. HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_qos_control_valid
  271. #define HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(_rx_pkt_tlv) \
  272. HAL_RX_MSDU_END(_rx_pkt_tlv).sa_sw_peer_id
  273. static inline
  274. uint32_t hal_rx_tlv_decap_format_get_be(void *hw_desc_addr)
  275. {
  276. struct rx_pkt_tlvs *rx_pkt_tlvs =
  277. (struct rx_pkt_tlvs *)hw_desc_addr;
  278. return HAL_RX_TLV_DECAP_FORMAT_GET(rx_pkt_tlvs);
  279. }
  280. static inline uint32_t hal_rx_tlv_msdu_done_get_be(uint8_t *buf)
  281. {
  282. return HAL_RX_TLV_MSDU_DONE_GET(buf);
  283. }
  284. /*
  285. * hal_rx_attn_first_mpdu_get(): get fist_mpdu bit from rx attention
  286. * @buf: pointer to rx_pkt_tlvs
  287. *
  288. * return: uint32_t(first_msdu)
  289. */
  290. static inline uint32_t hal_rx_tlv_first_mpdu_get_be(uint8_t *buf)
  291. {
  292. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  293. return HAL_RX_TLV_FIRST_MPDU_GET(rx_pkt_tlvs);
  294. }
  295. /*
  296. * hal_rx_msdu_cce_match_get(): get CCE match bit
  297. * from rx attention
  298. * @buf: pointer to rx_pkt_tlvs
  299. * Return: CCE match value
  300. */
  301. static inline bool hal_rx_msdu_cce_match_get_be(uint8_t *buf)
  302. {
  303. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  304. return HAL_RX_TLV_CCE_MATCH_GET(rx_pkt_tlvs);
  305. }
  306. /*
  307. * hal_rx_attn_phy_ppdu_id_get(): get phy_ppdu_id value
  308. * from rx attention
  309. * @buf: pointer to rx_pkt_tlvs
  310. *
  311. * Return: phy_ppdu_id
  312. */
  313. static inline uint16_t hal_rx_attn_phy_ppdu_id_get_be(uint8_t *buf)
  314. {
  315. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  316. uint16_t phy_ppdu_id;
  317. phy_ppdu_id = HAL_RX_TLV_PHY_PPDU_ID_GET(rx_pkt_tlvs);
  318. return phy_ppdu_id;
  319. }
  320. /*
  321. * hal_rx_tlv_phy_ppdu_id_get(): get phy_ppdu_id value
  322. * from rx attention
  323. * @buf: pointer to rx_pkt_tlvs
  324. *
  325. * Return: phy_ppdu_id
  326. */
  327. static inline uint16_t hal_rx_tlv_phy_ppdu_id_get_be(uint8_t *buf)
  328. {
  329. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  330. return HAL_RX_TLV_PHY_PPDU_ID_GET(rx_pkt_tlvs);
  331. }
  332. /*
  333. * hal_rx_mpdu_peer_meta_data_set: set peer meta data in RX mpdu start tlv
  334. *
  335. * @buf: rx_tlv_hdr of the received packet
  336. * @peer_mdata: peer meta data to be set.
  337. * Return: void
  338. */
  339. static inline void
  340. hal_rx_mpdu_peer_meta_data_set_be(uint8_t *buf, uint32_t peer_mdata)
  341. {
  342. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  343. HAL_RX_TLV_PEER_META_DATA_GET(rx_pkt_tlvs) = peer_mdata;
  344. }
  345. /*
  346. * Get peer_meta_data from RX_MPDU_INFO within RX_MPDU_START
  347. */
  348. static inline uint32_t hal_rx_mpdu_peer_meta_data_get_be(uint8_t *buf)
  349. {
  350. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  351. return HAL_RX_TLV_PEER_META_DATA_GET(rx_pkt_tlvs);
  352. }
  353. /**
  354. * hal_rx_mpdu_info_ampdu_flag_get_be(): get ampdu flag bit
  355. * from rx mpdu info
  356. * @buf: pointer to rx_pkt_tlvs
  357. *
  358. * Return: ampdu flag
  359. */
  360. static inline bool hal_rx_mpdu_info_ampdu_flag_get_be(uint8_t *buf)
  361. {
  362. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  363. return !!HAL_RX_TLV_AMPDU_FLAG_GET(rx_pkt_tlvs);
  364. }
  365. /**
  366. * hal_rx_tlv_msdu_len_get(): API to get the MSDU length
  367. * from rx_msdu_start TLV
  368. *
  369. * @ buf: pointer to the start of RX PKT TLV headers
  370. * Return: msdu length
  371. */
  372. static inline uint32_t hal_rx_tlv_msdu_len_get_be(uint8_t *buf)
  373. {
  374. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  375. return HAL_RX_TLV_MSDU_LEN_GET(rx_pkt_tlvs);
  376. }
  377. /**
  378. * hal_rx_tlv_msdu_len_set(): API to set the MSDU length
  379. * from rx_msdu_start TLV
  380. *
  381. * @buf: pointer to the start of RX PKT TLV headers
  382. * @len: msdu length
  383. *
  384. * Return: none
  385. */
  386. static inline void hal_rx_tlv_msdu_len_set_be(uint8_t *buf, uint32_t len)
  387. {
  388. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  389. HAL_RX_TLV_MSDU_LEN_GET(rx_pkt_tlvs) = len;
  390. }
  391. /*
  392. * hal_rx_tlv_bw_get(): API to get the Bandwidth
  393. * Interval from rx_msdu_start
  394. *
  395. * @buf: pointer to the start of RX PKT TLV header
  396. * Return: uint32_t(bw)
  397. */
  398. static inline uint32_t hal_rx_tlv_bw_get_be(uint8_t *buf)
  399. {
  400. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  401. return HAL_RX_TLV_BW_GET(rx_pkt_tlvs);
  402. }
  403. /**
  404. * hal_rx_tlv_toeplitz_get: API to get the toeplitz hash
  405. * from rx_msdu_start TLV
  406. *
  407. * @ buf: pointer to the start of RX PKT TLV headers
  408. * Return: toeplitz hash
  409. */
  410. static inline uint32_t hal_rx_tlv_toeplitz_get_be(uint8_t *buf)
  411. {
  412. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  413. return HAL_RX_TLV_FLOWID_TOEPLITZ_GET(rx_pkt_tlvs);
  414. }
  415. /**
  416. * hal_rx_tlv_msdu_sgi_get(): API to get the Short Gaurd
  417. * Interval from rx_msdu_start TLV
  418. *
  419. * @buf: pointer to the start of RX PKT TLV headers
  420. * Return: uint32_t(sgi)
  421. */
  422. static inline uint32_t hal_rx_tlv_sgi_get_be(uint8_t *buf)
  423. {
  424. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  425. return HAL_RX_TLV_SGI_GET(rx_pkt_tlvs);
  426. }
  427. /**
  428. * hal_rx_tlv_msdu_rate_mcs_get(): API to get the MCS rate
  429. * from rx_msdu_start TLV
  430. *
  431. * @buf: pointer to the start of RX PKT TLV headers
  432. * Return: uint32_t(rate_mcs)
  433. */
  434. static inline uint32_t hal_rx_tlv_rate_mcs_get_be(uint8_t *buf)
  435. {
  436. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  437. uint32_t rate_mcs;
  438. rate_mcs = HAL_RX_TLV_RATE_MCS_GET(rx_pkt_tlvs);
  439. return rate_mcs;
  440. }
  441. /*
  442. * Get key index from RX_MSDU_END
  443. */
  444. /*
  445. * hal_rx_msdu_get_keyid(): API to get the key id if the decrypted packet
  446. * from rx_msdu_end
  447. *
  448. * @buf: pointer to the start of RX PKT TLV header
  449. * Return: uint32_t(key id)
  450. */
  451. static inline uint8_t hal_rx_msdu_get_keyid_be(uint8_t *buf)
  452. {
  453. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  454. uint32_t keyid_octet;
  455. keyid_octet = HAL_RX_TLV_KEYID_OCTET_GET(rx_pkt_tlvs);
  456. return keyid_octet & 0x3;
  457. }
  458. /*
  459. * hal_rx_tlv_get_rssi(): API to get the rssi of received pkt
  460. * from rx_msdu_start
  461. *
  462. * @buf: pointer to the start of RX PKT TLV header
  463. * Return: uint32_t(rssi)
  464. */
  465. static inline uint32_t hal_rx_tlv_get_rssi_be(uint8_t *buf)
  466. {
  467. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  468. uint32_t rssi;
  469. rssi = HAL_RX_TLV_RSSI_GET(rx_pkt_tlvs);
  470. return rssi;
  471. }
  472. /*
  473. * hal_rx_tlv_get_freq(): API to get the frequency of operating channel
  474. * from rx_msdu_start
  475. *
  476. * @buf: pointer to the start of RX PKT TLV header
  477. * Return: uint32_t(frequency)
  478. */
  479. static inline uint32_t hal_rx_tlv_get_freq_be(uint8_t *buf)
  480. {
  481. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  482. uint32_t freq;
  483. freq = HAL_RX_TLV_FREQ_GET(rx_pkt_tlvs);
  484. return freq;
  485. }
  486. /*
  487. * hal_rx_tlv_get_pkt_type(): API to get the pkt type
  488. * from rx_msdu_start
  489. *
  490. * @buf: pointer to the start of RX PKT TLV header
  491. * Return: uint32_t(pkt type)
  492. */
  493. static inline uint32_t hal_rx_tlv_get_pkt_type_be(uint8_t *buf)
  494. {
  495. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  496. uint32_t pkt_type;
  497. pkt_type = HAL_RX_TLV_PKT_TYPE_GET(rx_pkt_tlvs);
  498. return pkt_type;
  499. }
  500. /*******************************************************************************
  501. * RX ERROR APIS
  502. ******************************************************************************/
  503. /**
  504. * hal_rx_tlv_decrypt_err_get(): API to get the Decrypt ERR
  505. * from rx_mpdu_end TLV
  506. *
  507. * @buf: pointer to the start of RX PKT TLV headers
  508. * Return: uint32_t(decrypt_err)
  509. */
  510. static inline uint32_t hal_rx_tlv_decrypt_err_get_be(uint8_t *buf)
  511. {
  512. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  513. uint32_t decrypt_err;
  514. decrypt_err = HAL_RX_TLV_DECRYPT_ERR_GET(rx_pkt_tlvs);
  515. return decrypt_err;
  516. }
  517. /**
  518. * hal_rx_tlv_mic_err_get(): API to get the MIC ERR
  519. * from rx_tlv TLV
  520. *
  521. * @buf: pointer to the start of RX PKT TLV headers
  522. * Return: uint32_t(mic_err)
  523. */
  524. static inline uint32_t hal_rx_tlv_mic_err_get_be(uint8_t *buf)
  525. {
  526. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  527. uint32_t mic_err;
  528. mic_err = HAL_RX_TLV_MIC_ERR_GET(rx_pkt_tlvs);
  529. return mic_err;
  530. }
  531. /**
  532. * hal_rx_mpdu_sequence_number_get() - Get mpdu sequence number
  533. * @buf: pointer to packet buffer
  534. *
  535. * Return: mpdu sequence
  536. */
  537. static inline int hal_rx_mpdu_sequence_number_get_be(uint8_t *buf)
  538. {
  539. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  540. return HAL_RX_MPDU_SEQUENCE_NUMBER_GET(rx_pkt_tlvs);
  541. }
  542. /**
  543. * hal_rx_msdu_packet_metadata_get(): API to get the
  544. * msdu information from rx_msdu_end TLV
  545. *
  546. * @ buf: pointer to the start of RX PKT TLV headers
  547. * @ hal_rx_msdu_metadata: pointer to the msdu info structure
  548. */
  549. static inline void
  550. hal_rx_msdu_packet_metadata_get_generic_be(uint8_t *buf,
  551. void *pkt_msdu_metadata)
  552. {
  553. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  554. struct hal_rx_msdu_metadata *msdu_metadata =
  555. (struct hal_rx_msdu_metadata *)pkt_msdu_metadata;
  556. msdu_metadata->l3_hdr_pad =
  557. HAL_RX_TLV_L3_HEADER_PADDING_GET(rx_pkt_tlvs);
  558. msdu_metadata->sa_idx = HAL_RX_TLV_SA_IDX_GET(rx_pkt_tlvs);
  559. msdu_metadata->da_idx = HAL_RX_TLV_DA_IDX_GET(rx_pkt_tlvs);
  560. msdu_metadata->sa_sw_peer_id =
  561. HAL_RX_TLV_SA_SW_PEER_ID_GET(rx_pkt_tlvs);
  562. }
  563. /*
  564. * hal_rx_msdu_start_nss_get_7850(): API to get the NSS
  565. * Interval from rx_msdu_start
  566. *
  567. * @buf: pointer to the start of RX PKT TLV header
  568. * Return: uint32_t(nss)
  569. */
  570. static inline uint32_t hal_rx_tlv_nss_get_be(uint8_t *buf)
  571. {
  572. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  573. uint8_t mimo_ss_bitmap;
  574. mimo_ss_bitmap = HAL_RX_TLV_MIMO_SS_BITMAP(rx_pkt_tlvs);
  575. return qdf_get_hweight8(mimo_ss_bitmap);
  576. }
  577. #ifdef GET_MSDU_AGGREGATION
  578. #define HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs)\
  579. {\
  580. bool first_msdu, last_msdu; \
  581. first_msdu = HAL_RX_TLV_FIRST_MSDU_GET(rx_desc);\
  582. last_msdu = HAL_RX_TLV_LAST_MSDU_GET(rx_desc);\
  583. if (first_msdu && last_msdu)\
  584. rs->rs_flags &= (~IEEE80211_AMSDU_FLAG);\
  585. else\
  586. rs->rs_flags |= (IEEE80211_AMSDU_FLAG); \
  587. } \
  588. #define HAL_RX_SET_MSDU_AGGREGATION((rs_mpdu), (rs_ppdu))\
  589. {\
  590. if (rs_mpdu->rs_flags & IEEE80211_AMSDU_FLAG)\
  591. rs_ppdu->rs_flags |= IEEE80211_AMSDU_FLAG;\
  592. } \
  593. #else
  594. #define HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs)
  595. #define HAL_RX_SET_MSDU_AGGREGATION(rs_mpdu, rs_ppdu)
  596. #endif
  597. /**
  598. * hal_rx_mon_hw_desc_get_mpdu_status_be(): Retrieve MPDU status
  599. *
  600. * @ hw_desc_addr: Start address of Rx HW TLVs
  601. * @ rs: Status for monitor mode
  602. *
  603. * Return: void
  604. */
  605. static inline void
  606. hal_rx_mon_hw_desc_get_mpdu_status_be(void *hw_desc_addr,
  607. struct mon_rx_status *rs)
  608. {
  609. uint32_t reg_value;
  610. struct rx_pkt_tlvs *rx_desc =
  611. (struct rx_pkt_tlvs *)hw_desc_addr;
  612. const uint32_t sgi_hw_to_cdp[] = {
  613. CDP_SGI_0_8_US,
  614. CDP_SGI_0_4_US,
  615. CDP_SGI_1_6_US,
  616. CDP_SGI_3_2_US,
  617. };
  618. HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs);
  619. rs->ant_signal_db = HAL_RX_TLV_ANT_SIGNAL_DB_GET(rx_desc);
  620. rs->is_stbc = HAL_RX_TLV_STBC_GET(rx_desc);
  621. reg_value = HAL_RX_TLV_SGI_GET(rx_desc);
  622. rs->sgi = sgi_hw_to_cdp[reg_value];
  623. reg_value = HAL_RX_TLV_RECEPTION_TYPE_GET(rx_desc);
  624. rs->beamformed = (reg_value == HAL_RX_RECEPTION_TYPE_MU_MIMO) ? 1 : 0;
  625. /* TODO: rs->beamformed should be set for SU beamforming also */
  626. }
  627. static inline uint32_t hal_rx_tlv_tid_get_be(uint8_t *buf)
  628. {
  629. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  630. uint32_t tid;
  631. tid = HAL_RX_TLV_TID_GET(rx_pkt_tlvs);
  632. return tid;
  633. }
  634. /*
  635. * hal_rx_tlv_reception_type_get(): API to get the reception type
  636. * Interval from rx_msdu_start
  637. *
  638. * @buf: pointer to the start of RX PKT TLV header
  639. * Return: uint32_t(reception_type)
  640. */
  641. static inline
  642. uint32_t hal_rx_tlv_reception_type_get_be(uint8_t *buf)
  643. {
  644. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  645. uint32_t reception_type;
  646. reception_type = HAL_RX_TLV_RECEPTION_TYPE_GET(rx_pkt_tlvs);
  647. return reception_type;
  648. }
  649. /**
  650. * hal_rx_msdu_end_da_idx_get_be: API to get da_idx
  651. * from rx_msdu_end TLV
  652. *
  653. * @ buf: pointer to the start of RX PKT TLV headers
  654. * Return: da index
  655. */
  656. static inline uint16_t hal_rx_msdu_end_da_idx_get_be(uint8_t *buf)
  657. {
  658. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  659. uint16_t da_idx;
  660. da_idx = HAL_RX_TLV_DA_IDX_GET(rx_pkt_tlvs);
  661. return da_idx;
  662. }
  663. /**
  664. * hal_rx_get_rx_fragment_number_be(): Function to retrieve rx fragment number
  665. *
  666. * @nbuf: Network buffer
  667. * Returns: rx fragment number
  668. */
  669. static inline
  670. uint8_t hal_rx_get_rx_fragment_number_be(uint8_t *buf)
  671. {
  672. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  673. /* Return first 4 bits as fragment number */
  674. return (HAL_RX_MPDU_SEQUENCE_NUMBER_GET(rx_pkt_tlvs) &
  675. DOT11_SEQ_FRAG_MASK);
  676. }
  677. /**
  678. * hal_rx_msdu_end_da_is_mcbc_get_be(): API to check if pkt is MCBC
  679. * from rx_msdu_end TLV
  680. *
  681. * @ buf: pointer to the start of RX PKT TLV headers
  682. * Return: da_is_mcbc
  683. */
  684. static inline uint8_t
  685. hal_rx_tlv_da_is_mcbc_get_be(uint8_t *buf)
  686. {
  687. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  688. return HAL_RX_TLV_DA_IS_MCBC_GET(rx_pkt_tlvs);
  689. }
  690. /**
  691. * hal_rx_tlvd_sa_is_valid_get_be(): API to get the sa_is_valid bit from
  692. * rx_msdu_end TLV
  693. *
  694. * @ buf: pointer to the start of RX PKT TLV headers
  695. * Return: sa_is_valid bit
  696. */
  697. static inline uint8_t
  698. hal_rx_tlv_sa_is_valid_get_be(uint8_t *buf)
  699. {
  700. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  701. uint8_t sa_is_valid;
  702. sa_is_valid = HAL_RX_TLV_SA_IS_VALID_GET(rx_pkt_tlvs);
  703. return sa_is_valid;
  704. }
  705. /**
  706. * hal_rx_tlv_sa_idx_get_be(): API to get the sa_idx from rx_msdu_end TLV
  707. *
  708. * @ buf: pointer to the start of RX PKT TLV headers
  709. * Return: sa_idx (SA AST index)
  710. */
  711. static inline
  712. uint16_t hal_rx_tlv_sa_idx_get_be(uint8_t *buf)
  713. {
  714. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  715. uint16_t sa_idx;
  716. sa_idx = HAL_RX_TLV_SA_IDX_GET(rx_pkt_tlvs);
  717. return sa_idx;
  718. }
  719. /**
  720. * hal_rx_desc_is_first_msdu_be() - Check if first msdu
  721. *
  722. * @hal_soc_hdl: hal_soc handle
  723. * @hw_desc_addr: hardware descriptor address
  724. *
  725. * Return: 0 - success/ non-zero failure
  726. */
  727. static inline uint32_t hal_rx_desc_is_first_msdu_be(void *hw_desc_addr)
  728. {
  729. struct rx_pkt_tlvs *rx_pkt_tlvs =
  730. (struct rx_pkt_tlvs *)hw_desc_addr;
  731. return HAL_RX_TLV_FIRST_MSDU_GET(rx_pkt_tlvs);
  732. }
  733. /**
  734. * hal_rx_tlv_l3_hdr_padding_get_be(): API to get the l3_header padding
  735. * from rx_msdu_end TLV
  736. *
  737. * @ buf: pointer to the start of RX PKT TLV headers
  738. * Return: number of l3 header padding bytes
  739. */
  740. static inline uint32_t hal_rx_tlv_l3_hdr_padding_get_be(uint8_t *buf)
  741. {
  742. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  743. uint32_t l3_header_padding;
  744. l3_header_padding = HAL_RX_TLV_L3_HEADER_PADDING_GET(rx_pkt_tlvs);
  745. return l3_header_padding;
  746. }
  747. /*
  748. * @ hal_rx_encryption_info_valid_be: Returns encryption type.
  749. *
  750. * @ buf: rx_tlv_hdr of the received packet
  751. * @ Return: encryption type
  752. */
  753. static inline uint32_t hal_rx_encryption_info_valid_be(uint8_t *buf)
  754. {
  755. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  756. uint32_t encryption_info =
  757. HAL_RX_TLV_MPDU_ENCRYPTION_INFO_VALID(rx_pkt_tlvs);
  758. return encryption_info;
  759. }
  760. /*
  761. * @ hal_rx_print_pn_be: Prints the PN of rx packet.
  762. *
  763. * @ buf: rx_tlv_hdr of the received packet
  764. * @ Return: void
  765. */
  766. static inline void hal_rx_print_pn_be(uint8_t *buf)
  767. {
  768. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  769. uint32_t pn_31_0 = HAL_RX_TLV_MPDU_PN_31_0_GET(rx_pkt_tlvs);
  770. uint32_t pn_63_32 = HAL_RX_TLV_MPDU_PN_63_32_GET(rx_pkt_tlvs);
  771. uint32_t pn_95_64 = HAL_RX_TLV_MPDU_PN_95_64_GET(rx_pkt_tlvs);
  772. uint32_t pn_127_96 = HAL_RX_TLV_MPDU_PN_127_96_GET(rx_pkt_tlvs);
  773. hal_debug("PN number pn_127_96 0x%x pn_95_64 0x%x pn_63_32 0x%x pn_31_0 0x%x ",
  774. pn_127_96, pn_95_64, pn_63_32, pn_31_0);
  775. }
  776. static inline void hal_rx_tlv_get_pn_num_be(uint8_t *buf, uint64_t *pn_num)
  777. {
  778. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  779. pn_num[0] = HAL_RX_TLV_MPDU_PN_31_0_GET(rx_pkt_tlvs);
  780. pn_num[0] |= ((uint64_t)HAL_RX_TLV_MPDU_PN_63_32_GET(rx_pkt_tlvs) << 32);
  781. pn_num[1] = HAL_RX_TLV_MPDU_PN_95_64_GET(rx_pkt_tlvs);
  782. pn_num[1] |= ((uint64_t)HAL_RX_TLV_MPDU_PN_127_96_GET(rx_pkt_tlvs) << 32);
  783. }
  784. /**
  785. * hal_rx_tlv_first_msdu_get_be: API to get first msdu status
  786. * from rx_msdu_end TLV
  787. *
  788. * @ buf: pointer to the start of RX PKT TLV headers
  789. * Return: first_msdu
  790. */
  791. static inline uint8_t hal_rx_tlv_first_msdu_get_be(uint8_t *buf)
  792. {
  793. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  794. uint8_t first_msdu;
  795. first_msdu = HAL_RX_TLV_FIRST_MSDU_GET(rx_pkt_tlvs);
  796. return first_msdu;
  797. }
  798. /**
  799. * hal_rx_tlv_da_is_valid_get_be: API to check if da is valid
  800. * from rx_msdu_end TLV
  801. *
  802. * @ buf: pointer to the start of RX PKT TLV headers
  803. * Return: da_is_valid
  804. */
  805. static inline uint8_t hal_rx_tlv_da_is_valid_get_be(uint8_t *buf)
  806. {
  807. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  808. uint8_t da_is_valid;
  809. da_is_valid = HAL_RX_TLV_DA_IS_VALID_GET(rx_pkt_tlvs);
  810. return da_is_valid;
  811. }
  812. /**
  813. * hal_rx_tlv_last_msdu_get_be: API to get last msdu status
  814. * from rx_msdu_end TLV
  815. *
  816. * @ buf: pointer to the start of RX PKT TLV headers
  817. * Return: last_msdu
  818. */
  819. static inline uint8_t hal_rx_tlv_last_msdu_get_be(uint8_t *buf)
  820. {
  821. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  822. uint8_t last_msdu;
  823. last_msdu = HAL_RX_TLV_LAST_MSDU_GET(rx_pkt_tlvs);
  824. return last_msdu;
  825. }
  826. /*
  827. * hal_rx_get_mpdu_mac_ad4_valid_be(): Retrieves if mpdu 4th addr is valid
  828. *
  829. * @nbuf: Network buffer
  830. * Returns: value of mpdu 4th address valid field
  831. */
  832. static inline bool hal_rx_get_mpdu_mac_ad4_valid_be(uint8_t *buf)
  833. {
  834. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  835. bool ad4_valid = 0;
  836. ad4_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD4_VALID_GET(rx_pkt_tlvs);
  837. return ad4_valid;
  838. }
  839. /**
  840. * hal_rx_mpdu_start_sw_peer_id_get_be: Retrieve sw peer_id
  841. * @buf: network buffer
  842. *
  843. * Return: sw peer_id
  844. */
  845. static inline uint32_t hal_rx_mpdu_start_sw_peer_id_get_be(uint8_t *buf)
  846. {
  847. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  848. return HAL_RX_TLV_SW_PEER_ID_GET(rx_pkt_tlvs);
  849. }
  850. /**
  851. * hal_rx_mpdu_get_to_ds_be(): API to get the tods info
  852. * from rx_mpdu_start
  853. *
  854. * @buf: pointer to the start of RX PKT TLV header
  855. * Return: uint32_t(to_ds)
  856. */
  857. static inline uint32_t hal_rx_mpdu_get_to_ds_be(uint8_t *buf)
  858. {
  859. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  860. return HAL_RX_TLV_MPDU_GET_TODS(rx_pkt_tlvs);
  861. }
  862. /*
  863. * hal_rx_mpdu_get_fr_ds_be(): API to get the from ds info
  864. * from rx_mpdu_start
  865. *
  866. * @buf: pointer to the start of RX PKT TLV header
  867. * Return: uint32_t(fr_ds)
  868. */
  869. static inline uint32_t hal_rx_mpdu_get_fr_ds_be(uint8_t *buf)
  870. {
  871. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  872. return HAL_RX_TLV_MPDU_GET_FROMDS(rx_pkt_tlvs);
  873. }
  874. /*
  875. * hal_rx_get_mpdu_frame_control_valid_be(): Retrieves mpdu
  876. * frame control valid
  877. *
  878. * @nbuf: Network buffer
  879. * Returns: value of frame control valid field
  880. */
  881. static inline uint8_t hal_rx_get_mpdu_frame_control_valid_be(uint8_t *buf)
  882. {
  883. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  884. return HAL_RX_TLV_MPDU_GET_FRAME_CONTROL_VALID(rx_pkt_tlvs);
  885. }
  886. /*
  887. * hal_rx_mpdu_get_addr1_be(): API to check get address1 of the mpdu
  888. *
  889. * @buf: pointer to the start of RX PKT TLV headera
  890. * @mac_addr: pointer to mac address
  891. * Return: success/failure
  892. */
  893. static inline QDF_STATUS hal_rx_mpdu_get_addr1_be(uint8_t *buf,
  894. uint8_t *mac_addr)
  895. {
  896. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  897. struct __attribute__((__packed__)) hal_addr1 {
  898. uint32_t ad1_31_0;
  899. uint16_t ad1_47_32;
  900. };
  901. struct hal_addr1 *addr = (struct hal_addr1 *)mac_addr;
  902. uint32_t mac_addr_ad1_valid;
  903. mac_addr_ad1_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD1_VALID_GET(rx_pkt_tlvs);
  904. if (mac_addr_ad1_valid) {
  905. addr->ad1_31_0 = HAL_RX_TLV_MPDU_AD1_31_0_GET(rx_pkt_tlvs);
  906. addr->ad1_47_32 = HAL_RX_TLV_MPDU_AD1_47_32_GET(rx_pkt_tlvs);
  907. return QDF_STATUS_SUCCESS;
  908. }
  909. return QDF_STATUS_E_FAILURE;
  910. }
  911. /*
  912. * hal_rx_mpdu_get_addr2_be(): API to check get address2 of the mpdu
  913. * in the packet
  914. *
  915. * @buf: pointer to the start of RX PKT TLV header
  916. * @mac_addr: pointer to mac address
  917. * Return: success/failure
  918. */
  919. static inline QDF_STATUS hal_rx_mpdu_get_addr2_be(uint8_t *buf,
  920. uint8_t *mac_addr)
  921. {
  922. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  923. struct __attribute__((__packed__)) hal_addr2 {
  924. uint16_t ad2_15_0;
  925. uint32_t ad2_47_16;
  926. };
  927. struct hal_addr2 *addr = (struct hal_addr2 *)mac_addr;
  928. uint32_t mac_addr_ad2_valid;
  929. mac_addr_ad2_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD2_VALID_GET(rx_pkt_tlvs);
  930. if (mac_addr_ad2_valid) {
  931. addr->ad2_15_0 = HAL_RX_TLV_MPDU_AD2_15_0_GET(rx_pkt_tlvs);
  932. addr->ad2_47_16 = HAL_RX_TLV_MPDU_AD2_47_16_GET(rx_pkt_tlvs);
  933. return QDF_STATUS_SUCCESS;
  934. }
  935. return QDF_STATUS_E_FAILURE;
  936. }
  937. /*
  938. * hal_rx_mpdu_get_addr3_be(): API to get address3 of the mpdu
  939. * in the packet
  940. *
  941. * @buf: pointer to the start of RX PKT TLV header
  942. * @mac_addr: pointer to mac address
  943. * Return: success/failure
  944. */
  945. static inline QDF_STATUS hal_rx_mpdu_get_addr3_be(uint8_t *buf,
  946. uint8_t *mac_addr)
  947. {
  948. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  949. struct __attribute__((__packed__)) hal_addr3 {
  950. uint32_t ad3_31_0;
  951. uint16_t ad3_47_32;
  952. };
  953. struct hal_addr3 *addr = (struct hal_addr3 *)mac_addr;
  954. uint32_t mac_addr_ad3_valid;
  955. mac_addr_ad3_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD3_VALID_GET(rx_pkt_tlvs);
  956. if (mac_addr_ad3_valid) {
  957. addr->ad3_31_0 = HAL_RX_TLV_MPDU_AD3_31_0_GET(rx_pkt_tlvs);
  958. addr->ad3_47_32 = HAL_RX_TLV_MPDU_AD3_47_32_GET(rx_pkt_tlvs);
  959. return QDF_STATUS_SUCCESS;
  960. }
  961. return QDF_STATUS_E_FAILURE;
  962. }
  963. /*
  964. * hal_rx_mpdu_get_addr4_be(): API to get address4 of the mpdu
  965. * in the packet
  966. *
  967. * @buf: pointer to the start of RX PKT TLV header
  968. * @mac_addr: pointer to mac address
  969. * Return: success/failure
  970. */
  971. static inline QDF_STATUS hal_rx_mpdu_get_addr4_be(uint8_t *buf,
  972. uint8_t *mac_addr)
  973. {
  974. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  975. struct __attribute__((__packed__)) hal_addr4 {
  976. uint32_t ad4_31_0;
  977. uint16_t ad4_47_32;
  978. };
  979. struct hal_addr4 *addr = (struct hal_addr4 *)mac_addr;
  980. uint32_t mac_addr_ad4_valid;
  981. mac_addr_ad4_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD4_VALID_GET(rx_pkt_tlvs);
  982. if (mac_addr_ad4_valid) {
  983. addr->ad4_31_0 = HAL_RX_TLV_MPDU_AD4_31_0_GET(rx_pkt_tlvs);
  984. addr->ad4_47_32 = HAL_RX_TLV_MPDU_AD4_47_32_GET(rx_pkt_tlvs);
  985. return QDF_STATUS_SUCCESS;
  986. }
  987. return QDF_STATUS_E_FAILURE;
  988. }
  989. /*
  990. * hal_rx_get_mpdu_sequence_control_valid_be(): Get mpdu
  991. * sequence control valid
  992. *
  993. * @nbuf: Network buffer
  994. * Returns: value of sequence control valid field
  995. */
  996. static inline uint8_t hal_rx_get_mpdu_sequence_control_valid_be(uint8_t *buf)
  997. {
  998. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  999. return HAL_RX_TLV_MPDU_GET_SEQUENCE_CONTROL_VALID(rx_pkt_tlvs);
  1000. }
  1001. /**
  1002. * hal_rx_tid_get_be: get tid based on qos control valid.
  1003. * @hal_soc_hdl: hal_soc handle
  1004. * @ buf: pointer to rx pkt TLV.
  1005. *
  1006. * Return: tid
  1007. */
  1008. static inline uint32_t hal_rx_tid_get_be(hal_soc_handle_t hal_soc_hdl,
  1009. uint8_t *buf)
  1010. {
  1011. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1012. uint8_t qos_control_valid =
  1013. HAL_RX_TLV_MPDU_QOS_CONTROL_VALID_GET(rx_pkt_tlvs);
  1014. if (qos_control_valid)
  1015. return hal_rx_tlv_tid_get_be(buf);
  1016. return HAL_RX_NON_QOS_TID;
  1017. }
  1018. static inline
  1019. uint8_t hal_rx_get_fc_valid_be(uint8_t *buf)
  1020. {
  1021. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1022. return HAL_RX_GET_FC_VALID(rx_pkt_tlvs);
  1023. }
  1024. static inline uint8_t hal_rx_get_to_ds_flag_be(uint8_t *buf)
  1025. {
  1026. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1027. return HAL_RX_GET_TO_DS_FLAG(rx_pkt_tlvs);
  1028. }
  1029. static inline uint8_t hal_rx_get_mac_addr2_valid_be(uint8_t *buf)
  1030. {
  1031. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1032. return HAL_RX_TLV_MPDU_MAC_ADDR_AD2_VALID_GET(rx_pkt_tlvs);
  1033. }
  1034. /**
  1035. * hal_rx_is_unicast_be: check packet is unicast frame or not.
  1036. *
  1037. * @ buf: pointer to rx pkt TLV.
  1038. * Return: true on unicast.
  1039. */
  1040. static inline bool hal_rx_is_unicast_be(uint8_t *buf)
  1041. {
  1042. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1043. uint32_t grp_id;
  1044. grp_id = HAL_RX_TLV_SW_FRAME_GROUP_ID_GET(rx_pkt_tlvs);
  1045. return (HAL_MPDU_SW_FRAME_GROUP_UNICAST_DATA == grp_id) ? true : false;
  1046. }
  1047. static inline uint8_t hal_rx_get_filter_category_be(uint8_t *buf)
  1048. {
  1049. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1050. return HAL_RX_GET_FILTER_CATEGORY(rx_pkt_tlvs);
  1051. }
  1052. /**
  1053. * hal_rx_hw_desc_get_ppduid_get_be(): retrieve ppdu id
  1054. * @rx_tlv_hdr: start address of rx_pkt_tlvs
  1055. * @rxdma_dst_ring_desc: Rx HW descriptor
  1056. *
  1057. * Return: ppdu id
  1058. */
  1059. static inline uint32_t
  1060. hal_rx_hw_desc_get_ppduid_get_be(void *rx_tlv_hdr, void *rxdma_dst_ring_desc)
  1061. {
  1062. struct rx_pkt_tlvs *rx_pkt_tlvs =
  1063. (struct rx_pkt_tlvs *)rx_tlv_hdr;
  1064. return HAL_RX_TLV_PHY_PPDU_ID_GET(rx_pkt_tlvs);
  1065. }
  1066. static inline uint32_t
  1067. hal_rx_get_ppdu_id_be(uint8_t *buf)
  1068. {
  1069. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1070. return HAL_RX_GET_PPDU_ID(rx_pkt_tlvs);
  1071. }
  1072. /**
  1073. * hal_rx_msdu_flow_idx_get_be: API to get flow index
  1074. * from rx_msdu_end TLV
  1075. * @buf: pointer to the start of RX PKT TLV headers
  1076. *
  1077. * Return: flow index value from MSDU END TLV
  1078. */
  1079. static inline uint32_t hal_rx_msdu_flow_idx_get_be(uint8_t *buf)
  1080. {
  1081. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1082. return HAL_RX_TLV_FLOW_IDX_GET(pkt_tlvs);
  1083. }
  1084. /**
  1085. * hal_rx_msdu_get_reo_destination_indication_be: API to get
  1086. * reo_destination_indication from rx_msdu_end TLV
  1087. * @buf: pointer to the start of RX PKT TLV headers
  1088. * @reo_destination_indication: pointer to return value of
  1089. * reo_destination_indication
  1090. *
  1091. * Return: none
  1092. */
  1093. static inline void
  1094. hal_rx_msdu_get_reo_destination_indication_be(uint8_t *buf,
  1095. uint32_t *reo_destination_indication)
  1096. {
  1097. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1098. *reo_destination_indication = HAL_RX_TLV_REO_DEST_IND_GET(pkt_tlvs);
  1099. }
  1100. /**
  1101. * hal_rx_msdu_flow_idx_invalid_be: API to get flow index invalid
  1102. * from rx_msdu_end TLV
  1103. * @buf: pointer to the start of RX PKT TLV headers
  1104. *
  1105. * Return: flow index invalid value from MSDU END TLV
  1106. */
  1107. static inline bool hal_rx_msdu_flow_idx_invalid_be(uint8_t *buf)
  1108. {
  1109. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1110. return HAL_RX_TLV_FLOW_IDX_INVALID_GET(pkt_tlvs);
  1111. }
  1112. /**
  1113. * hal_rx_msdu_flow_idx_timeout_be: API to get flow index timeout
  1114. * from rx_msdu_end TLV
  1115. * @buf: pointer to the start of RX PKT TLV headers
  1116. *
  1117. * Return: flow index timeout value from MSDU END TLV
  1118. */
  1119. static inline bool hal_rx_msdu_flow_idx_timeout_be(uint8_t *buf)
  1120. {
  1121. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1122. return HAL_RX_TLV_FLOW_IDX_TIMEOUT_GET(pkt_tlvs);
  1123. }
  1124. /**
  1125. * hal_rx_msdu_fse_metadata_get_be: API to get FSE metadata
  1126. * from rx_msdu_end TLV
  1127. * @buf: pointer to the start of RX PKT TLV headers
  1128. *
  1129. * Return: fse metadata value from MSDU END TLV
  1130. */
  1131. static inline uint32_t hal_rx_msdu_fse_metadata_get_be(uint8_t *buf)
  1132. {
  1133. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1134. return HAL_RX_TLV_FSE_METADATA_GET(pkt_tlvs);
  1135. }
  1136. /**
  1137. * hal_rx_msdu_cce_metadata_get_be: API to get CCE metadata
  1138. * from rx_msdu_end TLV
  1139. * @buf: pointer to the start of RX PKT TLV headers
  1140. *
  1141. * Return: cce_metadata
  1142. */
  1143. static inline uint16_t
  1144. hal_rx_msdu_cce_metadata_get_be(uint8_t *buf)
  1145. {
  1146. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1147. return HAL_RX_TLV_CCE_METADATA_GET(pkt_tlvs);
  1148. }
  1149. /**
  1150. * hal_rx_msdu_get_flow_params_be: API to get flow index, flow index invalid
  1151. * and flow index timeout from rx_msdu_end TLV
  1152. * @buf: pointer to the start of RX PKT TLV headers
  1153. * @flow_invalid: pointer to return value of flow_idx_valid
  1154. * @flow_timeout: pointer to return value of flow_idx_timeout
  1155. * @flow_index: pointer to return value of flow_idx
  1156. *
  1157. * Return: none
  1158. */
  1159. static inline void
  1160. hal_rx_msdu_get_flow_params_be(uint8_t *buf,
  1161. bool *flow_invalid,
  1162. bool *flow_timeout,
  1163. uint32_t *flow_index)
  1164. {
  1165. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1166. *flow_invalid = HAL_RX_TLV_FLOW_IDX_INVALID_GET(pkt_tlvs);
  1167. *flow_timeout = HAL_RX_TLV_FLOW_IDX_TIMEOUT_GET(pkt_tlvs);
  1168. *flow_index = HAL_RX_TLV_FLOW_IDX_GET(pkt_tlvs);
  1169. }
  1170. /**
  1171. * hal_rx_tlv_get_tcp_chksum_be() - API to get tcp checksum
  1172. * @buf: rx_tlv_hdr
  1173. *
  1174. * Return: tcp checksum
  1175. */
  1176. static inline uint16_t
  1177. hal_rx_tlv_get_tcp_chksum_be(uint8_t *buf)
  1178. {
  1179. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1180. return HAL_RX_TLV_GET_TCP_CHKSUM(rx_pkt_tlvs);
  1181. }
  1182. /**
  1183. * hal_rx_get_rx_sequence_be(): Function to retrieve rx sequence number
  1184. *
  1185. * @nbuf: Network buffer
  1186. * Returns: rx sequence number
  1187. */
  1188. static inline
  1189. uint16_t hal_rx_get_rx_sequence_be(uint8_t *buf)
  1190. {
  1191. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1192. return HAL_RX_MPDU_SEQUENCE_NUMBER_GET(rx_pkt_tlvs);
  1193. }
  1194. #ifdef RECEIVE_OFFLOAD
  1195. /**
  1196. * hal_rx_get_fisa_cumulative_l4_checksum_be() - Retrieve cumulative
  1197. * checksum
  1198. * @buf: buffer pointer
  1199. *
  1200. * Return: cumulative checksum
  1201. */
  1202. static inline
  1203. uint16_t hal_rx_get_fisa_cumulative_l4_checksum_be(uint8_t *buf)
  1204. {
  1205. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1206. return HAL_RX_TLV_GET_FISA_CUMULATIVE_L4_CHECKSUM(rx_pkt_tlvs);
  1207. }
  1208. /**
  1209. * hal_rx_get_fisa_cumulative_ip_length_be() - Retrieve cumulative
  1210. * ip length
  1211. * @buf: buffer pointer
  1212. *
  1213. * Return: cumulative length
  1214. */
  1215. static inline
  1216. uint16_t hal_rx_get_fisa_cumulative_ip_length_be(uint8_t *buf)
  1217. {
  1218. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1219. return HAL_RX_TLV_GET_FISA_CUMULATIVE_IP_LENGTH(rx_pkt_tlvs);
  1220. }
  1221. /**
  1222. * hal_rx_get_udp_proto_be() - Retrieve udp proto value
  1223. * @buf: buffer
  1224. *
  1225. * Return: udp proto bit
  1226. */
  1227. static inline
  1228. bool hal_rx_get_udp_proto_be(uint8_t *buf)
  1229. {
  1230. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1231. return HAL_RX_TLV_GET_UDP_PROTO(rx_pkt_tlvs);
  1232. }
  1233. #endif
  1234. /**
  1235. * hal_rx_get_flow_agg_continuation_be() - retrieve flow agg
  1236. * continuation
  1237. * @buf: buffer
  1238. *
  1239. * Return: flow agg
  1240. */
  1241. static inline
  1242. bool hal_rx_get_flow_agg_continuation_be(uint8_t *buf)
  1243. {
  1244. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1245. return HAL_RX_TLV_GET_FLOW_AGGR_CONT(rx_pkt_tlvs);
  1246. }
  1247. /**
  1248. * hal_rx_get_flow_agg_count_be()- Retrieve flow agg count
  1249. * @buf: buffer
  1250. *
  1251. * Return: flow agg count
  1252. */
  1253. static inline
  1254. uint8_t hal_rx_get_flow_agg_count_be(uint8_t *buf)
  1255. {
  1256. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1257. return HAL_RX_TLV_GET_FLOW_AGGR_COUNT(rx_pkt_tlvs);
  1258. }
  1259. /**
  1260. * hal_rx_get_fisa_timeout_be() - Retrieve fisa timeout
  1261. * @buf: buffer
  1262. *
  1263. * Return: fisa timeout
  1264. */
  1265. static inline
  1266. bool hal_rx_get_fisa_timeout_be(uint8_t *buf)
  1267. {
  1268. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1269. return HAL_RX_TLV_GET_FISA_TIMEOUT(rx_pkt_tlvs);
  1270. }
  1271. /**
  1272. * hal_rx_mpdu_start_tlv_tag_valid_be () - API to check if RX_MPDU_START
  1273. * tlv tag is valid
  1274. *
  1275. *@rx_tlv_hdr: start address of rx_pkt_tlvs
  1276. *
  1277. * Return: true if RX_MPDU_START is valied, else false.
  1278. */
  1279. static inline uint8_t hal_rx_mpdu_start_tlv_tag_valid_be(void *rx_tlv_hdr)
  1280. {
  1281. struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr;
  1282. uint32_t tlv_tag;
  1283. tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(&rx_desc->mpdu_start_tlv);
  1284. return tlv_tag == WIFIRX_MPDU_START_E ? true : false;
  1285. }
  1286. /**
  1287. * hal_rx_msdu_end_offset_get_generic(): API to get the
  1288. * msdu_end structure offset rx_pkt_tlv structure
  1289. *
  1290. * NOTE: API returns offset of msdu_end TLV from structure
  1291. * rx_pkt_tlvs
  1292. */
  1293. static inline uint32_t hal_rx_msdu_end_offset_get_generic(void)
  1294. {
  1295. return RX_PKT_TLV_OFFSET(msdu_end_tlv);
  1296. }
  1297. /**
  1298. * hal_rx_mpdu_start_offset_get_generic(): API to get the
  1299. * mpdu_start structure offset rx_pkt_tlv structure
  1300. *
  1301. * NOTE: API returns offset of attn TLV from structure
  1302. * rx_pkt_tlvs
  1303. */
  1304. static inline uint32_t hal_rx_mpdu_start_offset_get_generic(void)
  1305. {
  1306. return RX_PKT_TLV_OFFSET(mpdu_start_tlv);
  1307. }
  1308. static inline uint32_t hal_rx_pkt_tlv_offset_get_generic(void)
  1309. {
  1310. return RX_PKT_TLV_OFFSET(pkt_hdr_tlv);
  1311. }
  1312. #ifdef RECEIVE_OFFLOAD
  1313. static inline int
  1314. hal_rx_tlv_get_offload_info_be(uint8_t *rx_tlv,
  1315. struct hal_offload_info *offload_info)
  1316. {
  1317. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)rx_tlv;
  1318. offload_info->lro_eligible = HAL_RX_TLV_GET_LRO_ELIGIBLE(rx_pkt_tlvs);
  1319. offload_info->flow_id = HAL_RX_TLV_GET_FLOW_ID_TOEPLITZ(rx_pkt_tlvs);
  1320. offload_info->ipv6_proto = HAL_RX_TLV_GET_IPV6(rx_pkt_tlvs);
  1321. offload_info->tcp_proto = HAL_RX_TLV_GET_TCP_PROTO(rx_pkt_tlvs);
  1322. if (offload_info->tcp_proto) {
  1323. offload_info->tcp_pure_ack =
  1324. HAL_RX_TLV_GET_TCP_PURE_ACK(rx_pkt_tlvs);
  1325. offload_info->tcp_offset =
  1326. HAL_RX_TLV_GET_TCP_OFFSET(rx_pkt_tlvs);
  1327. offload_info->tcp_win = HAL_RX_TLV_GET_TCP_WIN(rx_pkt_tlvs);
  1328. offload_info->tcp_seq_num = HAL_RX_TLV_GET_TCP_SEQ(rx_pkt_tlvs);
  1329. offload_info->tcp_ack_num = HAL_RX_TLV_GET_TCP_ACK(rx_pkt_tlvs);
  1330. }
  1331. return 0;
  1332. }
  1333. static inline int hal_rx_get_proto_params_be(uint8_t *buf, void *proto_params)
  1334. {
  1335. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1336. struct hal_proto_params *param =
  1337. (struct hal_proto_params *)proto_params;
  1338. param->tcp_proto = HAL_RX_TLV_GET_IP_OFFSET(rx_pkt_tlvs);
  1339. param->udp_proto = HAL_RX_TLV_GET_UDP_PROTO(rx_pkt_tlvs);
  1340. param->ipv6_proto = HAL_RX_TLV_GET_IPV6(rx_pkt_tlvs);
  1341. return 0;
  1342. }
  1343. static inline int hal_rx_get_l3_l4_offsets_be(uint8_t *buf,
  1344. uint32_t *l3_hdr_offset,
  1345. uint32_t *l4_hdr_offset)
  1346. {
  1347. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1348. *l3_hdr_offset = HAL_RX_TLV_GET_IP_OFFSET(rx_pkt_tlvs);
  1349. *l4_hdr_offset = HAL_RX_TLV_GET_TCP_OFFSET(rx_pkt_tlvs);
  1350. return 0;
  1351. }
  1352. #endif
  1353. /**
  1354. * hal_rx_msdu_start_msdu_len_get(): API to get the MSDU length
  1355. * from rx_msdu_start TLV
  1356. *
  1357. * @ buf: pointer to the start of RX PKT TLV headers
  1358. * Return: msdu length
  1359. */
  1360. static inline uint32_t hal_rx_msdu_start_msdu_len_get_be(uint8_t *buf)
  1361. {
  1362. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1363. uint32_t msdu_len;
  1364. msdu_len = HAL_RX_TLV_MSDU_LEN_GET(rx_pkt_tlvs);
  1365. return msdu_len;
  1366. }
  1367. /**
  1368. * hal_rx_get_frame_ctrl_field(): Function to retrieve frame control field
  1369. *
  1370. * @nbuf: Network buffer
  1371. * Returns: rx more fragment bit
  1372. *
  1373. */
  1374. static inline uint16_t hal_rx_get_frame_ctrl_field_be(uint8_t *buf)
  1375. {
  1376. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1377. uint16_t frame_ctrl = 0;
  1378. frame_ctrl = HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(rx_pkt_tlvs);
  1379. return frame_ctrl;
  1380. }
  1381. /*
  1382. * hal_rx_tlv_get_is_decrypted_be(): API to get the decrypt status of the
  1383. * packet from msdu_end
  1384. *
  1385. * @buf: pointer to the start of RX PKT TLV header
  1386. * Return: uint32_t(decryt status)
  1387. */
  1388. static inline uint32_t hal_rx_tlv_get_is_decrypted_be(uint8_t *buf)
  1389. {
  1390. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1391. uint32_t is_decrypt = 0;
  1392. uint32_t decrypt_status;
  1393. decrypt_status = HAL_RX_TLV_DECRYPT_STATUS_GET(rx_pkt_tlvs);
  1394. if (!decrypt_status)
  1395. is_decrypt = 1;
  1396. return is_decrypt;
  1397. }
  1398. //TODO - Currently going with NO-PKT-HDR, need to add pkt hdr tlv and check
  1399. static inline uint8_t *hal_rx_pkt_hdr_get_be(uint8_t *buf)
  1400. {
  1401. return buf + RX_PKT_TLVS_LEN;
  1402. }
  1403. /**
  1404. * hal_rx_priv_info_set_in_tlv_be(): Save the private info to
  1405. * the reserved bytes of rx_tlv_hdr
  1406. * @buf: start of rx_tlv_hdr
  1407. * @priv_data: hal_wbm_err_desc_info structure
  1408. * @len: length of the private data
  1409. * Return: void
  1410. */
  1411. static inline void hal_rx_priv_info_set_in_tlv_be(uint8_t *buf,
  1412. uint8_t *priv_data,
  1413. uint32_t len)
  1414. {
  1415. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1416. uint32_t copy_len = (len > RX_BE_PADDING0_BYTES) ?
  1417. RX_BE_PADDING0_BYTES : len;
  1418. qdf_mem_copy(pkt_tlvs->rx_padding0, priv_data, copy_len);
  1419. }
  1420. /**
  1421. * hal_rx_priv_info_get_from_tlv_be(): retrieve the private data from
  1422. * the reserved bytes of rx_tlv_hdr.
  1423. * @buf: start of rx_tlv_hdr
  1424. * @priv_data: Handle to get the private data, output parameter.
  1425. * @len: length of the private data
  1426. * Return: void
  1427. */
  1428. static inline void hal_rx_priv_info_get_from_tlv_be(uint8_t *buf,
  1429. uint8_t *priv_data,
  1430. uint32_t len)
  1431. {
  1432. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1433. uint32_t copy_len = (len > RX_BE_PADDING0_BYTES) ?
  1434. RX_BE_PADDING0_BYTES : len;
  1435. qdf_mem_copy(priv_data, pkt_tlvs->rx_padding0, copy_len);
  1436. }
  1437. /**
  1438. * hal_rx_tlv_csum_err_get_be() - Get IP and tcp-udp checksum fail flag
  1439. * @rx_tlv_hdr: start address of rx_tlv_hdr
  1440. * @ip_csum_err: buffer to return ip_csum_fail flag
  1441. * @tcp_udp_csum_fail: placeholder to return tcp-udp checksum fail flag
  1442. *
  1443. * Return: None
  1444. */
  1445. static inline void
  1446. hal_rx_tlv_csum_err_get_be(uint8_t *rx_tlv_hdr, uint32_t *ip_csum_err,
  1447. uint32_t *tcp_udp_csum_err)
  1448. {
  1449. struct rx_pkt_tlvs *rx_pkt_tlvs =
  1450. (struct rx_pkt_tlvs *)rx_tlv_hdr;
  1451. *ip_csum_err = HAL_RX_TLV_IP_CSUM_FAIL_GET(rx_pkt_tlvs);
  1452. *tcp_udp_csum_err = HAL_RX_TLV_TCP_UDP_CSUM_FAIL_GET(rx_pkt_tlvs);
  1453. }
  1454. static inline
  1455. uint32_t hal_rx_tlv_mpdu_len_err_get_be(void *hw_desc_addr)
  1456. {
  1457. struct rx_pkt_tlvs *rx_pkt_tlvs =
  1458. (struct rx_pkt_tlvs *)hw_desc_addr;
  1459. return HAL_RX_TLV_MPDU_LEN_ERR_GET(rx_pkt_tlvs);
  1460. }
  1461. static inline
  1462. uint32_t hal_rx_tlv_mpdu_fcs_err_get_be(void *hw_desc_addr)
  1463. {
  1464. struct rx_pkt_tlvs *rx_pkt_tlvs =
  1465. (struct rx_pkt_tlvs *)hw_desc_addr;
  1466. return HAL_RX_TLV_MPDU_FCS_ERR_GET(rx_pkt_tlvs);
  1467. }
  1468. /**
  1469. * hal_rx_get_rx_more_frag_bit(): Function to retrieve more fragment bit
  1470. *
  1471. * @nbuf: Network buffer
  1472. * Returns: rx more fragment bit
  1473. */
  1474. static inline
  1475. uint8_t hal_rx_get_rx_more_frag_bit(uint8_t *buf)
  1476. {
  1477. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1478. uint16_t frame_ctrl = 0;
  1479. frame_ctrl = HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(pkt_tlvs) >>
  1480. DOT11_FC1_MORE_FRAG_OFFSET;
  1481. /* more fragment bit if at offset bit 4 */
  1482. return frame_ctrl;
  1483. }
  1484. /*
  1485. * hal_rx_msdu_is_wlan_mcast_generic_be(): Check if the buffer is for multicast
  1486. * address
  1487. * @nbuf: Network buffer
  1488. *
  1489. * Returns: flag to indicate whether the nbuf has MC/BC address
  1490. */
  1491. static inline uint32_t hal_rx_msdu_is_wlan_mcast_generic_be(qdf_nbuf_t nbuf)
  1492. {
  1493. uint8_t *buf = qdf_nbuf_data(nbuf);
  1494. return HAL_RX_TLV_IS_MCAST_GET(buf);;
  1495. }
  1496. /**
  1497. * hal_rx_msdu_start_msdu_len_set_be(): API to set the MSDU length
  1498. * from rx_msdu_start TLV
  1499. *
  1500. * @buf: pointer to the start of RX PKT TLV headers
  1501. * @len: msdu length
  1502. *
  1503. * Return: none
  1504. */
  1505. static inline void
  1506. hal_rx_msdu_start_msdu_len_set_be(uint8_t *buf, uint32_t len)
  1507. {
  1508. HAL_RX_TLV_MSDU_LEN_GET(buf) = len;
  1509. }
  1510. /**
  1511. * hal_rx_mpdu_start_mpdu_qos_control_valid_get_be():
  1512. * Retrieve qos control valid bit from the tlv.
  1513. * @buf: pointer to rx pkt TLV.
  1514. *
  1515. * Return: qos control value.
  1516. */
  1517. static inline uint32_t
  1518. hal_rx_mpdu_start_mpdu_qos_control_valid_get_be(uint8_t *buf)
  1519. {
  1520. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1521. return HAL_RX_MPDU_INFO_QOS_CONTROL_VALID_GET(pkt_tlvs);
  1522. }
  1523. /**
  1524. * hal_rx_msdu_end_sa_sw_peer_id_get_be(): API to get the
  1525. * sa_sw_peer_id from rx_msdu_end TLV
  1526. * @buf: pointer to the start of RX PKT TLV headers
  1527. *
  1528. * Return: sa_sw_peer_id index
  1529. */
  1530. static inline uint32_t
  1531. hal_rx_msdu_end_sa_sw_peer_id_get_be(uint8_t *buf)
  1532. {
  1533. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1534. hal_rx_msdu_end_t *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  1535. return HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(msdu_end);
  1536. }
  1537. #endif /* _HAL_BE_RX_TLV_H_ */