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