hal_5332.c 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124
  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 QCA_MONITOR_2_0_SUPPORT
  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. #ifdef QCA_MONITOR_2_0_SUPPORT
  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. *
  202. * Return: uint32_t
  203. */
  204. static inline
  205. void hal_rx_proc_phyrx_other_receive_info_tlv_5332(void *rx_tlv_hdr,
  206. void *ppdu_info_hdl)
  207. {
  208. uint32_t tlv_tag, tlv_len;
  209. uint32_t temp_len, other_tlv_len, other_tlv_tag;
  210. void *rx_tlv = (uint8_t *)rx_tlv_hdr + HAL_RX_TLV32_HDR_SIZE;
  211. void *other_tlv_hdr = NULL;
  212. void *other_tlv = NULL;
  213. tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(rx_tlv_hdr);
  214. tlv_len = HAL_RX_GET_USER_TLV32_LEN(rx_tlv_hdr);
  215. temp_len = 0;
  216. other_tlv_hdr = rx_tlv + HAL_RX_TLV32_HDR_SIZE;
  217. other_tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(other_tlv_hdr);
  218. other_tlv_len = HAL_RX_GET_USER_TLV32_LEN(other_tlv_hdr);
  219. temp_len += other_tlv_len;
  220. other_tlv = other_tlv_hdr + HAL_RX_TLV32_HDR_SIZE;
  221. switch (other_tlv_tag) {
  222. default:
  223. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  224. "%s unhandled TLV type: %d, TLV len:%d",
  225. __func__, other_tlv_tag, other_tlv_len);
  226. break;
  227. }
  228. }
  229. #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE)
  230. static inline
  231. void hal_rx_get_bb_info_5332(void *rx_tlv, void *ppdu_info_hdl)
  232. {
  233. struct hal_rx_ppdu_info *ppdu_info = ppdu_info_hdl;
  234. ppdu_info->cfr_info.bb_captured_channel =
  235. HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_CHANNEL);
  236. ppdu_info->cfr_info.bb_captured_timeout =
  237. HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_TIMEOUT);
  238. ppdu_info->cfr_info.bb_captured_reason =
  239. HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_REASON);
  240. }
  241. static inline
  242. void hal_rx_get_rtt_info_5332(void *rx_tlv, void *ppdu_info_hdl)
  243. {
  244. struct hal_rx_ppdu_info *ppdu_info = ppdu_info_hdl;
  245. ppdu_info->cfr_info.rx_location_info_valid =
  246. HAL_RX_GET(rx_tlv, PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  247. RX_LOCATION_INFO_VALID);
  248. ppdu_info->cfr_info.rtt_che_buffer_pointer_low32 =
  249. HAL_RX_GET(rx_tlv,
  250. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  251. RTT_CHE_BUFFER_POINTER_LOW32);
  252. ppdu_info->cfr_info.rtt_che_buffer_pointer_high8 =
  253. HAL_RX_GET(rx_tlv,
  254. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  255. RTT_CHE_BUFFER_POINTER_HIGH8);
  256. ppdu_info->cfr_info.chan_capture_status =
  257. HAL_GET_RX_LOCATION_INFO_CHAN_CAPTURE_STATUS(rx_tlv);
  258. ppdu_info->cfr_info.rx_start_ts =
  259. HAL_RX_GET(rx_tlv,
  260. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  261. RX_START_TS);
  262. ppdu_info->cfr_info.rtt_cfo_measurement = (int16_t)
  263. HAL_RX_GET(rx_tlv,
  264. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  265. RTT_CFO_MEASUREMENT);
  266. ppdu_info->cfr_info.agc_gain_info0 =
  267. HAL_RX_GET(rx_tlv,
  268. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  269. GAIN_CHAIN0);
  270. ppdu_info->cfr_info.agc_gain_info0 |=
  271. (((uint32_t)HAL_RX_GET(rx_tlv,
  272. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  273. GAIN_CHAIN1)) << 16);
  274. ppdu_info->cfr_info.agc_gain_info1 =
  275. HAL_RX_GET(rx_tlv,
  276. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  277. GAIN_CHAIN2);
  278. ppdu_info->cfr_info.agc_gain_info1 |=
  279. (((uint32_t)HAL_RX_GET(rx_tlv,
  280. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  281. GAIN_CHAIN3)) << 16);
  282. ppdu_info->cfr_info.agc_gain_info2 = 0;
  283. ppdu_info->cfr_info.agc_gain_info3 = 0;
  284. }
  285. #endif
  286. #ifdef CONFIG_WORD_BASED_TLV
  287. /**
  288. * hal_rx_dump_mpdu_start_tlv_5332: dump RX mpdu_start TLV in structured
  289. * human readable format.
  290. * @mpdu_start: pointer the rx_attention TLV in pkt.
  291. * @dbg_level: log level.
  292. *
  293. * Return: void
  294. */
  295. static inline void hal_rx_dump_mpdu_start_tlv_5332(void *mpdustart,
  296. uint8_t dbg_level)
  297. {
  298. struct rx_mpdu_start_compact *mpdu_info =
  299. (struct rx_mpdu_start_compact *)mpdustart;
  300. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  301. "rx_mpdu_start tlv (1/5) - "
  302. "rx_reo_queue_desc_addr_39_32 :%x"
  303. "receive_queue_number:%x "
  304. "pre_delim_err_warning:%x "
  305. "first_delim_err:%x "
  306. "pn_31_0:%x "
  307. "pn_63_32:%x "
  308. "pn_95_64:%x ",
  309. mpdu_info->rx_reo_queue_desc_addr_39_32,
  310. mpdu_info->receive_queue_number,
  311. mpdu_info->pre_delim_err_warning,
  312. mpdu_info->first_delim_err,
  313. mpdu_info->pn_31_0,
  314. mpdu_info->pn_63_32,
  315. mpdu_info->pn_95_64);
  316. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  317. "rx_mpdu_start tlv (2/5) - "
  318. "ast_index:%x "
  319. "sw_peer_id:%x "
  320. "mpdu_frame_control_valid:%x "
  321. "mpdu_duration_valid:%x "
  322. "mac_addr_ad1_valid:%x "
  323. "mac_addr_ad2_valid:%x "
  324. "mac_addr_ad3_valid:%x "
  325. "mac_addr_ad4_valid:%x "
  326. "mpdu_sequence_control_valid :%x"
  327. "mpdu_qos_control_valid:%x "
  328. "mpdu_ht_control_valid:%x "
  329. "frame_encryption_info_valid :%x",
  330. mpdu_info->ast_index,
  331. mpdu_info->sw_peer_id,
  332. mpdu_info->mpdu_frame_control_valid,
  333. mpdu_info->mpdu_duration_valid,
  334. mpdu_info->mac_addr_ad1_valid,
  335. mpdu_info->mac_addr_ad2_valid,
  336. mpdu_info->mac_addr_ad3_valid,
  337. mpdu_info->mac_addr_ad4_valid,
  338. mpdu_info->mpdu_sequence_control_valid,
  339. mpdu_info->mpdu_qos_control_valid,
  340. mpdu_info->mpdu_ht_control_valid,
  341. mpdu_info->frame_encryption_info_valid);
  342. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  343. "rx_mpdu_start tlv (3/5) - "
  344. "mpdu_fragment_number:%x "
  345. "more_fragment_flag:%x "
  346. "fr_ds:%x "
  347. "to_ds:%x "
  348. "encrypted:%x "
  349. "mpdu_retry:%x "
  350. "mpdu_sequence_number:%x ",
  351. mpdu_info->mpdu_fragment_number,
  352. mpdu_info->more_fragment_flag,
  353. mpdu_info->fr_ds,
  354. mpdu_info->to_ds,
  355. mpdu_info->encrypted,
  356. mpdu_info->mpdu_retry,
  357. mpdu_info->mpdu_sequence_number);
  358. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  359. "rx_mpdu_start tlv (4/5) - "
  360. "mpdu_frame_control_field:%x "
  361. "mpdu_duration_field:%x ",
  362. mpdu_info->mpdu_frame_control_field,
  363. mpdu_info->mpdu_duration_field);
  364. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  365. "rx_mpdu_start tlv (5/5) - "
  366. "mac_addr_ad1_31_0:%x "
  367. "mac_addr_ad1_47_32:%x "
  368. "mac_addr_ad2_15_0:%x "
  369. "mac_addr_ad2_47_16:%x "
  370. "mac_addr_ad3_31_0:%x "
  371. "mac_addr_ad3_47_32:%x "
  372. "mpdu_sequence_control_field :%x",
  373. mpdu_info->mac_addr_ad1_31_0,
  374. mpdu_info->mac_addr_ad1_47_32,
  375. mpdu_info->mac_addr_ad2_15_0,
  376. mpdu_info->mac_addr_ad2_47_16,
  377. mpdu_info->mac_addr_ad3_31_0,
  378. mpdu_info->mac_addr_ad3_47_32,
  379. mpdu_info->mpdu_sequence_control_field);
  380. }
  381. /**
  382. * hal_rx_dump_msdu_end_tlv_5332: dump RX msdu_end TLV in structured
  383. * human readable format.
  384. * @ msdu_end: pointer the msdu_end TLV in pkt.
  385. * @ dbg_level: log level.
  386. *
  387. * Return: void
  388. */
  389. static void hal_rx_dump_msdu_end_tlv_5332(void *msduend,
  390. uint8_t dbg_level)
  391. {
  392. struct rx_msdu_end_compact *msdu_end =
  393. (struct rx_msdu_end_compact *)msduend;
  394. QDF_TRACE(QDF_MODULE_ID_DP, dbg_level,
  395. "rx_msdu_end tlv - "
  396. "key_id_octet: %d "
  397. "tcp_udp_chksum: %d "
  398. "sa_idx_timeout: %d "
  399. "da_idx_timeout: %d "
  400. "msdu_limit_error: %d "
  401. "flow_idx_timeout: %d "
  402. "flow_idx_invalid: %d "
  403. "wifi_parser_error: %d "
  404. "sa_is_valid: %d "
  405. "da_is_valid: %d "
  406. "da_is_mcbc: %d "
  407. "tkip_mic_err: %d "
  408. "l3_header_padding: %d "
  409. "first_msdu: %d "
  410. "last_msdu: %d "
  411. "sa_idx: %d "
  412. "msdu_drop: %d "
  413. "reo_destination_indication: %d "
  414. "flow_idx: %d "
  415. "fse_metadata: %d "
  416. "cce_metadata: %d "
  417. "sa_sw_peer_id: %d ",
  418. msdu_end->key_id_octet,
  419. msdu_end->tcp_udp_chksum,
  420. msdu_end->sa_idx_timeout,
  421. msdu_end->da_idx_timeout,
  422. msdu_end->msdu_limit_error,
  423. msdu_end->flow_idx_timeout,
  424. msdu_end->flow_idx_invalid,
  425. msdu_end->wifi_parser_error,
  426. msdu_end->sa_is_valid,
  427. msdu_end->da_is_valid,
  428. msdu_end->da_is_mcbc,
  429. msdu_end->tkip_mic_err,
  430. msdu_end->l3_header_padding,
  431. msdu_end->first_msdu,
  432. msdu_end->last_msdu,
  433. msdu_end->sa_idx,
  434. msdu_end->msdu_drop,
  435. msdu_end->reo_destination_indication,
  436. msdu_end->flow_idx,
  437. msdu_end->fse_metadata,
  438. msdu_end->cce_metadata,
  439. msdu_end->sa_sw_peer_id);
  440. }
  441. #else
  442. static inline void hal_rx_dump_mpdu_start_tlv_5332(void *mpdustart,
  443. uint8_t dbg_level)
  444. {
  445. struct rx_mpdu_start *mpdu_start = (struct rx_mpdu_start *)mpdustart;
  446. struct rx_mpdu_info *mpdu_info =
  447. (struct rx_mpdu_info *)&mpdu_start->rx_mpdu_info_details;
  448. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  449. "rx_mpdu_start tlv (1/5) - "
  450. "rx_reo_queue_desc_addr_31_0 :%x"
  451. "rx_reo_queue_desc_addr_39_32 :%x"
  452. "receive_queue_number:%x "
  453. "pre_delim_err_warning:%x "
  454. "first_delim_err:%x "
  455. "reserved_2a:%x "
  456. "pn_31_0:%x "
  457. "pn_63_32:%x "
  458. "pn_95_64:%x "
  459. "pn_127_96:%x "
  460. "epd_en:%x "
  461. "all_frames_shall_be_encrypted :%x"
  462. "encrypt_type:%x "
  463. "wep_key_width_for_variable_key :%x"
  464. "mesh_sta:%x "
  465. "bssid_hit:%x "
  466. "bssid_number:%x "
  467. "tid:%x "
  468. "reserved_7a:%x ",
  469. mpdu_info->rx_reo_queue_desc_addr_31_0,
  470. mpdu_info->rx_reo_queue_desc_addr_39_32,
  471. mpdu_info->receive_queue_number,
  472. mpdu_info->pre_delim_err_warning,
  473. mpdu_info->first_delim_err,
  474. mpdu_info->reserved_2a,
  475. mpdu_info->pn_31_0,
  476. mpdu_info->pn_63_32,
  477. mpdu_info->pn_95_64,
  478. mpdu_info->pn_127_96,
  479. mpdu_info->epd_en,
  480. mpdu_info->all_frames_shall_be_encrypted,
  481. mpdu_info->encrypt_type,
  482. mpdu_info->wep_key_width_for_variable_key,
  483. mpdu_info->mesh_sta,
  484. mpdu_info->bssid_hit,
  485. mpdu_info->bssid_number,
  486. mpdu_info->tid,
  487. mpdu_info->reserved_7a);
  488. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  489. "rx_mpdu_start tlv (2/5) - "
  490. "ast_index:%x "
  491. "sw_peer_id:%x "
  492. "mpdu_frame_control_valid:%x "
  493. "mpdu_duration_valid:%x "
  494. "mac_addr_ad1_valid:%x "
  495. "mac_addr_ad2_valid:%x "
  496. "mac_addr_ad3_valid:%x "
  497. "mac_addr_ad4_valid:%x "
  498. "mpdu_sequence_control_valid :%x"
  499. "mpdu_qos_control_valid:%x "
  500. "mpdu_ht_control_valid:%x "
  501. "frame_encryption_info_valid :%x",
  502. mpdu_info->ast_index,
  503. mpdu_info->sw_peer_id,
  504. mpdu_info->mpdu_frame_control_valid,
  505. mpdu_info->mpdu_duration_valid,
  506. mpdu_info->mac_addr_ad1_valid,
  507. mpdu_info->mac_addr_ad2_valid,
  508. mpdu_info->mac_addr_ad3_valid,
  509. mpdu_info->mac_addr_ad4_valid,
  510. mpdu_info->mpdu_sequence_control_valid,
  511. mpdu_info->mpdu_qos_control_valid,
  512. mpdu_info->mpdu_ht_control_valid,
  513. mpdu_info->frame_encryption_info_valid);
  514. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  515. "rx_mpdu_start tlv (3/5) - "
  516. "mpdu_fragment_number:%x "
  517. "more_fragment_flag:%x "
  518. "reserved_11a:%x "
  519. "fr_ds:%x "
  520. "to_ds:%x "
  521. "encrypted:%x "
  522. "mpdu_retry:%x "
  523. "mpdu_sequence_number:%x ",
  524. mpdu_info->mpdu_fragment_number,
  525. mpdu_info->more_fragment_flag,
  526. mpdu_info->reserved_11a,
  527. mpdu_info->fr_ds,
  528. mpdu_info->to_ds,
  529. mpdu_info->encrypted,
  530. mpdu_info->mpdu_retry,
  531. mpdu_info->mpdu_sequence_number);
  532. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  533. "rx_mpdu_start tlv (4/5) - "
  534. "mpdu_frame_control_field:%x "
  535. "mpdu_duration_field:%x ",
  536. mpdu_info->mpdu_frame_control_field,
  537. mpdu_info->mpdu_duration_field);
  538. QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level,
  539. "rx_mpdu_start tlv (5/5) - "
  540. "mac_addr_ad1_31_0:%x "
  541. "mac_addr_ad1_47_32:%x "
  542. "mac_addr_ad2_15_0:%x "
  543. "mac_addr_ad2_47_16:%x "
  544. "mac_addr_ad3_31_0:%x "
  545. "mac_addr_ad3_47_32:%x "
  546. "mpdu_sequence_control_field :%x"
  547. "mac_addr_ad4_31_0:%x "
  548. "mac_addr_ad4_47_32:%x "
  549. "mpdu_qos_control_field:%x ",
  550. mpdu_info->mac_addr_ad1_31_0,
  551. mpdu_info->mac_addr_ad1_47_32,
  552. mpdu_info->mac_addr_ad2_15_0,
  553. mpdu_info->mac_addr_ad2_47_16,
  554. mpdu_info->mac_addr_ad3_31_0,
  555. mpdu_info->mac_addr_ad3_47_32,
  556. mpdu_info->mpdu_sequence_control_field,
  557. mpdu_info->mac_addr_ad4_31_0,
  558. mpdu_info->mac_addr_ad4_47_32,
  559. mpdu_info->mpdu_qos_control_field);
  560. }
  561. static void hal_rx_dump_msdu_end_tlv_5332(void *msduend,
  562. uint8_t dbg_level)
  563. {
  564. struct rx_msdu_end *msdu_end =
  565. (struct rx_msdu_end *)msduend;
  566. QDF_TRACE(QDF_MODULE_ID_DP, dbg_level,
  567. "rx_msdu_end tlv - "
  568. "key_id_octet: %d "
  569. "cce_super_rule: %d "
  570. "cce_classify_not_done_truncat: %d "
  571. "cce_classify_not_done_cce_dis: %d "
  572. "rule_indication_31_0: %d "
  573. "tcp_udp_chksum: %d "
  574. "sa_idx_timeout: %d "
  575. "da_idx_timeout: %d "
  576. "msdu_limit_error: %d "
  577. "flow_idx_timeout: %d "
  578. "flow_idx_invalid: %d "
  579. "wifi_parser_error: %d "
  580. "sa_is_valid: %d "
  581. "da_is_valid: %d "
  582. "da_is_mcbc: %d "
  583. "tkip_mic_err: %d "
  584. "l3_header_padding: %d "
  585. "first_msdu: %d "
  586. "last_msdu: %d "
  587. "sa_idx: %d "
  588. "msdu_drop: %d "
  589. "reo_destination_indication: %d "
  590. "flow_idx: %d "
  591. "fse_metadata: %d "
  592. "cce_metadata: %d "
  593. "sa_sw_peer_id: %d ",
  594. msdu_end->key_id_octet,
  595. msdu_end->cce_super_rule,
  596. msdu_end->cce_classify_not_done_truncate,
  597. msdu_end->cce_classify_not_done_cce_dis,
  598. msdu_end->rule_indication_31_0,
  599. msdu_end->tcp_udp_chksum,
  600. msdu_end->sa_idx_timeout,
  601. msdu_end->da_idx_timeout,
  602. msdu_end->msdu_limit_error,
  603. msdu_end->flow_idx_timeout,
  604. msdu_end->flow_idx_invalid,
  605. msdu_end->wifi_parser_error,
  606. msdu_end->sa_is_valid,
  607. msdu_end->da_is_valid,
  608. msdu_end->da_is_mcbc,
  609. msdu_end->tkip_mic_err,
  610. msdu_end->l3_header_padding,
  611. msdu_end->first_msdu,
  612. msdu_end->last_msdu,
  613. msdu_end->sa_idx,
  614. msdu_end->msdu_drop,
  615. msdu_end->reo_destination_indication,
  616. msdu_end->flow_idx,
  617. msdu_end->fse_metadata,
  618. msdu_end->cce_metadata,
  619. msdu_end->sa_sw_peer_id);
  620. }
  621. #endif
  622. /**
  623. * hal_reo_status_get_header_5332 - Process reo desc info
  624. * @d - Pointer to reo descriptor
  625. * @b - tlv type info
  626. * @h1 - Pointer to hal_reo_status_header where info to be stored
  627. *
  628. * Return - none.
  629. *
  630. */
  631. static void hal_reo_status_get_header_5332(hal_ring_desc_t ring_desc,
  632. int b, void *h1)
  633. {
  634. uint64_t *d = (uint64_t *)ring_desc;
  635. uint64_t val1 = 0;
  636. struct hal_reo_status_header *h =
  637. (struct hal_reo_status_header *)h1;
  638. /* Offsets of descriptor fields defined in HW headers start
  639. * from the field after TLV header
  640. */
  641. d += HAL_GET_NUM_QWORDS(sizeof(struct tlv_32_hdr));
  642. switch (b) {
  643. case HAL_REO_QUEUE_STATS_STATUS_TLV:
  644. val1 = d[HAL_OFFSET_QW(REO_GET_QUEUE_STATS_STATUS,
  645. STATUS_HEADER_REO_STATUS_NUMBER)];
  646. break;
  647. case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
  648. val1 = d[HAL_OFFSET_QW(REO_FLUSH_QUEUE_STATUS,
  649. STATUS_HEADER_REO_STATUS_NUMBER)];
  650. break;
  651. case HAL_REO_FLUSH_CACHE_STATUS_TLV:
  652. val1 = d[HAL_OFFSET_QW(REO_FLUSH_CACHE_STATUS,
  653. STATUS_HEADER_REO_STATUS_NUMBER)];
  654. break;
  655. case HAL_REO_UNBLK_CACHE_STATUS_TLV:
  656. val1 = d[HAL_OFFSET_QW(REO_UNBLOCK_CACHE_STATUS,
  657. STATUS_HEADER_REO_STATUS_NUMBER)];
  658. break;
  659. case HAL_REO_TIMOUT_LIST_STATUS_TLV:
  660. val1 = d[HAL_OFFSET_QW(REO_FLUSH_TIMEOUT_LIST_STATUS,
  661. STATUS_HEADER_REO_STATUS_NUMBER)];
  662. break;
  663. case HAL_REO_DESC_THRES_STATUS_TLV:
  664. val1 =
  665. d[HAL_OFFSET_QW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS,
  666. STATUS_HEADER_REO_STATUS_NUMBER)];
  667. break;
  668. case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
  669. val1 = d[HAL_OFFSET_QW(REO_UPDATE_RX_REO_QUEUE_STATUS,
  670. STATUS_HEADER_REO_STATUS_NUMBER)];
  671. break;
  672. default:
  673. qdf_nofl_err("ERROR: Unknown tlv\n");
  674. break;
  675. }
  676. h->cmd_num =
  677. HAL_GET_FIELD(
  678. UNIFORM_REO_STATUS_HEADER, REO_STATUS_NUMBER,
  679. val1);
  680. h->exec_time =
  681. HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER,
  682. CMD_EXECUTION_TIME, val1);
  683. h->status =
  684. HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER,
  685. REO_CMD_EXECUTION_STATUS, val1);
  686. switch (b) {
  687. case HAL_REO_QUEUE_STATS_STATUS_TLV:
  688. val1 = d[HAL_OFFSET_QW(REO_GET_QUEUE_STATS_STATUS,
  689. STATUS_HEADER_TIMESTAMP)];
  690. break;
  691. case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
  692. val1 = d[HAL_OFFSET_QW(REO_FLUSH_QUEUE_STATUS,
  693. STATUS_HEADER_TIMESTAMP)];
  694. break;
  695. case HAL_REO_FLUSH_CACHE_STATUS_TLV:
  696. val1 = d[HAL_OFFSET_QW(REO_FLUSH_CACHE_STATUS,
  697. STATUS_HEADER_TIMESTAMP)];
  698. break;
  699. case HAL_REO_UNBLK_CACHE_STATUS_TLV:
  700. val1 = d[HAL_OFFSET_QW(REO_UNBLOCK_CACHE_STATUS,
  701. STATUS_HEADER_TIMESTAMP)];
  702. break;
  703. case HAL_REO_TIMOUT_LIST_STATUS_TLV:
  704. val1 = d[HAL_OFFSET_QW(REO_FLUSH_TIMEOUT_LIST_STATUS,
  705. STATUS_HEADER_TIMESTAMP)];
  706. break;
  707. case HAL_REO_DESC_THRES_STATUS_TLV:
  708. val1 =
  709. d[HAL_OFFSET_QW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS,
  710. STATUS_HEADER_TIMESTAMP)];
  711. break;
  712. case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
  713. val1 = d[HAL_OFFSET_QW(REO_UPDATE_RX_REO_QUEUE_STATUS,
  714. STATUS_HEADER_TIMESTAMP)];
  715. break;
  716. default:
  717. qdf_nofl_err("ERROR: Unknown tlv\n");
  718. break;
  719. }
  720. h->tstamp =
  721. HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER, TIMESTAMP, val1);
  722. }
  723. static
  724. void *hal_rx_msdu0_buffer_addr_lsb_5332(void *link_desc_va)
  725. {
  726. return (void *)HAL_RX_MSDU0_BUFFER_ADDR_LSB(link_desc_va);
  727. }
  728. static
  729. void *hal_rx_msdu_desc_info_ptr_get_5332(void *msdu0)
  730. {
  731. return (void *)HAL_RX_MSDU_DESC_INFO_PTR_GET(msdu0);
  732. }
  733. static
  734. void *hal_ent_mpdu_desc_info_5332(void *ent_ring_desc)
  735. {
  736. return (void *)HAL_ENT_MPDU_DESC_INFO(ent_ring_desc);
  737. }
  738. static
  739. void *hal_dst_mpdu_desc_info_5332(void *dst_ring_desc)
  740. {
  741. return (void *)HAL_DST_MPDU_DESC_INFO(dst_ring_desc);
  742. }
  743. /**
  744. * hal_reo_config_5332(): Set reo config parameters
  745. * @soc: hal soc handle
  746. * @reg_val: value to be set
  747. * @reo_params: reo parameters
  748. *
  749. * Return: void
  750. */
  751. static void
  752. hal_reo_config_5332(struct hal_soc *soc,
  753. uint32_t reg_val,
  754. struct hal_reo_params *reo_params)
  755. {
  756. HAL_REO_R0_CONFIG(soc, reg_val, reo_params);
  757. }
  758. /**
  759. * hal_rx_msdu_desc_info_get_ptr_5332() - Get msdu desc info ptr
  760. * @msdu_details_ptr - Pointer to msdu_details_ptr
  761. *
  762. * Return - Pointer to rx_msdu_desc_info structure.
  763. *
  764. */
  765. static void *hal_rx_msdu_desc_info_get_ptr_5332(void *msdu_details_ptr)
  766. {
  767. return HAL_RX_MSDU_DESC_INFO_GET(msdu_details_ptr);
  768. }
  769. /**
  770. * hal_rx_link_desc_msdu0_ptr_5332 - Get pointer to rx_msdu details
  771. * @link_desc - Pointer to link desc
  772. *
  773. * Return - Pointer to rx_msdu_details structure
  774. *
  775. */
  776. static void *hal_rx_link_desc_msdu0_ptr_5332(void *link_desc)
  777. {
  778. return HAL_RX_LINK_DESC_MSDU0_PTR(link_desc);
  779. }
  780. /**
  781. * hal_get_window_address_5332(): Function to get hp/tp address
  782. * @hal_soc: Pointer to hal_soc
  783. * @addr: address offset of register
  784. *
  785. * Return: modified address offset of register
  786. */
  787. static inline qdf_iomem_t hal_get_window_address_5332(struct hal_soc *hal_soc,
  788. qdf_iomem_t addr)
  789. {
  790. uint32_t offset = addr - hal_soc->dev_base_addr;
  791. qdf_iomem_t new_offset;
  792. /*
  793. * Check if offset lies within CE register range(0x740000)
  794. * or UMAC/DP register range (0x00A00000).
  795. * If offset lies within CE register range, map it
  796. * into CE region.
  797. */
  798. if (offset < 0xA00000) {
  799. offset = offset - CE_CFG_WFSS_CE_REG_BASE;
  800. new_offset = (hal_soc->dev_base_addr_ce + offset);
  801. return new_offset;
  802. } else {
  803. /*
  804. * If offset lies within DP register range,
  805. * return the address as such
  806. */
  807. return addr;
  808. }
  809. }
  810. static
  811. void hal_compute_reo_remap_ix2_ix3_5332(uint32_t *ring, uint32_t num_rings,
  812. uint32_t *remap1, uint32_t *remap2)
  813. {
  814. switch (num_rings) {
  815. case 1:
  816. *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
  817. HAL_REO_REMAP_IX2(ring[0], 17) |
  818. HAL_REO_REMAP_IX2(ring[0], 18) |
  819. HAL_REO_REMAP_IX2(ring[0], 19) |
  820. HAL_REO_REMAP_IX2(ring[0], 20) |
  821. HAL_REO_REMAP_IX2(ring[0], 21) |
  822. HAL_REO_REMAP_IX2(ring[0], 22) |
  823. HAL_REO_REMAP_IX2(ring[0], 23);
  824. *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
  825. HAL_REO_REMAP_IX3(ring[0], 25) |
  826. HAL_REO_REMAP_IX3(ring[0], 26) |
  827. HAL_REO_REMAP_IX3(ring[0], 27) |
  828. HAL_REO_REMAP_IX3(ring[0], 28) |
  829. HAL_REO_REMAP_IX3(ring[0], 29) |
  830. HAL_REO_REMAP_IX3(ring[0], 30) |
  831. HAL_REO_REMAP_IX3(ring[0], 31);
  832. break;
  833. case 2:
  834. *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
  835. HAL_REO_REMAP_IX2(ring[0], 17) |
  836. HAL_REO_REMAP_IX2(ring[1], 18) |
  837. HAL_REO_REMAP_IX2(ring[1], 19) |
  838. HAL_REO_REMAP_IX2(ring[0], 20) |
  839. HAL_REO_REMAP_IX2(ring[0], 21) |
  840. HAL_REO_REMAP_IX2(ring[1], 22) |
  841. HAL_REO_REMAP_IX2(ring[1], 23);
  842. *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
  843. HAL_REO_REMAP_IX3(ring[0], 25) |
  844. HAL_REO_REMAP_IX3(ring[1], 26) |
  845. HAL_REO_REMAP_IX3(ring[1], 27) |
  846. HAL_REO_REMAP_IX3(ring[0], 28) |
  847. HAL_REO_REMAP_IX3(ring[0], 29) |
  848. HAL_REO_REMAP_IX3(ring[1], 30) |
  849. HAL_REO_REMAP_IX3(ring[1], 31);
  850. break;
  851. case 3:
  852. *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
  853. HAL_REO_REMAP_IX2(ring[1], 17) |
  854. HAL_REO_REMAP_IX2(ring[2], 18) |
  855. HAL_REO_REMAP_IX2(ring[0], 19) |
  856. HAL_REO_REMAP_IX2(ring[1], 20) |
  857. HAL_REO_REMAP_IX2(ring[2], 21) |
  858. HAL_REO_REMAP_IX2(ring[0], 22) |
  859. HAL_REO_REMAP_IX2(ring[1], 23);
  860. *remap2 = HAL_REO_REMAP_IX3(ring[2], 24) |
  861. HAL_REO_REMAP_IX3(ring[0], 25) |
  862. HAL_REO_REMAP_IX3(ring[1], 26) |
  863. HAL_REO_REMAP_IX3(ring[2], 27) |
  864. HAL_REO_REMAP_IX3(ring[0], 28) |
  865. HAL_REO_REMAP_IX3(ring[1], 29) |
  866. HAL_REO_REMAP_IX3(ring[2], 30) |
  867. HAL_REO_REMAP_IX3(ring[0], 31);
  868. break;
  869. case 4:
  870. *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
  871. HAL_REO_REMAP_IX2(ring[1], 17) |
  872. HAL_REO_REMAP_IX2(ring[2], 18) |
  873. HAL_REO_REMAP_IX2(ring[3], 19) |
  874. HAL_REO_REMAP_IX2(ring[0], 20) |
  875. HAL_REO_REMAP_IX2(ring[1], 21) |
  876. HAL_REO_REMAP_IX2(ring[2], 22) |
  877. HAL_REO_REMAP_IX2(ring[3], 23);
  878. *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
  879. HAL_REO_REMAP_IX3(ring[1], 25) |
  880. HAL_REO_REMAP_IX3(ring[2], 26) |
  881. HAL_REO_REMAP_IX3(ring[3], 27) |
  882. HAL_REO_REMAP_IX3(ring[0], 28) |
  883. HAL_REO_REMAP_IX3(ring[1], 29) |
  884. HAL_REO_REMAP_IX3(ring[2], 30) |
  885. HAL_REO_REMAP_IX3(ring[3], 31);
  886. break;
  887. }
  888. }
  889. /**
  890. * hal_rx_flow_setup_fse_5332() - Setup a flow search entry in HW FST
  891. * @fst: Pointer to the Rx Flow Search Table
  892. * @table_offset: offset into the table where the flow is to be setup
  893. * @flow: Flow Parameters
  894. *
  895. * Return: Success/Failure
  896. */
  897. static void *
  898. hal_rx_flow_setup_fse_5332(uint8_t *rx_fst, uint32_t table_offset,
  899. uint8_t *rx_flow)
  900. {
  901. struct hal_rx_fst *fst = (struct hal_rx_fst *)rx_fst;
  902. struct hal_rx_flow *flow = (struct hal_rx_flow *)rx_flow;
  903. uint8_t *fse;
  904. bool fse_valid;
  905. if (table_offset >= fst->max_entries) {
  906. QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
  907. "HAL FSE table offset %u exceeds max entries %u",
  908. table_offset, fst->max_entries);
  909. return NULL;
  910. }
  911. fse = (uint8_t *)fst->base_vaddr +
  912. (table_offset * HAL_RX_FST_ENTRY_SIZE);
  913. fse_valid = HAL_GET_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID);
  914. if (fse_valid) {
  915. QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
  916. "HAL FSE %pK already valid", fse);
  917. return NULL;
  918. }
  919. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_127_96) =
  920. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_127_96,
  921. qdf_htonl(flow->tuple_info.src_ip_127_96));
  922. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_95_64) =
  923. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_95_64,
  924. qdf_htonl(flow->tuple_info.src_ip_95_64));
  925. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_63_32) =
  926. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_63_32,
  927. qdf_htonl(flow->tuple_info.src_ip_63_32));
  928. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_31_0) =
  929. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_31_0,
  930. qdf_htonl(flow->tuple_info.src_ip_31_0));
  931. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_127_96) =
  932. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_127_96,
  933. qdf_htonl(flow->tuple_info.dest_ip_127_96));
  934. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_95_64) =
  935. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_95_64,
  936. qdf_htonl(flow->tuple_info.dest_ip_95_64));
  937. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_63_32) =
  938. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_63_32,
  939. qdf_htonl(flow->tuple_info.dest_ip_63_32));
  940. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_31_0) =
  941. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_31_0,
  942. qdf_htonl(flow->tuple_info.dest_ip_31_0));
  943. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_PORT);
  944. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_PORT) |=
  945. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_PORT,
  946. (flow->tuple_info.dest_port));
  947. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_PORT);
  948. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_PORT) |=
  949. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_PORT,
  950. (flow->tuple_info.src_port));
  951. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL);
  952. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL) |=
  953. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL,
  954. flow->tuple_info.l4_protocol);
  955. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER);
  956. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER) |=
  957. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER,
  958. flow->reo_destination_handler);
  959. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID);
  960. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID) |=
  961. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, VALID, 1);
  962. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, METADATA);
  963. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, METADATA) =
  964. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, METADATA,
  965. flow->fse_metadata);
  966. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_INDICATION);
  967. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_INDICATION) |=
  968. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY,
  969. REO_DESTINATION_INDICATION,
  970. flow->reo_destination_indication);
  971. /* Reset all the other fields in FSE */
  972. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, RESERVED_9);
  973. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_DROP);
  974. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_COUNT);
  975. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_BYTE_COUNT);
  976. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, TIMESTAMP);
  977. return fse;
  978. }
  979. #ifndef NO_RX_PKT_HDR_TLV
  980. /**
  981. * hal_rx_dump_pkt_hdr_tlv: dump RX pkt header TLV in hex format
  982. * @ pkt_hdr_tlv: pointer the pkt_hdr_tlv in pkt.
  983. * @ dbg_level: log level.
  984. *
  985. * Return: void
  986. */
  987. static inline void hal_rx_dump_pkt_hdr_tlv_5332(struct rx_pkt_tlvs *pkt_tlvs,
  988. uint8_t dbg_level)
  989. {
  990. struct rx_pkt_hdr_tlv *pkt_hdr_tlv = &pkt_tlvs->pkt_hdr_tlv;
  991. hal_verbose_debug("\n---------------\n"
  992. "rx_pkt_hdr_tlv\n"
  993. "---------------\n"
  994. "phy_ppdu_id %llu ",
  995. pkt_hdr_tlv->phy_ppdu_id);
  996. hal_verbose_hex_dump(pkt_hdr_tlv->rx_pkt_hdr,
  997. sizeof(pkt_hdr_tlv->rx_pkt_hdr));
  998. }
  999. #else
  1000. /**
  1001. * hal_rx_dump_pkt_hdr_tlv: dump RX pkt header TLV in hex format
  1002. * @ pkt_hdr_tlv: pointer the pkt_hdr_tlv in pkt.
  1003. * @ dbg_level: log level.
  1004. *
  1005. * Return: void
  1006. */
  1007. static inline void hal_rx_dump_pkt_hdr_tlv_5332(struct rx_pkt_tlvs *pkt_tlvs,
  1008. uint8_t dbg_level)
  1009. {
  1010. }
  1011. #endif
  1012. /**
  1013. * hal_rx_dump_pkt_tlvs_5332(): API to print RX Pkt TLVS qca5332
  1014. * @hal_soc_hdl: hal_soc handle
  1015. * @buf: pointer the pkt buffer
  1016. * @dbg_level: log level
  1017. *
  1018. * Return: void
  1019. */
  1020. #ifdef CONFIG_WORD_BASED_TLV
  1021. static void hal_rx_dump_pkt_tlvs_5332(hal_soc_handle_t hal_soc_hdl,
  1022. uint8_t *buf, uint8_t dbg_level)
  1023. {
  1024. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1025. struct rx_msdu_end_compact *msdu_end =
  1026. &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  1027. struct rx_mpdu_start_compact *mpdu_start =
  1028. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  1029. hal_rx_dump_msdu_end_tlv_5332(msdu_end, dbg_level);
  1030. hal_rx_dump_mpdu_start_tlv_5332(mpdu_start, dbg_level);
  1031. hal_rx_dump_pkt_hdr_tlv_5332(pkt_tlvs, dbg_level);
  1032. }
  1033. #else
  1034. static void hal_rx_dump_pkt_tlvs_5332(hal_soc_handle_t hal_soc_hdl,
  1035. uint8_t *buf, uint8_t dbg_level)
  1036. {
  1037. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  1038. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  1039. struct rx_mpdu_start *mpdu_start =
  1040. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  1041. hal_rx_dump_msdu_end_tlv_5332(msdu_end, dbg_level);
  1042. hal_rx_dump_mpdu_start_tlv_5332(mpdu_start, dbg_level);
  1043. hal_rx_dump_pkt_hdr_tlv_5332(pkt_tlvs, dbg_level);
  1044. }
  1045. #endif
  1046. #define HAL_NUM_TCL_BANKS_5332 24
  1047. /**
  1048. * hal_cmem_write_5332() - function for CMEM buffer writing
  1049. * @hal_soc_hdl: HAL SOC handle
  1050. * @offset: CMEM address
  1051. * @value: value to write
  1052. *
  1053. * Return: None.
  1054. */
  1055. static void hal_cmem_write_5332(hal_soc_handle_t hal_soc_hdl,
  1056. uint32_t offset,
  1057. uint32_t value)
  1058. {
  1059. struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl;
  1060. /* cmem region is ioremapped from CMEM_REG_BASE, hence subtracting
  1061. * that from offset.
  1062. */
  1063. offset = offset - CMEM_REG_BASE;
  1064. pld_reg_write(hal->qdf_dev->dev, offset, value,
  1065. hal->dev_base_addr_cmem);
  1066. }
  1067. /**
  1068. * hal_tx_get_num_tcl_banks_5332() - Get number of banks in target
  1069. *
  1070. * Returns: number of bank
  1071. */
  1072. static uint8_t hal_tx_get_num_tcl_banks_5332(void)
  1073. {
  1074. return HAL_NUM_TCL_BANKS_5332;
  1075. }
  1076. static void hal_reo_setup_5332(struct hal_soc *soc, void *reoparams,
  1077. int qref_reset)
  1078. {
  1079. uint32_t reg_val;
  1080. struct hal_reo_params *reo_params = (struct hal_reo_params *)reoparams;
  1081. reg_val = HAL_REG_READ(soc, HWIO_REO_R0_GENERAL_ENABLE_ADDR(
  1082. REO_REG_REG_BASE));
  1083. hal_reo_config_5332(soc, reg_val, reo_params);
  1084. /* Other ring enable bits and REO_ENABLE will be set by FW */
  1085. /* TODO: Setup destination ring mapping if enabled */
  1086. /* TODO: Error destination ring setting is left to default.
  1087. * Default setting is to send all errors to release ring.
  1088. */
  1089. /* Set the reo descriptor swap bits in case of BIG endian platform */
  1090. hal_setup_reo_swap(soc);
  1091. HAL_REG_WRITE(soc,
  1092. HWIO_REO_R0_AGING_THRESHOLD_IX_0_ADDR(REO_REG_REG_BASE),
  1093. HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000);
  1094. HAL_REG_WRITE(soc,
  1095. HWIO_REO_R0_AGING_THRESHOLD_IX_1_ADDR(REO_REG_REG_BASE),
  1096. (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000));
  1097. HAL_REG_WRITE(soc,
  1098. HWIO_REO_R0_AGING_THRESHOLD_IX_2_ADDR(REO_REG_REG_BASE),
  1099. (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000));
  1100. HAL_REG_WRITE(soc,
  1101. HWIO_REO_R0_AGING_THRESHOLD_IX_3_ADDR(REO_REG_REG_BASE),
  1102. (HAL_DEFAULT_VO_REO_TIMEOUT_MS * 1000));
  1103. /*
  1104. * When hash based routing is enabled, routing of the rx packet
  1105. * is done based on the following value: 1 _ _ _ _ The last 4
  1106. * bits are based on hash[3:0]. This means the possible values
  1107. * are 0x10 to 0x1f. This value is used to look-up the
  1108. * ring ID configured in Destination_Ring_Ctrl_IX_* register.
  1109. * The Destination_Ring_Ctrl_IX_2 and Destination_Ring_Ctrl_IX_3
  1110. * registers need to be configured to set-up the 16 entries to
  1111. * map the hash values to a ring number. There are 3 bits per
  1112. * hash entry – which are mapped as follows:
  1113. * 0: TCL, 1:SW1, 2:SW2, * 3:SW3, 4:SW4, 5:Release, 6:FW(WIFI),
  1114. * 7: NOT_USED.
  1115. */
  1116. if (reo_params->rx_hash_enabled) {
  1117. HAL_REG_WRITE(soc,
  1118. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_1_ADDR
  1119. (REO_REG_REG_BASE), reo_params->remap0);
  1120. hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 0x%x",
  1121. HAL_REG_READ(soc,
  1122. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_1_ADDR(
  1123. REO_REG_REG_BASE)));
  1124. HAL_REG_WRITE(soc,
  1125. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR
  1126. (REO_REG_REG_BASE), reo_params->remap1);
  1127. hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 0x%x",
  1128. HAL_REG_READ(soc,
  1129. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR(
  1130. REO_REG_REG_BASE)));
  1131. HAL_REG_WRITE(soc,
  1132. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR
  1133. (REO_REG_REG_BASE), reo_params->remap2);
  1134. hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR 0x%x",
  1135. HAL_REG_READ(soc,
  1136. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR(
  1137. REO_REG_REG_BASE)));
  1138. }
  1139. /* TODO: Check if the following registers shoould be setup by host:
  1140. * AGING_CONTROL
  1141. * HIGH_MEMORY_THRESHOLD
  1142. * GLOBAL_LINK_DESC_COUNT_THRESH_IX_0[1,2]
  1143. * GLOBAL_LINK_DESC_COUNT_CTRL
  1144. */
  1145. hal_reo_shared_qaddr_init((hal_soc_handle_t)soc, qref_reset);
  1146. }
  1147. static uint16_t hal_get_rx_max_ba_window_qca5332(int tid)
  1148. {
  1149. return HAL_RX_BA_WINDOW_1024;
  1150. }
  1151. /**
  1152. * hal_qca5332_get_reo_qdesc_size()- Get the reo queue descriptor size
  1153. * from the give Block-Ack window size
  1154. * Return: reo queue descriptor size
  1155. */
  1156. static uint32_t hal_qca5332_get_reo_qdesc_size(uint32_t ba_window_size, int tid)
  1157. {
  1158. /* Hardcode the ba_window_size to HAL_RX_MAX_BA_WINDOW for
  1159. * NON_QOS_TID until HW issues are resolved.
  1160. */
  1161. if (tid != HAL_NON_QOS_TID)
  1162. ba_window_size = hal_get_rx_max_ba_window_qca5332(tid);
  1163. /* Return descriptor size corresponding to window size of 2 since
  1164. * we set ba_window_size to 2 while setting up REO descriptors as
  1165. * a WAR to get 2k jump exception aggregates are received without
  1166. * a BA session.
  1167. */
  1168. if (ba_window_size <= 1) {
  1169. if (tid != HAL_NON_QOS_TID)
  1170. return sizeof(struct rx_reo_queue) +
  1171. sizeof(struct rx_reo_queue_ext);
  1172. else
  1173. return sizeof(struct rx_reo_queue);
  1174. }
  1175. if (ba_window_size <= 105)
  1176. return sizeof(struct rx_reo_queue) +
  1177. sizeof(struct rx_reo_queue_ext);
  1178. if (ba_window_size <= 210)
  1179. return sizeof(struct rx_reo_queue) +
  1180. (2 * sizeof(struct rx_reo_queue_ext));
  1181. if (ba_window_size <= 256)
  1182. return sizeof(struct rx_reo_queue) +
  1183. (3 * sizeof(struct rx_reo_queue_ext));
  1184. return sizeof(struct rx_reo_queue) +
  1185. (10 * sizeof(struct rx_reo_queue_ext)) +
  1186. sizeof(struct rx_reo_queue_1k);
  1187. }
  1188. /**
  1189. * hal_rx_tlv_msdu_done_copy_get_5332() - Get msdu done copy bit from rx_tlv
  1190. *
  1191. * Returns: 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 QCA_MONITOR_2_0_SUPPORT
  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 QCA_MONITOR_2_0_SUPPORT
  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. #endif /* QCA_MONITOR_2_0_SUPPORT */
  1432. hal_soc->ops->hal_compute_reo_remap_ix0 = NULL;
  1433. hal_soc->ops->hal_tx_vdev_mismatch_routing_set =
  1434. hal_tx_vdev_mismatch_routing_set_generic_be;
  1435. hal_soc->ops->hal_tx_mcast_mlo_reinject_routing_set =
  1436. hal_tx_mcast_mlo_reinject_routing_set_generic_be;
  1437. hal_soc->ops->hal_get_ba_aging_timeout =
  1438. hal_get_ba_aging_timeout_be_generic;
  1439. hal_soc->ops->hal_setup_link_idle_list =
  1440. hal_setup_link_idle_list_generic_be;
  1441. hal_soc->ops->hal_cookie_conversion_reg_cfg_be =
  1442. hal_cookie_conversion_reg_cfg_generic_be;
  1443. hal_soc->ops->hal_set_ba_aging_timeout =
  1444. hal_set_ba_aging_timeout_be_generic;
  1445. hal_soc->ops->hal_tx_populate_bank_register =
  1446. hal_tx_populate_bank_register_be;
  1447. hal_soc->ops->hal_tx_vdev_mcast_ctrl_set =
  1448. hal_tx_vdev_mcast_ctrl_set_be;
  1449. hal_soc->ops->hal_get_tsf2_scratch_reg =
  1450. hal_get_tsf2_scratch_reg_qca5332;
  1451. hal_soc->ops->hal_get_tqm_scratch_reg =
  1452. hal_get_tqm_scratch_reg_qca5332;
  1453. #ifdef CONFIG_WORD_BASED_TLV
  1454. hal_soc->ops->hal_rx_mpdu_start_wmask_get =
  1455. hal_rx_mpdu_start_wmask_get_be;
  1456. hal_soc->ops->hal_rx_msdu_end_wmask_get =
  1457. hal_rx_msdu_end_wmask_get_be;
  1458. #endif
  1459. };
  1460. struct hal_hw_srng_config hw_srng_table_5332[] = {
  1461. /* TODO: max_rings can populated by querying HW capabilities */
  1462. { /* REO_DST */
  1463. .start_ring_id = HAL_SRNG_REO2SW1,
  1464. .max_rings = 8,
  1465. .entry_size = sizeof(struct reo_destination_ring) >> 2,
  1466. .lmac_ring = FALSE,
  1467. .ring_dir = HAL_SRNG_DST_RING,
  1468. .reg_start = {
  1469. HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(
  1470. REO_REG_REG_BASE),
  1471. HWIO_REO_R2_REO2SW1_RING_HP_ADDR(
  1472. REO_REG_REG_BASE)
  1473. },
  1474. .reg_size = {
  1475. HWIO_REO_R0_REO2SW2_RING_BASE_LSB_ADDR(0) -
  1476. HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(0),
  1477. HWIO_REO_R2_REO2SW2_RING_HP_ADDR(0) -
  1478. HWIO_REO_R2_REO2SW1_RING_HP_ADDR(0),
  1479. },
  1480. .max_size =
  1481. HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_BMSK >>
  1482. HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_SHFT,
  1483. },
  1484. { /* REO_EXCEPTION */
  1485. /* Designating REO2SW0 ring as exception ring. This ring is
  1486. * similar to other REO2SW rings though it is named as REO2SW0.
  1487. * Any of theREO2SW rings can be used as exception ring.
  1488. */
  1489. .start_ring_id = HAL_SRNG_REO2SW0,
  1490. .max_rings = 1,
  1491. .entry_size = sizeof(struct reo_destination_ring) >> 2,
  1492. .lmac_ring = FALSE,
  1493. .ring_dir = HAL_SRNG_DST_RING,
  1494. .reg_start = {
  1495. HWIO_REO_R0_REO2SW0_RING_BASE_LSB_ADDR(
  1496. REO_REG_REG_BASE),
  1497. HWIO_REO_R2_REO2SW0_RING_HP_ADDR(
  1498. REO_REG_REG_BASE)
  1499. },
  1500. /* Single ring - provide ring size if multiple rings of this
  1501. * type are supported
  1502. */
  1503. .reg_size = {},
  1504. .max_size =
  1505. HWIO_REO_R0_REO2SW0_RING_BASE_MSB_RING_SIZE_BMSK >>
  1506. HWIO_REO_R0_REO2SW0_RING_BASE_MSB_RING_SIZE_SHFT,
  1507. },
  1508. { /* REO_REINJECT */
  1509. .start_ring_id = HAL_SRNG_SW2REO,
  1510. .max_rings = 4,
  1511. .entry_size = sizeof(struct reo_entrance_ring) >> 2,
  1512. .lmac_ring = FALSE,
  1513. .ring_dir = HAL_SRNG_SRC_RING,
  1514. .reg_start = {
  1515. HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(
  1516. REO_REG_REG_BASE),
  1517. HWIO_REO_R2_SW2REO_RING_HP_ADDR(
  1518. REO_REG_REG_BASE)
  1519. },
  1520. /* Single ring - provide ring size if multiple rings of this
  1521. * type are supported
  1522. */
  1523. .reg_size = {
  1524. HWIO_REO_R0_SW2REO1_RING_BASE_LSB_ADDR(0) -
  1525. HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(0),
  1526. HWIO_REO_R2_SW2REO1_RING_HP_ADDR(0) -
  1527. HWIO_REO_R2_SW2REO_RING_HP_ADDR(0)
  1528. },
  1529. .max_size = HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_BMSK >>
  1530. HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_SHFT,
  1531. },
  1532. { /* REO_CMD */
  1533. .start_ring_id = HAL_SRNG_REO_CMD,
  1534. .max_rings = 1,
  1535. .entry_size = (sizeof(struct tlv_32_hdr) +
  1536. sizeof(struct reo_get_queue_stats)) >> 2,
  1537. .lmac_ring = FALSE,
  1538. .ring_dir = HAL_SRNG_SRC_RING,
  1539. .reg_start = {
  1540. HWIO_REO_R0_REO_CMD_RING_BASE_LSB_ADDR(
  1541. REO_REG_REG_BASE),
  1542. HWIO_REO_R2_REO_CMD_RING_HP_ADDR(
  1543. REO_REG_REG_BASE),
  1544. },
  1545. /* Single ring - provide ring size if multiple rings of this
  1546. * type are supported
  1547. */
  1548. .reg_size = {},
  1549. .max_size = HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_BMSK >>
  1550. HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_SHFT,
  1551. },
  1552. { /* REO_STATUS */
  1553. .start_ring_id = HAL_SRNG_REO_STATUS,
  1554. .max_rings = 1,
  1555. .entry_size = (sizeof(struct tlv_32_hdr) +
  1556. sizeof(struct reo_get_queue_stats_status)) >> 2,
  1557. .lmac_ring = FALSE,
  1558. .ring_dir = HAL_SRNG_DST_RING,
  1559. .reg_start = {
  1560. HWIO_REO_R0_REO_STATUS_RING_BASE_LSB_ADDR(
  1561. REO_REG_REG_BASE),
  1562. HWIO_REO_R2_REO_STATUS_RING_HP_ADDR(
  1563. REO_REG_REG_BASE),
  1564. },
  1565. /* Single ring - provide ring size if multiple rings of this
  1566. * type are supported
  1567. */
  1568. .reg_size = {},
  1569. .max_size =
  1570. HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
  1571. HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
  1572. },
  1573. { /* TCL_DATA */
  1574. .start_ring_id = HAL_SRNG_SW2TCL1,
  1575. .max_rings = 6,
  1576. .entry_size = sizeof(struct tcl_data_cmd) >> 2,
  1577. .lmac_ring = FALSE,
  1578. .ring_dir = HAL_SRNG_SRC_RING,
  1579. .reg_start = {
  1580. HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(
  1581. MAC_TCL_REG_REG_BASE),
  1582. HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(
  1583. MAC_TCL_REG_REG_BASE),
  1584. },
  1585. .reg_size = {
  1586. HWIO_TCL_R0_SW2TCL2_RING_BASE_LSB_ADDR(0) -
  1587. HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(0),
  1588. HWIO_TCL_R2_SW2TCL2_RING_HP_ADDR(0) -
  1589. HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(0),
  1590. },
  1591. .max_size =
  1592. HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >>
  1593. HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT,
  1594. },
  1595. { /* TCL_CMD/CREDIT */
  1596. /* qca8074v2 and qca5332 uses this ring for data commands */
  1597. .start_ring_id = HAL_SRNG_SW2TCL_CMD,
  1598. .max_rings = 1,
  1599. .entry_size = sizeof(struct tcl_data_cmd) >> 2,
  1600. .lmac_ring = FALSE,
  1601. .ring_dir = HAL_SRNG_SRC_RING,
  1602. .reg_start = {
  1603. HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_LSB_ADDR(
  1604. MAC_TCL_REG_REG_BASE),
  1605. HWIO_TCL_R2_SW2TCL_CREDIT_RING_HP_ADDR(
  1606. MAC_TCL_REG_REG_BASE),
  1607. },
  1608. /* Single ring - provide ring size if multiple rings of this
  1609. * type are supported
  1610. */
  1611. .reg_size = {},
  1612. .max_size =
  1613. HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_BMSK >>
  1614. HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_SHFT,
  1615. },
  1616. { /* TCL_STATUS */
  1617. .start_ring_id = HAL_SRNG_TCL_STATUS,
  1618. .max_rings = 1,
  1619. .entry_size = (sizeof(struct tlv_32_hdr) +
  1620. sizeof(struct tcl_status_ring)) >> 2,
  1621. .lmac_ring = FALSE,
  1622. .ring_dir = HAL_SRNG_DST_RING,
  1623. .reg_start = {
  1624. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_LSB_ADDR(
  1625. MAC_TCL_REG_REG_BASE),
  1626. HWIO_TCL_R2_TCL_STATUS1_RING_HP_ADDR(
  1627. MAC_TCL_REG_REG_BASE),
  1628. },
  1629. /* Single ring - provide ring size if multiple rings of this
  1630. * type are supported
  1631. */
  1632. .reg_size = {},
  1633. .max_size =
  1634. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_BMSK >>
  1635. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_SHFT,
  1636. },
  1637. { /* CE_SRC */
  1638. .start_ring_id = HAL_SRNG_CE_0_SRC,
  1639. .max_rings = 16,
  1640. .entry_size = sizeof(struct ce_src_desc) >> 2,
  1641. .lmac_ring = FALSE,
  1642. .ring_dir = HAL_SRNG_SRC_RING,
  1643. .reg_start = {
  1644. HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR(
  1645. WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE),
  1646. HWIO_WFSS_CE_CHANNEL_SRC_R2_SRC_RING_HP_ADDR(
  1647. WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE),
  1648. },
  1649. .reg_size = {
  1650. WFSS_CE_1_CHANNEL_SRC_REG_REG_BASE -
  1651. WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE,
  1652. WFSS_CE_1_CHANNEL_SRC_REG_REG_BASE -
  1653. WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE,
  1654. },
  1655. .max_size =
  1656. HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_MSB_RING_SIZE_BMSK >>
  1657. HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_MSB_RING_SIZE_SHFT,
  1658. },
  1659. { /* CE_DST */
  1660. .start_ring_id = HAL_SRNG_CE_0_DST,
  1661. .max_rings = 16,
  1662. .entry_size = 8 >> 2,
  1663. /*TODO: entry_size above should actually be
  1664. * sizeof(struct ce_dst_desc) >> 2, but couldn't find definition
  1665. * of struct ce_dst_desc in HW header files
  1666. */
  1667. .lmac_ring = FALSE,
  1668. .ring_dir = HAL_SRNG_SRC_RING,
  1669. .reg_start = {
  1670. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR(
  1671. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE),
  1672. HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR(
  1673. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE),
  1674. },
  1675. .reg_size = {
  1676. WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
  1677. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
  1678. WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
  1679. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
  1680. },
  1681. .max_size =
  1682. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
  1683. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
  1684. },
  1685. { /* CE_DST_STATUS */
  1686. .start_ring_id = HAL_SRNG_CE_0_DST_STATUS,
  1687. .max_rings = 16,
  1688. .entry_size = sizeof(struct ce_stat_desc) >> 2,
  1689. .lmac_ring = FALSE,
  1690. .ring_dir = HAL_SRNG_DST_RING,
  1691. .reg_start = {
  1692. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR(
  1693. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE),
  1694. HWIO_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR(
  1695. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE),
  1696. },
  1697. /* TODO: check destination status ring registers */
  1698. .reg_size = {
  1699. WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
  1700. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
  1701. WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
  1702. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
  1703. },
  1704. .max_size =
  1705. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
  1706. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
  1707. },
  1708. { /* WBM_IDLE_LINK */
  1709. .start_ring_id = HAL_SRNG_WBM_IDLE_LINK,
  1710. .max_rings = 1,
  1711. .entry_size = sizeof(struct wbm_link_descriptor_ring) >> 2,
  1712. .lmac_ring = FALSE,
  1713. .ring_dir = HAL_SRNG_SRC_RING,
  1714. .reg_start = {
  1715. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE),
  1716. HWIO_WBM_R2_WBM_IDLE_LINK_RING_HP_ADDR(WBM_REG_REG_BASE),
  1717. },
  1718. /* Single ring - provide ring size if multiple rings of this
  1719. * type are supported
  1720. */
  1721. .reg_size = {},
  1722. .max_size =
  1723. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_BMSK >>
  1724. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_SHFT,
  1725. },
  1726. { /* SW2WBM_RELEASE */
  1727. .start_ring_id = HAL_SRNG_WBM_SW_RELEASE,
  1728. .max_rings = 1,
  1729. .entry_size = sizeof(struct wbm_release_ring) >> 2,
  1730. .lmac_ring = FALSE,
  1731. .ring_dir = HAL_SRNG_SRC_RING,
  1732. .reg_start = {
  1733. HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE),
  1734. HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE),
  1735. },
  1736. /* Single ring - provide ring size if multiple rings of this
  1737. * type are supported
  1738. */
  1739. .reg_size = {},
  1740. .max_size =
  1741. HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
  1742. HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
  1743. },
  1744. { /* WBM2SW_RELEASE */
  1745. .start_ring_id = HAL_SRNG_WBM2SW0_RELEASE,
  1746. .max_rings = 8,
  1747. .entry_size = sizeof(struct wbm_release_ring) >> 2,
  1748. .lmac_ring = FALSE,
  1749. .ring_dir = HAL_SRNG_DST_RING,
  1750. .reg_start = {
  1751. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(
  1752. WBM_REG_REG_BASE),
  1753. HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(
  1754. WBM_REG_REG_BASE),
  1755. },
  1756. .reg_size = {
  1757. HWIO_WBM_R0_WBM2SW1_RELEASE_RING_BASE_LSB_ADDR(
  1758. WBM_REG_REG_BASE) -
  1759. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(
  1760. WBM_REG_REG_BASE),
  1761. HWIO_WBM_R2_WBM2SW1_RELEASE_RING_HP_ADDR(
  1762. WBM_REG_REG_BASE) -
  1763. HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(
  1764. WBM_REG_REG_BASE),
  1765. },
  1766. .max_size =
  1767. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
  1768. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
  1769. },
  1770. { /* RXDMA_BUF */
  1771. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF0,
  1772. #ifdef IPA_OFFLOAD
  1773. .max_rings = 3,
  1774. #else
  1775. .max_rings = 3,
  1776. #endif
  1777. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  1778. .lmac_ring = TRUE,
  1779. .ring_dir = HAL_SRNG_SRC_RING,
  1780. /* reg_start is not set because LMAC rings are not accessed
  1781. * from host
  1782. */
  1783. .reg_start = {},
  1784. .reg_size = {},
  1785. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  1786. },
  1787. { /* RXDMA_DST */
  1788. .start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW0,
  1789. .max_rings = 0,
  1790. .entry_size = 0/*sizeof(struct reo_entrance_ring) >> 2*/,
  1791. .lmac_ring = TRUE,
  1792. .ring_dir = HAL_SRNG_DST_RING,
  1793. /* reg_start is not set because LMAC rings are not accessed
  1794. * from host
  1795. */
  1796. .reg_start = {},
  1797. .reg_size = {},
  1798. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  1799. },
  1800. #ifdef QCA_MONITOR_2_0_SUPPORT
  1801. { /* RXDMA_MONITOR_BUF */
  1802. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA2_BUF,
  1803. .max_rings = 1,
  1804. .entry_size = sizeof(struct mon_ingress_ring) >> 2,
  1805. .lmac_ring = TRUE,
  1806. .ring_dir = HAL_SRNG_SRC_RING,
  1807. /* reg_start is not set because LMAC rings are not accessed
  1808. * from host
  1809. */
  1810. .reg_start = {},
  1811. .reg_size = {},
  1812. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1813. },
  1814. #else
  1815. {},
  1816. #endif
  1817. { /* RXDMA_MONITOR_STATUS */
  1818. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF,
  1819. .max_rings = 0,
  1820. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  1821. .lmac_ring = TRUE,
  1822. .ring_dir = HAL_SRNG_SRC_RING,
  1823. /* reg_start is not set because LMAC rings are not accessed
  1824. * from host
  1825. */
  1826. .reg_start = {},
  1827. .reg_size = {},
  1828. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  1829. },
  1830. #ifdef QCA_MONITOR_2_0_SUPPORT
  1831. { /* RXDMA_MONITOR_DST */
  1832. .start_ring_id = HAL_SRNG_WMAC1_RXMON2SW0,
  1833. .max_rings = 2,
  1834. .entry_size = sizeof(struct mon_destination_ring) >> 2,
  1835. .lmac_ring = TRUE,
  1836. .ring_dir = HAL_SRNG_DST_RING,
  1837. /* reg_start is not set because LMAC rings are not accessed
  1838. * from host
  1839. */
  1840. .reg_start = {},
  1841. .reg_size = {},
  1842. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1843. },
  1844. #else
  1845. {},
  1846. #endif
  1847. { /* RXDMA_MONITOR_DESC */
  1848. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_DESC,
  1849. .max_rings = 0,
  1850. .entry_size = 0/*sizeof(struct sw_monitor_ring) >> 2*/,
  1851. .lmac_ring = TRUE,
  1852. .ring_dir = HAL_SRNG_DST_RING,
  1853. /* reg_start is not set because LMAC rings are not accessed
  1854. * from host
  1855. */
  1856. .reg_start = {},
  1857. .reg_size = {},
  1858. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1859. },
  1860. { /* DIR_BUF_RX_DMA_SRC */
  1861. .start_ring_id = HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING,
  1862. /* one ring for spectral and one ring for cfr */
  1863. .max_rings = 2,
  1864. .entry_size = 2,
  1865. .lmac_ring = TRUE,
  1866. .ring_dir = HAL_SRNG_SRC_RING,
  1867. /* reg_start is not set because LMAC rings are not accessed
  1868. * from host
  1869. */
  1870. .reg_start = {},
  1871. .reg_size = {},
  1872. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  1873. },
  1874. #ifdef WLAN_FEATURE_CIF_CFR
  1875. { /* WIFI_POS_SRC */
  1876. .start_ring_id = HAL_SRNG_WIFI_POS_SRC_DMA_RING,
  1877. .max_rings = 1,
  1878. .entry_size = sizeof(wmi_oem_dma_buf_release_entry) >> 2,
  1879. .lmac_ring = TRUE,
  1880. .ring_dir = HAL_SRNG_SRC_RING,
  1881. /* reg_start is not set because LMAC rings are not accessed
  1882. * from host
  1883. */
  1884. .reg_start = {},
  1885. .reg_size = {},
  1886. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1887. },
  1888. #endif
  1889. /* PPE rings are not present in Miami. Added dummy entries to preserve
  1890. * Array Index
  1891. */
  1892. /* REO2PPE */
  1893. {},
  1894. /* PPE2TCL */
  1895. {},
  1896. /* PPE_RELEASE */
  1897. {},
  1898. #ifdef QCA_MONITOR_2_0_SUPPORT
  1899. { /* TX_MONITOR_BUF */
  1900. .start_ring_id = HAL_SRNG_SW2TXMON_BUF0,
  1901. .max_rings = 1,
  1902. .entry_size = sizeof(struct mon_ingress_ring) >> 2,
  1903. .lmac_ring = TRUE,
  1904. .ring_dir = HAL_SRNG_SRC_RING,
  1905. /* reg_start is not set because LMAC rings are not accessed
  1906. * from host
  1907. */
  1908. .reg_start = {},
  1909. .reg_size = {},
  1910. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1911. },
  1912. { /* TX_MONITOR_DST */
  1913. .start_ring_id = HAL_SRNG_WMAC1_TXMON2SW0,
  1914. .max_rings = 2,
  1915. .entry_size = sizeof(struct mon_destination_ring) >> 2,
  1916. .lmac_ring = TRUE,
  1917. .ring_dir = HAL_SRNG_DST_RING,
  1918. /* reg_start is not set because LMAC rings are not accessed
  1919. * from host
  1920. */
  1921. .reg_start = {},
  1922. .reg_size = {},
  1923. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1924. },
  1925. #else
  1926. {},
  1927. {},
  1928. #endif
  1929. { /* SW2RXDMA */
  1930. .start_ring_id = HAL_SRNG_SW2RXDMA_BUF0,
  1931. .max_rings = 3,
  1932. .entry_size = sizeof(struct reo_entrance_ring) >> 2,
  1933. .lmac_ring = TRUE,
  1934. .ring_dir = HAL_SRNG_SRC_RING,
  1935. /* reg_start is not set because LMAC rings are not accessed
  1936. * from host
  1937. */
  1938. .reg_start = {},
  1939. .reg_size = {},
  1940. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1941. .dmac_cmn_ring = TRUE,
  1942. },
  1943. };
  1944. /**
  1945. * hal_srng_hw_reg_offset_init_qca5332() - Initialize the HW srng reg offset
  1946. * applicable only for qca5332
  1947. * @hal_soc: HAL Soc handle
  1948. *
  1949. * Return: None
  1950. */
  1951. static inline void hal_srng_hw_reg_offset_init_qca5332(struct hal_soc *hal_soc)
  1952. {
  1953. int32_t *hw_reg_offset = hal_soc->hal_hw_reg_offset;
  1954. hw_reg_offset[DST_MSI2_BASE_LSB] = REG_OFFSET(DST, MSI2_BASE_LSB),
  1955. hw_reg_offset[DST_MSI2_BASE_MSB] = REG_OFFSET(DST, MSI2_BASE_MSB),
  1956. hw_reg_offset[DST_MSI2_DATA] = REG_OFFSET(DST, MSI2_DATA),
  1957. hw_reg_offset[DST_PRODUCER_INT2_SETUP] =
  1958. REG_OFFSET(DST, PRODUCER_INT2_SETUP);
  1959. }
  1960. /**
  1961. * hal_qca5332_attach()- Attach 5332 target specific hal_soc ops,
  1962. * offset and srng table
  1963. * Return: void
  1964. */
  1965. void hal_qca5332_attach(struct hal_soc *hal_soc)
  1966. {
  1967. hal_soc->hw_srng_table = hw_srng_table_5332;
  1968. hal_srng_hw_reg_offset_init_generic(hal_soc);
  1969. hal_srng_hw_reg_offset_init_qca5332(hal_soc);
  1970. hal_hw_txrx_default_ops_attach_be(hal_soc);
  1971. hal_hw_txrx_ops_attach_qca5332(hal_soc);
  1972. hal_soc->dmac_cmn_src_rxbuf_ring = true;
  1973. }