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