hal_9224.c 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741
  1. /*
  2. * Copyright (c) 2021 The Linux Foundation. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for
  5. * any purpose with or without fee is hereby granted, provided that the
  6. * above copyright notice and this permission notice appear in all
  7. * copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  10. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  11. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  12. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  14. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  15. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  16. * PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. #include "qdf_types.h"
  19. #include "qdf_util.h"
  20. #include "qdf_mem.h"
  21. #include "qdf_nbuf.h"
  22. #include "qdf_module.h"
  23. #include "target_type.h"
  24. #include "wcss_version.h"
  25. #include "hal_be_hw_headers.h"
  26. #include "hal_internal.h"
  27. #include "hal_api.h"
  28. #include "hal_flow.h"
  29. #include "rx_flow_search_entry.h"
  30. #include "hal_rx_flow_info.h"
  31. #include "hal_be_api.h"
  32. #include "tcl_entrance_from_ppe_ring.h"
  33. #include "sw_monitor_ring.h"
  34. #include "wcss_seq_hwioreg_umac.h"
  35. #include "wfss_ce_reg_seq_hwioreg.h"
  36. #include <uniform_reo_status_header.h>
  37. #include <wbm_release_ring_tx.h>
  38. #include <wbm_release_ring_rx.h>
  39. #include <phyrx_location.h>
  40. #include <hal_be_rx.h>
  41. #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_OFFSET \
  42. RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_OFFSET
  43. #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_MASK \
  44. RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_MASK
  45. #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_LSB \
  46. RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_LSB
  47. #define UNIFIED_PHYRX_HT_SIG_0_HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS_OFFSET \
  48. PHYRX_HT_SIG_PHYRX_HT_SIG_INFO_DETAILS_MCS_OFFSET
  49. #define UNIFIED_PHYRX_L_SIG_B_0_L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS_OFFSET \
  50. PHYRX_L_SIG_B_PHYRX_L_SIG_B_INFO_DETAILS_RATE_OFFSET
  51. #define UNIFIED_PHYRX_L_SIG_A_0_L_SIG_A_INFO_PHYRX_L_SIG_A_INFO_DETAILS_OFFSET \
  52. PHYRX_L_SIG_A_PHYRX_L_SIG_A_INFO_DETAILS_RATE_OFFSET
  53. #define UNIFIED_PHYRX_VHT_SIG_A_0_VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS_OFFSET \
  54. PHYRX_VHT_SIG_A_PHYRX_VHT_SIG_A_INFO_DETAILS_BANDWIDTH_OFFSET
  55. #define UNIFIED_PHYRX_HE_SIG_A_SU_0_HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS_OFFSET \
  56. PHYRX_HE_SIG_A_SU_PHYRX_HE_SIG_A_SU_INFO_DETAILS_FORMAT_INDICATION_OFFSET
  57. #define UNIFIED_PHYRX_HE_SIG_A_MU_DL_0_HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS_OFFSET \
  58. PHYRX_HE_SIG_A_MU_DL_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS_DL_UL_FLAG_OFFSET
  59. #define UNIFIED_PHYRX_HE_SIG_B1_MU_0_HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS_OFFSET \
  60. PHYRX_HE_SIG_B1_MU_PHYRX_HE_SIG_B1_MU_INFO_DETAILS_RU_ALLOCATION_OFFSET
  61. #define UNIFIED_PHYRX_HE_SIG_B2_MU_0_HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS_OFFSET \
  62. PHYRX_HE_SIG_B2_MU_PHYRX_HE_SIG_B2_MU_INFO_DETAILS_STA_ID_OFFSET
  63. #define UNIFIED_PHYRX_HE_SIG_B2_OFDMA_0_HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS_OFFSET \
  64. PHYRX_HE_SIG_B2_OFDMA_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS_STA_ID_OFFSET
  65. #define UNIFIED_PHYRX_RSSI_LEGACY_3_RECEIVE_RSSI_INFO_PRE_RSSI_INFO_DETAILS_OFFSET \
  66. PHYRX_RSSI_LEGACY_PRE_RSSI_INFO_DETAILS_RSSI_PRI20_CHAIN0_OFFSET
  67. #define UNIFIED_PHYRX_RSSI_LEGACY_19_RECEIVE_RSSI_INFO_PREAMBLE_RSSI_INFO_DETAILS_OFFSET \
  68. PHYRX_RSSI_LEGACY_PREAMBLE_RSSI_INFO_DETAILS_RSSI_PRI20_CHAIN0_OFFSET
  69. #define UNIFIED_RX_MPDU_START_0_RX_MPDU_INFO_RX_MPDU_INFO_DETAILS_OFFSET \
  70. RX_MPDU_START_RX_MPDU_INFO_DETAILS_RXPCU_MPDU_FILTER_IN_CATEGORY_OFFSET
  71. #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \
  72. RX_MSDU_LINK_MSDU_BUFFER_ADDR_INFO_DETAILS_BUFFER_ADDR_31_0_OFFSET
  73. #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \
  74. RX_MSDU_DETAILS_RX_MSDU_DESC_INFO_DETAILS_FIRST_MSDU_IN_MPDU_FLAG_OFFSET
  75. #define UNIFIED_RX_MPDU_DETAILS_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \
  76. RX_MPDU_DETAILS_RX_MPDU_DESC_INFO_DETAILS_MSDU_COUNT_OFFSET
  77. #define UNIFIED_REO_DESTINATION_RING_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \
  78. REO_DESTINATION_RING_RX_MPDU_DESC_INFO_DETAILS_MSDU_COUNT_OFFSET
  79. #define UNIFORM_REO_STATUS_HEADER_STATUS_HEADER \
  80. STATUS_HEADER_REO_STATUS_NUMBER
  81. #define UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC \
  82. STATUS_HEADER_TIMESTAMP
  83. #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \
  84. RX_MSDU_DETAILS_RX_MSDU_DESC_INFO_DETAILS_FIRST_MSDU_IN_MPDU_FLAG_OFFSET
  85. #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \
  86. RX_MSDU_LINK_MSDU_BUFFER_ADDR_INFO_DETAILS_BUFFER_ADDR_31_0_OFFSET
  87. #define UNIFIED_TCL_DATA_CMD_0_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \
  88. TCL_DATA_CMD_BUF_ADDR_INFO_BUFFER_ADDR_31_0_OFFSET
  89. #define UNIFIED_TCL_DATA_CMD_1_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \
  90. TCL_DATA_CMD_BUF_ADDR_INFO_BUFFER_ADDR_39_32_OFFSET
  91. #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_OFFSET \
  92. TCL_DATA_CMD_BUF_OR_EXT_DESC_TYPE_OFFSET
  93. #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB \
  94. BUFFER_ADDR_INFO_BUFFER_ADDR_31_0_LSB
  95. #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK \
  96. BUFFER_ADDR_INFO_BUFFER_ADDR_31_0_MASK
  97. #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB \
  98. BUFFER_ADDR_INFO_BUFFER_ADDR_39_32_LSB
  99. #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK \
  100. BUFFER_ADDR_INFO_BUFFER_ADDR_39_32_MASK
  101. #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB \
  102. BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_LSB
  103. #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK \
  104. BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_MASK
  105. #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB \
  106. BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_LSB
  107. #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK \
  108. BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_MASK
  109. #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_LSB \
  110. TCL_DATA_CMD_BUF_OR_EXT_DESC_TYPE_LSB
  111. #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_MASK \
  112. TCL_DATA_CMD_BUF_OR_EXT_DESC_TYPE_MASK
  113. #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_MASK \
  114. WBM_RELEASE_RING_TX_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_MASK
  115. #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_OFFSET \
  116. WBM_RELEASE_RING_TX_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_OFFSET
  117. #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_LSB \
  118. WBM_RELEASE_RING_TX_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_LSB
  119. #define CE_WINDOW_ADDRESS_9224 \
  120. ((CE_WFSS_CE_REG_BASE >> WINDOW_SHIFT) & WINDOW_VALUE_MASK)
  121. #define UMAC_WINDOW_ADDRESS_9224 \
  122. ((UMAC_BASE >> WINDOW_SHIFT) & WINDOW_VALUE_MASK)
  123. #define WINDOW_CONFIGURATION_VALUE_9224 \
  124. ((CE_WINDOW_ADDRESS_9224 << 6) |\
  125. (UMAC_WINDOW_ADDRESS_9224 << 12) | \
  126. WINDOW_ENABLE_BIT)
  127. #include "hal_9224_rx.h"
  128. #include <hal_be_generic_api.h>
  129. #include "hal_9224_tx.h"
  130. #include "hal_be_rx_tlv.h"
  131. #define LINK_DESC_SIZE (NUM_OF_DWORDS_RX_MSDU_LINK << 2)
  132. /**
  133. * hal_get_link_desc_size_9224(): API to get the link desc size
  134. *
  135. * Return: uint32_t
  136. */
  137. static uint32_t hal_get_link_desc_size_9224(void)
  138. {
  139. return LINK_DESC_SIZE;
  140. }
  141. /**
  142. * hal_rx_get_tlv_9224(): API to get the tlv
  143. *
  144. * @rx_tlv: TLV data extracted from the rx packet
  145. * Return: uint8_t
  146. */
  147. static uint8_t hal_rx_get_tlv_9224(void *rx_tlv)
  148. {
  149. return HAL_RX_GET(rx_tlv, PHYRX_RSSI_LEGACY, RECEIVE_BANDWIDTH);
  150. }
  151. /**
  152. * hal_rx_wbm_err_msdu_continuation_get_9224 () - API to check if WBM
  153. * msdu continuation bit is set
  154. *
  155. *@wbm_desc: wbm release ring descriptor
  156. *
  157. * Return: true if msdu continuation bit is set.
  158. */
  159. uint8_t hal_rx_wbm_err_msdu_continuation_get_9224(void *wbm_desc)
  160. {
  161. uint32_t comp_desc = *(uint32_t *)(((uint8_t *)wbm_desc) +
  162. WBM_RELEASE_RING_RX_RX_MSDU_DESC_INFO_DETAILS_MSDU_CONTINUATION_OFFSET);
  163. return (comp_desc &
  164. WBM_RELEASE_RING_RX_RX_MSDU_DESC_INFO_DETAILS_MSDU_CONTINUATION_MASK) >>
  165. WBM_RELEASE_RING_RX_RX_MSDU_DESC_INFO_DETAILS_MSDU_CONTINUATION_LSB;
  166. }
  167. /**
  168. * hal_rx_proc_phyrx_other_receive_info_tlv_9224(): API to get tlv info
  169. *
  170. * Return: uint32_t
  171. */
  172. static inline
  173. void hal_rx_proc_phyrx_other_receive_info_tlv_9224(void *rx_tlv_hdr,
  174. void *ppdu_info_hdl)
  175. {
  176. uint32_t tlv_tag, tlv_len;
  177. uint32_t temp_len, other_tlv_len, other_tlv_tag;
  178. void *rx_tlv = (uint8_t *)rx_tlv_hdr + HAL_RX_TLV32_HDR_SIZE;
  179. void *other_tlv_hdr = NULL;
  180. void *other_tlv = NULL;
  181. tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(rx_tlv_hdr);
  182. tlv_len = HAL_RX_GET_USER_TLV32_LEN(rx_tlv_hdr);
  183. temp_len = 0;
  184. other_tlv_hdr = rx_tlv + HAL_RX_TLV32_HDR_SIZE;
  185. other_tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(other_tlv_hdr);
  186. other_tlv_len = HAL_RX_GET_USER_TLV32_LEN(other_tlv_hdr);
  187. temp_len += other_tlv_len;
  188. other_tlv = other_tlv_hdr + HAL_RX_TLV32_HDR_SIZE;
  189. switch (other_tlv_tag) {
  190. default:
  191. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  192. "%s unhandled TLV type: %d, TLV len:%d",
  193. __func__, other_tlv_tag, other_tlv_len);
  194. break;
  195. }
  196. }
  197. #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE)
  198. static inline
  199. void hal_rx_get_bb_info_9224(void *rx_tlv, void *ppdu_info_hdl)
  200. {
  201. struct hal_rx_ppdu_info *ppdu_info = ppdu_info_hdl;
  202. ppdu_info->cfr_info.bb_captured_channel =
  203. HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_CHANNEL);
  204. ppdu_info->cfr_info.bb_captured_timeout =
  205. HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_TIMEOUT);
  206. ppdu_info->cfr_info.bb_captured_reason =
  207. HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_REASON);
  208. }
  209. static inline
  210. void hal_rx_get_rtt_info_9224(void *rx_tlv, void *ppdu_info_hdl)
  211. {
  212. struct hal_rx_ppdu_info *ppdu_info = ppdu_info_hdl;
  213. ppdu_info->cfr_info.rx_location_info_valid =
  214. HAL_RX_GET(rx_tlv, PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  215. RX_LOCATION_INFO_VALID);
  216. ppdu_info->cfr_info.rtt_che_buffer_pointer_low32 =
  217. HAL_RX_GET(rx_tlv,
  218. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  219. RTT_CHE_BUFFER_POINTER_LOW32);
  220. ppdu_info->cfr_info.rtt_che_buffer_pointer_high8 =
  221. HAL_RX_GET(rx_tlv,
  222. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  223. RTT_CHE_BUFFER_POINTER_HIGH8);
  224. ppdu_info->cfr_info.chan_capture_status =
  225. HAL_RX_GET(rx_tlv,
  226. RX_LOCATION_INFO,
  227. RESERVED_3);
  228. ppdu_info->cfr_info.rx_start_ts =
  229. HAL_RX_GET(rx_tlv,
  230. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  231. RX_START_TS);
  232. ppdu_info->cfr_info.rtt_cfo_measurement = (int16_t)
  233. HAL_RX_GET(rx_tlv,
  234. PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
  235. RTT_CFO_MEASUREMENT);
  236. ppdu_info->cfr_info.agc_gain_info0 =
  237. HAL_RX_GET(rx_tlv,
  238. PHYRX_PKT_END_INFO,
  239. PHY_TIMESTAMP_1_LOWER_32);
  240. ppdu_info->cfr_info.agc_gain_info1 =
  241. HAL_RX_GET(rx_tlv,
  242. PHYRX_PKT_END_INFO,
  243. PHY_TIMESTAMP_1_UPPER_32);
  244. ppdu_info->cfr_info.agc_gain_info2 =
  245. HAL_RX_GET(rx_tlv,
  246. PHYRX_PKT_END_INFO,
  247. PHY_TIMESTAMP_2_LOWER_32);
  248. ppdu_info->cfr_info.agc_gain_info3 =
  249. HAL_RX_GET(rx_tlv,
  250. PHYRX_PKT_END_INFO,
  251. PHY_TIMESTAMP_2_UPPER_32);
  252. }
  253. #endif
  254. /**
  255. * hal_rx_dump_mpdu_start_tlv_9224: dump RX mpdu_start TLV in structured
  256. * human readable format.
  257. * @mpdu_start: pointer the rx_attention TLV in pkt.
  258. * @dbg_level: log level.
  259. *
  260. * Return: void
  261. */
  262. static inline void hal_rx_dump_mpdu_start_tlv_9224(void *mpdustart,
  263. uint8_t dbg_level)
  264. {
  265. struct rx_mpdu_start_compact *mpdu_info =
  266. (struct rx_mpdu_start_compact *)mpdustart;
  267. QDF_TRACE(dbg_level, QDF_MODULE_ID_HAL,
  268. "rx_mpdu_start tlv (1/5) - "
  269. "rx_reo_queue_desc_addr_39_32 :%x"
  270. "receive_queue_number:%x "
  271. "pre_delim_err_warning:%x "
  272. "first_delim_err:%x "
  273. "reserved_2a:%x "
  274. "pn_31_0:%x "
  275. "pn_63_32:%x "
  276. "pn_95_64:%x "
  277. "pn_127_96:%x "
  278. "epd_en:%x "
  279. "all_frames_shall_be_encrypted :%x"
  280. "encrypt_type:%x "
  281. "wep_key_width_for_variable_key :%x"
  282. "mesh_sta:%x "
  283. "bssid_hit:%x "
  284. "bssid_number:%x "
  285. "tid:%x "
  286. "reserved_7a:%x ",
  287. mpdu_info->rx_reo_queue_desc_addr_39_32,
  288. mpdu_info->receive_queue_number,
  289. mpdu_info->pre_delim_err_warning,
  290. mpdu_info->first_delim_err,
  291. mpdu_info->reserved_2a,
  292. mpdu_info->pn_31_0,
  293. mpdu_info->pn_63_32,
  294. mpdu_info->pn_95_64,
  295. mpdu_info->pn_127_96,
  296. mpdu_info->epd_en,
  297. mpdu_info->all_frames_shall_be_encrypted,
  298. mpdu_info->encrypt_type,
  299. mpdu_info->wep_key_width_for_variable_key,
  300. mpdu_info->mesh_sta,
  301. mpdu_info->bssid_hit,
  302. mpdu_info->bssid_number,
  303. mpdu_info->tid,
  304. mpdu_info->reserved_7a);
  305. QDF_TRACE(dbg_level, QDF_MODULE_ID_HAL,
  306. "rx_mpdu_start tlv (2/5) - "
  307. "ast_index:%x "
  308. "sw_peer_id:%x "
  309. "mpdu_frame_control_valid:%x "
  310. "mpdu_duration_valid:%x "
  311. "mac_addr_ad1_valid:%x "
  312. "mac_addr_ad2_valid:%x "
  313. "mac_addr_ad3_valid:%x "
  314. "mac_addr_ad4_valid:%x "
  315. "mpdu_sequence_control_valid :%x"
  316. "mpdu_qos_control_valid:%x "
  317. "mpdu_ht_control_valid:%x "
  318. "frame_encryption_info_valid :%x",
  319. mpdu_info->ast_index,
  320. mpdu_info->sw_peer_id,
  321. mpdu_info->mpdu_frame_control_valid,
  322. mpdu_info->mpdu_duration_valid,
  323. mpdu_info->mac_addr_ad1_valid,
  324. mpdu_info->mac_addr_ad2_valid,
  325. mpdu_info->mac_addr_ad3_valid,
  326. mpdu_info->mac_addr_ad4_valid,
  327. mpdu_info->mpdu_sequence_control_valid,
  328. mpdu_info->mpdu_qos_control_valid,
  329. mpdu_info->mpdu_ht_control_valid,
  330. mpdu_info->frame_encryption_info_valid);
  331. QDF_TRACE(dbg_level, QDF_MODULE_ID_HAL,
  332. "rx_mpdu_start tlv (3/5) - "
  333. "mpdu_fragment_number:%x "
  334. "more_fragment_flag:%x "
  335. "reserved_11a:%x "
  336. "fr_ds:%x "
  337. "to_ds:%x "
  338. "encrypted:%x "
  339. "mpdu_retry:%x "
  340. "mpdu_sequence_number:%x ",
  341. mpdu_info->mpdu_fragment_number,
  342. mpdu_info->more_fragment_flag,
  343. mpdu_info->reserved_11a,
  344. mpdu_info->fr_ds,
  345. mpdu_info->to_ds,
  346. mpdu_info->encrypted,
  347. mpdu_info->mpdu_retry,
  348. mpdu_info->mpdu_sequence_number);
  349. QDF_TRACE(dbg_level, QDF_MODULE_ID_HAL,
  350. "rx_mpdu_start tlv (4/5) - "
  351. "mpdu_frame_control_field:%x "
  352. "mpdu_duration_field:%x ",
  353. mpdu_info->mpdu_frame_control_field,
  354. mpdu_info->mpdu_duration_field);
  355. QDF_TRACE(dbg_level, QDF_MODULE_ID_HAL,
  356. "rx_mpdu_start tlv (5/5) - "
  357. "mac_addr_ad1_31_0:%x "
  358. "mac_addr_ad1_47_32:%x "
  359. "mac_addr_ad2_15_0:%x "
  360. "mac_addr_ad2_47_16:%x "
  361. "mac_addr_ad3_31_0:%x "
  362. "mac_addr_ad3_47_32:%x "
  363. "mpdu_sequence_control_field :%x"
  364. "mac_addr_ad4_31_0:%x "
  365. "mac_addr_ad4_47_32:%x "
  366. "mpdu_qos_control_field:%x ",
  367. mpdu_info->mac_addr_ad1_31_0,
  368. mpdu_info->mac_addr_ad1_47_32,
  369. mpdu_info->mac_addr_ad2_15_0,
  370. mpdu_info->mac_addr_ad2_47_16,
  371. mpdu_info->mac_addr_ad3_31_0,
  372. mpdu_info->mac_addr_ad3_47_32,
  373. mpdu_info->mpdu_sequence_control_field,
  374. mpdu_info->mac_addr_ad4_31_0,
  375. mpdu_info->mac_addr_ad4_47_32,
  376. mpdu_info->mpdu_qos_control_field);
  377. }
  378. /**
  379. * hal_rx_dump_msdu_end_tlv_9224: dump RX msdu_end TLV in structured
  380. * human readable format.
  381. * @ msdu_end: pointer the msdu_end TLV in pkt.
  382. * @ dbg_level: log level.
  383. *
  384. * Return: void
  385. */
  386. static void hal_rx_dump_msdu_end_tlv_9224(void *msduend,
  387. uint8_t dbg_level)
  388. {
  389. struct rx_msdu_end_compact *msdu_end =
  390. (struct rx_msdu_end_compact *)msduend;
  391. QDF_TRACE(QDF_MODULE_ID_DP, dbg_level,
  392. "rx_msdu_end tlv - "
  393. "key_id_octet: %d "
  394. "cce_super_rule: %d "
  395. "cce_classify_not_done_truncat: %d "
  396. "cce_classify_not_done_cce_dis: %d "
  397. "rule_indication_31_0: %d "
  398. "tcp_udp_chksum: %d "
  399. "sa_idx_timeout: %d "
  400. "da_idx_timeout: %d "
  401. "msdu_limit_error: %d "
  402. "flow_idx_timeout: %d "
  403. "flow_idx_invalid: %d "
  404. "wifi_parser_error: %d "
  405. "sa_is_valid: %d "
  406. "da_is_valid: %d "
  407. "da_is_mcbc: %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->cce_super_rule,
  420. msdu_end->cce_classify_not_done_truncate,
  421. msdu_end->cce_classify_not_done_cce_dis,
  422. msdu_end->rule_indication_31_0,
  423. msdu_end->tcp_udp_chksum,
  424. msdu_end->sa_idx_timeout,
  425. msdu_end->da_idx_timeout,
  426. msdu_end->msdu_limit_error,
  427. msdu_end->flow_idx_timeout,
  428. msdu_end->flow_idx_invalid,
  429. msdu_end->wifi_parser_error,
  430. msdu_end->sa_is_valid,
  431. msdu_end->da_is_valid,
  432. msdu_end->da_is_mcbc,
  433. msdu_end->l3_header_padding,
  434. msdu_end->first_msdu,
  435. msdu_end->last_msdu,
  436. msdu_end->sa_idx,
  437. msdu_end->msdu_drop,
  438. msdu_end->reo_destination_indication,
  439. msdu_end->flow_idx,
  440. msdu_end->fse_metadata,
  441. msdu_end->cce_metadata,
  442. msdu_end->sa_sw_peer_id);
  443. }
  444. /**
  445. * hal_reo_status_get_header_9224 - Process reo desc info
  446. * @d - Pointer to reo descriptior
  447. * @b - tlv type info
  448. * @h1 - Pointer to hal_reo_status_header where info to be stored
  449. *
  450. * Return - none.
  451. *
  452. */
  453. static void hal_reo_status_get_header_9224(hal_ring_desc_t ring_desc,
  454. int b, void *h1)
  455. {
  456. uint64_t *d = (uint64_t *)ring_desc;
  457. uint64_t val1 = 0;
  458. struct hal_reo_status_header *h =
  459. (struct hal_reo_status_header *)h1;
  460. /* Offsets of descriptor fields defined in HW headers start
  461. * from the field after TLV header
  462. */
  463. d += HAL_GET_NUM_QWORDS(sizeof(struct tlv_32_hdr));
  464. switch (b) {
  465. case HAL_REO_QUEUE_STATS_STATUS_TLV:
  466. val1 = d[HAL_OFFSET_QW(REO_GET_QUEUE_STATS_STATUS,
  467. STATUS_HEADER_REO_STATUS_NUMBER)];
  468. break;
  469. case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
  470. val1 = d[HAL_OFFSET_QW(REO_FLUSH_QUEUE_STATUS,
  471. STATUS_HEADER_REO_STATUS_NUMBER)];
  472. break;
  473. case HAL_REO_FLUSH_CACHE_STATUS_TLV:
  474. val1 = d[HAL_OFFSET_QW(REO_FLUSH_CACHE_STATUS,
  475. STATUS_HEADER_REO_STATUS_NUMBER)];
  476. break;
  477. case HAL_REO_UNBLK_CACHE_STATUS_TLV:
  478. val1 = d[HAL_OFFSET_QW(REO_UNBLOCK_CACHE_STATUS,
  479. STATUS_HEADER_REO_STATUS_NUMBER)];
  480. break;
  481. case HAL_REO_TIMOUT_LIST_STATUS_TLV:
  482. val1 = d[HAL_OFFSET_QW(REO_FLUSH_TIMEOUT_LIST_STATUS,
  483. STATUS_HEADER_REO_STATUS_NUMBER)];
  484. break;
  485. case HAL_REO_DESC_THRES_STATUS_TLV:
  486. val1 =
  487. d[HAL_OFFSET_QW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS,
  488. STATUS_HEADER_REO_STATUS_NUMBER)];
  489. break;
  490. case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
  491. val1 = d[HAL_OFFSET_QW(REO_UPDATE_RX_REO_QUEUE_STATUS,
  492. STATUS_HEADER_REO_STATUS_NUMBER)];
  493. break;
  494. default:
  495. qdf_nofl_err("ERROR: Unknown tlv\n");
  496. break;
  497. }
  498. h->cmd_num =
  499. HAL_GET_FIELD(
  500. UNIFORM_REO_STATUS_HEADER, REO_STATUS_NUMBER,
  501. val1);
  502. h->exec_time =
  503. HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER,
  504. CMD_EXECUTION_TIME, val1);
  505. h->status =
  506. HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER,
  507. REO_CMD_EXECUTION_STATUS, val1);
  508. switch (b) {
  509. case HAL_REO_QUEUE_STATS_STATUS_TLV:
  510. val1 = d[HAL_OFFSET_QW(REO_GET_QUEUE_STATS_STATUS,
  511. STATUS_HEADER_TIMESTAMP)];
  512. break;
  513. case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
  514. val1 = d[HAL_OFFSET_QW(REO_FLUSH_QUEUE_STATUS,
  515. STATUS_HEADER_TIMESTAMP)];
  516. break;
  517. case HAL_REO_FLUSH_CACHE_STATUS_TLV:
  518. val1 = d[HAL_OFFSET_QW(REO_FLUSH_CACHE_STATUS,
  519. STATUS_HEADER_TIMESTAMP)];
  520. break;
  521. case HAL_REO_UNBLK_CACHE_STATUS_TLV:
  522. val1 = d[HAL_OFFSET_QW(REO_UNBLOCK_CACHE_STATUS,
  523. STATUS_HEADER_TIMESTAMP)];
  524. break;
  525. case HAL_REO_TIMOUT_LIST_STATUS_TLV:
  526. val1 = d[HAL_OFFSET_QW(REO_FLUSH_TIMEOUT_LIST_STATUS,
  527. STATUS_HEADER_TIMESTAMP)];
  528. break;
  529. case HAL_REO_DESC_THRES_STATUS_TLV:
  530. val1 =
  531. d[HAL_OFFSET_QW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS,
  532. STATUS_HEADER_TIMESTAMP)];
  533. break;
  534. case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
  535. val1 = d[HAL_OFFSET_QW(REO_UPDATE_RX_REO_QUEUE_STATUS,
  536. STATUS_HEADER_TIMESTAMP)];
  537. break;
  538. default:
  539. qdf_nofl_err("ERROR: Unknown tlv\n");
  540. break;
  541. }
  542. h->tstamp =
  543. HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER, TIMESTAMP, val1);
  544. }
  545. static
  546. void *hal_rx_msdu0_buffer_addr_lsb_9224(void *link_desc_va)
  547. {
  548. return (void *)HAL_RX_MSDU0_BUFFER_ADDR_LSB(link_desc_va);
  549. }
  550. static
  551. void *hal_rx_msdu_desc_info_ptr_get_9224(void *msdu0)
  552. {
  553. return (void *)HAL_RX_MSDU_DESC_INFO_PTR_GET(msdu0);
  554. }
  555. static
  556. void *hal_ent_mpdu_desc_info_9224(void *ent_ring_desc)
  557. {
  558. return (void *)HAL_ENT_MPDU_DESC_INFO(ent_ring_desc);
  559. }
  560. static
  561. void *hal_dst_mpdu_desc_info_9224(void *dst_ring_desc)
  562. {
  563. return (void *)HAL_DST_MPDU_DESC_INFO(dst_ring_desc);
  564. }
  565. /**
  566. * hal_reo_config_9224(): Set reo config parameters
  567. * @soc: hal soc handle
  568. * @reg_val: value to be set
  569. * @reo_params: reo parameters
  570. *
  571. * Return: void
  572. */
  573. static void
  574. hal_reo_config_9224(struct hal_soc *soc,
  575. uint32_t reg_val,
  576. struct hal_reo_params *reo_params)
  577. {
  578. HAL_REO_R0_CONFIG(soc, reg_val, reo_params);
  579. }
  580. /**
  581. * hal_rx_msdu_desc_info_get_ptr_9224() - Get msdu desc info ptr
  582. * @msdu_details_ptr - Pointer to msdu_details_ptr
  583. *
  584. * Return - Pointer to rx_msdu_desc_info structure.
  585. *
  586. */
  587. static void *hal_rx_msdu_desc_info_get_ptr_9224(void *msdu_details_ptr)
  588. {
  589. return HAL_RX_MSDU_DESC_INFO_GET(msdu_details_ptr);
  590. }
  591. /**
  592. * hal_rx_link_desc_msdu0_ptr_9224 - Get pointer to rx_msdu details
  593. * @link_desc - Pointer to link desc
  594. *
  595. * Return - Pointer to rx_msdu_details structure
  596. *
  597. */
  598. static void *hal_rx_link_desc_msdu0_ptr_9224(void *link_desc)
  599. {
  600. return HAL_RX_LINK_DESC_MSDU0_PTR(link_desc);
  601. }
  602. /**
  603. * hal_get_window_address_9224(): Function to get hp/tp address
  604. * @hal_soc: Pointer to hal_soc
  605. * @addr: address offset of register
  606. *
  607. * Return: modified address offset of register
  608. */
  609. static inline qdf_iomem_t hal_get_window_address_9224(struct hal_soc *hal_soc,
  610. qdf_iomem_t addr)
  611. {
  612. uint32_t offset = addr - hal_soc->dev_base_addr;
  613. qdf_iomem_t new_offset;
  614. /*
  615. * If offset lies within DP register range, use 3rd window to write
  616. * into DP region.
  617. */
  618. if ((offset ^ UMAC_BASE) < WINDOW_RANGE_MASK) {
  619. new_offset = (hal_soc->dev_base_addr + (3 * WINDOW_START) +
  620. (offset & WINDOW_RANGE_MASK));
  621. /*
  622. * If offset lies within CE register range, use 2nd window to write
  623. * into CE region.
  624. */
  625. } else if ((offset ^ CE_WFSS_CE_REG_BASE) < WINDOW_RANGE_MASK) {
  626. new_offset = (hal_soc->dev_base_addr + (2 * WINDOW_START) +
  627. (offset & WINDOW_RANGE_MASK));
  628. } else {
  629. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  630. "%s: ERROR: Accessing Wrong register\n", __func__);
  631. qdf_assert_always(0);
  632. return 0;
  633. }
  634. return new_offset;
  635. }
  636. static inline void hal_write_window_register(struct hal_soc *hal_soc)
  637. {
  638. /* Write value into window configuration register */
  639. qdf_iowrite32(hal_soc->dev_base_addr + WINDOW_REG_ADDRESS,
  640. WINDOW_CONFIGURATION_VALUE_9224);
  641. }
  642. static
  643. void hal_compute_reo_remap_ix2_ix3_9224(uint32_t *ring, uint32_t num_rings,
  644. uint32_t *remap1, uint32_t *remap2)
  645. {
  646. switch (num_rings) {
  647. case 1:
  648. *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
  649. HAL_REO_REMAP_IX2(ring[0], 17) |
  650. HAL_REO_REMAP_IX2(ring[0], 18) |
  651. HAL_REO_REMAP_IX2(ring[0], 19) |
  652. HAL_REO_REMAP_IX2(ring[0], 20) |
  653. HAL_REO_REMAP_IX2(ring[0], 21) |
  654. HAL_REO_REMAP_IX2(ring[0], 22) |
  655. HAL_REO_REMAP_IX2(ring[0], 23);
  656. *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
  657. HAL_REO_REMAP_IX3(ring[0], 25) |
  658. HAL_REO_REMAP_IX3(ring[0], 26) |
  659. HAL_REO_REMAP_IX3(ring[0], 27) |
  660. HAL_REO_REMAP_IX3(ring[0], 28) |
  661. HAL_REO_REMAP_IX3(ring[0], 29) |
  662. HAL_REO_REMAP_IX3(ring[0], 30) |
  663. HAL_REO_REMAP_IX3(ring[0], 31);
  664. break;
  665. case 2:
  666. *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
  667. HAL_REO_REMAP_IX2(ring[0], 17) |
  668. HAL_REO_REMAP_IX2(ring[1], 18) |
  669. HAL_REO_REMAP_IX2(ring[1], 19) |
  670. HAL_REO_REMAP_IX2(ring[0], 20) |
  671. HAL_REO_REMAP_IX2(ring[0], 21) |
  672. HAL_REO_REMAP_IX2(ring[1], 22) |
  673. HAL_REO_REMAP_IX2(ring[1], 23);
  674. *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
  675. HAL_REO_REMAP_IX3(ring[0], 25) |
  676. HAL_REO_REMAP_IX3(ring[1], 26) |
  677. HAL_REO_REMAP_IX3(ring[1], 27) |
  678. HAL_REO_REMAP_IX3(ring[0], 28) |
  679. HAL_REO_REMAP_IX3(ring[0], 29) |
  680. HAL_REO_REMAP_IX3(ring[1], 30) |
  681. HAL_REO_REMAP_IX3(ring[1], 31);
  682. break;
  683. case 3:
  684. *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
  685. HAL_REO_REMAP_IX2(ring[1], 17) |
  686. HAL_REO_REMAP_IX2(ring[2], 18) |
  687. HAL_REO_REMAP_IX2(ring[0], 19) |
  688. HAL_REO_REMAP_IX2(ring[1], 20) |
  689. HAL_REO_REMAP_IX2(ring[2], 21) |
  690. HAL_REO_REMAP_IX2(ring[0], 22) |
  691. HAL_REO_REMAP_IX2(ring[1], 23);
  692. *remap2 = HAL_REO_REMAP_IX3(ring[2], 24) |
  693. HAL_REO_REMAP_IX3(ring[0], 25) |
  694. HAL_REO_REMAP_IX3(ring[1], 26) |
  695. HAL_REO_REMAP_IX3(ring[2], 27) |
  696. HAL_REO_REMAP_IX3(ring[0], 28) |
  697. HAL_REO_REMAP_IX3(ring[1], 29) |
  698. HAL_REO_REMAP_IX3(ring[2], 30) |
  699. HAL_REO_REMAP_IX3(ring[0], 31);
  700. break;
  701. case 4:
  702. *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
  703. HAL_REO_REMAP_IX2(ring[1], 17) |
  704. HAL_REO_REMAP_IX2(ring[2], 18) |
  705. HAL_REO_REMAP_IX2(ring[3], 19) |
  706. HAL_REO_REMAP_IX2(ring[0], 20) |
  707. HAL_REO_REMAP_IX2(ring[1], 21) |
  708. HAL_REO_REMAP_IX2(ring[2], 22) |
  709. HAL_REO_REMAP_IX2(ring[3], 23);
  710. *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
  711. HAL_REO_REMAP_IX3(ring[1], 25) |
  712. HAL_REO_REMAP_IX3(ring[2], 26) |
  713. HAL_REO_REMAP_IX3(ring[3], 27) |
  714. HAL_REO_REMAP_IX3(ring[0], 28) |
  715. HAL_REO_REMAP_IX3(ring[1], 29) |
  716. HAL_REO_REMAP_IX3(ring[2], 30) |
  717. HAL_REO_REMAP_IX3(ring[3], 31);
  718. break;
  719. }
  720. }
  721. /**
  722. * hal_rx_flow_setup_fse_9224() - Setup a flow search entry in HW FST
  723. * @fst: Pointer to the Rx Flow Search Table
  724. * @table_offset: offset into the table where the flow is to be setup
  725. * @flow: Flow Parameters
  726. *
  727. * Return: Success/Failure
  728. */
  729. static void *
  730. hal_rx_flow_setup_fse_9224(uint8_t *rx_fst, uint32_t table_offset,
  731. uint8_t *rx_flow)
  732. {
  733. struct hal_rx_fst *fst = (struct hal_rx_fst *)rx_fst;
  734. struct hal_rx_flow *flow = (struct hal_rx_flow *)rx_flow;
  735. uint8_t *fse;
  736. bool fse_valid;
  737. if (table_offset >= fst->max_entries) {
  738. QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
  739. "HAL FSE table offset %u exceeds max entries %u",
  740. table_offset, fst->max_entries);
  741. return NULL;
  742. }
  743. fse = (uint8_t *)fst->base_vaddr +
  744. (table_offset * HAL_RX_FST_ENTRY_SIZE);
  745. fse_valid = HAL_GET_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID);
  746. if (fse_valid) {
  747. QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
  748. "HAL FSE %pK already valid", fse);
  749. return NULL;
  750. }
  751. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_127_96) =
  752. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_127_96,
  753. qdf_htonl(flow->tuple_info.src_ip_127_96));
  754. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_95_64) =
  755. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_95_64,
  756. qdf_htonl(flow->tuple_info.src_ip_95_64));
  757. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_63_32) =
  758. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_63_32,
  759. qdf_htonl(flow->tuple_info.src_ip_63_32));
  760. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_31_0) =
  761. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_31_0,
  762. qdf_htonl(flow->tuple_info.src_ip_31_0));
  763. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_127_96) =
  764. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_127_96,
  765. qdf_htonl(flow->tuple_info.dest_ip_127_96));
  766. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_95_64) =
  767. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_95_64,
  768. qdf_htonl(flow->tuple_info.dest_ip_95_64));
  769. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_63_32) =
  770. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_63_32,
  771. qdf_htonl(flow->tuple_info.dest_ip_63_32));
  772. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_31_0) =
  773. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_31_0,
  774. qdf_htonl(flow->tuple_info.dest_ip_31_0));
  775. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_PORT);
  776. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_PORT) |=
  777. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_PORT,
  778. (flow->tuple_info.dest_port));
  779. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_PORT);
  780. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_PORT) |=
  781. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_PORT,
  782. (flow->tuple_info.src_port));
  783. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL);
  784. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL) |=
  785. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL,
  786. flow->tuple_info.l4_protocol);
  787. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER);
  788. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER) |=
  789. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER,
  790. flow->reo_destination_handler);
  791. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID);
  792. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID) |=
  793. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, VALID, 1);
  794. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, METADATA);
  795. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, METADATA) =
  796. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, METADATA,
  797. flow->fse_metadata);
  798. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_INDICATION);
  799. HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_INDICATION) |=
  800. HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY,
  801. REO_DESTINATION_INDICATION,
  802. flow->reo_destination_indication);
  803. /* Reset all the other fields in FSE */
  804. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, RESERVED_9);
  805. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_DROP);
  806. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_COUNT);
  807. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_BYTE_COUNT);
  808. HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, TIMESTAMP);
  809. return fse;
  810. }
  811. /**
  812. * hal_rx_dump_pkt_hdr_tlv: dump RX pkt header TLV in hex format
  813. * @ pkt_hdr_tlv: pointer the pkt_hdr_tlv in pkt.
  814. * @ dbg_level: log level.
  815. *
  816. * Return: void
  817. */
  818. static inline void hal_rx_dump_pkt_hdr_tlv_9224(struct rx_pkt_tlvs *pkt_tlvs,
  819. uint8_t dbg_level)
  820. {
  821. struct rx_pkt_hdr_tlv *pkt_hdr_tlv = &pkt_tlvs->pkt_hdr_tlv;
  822. hal_verbose_debug("\n---------------\n"
  823. "rx_pkt_hdr_tlv\n"
  824. "---------------\n"
  825. "phy_ppdu_id %llu ",
  826. pkt_hdr_tlv->phy_ppdu_id);
  827. hal_verbose_hex_dump(pkt_hdr_tlv->rx_pkt_hdr,
  828. sizeof(pkt_hdr_tlv->rx_pkt_hdr));
  829. }
  830. /**
  831. * hal_rx_dump_pkt_tlvs_9224(): API to print RX Pkt TLVS for 7850
  832. * @hal_soc_hdl: hal_soc handle
  833. * @buf: pointer the pkt buffer
  834. * @dbg_level: log level
  835. *
  836. * Return: void
  837. */
  838. static void hal_rx_dump_pkt_tlvs_9224(hal_soc_handle_t hal_soc_hdl,
  839. uint8_t *buf, uint8_t dbg_level)
  840. {
  841. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  842. struct rx_msdu_end_compact *msdu_end =
  843. &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  844. struct rx_mpdu_start_compact *mpdu_start =
  845. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  846. hal_rx_dump_msdu_end_tlv_9224(msdu_end, dbg_level);
  847. hal_rx_dump_mpdu_start_tlv_9224(mpdu_start, dbg_level);
  848. hal_rx_dump_pkt_hdr_tlv_9224(pkt_tlvs, dbg_level);
  849. }
  850. static void hal_hw_txrx_ops_attach_qcn9224(struct hal_soc *hal_soc)
  851. {
  852. /* init and setup */
  853. hal_soc->ops->hal_srng_dst_hw_init = hal_srng_dst_hw_init_generic;
  854. hal_soc->ops->hal_srng_src_hw_init = hal_srng_src_hw_init_generic;
  855. hal_soc->ops->hal_get_hw_hptp = hal_get_hw_hptp_generic;
  856. hal_soc->ops->hal_reo_setup = hal_reo_setup_generic_be;
  857. hal_soc->ops->hal_get_window_address = hal_get_window_address_9224;
  858. /* tx */
  859. hal_soc->ops->hal_tx_set_dscp_tid_map = hal_tx_set_dscp_tid_map_9224;
  860. hal_soc->ops->hal_tx_update_dscp_tid = hal_tx_update_dscp_tid_9224;
  861. hal_soc->ops->hal_tx_desc_set_lmac_id = hal_tx_desc_set_lmac_id_9224;
  862. hal_soc->ops->hal_tx_desc_set_buf_addr =
  863. hal_tx_desc_set_buf_addr_generic_be;
  864. hal_soc->ops->hal_tx_desc_set_search_type =
  865. hal_tx_desc_set_search_type_generic_be;
  866. hal_soc->ops->hal_tx_desc_set_search_index =
  867. hal_tx_desc_set_search_index_generic_be;
  868. hal_soc->ops->hal_tx_desc_set_cache_set_num =
  869. hal_tx_desc_set_cache_set_num_generic_be;
  870. hal_soc->ops->hal_tx_comp_get_status =
  871. hal_tx_comp_get_status_generic_be;
  872. hal_soc->ops->hal_tx_comp_get_release_reason =
  873. hal_tx_comp_get_release_reason_generic_be;
  874. hal_soc->ops->hal_get_wbm_internal_error =
  875. hal_get_wbm_internal_error_generic_be;
  876. hal_soc->ops->hal_tx_init_cmd_credit_ring =
  877. hal_tx_init_cmd_credit_ring_9224;
  878. /* rx */
  879. hal_soc->ops->hal_rx_msdu_start_nss_get = hal_rx_tlv_nss_get_be;
  880. hal_soc->ops->hal_rx_mon_hw_desc_get_mpdu_status = NULL;
  881. /*
  882. * TODO:
  883. * In below API, stbc is accessed but is not part of
  884. * compact struct hal_rx_mon_hw_desc_get_mpdu_status_be;
  885. */
  886. hal_soc->ops->hal_rx_get_tlv = hal_rx_get_tlv_9224;
  887. hal_soc->ops->hal_rx_proc_phyrx_other_receive_info_tlv =
  888. hal_rx_proc_phyrx_other_receive_info_tlv_9224;
  889. hal_soc->ops->hal_rx_dump_msdu_end_tlv = hal_rx_dump_msdu_end_tlv_9224;
  890. hal_soc->ops->hal_rx_dump_mpdu_start_tlv =
  891. hal_rx_dump_mpdu_start_tlv_9224;
  892. hal_soc->ops->hal_rx_dump_pkt_tlvs = hal_rx_dump_pkt_tlvs_9224;
  893. hal_soc->ops->hal_get_link_desc_size = hal_get_link_desc_size_9224;
  894. hal_soc->ops->hal_rx_mpdu_start_tid_get = hal_rx_tlv_tid_get_be;
  895. hal_soc->ops->hal_rx_msdu_start_reception_type_get =
  896. hal_rx_tlv_reception_type_get_be;
  897. hal_soc->ops->hal_rx_msdu_end_da_idx_get =
  898. hal_rx_msdu_end_da_idx_get_be;
  899. hal_soc->ops->hal_rx_msdu_desc_info_get_ptr =
  900. hal_rx_msdu_desc_info_get_ptr_9224;
  901. hal_soc->ops->hal_rx_link_desc_msdu0_ptr =
  902. hal_rx_link_desc_msdu0_ptr_9224;
  903. hal_soc->ops->hal_reo_status_get_header =
  904. hal_reo_status_get_header_9224;
  905. hal_soc->ops->hal_rx_status_get_tlv_info =
  906. hal_rx_status_get_tlv_info_generic_be;
  907. hal_soc->ops->hal_rx_wbm_err_info_get =
  908. hal_rx_wbm_err_info_get_generic_be;
  909. hal_soc->ops->hal_tx_set_pcp_tid_map =
  910. hal_tx_set_pcp_tid_map_generic_be;
  911. hal_soc->ops->hal_tx_update_pcp_tid_map =
  912. hal_tx_update_pcp_tid_generic_be;
  913. hal_soc->ops->hal_tx_set_tidmap_prty =
  914. hal_tx_update_tidmap_prty_generic_be;
  915. hal_soc->ops->hal_rx_get_rx_fragment_number =
  916. hal_rx_get_rx_fragment_number_be,
  917. hal_soc->ops->hal_rx_msdu_end_da_is_mcbc_get =
  918. hal_rx_tlv_da_is_mcbc_get_be;
  919. hal_soc->ops->hal_rx_msdu_end_sa_is_valid_get =
  920. hal_rx_tlv_sa_is_valid_get_be;
  921. hal_soc->ops->hal_rx_msdu_end_sa_idx_get = hal_rx_tlv_sa_idx_get_be;
  922. hal_soc->ops->hal_rx_desc_is_first_msdu = hal_rx_desc_is_first_msdu_be;
  923. hal_soc->ops->hal_rx_msdu_end_l3_hdr_padding_get =
  924. hal_rx_tlv_l3_hdr_padding_get_be;
  925. hal_soc->ops->hal_rx_encryption_info_valid =
  926. hal_rx_encryption_info_valid_be;
  927. hal_soc->ops->hal_rx_print_pn = hal_rx_print_pn_be;
  928. hal_soc->ops->hal_rx_msdu_end_first_msdu_get =
  929. hal_rx_tlv_first_msdu_get_be;
  930. hal_soc->ops->hal_rx_msdu_end_da_is_valid_get =
  931. hal_rx_tlv_da_is_valid_get_be;
  932. hal_soc->ops->hal_rx_msdu_end_last_msdu_get =
  933. hal_rx_tlv_last_msdu_get_be;
  934. hal_soc->ops->hal_rx_get_mpdu_mac_ad4_valid =
  935. hal_rx_get_mpdu_mac_ad4_valid_be;
  936. hal_soc->ops->hal_rx_mpdu_start_sw_peer_id_get =
  937. hal_rx_mpdu_start_sw_peer_id_get_be;
  938. hal_soc->ops->hal_rx_mpdu_get_to_ds = hal_rx_mpdu_get_to_ds_be;
  939. hal_soc->ops->hal_rx_mpdu_get_fr_ds = hal_rx_mpdu_get_fr_ds_be;
  940. hal_soc->ops->hal_rx_get_mpdu_frame_control_valid =
  941. hal_rx_get_mpdu_frame_control_valid_be;
  942. hal_soc->ops->hal_rx_mpdu_get_addr1 = hal_rx_mpdu_get_addr1_be;
  943. hal_soc->ops->hal_rx_mpdu_get_addr2 = hal_rx_mpdu_get_addr2_be;
  944. hal_soc->ops->hal_rx_mpdu_get_addr3 = hal_rx_mpdu_get_addr3_be;
  945. hal_soc->ops->hal_rx_mpdu_get_addr4 = hal_rx_mpdu_get_addr4_be;
  946. hal_soc->ops->hal_rx_get_mpdu_sequence_control_valid =
  947. hal_rx_get_mpdu_sequence_control_valid_be;
  948. /* TODO: sw_frame_group_id not in compact struct */
  949. hal_soc->ops->hal_rx_is_unicast = NULL;
  950. hal_soc->ops->hal_rx_tid_get = hal_rx_tid_get_be;
  951. hal_soc->ops->hal_rx_hw_desc_get_ppduid_get = NULL;
  952. /*
  953. * TODO:
  954. * Ppdu_id not present in compact, to be added for monitor mode
  955. * hal_rx_hw_desc_get_ppduid_get_be;
  956. */
  957. hal_soc->ops->hal_rx_mpdu_start_mpdu_qos_control_valid_get =
  958. hal_rx_mpdu_start_mpdu_qos_control_valid_get_be;
  959. hal_soc->ops->hal_rx_msdu_end_sa_sw_peer_id_get =
  960. hal_rx_msdu_end_sa_sw_peer_id_get_be;
  961. hal_soc->ops->hal_rx_msdu0_buffer_addr_lsb =
  962. hal_rx_msdu0_buffer_addr_lsb_9224;
  963. hal_soc->ops->hal_rx_msdu_desc_info_ptr_get =
  964. hal_rx_msdu_desc_info_ptr_get_9224;
  965. hal_soc->ops->hal_ent_mpdu_desc_info = hal_ent_mpdu_desc_info_9224;
  966. hal_soc->ops->hal_dst_mpdu_desc_info = hal_dst_mpdu_desc_info_9224;
  967. hal_soc->ops->hal_rx_get_fc_valid = hal_rx_get_fc_valid_be;
  968. hal_soc->ops->hal_rx_get_to_ds_flag = hal_rx_get_to_ds_flag_be;
  969. hal_soc->ops->hal_rx_get_mac_addr2_valid =
  970. hal_rx_get_mac_addr2_valid_be;
  971. hal_soc->ops->hal_rx_get_filter_category = NULL;
  972. /*
  973. * TODO:
  974. * Field not present in compact struct - hal_rx_get_filter_category_be;
  975. */
  976. hal_soc->ops->hal_rx_get_ppdu_id = NULL;
  977. /* TODO: Field not present in compact struct - hal_rx_get_ppdu_id_be; */
  978. hal_soc->ops->hal_reo_config = hal_reo_config_9224;
  979. hal_soc->ops->hal_rx_msdu_flow_idx_get = hal_rx_msdu_flow_idx_get_be;
  980. hal_soc->ops->hal_rx_msdu_flow_idx_invalid =
  981. hal_rx_msdu_flow_idx_invalid_be;
  982. hal_soc->ops->hal_rx_msdu_flow_idx_timeout =
  983. hal_rx_msdu_flow_idx_timeout_be;
  984. hal_soc->ops->hal_rx_msdu_fse_metadata_get =
  985. hal_rx_msdu_fse_metadata_get_be;
  986. hal_soc->ops->hal_rx_msdu_cce_metadata_get =
  987. hal_rx_msdu_cce_metadata_get_be;
  988. hal_soc->ops->hal_rx_msdu_get_flow_params =
  989. hal_rx_msdu_get_flow_params_be;
  990. hal_soc->ops->hal_rx_tlv_get_tcp_chksum = hal_rx_tlv_get_tcp_chksum_be;
  991. hal_soc->ops->hal_rx_get_rx_sequence = hal_rx_get_rx_sequence_be;
  992. #if defined(QCA_WIFI_QCA9224) && defined(WLAN_CFR_ENABLE) && \
  993. defined(WLAN_ENH_CFR_ENABLE)
  994. hal_soc->ops->hal_rx_get_bb_info = hal_rx_get_bb_info_9224;
  995. hal_soc->ops->hal_rx_get_rtt_info = hal_rx_get_rtt_info_9224;
  996. #else
  997. hal_soc->ops->hal_rx_get_bb_info = NULL;
  998. hal_soc->ops->hal_rx_get_rtt_info = NULL;
  999. #endif
  1000. /* rx - msdu fast path info fields */
  1001. hal_soc->ops->hal_rx_msdu_packet_metadata_get =
  1002. hal_rx_msdu_packet_metadata_get_generic_be;
  1003. hal_soc->ops->hal_rx_mpdu_start_tlv_tag_valid =
  1004. hal_rx_mpdu_start_tlv_tag_valid_be;
  1005. hal_soc->ops->hal_rx_wbm_err_msdu_continuation_get =
  1006. hal_rx_wbm_err_msdu_continuation_get_9224;
  1007. /* rx - TLV struct offsets */
  1008. hal_soc->ops->hal_rx_msdu_end_offset_get =
  1009. hal_rx_msdu_end_offset_get_generic;
  1010. hal_soc->ops->hal_rx_mpdu_start_offset_get =
  1011. hal_rx_mpdu_start_offset_get_generic;
  1012. #ifndef NO_RX_PKT_HDR_TLV
  1013. hal_soc->ops->hal_rx_pkt_tlv_offset_get =
  1014. hal_rx_pkt_tlv_offset_get_generic;
  1015. #endif
  1016. hal_soc->ops->hal_rx_flow_setup_fse = hal_rx_flow_setup_fse_9224;
  1017. hal_soc->ops->hal_compute_reo_remap_ix2_ix3 =
  1018. hal_compute_reo_remap_ix2_ix3_9224;
  1019. hal_soc->ops->hal_rx_msdu_get_reo_destination_indication =
  1020. hal_rx_msdu_get_reo_destination_indication_be;
  1021. hal_soc->ops->hal_rx_get_tlv_size = hal_rx_get_tlv_size_generic_be;
  1022. hal_soc->ops->hal_rx_msdu_is_wlan_mcast =
  1023. hal_rx_msdu_is_wlan_mcast_generic_be;
  1024. hal_soc->ops->hal_rx_tlv_decap_format_get = NULL;
  1025. /*
  1026. * TODO:
  1027. * Decap format not present in
  1028. * compact struct hal_rx_tlv_decap_format_get_be;
  1029. */
  1030. hal_soc->ops->hal_rx_tlv_get_offload_info = NULL;
  1031. /*
  1032. * TODO:
  1033. * Some fields not present in
  1034. * compact struct - hal_rx_tlv_get_offload_info_be;
  1035. */
  1036. hal_soc->ops->hal_rx_tlv_phy_ppdu_id_get = NULL;
  1037. /*
  1038. * TODO:
  1039. * No Phy ppdu id in compact hal_rx_attn_phy_ppdu_id_get_be;
  1040. */
  1041. hal_soc->ops->hal_rx_tlv_msdu_done_get = hal_rx_tlv_msdu_done_get_be;
  1042. hal_soc->ops->hal_rx_tlv_msdu_len_get = NULL;
  1043. /*
  1044. * TODO:
  1045. * msdu_len is not present in compact
  1046. * struct hal_rx_msdu_start_msdu_len_get_be;
  1047. */
  1048. hal_soc->ops->hal_rx_get_frame_ctrl_field =
  1049. hal_rx_get_frame_ctrl_field_be;
  1050. hal_soc->ops->hal_rx_get_proto_params = NULL;
  1051. /* TODO: Not present in compact struct - hal_rx_get_proto_params_be; */
  1052. hal_soc->ops->hal_rx_get_l3_l4_offsets = NULL;
  1053. /* TODO: Not present in compact struct - hal_rx_get_l3_l4_offsets_be;*/
  1054. hal_soc->ops->hal_rx_tlv_csum_err_get = hal_rx_tlv_csum_err_get_be;
  1055. hal_soc->ops->hal_rx_mpdu_info_ampdu_flag_get = NULL;
  1056. /*
  1057. * TODO:
  1058. * Not present in compact struct - hal_rx_mpdu_info_ampdu_flag_get_be;
  1059. */
  1060. hal_soc->ops->hal_rx_tlv_msdu_len_set = NULL;
  1061. /*
  1062. * TODO:
  1063. * Not present in compact struct - hal_rx_msdu_start_msdu_len_set_be;
  1064. */
  1065. hal_soc->ops->hal_rx_tlv_sgi_get = hal_rx_tlv_sgi_get_be;
  1066. hal_soc->ops->hal_rx_tlv_rate_mcs_get = hal_rx_tlv_rate_mcs_get_be;
  1067. hal_soc->ops->hal_rx_tlv_bw_get = hal_rx_tlv_bw_get_be;
  1068. hal_soc->ops->hal_rx_tlv_get_pkt_type = hal_rx_tlv_get_pkt_type_be;
  1069. hal_soc->ops->hal_rx_tlv_mic_err_get = hal_rx_tlv_mic_err_get_be;
  1070. hal_soc->ops->hal_rx_tlv_decrypt_err_get =
  1071. hal_rx_tlv_decrypt_err_get_be;
  1072. hal_soc->ops->hal_rx_tlv_first_mpdu_get = hal_rx_tlv_first_mpdu_get_be;
  1073. hal_soc->ops->hal_rx_tlv_get_is_decrypted =
  1074. hal_rx_tlv_get_is_decrypted_be;
  1075. hal_soc->ops->hal_rx_msdu_get_keyid = hal_rx_msdu_get_keyid_be;
  1076. hal_soc->ops->hal_rx_tlv_get_freq = hal_rx_tlv_get_freq_be;
  1077. };
  1078. struct hal_hw_srng_config hw_srng_table_9224[] = {
  1079. /* TODO: max_rings can populated by querying HW capabilities */
  1080. { /* REO_DST */
  1081. .start_ring_id = HAL_SRNG_REO2SW1,
  1082. .max_rings = 8,
  1083. .entry_size = sizeof(struct reo_destination_ring) >> 2,
  1084. .lmac_ring = FALSE,
  1085. .ring_dir = HAL_SRNG_DST_RING,
  1086. .reg_start = {
  1087. HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(
  1088. REO_REG_REG_BASE),
  1089. HWIO_REO_R2_REO2SW1_RING_HP_ADDR(
  1090. REO_REG_REG_BASE)
  1091. },
  1092. .reg_size = {
  1093. HWIO_REO_R0_REO2SW2_RING_BASE_LSB_ADDR(0) -
  1094. HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(0),
  1095. HWIO_REO_R2_REO2SW2_RING_HP_ADDR(0) -
  1096. HWIO_REO_R2_REO2SW1_RING_HP_ADDR(0),
  1097. },
  1098. .max_size =
  1099. HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_BMSK >>
  1100. HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_SHFT,
  1101. },
  1102. { /* REO_EXCEPTION */
  1103. /* Designating REO2SW0 ring as exception ring. This ring is
  1104. * similar to other REO2SW rings though it is named as REO2SW0.
  1105. * Any of theREO2SW rings can be used as exception ring.
  1106. */
  1107. .start_ring_id = HAL_SRNG_REO2SW0,
  1108. .max_rings = 1,
  1109. .entry_size = sizeof(struct reo_destination_ring) >> 2,
  1110. .lmac_ring = FALSE,
  1111. .ring_dir = HAL_SRNG_DST_RING,
  1112. .reg_start = {
  1113. HWIO_REO_R0_REO2SW0_RING_BASE_LSB_ADDR(
  1114. REO_REG_REG_BASE),
  1115. HWIO_REO_R2_REO2SW0_RING_HP_ADDR(
  1116. REO_REG_REG_BASE)
  1117. },
  1118. /* Single ring - provide ring size if multiple rings of this
  1119. * type are supported
  1120. */
  1121. .reg_size = {},
  1122. .max_size =
  1123. HWIO_REO_R0_REO2SW0_RING_BASE_MSB_RING_SIZE_BMSK >>
  1124. HWIO_REO_R0_REO2SW0_RING_BASE_MSB_RING_SIZE_SHFT,
  1125. },
  1126. { /* REO_REINJECT */
  1127. .start_ring_id = HAL_SRNG_SW2REO,
  1128. .max_rings = 4,
  1129. .entry_size = sizeof(struct reo_entrance_ring) >> 2,
  1130. .lmac_ring = FALSE,
  1131. .ring_dir = HAL_SRNG_SRC_RING,
  1132. .reg_start = {
  1133. HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(
  1134. REO_REG_REG_BASE),
  1135. HWIO_REO_R2_SW2REO_RING_HP_ADDR(
  1136. REO_REG_REG_BASE)
  1137. },
  1138. /* Single ring - provide ring size if multiple rings of this
  1139. * type are supported
  1140. */
  1141. .reg_size = {
  1142. HWIO_REO_R0_SW2REO1_RING_BASE_LSB_ADDR(0) -
  1143. HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(0),
  1144. HWIO_REO_R2_SW2REO1_RING_HP_ADDR(0) -
  1145. HWIO_REO_R2_SW2REO_RING_HP_ADDR(0)
  1146. },
  1147. .max_size = HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_BMSK >>
  1148. HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_SHFT,
  1149. },
  1150. { /* REO_CMD */
  1151. .start_ring_id = HAL_SRNG_REO_CMD,
  1152. .max_rings = 1,
  1153. .entry_size = (sizeof(struct tlv_32_hdr) +
  1154. sizeof(struct reo_get_queue_stats)) >> 2,
  1155. .lmac_ring = FALSE,
  1156. .ring_dir = HAL_SRNG_SRC_RING,
  1157. .reg_start = {
  1158. HWIO_REO_R0_REO_CMD_RING_BASE_LSB_ADDR(
  1159. REO_REG_REG_BASE),
  1160. HWIO_REO_R2_REO_CMD_RING_HP_ADDR(
  1161. REO_REG_REG_BASE),
  1162. },
  1163. /* Single ring - provide ring size if multiple rings of this
  1164. * type are supported
  1165. */
  1166. .reg_size = {},
  1167. .max_size = HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_BMSK >>
  1168. HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_SHFT,
  1169. },
  1170. { /* REO_STATUS */
  1171. .start_ring_id = HAL_SRNG_REO_STATUS,
  1172. .max_rings = 1,
  1173. .entry_size = (sizeof(struct tlv_32_hdr) +
  1174. sizeof(struct reo_get_queue_stats_status)) >> 2,
  1175. .lmac_ring = FALSE,
  1176. .ring_dir = HAL_SRNG_DST_RING,
  1177. .reg_start = {
  1178. HWIO_REO_R0_REO_STATUS_RING_BASE_LSB_ADDR(
  1179. REO_REG_REG_BASE),
  1180. HWIO_REO_R2_REO_STATUS_RING_HP_ADDR(
  1181. REO_REG_REG_BASE),
  1182. },
  1183. /* Single ring - provide ring size if multiple rings of this
  1184. * type are supported
  1185. */
  1186. .reg_size = {},
  1187. .max_size =
  1188. HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
  1189. HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
  1190. },
  1191. { /* TCL_DATA */
  1192. .start_ring_id = HAL_SRNG_SW2TCL1,
  1193. .max_rings = 6,
  1194. .entry_size = sizeof(struct tcl_data_cmd) >> 2,
  1195. .lmac_ring = FALSE,
  1196. .ring_dir = HAL_SRNG_SRC_RING,
  1197. .reg_start = {
  1198. HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(
  1199. MAC_TCL_REG_REG_BASE),
  1200. HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(
  1201. MAC_TCL_REG_REG_BASE),
  1202. },
  1203. .reg_size = {
  1204. HWIO_TCL_R0_SW2TCL2_RING_BASE_LSB_ADDR(0) -
  1205. HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(0),
  1206. HWIO_TCL_R2_SW2TCL2_RING_HP_ADDR(0) -
  1207. HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(0),
  1208. },
  1209. .max_size =
  1210. HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >>
  1211. HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT,
  1212. },
  1213. { /* TCL_CMD/CREDIT */
  1214. /* qca8074v2 and qcn9224 uses this ring for data commands */
  1215. .start_ring_id = HAL_SRNG_SW2TCL_CMD,
  1216. .max_rings = 1,
  1217. .entry_size = sizeof(struct tcl_data_cmd) >> 2,
  1218. .lmac_ring = FALSE,
  1219. .ring_dir = HAL_SRNG_SRC_RING,
  1220. .reg_start = {
  1221. HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_LSB_ADDR(
  1222. MAC_TCL_REG_REG_BASE),
  1223. HWIO_TCL_R2_SW2TCL_CREDIT_RING_HP_ADDR(
  1224. MAC_TCL_REG_REG_BASE),
  1225. },
  1226. /* Single ring - provide ring size if multiple rings of this
  1227. * type are supported
  1228. */
  1229. .reg_size = {},
  1230. .max_size =
  1231. HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_BMSK >>
  1232. HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_SHFT,
  1233. },
  1234. { /* TCL_STATUS */
  1235. .start_ring_id = HAL_SRNG_TCL_STATUS,
  1236. .max_rings = 1,
  1237. .entry_size = (sizeof(struct tlv_32_hdr) +
  1238. sizeof(struct tcl_status_ring)) >> 2,
  1239. .lmac_ring = FALSE,
  1240. .ring_dir = HAL_SRNG_DST_RING,
  1241. .reg_start = {
  1242. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_LSB_ADDR(
  1243. MAC_TCL_REG_REG_BASE),
  1244. HWIO_TCL_R2_TCL_STATUS1_RING_HP_ADDR(
  1245. MAC_TCL_REG_REG_BASE),
  1246. },
  1247. /* Single ring - provide ring size if multiple rings of this
  1248. * type are supported
  1249. */
  1250. .reg_size = {},
  1251. .max_size =
  1252. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_BMSK >>
  1253. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_SHFT,
  1254. },
  1255. { /* CE_SRC */
  1256. .start_ring_id = HAL_SRNG_CE_0_SRC,
  1257. .max_rings = 16,
  1258. .entry_size = sizeof(struct ce_src_desc) >> 2,
  1259. .lmac_ring = FALSE,
  1260. .ring_dir = HAL_SRNG_SRC_RING,
  1261. .reg_start = {
  1262. HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR(
  1263. WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE),
  1264. HWIO_WFSS_CE_CHANNEL_SRC_R2_SRC_RING_HP_ADDR(
  1265. WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE),
  1266. },
  1267. .reg_size = {
  1268. WFSS_CE_1_CHANNEL_SRC_REG_REG_BASE -
  1269. WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE,
  1270. WFSS_CE_1_CHANNEL_SRC_REG_REG_BASE -
  1271. WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE,
  1272. },
  1273. .max_size =
  1274. HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_MSB_RING_SIZE_BMSK >>
  1275. HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_MSB_RING_SIZE_SHFT,
  1276. },
  1277. { /* CE_DST */
  1278. .start_ring_id = HAL_SRNG_CE_0_DST,
  1279. .max_rings = 16,
  1280. .entry_size = 8 >> 2,
  1281. /*TODO: entry_size above should actually be
  1282. * sizeof(struct ce_dst_desc) >> 2, but couldn't find definition
  1283. * of struct ce_dst_desc in HW header files
  1284. */
  1285. .lmac_ring = FALSE,
  1286. .ring_dir = HAL_SRNG_SRC_RING,
  1287. .reg_start = {
  1288. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR(
  1289. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE),
  1290. HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR(
  1291. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE),
  1292. },
  1293. .reg_size = {
  1294. WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
  1295. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
  1296. WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
  1297. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
  1298. },
  1299. .max_size =
  1300. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
  1301. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
  1302. },
  1303. { /* CE_DST_STATUS */
  1304. .start_ring_id = HAL_SRNG_CE_0_DST_STATUS,
  1305. .max_rings = 16,
  1306. .entry_size = sizeof(struct ce_stat_desc) >> 2,
  1307. .lmac_ring = FALSE,
  1308. .ring_dir = HAL_SRNG_DST_RING,
  1309. .reg_start = {
  1310. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR(
  1311. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE),
  1312. HWIO_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR(
  1313. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE),
  1314. },
  1315. /* TODO: check destination status ring registers */
  1316. .reg_size = {
  1317. WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
  1318. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
  1319. WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
  1320. WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
  1321. },
  1322. .max_size =
  1323. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
  1324. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
  1325. },
  1326. { /* WBM_IDLE_LINK */
  1327. .start_ring_id = HAL_SRNG_WBM_IDLE_LINK,
  1328. .max_rings = 1,
  1329. .entry_size = sizeof(struct wbm_link_descriptor_ring) >> 2,
  1330. .lmac_ring = FALSE,
  1331. .ring_dir = HAL_SRNG_SRC_RING,
  1332. .reg_start = {
  1333. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE),
  1334. HWIO_WBM_R2_WBM_IDLE_LINK_RING_HP_ADDR(WBM_REG_REG_BASE),
  1335. },
  1336. /* Single ring - provide ring size if multiple rings of this
  1337. * type are supported
  1338. */
  1339. .reg_size = {},
  1340. .max_size =
  1341. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_BMSK >>
  1342. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_SHFT,
  1343. },
  1344. { /* SW2WBM_RELEASE */
  1345. .start_ring_id = HAL_SRNG_WBM_SW_RELEASE,
  1346. .max_rings = 2,
  1347. .entry_size = sizeof(struct wbm_release_ring) >> 2,
  1348. .lmac_ring = FALSE,
  1349. .ring_dir = HAL_SRNG_SRC_RING,
  1350. .reg_start = {
  1351. HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE),
  1352. HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE),
  1353. },
  1354. .reg_size = {
  1355. HWIO_WBM_R0_SW1_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE) -
  1356. HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE),
  1357. HWIO_WBM_R2_SW1_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE) -
  1358. HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE)
  1359. },
  1360. .max_size =
  1361. HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
  1362. HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
  1363. },
  1364. { /* WBM2SW_RELEASE */
  1365. .start_ring_id = HAL_SRNG_WBM2SW0_RELEASE,
  1366. .max_rings = 8,
  1367. .entry_size = sizeof(struct wbm_release_ring) >> 2,
  1368. .lmac_ring = FALSE,
  1369. .ring_dir = HAL_SRNG_DST_RING,
  1370. .reg_start = {
  1371. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(
  1372. WBM_REG_REG_BASE),
  1373. HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(
  1374. WBM_REG_REG_BASE),
  1375. },
  1376. .reg_size = {
  1377. HWIO_WBM_R0_WBM2SW1_RELEASE_RING_BASE_LSB_ADDR(
  1378. WBM_REG_REG_BASE) -
  1379. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(
  1380. WBM_REG_REG_BASE),
  1381. HWIO_WBM_R2_WBM2SW1_RELEASE_RING_HP_ADDR(
  1382. WBM_REG_REG_BASE) -
  1383. HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(
  1384. WBM_REG_REG_BASE),
  1385. },
  1386. .max_size =
  1387. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
  1388. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
  1389. },
  1390. { /* RXDMA_BUF */
  1391. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF0,
  1392. #ifdef IPA_OFFLOAD
  1393. .max_rings = 3,
  1394. #else
  1395. .max_rings = 3,
  1396. #endif
  1397. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  1398. .lmac_ring = TRUE,
  1399. .ring_dir = HAL_SRNG_SRC_RING,
  1400. /* reg_start is not set because LMAC rings are not accessed
  1401. * from host
  1402. */
  1403. .reg_start = {},
  1404. .reg_size = {},
  1405. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  1406. },
  1407. { /* RXDMA_DST */
  1408. .start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW0,
  1409. .max_rings = 0,
  1410. .entry_size = 0/*sizeof(struct reo_entrance_ring) >> 2*/,
  1411. .lmac_ring = TRUE,
  1412. .ring_dir = HAL_SRNG_DST_RING,
  1413. /* reg_start is not set because LMAC rings are not accessed
  1414. * from host
  1415. */
  1416. .reg_start = {},
  1417. .reg_size = {},
  1418. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  1419. },
  1420. { /* RXDMA_MONITOR_BUF */
  1421. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA2_BUF,
  1422. .max_rings = 1,
  1423. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  1424. .lmac_ring = TRUE,
  1425. .ring_dir = HAL_SRNG_SRC_RING,
  1426. /* reg_start is not set because LMAC rings are not accessed
  1427. * from host
  1428. */
  1429. .reg_start = {},
  1430. .reg_size = {},
  1431. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1432. },
  1433. { /* RXDMA_MONITOR_STATUS */
  1434. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF,
  1435. .max_rings = 0,
  1436. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  1437. .lmac_ring = TRUE,
  1438. .ring_dir = HAL_SRNG_SRC_RING,
  1439. /* reg_start is not set because LMAC rings are not accessed
  1440. * from host
  1441. */
  1442. .reg_start = {},
  1443. .reg_size = {},
  1444. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  1445. },
  1446. { /* RXDMA_MONITOR_DST */
  1447. .start_ring_id = HAL_SRNG_WMAC1_RXMON2SW0,
  1448. .max_rings = 1,
  1449. .entry_size = sizeof(struct sw_monitor_ring) >> 2,
  1450. .lmac_ring = TRUE,
  1451. .ring_dir = HAL_SRNG_DST_RING,
  1452. /* reg_start is not set because LMAC rings are not accessed
  1453. * from host
  1454. */
  1455. .reg_start = {},
  1456. .reg_size = {},
  1457. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1458. },
  1459. { /* RXDMA_MONITOR_DESC */
  1460. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_DESC,
  1461. .max_rings = 0,
  1462. .entry_size = 0/*sizeof(struct sw_monitor_ring) >> 2*/,
  1463. .lmac_ring = TRUE,
  1464. .ring_dir = HAL_SRNG_DST_RING,
  1465. /* reg_start is not set because LMAC rings are not accessed
  1466. * from host
  1467. */
  1468. .reg_start = {},
  1469. .reg_size = {},
  1470. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1471. },
  1472. { /* DIR_BUF_RX_DMA_SRC */
  1473. .start_ring_id = HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING,
  1474. /* one ring for spectral and one ring for cfr */
  1475. .max_rings = 2,
  1476. .entry_size = 2,
  1477. .lmac_ring = TRUE,
  1478. .ring_dir = HAL_SRNG_SRC_RING,
  1479. /* reg_start is not set because LMAC rings are not accessed
  1480. * from host
  1481. */
  1482. .reg_start = {},
  1483. .reg_size = {},
  1484. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  1485. },
  1486. #ifdef WLAN_FEATURE_CIF_CFR
  1487. { /* WIFI_POS_SRC */
  1488. .start_ring_id = HAL_SRNG_WIFI_POS_SRC_DMA_RING,
  1489. .max_rings = 1,
  1490. .entry_size = sizeof(wmi_oem_dma_buf_release_entry) >> 2,
  1491. .lmac_ring = TRUE,
  1492. .ring_dir = HAL_SRNG_SRC_RING,
  1493. /* reg_start is not set because LMAC rings are not accessed
  1494. * from host
  1495. */
  1496. .reg_start = {},
  1497. .reg_size = {},
  1498. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1499. },
  1500. #endif
  1501. { /* PPE2TCL */
  1502. .start_ring_id = HAL_SRNG_PPE2TCL1,
  1503. .max_rings = 1,
  1504. .entry_size = sizeof(struct tcl_entrance_from_ppe_ring) >> 2,
  1505. .lmac_ring = FALSE,
  1506. .ring_dir = HAL_SRNG_SRC_RING,
  1507. .reg_start = {
  1508. HWIO_TCL_R0_PPE2TCL1_RING_BASE_LSB_ADDR(
  1509. MAC_TCL_REG_REG_BASE),
  1510. HWIO_TCL_R2_PPE2TCL1_RING_HP_ADDR(
  1511. MAC_TCL_REG_REG_BASE),
  1512. },
  1513. .reg_size = {},
  1514. .max_size =
  1515. HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >>
  1516. HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT,
  1517. },
  1518. { /* PPE_RELEASE */
  1519. .start_ring_id = HAL_SRNG_WBM_PPE_RELEASE,
  1520. .max_rings = 1,
  1521. .entry_size = sizeof(struct wbm_release_ring) >> 2,
  1522. .lmac_ring = FALSE,
  1523. .ring_dir = HAL_SRNG_SRC_RING,
  1524. .reg_start = {
  1525. HWIO_WBM_R0_PPE_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE),
  1526. HWIO_WBM_R2_PPE_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE),
  1527. },
  1528. .reg_size = {},
  1529. .max_size =
  1530. HWIO_WBM_R0_PPE_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
  1531. HWIO_WBM_R0_PPE_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
  1532. },
  1533. { /* RXDMA_RX_MONITOR_BUF */
  1534. .start_ring_id = HAL_SRNG_SW2RXMON_BUF0,
  1535. .max_rings = 1,
  1536. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  1537. .lmac_ring = TRUE,
  1538. .ring_dir = HAL_SRNG_SRC_RING,
  1539. /* reg_start is not set because LMAC rings are not accessed
  1540. * from host
  1541. */
  1542. .reg_start = {},
  1543. .reg_size = {},
  1544. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1545. },
  1546. { /* TX_MONITOR_BUF */
  1547. .start_ring_id = HAL_SRNG_SW2TXMON_BUF0,
  1548. .max_rings = 1,
  1549. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  1550. .lmac_ring = TRUE,
  1551. .ring_dir = HAL_SRNG_SRC_RING,
  1552. /* reg_start is not set because LMAC rings are not accessed
  1553. * from host
  1554. */
  1555. .reg_start = {},
  1556. .reg_size = {},
  1557. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1558. },
  1559. { /* TX_MONITOR_DST */
  1560. .start_ring_id = HAL_SRNG_WMAC1_TXMON2SW0,
  1561. .max_rings = 1,
  1562. .entry_size = sizeof(struct sw_monitor_ring) >> 2,
  1563. .lmac_ring = TRUE,
  1564. .ring_dir = HAL_SRNG_DST_RING,
  1565. /* reg_start is not set because LMAC rings are not accessed
  1566. * from host
  1567. */
  1568. .reg_start = {},
  1569. .reg_size = {},
  1570. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1571. },
  1572. { /* SW2RXDMA */
  1573. .start_ring_id = HAL_SRNG_SW2RXDMA_BUF0,
  1574. .max_rings = 3,
  1575. .entry_size = sizeof(struct reo_entrance_ring) >> 2,
  1576. .lmac_ring = TRUE,
  1577. .ring_dir = HAL_SRNG_SRC_RING,
  1578. /* reg_start is not set because LMAC rings are not accessed
  1579. * from host
  1580. */
  1581. .reg_start = {},
  1582. .reg_size = {},
  1583. .max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
  1584. },
  1585. /* TODO: Enable this ring once it is part of HW hdr file */
  1586. #ifdef REO2PPE_UNDEFINED
  1587. { /* REO2PPE */
  1588. .start_ring_id = HAL_SRNG_REO2PPE,
  1589. .max_rings = 1,
  1590. .entry_size = sizeof(struct reo_destination_ring) >> 2,
  1591. .lmac_ring = FALSE,
  1592. .ring_dir = HAL_SRNG_DST_RING,
  1593. .reg_start = {
  1594. HWIO_REO_R0_REO2PPE_RING_BASE_LSB_ADDR(
  1595. REO_REG_REG_BASE),
  1596. HWIO_REO_R0_REO2PPE_RING_HP_ADDR(
  1597. REO_REG_REG_BASE),
  1598. },
  1599. /* Single ring - provide ring size if multiple rings of this
  1600. * type are supported
  1601. */
  1602. .reg_size = {},
  1603. .max_size =
  1604. HWIO_REO_R0_REO2PPE_RING_BASE_LSB_RING_BASE_ADDR_LSB_BMSK >>
  1605. HWIO_REO_R0_REO2PPE_RING_BASE_LSB_RING_BASE_ADDR_LSB_SHFT,
  1606. },
  1607. #endif
  1608. };
  1609. /**
  1610. * hal_srng_hw_reg_offset_init_qcn9224() - Initialize the HW srng reg offset
  1611. * applicable only for WCN7850
  1612. * @hal_soc: HAL Soc handle
  1613. *
  1614. * Return: None
  1615. */
  1616. static inline void hal_srng_hw_reg_offset_init_qcn9224(struct hal_soc *hal_soc)
  1617. {
  1618. int32_t *hw_reg_offset = hal_soc->hal_hw_reg_offset;
  1619. hw_reg_offset[DST_MSI2_BASE_LSB] = REG_OFFSET(DST, MSI2_BASE_LSB),
  1620. hw_reg_offset[DST_MSI2_BASE_MSB] = REG_OFFSET(DST, MSI2_BASE_MSB),
  1621. hw_reg_offset[DST_MSI2_DATA] = REG_OFFSET(DST, MSI2_DATA),
  1622. hw_reg_offset[DST_PRODUCER_INT2_SETUP] =
  1623. REG_OFFSET(DST, PRODUCER_INT2_SETUP);
  1624. }
  1625. /**
  1626. * hal_qcn9224_attach()- Attach 9224 target specific hal_soc ops,
  1627. * offset and srng table
  1628. * Return: void
  1629. */
  1630. void hal_qcn9224_attach(struct hal_soc *hal_soc)
  1631. {
  1632. hal_soc->hw_srng_table = hw_srng_table_9224;
  1633. hal_srng_hw_reg_offset_init_generic(hal_soc);
  1634. hal_srng_hw_reg_offset_init_qcn9224(hal_soc);
  1635. hal_hw_txrx_default_ops_attach_be(hal_soc);
  1636. hal_hw_txrx_ops_attach_qcn9224(hal_soc);
  1637. if (hal_soc->static_window_map)
  1638. hal_write_window_register(hal_soc);
  1639. hal_soc->dmac_cmn_src_rxbuf_ring = true;
  1640. }