hal_5332.c 64 KB

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