hal_be_rx_tlv.h 51 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930
  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_get_reo_ent_desc_qdesc_addr_be(): API to get qdesc address of reo
  533. * entrance ring desc
  534. *
  535. * @desc: reo entrance ring descriptor
  536. * Return: qdesc adrress
  537. */
  538. static inline uint8_t *hal_get_reo_ent_desc_qdesc_addr_be(uint8_t *desc)
  539. {
  540. return desc + REO_ENTRANCE_RING_RX_REO_QUEUE_DESC_ADDR_31_0_OFFSET;
  541. }
  542. /**
  543. * hal_rx_get_qdesc_addr_be(): API to get qdesc address of reo
  544. * entrance ring desc
  545. *
  546. * @dst_ring_desc: reo dest ring descriptor (used for Lithium DP)
  547. * @buf: pointer to the start of RX PKT TLV headers
  548. * Return: qdesc adrress in reo destination ring buffer
  549. */
  550. static inline uint8_t *hal_rx_get_qdesc_addr_be(uint8_t *dst_ring_desc,
  551. uint8_t *buf)
  552. {
  553. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  554. return (uint8_t *)(&HAL_RX_MPDU_START(rx_pkt_tlvs) +
  555. RX_MPDU_INFO_RX_REO_QUEUE_DESC_ADDR_31_0_OFFSET);
  556. }
  557. /**
  558. * hal_set_reo_ent_desc_reo_dest_ind_be(): API to set reo destination
  559. * indication of reo entrance ring desc
  560. *
  561. * @desc: reo ent ring descriptor
  562. * @dst_ind: reo destination indication value
  563. * Return: None
  564. */
  565. static inline void
  566. hal_set_reo_ent_desc_reo_dest_ind_be(uint8_t *desc, uint32_t dst_ind)
  567. {
  568. HAL_RX_FLD_SET(desc, REO_ENTRANCE_RING,
  569. REO_DESTINATION_INDICATION, dst_ind);
  570. }
  571. /**
  572. * hal_rx_mpdu_sequence_number_get() - Get mpdu sequence number
  573. * @buf: pointer to packet buffer
  574. *
  575. * Return: mpdu sequence
  576. */
  577. static inline int hal_rx_mpdu_sequence_number_get_be(uint8_t *buf)
  578. {
  579. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  580. return HAL_RX_MPDU_SEQUENCE_NUMBER_GET(rx_pkt_tlvs);
  581. }
  582. /**
  583. * hal_rx_msdu_packet_metadata_get(): API to get the
  584. * msdu information from rx_msdu_end TLV
  585. *
  586. * @ buf: pointer to the start of RX PKT TLV headers
  587. * @ hal_rx_msdu_metadata: pointer to the msdu info structure
  588. */
  589. static inline void
  590. hal_rx_msdu_packet_metadata_get_generic_be(uint8_t *buf,
  591. void *pkt_msdu_metadata)
  592. {
  593. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  594. struct hal_rx_msdu_metadata *msdu_metadata =
  595. (struct hal_rx_msdu_metadata *)pkt_msdu_metadata;
  596. msdu_metadata->l3_hdr_pad =
  597. HAL_RX_TLV_L3_HEADER_PADDING_GET(rx_pkt_tlvs);
  598. msdu_metadata->sa_idx = HAL_RX_TLV_SA_IDX_GET(rx_pkt_tlvs);
  599. msdu_metadata->da_idx = HAL_RX_TLV_DA_IDX_GET(rx_pkt_tlvs);
  600. msdu_metadata->sa_sw_peer_id =
  601. HAL_RX_TLV_SA_SW_PEER_ID_GET(rx_pkt_tlvs);
  602. }
  603. /*
  604. * hal_rx_msdu_start_nss_get_7850(): API to get the NSS
  605. * Interval from rx_msdu_start
  606. *
  607. * @buf: pointer to the start of RX PKT TLV header
  608. * Return: uint32_t(nss)
  609. */
  610. static inline uint32_t hal_rx_tlv_nss_get_be(uint8_t *buf)
  611. {
  612. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  613. uint8_t mimo_ss_bitmap;
  614. mimo_ss_bitmap = HAL_RX_TLV_MIMO_SS_BITMAP(rx_pkt_tlvs);
  615. return qdf_get_hweight8(mimo_ss_bitmap);
  616. }
  617. #ifdef GET_MSDU_AGGREGATION
  618. #define HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs)\
  619. {\
  620. bool first_msdu, last_msdu; \
  621. first_msdu = HAL_RX_TLV_FIRST_MSDU_GET(rx_desc);\
  622. last_msdu = HAL_RX_TLV_LAST_MSDU_GET(rx_desc);\
  623. if (first_msdu && last_msdu)\
  624. rs->rs_flags &= (~IEEE80211_AMSDU_FLAG);\
  625. else\
  626. rs->rs_flags |= (IEEE80211_AMSDU_FLAG); \
  627. } \
  628. #define HAL_RX_SET_MSDU_AGGREGATION((rs_mpdu), (rs_ppdu))\
  629. {\
  630. if (rs_mpdu->rs_flags & IEEE80211_AMSDU_FLAG)\
  631. rs_ppdu->rs_flags |= IEEE80211_AMSDU_FLAG;\
  632. } \
  633. #else
  634. #define HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs)
  635. #define HAL_RX_SET_MSDU_AGGREGATION(rs_mpdu, rs_ppdu)
  636. #endif
  637. /**
  638. * hal_rx_mon_hw_desc_get_mpdu_status_be(): Retrieve MPDU status
  639. *
  640. * @ hw_desc_addr: Start address of Rx HW TLVs
  641. * @ rs: Status for monitor mode
  642. *
  643. * Return: void
  644. */
  645. static inline void
  646. hal_rx_mon_hw_desc_get_mpdu_status_be(void *hw_desc_addr,
  647. struct mon_rx_status *rs)
  648. {
  649. uint32_t reg_value;
  650. struct rx_pkt_tlvs *rx_desc =
  651. (struct rx_pkt_tlvs *)hw_desc_addr;
  652. const uint32_t sgi_hw_to_cdp[] = {
  653. CDP_SGI_0_8_US,
  654. CDP_SGI_0_4_US,
  655. CDP_SGI_1_6_US,
  656. CDP_SGI_3_2_US,
  657. };
  658. HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs);
  659. rs->ant_signal_db = HAL_RX_TLV_ANT_SIGNAL_DB_GET(rx_desc);
  660. rs->is_stbc = HAL_RX_TLV_STBC_GET(rx_desc);
  661. reg_value = HAL_RX_TLV_SGI_GET(rx_desc);
  662. rs->sgi = sgi_hw_to_cdp[reg_value];
  663. reg_value = HAL_RX_TLV_RECEPTION_TYPE_GET(rx_desc);
  664. rs->beamformed = (reg_value == HAL_RX_RECEPTION_TYPE_MU_MIMO) ? 1 : 0;
  665. /* TODO: rs->beamformed should be set for SU beamforming also */
  666. }
  667. static inline uint32_t hal_rx_tlv_tid_get_be(uint8_t *buf)
  668. {
  669. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  670. uint32_t tid;
  671. tid = HAL_RX_TLV_TID_GET(rx_pkt_tlvs);
  672. return tid;
  673. }
  674. /*
  675. * hal_rx_tlv_reception_type_get(): API to get the reception type
  676. * Interval from rx_msdu_start
  677. *
  678. * @buf: pointer to the start of RX PKT TLV header
  679. * Return: uint32_t(reception_type)
  680. */
  681. static inline
  682. uint32_t hal_rx_tlv_reception_type_get_be(uint8_t *buf)
  683. {
  684. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  685. uint32_t reception_type;
  686. reception_type = HAL_RX_TLV_RECEPTION_TYPE_GET(rx_pkt_tlvs);
  687. return reception_type;
  688. }
  689. /**
  690. * hal_rx_msdu_end_da_idx_get_be: API to get da_idx
  691. * from rx_msdu_end TLV
  692. *
  693. * @ buf: pointer to the start of RX PKT TLV headers
  694. * Return: da index
  695. */
  696. static inline uint16_t hal_rx_msdu_end_da_idx_get_be(uint8_t *buf)
  697. {
  698. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  699. uint16_t da_idx;
  700. da_idx = HAL_RX_TLV_DA_IDX_GET(rx_pkt_tlvs);
  701. return da_idx;
  702. }
  703. /**
  704. * hal_rx_get_rx_fragment_number_be(): Function to retrieve rx fragment number
  705. *
  706. * @nbuf: Network buffer
  707. * Returns: rx fragment number
  708. */
  709. static inline
  710. uint8_t hal_rx_get_rx_fragment_number_be(uint8_t *buf)
  711. {
  712. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  713. /* Return first 4 bits as fragment number */
  714. return (HAL_RX_MPDU_SEQUENCE_NUMBER_GET(rx_pkt_tlvs) &
  715. DOT11_SEQ_FRAG_MASK);
  716. }
  717. /**
  718. * hal_rx_msdu_end_da_is_mcbc_get_be(): API to check if pkt is MCBC
  719. * from rx_msdu_end TLV
  720. *
  721. * @ buf: pointer to the start of RX PKT TLV headers
  722. * Return: da_is_mcbc
  723. */
  724. static inline uint8_t
  725. hal_rx_tlv_da_is_mcbc_get_be(uint8_t *buf)
  726. {
  727. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  728. return HAL_RX_TLV_DA_IS_MCBC_GET(rx_pkt_tlvs);
  729. }
  730. /**
  731. * hal_rx_tlvd_sa_is_valid_get_be(): API to get the sa_is_valid bit from
  732. * rx_msdu_end TLV
  733. *
  734. * @ buf: pointer to the start of RX PKT TLV headers
  735. * Return: sa_is_valid bit
  736. */
  737. static inline uint8_t
  738. hal_rx_tlv_sa_is_valid_get_be(uint8_t *buf)
  739. {
  740. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  741. uint8_t sa_is_valid;
  742. sa_is_valid = HAL_RX_TLV_SA_IS_VALID_GET(rx_pkt_tlvs);
  743. return sa_is_valid;
  744. }
  745. /**
  746. * hal_rx_tlv_sa_idx_get_be(): API to get the sa_idx from rx_msdu_end TLV
  747. *
  748. * @ buf: pointer to the start of RX PKT TLV headers
  749. * Return: sa_idx (SA AST index)
  750. */
  751. static inline
  752. uint16_t hal_rx_tlv_sa_idx_get_be(uint8_t *buf)
  753. {
  754. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  755. uint16_t sa_idx;
  756. sa_idx = HAL_RX_TLV_SA_IDX_GET(rx_pkt_tlvs);
  757. return sa_idx;
  758. }
  759. /**
  760. * hal_rx_desc_is_first_msdu_be() - Check if first msdu
  761. *
  762. * @hal_soc_hdl: hal_soc handle
  763. * @hw_desc_addr: hardware descriptor address
  764. *
  765. * Return: 0 - success/ non-zero failure
  766. */
  767. static inline uint32_t hal_rx_desc_is_first_msdu_be(void *hw_desc_addr)
  768. {
  769. struct rx_pkt_tlvs *rx_pkt_tlvs =
  770. (struct rx_pkt_tlvs *)hw_desc_addr;
  771. return HAL_RX_TLV_FIRST_MSDU_GET(rx_pkt_tlvs);
  772. }
  773. /**
  774. * hal_rx_tlv_l3_hdr_padding_get_be(): API to get the l3_header padding
  775. * from rx_msdu_end TLV
  776. *
  777. * @ buf: pointer to the start of RX PKT TLV headers
  778. * Return: number of l3 header padding bytes
  779. */
  780. static inline uint32_t hal_rx_tlv_l3_hdr_padding_get_be(uint8_t *buf)
  781. {
  782. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  783. uint32_t l3_header_padding;
  784. l3_header_padding = HAL_RX_TLV_L3_HEADER_PADDING_GET(rx_pkt_tlvs);
  785. return l3_header_padding;
  786. }
  787. /*
  788. * @ hal_rx_encryption_info_valid_be: Returns encryption type.
  789. *
  790. * @ buf: rx_tlv_hdr of the received packet
  791. * @ Return: encryption type
  792. */
  793. static inline uint32_t hal_rx_encryption_info_valid_be(uint8_t *buf)
  794. {
  795. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  796. uint32_t encryption_info =
  797. HAL_RX_TLV_MPDU_ENCRYPTION_INFO_VALID(rx_pkt_tlvs);
  798. return encryption_info;
  799. }
  800. /*
  801. * @ hal_rx_print_pn_be: Prints the PN of rx packet.
  802. *
  803. * @ buf: rx_tlv_hdr of the received packet
  804. * @ Return: void
  805. */
  806. static inline void hal_rx_print_pn_be(uint8_t *buf)
  807. {
  808. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  809. uint32_t pn_31_0 = HAL_RX_TLV_MPDU_PN_31_0_GET(rx_pkt_tlvs);
  810. uint32_t pn_63_32 = HAL_RX_TLV_MPDU_PN_63_32_GET(rx_pkt_tlvs);
  811. uint32_t pn_95_64 = HAL_RX_TLV_MPDU_PN_95_64_GET(rx_pkt_tlvs);
  812. uint32_t pn_127_96 = HAL_RX_TLV_MPDU_PN_127_96_GET(rx_pkt_tlvs);
  813. hal_debug("PN number pn_127_96 0x%x pn_95_64 0x%x pn_63_32 0x%x pn_31_0 0x%x ",
  814. pn_127_96, pn_95_64, pn_63_32, pn_31_0);
  815. }
  816. static inline void hal_rx_tlv_get_pn_num_be(uint8_t *buf, uint64_t *pn_num)
  817. {
  818. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  819. pn_num[0] = HAL_RX_TLV_MPDU_PN_31_0_GET(rx_pkt_tlvs);
  820. pn_num[0] |= ((uint64_t)HAL_RX_TLV_MPDU_PN_63_32_GET(rx_pkt_tlvs) << 32);
  821. pn_num[1] = HAL_RX_TLV_MPDU_PN_95_64_GET(rx_pkt_tlvs);
  822. pn_num[1] |= ((uint64_t)HAL_RX_TLV_MPDU_PN_127_96_GET(rx_pkt_tlvs) << 32);
  823. }
  824. /**
  825. * hal_rx_tlv_first_msdu_get_be: API to get first msdu status
  826. * from rx_msdu_end TLV
  827. *
  828. * @ buf: pointer to the start of RX PKT TLV headers
  829. * Return: first_msdu
  830. */
  831. static inline uint8_t hal_rx_tlv_first_msdu_get_be(uint8_t *buf)
  832. {
  833. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  834. uint8_t first_msdu;
  835. first_msdu = HAL_RX_TLV_FIRST_MSDU_GET(rx_pkt_tlvs);
  836. return first_msdu;
  837. }
  838. /**
  839. * hal_rx_tlv_da_is_valid_get_be: API to check if da is valid
  840. * from rx_msdu_end TLV
  841. *
  842. * @ buf: pointer to the start of RX PKT TLV headers
  843. * Return: da_is_valid
  844. */
  845. static inline uint8_t hal_rx_tlv_da_is_valid_get_be(uint8_t *buf)
  846. {
  847. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  848. uint8_t da_is_valid;
  849. da_is_valid = HAL_RX_TLV_DA_IS_VALID_GET(rx_pkt_tlvs);
  850. return da_is_valid;
  851. }
  852. /**
  853. * hal_rx_tlv_last_msdu_get_be: API to get last msdu status
  854. * from rx_msdu_end TLV
  855. *
  856. * @ buf: pointer to the start of RX PKT TLV headers
  857. * Return: last_msdu
  858. */
  859. static inline uint8_t hal_rx_tlv_last_msdu_get_be(uint8_t *buf)
  860. {
  861. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  862. uint8_t last_msdu;
  863. last_msdu = HAL_RX_TLV_LAST_MSDU_GET(rx_pkt_tlvs);
  864. return last_msdu;
  865. }
  866. /*
  867. * hal_rx_get_mpdu_mac_ad4_valid_be(): Retrieves if mpdu 4th addr is valid
  868. *
  869. * @nbuf: Network buffer
  870. * Returns: value of mpdu 4th address valid field
  871. */
  872. static inline bool hal_rx_get_mpdu_mac_ad4_valid_be(uint8_t *buf)
  873. {
  874. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  875. bool ad4_valid = 0;
  876. ad4_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD4_VALID_GET(rx_pkt_tlvs);
  877. return ad4_valid;
  878. }
  879. /**
  880. * hal_rx_mpdu_start_sw_peer_id_get_be: Retrieve sw peer_id
  881. * @buf: network buffer
  882. *
  883. * Return: sw peer_id
  884. */
  885. static inline uint32_t hal_rx_mpdu_start_sw_peer_id_get_be(uint8_t *buf)
  886. {
  887. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  888. return HAL_RX_TLV_SW_PEER_ID_GET(rx_pkt_tlvs);
  889. }
  890. /**
  891. * hal_rx_mpdu_get_to_ds_be(): API to get the tods info
  892. * from rx_mpdu_start
  893. *
  894. * @buf: pointer to the start of RX PKT TLV header
  895. * Return: uint32_t(to_ds)
  896. */
  897. static inline uint32_t hal_rx_mpdu_get_to_ds_be(uint8_t *buf)
  898. {
  899. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  900. return HAL_RX_TLV_MPDU_GET_TODS(rx_pkt_tlvs);
  901. }
  902. /*
  903. * hal_rx_mpdu_get_fr_ds_be(): API to get the from ds info
  904. * from rx_mpdu_start
  905. *
  906. * @buf: pointer to the start of RX PKT TLV header
  907. * Return: uint32_t(fr_ds)
  908. */
  909. static inline uint32_t hal_rx_mpdu_get_fr_ds_be(uint8_t *buf)
  910. {
  911. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  912. return HAL_RX_TLV_MPDU_GET_FROMDS(rx_pkt_tlvs);
  913. }
  914. /*
  915. * hal_rx_get_mpdu_frame_control_valid_be(): Retrieves mpdu
  916. * frame control valid
  917. *
  918. * @nbuf: Network buffer
  919. * Returns: value of frame control valid field
  920. */
  921. static inline uint8_t hal_rx_get_mpdu_frame_control_valid_be(uint8_t *buf)
  922. {
  923. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  924. return HAL_RX_TLV_MPDU_GET_FRAME_CONTROL_VALID(rx_pkt_tlvs);
  925. }
  926. /*
  927. * hal_rx_mpdu_get_addr1_be(): API to check get address1 of the mpdu
  928. *
  929. * @buf: pointer to the start of RX PKT TLV headera
  930. * @mac_addr: pointer to mac address
  931. * Return: success/failure
  932. */
  933. static inline QDF_STATUS hal_rx_mpdu_get_addr1_be(uint8_t *buf,
  934. uint8_t *mac_addr)
  935. {
  936. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  937. struct __attribute__((__packed__)) hal_addr1 {
  938. uint32_t ad1_31_0;
  939. uint16_t ad1_47_32;
  940. };
  941. struct hal_addr1 *addr = (struct hal_addr1 *)mac_addr;
  942. uint32_t mac_addr_ad1_valid;
  943. mac_addr_ad1_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD1_VALID_GET(rx_pkt_tlvs);
  944. if (mac_addr_ad1_valid) {
  945. addr->ad1_31_0 = HAL_RX_TLV_MPDU_AD1_31_0_GET(rx_pkt_tlvs);
  946. addr->ad1_47_32 = HAL_RX_TLV_MPDU_AD1_47_32_GET(rx_pkt_tlvs);
  947. return QDF_STATUS_SUCCESS;
  948. }
  949. return QDF_STATUS_E_FAILURE;
  950. }
  951. /*
  952. * hal_rx_mpdu_get_addr2_be(): API to check get address2 of the mpdu
  953. * in the packet
  954. *
  955. * @buf: pointer to the start of RX PKT TLV header
  956. * @mac_addr: pointer to mac address
  957. * Return: success/failure
  958. */
  959. static inline QDF_STATUS hal_rx_mpdu_get_addr2_be(uint8_t *buf,
  960. uint8_t *mac_addr)
  961. {
  962. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  963. struct __attribute__((__packed__)) hal_addr2 {
  964. uint16_t ad2_15_0;
  965. uint32_t ad2_47_16;
  966. };
  967. struct hal_addr2 *addr = (struct hal_addr2 *)mac_addr;
  968. uint32_t mac_addr_ad2_valid;
  969. mac_addr_ad2_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD2_VALID_GET(rx_pkt_tlvs);
  970. if (mac_addr_ad2_valid) {
  971. addr->ad2_15_0 = HAL_RX_TLV_MPDU_AD2_15_0_GET(rx_pkt_tlvs);
  972. addr->ad2_47_16 = HAL_RX_TLV_MPDU_AD2_47_16_GET(rx_pkt_tlvs);
  973. return QDF_STATUS_SUCCESS;
  974. }
  975. return QDF_STATUS_E_FAILURE;
  976. }
  977. /*
  978. * hal_rx_mpdu_get_addr3_be(): API to get address3 of the mpdu
  979. * in the packet
  980. *
  981. * @buf: pointer to the start of RX PKT TLV header
  982. * @mac_addr: pointer to mac address
  983. * Return: success/failure
  984. */
  985. static inline QDF_STATUS hal_rx_mpdu_get_addr3_be(uint8_t *buf,
  986. uint8_t *mac_addr)
  987. {
  988. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  989. struct __attribute__((__packed__)) hal_addr3 {
  990. uint32_t ad3_31_0;
  991. uint16_t ad3_47_32;
  992. };
  993. struct hal_addr3 *addr = (struct hal_addr3 *)mac_addr;
  994. uint32_t mac_addr_ad3_valid;
  995. mac_addr_ad3_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD3_VALID_GET(rx_pkt_tlvs);
  996. if (mac_addr_ad3_valid) {
  997. addr->ad3_31_0 = HAL_RX_TLV_MPDU_AD3_31_0_GET(rx_pkt_tlvs);
  998. addr->ad3_47_32 = HAL_RX_TLV_MPDU_AD3_47_32_GET(rx_pkt_tlvs);
  999. return QDF_STATUS_SUCCESS;
  1000. }
  1001. return QDF_STATUS_E_FAILURE;
  1002. }
  1003. /*
  1004. * hal_rx_mpdu_get_addr4_be(): API to get address4 of the mpdu
  1005. * in the packet
  1006. *
  1007. * @buf: pointer to the start of RX PKT TLV header
  1008. * @mac_addr: pointer to mac address
  1009. * Return: success/failure
  1010. */
  1011. static inline QDF_STATUS hal_rx_mpdu_get_addr4_be(uint8_t *buf,
  1012. uint8_t *mac_addr)
  1013. {
  1014. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1015. struct __attribute__((__packed__)) hal_addr4 {
  1016. uint32_t ad4_31_0;
  1017. uint16_t ad4_47_32;
  1018. };
  1019. struct hal_addr4 *addr = (struct hal_addr4 *)mac_addr;
  1020. uint32_t mac_addr_ad4_valid;
  1021. mac_addr_ad4_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD4_VALID_GET(rx_pkt_tlvs);
  1022. if (mac_addr_ad4_valid) {
  1023. addr->ad4_31_0 = HAL_RX_TLV_MPDU_AD4_31_0_GET(rx_pkt_tlvs);
  1024. addr->ad4_47_32 = HAL_RX_TLV_MPDU_AD4_47_32_GET(rx_pkt_tlvs);
  1025. return QDF_STATUS_SUCCESS;
  1026. }
  1027. return QDF_STATUS_E_FAILURE;
  1028. }
  1029. /*
  1030. * hal_rx_get_mpdu_sequence_control_valid_be(): Get mpdu
  1031. * sequence control valid
  1032. *
  1033. * @nbuf: Network buffer
  1034. * Returns: value of sequence control valid field
  1035. */
  1036. static inline uint8_t hal_rx_get_mpdu_sequence_control_valid_be(uint8_t *buf)
  1037. {
  1038. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1039. return HAL_RX_TLV_MPDU_GET_SEQUENCE_CONTROL_VALID(rx_pkt_tlvs);
  1040. }
  1041. /**
  1042. * hal_rx_tid_get_be: get tid based on qos control valid.
  1043. * @hal_soc_hdl: hal_soc handle
  1044. * @ buf: pointer to rx pkt TLV.
  1045. *
  1046. * Return: tid
  1047. */
  1048. static inline uint32_t hal_rx_tid_get_be(hal_soc_handle_t hal_soc_hdl,
  1049. uint8_t *buf)
  1050. {
  1051. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1052. uint8_t qos_control_valid =
  1053. HAL_RX_TLV_MPDU_QOS_CONTROL_VALID_GET(rx_pkt_tlvs);
  1054. if (qos_control_valid)
  1055. return hal_rx_tlv_tid_get_be(buf);
  1056. return HAL_RX_NON_QOS_TID;
  1057. }
  1058. static inline
  1059. uint8_t hal_rx_get_fc_valid_be(uint8_t *buf)
  1060. {
  1061. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1062. return HAL_RX_GET_FC_VALID(rx_pkt_tlvs);
  1063. }
  1064. static inline uint8_t hal_rx_get_to_ds_flag_be(uint8_t *buf)
  1065. {
  1066. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1067. return HAL_RX_GET_TO_DS_FLAG(rx_pkt_tlvs);
  1068. }
  1069. static inline uint8_t hal_rx_get_mac_addr2_valid_be(uint8_t *buf)
  1070. {
  1071. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1072. return HAL_RX_TLV_MPDU_MAC_ADDR_AD2_VALID_GET(rx_pkt_tlvs);
  1073. }
  1074. /**
  1075. * hal_rx_is_unicast_be: check packet is unicast frame or not.
  1076. *
  1077. * @ buf: pointer to rx pkt TLV.
  1078. * Return: true on unicast.
  1079. */
  1080. static inline bool hal_rx_is_unicast_be(uint8_t *buf)
  1081. {
  1082. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1083. uint32_t grp_id;
  1084. grp_id = HAL_RX_TLV_SW_FRAME_GROUP_ID_GET(rx_pkt_tlvs);
  1085. return (HAL_MPDU_SW_FRAME_GROUP_UNICAST_DATA == grp_id) ? true : false;
  1086. }
  1087. static inline uint8_t hal_rx_get_filter_category_be(uint8_t *buf)
  1088. {
  1089. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1090. return HAL_RX_GET_FILTER_CATEGORY(rx_pkt_tlvs);
  1091. }
  1092. /**
  1093. * hal_rx_hw_desc_get_ppduid_get_be(): retrieve ppdu id
  1094. * @rx_tlv_hdr: start address of rx_pkt_tlvs
  1095. * @rxdma_dst_ring_desc: Rx HW descriptor
  1096. *
  1097. * Return: ppdu id
  1098. */
  1099. static inline uint32_t
  1100. hal_rx_hw_desc_get_ppduid_get_be(void *rx_tlv_hdr, void *rxdma_dst_ring_desc)
  1101. {
  1102. struct rx_pkt_tlvs *rx_pkt_tlvs =
  1103. (struct rx_pkt_tlvs *)rx_tlv_hdr;
  1104. return HAL_RX_TLV_PHY_PPDU_ID_GET(rx_pkt_tlvs);
  1105. }
  1106. static inline uint32_t
  1107. hal_rx_get_ppdu_id_be(uint8_t *buf)
  1108. {
  1109. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1110. return HAL_RX_GET_PPDU_ID(rx_pkt_tlvs);
  1111. }
  1112. /**
  1113. * hal_rx_msdu_flow_idx_get_be: API to get flow index
  1114. * from rx_msdu_end TLV
  1115. * @buf: pointer to the start of RX PKT TLV headers
  1116. *
  1117. * Return: flow index value from MSDU END TLV
  1118. */
  1119. static inline uint32_t hal_rx_msdu_flow_idx_get_be(uint8_t *buf)
  1120. {
  1121. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1122. return HAL_RX_TLV_FLOW_IDX_GET(pkt_tlvs);
  1123. }
  1124. /**
  1125. * hal_rx_msdu_get_reo_destination_indication_be: API to get
  1126. * reo_destination_indication from rx_msdu_end TLV
  1127. * @buf: pointer to the start of RX PKT TLV headers
  1128. * @reo_destination_indication: pointer to return value of
  1129. * reo_destination_indication
  1130. *
  1131. * Return: none
  1132. */
  1133. static inline void
  1134. hal_rx_msdu_get_reo_destination_indication_be(uint8_t *buf,
  1135. uint32_t *reo_destination_indication)
  1136. {
  1137. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1138. *reo_destination_indication = HAL_RX_TLV_REO_DEST_IND_GET(pkt_tlvs);
  1139. }
  1140. /**
  1141. * hal_rx_msdu_flow_idx_invalid_be: API to get flow index invalid
  1142. * from rx_msdu_end TLV
  1143. * @buf: pointer to the start of RX PKT TLV headers
  1144. *
  1145. * Return: flow index invalid value from MSDU END TLV
  1146. */
  1147. static inline bool hal_rx_msdu_flow_idx_invalid_be(uint8_t *buf)
  1148. {
  1149. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1150. return HAL_RX_TLV_FLOW_IDX_INVALID_GET(pkt_tlvs);
  1151. }
  1152. /**
  1153. * hal_rx_msdu_flow_idx_timeout_be: API to get flow index timeout
  1154. * from rx_msdu_end TLV
  1155. * @buf: pointer to the start of RX PKT TLV headers
  1156. *
  1157. * Return: flow index timeout value from MSDU END TLV
  1158. */
  1159. static inline bool hal_rx_msdu_flow_idx_timeout_be(uint8_t *buf)
  1160. {
  1161. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1162. return HAL_RX_TLV_FLOW_IDX_TIMEOUT_GET(pkt_tlvs);
  1163. }
  1164. /**
  1165. * hal_rx_msdu_fse_metadata_get_be: API to get FSE metadata
  1166. * from rx_msdu_end TLV
  1167. * @buf: pointer to the start of RX PKT TLV headers
  1168. *
  1169. * Return: fse metadata value from MSDU END TLV
  1170. */
  1171. static inline uint32_t hal_rx_msdu_fse_metadata_get_be(uint8_t *buf)
  1172. {
  1173. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1174. return HAL_RX_TLV_FSE_METADATA_GET(pkt_tlvs);
  1175. }
  1176. /**
  1177. * hal_rx_msdu_cce_metadata_get_be: API to get CCE metadata
  1178. * from rx_msdu_end TLV
  1179. * @buf: pointer to the start of RX PKT TLV headers
  1180. *
  1181. * Return: cce_metadata
  1182. */
  1183. static inline uint16_t
  1184. hal_rx_msdu_cce_metadata_get_be(uint8_t *buf)
  1185. {
  1186. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1187. return HAL_RX_TLV_CCE_METADATA_GET(pkt_tlvs);
  1188. }
  1189. /**
  1190. * hal_rx_msdu_get_flow_params_be: API to get flow index, flow index invalid
  1191. * and flow index timeout from rx_msdu_end TLV
  1192. * @buf: pointer to the start of RX PKT TLV headers
  1193. * @flow_invalid: pointer to return value of flow_idx_valid
  1194. * @flow_timeout: pointer to return value of flow_idx_timeout
  1195. * @flow_index: pointer to return value of flow_idx
  1196. *
  1197. * Return: none
  1198. */
  1199. static inline void
  1200. hal_rx_msdu_get_flow_params_be(uint8_t *buf,
  1201. bool *flow_invalid,
  1202. bool *flow_timeout,
  1203. uint32_t *flow_index)
  1204. {
  1205. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1206. *flow_invalid = HAL_RX_TLV_FLOW_IDX_INVALID_GET(pkt_tlvs);
  1207. *flow_timeout = HAL_RX_TLV_FLOW_IDX_TIMEOUT_GET(pkt_tlvs);
  1208. *flow_index = HAL_RX_TLV_FLOW_IDX_GET(pkt_tlvs);
  1209. }
  1210. /**
  1211. * hal_rx_tlv_get_tcp_chksum_be() - API to get tcp checksum
  1212. * @buf: rx_tlv_hdr
  1213. *
  1214. * Return: tcp checksum
  1215. */
  1216. static inline uint16_t
  1217. hal_rx_tlv_get_tcp_chksum_be(uint8_t *buf)
  1218. {
  1219. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1220. return HAL_RX_TLV_GET_TCP_CHKSUM(rx_pkt_tlvs);
  1221. }
  1222. /**
  1223. * hal_rx_get_rx_sequence_be(): Function to retrieve rx sequence number
  1224. *
  1225. * @nbuf: Network buffer
  1226. * Returns: rx sequence number
  1227. */
  1228. static inline
  1229. uint16_t hal_rx_get_rx_sequence_be(uint8_t *buf)
  1230. {
  1231. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1232. return HAL_RX_MPDU_SEQUENCE_NUMBER_GET(rx_pkt_tlvs);
  1233. }
  1234. #ifdef RECEIVE_OFFLOAD
  1235. /**
  1236. * hal_rx_get_fisa_cumulative_l4_checksum_be() - Retrieve cumulative
  1237. * checksum
  1238. * @buf: buffer pointer
  1239. *
  1240. * Return: cumulative checksum
  1241. */
  1242. static inline
  1243. uint16_t hal_rx_get_fisa_cumulative_l4_checksum_be(uint8_t *buf)
  1244. {
  1245. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1246. return HAL_RX_TLV_GET_FISA_CUMULATIVE_L4_CHECKSUM(rx_pkt_tlvs);
  1247. }
  1248. /**
  1249. * hal_rx_get_fisa_cumulative_ip_length_be() - Retrieve cumulative
  1250. * ip length
  1251. * @buf: buffer pointer
  1252. *
  1253. * Return: cumulative length
  1254. */
  1255. static inline
  1256. uint16_t hal_rx_get_fisa_cumulative_ip_length_be(uint8_t *buf)
  1257. {
  1258. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1259. return HAL_RX_TLV_GET_FISA_CUMULATIVE_IP_LENGTH(rx_pkt_tlvs);
  1260. }
  1261. /**
  1262. * hal_rx_get_udp_proto_be() - Retrieve udp proto value
  1263. * @buf: buffer
  1264. *
  1265. * Return: udp proto bit
  1266. */
  1267. static inline
  1268. bool hal_rx_get_udp_proto_be(uint8_t *buf)
  1269. {
  1270. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1271. return HAL_RX_TLV_GET_UDP_PROTO(rx_pkt_tlvs);
  1272. }
  1273. #endif
  1274. /**
  1275. * hal_rx_get_flow_agg_continuation_be() - retrieve flow agg
  1276. * continuation
  1277. * @buf: buffer
  1278. *
  1279. * Return: flow agg
  1280. */
  1281. static inline
  1282. bool hal_rx_get_flow_agg_continuation_be(uint8_t *buf)
  1283. {
  1284. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1285. return HAL_RX_TLV_GET_FLOW_AGGR_CONT(rx_pkt_tlvs);
  1286. }
  1287. /**
  1288. * hal_rx_get_flow_agg_count_be()- Retrieve flow agg count
  1289. * @buf: buffer
  1290. *
  1291. * Return: flow agg count
  1292. */
  1293. static inline
  1294. uint8_t hal_rx_get_flow_agg_count_be(uint8_t *buf)
  1295. {
  1296. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1297. return HAL_RX_TLV_GET_FLOW_AGGR_COUNT(rx_pkt_tlvs);
  1298. }
  1299. /**
  1300. * hal_rx_get_fisa_timeout_be() - Retrieve fisa timeout
  1301. * @buf: buffer
  1302. *
  1303. * Return: fisa timeout
  1304. */
  1305. static inline
  1306. bool hal_rx_get_fisa_timeout_be(uint8_t *buf)
  1307. {
  1308. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1309. return HAL_RX_TLV_GET_FISA_TIMEOUT(rx_pkt_tlvs);
  1310. }
  1311. /**
  1312. * hal_rx_mpdu_start_tlv_tag_valid_be () - API to check if RX_MPDU_START
  1313. * tlv tag is valid
  1314. *
  1315. *@rx_tlv_hdr: start address of rx_pkt_tlvs
  1316. *
  1317. * Return: true if RX_MPDU_START is valied, else false.
  1318. */
  1319. static inline uint8_t hal_rx_mpdu_start_tlv_tag_valid_be(void *rx_tlv_hdr)
  1320. {
  1321. struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr;
  1322. uint32_t tlv_tag;
  1323. tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(&rx_desc->mpdu_start_tlv);
  1324. return tlv_tag == WIFIRX_MPDU_START_E ? true : false;
  1325. }
  1326. /**
  1327. * hal_rx_msdu_end_offset_get_generic(): API to get the
  1328. * msdu_end structure offset rx_pkt_tlv structure
  1329. *
  1330. * NOTE: API returns offset of msdu_end TLV from structure
  1331. * rx_pkt_tlvs
  1332. */
  1333. static inline uint32_t hal_rx_msdu_end_offset_get_generic(void)
  1334. {
  1335. return RX_PKT_TLV_OFFSET(msdu_end_tlv);
  1336. }
  1337. /**
  1338. * hal_rx_mpdu_start_offset_get_generic(): API to get the
  1339. * mpdu_start structure offset rx_pkt_tlv structure
  1340. *
  1341. * NOTE: API returns offset of attn TLV from structure
  1342. * rx_pkt_tlvs
  1343. */
  1344. static inline uint32_t hal_rx_mpdu_start_offset_get_generic(void)
  1345. {
  1346. return RX_PKT_TLV_OFFSET(mpdu_start_tlv);
  1347. }
  1348. static inline uint32_t hal_rx_pkt_tlv_offset_get_generic(void)
  1349. {
  1350. return RX_PKT_TLV_OFFSET(pkt_hdr_tlv);
  1351. }
  1352. #ifdef RECEIVE_OFFLOAD
  1353. static inline int
  1354. hal_rx_tlv_get_offload_info_be(uint8_t *rx_tlv,
  1355. struct hal_offload_info *offload_info)
  1356. {
  1357. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)rx_tlv;
  1358. offload_info->lro_eligible = HAL_RX_TLV_GET_LRO_ELIGIBLE(rx_pkt_tlvs);
  1359. offload_info->flow_id = HAL_RX_TLV_GET_FLOW_ID_TOEPLITZ(rx_pkt_tlvs);
  1360. offload_info->ipv6_proto = HAL_RX_TLV_GET_IPV6(rx_pkt_tlvs);
  1361. offload_info->tcp_proto = HAL_RX_TLV_GET_TCP_PROTO(rx_pkt_tlvs);
  1362. if (offload_info->tcp_proto) {
  1363. offload_info->tcp_pure_ack =
  1364. HAL_RX_TLV_GET_TCP_PURE_ACK(rx_pkt_tlvs);
  1365. offload_info->tcp_offset =
  1366. HAL_RX_TLV_GET_TCP_OFFSET(rx_pkt_tlvs);
  1367. offload_info->tcp_win = HAL_RX_TLV_GET_TCP_WIN(rx_pkt_tlvs);
  1368. offload_info->tcp_seq_num = HAL_RX_TLV_GET_TCP_SEQ(rx_pkt_tlvs);
  1369. offload_info->tcp_ack_num = HAL_RX_TLV_GET_TCP_ACK(rx_pkt_tlvs);
  1370. }
  1371. return 0;
  1372. }
  1373. static inline int hal_rx_get_proto_params_be(uint8_t *buf, void *proto_params)
  1374. {
  1375. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1376. struct hal_proto_params *param =
  1377. (struct hal_proto_params *)proto_params;
  1378. param->tcp_proto = HAL_RX_TLV_GET_IP_OFFSET(rx_pkt_tlvs);
  1379. param->udp_proto = HAL_RX_TLV_GET_UDP_PROTO(rx_pkt_tlvs);
  1380. param->ipv6_proto = HAL_RX_TLV_GET_IPV6(rx_pkt_tlvs);
  1381. return 0;
  1382. }
  1383. static inline int hal_rx_get_l3_l4_offsets_be(uint8_t *buf,
  1384. uint32_t *l3_hdr_offset,
  1385. uint32_t *l4_hdr_offset)
  1386. {
  1387. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1388. *l3_hdr_offset = HAL_RX_TLV_GET_IP_OFFSET(rx_pkt_tlvs);
  1389. *l4_hdr_offset = HAL_RX_TLV_GET_TCP_OFFSET(rx_pkt_tlvs);
  1390. return 0;
  1391. }
  1392. #endif
  1393. /**
  1394. * hal_rx_msdu_start_msdu_len_get(): API to get the MSDU length
  1395. * from rx_msdu_start TLV
  1396. *
  1397. * @ buf: pointer to the start of RX PKT TLV headers
  1398. * Return: msdu length
  1399. */
  1400. static inline uint32_t hal_rx_msdu_start_msdu_len_get_be(uint8_t *buf)
  1401. {
  1402. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1403. uint32_t msdu_len;
  1404. msdu_len = HAL_RX_TLV_MSDU_LEN_GET(rx_pkt_tlvs);
  1405. return msdu_len;
  1406. }
  1407. /**
  1408. * hal_rx_get_frame_ctrl_field(): Function to retrieve frame control field
  1409. *
  1410. * @nbuf: Network buffer
  1411. * Returns: rx more fragment bit
  1412. *
  1413. */
  1414. static inline uint16_t hal_rx_get_frame_ctrl_field_be(uint8_t *buf)
  1415. {
  1416. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1417. uint16_t frame_ctrl = 0;
  1418. frame_ctrl = HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(rx_pkt_tlvs);
  1419. return frame_ctrl;
  1420. }
  1421. /*
  1422. * hal_rx_tlv_get_is_decrypted_be(): API to get the decrypt status of the
  1423. * packet from msdu_end
  1424. *
  1425. * @buf: pointer to the start of RX PKT TLV header
  1426. * Return: uint32_t(decryt status)
  1427. */
  1428. static inline uint32_t hal_rx_tlv_get_is_decrypted_be(uint8_t *buf)
  1429. {
  1430. struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1431. uint32_t is_decrypt = 0;
  1432. uint32_t decrypt_status;
  1433. decrypt_status = HAL_RX_TLV_DECRYPT_STATUS_GET(rx_pkt_tlvs);
  1434. if (!decrypt_status)
  1435. is_decrypt = 1;
  1436. return is_decrypt;
  1437. }
  1438. //TODO - Currently going with NO-PKT-HDR, need to add pkt hdr tlv and check
  1439. static inline uint8_t *hal_rx_pkt_hdr_get_be(uint8_t *buf)
  1440. {
  1441. return buf + RX_PKT_TLVS_LEN;
  1442. }
  1443. /**
  1444. * hal_rx_priv_info_set_in_tlv_be(): Save the private info to
  1445. * the reserved bytes of rx_tlv_hdr
  1446. * @buf: start of rx_tlv_hdr
  1447. * @priv_data: hal_wbm_err_desc_info structure
  1448. * @len: length of the private data
  1449. * Return: void
  1450. */
  1451. static inline void hal_rx_priv_info_set_in_tlv_be(uint8_t *buf,
  1452. uint8_t *priv_data,
  1453. uint32_t len)
  1454. {
  1455. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1456. uint32_t copy_len = (len > RX_BE_PADDING0_BYTES) ?
  1457. RX_BE_PADDING0_BYTES : len;
  1458. qdf_mem_copy(pkt_tlvs->rx_padding0, priv_data, copy_len);
  1459. }
  1460. /**
  1461. * hal_rx_priv_info_get_from_tlv_be(): retrieve the private data from
  1462. * the reserved bytes of rx_tlv_hdr.
  1463. * @buf: start of rx_tlv_hdr
  1464. * @priv_data: Handle to get the private data, output parameter.
  1465. * @len: length of the private data
  1466. * Return: void
  1467. */
  1468. static inline void hal_rx_priv_info_get_from_tlv_be(uint8_t *buf,
  1469. uint8_t *priv_data,
  1470. uint32_t len)
  1471. {
  1472. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1473. uint32_t copy_len = (len > RX_BE_PADDING0_BYTES) ?
  1474. RX_BE_PADDING0_BYTES : len;
  1475. qdf_mem_copy(priv_data, pkt_tlvs->rx_padding0, copy_len);
  1476. }
  1477. /**
  1478. * hal_rx_tlv_csum_err_get_be() - Get IP and tcp-udp checksum fail flag
  1479. * @rx_tlv_hdr: start address of rx_tlv_hdr
  1480. * @ip_csum_err: buffer to return ip_csum_fail flag
  1481. * @tcp_udp_csum_fail: placeholder to return tcp-udp checksum fail flag
  1482. *
  1483. * Return: None
  1484. */
  1485. static inline void
  1486. hal_rx_tlv_csum_err_get_be(uint8_t *rx_tlv_hdr, uint32_t *ip_csum_err,
  1487. uint32_t *tcp_udp_csum_err)
  1488. {
  1489. struct rx_pkt_tlvs *rx_pkt_tlvs =
  1490. (struct rx_pkt_tlvs *)rx_tlv_hdr;
  1491. *ip_csum_err = HAL_RX_TLV_IP_CSUM_FAIL_GET(rx_pkt_tlvs);
  1492. *tcp_udp_csum_err = HAL_RX_TLV_TCP_UDP_CSUM_FAIL_GET(rx_pkt_tlvs);
  1493. }
  1494. static inline
  1495. uint32_t hal_rx_tlv_mpdu_len_err_get_be(void *hw_desc_addr)
  1496. {
  1497. struct rx_pkt_tlvs *rx_pkt_tlvs =
  1498. (struct rx_pkt_tlvs *)hw_desc_addr;
  1499. return HAL_RX_TLV_MPDU_LEN_ERR_GET(rx_pkt_tlvs);
  1500. }
  1501. static inline
  1502. uint32_t hal_rx_tlv_mpdu_fcs_err_get_be(void *hw_desc_addr)
  1503. {
  1504. struct rx_pkt_tlvs *rx_pkt_tlvs =
  1505. (struct rx_pkt_tlvs *)hw_desc_addr;
  1506. return HAL_RX_TLV_MPDU_FCS_ERR_GET(rx_pkt_tlvs);
  1507. }
  1508. /**
  1509. * hal_rx_get_rx_more_frag_bit(): Function to retrieve more fragment bit
  1510. *
  1511. * @nbuf: Network buffer
  1512. * Returns: rx more fragment bit
  1513. */
  1514. static inline
  1515. uint8_t hal_rx_get_rx_more_frag_bit(uint8_t *buf)
  1516. {
  1517. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1518. uint16_t frame_ctrl = 0;
  1519. frame_ctrl = HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(pkt_tlvs) >>
  1520. DOT11_FC1_MORE_FRAG_OFFSET;
  1521. /* more fragment bit if at offset bit 4 */
  1522. return frame_ctrl;
  1523. }
  1524. /*
  1525. * hal_rx_msdu_is_wlan_mcast_generic_be(): Check if the buffer is for multicast
  1526. * address
  1527. * @nbuf: Network buffer
  1528. *
  1529. * Returns: flag to indicate whether the nbuf has MC/BC address
  1530. */
  1531. static inline uint32_t hal_rx_msdu_is_wlan_mcast_generic_be(qdf_nbuf_t nbuf)
  1532. {
  1533. uint8_t *buf = qdf_nbuf_data(nbuf);
  1534. return HAL_RX_TLV_IS_MCAST_GET(buf);;
  1535. }
  1536. /**
  1537. * hal_rx_msdu_start_msdu_len_set_be(): API to set the MSDU length
  1538. * from rx_msdu_start TLV
  1539. *
  1540. * @buf: pointer to the start of RX PKT TLV headers
  1541. * @len: msdu length
  1542. *
  1543. * Return: none
  1544. */
  1545. static inline void
  1546. hal_rx_msdu_start_msdu_len_set_be(uint8_t *buf, uint32_t len)
  1547. {
  1548. HAL_RX_TLV_MSDU_LEN_GET(buf) = len;
  1549. }
  1550. /**
  1551. * hal_rx_mpdu_start_mpdu_qos_control_valid_get_be():
  1552. * Retrieve qos control valid bit from the tlv.
  1553. * @buf: pointer to rx pkt TLV.
  1554. *
  1555. * Return: qos control value.
  1556. */
  1557. static inline uint32_t
  1558. hal_rx_mpdu_start_mpdu_qos_control_valid_get_be(uint8_t *buf)
  1559. {
  1560. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1561. return HAL_RX_MPDU_INFO_QOS_CONTROL_VALID_GET(pkt_tlvs);
  1562. }
  1563. /**
  1564. * hal_rx_msdu_end_sa_sw_peer_id_get_be(): API to get the
  1565. * sa_sw_peer_id from rx_msdu_end TLV
  1566. * @buf: pointer to the start of RX PKT TLV headers
  1567. *
  1568. * Return: sa_sw_peer_id index
  1569. */
  1570. static inline uint32_t
  1571. hal_rx_msdu_end_sa_sw_peer_id_get_be(uint8_t *buf)
  1572. {
  1573. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1574. hal_rx_msdu_end_t *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  1575. return HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(msdu_end);
  1576. }
  1577. #endif /* _HAL_BE_RX_TLV_H_ */