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