hal_5332.c 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136
  1. /*
  2. * Copyright (c) 2021 The Linux Foundation. All rights reserved.
  3. * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for any
  6. * purpose with or without fee is hereby granted, provided that the above
  7. * copyright notice and this permission notice appear in all copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  10. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  11. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  12. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  13. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  14. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  15. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE
  16. */
  17. #include "qdf_types.h"
  18. #include "qdf_util.h"
  19. #include "qdf_mem.h"
  20. #include "qdf_nbuf.h"
  21. #include "qdf_module.h"
  22. #include "target_type.h"
  23. #include "wcss_version.h"
  24. #include "hal_be_hw_headers.h"
  25. #include "hal_internal.h"
  26. #include "hal_api.h"
  27. #include "hal_flow.h"
  28. #include "rx_flow_search_entry.h"
  29. #include "hal_rx_flow_info.h"
  30. #include "hal_be_api.h"
  31. #include "tcl_entrance_from_ppe_ring.h"
  32. #include "sw_monitor_ring.h"
  33. #include "wcss_seq_hwioreg_umac.h"
  34. #include "wfss_ce_reg_seq_hwioreg.h"
  35. #include <uniform_reo_status_header.h>
  36. #include <wbm_release_ring_tx.h>
  37. #include <phyrx_location.h>
  38. #ifdef WLAN_PKT_CAPTURE_TX_2_0
  39. #include <mon_ingress_ring.h>
  40. #include <mon_destination_ring.h>
  41. #endif
  42. #include "rx_reo_queue_1k.h"
  43. #include <hal_be_rx.h>
  44. #define UNIFIED_RX_MPDU_START_0_RX_MPDU_INFO_RX_MPDU_INFO_DETAILS_OFFSET \
  45. RX_MPDU_START_RX_MPDU_INFO_DETAILS_RXPCU_MPDU_FILTER_IN_CATEGORY_OFFSET
  46. #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \
  47. RX_MSDU_LINK_MSDU_BUFFER_ADDR_INFO_DETAILS_BUFFER_ADDR_31_0_OFFSET
  48. #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \
  49. RX_MSDU_DETAILS_RX_MSDU_DESC_INFO_DETAILS_FIRST_MSDU_IN_MPDU_FLAG_OFFSET
  50. #define UNIFIED_RX_MPDU_DETAILS_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \
  51. RX_MPDU_DETAILS_RX_MPDU_DESC_INFO_DETAILS_MSDU_COUNT_OFFSET
  52. #define UNIFIED_REO_DESTINATION_RING_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \
  53. REO_DESTINATION_RING_RX_MPDU_DESC_INFO_DETAILS_MSDU_COUNT_OFFSET
  54. #define UNIFORM_REO_STATUS_HEADER_STATUS_HEADER \
  55. STATUS_HEADER_REO_STATUS_NUMBER
  56. #define UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC \
  57. STATUS_HEADER_TIMESTAMP
  58. #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \
  59. RX_MSDU_DETAILS_RX_MSDU_DESC_INFO_DETAILS_FIRST_MSDU_IN_MPDU_FLAG_OFFSET
  60. #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \
  61. RX_MSDU_LINK_MSDU_BUFFER_ADDR_INFO_DETAILS_BUFFER_ADDR_31_0_OFFSET
  62. #define UNIFIED_TCL_DATA_CMD_0_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \
  63. TCL_DATA_CMD_BUF_ADDR_INFO_BUFFER_ADDR_31_0_OFFSET
  64. #define UNIFIED_TCL_DATA_CMD_1_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \
  65. TCL_DATA_CMD_BUF_ADDR_INFO_BUFFER_ADDR_39_32_OFFSET
  66. #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_OFFSET \
  67. TCL_DATA_CMD_BUF_OR_EXT_DESC_TYPE_OFFSET
  68. #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB \
  69. BUFFER_ADDR_INFO_BUFFER_ADDR_31_0_LSB
  70. #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK \
  71. BUFFER_ADDR_INFO_BUFFER_ADDR_31_0_MASK
  72. #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB \
  73. BUFFER_ADDR_INFO_BUFFER_ADDR_39_32_LSB
  74. #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK \
  75. BUFFER_ADDR_INFO_BUFFER_ADDR_39_32_MASK
  76. #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB \
  77. BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_LSB
  78. #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK \
  79. BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_MASK
  80. #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB \
  81. BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_LSB
  82. #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK \
  83. BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_MASK
  84. #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_LSB \
  85. TCL_DATA_CMD_BUF_OR_EXT_DESC_TYPE_LSB
  86. #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_MASK \
  87. TCL_DATA_CMD_BUF_OR_EXT_DESC_TYPE_MASK
  88. #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_MASK \
  89. WBM_RELEASE_RING_TX_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_MASK
  90. #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_OFFSET \
  91. WBM_RELEASE_RING_TX_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_OFFSET
  92. #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_LSB \
  93. WBM_RELEASE_RING_TX_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_LSB
  94. #if defined(WLAN_PKT_CAPTURE_TX_2_0) || defined(WLAN_PKT_CAPTURE_RX_2_0)
  95. #include "hal_be_api_mon.h"
  96. #endif
  97. #define CMEM_REG_BASE 0x00100000
  98. /* For Berryllium sw2rxdma ring size increased to 20 bits */
  99. #define HAL_RXDMA_MAX_RING_SIZE_BE 0xFFFFF
  100. #include "hal_5332_rx.h"
  101. #include "hal_5332_tx.h"
  102. #include "hal_be_rx_tlv.h"
  103. #include <hal_be_generic_api.h>
  104. /**
  105. * hal_read_pmm_scratch_reg_5332() - API to read PMM Scratch register
  106. *
  107. * @soc: HAL soc
  108. * @reg_enum: Enum of the scratch register
  109. *
  110. * Return: uint32_t
  111. */
  112. static inline
  113. uint32_t hal_read_pmm_scratch_reg_5332(struct hal_soc *soc,
  114. enum hal_scratch_reg_enum reg_enum)
  115. {
  116. uint32_t val = 0;
  117. pld_reg_read(soc->qdf_dev->dev, (reg_enum * 4), &val,
  118. soc->dev_base_addr_pmm);
  119. return val;
  120. }
  121. /**
  122. * hal_get_tsf2_scratch_reg_qca5332() - API to read tsf2 scratch register
  123. *
  124. * @hal_soc_hdl: HAL soc context
  125. * @mac_id: mac id
  126. * @value: Pointer to update tsf2 value
  127. *
  128. * Return: void
  129. */
  130. static void hal_get_tsf2_scratch_reg_qca5332(hal_soc_handle_t hal_soc_hdl,
  131. uint8_t mac_id, uint64_t *value)
  132. {
  133. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  134. uint32_t offset_lo, offset_hi;
  135. enum hal_scratch_reg_enum enum_lo, enum_hi;
  136. hal_get_tsf_enum(DEFAULT_TSF_ID, mac_id, &enum_lo, &enum_hi);
  137. offset_lo = hal_read_pmm_scratch_reg_5332(soc,
  138. enum_lo);
  139. offset_hi = hal_read_pmm_scratch_reg_5332(soc,
  140. enum_hi);
  141. *value = ((uint64_t)(offset_hi) << 32 | offset_lo);
  142. }
  143. /**
  144. * hal_get_tqm_scratch_reg_qca5332() - API to read tqm scratch register
  145. *
  146. * @hal_soc_hdl: HAL soc context
  147. * @value: Pointer to update tqm value
  148. *
  149. * Return: void
  150. */
  151. static void hal_get_tqm_scratch_reg_qca5332(hal_soc_handle_t hal_soc_hdl,
  152. uint64_t *value)
  153. {
  154. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  155. uint32_t offset_lo, offset_hi;
  156. offset_lo = hal_read_pmm_scratch_reg_5332(soc,
  157. PMM_TQM_CLOCK_OFFSET_LO_US);
  158. offset_hi = hal_read_pmm_scratch_reg_5332(soc,
  159. PMM_TQM_CLOCK_OFFSET_HI_US);
  160. *value = ((uint64_t)(offset_hi) << 32 | offset_lo);
  161. }
  162. #define LINK_DESC_SIZE (NUM_OF_DWORDS_RX_MSDU_LINK << 2)
  163. #define HAL_PPE_VP_ENTRIES_MAX 32
  164. /**
  165. * hal_get_link_desc_size_5332() - API to get the link desc size
  166. *
  167. * Return: uint32_t
  168. */
  169. static uint32_t hal_get_link_desc_size_5332(void)
  170. {
  171. return LINK_DESC_SIZE;
  172. }
  173. /**
  174. * hal_rx_get_tlv_5332() - API to get the tlv
  175. *
  176. * @rx_tlv: TLV data extracted from the rx packet
  177. * Return: uint8_t
  178. */
  179. static uint8_t hal_rx_get_tlv_5332(void *rx_tlv)
  180. {
  181. return HAL_RX_GET(rx_tlv, PHYRX_RSSI_LEGACY, RECEIVE_BANDWIDTH);
  182. }
  183. /**
  184. * hal_rx_wbm_err_msdu_continuation_get_5332() - API to check if WBM
  185. * msdu continuation bit is set
  186. *
  187. * @wbm_desc: wbm release ring descriptor
  188. *
  189. * Return: true if msdu continuation bit is set.
  190. */
  191. uint8_t hal_rx_wbm_err_msdu_continuation_get_5332(void *wbm_desc)
  192. {
  193. uint32_t comp_desc = *(uint32_t *)(((uint8_t *)wbm_desc) +
  194. WBM_RELEASE_RING_RX_RX_MSDU_DESC_INFO_DETAILS_MSDU_CONTINUATION_OFFSET);
  195. return (comp_desc &
  196. WBM_RELEASE_RING_RX_RX_MSDU_DESC_INFO_DETAILS_MSDU_CONTINUATION_MASK) >>
  197. WBM_RELEASE_RING_RX_RX_MSDU_DESC_INFO_DETAILS_MSDU_CONTINUATION_LSB;
  198. }
  199. /**
  200. * hal_rx_proc_phyrx_other_receive_info_tlv_5332() - API to get tlv info
  201. * @rx_tlv_hdr: start address of rx_pkt_tlvs
  202. * @ppdu_info_hdl: PPDU info handle to fill
  203. *
  204. * Return: uint32_t
  205. */
  206. static inline
  207. void hal_rx_proc_phyrx_other_receive_info_tlv_5332(void *rx_tlv_hdr,
  208. void *ppdu_info_hdl)
  209. {
  210. uint32_t tlv_tag, tlv_len;
  211. uint32_t temp_len, other_tlv_len, other_tlv_tag;
  212. void *rx_tlv = (uint8_t *)rx_tlv_hdr + HAL_RX_TLV32_HDR_SIZE;
  213. void *other_tlv_hdr = NULL;
  214. void *other_tlv = NULL;
  215. tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(rx_tlv_hdr);
  216. tlv_len = HAL_RX_GET_USER_TLV32_LEN(rx_tlv_hdr);
  217. temp_len = 0;
  218. other_tlv_hdr = rx_tlv + HAL_RX_TLV32_HDR_SIZE;
  219. other_tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(other_tlv_hdr);
  220. other_tlv_len = HAL_RX_GET_USER_TLV32_LEN(other_tlv_hdr);
  221. temp_len += other_tlv_len;
  222. other_tlv = other_tlv_hdr + HAL_RX_TLV32_HDR_SIZE;
  223. switch (other_tlv_tag) {
  224. default:
  225. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  226. "%s unhandled TLV type: %d, TLV len:%d",
  227. __func__, other_tlv_tag, other_tlv_len);
  228. break;
  229. }
  230. }
  231. #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE)
  232. static inline
  233. void hal_rx_get_bb_info_5332(void *rx_tlv, void *ppdu_info_hdl)
  234. {
  235. struct hal_rx_ppdu_info *ppdu_info = ppdu_info_hdl;
  236. ppdu_info->cfr_info.bb_captured_channel =
  237. HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_CHANNEL);
  238. ppdu_info->cfr_info.bb_captured_timeout =
  239. HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_TIMEOUT);
  240. ppdu_info->cfr_info.bb_captured_reason =
  241. HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_REASON);
  242. }
  243. static inline
  244. void hal_rx_get_rtt_info_5332(void *rx_tlv, void *ppdu_info_hdl)
  245. {
  246. struct hal_rx_ppdu_info *ppdu_info = ppdu_info_hdl;
  247. ppdu_info->cfr_info.rx_location_info_valid =
  248. HAL_RX_GET(rx_tlv, PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  249. RX_LOCATION_INFO_VALID);
  250. ppdu_info->cfr_info.rtt_che_buffer_pointer_low32 =
  251. HAL_RX_GET(rx_tlv,
  252. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  253. RTT_CHE_BUFFER_POINTER_LOW32);
  254. ppdu_info->cfr_info.rtt_che_buffer_pointer_high8 =
  255. HAL_RX_GET(rx_tlv,
  256. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  257. RTT_CHE_BUFFER_POINTER_HIGH8);
  258. ppdu_info->cfr_info.chan_capture_status =
  259. HAL_GET_RX_LOCATION_INFO_CHAN_CAPTURE_STATUS(rx_tlv);
  260. ppdu_info->cfr_info.rx_start_ts =
  261. HAL_RX_GET(rx_tlv,
  262. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  263. RX_START_TS);
  264. ppdu_info->cfr_info.rtt_cfo_measurement = (int16_t)
  265. HAL_RX_GET(rx_tlv,
  266. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  267. RTT_CFO_MEASUREMENT);
  268. ppdu_info->cfr_info.agc_gain_info0 =
  269. HAL_RX_GET(rx_tlv,
  270. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  271. GAIN_CHAIN0);
  272. ppdu_info->cfr_info.agc_gain_info0 |=
  273. (((uint32_t)HAL_RX_GET(rx_tlv,
  274. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  275. GAIN_CHAIN1)) << 16);
  276. ppdu_info->cfr_info.agc_gain_info1 =
  277. HAL_RX_GET(rx_tlv,
  278. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  279. GAIN_CHAIN2);
  280. ppdu_info->cfr_info.agc_gain_info1 |=
  281. (((uint32_t)HAL_RX_GET(rx_tlv,
  282. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  283. GAIN_CHAIN3)) << 16);
  284. ppdu_info->cfr_info.agc_gain_info2 = 0;
  285. ppdu_info->cfr_info.agc_gain_info3 = 0;
  286. }
  287. #endif
  288. #ifdef CONFIG_WORD_BASED_TLV
  289. /**
  290. * hal_rx_dump_mpdu_start_tlv_5332() - dump RX mpdu_start TLV in structured
  291. * human readable format.
  292. * @mpdustart: pointer the rx_attention TLV in pkt.
  293. * @dbg_level: log level.
  294. *
  295. * Return: void
  296. */
  297. static inline void hal_rx_dump_mpdu_start_tlv_5332(void *mpdustart,
  298. uint8_t dbg_level)
  299. {
  300. struct rx_mpdu_start_compact *mpdu_info =
  301. (struct rx_mpdu_start_compact *)mpdustart;
  302. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  303. "rx_mpdu_start tlv (1/5) - "
  304. "rx_reo_queue_desc_addr_39_32 :%x"
  305. "receive_queue_number:%x "
  306. "pre_delim_err_warning:%x "
  307. "first_delim_err:%x "
  308. "pn_31_0:%x "
  309. "pn_63_32:%x "
  310. "pn_95_64:%x ",
  311. mpdu_info->rx_reo_queue_desc_addr_39_32,
  312. mpdu_info->receive_queue_number,
  313. mpdu_info->pre_delim_err_warning,
  314. mpdu_info->first_delim_err,
  315. mpdu_info->pn_31_0,
  316. mpdu_info->pn_63_32,
  317. mpdu_info->pn_95_64);
  318. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  319. "rx_mpdu_start tlv (2/5) - "
  320. "ast_index:%x "
  321. "sw_peer_id:%x "
  322. "mpdu_frame_control_valid:%x "
  323. "mpdu_duration_valid:%x "
  324. "mac_addr_ad1_valid:%x "
  325. "mac_addr_ad2_valid:%x "
  326. "mac_addr_ad3_valid:%x "
  327. "mac_addr_ad4_valid:%x "
  328. "mpdu_sequence_control_valid :%x"
  329. "mpdu_qos_control_valid:%x "
  330. "mpdu_ht_control_valid:%x "
  331. "frame_encryption_info_valid :%x",
  332. mpdu_info->ast_index,
  333. mpdu_info->sw_peer_id,
  334. mpdu_info->mpdu_frame_control_valid,
  335. mpdu_info->mpdu_duration_valid,
  336. mpdu_info->mac_addr_ad1_valid,
  337. mpdu_info->mac_addr_ad2_valid,
  338. mpdu_info->mac_addr_ad3_valid,
  339. mpdu_info->mac_addr_ad4_valid,
  340. mpdu_info->mpdu_sequence_control_valid,
  341. mpdu_info->mpdu_qos_control_valid,
  342. mpdu_info->mpdu_ht_control_valid,
  343. mpdu_info->frame_encryption_info_valid);
  344. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  345. "rx_mpdu_start tlv (3/5) - "
  346. "mpdu_fragment_number:%x "
  347. "more_fragment_flag:%x "
  348. "fr_ds:%x "
  349. "to_ds:%x "
  350. "encrypted:%x "
  351. "mpdu_retry:%x "
  352. "mpdu_sequence_number:%x ",
  353. mpdu_info->mpdu_fragment_number,
  354. mpdu_info->more_fragment_flag,
  355. mpdu_info->fr_ds,
  356. mpdu_info->to_ds,
  357. mpdu_info->encrypted,
  358. mpdu_info->mpdu_retry,
  359. mpdu_info->mpdu_sequence_number);
  360. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  361. "rx_mpdu_start tlv (4/5) - "
  362. "mpdu_frame_control_field:%x "
  363. "mpdu_duration_field:%x ",
  364. mpdu_info->mpdu_frame_control_field,
  365. mpdu_info->mpdu_duration_field);
  366. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  367. "rx_mpdu_start tlv (5/5) - "
  368. "mac_addr_ad1_31_0:%x "
  369. "mac_addr_ad1_47_32:%x "
  370. "mac_addr_ad2_15_0:%x "
  371. "mac_addr_ad2_47_16:%x "
  372. "mac_addr_ad3_31_0:%x "
  373. "mac_addr_ad3_47_32:%x "
  374. "mpdu_sequence_control_field :%x",
  375. mpdu_info->mac_addr_ad1_31_0,
  376. mpdu_info->mac_addr_ad1_47_32,
  377. mpdu_info->mac_addr_ad2_15_0,
  378. mpdu_info->mac_addr_ad2_47_16,
  379. mpdu_info->mac_addr_ad3_31_0,
  380. mpdu_info->mac_addr_ad3_47_32,
  381. mpdu_info->mpdu_sequence_control_field);
  382. }
  383. /**
  384. * hal_rx_dump_msdu_end_tlv_5332() - dump RX msdu_end TLV in structured
  385. * human readable format.
  386. * @msduend: pointer the msdu_end TLV in pkt.
  387. * @dbg_level: log level.
  388. *
  389. * Return: void
  390. */
  391. static void hal_rx_dump_msdu_end_tlv_5332(void *msduend,
  392. uint8_t dbg_level)
  393. {
  394. struct rx_msdu_end_compact *msdu_end =
  395. (struct rx_msdu_end_compact *)msduend;
  396. QDF_TRACE(QDF_MODULE_ID_DP, dbg_level,
  397. "rx_msdu_end tlv - "
  398. "key_id_octet: %d "
  399. "tcp_udp_chksum: %d "
  400. "sa_idx_timeout: %d "
  401. "da_idx_timeout: %d "
  402. "msdu_limit_error: %d "
  403. "flow_idx_timeout: %d "
  404. "flow_idx_invalid: %d "
  405. "wifi_parser_error: %d "
  406. "sa_is_valid: %d "
  407. "da_is_valid: %d "
  408. "da_is_mcbc: %d "
  409. "tkip_mic_err: %d "
  410. "l3_header_padding: %d "
  411. "first_msdu: %d "
  412. "last_msdu: %d "
  413. "sa_idx: %d "
  414. "msdu_drop: %d "
  415. "reo_destination_indication: %d "
  416. "flow_idx: %d "
  417. "fse_metadata: %d "
  418. "cce_metadata: %d "
  419. "sa_sw_peer_id: %d ",
  420. msdu_end->key_id_octet,
  421. msdu_end->tcp_udp_chksum,
  422. msdu_end->sa_idx_timeout,
  423. msdu_end->da_idx_timeout,
  424. msdu_end->msdu_limit_error,
  425. msdu_end->flow_idx_timeout,
  426. msdu_end->flow_idx_invalid,
  427. msdu_end->wifi_parser_error,
  428. msdu_end->sa_is_valid,
  429. msdu_end->da_is_valid,
  430. msdu_end->da_is_mcbc,
  431. msdu_end->tkip_mic_err,
  432. msdu_end->l3_header_padding,
  433. msdu_end->first_msdu,
  434. msdu_end->last_msdu,
  435. msdu_end->sa_idx,
  436. msdu_end->msdu_drop,
  437. msdu_end->reo_destination_indication,
  438. msdu_end->flow_idx,
  439. msdu_end->fse_metadata,
  440. msdu_end->cce_metadata,
  441. msdu_end->sa_sw_peer_id);
  442. }
  443. #else
  444. static inline void hal_rx_dump_mpdu_start_tlv_5332(void *mpdustart,
  445. uint8_t dbg_level)
  446. {
  447. struct rx_mpdu_start *mpdu_start = (struct rx_mpdu_start *)mpdustart;
  448. struct rx_mpdu_info *mpdu_info =
  449. (struct rx_mpdu_info *)&mpdu_start->rx_mpdu_info_details;
  450. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  451. "rx_mpdu_start tlv (1/5) - "
  452. "rx_reo_queue_desc_addr_31_0 :%x"
  453. "rx_reo_queue_desc_addr_39_32 :%x"
  454. "receive_queue_number:%x "
  455. "pre_delim_err_warning:%x "
  456. "first_delim_err:%x "
  457. "reserved_2a:%x "
  458. "pn_31_0:%x "
  459. "pn_63_32:%x "
  460. "pn_95_64:%x "
  461. "pn_127_96:%x "
  462. "epd_en:%x "
  463. "all_frames_shall_be_encrypted :%x"
  464. "encrypt_type:%x "
  465. "wep_key_width_for_variable_key :%x"
  466. "mesh_sta:%x "
  467. "bssid_hit:%x "
  468. "bssid_number:%x "
  469. "tid:%x "
  470. "reserved_7a:%x ",
  471. mpdu_info->rx_reo_queue_desc_addr_31_0,
  472. mpdu_info->rx_reo_queue_desc_addr_39_32,
  473. mpdu_info->receive_queue_number,
  474. mpdu_info->pre_delim_err_warning,
  475. mpdu_info->first_delim_err,
  476. mpdu_info->reserved_2a,
  477. mpdu_info->pn_31_0,
  478. mpdu_info->pn_63_32,
  479. mpdu_info->pn_95_64,
  480. mpdu_info->pn_127_96,
  481. mpdu_info->epd_en,
  482. mpdu_info->all_frames_shall_be_encrypted,
  483. mpdu_info->encrypt_type,
  484. mpdu_info->wep_key_width_for_variable_key,
  485. mpdu_info->mesh_sta,
  486. mpdu_info->bssid_hit,
  487. mpdu_info->bssid_number,
  488. mpdu_info->tid,
  489. mpdu_info->reserved_7a);
  490. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  491. "rx_mpdu_start tlv (2/5) - "
  492. "ast_index:%x "
  493. "sw_peer_id:%x "
  494. "mpdu_frame_control_valid:%x "
  495. "mpdu_duration_valid:%x "
  496. "mac_addr_ad1_valid:%x "
  497. "mac_addr_ad2_valid:%x "
  498. "mac_addr_ad3_valid:%x "
  499. "mac_addr_ad4_valid:%x "
  500. "mpdu_sequence_control_valid :%x"
  501. "mpdu_qos_control_valid:%x "
  502. "mpdu_ht_control_valid:%x "
  503. "frame_encryption_info_valid :%x",
  504. mpdu_info->ast_index,
  505. mpdu_info->sw_peer_id,
  506. mpdu_info->mpdu_frame_control_valid,
  507. mpdu_info->mpdu_duration_valid,
  508. mpdu_info->mac_addr_ad1_valid,
  509. mpdu_info->mac_addr_ad2_valid,
  510. mpdu_info->mac_addr_ad3_valid,
  511. mpdu_info->mac_addr_ad4_valid,
  512. mpdu_info->mpdu_sequence_control_valid,
  513. mpdu_info->mpdu_qos_control_valid,
  514. mpdu_info->mpdu_ht_control_valid,
  515. mpdu_info->frame_encryption_info_valid);
  516. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  517. "rx_mpdu_start tlv (3/5) - "
  518. "mpdu_fragment_number:%x "
  519. "more_fragment_flag:%x "
  520. "reserved_11a:%x "
  521. "fr_ds:%x "
  522. "to_ds:%x "
  523. "encrypted:%x "
  524. "mpdu_retry:%x "
  525. "mpdu_sequence_number:%x ",
  526. mpdu_info->mpdu_fragment_number,
  527. mpdu_info->more_fragment_flag,
  528. mpdu_info->reserved_11a,
  529. mpdu_info->fr_ds,
  530. mpdu_info->to_ds,
  531. mpdu_info->encrypted,
  532. mpdu_info->mpdu_retry,
  533. mpdu_info->mpdu_sequence_number);
  534. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  535. "rx_mpdu_start tlv (4/5) - "
  536. "mpdu_frame_control_field:%x "
  537. "mpdu_duration_field:%x ",
  538. mpdu_info->mpdu_frame_control_field,
  539. mpdu_info->mpdu_duration_field);
  540. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  541. "rx_mpdu_start tlv (5/5) - "
  542. "mac_addr_ad1_31_0:%x "
  543. "mac_addr_ad1_47_32:%x "
  544. "mac_addr_ad2_15_0:%x "
  545. "mac_addr_ad2_47_16:%x "
  546. "mac_addr_ad3_31_0:%x "
  547. "mac_addr_ad3_47_32:%x "
  548. "mpdu_sequence_control_field :%x"
  549. "mac_addr_ad4_31_0:%x "
  550. "mac_addr_ad4_47_32:%x "
  551. "mpdu_qos_control_field:%x ",
  552. mpdu_info->mac_addr_ad1_31_0,
  553. mpdu_info->mac_addr_ad1_47_32,
  554. mpdu_info->mac_addr_ad2_15_0,
  555. mpdu_info->mac_addr_ad2_47_16,
  556. mpdu_info->mac_addr_ad3_31_0,
  557. mpdu_info->mac_addr_ad3_47_32,
  558. mpdu_info->mpdu_sequence_control_field,
  559. mpdu_info->mac_addr_ad4_31_0,
  560. mpdu_info->mac_addr_ad4_47_32,
  561. mpdu_info->mpdu_qos_control_field);
  562. }
  563. static void hal_rx_dump_msdu_end_tlv_5332(void *msduend,
  564. uint8_t dbg_level)
  565. {
  566. struct rx_msdu_end *msdu_end =
  567. (struct rx_msdu_end *)msduend;
  568. QDF_TRACE(QDF_MODULE_ID_DP, dbg_level,
  569. "rx_msdu_end tlv - "
  570. "key_id_octet: %d "
  571. "cce_super_rule: %d "
  572. "cce_classify_not_done_truncat: %d "
  573. "cce_classify_not_done_cce_dis: %d "
  574. "rule_indication_31_0: %d "
  575. "tcp_udp_chksum: %d "
  576. "sa_idx_timeout: %d "
  577. "da_idx_timeout: %d "
  578. "msdu_limit_error: %d "
  579. "flow_idx_timeout: %d "
  580. "flow_idx_invalid: %d "
  581. "wifi_parser_error: %d "
  582. "sa_is_valid: %d "
  583. "da_is_valid: %d "
  584. "da_is_mcbc: %d "
  585. "tkip_mic_err: %d "
  586. "l3_header_padding: %d "
  587. "first_msdu: %d "
  588. "last_msdu: %d "
  589. "sa_idx: %d "
  590. "msdu_drop: %d "
  591. "reo_destination_indication: %d "
  592. "flow_idx: %d "
  593. "fse_metadata: %d "
  594. "cce_metadata: %d "
  595. "sa_sw_peer_id: %d ",
  596. msdu_end->key_id_octet,
  597. msdu_end->cce_super_rule,
  598. msdu_end->cce_classify_not_done_truncate,
  599. msdu_end->cce_classify_not_done_cce_dis,
  600. msdu_end->rule_indication_31_0,
  601. msdu_end->tcp_udp_chksum,
  602. msdu_end->sa_idx_timeout,
  603. msdu_end->da_idx_timeout,
  604. msdu_end->msdu_limit_error,
  605. msdu_end->flow_idx_timeout,
  606. msdu_end->flow_idx_invalid,
  607. msdu_end->wifi_parser_error,
  608. msdu_end->sa_is_valid,
  609. msdu_end->da_is_valid,
  610. msdu_end->da_is_mcbc,
  611. msdu_end->tkip_mic_err,
  612. msdu_end->l3_header_padding,
  613. msdu_end->first_msdu,
  614. msdu_end->last_msdu,
  615. msdu_end->sa_idx,
  616. msdu_end->msdu_drop,
  617. msdu_end->reo_destination_indication,
  618. msdu_end->flow_idx,
  619. msdu_end->fse_metadata,
  620. msdu_end->cce_metadata,
  621. msdu_end->sa_sw_peer_id);
  622. }
  623. #endif
  624. /**
  625. * hal_reo_status_get_header_5332() - Process reo desc info
  626. * @ring_desc: Pointer to reo descriptor
  627. * @b: tlv type info
  628. * @h1: Pointer to hal_reo_status_header where info to be stored
  629. *
  630. * Return: none.
  631. *
  632. */
  633. static void hal_reo_status_get_header_5332(hal_ring_desc_t ring_desc,
  634. int b, void *h1)
  635. {
  636. uint64_t *d = (uint64_t *)ring_desc;
  637. uint64_t val1 = 0;
  638. struct hal_reo_status_header *h =
  639. (struct hal_reo_status_header *)h1;
  640. /* Offsets of descriptor fields defined in HW headers start
  641. * from the field after TLV header
  642. */
  643. d += HAL_GET_NUM_QWORDS(sizeof(struct tlv_32_hdr));
  644. switch (b) {
  645. case HAL_REO_QUEUE_STATS_STATUS_TLV:
  646. val1 = d[HAL_OFFSET_QW(REO_GET_QUEUE_STATS_STATUS,
  647. STATUS_HEADER_REO_STATUS_NUMBER)];
  648. break;
  649. case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
  650. val1 = d[HAL_OFFSET_QW(REO_FLUSH_QUEUE_STATUS,
  651. STATUS_HEADER_REO_STATUS_NUMBER)];
  652. break;
  653. case HAL_REO_FLUSH_CACHE_STATUS_TLV:
  654. val1 = d[HAL_OFFSET_QW(REO_FLUSH_CACHE_STATUS,
  655. STATUS_HEADER_REO_STATUS_NUMBER)];
  656. break;
  657. case HAL_REO_UNBLK_CACHE_STATUS_TLV:
  658. val1 = d[HAL_OFFSET_QW(REO_UNBLOCK_CACHE_STATUS,
  659. STATUS_HEADER_REO_STATUS_NUMBER)];
  660. break;
  661. case HAL_REO_TIMOUT_LIST_STATUS_TLV:
  662. val1 = d[HAL_OFFSET_QW(REO_FLUSH_TIMEOUT_LIST_STATUS,
  663. STATUS_HEADER_REO_STATUS_NUMBER)];
  664. break;
  665. case HAL_REO_DESC_THRES_STATUS_TLV:
  666. val1 =
  667. d[HAL_OFFSET_QW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS,
  668. STATUS_HEADER_REO_STATUS_NUMBER)];
  669. break;
  670. case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
  671. val1 = d[HAL_OFFSET_QW(REO_UPDATE_RX_REO_QUEUE_STATUS,
  672. STATUS_HEADER_REO_STATUS_NUMBER)];
  673. break;
  674. default:
  675. qdf_nofl_err("ERROR: Unknown tlv\n");
  676. break;
  677. }
  678. h->cmd_num =
  679. HAL_GET_FIELD(
  680. UNIFORM_REO_STATUS_HEADER, REO_STATUS_NUMBER,
  681. val1);
  682. h->exec_time =
  683. HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER,
  684. CMD_EXECUTION_TIME, val1);
  685. h->status =
  686. HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER,
  687. REO_CMD_EXECUTION_STATUS, val1);
  688. switch (b) {
  689. case HAL_REO_QUEUE_STATS_STATUS_TLV:
  690. val1 = d[HAL_OFFSET_QW(REO_GET_QUEUE_STATS_STATUS,
  691. STATUS_HEADER_TIMESTAMP)];
  692. break;
  693. case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
  694. val1 = d[HAL_OFFSET_QW(REO_FLUSH_QUEUE_STATUS,
  695. STATUS_HEADER_TIMESTAMP)];
  696. break;
  697. case HAL_REO_FLUSH_CACHE_STATUS_TLV:
  698. val1 = d[HAL_OFFSET_QW(REO_FLUSH_CACHE_STATUS,
  699. STATUS_HEADER_TIMESTAMP)];
  700. break;
  701. case HAL_REO_UNBLK_CACHE_STATUS_TLV:
  702. val1 = d[HAL_OFFSET_QW(REO_UNBLOCK_CACHE_STATUS,
  703. STATUS_HEADER_TIMESTAMP)];
  704. break;
  705. case HAL_REO_TIMOUT_LIST_STATUS_TLV:
  706. val1 = d[HAL_OFFSET_QW(REO_FLUSH_TIMEOUT_LIST_STATUS,
  707. STATUS_HEADER_TIMESTAMP)];
  708. break;
  709. case HAL_REO_DESC_THRES_STATUS_TLV:
  710. val1 =
  711. d[HAL_OFFSET_QW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS,
  712. STATUS_HEADER_TIMESTAMP)];
  713. break;
  714. case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
  715. val1 = d[HAL_OFFSET_QW(REO_UPDATE_RX_REO_QUEUE_STATUS,
  716. STATUS_HEADER_TIMESTAMP)];
  717. break;
  718. default:
  719. qdf_nofl_err("ERROR: Unknown tlv\n");
  720. break;
  721. }
  722. h->tstamp =
  723. HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER, TIMESTAMP, val1);
  724. }
  725. static
  726. void *hal_rx_msdu0_buffer_addr_lsb_5332(void *link_desc_va)
  727. {
  728. return (void *)HAL_RX_MSDU0_BUFFER_ADDR_LSB(link_desc_va);
  729. }
  730. static
  731. void *hal_rx_msdu_desc_info_ptr_get_5332(void *msdu0)
  732. {
  733. return (void *)HAL_RX_MSDU_DESC_INFO_PTR_GET(msdu0);
  734. }
  735. static
  736. void *hal_ent_mpdu_desc_info_5332(void *ent_ring_desc)
  737. {
  738. return (void *)HAL_ENT_MPDU_DESC_INFO(ent_ring_desc);
  739. }
  740. static
  741. void *hal_dst_mpdu_desc_info_5332(void *dst_ring_desc)
  742. {
  743. return (void *)HAL_DST_MPDU_DESC_INFO(dst_ring_desc);
  744. }
  745. /**
  746. * hal_reo_config_5332() - Set reo config parameters
  747. * @soc: hal soc handle
  748. * @reg_val: value to be set
  749. * @reo_params: reo parameters
  750. *
  751. * Return: void
  752. */
  753. static void
  754. hal_reo_config_5332(struct hal_soc *soc,
  755. uint32_t reg_val,
  756. struct hal_reo_params *reo_params)
  757. {
  758. HAL_REO_R0_CONFIG(soc, reg_val, reo_params);
  759. }
  760. /**
  761. * hal_rx_msdu_desc_info_get_ptr_5332() - Get msdu desc info ptr
  762. * @msdu_details_ptr: Pointer to msdu_details_ptr
  763. *
  764. * Return: Pointer to rx_msdu_desc_info structure.
  765. *
  766. */
  767. static void *hal_rx_msdu_desc_info_get_ptr_5332(void *msdu_details_ptr)
  768. {
  769. return HAL_RX_MSDU_DESC_INFO_GET(msdu_details_ptr);
  770. }
  771. /**
  772. * hal_rx_link_desc_msdu0_ptr_5332() - Get pointer to rx_msdu details
  773. * @link_desc: Pointer to link desc
  774. *
  775. * Return: Pointer to rx_msdu_details structure
  776. *
  777. */
  778. static void *hal_rx_link_desc_msdu0_ptr_5332(void *link_desc)
  779. {
  780. return HAL_RX_LINK_DESC_MSDU0_PTR(link_desc);
  781. }
  782. /**
  783. * hal_get_window_address_5332() - Function to get hp/tp address
  784. * @hal_soc: Pointer to hal_soc
  785. * @addr: address offset of register
  786. *
  787. * Return: modified address offset of register
  788. */
  789. static inline qdf_iomem_t hal_get_window_address_5332(struct hal_soc *hal_soc,
  790. qdf_iomem_t addr)
  791. {
  792. uint32_t offset = addr - hal_soc->dev_base_addr;
  793. qdf_iomem_t new_offset;
  794. /*
  795. * Check if offset lies within CE register range(0x740000)
  796. * or UMAC/DP register range (0x00A00000).
  797. * If offset lies within CE register range, map it
  798. * into CE region.
  799. */
  800. if (offset < 0xA00000) {
  801. offset = offset - CE_CFG_WFSS_CE_REG_BASE;
  802. new_offset = (hal_soc->dev_base_addr_ce + offset);
  803. return new_offset;
  804. } else {
  805. /*
  806. * If offset lies within DP register range,
  807. * return the address as such
  808. */
  809. return addr;
  810. }
  811. }
  812. static
  813. void hal_compute_reo_remap_ix2_ix3_5332(uint32_t *ring, uint32_t num_rings,
  814. uint32_t *remap1, uint32_t *remap2)
  815. {
  816. switch (num_rings) {
  817. case 1:
  818. *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
  819. HAL_REO_REMAP_IX2(ring[0], 17) |
  820. HAL_REO_REMAP_IX2(ring[0], 18) |
  821. HAL_REO_REMAP_IX2(ring[0], 19) |
  822. HAL_REO_REMAP_IX2(ring[0], 20) |
  823. HAL_REO_REMAP_IX2(ring[0], 21) |
  824. HAL_REO_REMAP_IX2(ring[0], 22) |
  825. HAL_REO_REMAP_IX2(ring[0], 23);
  826. *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
  827. HAL_REO_REMAP_IX3(ring[0], 25) |
  828. HAL_REO_REMAP_IX3(ring[0], 26) |
  829. HAL_REO_REMAP_IX3(ring[0], 27) |
  830. HAL_REO_REMAP_IX3(ring[0], 28) |
  831. HAL_REO_REMAP_IX3(ring[0], 29) |
  832. HAL_REO_REMAP_IX3(ring[0], 30) |
  833. HAL_REO_REMAP_IX3(ring[0], 31);
  834. break;
  835. case 2:
  836. *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
  837. HAL_REO_REMAP_IX2(ring[0], 17) |
  838. HAL_REO_REMAP_IX2(ring[1], 18) |
  839. HAL_REO_REMAP_IX2(ring[1], 19) |
  840. HAL_REO_REMAP_IX2(ring[0], 20) |
  841. HAL_REO_REMAP_IX2(ring[0], 21) |
  842. HAL_REO_REMAP_IX2(ring[1], 22) |
  843. HAL_REO_REMAP_IX2(ring[1], 23);
  844. *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
  845. HAL_REO_REMAP_IX3(ring[0], 25) |
  846. HAL_REO_REMAP_IX3(ring[1], 26) |
  847. HAL_REO_REMAP_IX3(ring[1], 27) |
  848. HAL_REO_REMAP_IX3(ring[0], 28) |
  849. HAL_REO_REMAP_IX3(ring[0], 29) |
  850. HAL_REO_REMAP_IX3(ring[1], 30) |
  851. HAL_REO_REMAP_IX3(ring[1], 31);
  852. break;
  853. case 3:
  854. *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
  855. HAL_REO_REMAP_IX2(ring[1], 17) |
  856. HAL_REO_REMAP_IX2(ring[2], 18) |
  857. HAL_REO_REMAP_IX2(ring[0], 19) |
  858. HAL_REO_REMAP_IX2(ring[1], 20) |
  859. HAL_REO_REMAP_IX2(ring[2], 21) |
  860. HAL_REO_REMAP_IX2(ring[0], 22) |
  861. HAL_REO_REMAP_IX2(ring[1], 23);
  862. *remap2 = HAL_REO_REMAP_IX3(ring[2], 24) |
  863. HAL_REO_REMAP_IX3(ring[0], 25) |
  864. HAL_REO_REMAP_IX3(ring[1], 26) |
  865. HAL_REO_REMAP_IX3(ring[2], 27) |
  866. HAL_REO_REMAP_IX3(ring[0], 28) |
  867. HAL_REO_REMAP_IX3(ring[1], 29) |
  868. HAL_REO_REMAP_IX3(ring[2], 30) |
  869. HAL_REO_REMAP_IX3(ring[0], 31);
  870. break;
  871. case 4:
  872. *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
  873. HAL_REO_REMAP_IX2(ring[1], 17) |
  874. HAL_REO_REMAP_IX2(ring[2], 18) |
  875. HAL_REO_REMAP_IX2(ring[3], 19) |
  876. HAL_REO_REMAP_IX2(ring[0], 20) |
  877. HAL_REO_REMAP_IX2(ring[1], 21) |
  878. HAL_REO_REMAP_IX2(ring[2], 22) |
  879. HAL_REO_REMAP_IX2(ring[3], 23);
  880. *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
  881. HAL_REO_REMAP_IX3(ring[1], 25) |
  882. HAL_REO_REMAP_IX3(ring[2], 26) |
  883. HAL_REO_REMAP_IX3(ring[3], 27) |
  884. HAL_REO_REMAP_IX3(ring[0], 28) |
  885. HAL_REO_REMAP_IX3(ring[1], 29) |
  886. HAL_REO_REMAP_IX3(ring[2], 30) |
  887. HAL_REO_REMAP_IX3(ring[3], 31);
  888. break;
  889. }
  890. }
  891. /**
  892. * hal_rx_flow_setup_fse_5332() - Setup a flow search entry in HW FST
  893. * @rx_fst: Pointer to the Rx Flow Search Table
  894. * @table_offset: offset into the table where the flow is to be setup
  895. * @rx_flow: Flow Parameters
  896. *
  897. * Return: Success/Failure
  898. */
  899. static void *
  900. hal_rx_flow_setup_fse_5332(uint8_t *rx_fst, uint32_t table_offset,
  901. uint8_t *rx_flow)
  902. {
  903. struct hal_rx_fst *fst = (struct hal_rx_fst *)rx_fst;
  904. struct hal_rx_flow *flow = (struct hal_rx_flow *)rx_flow;
  905. uint8_t *fse;
  906. bool fse_valid;
  907. if (table_offset >= fst->max_entries) {
  908. QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
  909. "HAL FSE table offset %u exceeds max entries %u",
  910. table_offset, fst->max_entries);
  911. return NULL;
  912. }
  913. fse = (uint8_t *)fst->base_vaddr +
  914. (table_offset * HAL_RX_FST_ENTRY_SIZE);
  915. fse_valid = HAL_GET_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID);
  916. if (fse_valid) {
  917. QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
  918. "HAL FSE %pK already valid", fse);
  919. return NULL;
  920. }
  921. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_127_96) =
  922. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_127_96,
  923. qdf_htonl(flow->tuple_info.src_ip_127_96));
  924. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_95_64) =
  925. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_95_64,
  926. qdf_htonl(flow->tuple_info.src_ip_95_64));
  927. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_63_32) =
  928. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_63_32,
  929. qdf_htonl(flow->tuple_info.src_ip_63_32));
  930. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_31_0) =
  931. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_31_0,
  932. qdf_htonl(flow->tuple_info.src_ip_31_0));
  933. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_127_96) =
  934. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_127_96,
  935. qdf_htonl(flow->tuple_info.dest_ip_127_96));
  936. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_95_64) =
  937. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_95_64,
  938. qdf_htonl(flow->tuple_info.dest_ip_95_64));
  939. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_63_32) =
  940. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_63_32,
  941. qdf_htonl(flow->tuple_info.dest_ip_63_32));
  942. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_31_0) =
  943. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_31_0,
  944. qdf_htonl(flow->tuple_info.dest_ip_31_0));
  945. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_PORT);
  946. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_PORT) |=
  947. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_PORT,
  948. (flow->tuple_info.dest_port));
  949. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_PORT);
  950. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_PORT) |=
  951. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_PORT,
  952. (flow->tuple_info.src_port));
  953. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL);
  954. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL) |=
  955. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL,
  956. flow->tuple_info.l4_protocol);
  957. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER);
  958. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER) |=
  959. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER,
  960. flow->reo_destination_handler);
  961. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID);
  962. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID) |=
  963. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, VALID, 1);
  964. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, METADATA);
  965. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, METADATA) =
  966. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, METADATA,
  967. flow->fse_metadata);
  968. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_INDICATION);
  969. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_INDICATION) |=
  970. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY,
  971. REO_DESTINATION_INDICATION,
  972. flow->reo_destination_indication);
  973. /* Reset all the other fields in FSE */
  974. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, RESERVED_9);
  975. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_DROP);
  976. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_COUNT);
  977. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_BYTE_COUNT);
  978. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, TIMESTAMP);
  979. return fse;
  980. }
  981. /**
  982. * hal_rx_dump_pkt_hdr_tlv_5332() - dump RX pkt header TLV in hex format
  983. * @pkt_tlvs: pointer the pkt_hdr_tlv in pkt.
  984. * @dbg_level: log level.
  985. *
  986. * Return: void
  987. */
  988. #ifndef NO_RX_PKT_HDR_TLV
  989. static inline void hal_rx_dump_pkt_hdr_tlv_5332(struct rx_pkt_tlvs *pkt_tlvs,
  990. uint8_t dbg_level)
  991. {
  992. struct rx_pkt_hdr_tlv *pkt_hdr_tlv = &pkt_tlvs->pkt_hdr_tlv;
  993. hal_verbose_debug("\n---------------\n"
  994. "rx_pkt_hdr_tlv\n"
  995. "---------------\n"
  996. "phy_ppdu_id %llu ",
  997. pkt_hdr_tlv->phy_ppdu_id);
  998. hal_verbose_hex_dump(pkt_hdr_tlv->rx_pkt_hdr,
  999. sizeof(pkt_hdr_tlv->rx_pkt_hdr));
  1000. }
  1001. #else
  1002. static inline void hal_rx_dump_pkt_hdr_tlv_5332(struct rx_pkt_tlvs *pkt_tlvs,
  1003. uint8_t dbg_level)
  1004. {
  1005. }
  1006. #endif
  1007. /**
  1008. * hal_rx_dump_pkt_tlvs_5332() - API to print RX Pkt TLVS qca5332
  1009. * @hal_soc_hdl: hal_soc handle
  1010. * @buf: pointer the pkt buffer
  1011. * @dbg_level: log level
  1012. *
  1013. * Return: void
  1014. */
  1015. #ifdef CONFIG_WORD_BASED_TLV
  1016. static void hal_rx_dump_pkt_tlvs_5332(hal_soc_handle_t hal_soc_hdl,
  1017. uint8_t *buf, uint8_t dbg_level)
  1018. {
  1019. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1020. struct rx_msdu_end_compact *msdu_end =
  1021. &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  1022. struct rx_mpdu_start_compact *mpdu_start =
  1023. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  1024. hal_rx_dump_msdu_end_tlv_5332(msdu_end, dbg_level);
  1025. hal_rx_dump_mpdu_start_tlv_5332(mpdu_start, dbg_level);
  1026. hal_rx_dump_pkt_hdr_tlv_5332(pkt_tlvs, dbg_level);
  1027. }
  1028. #else
  1029. static void hal_rx_dump_pkt_tlvs_5332(hal_soc_handle_t hal_soc_hdl,
  1030. uint8_t *buf, uint8_t dbg_level)
  1031. {
  1032. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1033. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  1034. struct rx_mpdu_start *mpdu_start =
  1035. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  1036. hal_rx_dump_msdu_end_tlv_5332(msdu_end, dbg_level);
  1037. hal_rx_dump_mpdu_start_tlv_5332(mpdu_start, dbg_level);
  1038. hal_rx_dump_pkt_hdr_tlv_5332(pkt_tlvs, dbg_level);
  1039. }
  1040. #endif
  1041. #define HAL_NUM_TCL_BANKS_5332 24
  1042. /**
  1043. * hal_cmem_write_5332() - function for CMEM buffer writing
  1044. * @hal_soc_hdl: HAL SOC handle
  1045. * @offset: CMEM address
  1046. * @value: value to write
  1047. *
  1048. * Return: None.
  1049. */
  1050. static void hal_cmem_write_5332(hal_soc_handle_t hal_soc_hdl,
  1051. uint32_t offset,
  1052. uint32_t value)
  1053. {
  1054. struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl;
  1055. /* cmem region is ioremapped from CMEM_REG_BASE, hence subtracting
  1056. * that from offset.
  1057. */
  1058. offset = offset - CMEM_REG_BASE;
  1059. pld_reg_write(hal->qdf_dev->dev, offset, value,
  1060. hal->dev_base_addr_cmem);
  1061. }
  1062. /**
  1063. * hal_tx_get_num_tcl_banks_5332() - Get number of banks in target
  1064. *
  1065. * Return: number of bank
  1066. */
  1067. static uint8_t hal_tx_get_num_tcl_banks_5332(void)
  1068. {
  1069. return HAL_NUM_TCL_BANKS_5332;
  1070. }
  1071. static void hal_reo_setup_5332(struct hal_soc *soc, void *reoparams,
  1072. int qref_reset)
  1073. {
  1074. uint32_t reg_val;
  1075. struct hal_reo_params *reo_params = (struct hal_reo_params *)reoparams;
  1076. reg_val = HAL_REG_READ(soc, HWIO_REO_R0_GENERAL_ENABLE_ADDR(
  1077. REO_REG_REG_BASE));
  1078. hal_reo_config_5332(soc, reg_val, reo_params);
  1079. /* Other ring enable bits and REO_ENABLE will be set by FW */
  1080. /* TODO: Setup destination ring mapping if enabled */
  1081. /* TODO: Error destination ring setting is left to default.
  1082. * Default setting is to send all errors to release ring.
  1083. */
  1084. /* Set the reo descriptor swap bits in case of BIG endian platform */
  1085. hal_setup_reo_swap(soc);
  1086. HAL_REG_WRITE(soc,
  1087. HWIO_REO_R0_AGING_THRESHOLD_IX_0_ADDR(REO_REG_REG_BASE),
  1088. HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000);
  1089. HAL_REG_WRITE(soc,
  1090. HWIO_REO_R0_AGING_THRESHOLD_IX_1_ADDR(REO_REG_REG_BASE),
  1091. (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000));
  1092. HAL_REG_WRITE(soc,
  1093. HWIO_REO_R0_AGING_THRESHOLD_IX_2_ADDR(REO_REG_REG_BASE),
  1094. (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000));
  1095. HAL_REG_WRITE(soc,
  1096. HWIO_REO_R0_AGING_THRESHOLD_IX_3_ADDR(REO_REG_REG_BASE),
  1097. (HAL_DEFAULT_VO_REO_TIMEOUT_MS * 1000));
  1098. /*
  1099. * When hash based routing is enabled, routing of the rx packet
  1100. * is done based on the following value: 1 _ _ _ _ The last 4
  1101. * bits are based on hash[3:0]. This means the possible values
  1102. * are 0x10 to 0x1f. This value is used to look-up the
  1103. * ring ID configured in Destination_Ring_Ctrl_IX_* register.
  1104. * The Destination_Ring_Ctrl_IX_2 and Destination_Ring_Ctrl_IX_3
  1105. * registers need to be configured to set-up the 16 entries to
  1106. * map the hash values to a ring number. There are 3 bits per
  1107. * hash entry – which are mapped as follows:
  1108. * 0: TCL, 1:SW1, 2:SW2, * 3:SW3, 4:SW4, 5:Release, 6:FW(WIFI),
  1109. * 7: NOT_USED.
  1110. */
  1111. if (reo_params->rx_hash_enabled) {
  1112. HAL_REG_WRITE(soc,
  1113. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_1_ADDR
  1114. (REO_REG_REG_BASE), reo_params->remap0);
  1115. hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 0x%x",
  1116. HAL_REG_READ(soc,
  1117. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_1_ADDR(
  1118. REO_REG_REG_BASE)));
  1119. HAL_REG_WRITE(soc,
  1120. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR
  1121. (REO_REG_REG_BASE), reo_params->remap1);
  1122. hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 0x%x",
  1123. HAL_REG_READ(soc,
  1124. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR(
  1125. REO_REG_REG_BASE)));
  1126. HAL_REG_WRITE(soc,
  1127. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR
  1128. (REO_REG_REG_BASE), reo_params->remap2);
  1129. hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR 0x%x",
  1130. HAL_REG_READ(soc,
  1131. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR(
  1132. REO_REG_REG_BASE)));
  1133. }
  1134. /* TODO: Check if the following registers shoould be setup by host:
  1135. * AGING_CONTROL
  1136. * HIGH_MEMORY_THRESHOLD
  1137. * GLOBAL_LINK_DESC_COUNT_THRESH_IX_0[1,2]
  1138. * GLOBAL_LINK_DESC_COUNT_CTRL
  1139. */
  1140. soc->reo_qref = *reo_params->reo_qref;
  1141. hal_reo_shared_qaddr_init((hal_soc_handle_t)soc, qref_reset);
  1142. }
  1143. static uint16_t hal_get_rx_max_ba_window_qca5332(int tid)
  1144. {
  1145. return HAL_RX_BA_WINDOW_1024;
  1146. }
  1147. /**
  1148. * hal_qca5332_get_reo_qdesc_size() - Get the reo queue descriptor size
  1149. * from the give Block-Ack window size
  1150. * @ba_window_size: Block-Ack window size
  1151. * @tid: TID
  1152. *
  1153. * Return: reo queue descriptor size
  1154. */
  1155. static uint32_t hal_qca5332_get_reo_qdesc_size(uint32_t ba_window_size, int tid)
  1156. {
  1157. /* Hardcode the ba_window_size to HAL_RX_MAX_BA_WINDOW for
  1158. * NON_QOS_TID until HW issues are resolved.
  1159. */
  1160. if (tid != HAL_NON_QOS_TID)
  1161. ba_window_size = hal_get_rx_max_ba_window_qca5332(tid);
  1162. /* Return descriptor size corresponding to window size of 2 since
  1163. * we set ba_window_size to 2 while setting up REO descriptors as
  1164. * a WAR to get 2k jump exception aggregates are received without
  1165. * a BA session.
  1166. */
  1167. if (ba_window_size <= 1) {
  1168. if (tid != HAL_NON_QOS_TID)
  1169. return sizeof(struct rx_reo_queue) +
  1170. sizeof(struct rx_reo_queue_ext);
  1171. else
  1172. return sizeof(struct rx_reo_queue);
  1173. }
  1174. if (ba_window_size <= 105)
  1175. return sizeof(struct rx_reo_queue) +
  1176. sizeof(struct rx_reo_queue_ext);
  1177. if (ba_window_size <= 210)
  1178. return sizeof(struct rx_reo_queue) +
  1179. (2 * sizeof(struct rx_reo_queue_ext));
  1180. if (ba_window_size <= 256)
  1181. return sizeof(struct rx_reo_queue) +
  1182. (3 * sizeof(struct rx_reo_queue_ext));
  1183. return sizeof(struct rx_reo_queue) +
  1184. (10 * sizeof(struct rx_reo_queue_ext)) +
  1185. sizeof(struct rx_reo_queue_1k);
  1186. }
  1187. /**
  1188. * hal_rx_tlv_msdu_done_copy_get_5332() - Get msdu done copy bit from rx_tlv
  1189. * @buf: pointer the tx_tlv
  1190. *
  1191. * Return: msdu done copy bit
  1192. */
  1193. static inline uint32_t hal_rx_tlv_msdu_done_copy_get_5332(uint8_t *buf)
  1194. {
  1195. return HAL_RX_TLV_MSDU_DONE_COPY_GET(buf);
  1196. }
  1197. static void hal_hw_txrx_ops_attach_qca5332(struct hal_soc *hal_soc)
  1198. {
  1199. /* init and setup */
  1200. hal_soc->ops->hal_srng_dst_hw_init = hal_srng_dst_hw_init_generic;
  1201. hal_soc->ops->hal_srng_src_hw_init = hal_srng_src_hw_init_generic;
  1202. hal_soc->ops->hal_get_hw_hptp = hal_get_hw_hptp_generic;
  1203. hal_soc->ops->hal_get_window_address = hal_get_window_address_5332;
  1204. hal_soc->ops->hal_cmem_write = hal_cmem_write_5332;
  1205. /* tx */
  1206. hal_soc->ops->hal_tx_set_dscp_tid_map = hal_tx_set_dscp_tid_map_5332;
  1207. hal_soc->ops->hal_tx_update_dscp_tid = hal_tx_update_dscp_tid_5332;
  1208. hal_soc->ops->hal_tx_comp_get_status =
  1209. hal_tx_comp_get_status_generic_be;
  1210. hal_soc->ops->hal_tx_init_cmd_credit_ring =
  1211. hal_tx_init_cmd_credit_ring_5332;
  1212. hal_soc->ops->hal_tx_set_ppe_cmn_cfg = NULL;
  1213. hal_soc->ops->hal_tx_set_ppe_vp_entry = NULL;
  1214. hal_soc->ops->hal_tx_set_ppe_pri2tid = NULL;
  1215. hal_soc->ops->hal_tx_update_ppe_pri2tid = NULL;
  1216. hal_soc->ops->hal_tx_dump_ppe_vp_entry = NULL;
  1217. hal_soc->ops->hal_tx_get_num_ppe_vp_tbl_entries = NULL;
  1218. hal_soc->ops->hal_tx_enable_pri2tid_map = NULL;
  1219. hal_soc->ops->hal_ppeds_cfg_ast_override_map_reg = NULL;
  1220. hal_soc->ops->hal_tx_config_rbm_mapping_be =
  1221. hal_tx_config_rbm_mapping_be_5332;
  1222. /* rx */
  1223. hal_soc->ops->hal_rx_msdu_start_nss_get = hal_rx_tlv_nss_get_be;
  1224. hal_soc->ops->hal_rx_mon_hw_desc_get_mpdu_status =
  1225. hal_rx_mon_hw_desc_get_mpdu_status_be;
  1226. hal_soc->ops->hal_rx_get_tlv = hal_rx_get_tlv_5332;
  1227. hal_soc->ops->hal_rx_proc_phyrx_other_receive_info_tlv =
  1228. hal_rx_proc_phyrx_other_receive_info_tlv_5332;
  1229. hal_soc->ops->hal_rx_dump_msdu_end_tlv = hal_rx_dump_msdu_end_tlv_5332;
  1230. hal_soc->ops->hal_rx_dump_mpdu_start_tlv =
  1231. hal_rx_dump_mpdu_start_tlv_5332;
  1232. hal_soc->ops->hal_rx_dump_pkt_tlvs = hal_rx_dump_pkt_tlvs_5332;
  1233. hal_soc->ops->hal_get_link_desc_size = hal_get_link_desc_size_5332;
  1234. hal_soc->ops->hal_rx_mpdu_start_tid_get = hal_rx_tlv_tid_get_be;
  1235. hal_soc->ops->hal_rx_msdu_start_reception_type_get =
  1236. hal_rx_tlv_reception_type_get_be;
  1237. hal_soc->ops->hal_rx_msdu_end_da_idx_get =
  1238. hal_rx_msdu_end_da_idx_get_be;
  1239. hal_soc->ops->hal_rx_msdu_desc_info_get_ptr =
  1240. hal_rx_msdu_desc_info_get_ptr_5332;
  1241. hal_soc->ops->hal_rx_link_desc_msdu0_ptr =
  1242. hal_rx_link_desc_msdu0_ptr_5332;
  1243. hal_soc->ops->hal_reo_status_get_header =
  1244. hal_reo_status_get_header_5332;
  1245. #ifdef WLAN_PKT_CAPTURE_RX_2_0
  1246. hal_soc->ops->hal_rx_status_get_tlv_info =
  1247. hal_rx_status_get_tlv_info_wrapper_be;
  1248. #endif
  1249. hal_soc->ops->hal_rx_wbm_err_info_get =
  1250. hal_rx_wbm_err_info_get_generic_be;
  1251. hal_soc->ops->hal_tx_set_pcp_tid_map =
  1252. hal_tx_set_pcp_tid_map_generic_be;
  1253. hal_soc->ops->hal_tx_update_pcp_tid_map =
  1254. hal_tx_update_pcp_tid_generic_be;
  1255. hal_soc->ops->hal_tx_set_tidmap_prty =
  1256. hal_tx_update_tidmap_prty_generic_be;
  1257. hal_soc->ops->hal_rx_get_rx_fragment_number =
  1258. hal_rx_get_rx_fragment_number_be,
  1259. hal_soc->ops->hal_rx_msdu_end_da_is_mcbc_get =
  1260. hal_rx_tlv_da_is_mcbc_get_be;
  1261. hal_soc->ops->hal_rx_msdu_end_is_tkip_mic_err =
  1262. hal_rx_tlv_is_tkip_mic_err_get_be;
  1263. hal_soc->ops->hal_rx_msdu_end_sa_is_valid_get =
  1264. hal_rx_tlv_sa_is_valid_get_be;
  1265. hal_soc->ops->hal_rx_msdu_end_sa_idx_get = hal_rx_tlv_sa_idx_get_be;
  1266. hal_soc->ops->hal_rx_desc_is_first_msdu = hal_rx_desc_is_first_msdu_be;
  1267. hal_soc->ops->hal_rx_msdu_end_l3_hdr_padding_get =
  1268. hal_rx_tlv_l3_hdr_padding_get_be;
  1269. hal_soc->ops->hal_rx_encryption_info_valid =
  1270. hal_rx_encryption_info_valid_be;
  1271. hal_soc->ops->hal_rx_print_pn = hal_rx_print_pn_be;
  1272. hal_soc->ops->hal_rx_msdu_end_first_msdu_get =
  1273. hal_rx_tlv_first_msdu_get_be;
  1274. hal_soc->ops->hal_rx_msdu_end_da_is_valid_get =
  1275. hal_rx_tlv_da_is_valid_get_be;
  1276. hal_soc->ops->hal_rx_msdu_end_last_msdu_get =
  1277. hal_rx_tlv_last_msdu_get_be;
  1278. hal_soc->ops->hal_rx_get_mpdu_mac_ad4_valid =
  1279. hal_rx_get_mpdu_mac_ad4_valid_be;
  1280. hal_soc->ops->hal_rx_mpdu_start_sw_peer_id_get =
  1281. hal_rx_mpdu_start_sw_peer_id_get_be;
  1282. hal_soc->ops->hal_rx_tlv_peer_meta_data_get =
  1283. hal_rx_msdu_peer_meta_data_get_be;
  1284. #ifndef CONFIG_WORD_BASED_TLV
  1285. hal_soc->ops->hal_rx_mpdu_get_addr4 = hal_rx_mpdu_get_addr4_be;
  1286. hal_soc->ops->hal_rx_mpdu_info_ampdu_flag_get =
  1287. hal_rx_mpdu_info_ampdu_flag_get_be;
  1288. hal_soc->ops->hal_rx_hw_desc_get_ppduid_get =
  1289. hal_rx_hw_desc_get_ppduid_get_be;
  1290. hal_soc->ops->hal_rx_get_ppdu_id = hal_rx_get_ppdu_id_be;
  1291. hal_soc->ops->hal_rx_tlv_phy_ppdu_id_get =
  1292. hal_rx_attn_phy_ppdu_id_get_be;
  1293. hal_soc->ops->hal_rx_get_filter_category =
  1294. hal_rx_get_filter_category_be;
  1295. #endif
  1296. hal_soc->ops->hal_rx_mpdu_get_to_ds = hal_rx_mpdu_get_to_ds_be;
  1297. hal_soc->ops->hal_rx_mpdu_get_fr_ds = hal_rx_mpdu_get_fr_ds_be;
  1298. hal_soc->ops->hal_rx_get_mpdu_frame_control_valid =
  1299. hal_rx_get_mpdu_frame_control_valid_be;
  1300. hal_soc->ops->hal_rx_mpdu_get_addr1 = hal_rx_mpdu_get_addr1_be;
  1301. hal_soc->ops->hal_rx_mpdu_get_addr2 = hal_rx_mpdu_get_addr2_be;
  1302. hal_soc->ops->hal_rx_mpdu_get_addr3 = hal_rx_mpdu_get_addr3_be;
  1303. hal_soc->ops->hal_rx_get_mpdu_sequence_control_valid =
  1304. hal_rx_get_mpdu_sequence_control_valid_be;
  1305. hal_soc->ops->hal_rx_is_unicast = hal_rx_is_unicast_be;
  1306. hal_soc->ops->hal_rx_tid_get = hal_rx_tid_get_be;
  1307. hal_soc->ops->hal_rx_mpdu_start_mpdu_qos_control_valid_get =
  1308. hal_rx_mpdu_start_mpdu_qos_control_valid_get_be;
  1309. hal_soc->ops->hal_rx_msdu_end_sa_sw_peer_id_get =
  1310. hal_rx_msdu_end_sa_sw_peer_id_get_be;
  1311. hal_soc->ops->hal_rx_msdu0_buffer_addr_lsb =
  1312. hal_rx_msdu0_buffer_addr_lsb_5332;
  1313. hal_soc->ops->hal_rx_msdu_desc_info_ptr_get =
  1314. hal_rx_msdu_desc_info_ptr_get_5332;
  1315. hal_soc->ops->hal_ent_mpdu_desc_info = hal_ent_mpdu_desc_info_5332;
  1316. hal_soc->ops->hal_dst_mpdu_desc_info = hal_dst_mpdu_desc_info_5332;
  1317. hal_soc->ops->hal_rx_get_fc_valid = hal_rx_get_fc_valid_be;
  1318. hal_soc->ops->hal_rx_get_to_ds_flag = hal_rx_get_to_ds_flag_be;
  1319. hal_soc->ops->hal_rx_get_mac_addr2_valid =
  1320. hal_rx_get_mac_addr2_valid_be;
  1321. hal_soc->ops->hal_reo_config = hal_reo_config_5332;
  1322. hal_soc->ops->hal_rx_msdu_flow_idx_get = hal_rx_msdu_flow_idx_get_be;
  1323. hal_soc->ops->hal_rx_msdu_flow_idx_invalid =
  1324. hal_rx_msdu_flow_idx_invalid_be;
  1325. hal_soc->ops->hal_rx_msdu_flow_idx_timeout =
  1326. hal_rx_msdu_flow_idx_timeout_be;
  1327. hal_soc->ops->hal_rx_msdu_fse_metadata_get =
  1328. hal_rx_msdu_fse_metadata_get_be;
  1329. hal_soc->ops->hal_rx_msdu_cce_match_get =
  1330. hal_rx_msdu_cce_match_get_be;
  1331. hal_soc->ops->hal_rx_msdu_cce_metadata_get =
  1332. hal_rx_msdu_cce_metadata_get_be;
  1333. hal_soc->ops->hal_rx_msdu_get_flow_params =
  1334. hal_rx_msdu_get_flow_params_be;
  1335. hal_soc->ops->hal_rx_tlv_get_tcp_chksum = hal_rx_tlv_get_tcp_chksum_be;
  1336. hal_soc->ops->hal_rx_get_rx_sequence = hal_rx_get_rx_sequence_be;
  1337. #if defined(QCA_WIFI_QCA5332) && defined(WLAN_CFR_ENABLE) && \
  1338. defined(WLAN_ENH_CFR_ENABLE)
  1339. hal_soc->ops->hal_rx_get_bb_info = hal_rx_get_bb_info_5332;
  1340. hal_soc->ops->hal_rx_get_rtt_info = hal_rx_get_rtt_info_5332;
  1341. #else
  1342. hal_soc->ops->hal_rx_get_bb_info = NULL;
  1343. hal_soc->ops->hal_rx_get_rtt_info = NULL;
  1344. #endif
  1345. /* rx - msdu fast path info fields */
  1346. hal_soc->ops->hal_rx_msdu_packet_metadata_get =
  1347. hal_rx_msdu_packet_metadata_get_generic_be;
  1348. hal_soc->ops->hal_rx_mpdu_start_tlv_tag_valid =
  1349. hal_rx_mpdu_start_tlv_tag_valid_be;
  1350. hal_soc->ops->hal_rx_wbm_err_msdu_continuation_get =
  1351. hal_rx_wbm_err_msdu_continuation_get_5332;
  1352. /* rx - TLV struct offsets */
  1353. hal_soc->ops->hal_rx_msdu_end_offset_get =
  1354. hal_rx_msdu_end_offset_get_generic;
  1355. hal_soc->ops->hal_rx_mpdu_start_offset_get =
  1356. hal_rx_mpdu_start_offset_get_generic;
  1357. #ifndef NO_RX_PKT_HDR_TLV
  1358. hal_soc->ops->hal_rx_pkt_tlv_offset_get =
  1359. hal_rx_pkt_tlv_offset_get_generic;
  1360. #endif
  1361. hal_soc->ops->hal_rx_flow_setup_fse = hal_rx_flow_setup_fse_5332;
  1362. hal_soc->ops->hal_rx_flow_get_tuple_info =
  1363. hal_rx_flow_get_tuple_info_be;
  1364. hal_soc->ops->hal_rx_flow_delete_entry =
  1365. hal_rx_flow_delete_entry_be;
  1366. hal_soc->ops->hal_rx_fst_get_fse_size = hal_rx_fst_get_fse_size_be;
  1367. hal_soc->ops->hal_compute_reo_remap_ix2_ix3 =
  1368. hal_compute_reo_remap_ix2_ix3_5332;
  1369. hal_soc->ops->hal_rx_msdu_get_reo_destination_indication =
  1370. hal_rx_msdu_get_reo_destination_indication_be;
  1371. hal_soc->ops->hal_rx_get_tlv_size = hal_rx_get_tlv_size_generic_be;
  1372. hal_soc->ops->hal_rx_msdu_is_wlan_mcast =
  1373. hal_rx_msdu_is_wlan_mcast_generic_be;
  1374. hal_soc->ops->hal_tx_get_num_tcl_banks = hal_tx_get_num_tcl_banks_5332;
  1375. hal_soc->ops->hal_rx_tlv_decap_format_get =
  1376. hal_rx_tlv_decap_format_get_be;
  1377. #ifdef RECEIVE_OFFLOAD
  1378. hal_soc->ops->hal_rx_tlv_get_offload_info =
  1379. hal_rx_tlv_get_offload_info_be;
  1380. hal_soc->ops->hal_rx_get_proto_params = hal_rx_get_proto_params_be;
  1381. hal_soc->ops->hal_rx_get_l3_l4_offsets = hal_rx_get_l3_l4_offsets_be;
  1382. #endif
  1383. hal_soc->ops->hal_rx_tlv_msdu_done_get =
  1384. hal_rx_tlv_msdu_done_copy_get_5332;
  1385. hal_soc->ops->hal_rx_tlv_msdu_len_get =
  1386. hal_rx_msdu_start_msdu_len_get_be;
  1387. hal_soc->ops->hal_rx_get_frame_ctrl_field =
  1388. hal_rx_get_frame_ctrl_field_be;
  1389. hal_soc->ops->hal_rx_tlv_csum_err_get = hal_rx_tlv_csum_err_get_be;
  1390. hal_soc->ops->hal_rx_tlv_msdu_len_set =
  1391. hal_rx_msdu_start_msdu_len_set_be;
  1392. hal_soc->ops->hal_rx_tlv_sgi_get = hal_rx_tlv_sgi_get_be;
  1393. hal_soc->ops->hal_rx_tlv_rate_mcs_get = hal_rx_tlv_rate_mcs_get_be;
  1394. hal_soc->ops->hal_rx_tlv_bw_get = hal_rx_tlv_bw_get_be;
  1395. hal_soc->ops->hal_rx_tlv_get_pkt_type = hal_rx_tlv_get_pkt_type_be;
  1396. hal_soc->ops->hal_rx_tlv_mic_err_get = hal_rx_tlv_mic_err_get_be;
  1397. hal_soc->ops->hal_rx_tlv_decrypt_err_get =
  1398. hal_rx_tlv_decrypt_err_get_be;
  1399. hal_soc->ops->hal_rx_tlv_first_mpdu_get = hal_rx_tlv_first_mpdu_get_be;
  1400. hal_soc->ops->hal_rx_tlv_get_is_decrypted =
  1401. hal_rx_tlv_get_is_decrypted_be;
  1402. hal_soc->ops->hal_rx_msdu_get_keyid = hal_rx_msdu_get_keyid_be;
  1403. hal_soc->ops->hal_rx_tlv_get_freq = hal_rx_tlv_get_freq_be;
  1404. hal_soc->ops->hal_rx_priv_info_set_in_tlv =
  1405. hal_rx_priv_info_set_in_tlv_be;
  1406. hal_soc->ops->hal_rx_priv_info_get_from_tlv =
  1407. hal_rx_priv_info_get_from_tlv_be;
  1408. hal_soc->ops->hal_rx_pkt_hdr_get = hal_rx_pkt_hdr_get_be;
  1409. hal_soc->ops->hal_reo_setup = hal_reo_setup_5332;
  1410. #ifdef REO_SHARED_QREF_TABLE_EN
  1411. hal_soc->ops->hal_reo_shared_qaddr_setup = hal_reo_shared_qaddr_setup_be;
  1412. hal_soc->ops->hal_reo_shared_qaddr_init = hal_reo_shared_qaddr_init_be;
  1413. hal_soc->ops->hal_reo_shared_qaddr_detach = hal_reo_shared_qaddr_detach_be;
  1414. hal_soc->ops->hal_reo_shared_qaddr_write = hal_reo_shared_qaddr_write_be;
  1415. hal_soc->ops->hal_reo_shared_qaddr_cache_clear = hal_reo_shared_qaddr_cache_clear_be;
  1416. #endif
  1417. /* Overwrite the default BE ops */
  1418. hal_soc->ops->hal_get_rx_max_ba_window =
  1419. hal_get_rx_max_ba_window_qca5332;
  1420. hal_soc->ops->hal_get_reo_qdesc_size = hal_qca5332_get_reo_qdesc_size;
  1421. /* TX MONITOR */
  1422. #ifdef WLAN_PKT_CAPTURE_TX_2_0
  1423. hal_soc->ops->hal_txmon_is_mon_buf_addr_tlv =
  1424. hal_txmon_is_mon_buf_addr_tlv_generic_be;
  1425. hal_soc->ops->hal_txmon_populate_packet_info =
  1426. hal_txmon_populate_packet_info_generic_be;
  1427. hal_soc->ops->hal_txmon_status_parse_tlv =
  1428. hal_txmon_status_parse_tlv_generic_be;
  1429. hal_soc->ops->hal_txmon_status_get_num_users =
  1430. hal_txmon_status_get_num_users_generic_be;
  1431. #if defined(TX_MONITOR_WORD_MASK)
  1432. hal_soc->ops->hal_txmon_get_word_mask =
  1433. hal_txmon_get_word_mask_qca5332;
  1434. #else
  1435. hal_soc->ops->hal_txmon_get_word_mask =
  1436. hal_txmon_get_word_mask_generic_be;
  1437. #endif /* TX_MONITOR_WORD_MASK */
  1438. #endif /* WLAN_PKT_CAPTURE_TX_2_0 */
  1439. hal_soc->ops->hal_compute_reo_remap_ix0 = NULL;
  1440. hal_soc->ops->hal_tx_vdev_mismatch_routing_set =
  1441. hal_tx_vdev_mismatch_routing_set_generic_be;
  1442. hal_soc->ops->hal_tx_mcast_mlo_reinject_routing_set =
  1443. hal_tx_mcast_mlo_reinject_routing_set_generic_be;
  1444. hal_soc->ops->hal_get_ba_aging_timeout =
  1445. hal_get_ba_aging_timeout_be_generic;
  1446. hal_soc->ops->hal_setup_link_idle_list =
  1447. hal_setup_link_idle_list_generic_be;
  1448. hal_soc->ops->hal_cookie_conversion_reg_cfg_be =
  1449. hal_cookie_conversion_reg_cfg_generic_be;
  1450. hal_soc->ops->hal_set_ba_aging_timeout =
  1451. hal_set_ba_aging_timeout_be_generic;
  1452. hal_soc->ops->hal_tx_populate_bank_register =
  1453. hal_tx_populate_bank_register_be;
  1454. hal_soc->ops->hal_tx_vdev_mcast_ctrl_set =
  1455. hal_tx_vdev_mcast_ctrl_set_be;
  1456. hal_soc->ops->hal_get_tsf2_scratch_reg =
  1457. hal_get_tsf2_scratch_reg_qca5332;
  1458. hal_soc->ops->hal_get_tqm_scratch_reg =
  1459. hal_get_tqm_scratch_reg_qca5332;
  1460. #ifdef CONFIG_WORD_BASED_TLV
  1461. hal_soc->ops->hal_rx_mpdu_start_wmask_get =
  1462. hal_rx_mpdu_start_wmask_get_be;
  1463. hal_soc->ops->hal_rx_msdu_end_wmask_get =
  1464. hal_rx_msdu_end_wmask_get_be;
  1465. #endif
  1466. };
  1467. struct hal_hw_srng_config hw_srng_table_5332[] = {
  1468. /* TODO: max_rings can populated by querying HW capabilities */
  1469. { /* REO_DST */
  1470. .start_ring_id = HAL_SRNG_REO2SW1,
  1471. .max_rings = 8,
  1472. .entry_size = sizeof(struct reo_destination_ring) >> 2,
  1473. .lmac_ring = FALSE,
  1474. .ring_dir = HAL_SRNG_DST_RING,
  1475. .reg_start = {
  1476. HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(
  1477. REO_REG_REG_BASE),
  1478. HWIO_REO_R2_REO2SW1_RING_HP_ADDR(
  1479. REO_REG_REG_BASE)
  1480. },
  1481. .reg_size = {
  1482. HWIO_REO_R0_REO2SW2_RING_BASE_LSB_ADDR(0) -
  1483. HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(0),
  1484. HWIO_REO_R2_REO2SW2_RING_HP_ADDR(0) -
  1485. HWIO_REO_R2_REO2SW1_RING_HP_ADDR(0),
  1486. },
  1487. .max_size =
  1488. HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_BMSK >>
  1489. HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_SHFT,
  1490. },
  1491. { /* REO_EXCEPTION */
  1492. /* Designating REO2SW0 ring as exception ring. This ring is
  1493. * similar to other REO2SW rings though it is named as REO2SW0.
  1494. * Any of theREO2SW rings can be used as exception ring.
  1495. */
  1496. .start_ring_id = HAL_SRNG_REO2SW0,
  1497. .max_rings = 1,
  1498. .entry_size = sizeof(struct reo_destination_ring) >> 2,
  1499. .lmac_ring = FALSE,
  1500. .ring_dir = HAL_SRNG_DST_RING,
  1501. .reg_start = {
  1502. HWIO_REO_R0_REO2SW0_RING_BASE_LSB_ADDR(
  1503. REO_REG_REG_BASE),
  1504. HWIO_REO_R2_REO2SW0_RING_HP_ADDR(
  1505. REO_REG_REG_BASE)
  1506. },
  1507. /* Single ring - provide ring size if multiple rings of this
  1508. * type are supported
  1509. */
  1510. .reg_size = {},
  1511. .max_size =
  1512. HWIO_REO_R0_REO2SW0_RING_BASE_MSB_RING_SIZE_BMSK >>
  1513. HWIO_REO_R0_REO2SW0_RING_BASE_MSB_RING_SIZE_SHFT,
  1514. },
  1515. { /* REO_REINJECT */
  1516. .start_ring_id = HAL_SRNG_SW2REO,
  1517. .max_rings = 4,
  1518. .entry_size = sizeof(struct reo_entrance_ring) >> 2,
  1519. .lmac_ring = FALSE,
  1520. .ring_dir = HAL_SRNG_SRC_RING,
  1521. .reg_start = {
  1522. HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(
  1523. REO_REG_REG_BASE),
  1524. HWIO_REO_R2_SW2REO_RING_HP_ADDR(
  1525. REO_REG_REG_BASE)
  1526. },
  1527. /* Single ring - provide ring size if multiple rings of this
  1528. * type are supported
  1529. */
  1530. .reg_size = {
  1531. HWIO_REO_R0_SW2REO1_RING_BASE_LSB_ADDR(0) -
  1532. HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(0),
  1533. HWIO_REO_R2_SW2REO1_RING_HP_ADDR(0) -
  1534. HWIO_REO_R2_SW2REO_RING_HP_ADDR(0)
  1535. },
  1536. .max_size = HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_BMSK >>
  1537. HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_SHFT,
  1538. },
  1539. { /* REO_CMD */
  1540. .start_ring_id = HAL_SRNG_REO_CMD,
  1541. .max_rings = 1,
  1542. .entry_size = (sizeof(struct tlv_32_hdr) +
  1543. sizeof(struct reo_get_queue_stats)) >> 2,
  1544. .lmac_ring = FALSE,
  1545. .ring_dir = HAL_SRNG_SRC_RING,
  1546. .reg_start = {
  1547. HWIO_REO_R0_REO_CMD_RING_BASE_LSB_ADDR(
  1548. REO_REG_REG_BASE),
  1549. HWIO_REO_R2_REO_CMD_RING_HP_ADDR(
  1550. REO_REG_REG_BASE),
  1551. },
  1552. /* Single ring - provide ring size if multiple rings of this
  1553. * type are supported
  1554. */
  1555. .reg_size = {},
  1556. .max_size = HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_BMSK >>
  1557. HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_SHFT,
  1558. },
  1559. { /* REO_STATUS */
  1560. .start_ring_id = HAL_SRNG_REO_STATUS,
  1561. .max_rings = 1,
  1562. .entry_size = (sizeof(struct tlv_32_hdr) +
  1563. sizeof(struct reo_get_queue_stats_status)) >> 2,
  1564. .lmac_ring = FALSE,
  1565. .ring_dir = HAL_SRNG_DST_RING,
  1566. .reg_start = {
  1567. HWIO_REO_R0_REO_STATUS_RING_BASE_LSB_ADDR(
  1568. REO_REG_REG_BASE),
  1569. HWIO_REO_R2_REO_STATUS_RING_HP_ADDR(
  1570. REO_REG_REG_BASE),
  1571. },
  1572. /* Single ring - provide ring size if multiple rings of this
  1573. * type are supported
  1574. */
  1575. .reg_size = {},
  1576. .max_size =
  1577. HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
  1578. HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
  1579. },
  1580. { /* TCL_DATA */
  1581. .start_ring_id = HAL_SRNG_SW2TCL1,
  1582. .max_rings = 6,
  1583. .entry_size = sizeof(struct tcl_data_cmd) >> 2,
  1584. .lmac_ring = FALSE,
  1585. .ring_dir = HAL_SRNG_SRC_RING,
  1586. .reg_start = {
  1587. HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(
  1588. MAC_TCL_REG_REG_BASE),
  1589. HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(
  1590. MAC_TCL_REG_REG_BASE),
  1591. },
  1592. .reg_size = {
  1593. HWIO_TCL_R0_SW2TCL2_RING_BASE_LSB_ADDR(0) -
  1594. HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(0),
  1595. HWIO_TCL_R2_SW2TCL2_RING_HP_ADDR(0) -
  1596. HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(0),
  1597. },
  1598. .max_size =
  1599. HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >>
  1600. HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT,
  1601. },
  1602. { /* TCL_CMD/CREDIT */
  1603. /* qca8074v2 and qca5332 uses this ring for data commands */
  1604. .start_ring_id = HAL_SRNG_SW2TCL_CMD,
  1605. .max_rings = 1,
  1606. .entry_size = sizeof(struct tcl_data_cmd) >> 2,
  1607. .lmac_ring = FALSE,
  1608. .ring_dir = HAL_SRNG_SRC_RING,
  1609. .reg_start = {
  1610. HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_LSB_ADDR(
  1611. MAC_TCL_REG_REG_BASE),
  1612. HWIO_TCL_R2_SW2TCL_CREDIT_RING_HP_ADDR(
  1613. MAC_TCL_REG_REG_BASE),
  1614. },
  1615. /* Single ring - provide ring size if multiple rings of this
  1616. * type are supported
  1617. */
  1618. .reg_size = {},
  1619. .max_size =
  1620. HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_BMSK >>
  1621. HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_SHFT,
  1622. },
  1623. { /* TCL_STATUS */
  1624. .start_ring_id = HAL_SRNG_TCL_STATUS,
  1625. .max_rings = 1,
  1626. .entry_size = (sizeof(struct tlv_32_hdr) +
  1627. sizeof(struct tcl_status_ring)) >> 2,
  1628. .lmac_ring = FALSE,
  1629. .ring_dir = HAL_SRNG_DST_RING,
  1630. .reg_start = {
  1631. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_LSB_ADDR(
  1632. MAC_TCL_REG_REG_BASE),
  1633. HWIO_TCL_R2_TCL_STATUS1_RING_HP_ADDR(
  1634. MAC_TCL_REG_REG_BASE),
  1635. },
  1636. /* Single ring - provide ring size if multiple rings of this
  1637. * type are supported
  1638. */
  1639. .reg_size = {},
  1640. .max_size =
  1641. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_BMSK >>
  1642. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_SHFT,
  1643. },
  1644. { /* CE_SRC */
  1645. .start_ring_id = HAL_SRNG_CE_0_SRC,
  1646. .max_rings = 16,
  1647. .entry_size = sizeof(struct ce_src_desc) >> 2,
  1648. .lmac_ring = FALSE,
  1649. .ring_dir = HAL_SRNG_SRC_RING,
  1650. .reg_start = {
  1651. HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR(
  1652. WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE),
  1653. HWIO_WFSS_CE_CHANNEL_SRC_R2_SRC_RING_HP_ADDR(
  1654. WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE),
  1655. },
  1656. .reg_size = {
  1657. WFSS_CE_1_CHANNEL_SRC_REG_REG_BASE -
  1658. WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE,
  1659. WFSS_CE_1_CHANNEL_SRC_REG_REG_BASE -
  1660. WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE,
  1661. },
  1662. .max_size =
  1663. HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_MSB_RING_SIZE_BMSK >>
  1664. HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_MSB_RING_SIZE_SHFT,
  1665. },
  1666. { /* CE_DST */
  1667. .start_ring_id = HAL_SRNG_CE_0_DST,
  1668. .max_rings = 16,
  1669. .entry_size = 8 >> 2,
  1670. /*TODO: entry_size above should actually be
  1671. * sizeof(struct ce_dst_desc) >> 2, but couldn't find definition
  1672. * of struct ce_dst_desc in HW header files
  1673. */
  1674. .lmac_ring = FALSE,
  1675. .ring_dir = HAL_SRNG_SRC_RING,
  1676. .reg_start = {
  1677. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR(
  1678. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE),
  1679. HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR(
  1680. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE),
  1681. },
  1682. .reg_size = {
  1683. WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
  1684. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
  1685. WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
  1686. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
  1687. },
  1688. .max_size =
  1689. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
  1690. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
  1691. },
  1692. { /* CE_DST_STATUS */
  1693. .start_ring_id = HAL_SRNG_CE_0_DST_STATUS,
  1694. .max_rings = 16,
  1695. .entry_size = sizeof(struct ce_stat_desc) >> 2,
  1696. .lmac_ring = FALSE,
  1697. .ring_dir = HAL_SRNG_DST_RING,
  1698. .reg_start = {
  1699. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR(
  1700. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE),
  1701. HWIO_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR(
  1702. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE),
  1703. },
  1704. /* TODO: check destination status ring registers */
  1705. .reg_size = {
  1706. WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
  1707. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
  1708. WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
  1709. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
  1710. },
  1711. .max_size =
  1712. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
  1713. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
  1714. },
  1715. { /* WBM_IDLE_LINK */
  1716. .start_ring_id = HAL_SRNG_WBM_IDLE_LINK,
  1717. .max_rings = 1,
  1718. .entry_size = sizeof(struct wbm_link_descriptor_ring) >> 2,
  1719. .lmac_ring = FALSE,
  1720. .ring_dir = HAL_SRNG_SRC_RING,
  1721. .reg_start = {
  1722. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE),
  1723. HWIO_WBM_R2_WBM_IDLE_LINK_RING_HP_ADDR(WBM_REG_REG_BASE),
  1724. },
  1725. /* Single ring - provide ring size if multiple rings of this
  1726. * type are supported
  1727. */
  1728. .reg_size = {},
  1729. .max_size =
  1730. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_BMSK >>
  1731. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_SHFT,
  1732. },
  1733. { /* SW2WBM_RELEASE */
  1734. .start_ring_id = HAL_SRNG_WBM_SW_RELEASE,
  1735. .max_rings = 1,
  1736. .entry_size = sizeof(struct wbm_release_ring) >> 2,
  1737. .lmac_ring = FALSE,
  1738. .ring_dir = HAL_SRNG_SRC_RING,
  1739. .reg_start = {
  1740. HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE),
  1741. HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE),
  1742. },
  1743. /* Single ring - provide ring size if multiple rings of this
  1744. * type are supported
  1745. */
  1746. .reg_size = {},
  1747. .max_size =
  1748. HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
  1749. HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
  1750. },
  1751. { /* WBM2SW_RELEASE */
  1752. .start_ring_id = HAL_SRNG_WBM2SW0_RELEASE,
  1753. .max_rings = 8,
  1754. .entry_size = sizeof(struct wbm_release_ring) >> 2,
  1755. .lmac_ring = FALSE,
  1756. .ring_dir = HAL_SRNG_DST_RING,
  1757. .reg_start = {
  1758. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(
  1759. WBM_REG_REG_BASE),
  1760. HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(
  1761. WBM_REG_REG_BASE),
  1762. },
  1763. .reg_size = {
  1764. HWIO_WBM_R0_WBM2SW1_RELEASE_RING_BASE_LSB_ADDR(
  1765. WBM_REG_REG_BASE) -
  1766. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(
  1767. WBM_REG_REG_BASE),
  1768. HWIO_WBM_R2_WBM2SW1_RELEASE_RING_HP_ADDR(
  1769. WBM_REG_REG_BASE) -
  1770. HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(
  1771. WBM_REG_REG_BASE),
  1772. },
  1773. .max_size =
  1774. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
  1775. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
  1776. },
  1777. { /* RXDMA_BUF */
  1778. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF0,
  1779. #ifdef IPA_OFFLOAD
  1780. .max_rings = 3,
  1781. #else
  1782. .max_rings = 3,
  1783. #endif
  1784. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  1785. .lmac_ring = TRUE,
  1786. .ring_dir = HAL_SRNG_SRC_RING,
  1787. /* reg_start is not set because LMAC rings are not accessed
  1788. * from host
  1789. */
  1790. .reg_start = {},
  1791. .reg_size = {},
  1792. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  1793. },
  1794. { /* RXDMA_DST */
  1795. .start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW0,
  1796. .max_rings = 0,
  1797. .entry_size = 0/*sizeof(struct reo_entrance_ring) >> 2*/,
  1798. .lmac_ring = TRUE,
  1799. .ring_dir = HAL_SRNG_DST_RING,
  1800. /* reg_start is not set because LMAC rings are not accessed
  1801. * from host
  1802. */
  1803. .reg_start = {},
  1804. .reg_size = {},
  1805. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  1806. },
  1807. #ifdef WLAN_PKT_CAPTURE_RX_2_0
  1808. { /* RXDMA_MONITOR_BUF */
  1809. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA2_BUF,
  1810. .max_rings = 1,
  1811. .entry_size = sizeof(struct mon_ingress_ring) >> 2,
  1812. .lmac_ring = TRUE,
  1813. .ring_dir = HAL_SRNG_SRC_RING,
  1814. /* reg_start is not set because LMAC rings are not accessed
  1815. * from host
  1816. */
  1817. .reg_start = {},
  1818. .reg_size = {},
  1819. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1820. },
  1821. #else
  1822. {},
  1823. #endif
  1824. { /* RXDMA_MONITOR_STATUS */
  1825. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF,
  1826. .max_rings = 0,
  1827. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  1828. .lmac_ring = TRUE,
  1829. .ring_dir = HAL_SRNG_SRC_RING,
  1830. /* reg_start is not set because LMAC rings are not accessed
  1831. * from host
  1832. */
  1833. .reg_start = {},
  1834. .reg_size = {},
  1835. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  1836. },
  1837. #ifdef WLAN_PKT_CAPTURE_RX_2_0
  1838. { /* RXDMA_MONITOR_DST */
  1839. .start_ring_id = HAL_SRNG_WMAC1_RXMON2SW0,
  1840. .max_rings = 2,
  1841. .entry_size = sizeof(struct mon_destination_ring) >> 2,
  1842. .lmac_ring = TRUE,
  1843. .ring_dir = HAL_SRNG_DST_RING,
  1844. /* reg_start is not set because LMAC rings are not accessed
  1845. * from host
  1846. */
  1847. .reg_start = {},
  1848. .reg_size = {},
  1849. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1850. },
  1851. #else
  1852. {},
  1853. #endif
  1854. { /* RXDMA_MONITOR_DESC */
  1855. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_DESC,
  1856. .max_rings = 0,
  1857. .entry_size = 0/*sizeof(struct sw_monitor_ring) >> 2*/,
  1858. .lmac_ring = TRUE,
  1859. .ring_dir = HAL_SRNG_DST_RING,
  1860. /* reg_start is not set because LMAC rings are not accessed
  1861. * from host
  1862. */
  1863. .reg_start = {},
  1864. .reg_size = {},
  1865. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1866. },
  1867. { /* DIR_BUF_RX_DMA_SRC */
  1868. .start_ring_id = HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING,
  1869. /* one ring for spectral, one ring for cfr and
  1870. * another one ring for txbf cv upload.
  1871. */
  1872. .max_rings = 3,
  1873. .entry_size = 2,
  1874. .lmac_ring = TRUE,
  1875. .ring_dir = HAL_SRNG_SRC_RING,
  1876. /* reg_start is not set because LMAC rings are not accessed
  1877. * from host
  1878. */
  1879. .reg_start = {},
  1880. .reg_size = {},
  1881. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  1882. },
  1883. #ifdef WLAN_FEATURE_CIF_CFR
  1884. { /* WIFI_POS_SRC */
  1885. .start_ring_id = HAL_SRNG_WIFI_POS_SRC_DMA_RING,
  1886. .max_rings = 1,
  1887. .entry_size = sizeof(wmi_oem_dma_buf_release_entry) >> 2,
  1888. .lmac_ring = TRUE,
  1889. .ring_dir = HAL_SRNG_SRC_RING,
  1890. /* reg_start is not set because LMAC rings are not accessed
  1891. * from host
  1892. */
  1893. .reg_start = {},
  1894. .reg_size = {},
  1895. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1896. },
  1897. #endif
  1898. /* PPE rings are not present in Miami. Added dummy entries to preserve
  1899. * Array Index
  1900. */
  1901. /* REO2PPE */
  1902. {},
  1903. /* PPE2TCL */
  1904. {},
  1905. /* PPE_RELEASE */
  1906. {},
  1907. #ifdef WLAN_PKT_CAPTURE_TX_2_0
  1908. { /* TX_MONITOR_BUF */
  1909. .start_ring_id = HAL_SRNG_SW2TXMON_BUF0,
  1910. .max_rings = 1,
  1911. .entry_size = sizeof(struct mon_ingress_ring) >> 2,
  1912. .lmac_ring = TRUE,
  1913. .ring_dir = HAL_SRNG_SRC_RING,
  1914. /* reg_start is not set because LMAC rings are not accessed
  1915. * from host
  1916. */
  1917. .reg_start = {},
  1918. .reg_size = {},
  1919. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1920. },
  1921. { /* TX_MONITOR_DST */
  1922. .start_ring_id = HAL_SRNG_WMAC1_TXMON2SW0,
  1923. .max_rings = 2,
  1924. .entry_size = sizeof(struct mon_destination_ring) >> 2,
  1925. .lmac_ring = TRUE,
  1926. .ring_dir = HAL_SRNG_DST_RING,
  1927. /* reg_start is not set because LMAC rings are not accessed
  1928. * from host
  1929. */
  1930. .reg_start = {},
  1931. .reg_size = {},
  1932. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1933. },
  1934. #else
  1935. {},
  1936. {},
  1937. #endif
  1938. { /* SW2RXDMA */
  1939. .start_ring_id = HAL_SRNG_SW2RXDMA_BUF0,
  1940. .max_rings = 3,
  1941. .entry_size = sizeof(struct reo_entrance_ring) >> 2,
  1942. .lmac_ring = TRUE,
  1943. .ring_dir = HAL_SRNG_SRC_RING,
  1944. /* reg_start is not set because LMAC rings are not accessed
  1945. * from host
  1946. */
  1947. .reg_start = {},
  1948. .reg_size = {},
  1949. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1950. .dmac_cmn_ring = TRUE,
  1951. },
  1952. { /* SW2RXDMA_LINK_RELEASE */ 0},
  1953. };
  1954. /**
  1955. * hal_srng_hw_reg_offset_init_qca5332() - Initialize the HW srng reg offset
  1956. * applicable only for qca5332
  1957. * @hal_soc: HAL Soc handle
  1958. *
  1959. * Return: None
  1960. */
  1961. static inline void hal_srng_hw_reg_offset_init_qca5332(struct hal_soc *hal_soc)
  1962. {
  1963. int32_t *hw_reg_offset = hal_soc->hal_hw_reg_offset;
  1964. hw_reg_offset[DST_MSI2_BASE_LSB] = REG_OFFSET(DST, MSI2_BASE_LSB),
  1965. hw_reg_offset[DST_MSI2_BASE_MSB] = REG_OFFSET(DST, MSI2_BASE_MSB),
  1966. hw_reg_offset[DST_MSI2_DATA] = REG_OFFSET(DST, MSI2_DATA),
  1967. hw_reg_offset[DST_PRODUCER_INT2_SETUP] =
  1968. REG_OFFSET(DST, PRODUCER_INT2_SETUP);
  1969. }
  1970. /**
  1971. * hal_qca5332_attach() - Attach 5332 target specific hal_soc ops,
  1972. * offset and srng table
  1973. * @hal_soc: hal_soc handle
  1974. *
  1975. * Return: void
  1976. */
  1977. void hal_qca5332_attach(struct hal_soc *hal_soc)
  1978. {
  1979. hal_soc->hw_srng_table = hw_srng_table_5332;
  1980. hal_srng_hw_reg_offset_init_generic(hal_soc);
  1981. hal_srng_hw_reg_offset_init_qca5332(hal_soc);
  1982. hal_hw_txrx_default_ops_attach_be(hal_soc);
  1983. hal_hw_txrx_ops_attach_qca5332(hal_soc);
  1984. hal_soc->dmac_cmn_src_rxbuf_ring = true;
  1985. }