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