xref: /wlan-dirver/qca-wifi-host-cmn/hal/wifi3.0/kiwi/hal_kiwi.c (revision 1f2104b73398c406e96988e067c6ee20483f2760)
1 /*
2  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #include "qdf_types.h"
21 #include "qdf_util.h"
22 #include "qdf_types.h"
23 #include "qdf_lock.h"
24 #include "qdf_mem.h"
25 #include "qdf_nbuf.h"
26 #include "hal_hw_headers.h"
27 #include "hal_internal.h"
28 #include "hal_api.h"
29 #include "target_type.h"
30 #include "wcss_version.h"
31 #include "qdf_module.h"
32 #include "hal_flow.h"
33 #include "rx_flow_search_entry.h"
34 #include "hal_rx_flow_info.h"
35 #include "hal_be_api.h"
36 #include "reo_destination_ring_with_pn.h"
37 #include "rx_reo_queue_1k.h"
38 
39 #include <hal_be_rx.h>
40 
41 #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_OFFSET \
42 	RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_OFFSET
43 #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_MASK \
44 	RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_MASK
45 #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_LSB \
46 	RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_LSB
47 #define UNIFIED_PHYRX_HT_SIG_0_HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS_OFFSET \
48 	PHYRX_HT_SIG_PHYRX_HT_SIG_INFO_DETAILS_MCS_OFFSET
49 #define UNIFIED_PHYRX_L_SIG_B_0_L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS_OFFSET \
50 	PHYRX_L_SIG_B_PHYRX_L_SIG_B_INFO_DETAILS_RATE_OFFSET
51 #define UNIFIED_PHYRX_L_SIG_A_0_L_SIG_A_INFO_PHYRX_L_SIG_A_INFO_DETAILS_OFFSET \
52 	PHYRX_L_SIG_A_PHYRX_L_SIG_A_INFO_DETAILS_RATE_OFFSET
53 #define UNIFIED_PHYRX_VHT_SIG_A_0_VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS_OFFSET \
54 	PHYRX_VHT_SIG_A_PHYRX_VHT_SIG_A_INFO_DETAILS_BANDWIDTH_OFFSET
55 #define UNIFIED_PHYRX_HE_SIG_A_SU_0_HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS_OFFSET \
56 	PHYRX_HE_SIG_A_SU_PHYRX_HE_SIG_A_SU_INFO_DETAILS_FORMAT_INDICATION_OFFSET
57 #define UNIFIED_PHYRX_HE_SIG_A_MU_DL_0_HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS_OFFSET \
58 	PHYRX_HE_SIG_A_MU_DL_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS_DL_UL_FLAG_OFFSET
59 #define UNIFIED_PHYRX_HE_SIG_B1_MU_0_HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS_OFFSET \
60 	PHYRX_HE_SIG_B1_MU_PHYRX_HE_SIG_B1_MU_INFO_DETAILS_RU_ALLOCATION_OFFSET
61 #define UNIFIED_PHYRX_HE_SIG_B2_MU_0_HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS_OFFSET \
62 	PHYRX_HE_SIG_B2_MU_PHYRX_HE_SIG_B2_MU_INFO_DETAILS_STA_ID_OFFSET
63 #define UNIFIED_PHYRX_HE_SIG_B2_OFDMA_0_HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS_OFFSET \
64 	PHYRX_HE_SIG_B2_OFDMA_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS_STA_ID_OFFSET
65 #define UNIFIED_PHYRX_RSSI_LEGACY_3_RECEIVE_RSSI_INFO_PRE_RSSI_INFO_DETAILS_OFFSET \
66 	PHYRX_RSSI_LEGACY_PRE_RSSI_INFO_DETAILS_RSSI_PRI20_CHAIN0_OFFSET
67 #define UNIFIED_PHYRX_RSSI_LEGACY_19_RECEIVE_RSSI_INFO_PREAMBLE_RSSI_INFO_DETAILS_OFFSET \
68 	PHYRX_RSSI_LEGACY_PREAMBLE_RSSI_INFO_DETAILS_RSSI_PRI20_CHAIN0_OFFSET
69 #define UNIFIED_RX_MPDU_START_0_RX_MPDU_INFO_RX_MPDU_INFO_DETAILS_OFFSET \
70 	RX_MPDU_START_0_RX_MPDU_INFO_DETAILS_RXPT_CLASSIFY_INFO_DETAILS_REO_DESTINATION_INDICATION_OFFSET
71 #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \
72 	RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET
73 #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \
74 	RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET
75 #define UNIFIED_RX_MPDU_DETAILS_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \
76 	RX_MPDU_DETAILS_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET
77 #define UNIFIED_REO_DESTINATION_RING_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \
78 	REO_DESTINATION_RING_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET
79 #define UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC \
80 	UNIFORM_REO_STATUS_HEADER_STATUS_HEADER
81 #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \
82 	RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET
83 #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \
84 	RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET
85 #define UNIFIED_TCL_DATA_CMD_0_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \
86 	TCL_DATA_CMD_BUF_ADDR_INFO_BUFFER_ADDR_31_0_OFFSET
87 #define UNIFIED_TCL_DATA_CMD_1_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \
88 	TCL_DATA_CMD_BUF_ADDR_INFO_BUFFER_ADDR_39_32_OFFSET
89 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_OFFSET \
90 	TCL_DATA_CMD_BUF_OR_EXT_DESC_TYPE_OFFSET
91 #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB \
92 	BUFFER_ADDR_INFO_BUFFER_ADDR_31_0_LSB
93 #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK \
94 	BUFFER_ADDR_INFO_BUFFER_ADDR_31_0_MASK
95 #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB \
96 	BUFFER_ADDR_INFO_BUFFER_ADDR_39_32_LSB
97 #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK \
98 	BUFFER_ADDR_INFO_BUFFER_ADDR_39_32_MASK
99 #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB \
100 	BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_LSB
101 #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK \
102 	BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_MASK
103 #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB \
104 	BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_LSB
105 #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK \
106 	BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_MASK
107 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_LSB \
108 	TCL_DATA_CMD_BUF_OR_EXT_DESC_TYPE_LSB
109 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_MASK \
110 	TCL_DATA_CMD_BUF_OR_EXT_DESC_TYPE_MASK
111 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_MASK \
112 	WBM2SW_COMPLETION_RING_TX_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_MASK
113 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_OFFSET \
114 	WBM2SW_COMPLETION_RING_TX_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_OFFSET
115 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_LSB \
116 	WBM2SW_COMPLETION_RING_TX_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_LSB
117 
118 #include "hal_kiwi_tx.h"
119 #include "hal_kiwi_rx.h"
120 
121 #include "hal_be_rx_tlv.h"
122 
123 #include <hal_generic_api.h>
124 #include "hal_be_api_mon.h"
125 #include <hal_be_generic_api.h>
126 
127 #define LINK_DESC_SIZE (NUM_OF_DWORDS_RX_MSDU_LINK << 2)
128 
129 /* For Berryllium sw2rxdma ring size increased to 20 bits */
130 #define HAL_RXDMA_MAX_RING_SIZE_BE 0xFFFFF
131 
132 #ifdef QCA_GET_TSF_VIA_REG
133 #define PCIE_PCIE_MHI_TIME_LOW 0xA28
134 #define PCIE_PCIE_MHI_TIME_HIGH 0xA2C
135 
136 #define PMM_REG_BASE 0xB500FC
137 
138 #define FW_QTIME_CYCLES_PER_10_USEC 192
139 #endif
140 
141 struct wbm2sw_completion_ring_tx gwbm2sw_tx_comp_symbol __attribute__((used));
142 struct wbm2sw_completion_ring_rx gwbm2sw_rx_comp_symbol __attribute__((used));
143 
144 static uint32_t hal_get_link_desc_size_kiwi(void)
145 {
146 	return LINK_DESC_SIZE;
147 }
148 
149 /**
150  * hal_rx_dump_msdu_end_tlv_kiwi() - dump RX msdu_end TLV in structured
151  *			     human readable format.
152  * @msduend: pointer the msdu_end TLV in pkt.
153  * @dbg_level: log level.
154  *
155  * Return: void
156  */
157 #ifdef QCA_WIFI_KIWI_V2
158 static void hal_rx_dump_msdu_end_tlv_kiwi(void *msduend,
159 					  uint8_t dbg_level)
160 {
161 	struct rx_msdu_end *msdu_end = (struct rx_msdu_end *)msduend;
162 
163 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
164 			"rx_msdu_end tlv (1/5)- "
165 			"rxpcu_mpdu_filter_in_category :%x "
166 			"sw_frame_group_id :%x "
167 			"reserved_0 :%x "
168 			"phy_ppdu_id :%x "
169 			"ip_hdr_chksum :%x "
170 			"reported_mpdu_length :%x "
171 			"reserved_1a :%x "
172 			"reserved_2a :%x "
173 			"cce_super_rule :%x "
174 			"cce_classify_not_done_truncate :%x "
175 			"cce_classify_not_done_cce_dis :%x "
176 			"cumulative_l3_checksum :%x "
177 			"rule_indication_31_0 :%x "
178 			"ipv6_options_crc :%x "
179 			"da_offset :%x "
180 			"sa_offset :%x "
181 			"da_offset_valid :%x "
182 			"sa_offset_valid :%x "
183 			"reserved_5a :%x "
184 			"l3_type :%x",
185 			msdu_end->rxpcu_mpdu_filter_in_category,
186 			msdu_end->sw_frame_group_id,
187 			msdu_end->reserved_0,
188 			msdu_end->phy_ppdu_id,
189 			msdu_end->ip_hdr_chksum,
190 			msdu_end->reported_mpdu_length,
191 			msdu_end->reserved_1a,
192 			msdu_end->reserved_2a,
193 			msdu_end->cce_super_rule,
194 			msdu_end->cce_classify_not_done_truncate,
195 			msdu_end->cce_classify_not_done_cce_dis,
196 			msdu_end->cumulative_l3_checksum,
197 			msdu_end->rule_indication_31_0,
198 			msdu_end->ipv6_options_crc,
199 			msdu_end->da_offset,
200 			msdu_end->sa_offset,
201 			msdu_end->da_offset_valid,
202 			msdu_end->sa_offset_valid,
203 			msdu_end->reserved_5a,
204 			msdu_end->l3_type);
205 
206 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
207 			"rx_msdu_end tlv (2/5)- "
208 			"rule_indication_63_32 :%x "
209 			"tcp_seq_number :%x "
210 			"tcp_ack_number :%x "
211 			"tcp_flag :%x "
212 			"lro_eligible :%x "
213 			"reserved_9a :%x "
214 			"window_size :%x "
215 			"sa_sw_peer_id :%x "
216 			"sa_idx_timeout :%x "
217 			"da_idx_timeout :%x "
218 			"to_ds :%x "
219 			"tid :%x "
220 			"sa_is_valid :%x "
221 			"da_is_valid :%x "
222 			"da_is_mcbc :%x "
223 			"l3_header_padding :%x "
224 			"first_msdu :%x "
225 			"last_msdu :%x "
226 			"fr_ds :%x "
227 			"ip_chksum_fail_copy :%x "
228 			"sa_idx :%x "
229 			"da_idx_or_sw_peer_id :%x",
230 			msdu_end->rule_indication_63_32,
231 			msdu_end->tcp_seq_number,
232 			msdu_end->tcp_ack_number,
233 			msdu_end->tcp_flag,
234 			msdu_end->lro_eligible,
235 			msdu_end->reserved_9a,
236 			msdu_end->window_size,
237 			msdu_end->sa_sw_peer_id,
238 			msdu_end->sa_idx_timeout,
239 			msdu_end->da_idx_timeout,
240 			msdu_end->to_ds,
241 			msdu_end->tid,
242 			msdu_end->sa_is_valid,
243 			msdu_end->da_is_valid,
244 			msdu_end->da_is_mcbc,
245 			msdu_end->l3_header_padding,
246 			msdu_end->first_msdu,
247 			msdu_end->last_msdu,
248 			msdu_end->fr_ds,
249 			msdu_end->ip_chksum_fail_copy,
250 			msdu_end->sa_idx,
251 			msdu_end->da_idx_or_sw_peer_id);
252 
253 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
254 			"rx_msdu_end tlv (3/5)- "
255 			"msdu_drop :%x "
256 			"reo_destination_indication :%x "
257 			"flow_idx :%x "
258 			"use_ppe :%x "
259 			"vlan_ctag_stripped :%x "
260 			"vlan_stag_stripped :%x "
261 			"fragment_flag :%x "
262 			"fse_metadata :%x "
263 			"cce_metadata :%x "
264 			"tcp_udp_chksum :%x "
265 			"aggregation_count :%x "
266 			"flow_aggregation_continuation :%x "
267 			"fisa_timeout :%x "
268 			"tcp_udp_chksum_fail_copy :%x "
269 			"msdu_limit_error :%x "
270 			"flow_idx_timeout :%x "
271 			"flow_idx_invalid :%x "
272 			"cce_match :%x "
273 			"amsdu_parser_error :%x "
274 			"cumulative_ip_length :%x "
275 			"key_id_octet :%x "
276 			"reserved_16a :%x "
277 			"reserved_17a :%x "
278 			"service_code :%x "
279 			"priority_valid :%x "
280 			"intra_bss :%x "
281 			"dest_chip_id :%x "
282 			"multicast_echo :%x "
283 			"wds_learning_event :%x "
284 			"wds_roaming_event :%x "
285 			"wds_keep_alive_event :%x "
286 			"reserved_17b :%x",
287 			msdu_end->msdu_drop,
288 			msdu_end->reo_destination_indication,
289 			msdu_end->flow_idx,
290 			msdu_end->use_ppe,
291 			msdu_end->vlan_ctag_stripped,
292 			msdu_end->vlan_stag_stripped,
293 			msdu_end->fragment_flag,
294 			msdu_end->fse_metadata,
295 			msdu_end->cce_metadata,
296 			msdu_end->tcp_udp_chksum,
297 			msdu_end->aggregation_count,
298 			msdu_end->flow_aggregation_continuation,
299 			msdu_end->fisa_timeout,
300 			msdu_end->tcp_udp_chksum_fail_copy,
301 			msdu_end->msdu_limit_error,
302 			msdu_end->flow_idx_timeout,
303 			msdu_end->flow_idx_invalid,
304 			msdu_end->cce_match,
305 			msdu_end->amsdu_parser_error,
306 			msdu_end->cumulative_ip_length,
307 			msdu_end->key_id_octet,
308 			msdu_end->reserved_16a,
309 			msdu_end->reserved_17a,
310 			msdu_end->service_code,
311 			msdu_end->priority_valid,
312 			msdu_end->intra_bss,
313 			msdu_end->dest_chip_id,
314 			msdu_end->multicast_echo,
315 			msdu_end->wds_learning_event,
316 			msdu_end->wds_roaming_event,
317 			msdu_end->wds_keep_alive_event,
318 			msdu_end->reserved_17b);
319 
320 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
321 			"rx_msdu_end tlv (4/5)- "
322 			"msdu_length :%x "
323 			"stbc :%x "
324 			"ipsec_esp :%x "
325 			"l3_offset :%x "
326 			"ipsec_ah :%x "
327 			"l4_offset :%x "
328 			"msdu_number :%x "
329 			"decap_format :%x "
330 			"ipv4_proto :%x "
331 			"ipv6_proto :%x "
332 			"tcp_proto :%x "
333 			"udp_proto :%x "
334 			"ip_frag :%x "
335 			"tcp_only_ack :%x "
336 			"da_is_bcast_mcast :%x "
337 			"toeplitz_hash_sel :%x "
338 			"ip_fixed_header_valid :%x "
339 			"ip_extn_header_valid :%x "
340 			"tcp_udp_header_valid :%x "
341 			"mesh_control_present :%x "
342 			"ldpc :%x "
343 			"ip4_protocol_ip6_next_header :%x "
344 			"vlan_ctag_ci :%x "
345 			"vlan_stag_ci :%x "
346 			"peer_meta_data :%x "
347 			"user_rssi :%x "
348 			"pkt_type :%x "
349 			"sgi :%x "
350 			"rate_mcs :%x "
351 			"receive_bandwidth :%x "
352 			"reception_type :%x "
353 			"mimo_ss_bitmap :%x "
354 			"msdu_done_copy :%x "
355 			"flow_id_toeplitz :%x",
356 			msdu_end->msdu_length,
357 			msdu_end->stbc,
358 			msdu_end->ipsec_esp,
359 			msdu_end->l3_offset,
360 			msdu_end->ipsec_ah,
361 			msdu_end->l4_offset,
362 			msdu_end->msdu_number,
363 			msdu_end->decap_format,
364 			msdu_end->ipv4_proto,
365 			msdu_end->ipv6_proto,
366 			msdu_end->tcp_proto,
367 			msdu_end->udp_proto,
368 			msdu_end->ip_frag,
369 			msdu_end->tcp_only_ack,
370 			msdu_end->da_is_bcast_mcast,
371 			msdu_end->toeplitz_hash_sel,
372 			msdu_end->ip_fixed_header_valid,
373 			msdu_end->ip_extn_header_valid,
374 			msdu_end->tcp_udp_header_valid,
375 			msdu_end->mesh_control_present,
376 			msdu_end->ldpc,
377 			msdu_end->ip4_protocol_ip6_next_header,
378 			msdu_end->vlan_ctag_ci,
379 			msdu_end->vlan_stag_ci,
380 			msdu_end->peer_meta_data,
381 			msdu_end->user_rssi,
382 			msdu_end->pkt_type,
383 			msdu_end->sgi,
384 			msdu_end->rate_mcs,
385 			msdu_end->receive_bandwidth,
386 			msdu_end->reception_type,
387 			msdu_end->mimo_ss_bitmap,
388 			msdu_end->msdu_done_copy,
389 			msdu_end->flow_id_toeplitz);
390 
391 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
392 			"rx_msdu_end tlv (5/5)- "
393 			"ppdu_start_timestamp_63_32 :%x "
394 			"sw_phy_meta_data :%x "
395 			"ppdu_start_timestamp_31_0 :%x "
396 			"toeplitz_hash_2_or_4 :%x "
397 			"reserved_28a :%x "
398 			"sa_15_0 :%x "
399 			"sa_47_16 :%x "
400 			"first_mpdu :%x "
401 			"reserved_30a :%x "
402 			"mcast_bcast :%x "
403 			"ast_index_not_found :%x "
404 			"ast_index_timeout :%x "
405 			"power_mgmt :%x "
406 			"non_qos :%x "
407 			"null_data :%x "
408 			"mgmt_type :%x "
409 			"ctrl_type :%x "
410 			"more_data :%x "
411 			"eosp :%x "
412 			"a_msdu_error :%x "
413 			"reserved_30b :%x "
414 			"order :%x "
415 			"wifi_parser_error :%x "
416 			"overflow_err :%x "
417 			"msdu_length_err :%x "
418 			"tcp_udp_chksum_fail :%x "
419 			"ip_chksum_fail :%x "
420 			"sa_idx_invalid :%x "
421 			"da_idx_invalid :%x "
422 			"amsdu_addr_mismatch :%x "
423 			"rx_in_tx_decrypt_byp :%x "
424 			"encrypt_required :%x "
425 			"directed :%x "
426 			"buffer_fragment :%x "
427 			"mpdu_length_err :%x "
428 			"tkip_mic_err :%x "
429 			"decrypt_err :%x "
430 			"unencrypted_frame_err :%x "
431 			"fcs_err :%x "
432 			"reserved_31a :%x "
433 			"decrypt_status_code :%x "
434 			"rx_bitmap_not_updated :%x "
435 			"reserved_31b :%x "
436 			"msdu_done :%x",
437 			msdu_end->ppdu_start_timestamp_63_32,
438 			msdu_end->sw_phy_meta_data,
439 			msdu_end->ppdu_start_timestamp_31_0,
440 			msdu_end->toeplitz_hash_2_or_4,
441 			msdu_end->reserved_28a,
442 			msdu_end->sa_15_0,
443 			msdu_end->sa_47_16,
444 			msdu_end->first_mpdu,
445 			msdu_end->reserved_30a,
446 			msdu_end->mcast_bcast,
447 			msdu_end->ast_index_not_found,
448 			msdu_end->ast_index_timeout,
449 			msdu_end->power_mgmt,
450 			msdu_end->non_qos,
451 			msdu_end->null_data,
452 			msdu_end->mgmt_type,
453 			msdu_end->ctrl_type,
454 			msdu_end->more_data,
455 			msdu_end->eosp,
456 			msdu_end->a_msdu_error,
457 			msdu_end->reserved_30b,
458 			msdu_end->order,
459 			msdu_end->wifi_parser_error,
460 			msdu_end->overflow_err,
461 			msdu_end->msdu_length_err,
462 			msdu_end->tcp_udp_chksum_fail,
463 			msdu_end->ip_chksum_fail,
464 			msdu_end->sa_idx_invalid,
465 			msdu_end->da_idx_invalid,
466 			msdu_end->amsdu_addr_mismatch,
467 			msdu_end->rx_in_tx_decrypt_byp,
468 			msdu_end->encrypt_required,
469 			msdu_end->directed,
470 			msdu_end->buffer_fragment,
471 			msdu_end->mpdu_length_err,
472 			msdu_end->tkip_mic_err,
473 			msdu_end->decrypt_err,
474 			msdu_end->unencrypted_frame_err,
475 			msdu_end->fcs_err,
476 			msdu_end->reserved_31a,
477 			msdu_end->decrypt_status_code,
478 			msdu_end->rx_bitmap_not_updated,
479 			msdu_end->reserved_31b,
480 			msdu_end->msdu_done);
481 }
482 #else
483 static void hal_rx_dump_msdu_end_tlv_kiwi(void *msduend,
484 					  uint8_t dbg_level)
485 {
486 	struct rx_msdu_end *msdu_end = (struct rx_msdu_end *)msduend;
487 
488 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
489 		       "rx_msdu_end tlv (1/7)- "
490 		       "rxpcu_mpdu_filter_in_category :%x"
491 		       "sw_frame_group_id :%x"
492 		       "reserved_0 :%x"
493 		       "phy_ppdu_id :%x"
494 		       "ip_hdr_chksum:%x"
495 		       "reported_mpdu_length :%x"
496 		       "reserved_1a :%x"
497 		       "key_id_octet :%x"
498 		       "cce_super_rule :%x"
499 		       "cce_classify_not_done_truncate :%x"
500 		       "cce_classify_not_done_cce_dis:%x"
501 		       "cumulative_l3_checksum :%x"
502 		       "rule_indication_31_0 :%x"
503 		       "rule_indication_63_32:%x"
504 		       "da_offset :%x"
505 		       "sa_offset :%x"
506 		       "da_offset_valid :%x"
507 		       "sa_offset_valid :%x"
508 		       "reserved_5a :%x"
509 		       "l3_type :%x",
510 			msdu_end->rxpcu_mpdu_filter_in_category,
511 			msdu_end->sw_frame_group_id,
512 			msdu_end->reserved_0,
513 			msdu_end->phy_ppdu_id,
514 			msdu_end->ip_hdr_chksum,
515 			msdu_end->reported_mpdu_length,
516 			msdu_end->reserved_1a,
517 			msdu_end->key_id_octet,
518 			msdu_end->cce_super_rule,
519 			msdu_end->cce_classify_not_done_truncate,
520 			msdu_end->cce_classify_not_done_cce_dis,
521 			msdu_end->cumulative_l3_checksum,
522 			msdu_end->rule_indication_31_0,
523 			msdu_end->rule_indication_63_32,
524 			msdu_end->da_offset,
525 			msdu_end->sa_offset,
526 			msdu_end->da_offset_valid,
527 			msdu_end->sa_offset_valid,
528 			msdu_end->reserved_5a,
529 			msdu_end->l3_type);
530 
531 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
532 		       "rx_msdu_end tlv (2/7)- "
533 		       "ipv6_options_crc :%x"
534 		       "tcp_seq_number :%x"
535 		       "tcp_ack_number :%x"
536 		       "tcp_flag :%x"
537 		       "lro_eligible :%x"
538 		       "reserved_9a :%x"
539 		       "window_size :%x"
540 		       "tcp_udp_chksum :%x"
541 		       "sa_idx_timeout :%x"
542 		       "da_idx_timeout :%x"
543 		       "msdu_limit_error :%x"
544 		       "flow_idx_timeout :%x"
545 		       "flow_idx_invalid :%x"
546 		       "wifi_parser_error :%x"
547 		       "amsdu_parser_error :%x"
548 		       "sa_is_valid :%x"
549 		       "da_is_valid :%x"
550 		       "da_is_mcbc :%x"
551 		       "l3_header_padding :%x"
552 		       "first_msdu :%x"
553 		       "last_msdu :%x",
554 		       msdu_end->ipv6_options_crc,
555 		       msdu_end->tcp_seq_number,
556 		       msdu_end->tcp_ack_number,
557 		       msdu_end->tcp_flag,
558 		       msdu_end->lro_eligible,
559 		       msdu_end->reserved_9a,
560 		       msdu_end->window_size,
561 		       msdu_end->tcp_udp_chksum,
562 		       msdu_end->sa_idx_timeout,
563 		       msdu_end->da_idx_timeout,
564 		       msdu_end->msdu_limit_error,
565 		       msdu_end->flow_idx_timeout,
566 		       msdu_end->flow_idx_invalid,
567 		       msdu_end->wifi_parser_error,
568 		       msdu_end->amsdu_parser_error,
569 		       msdu_end->sa_is_valid,
570 		       msdu_end->da_is_valid,
571 		       msdu_end->da_is_mcbc,
572 		       msdu_end->l3_header_padding,
573 		       msdu_end->first_msdu,
574 		       msdu_end->last_msdu);
575 
576 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
577 		       "rx_msdu_end tlv (3/7)"
578 		       "tcp_udp_chksum_fail_copy :%x"
579 		       "ip_chksum_fail_copy :%x"
580 		       "sa_idx :%x"
581 		       "da_idx_or_sw_peer_id :%x"
582 		       "msdu_drop :%x"
583 		       "reo_destination_indication :%x"
584 		       "flow_idx :%x"
585 		       "reserved_12a :%x"
586 		       "fse_metadata :%x"
587 		       "cce_metadata :%x"
588 		       "sa_sw_peer_id:%x"
589 		       "aggregation_count :%x"
590 		       "flow_aggregation_continuation:%x"
591 		       "fisa_timeout :%x"
592 		       "reserved_15a :%x"
593 		       "cumulative_l4_checksum :%x"
594 		       "cumulative_ip_length :%x"
595 		       "service_code :%x"
596 		       "priority_valid :%x",
597 		       msdu_end->tcp_udp_chksum_fail_copy,
598 		       msdu_end->ip_chksum_fail_copy,
599 		       msdu_end->sa_idx,
600 		       msdu_end->da_idx_or_sw_peer_id,
601 		       msdu_end->msdu_drop,
602 		       msdu_end->reo_destination_indication,
603 		       msdu_end->flow_idx,
604 		       msdu_end->reserved_12a,
605 		       msdu_end->fse_metadata,
606 		       msdu_end->cce_metadata,
607 		       msdu_end->sa_sw_peer_id,
608 		       msdu_end->aggregation_count,
609 		       msdu_end->flow_aggregation_continuation,
610 		       msdu_end->fisa_timeout,
611 		       msdu_end->reserved_15a,
612 		       msdu_end->cumulative_l4_checksum,
613 		       msdu_end->cumulative_ip_length,
614 		       msdu_end->service_code,
615 		       msdu_end->priority_valid);
616 
617 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
618 		       "rx_msdu_end tlv (4/7)"
619 		       "reserved_17a :%x"
620 		       "msdu_length :%x"
621 		       "ipsec_esp :%x"
622 		       "l3_offset :%x"
623 		       "ipsec_ah :%x"
624 		       "l4_offset :%x"
625 		       "msdu_number :%x"
626 		       "decap_format :%x"
627 		       "ipv4_proto :%x"
628 		       "ipv6_proto :%x"
629 		       "tcp_proto :%x"
630 		       "udp_proto :%x"
631 		       "ip_frag :%x"
632 		       "tcp_only_ack :%x"
633 		       "da_is_bcast_mcast :%x"
634 		       "toeplitz_hash_sel :%x"
635 		       "ip_fixed_header_valid:%x"
636 		       "ip_extn_header_valid :%x"
637 		       "tcp_udp_header_valid :%x",
638 		       msdu_end->reserved_17a,
639 		       msdu_end->msdu_length,
640 		       msdu_end->ipsec_esp,
641 		       msdu_end->l3_offset,
642 		       msdu_end->ipsec_ah,
643 		       msdu_end->l4_offset,
644 		       msdu_end->msdu_number,
645 		       msdu_end->decap_format,
646 		       msdu_end->ipv4_proto,
647 		       msdu_end->ipv6_proto,
648 		       msdu_end->tcp_proto,
649 		       msdu_end->udp_proto,
650 		       msdu_end->ip_frag,
651 		       msdu_end->tcp_only_ack,
652 		       msdu_end->da_is_bcast_mcast,
653 		       msdu_end->toeplitz_hash_sel,
654 		       msdu_end->ip_fixed_header_valid,
655 		       msdu_end->ip_extn_header_valid,
656 		       msdu_end->tcp_udp_header_valid);
657 
658 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
659 		       "rx_msdu_end tlv (5/7)"
660 		       "mesh_control_present :%x"
661 		       "ldpc :%x"
662 		       "ip4_protocol_ip6_next_header :%x"
663 		       "toeplitz_hash_2_or_4 :%x"
664 		       "flow_id_toeplitz :%x"
665 		       "user_rssi :%x"
666 		       "pkt_type :%x"
667 		       "stbc :%x"
668 		       "sgi :%x"
669 		       "rate_mcs :%x"
670 		       "receive_bandwidth :%x"
671 		       "reception_type :%x"
672 		       "mimo_ss_bitmap :%x"
673 		       "ppdu_start_timestamp_31_0 :%x"
674 		       "ppdu_start_timestamp_63_32 :%x"
675 		       "sw_phy_meta_data :%x"
676 		       "vlan_ctag_ci :%x"
677 		       "vlan_stag_ci :%x"
678 		       "first_mpdu :%x"
679 		       "reserved_30a :%x"
680 		       "mcast_bcast :%x",
681 		       msdu_end->mesh_control_present,
682 		       msdu_end->ldpc,
683 		       msdu_end->ip4_protocol_ip6_next_header,
684 		       msdu_end->toeplitz_hash_2_or_4,
685 		       msdu_end->flow_id_toeplitz,
686 		       msdu_end->user_rssi,
687 		       msdu_end->pkt_type,
688 		       msdu_end->stbc,
689 		       msdu_end->sgi,
690 		       msdu_end->rate_mcs,
691 		       msdu_end->receive_bandwidth,
692 		       msdu_end->reception_type,
693 		       msdu_end->mimo_ss_bitmap,
694 		       msdu_end->ppdu_start_timestamp_31_0,
695 		       msdu_end->ppdu_start_timestamp_63_32,
696 		       msdu_end->sw_phy_meta_data,
697 		       msdu_end->vlan_ctag_ci,
698 		       msdu_end->vlan_stag_ci,
699 		       msdu_end->first_mpdu,
700 		       msdu_end->reserved_30a,
701 		       msdu_end->mcast_bcast);
702 
703 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
704 		       "rx_msdu_end tlv (6/7)"
705 		       "ast_index_not_found :%x"
706 		       "ast_index_timeout :%x"
707 		       "power_mgmt :%x"
708 		       "non_qos :%x"
709 		       "null_data :%x"
710 		       "mgmt_type :%x"
711 		       "ctrl_type :%x"
712 		       "more_data :%x"
713 		       "eosp :%x"
714 		       "a_msdu_error :%x"
715 		       "fragment_flag:%x"
716 		       "order:%x"
717 		       "cce_match :%x"
718 		       "overflow_err :%x"
719 		       "msdu_length_err :%x"
720 		       "tcp_udp_chksum_fail :%x"
721 		       "ip_chksum_fail :%x"
722 		       "sa_idx_invalid :%x"
723 		       "da_idx_invalid :%x"
724 		       "reserved_30b :%x",
725 		       msdu_end->ast_index_not_found,
726 		       msdu_end->ast_index_timeout,
727 		       msdu_end->power_mgmt,
728 		       msdu_end->non_qos,
729 		       msdu_end->null_data,
730 		       msdu_end->mgmt_type,
731 		       msdu_end->ctrl_type,
732 		       msdu_end->more_data,
733 		       msdu_end->eosp,
734 		       msdu_end->a_msdu_error,
735 		       msdu_end->fragment_flag,
736 		       msdu_end->order,
737 		       msdu_end->cce_match,
738 		       msdu_end->overflow_err,
739 		       msdu_end->msdu_length_err,
740 		       msdu_end->tcp_udp_chksum_fail,
741 		       msdu_end->ip_chksum_fail,
742 		       msdu_end->sa_idx_invalid,
743 		       msdu_end->da_idx_invalid,
744 		       msdu_end->reserved_30b);
745 
746 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
747 		       "rx_msdu_end tlv (7/7)"
748 		       "rx_in_tx_decrypt_byp :%x"
749 		       "encrypt_required :%x"
750 		       "directed :%x"
751 		       "buffer_fragment :%x"
752 		       "mpdu_length_err :%x"
753 		       "tkip_mic_err :%x"
754 		       "decrypt_err :%x"
755 		       "unencrypted_frame_err:%x"
756 		       "fcs_err :%x"
757 		       "reserved_31a :%x"
758 		       "decrypt_status_code :%x"
759 		       "rx_bitmap_not_updated:%x"
760 		       "reserved_31b :%x"
761 		       "msdu_done :%x",
762 		       msdu_end->rx_in_tx_decrypt_byp,
763 		       msdu_end->encrypt_required,
764 		       msdu_end->directed,
765 		       msdu_end->buffer_fragment,
766 		       msdu_end->mpdu_length_err,
767 		       msdu_end->tkip_mic_err,
768 		       msdu_end->decrypt_err,
769 		       msdu_end->unencrypted_frame_err,
770 		       msdu_end->fcs_err,
771 		       msdu_end->reserved_31a,
772 		       msdu_end->decrypt_status_code,
773 		       msdu_end->rx_bitmap_not_updated,
774 		       msdu_end->reserved_31b,
775 		       msdu_end->msdu_done);
776 }
777 #endif
778 
779 #ifdef NO_RX_PKT_HDR_TLV
780 static inline void hal_rx_dump_pkt_hdr_tlv_kiwi(struct rx_pkt_tlvs *pkt_tlvs,
781 						uint8_t dbg_level)
782 {
783 }
784 
785 static inline
786 void hal_register_rx_pkt_hdr_tlv_api_kiwi(struct hal_soc *hal_soc)
787 {
788 }
789 
790 static uint8_t *hal_rx_desc_get_80211_hdr_be(void *hw_desc_addr)
791 {
792 	uint8_t *rx_pkt_hdr;
793 	struct rx_mon_pkt_tlvs *rx_desc =
794 					(struct rx_mon_pkt_tlvs *)hw_desc_addr;
795 
796 	rx_pkt_hdr = &rx_desc->pkt_hdr_tlv.rx_pkt_hdr[0];
797 
798 	return rx_pkt_hdr;
799 }
800 #else
801 static uint8_t *hal_rx_desc_get_80211_hdr_be(void *hw_desc_addr)
802 {
803 	struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr;
804 	uint8_t *rx_pkt_hdr;
805 
806 	rx_pkt_hdr = &rx_desc->pkt_hdr_tlv.rx_pkt_hdr[0];
807 
808 	return rx_pkt_hdr;
809 }
810 
811 /**
812  * hal_rx_dump_pkt_hdr_tlv_kiwi() - dump RX pkt header TLV in hex format
813  * @pkt_tlvs: pointer the pkt_hdr_tlv in pkt.
814  * @dbg_level: log level.
815  *
816  * Return: void
817  */
818 static inline void hal_rx_dump_pkt_hdr_tlv_kiwi(struct rx_pkt_tlvs *pkt_tlvs,
819 						uint8_t dbg_level)
820 {
821 	struct rx_pkt_hdr_tlv *pkt_hdr_tlv = &pkt_tlvs->pkt_hdr_tlv;
822 
823 	hal_verbose_debug("\n---------------\n"
824 			  "rx_pkt_hdr_tlv\n"
825 			  "---------------\n"
826 			  "phy_ppdu_id 0x%x ",
827 			  pkt_hdr_tlv->phy_ppdu_id);
828 
829 	hal_verbose_hex_dump(pkt_hdr_tlv->rx_pkt_hdr,
830 			     sizeof(pkt_hdr_tlv->rx_pkt_hdr));
831 }
832 
833 /**
834  * hal_register_rx_pkt_hdr_tlv_api_kiwi: register all rx_pkt_hdr_tlv related api
835  * @hal_soc: HAL soc handler
836  *
837  * Return: none
838  */
839 static inline
840 void hal_register_rx_pkt_hdr_tlv_api_kiwi(struct hal_soc *hal_soc)
841 {
842 	hal_soc->ops->hal_rx_pkt_tlv_offset_get =
843 				hal_rx_pkt_tlv_offset_get_generic;
844 }
845 #endif
846 
847 /**
848  * hal_rx_dump_mpdu_start_tlv_kiwi(): dump RX mpdu_start TLV in structured
849  *			       human readable format.
850  * @mpdustart: pointer the rx_attention TLV in pkt.
851  * @dbg_level: log level.
852  *
853  * Return: void
854  */
855 static inline void hal_rx_dump_mpdu_start_tlv_kiwi(void *mpdustart,
856 						   uint8_t dbg_level)
857 {
858 	struct rx_mpdu_start *mpdu_start = (struct rx_mpdu_start *)mpdustart;
859 	struct rx_mpdu_info *mpdu_info =
860 		(struct rx_mpdu_info *)&mpdu_start->rx_mpdu_info_details;
861 
862 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
863 		       "rx_mpdu_start tlv (1/5) - "
864 		       "rx_reo_queue_desc_addr_31_0 :%x"
865 		       "rx_reo_queue_desc_addr_39_32 :%x"
866 		       "receive_queue_number:%x "
867 		       "pre_delim_err_warning:%x "
868 		       "first_delim_err:%x "
869 		       "reserved_2a:%x "
870 		       "pn_31_0:%x "
871 		       "pn_63_32:%x "
872 		       "pn_95_64:%x "
873 		       "pn_127_96:%x "
874 		       "epd_en:%x "
875 		       "all_frames_shall_be_encrypted  :%x"
876 		       "encrypt_type:%x "
877 		       "wep_key_width_for_variable_key :%x"
878 		       "bssid_hit:%x "
879 		       "bssid_number:%x "
880 		       "tid:%x "
881 		       "reserved_7a:%x "
882 		       "peer_meta_data:%x ",
883 		       mpdu_info->rx_reo_queue_desc_addr_31_0,
884 		       mpdu_info->rx_reo_queue_desc_addr_39_32,
885 		       mpdu_info->receive_queue_number,
886 		       mpdu_info->pre_delim_err_warning,
887 		       mpdu_info->first_delim_err,
888 		       mpdu_info->reserved_2a,
889 		       mpdu_info->pn_31_0,
890 		       mpdu_info->pn_63_32,
891 		       mpdu_info->pn_95_64,
892 		       mpdu_info->pn_127_96,
893 		       mpdu_info->epd_en,
894 		       mpdu_info->all_frames_shall_be_encrypted,
895 		       mpdu_info->encrypt_type,
896 		       mpdu_info->wep_key_width_for_variable_key,
897 		       mpdu_info->bssid_hit,
898 		       mpdu_info->bssid_number,
899 		       mpdu_info->tid,
900 		       mpdu_info->reserved_7a,
901 		       mpdu_info->peer_meta_data);
902 
903 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
904 		       "rx_mpdu_start tlv (2/5) - "
905 		       "rxpcu_mpdu_filter_in_category  :%x"
906 		       "sw_frame_group_id:%x "
907 		       "ndp_frame:%x "
908 		       "phy_err:%x "
909 		       "phy_err_during_mpdu_header  :%x"
910 		       "protocol_version_err:%x "
911 		       "ast_based_lookup_valid:%x "
912 		       "reserved_9a:%x "
913 		       "phy_ppdu_id:%x "
914 		       "ast_index:%x "
915 		       "sw_peer_id:%x "
916 		       "mpdu_frame_control_valid:%x "
917 		       "mpdu_duration_valid:%x "
918 		       "mac_addr_ad1_valid:%x "
919 		       "mac_addr_ad2_valid:%x "
920 		       "mac_addr_ad3_valid:%x "
921 		       "mac_addr_ad4_valid:%x "
922 		       "mpdu_sequence_control_valid :%x"
923 		       "mpdu_qos_control_valid:%x "
924 		       "mpdu_ht_control_valid:%x "
925 		       "frame_encryption_info_valid :%x",
926 		       mpdu_info->rxpcu_mpdu_filter_in_category,
927 		       mpdu_info->sw_frame_group_id,
928 		       mpdu_info->ndp_frame,
929 		       mpdu_info->phy_err,
930 		       mpdu_info->phy_err_during_mpdu_header,
931 		       mpdu_info->protocol_version_err,
932 		       mpdu_info->ast_based_lookup_valid,
933 		       mpdu_info->reserved_9a,
934 		       mpdu_info->phy_ppdu_id,
935 		       mpdu_info->ast_index,
936 		       mpdu_info->sw_peer_id,
937 		       mpdu_info->mpdu_frame_control_valid,
938 		       mpdu_info->mpdu_duration_valid,
939 		       mpdu_info->mac_addr_ad1_valid,
940 		       mpdu_info->mac_addr_ad2_valid,
941 		       mpdu_info->mac_addr_ad3_valid,
942 		       mpdu_info->mac_addr_ad4_valid,
943 		       mpdu_info->mpdu_sequence_control_valid,
944 		       mpdu_info->mpdu_qos_control_valid,
945 		       mpdu_info->mpdu_ht_control_valid,
946 		       mpdu_info->frame_encryption_info_valid);
947 
948 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
949 		       "rx_mpdu_start tlv (3/5) - "
950 		       "mpdu_fragment_number:%x "
951 		       "more_fragment_flag:%x "
952 		       "reserved_11a:%x "
953 		       "fr_ds:%x "
954 		       "to_ds:%x "
955 		       "encrypted:%x "
956 		       "mpdu_retry:%x "
957 		       "mpdu_sequence_number:%x "
958 		       "key_id_octet:%x "
959 		       "new_peer_entry:%x "
960 		       "decrypt_needed:%x "
961 		       "decap_type:%x "
962 		       "rx_insert_vlan_c_tag_padding :%x"
963 		       "rx_insert_vlan_s_tag_padding :%x"
964 		       "strip_vlan_c_tag_decap:%x "
965 		       "strip_vlan_s_tag_decap:%x "
966 		       "pre_delim_count:%x "
967 		       "ampdu_flag:%x "
968 		       "bar_frame:%x "
969 		       "raw_mpdu:%x "
970 		       "reserved_12:%x "
971 		       "mpdu_length:%x ",
972 		       mpdu_info->mpdu_fragment_number,
973 		       mpdu_info->more_fragment_flag,
974 		       mpdu_info->reserved_11a,
975 		       mpdu_info->fr_ds,
976 		       mpdu_info->to_ds,
977 		       mpdu_info->encrypted,
978 		       mpdu_info->mpdu_retry,
979 		       mpdu_info->mpdu_sequence_number,
980 		       mpdu_info->key_id_octet,
981 		       mpdu_info->new_peer_entry,
982 		       mpdu_info->decrypt_needed,
983 		       mpdu_info->decap_type,
984 		       mpdu_info->rx_insert_vlan_c_tag_padding,
985 		       mpdu_info->rx_insert_vlan_s_tag_padding,
986 		       mpdu_info->strip_vlan_c_tag_decap,
987 		       mpdu_info->strip_vlan_s_tag_decap,
988 		       mpdu_info->pre_delim_count,
989 		       mpdu_info->ampdu_flag,
990 		       mpdu_info->bar_frame,
991 		       mpdu_info->raw_mpdu,
992 		       mpdu_info->reserved_12,
993 		       mpdu_info->mpdu_length);
994 
995 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
996 		       "rx_mpdu_start tlv (4/5) - "
997 		       "mpdu_length:%x "
998 		       "first_mpdu:%x "
999 		       "mcast_bcast:%x "
1000 		       "ast_index_not_found:%x "
1001 		       "ast_index_timeout:%x "
1002 		       "power_mgmt:%x "
1003 		       "non_qos:%x "
1004 		       "null_data:%x "
1005 		       "mgmt_type:%x "
1006 		       "ctrl_type:%x "
1007 		       "more_data:%x "
1008 		       "eosp:%x "
1009 		       "fragment_flag:%x "
1010 		       "order:%x "
1011 		       "u_apsd_trigger:%x "
1012 		       "encrypt_required:%x "
1013 		       "directed:%x "
1014 		       "amsdu_present:%x "
1015 		       "reserved_13:%x "
1016 		       "mpdu_frame_control_field:%x "
1017 		       "mpdu_duration_field:%x ",
1018 		       mpdu_info->mpdu_length,
1019 		       mpdu_info->first_mpdu,
1020 		       mpdu_info->mcast_bcast,
1021 		       mpdu_info->ast_index_not_found,
1022 		       mpdu_info->ast_index_timeout,
1023 		       mpdu_info->power_mgmt,
1024 		       mpdu_info->non_qos,
1025 		       mpdu_info->null_data,
1026 		       mpdu_info->mgmt_type,
1027 		       mpdu_info->ctrl_type,
1028 		       mpdu_info->more_data,
1029 		       mpdu_info->eosp,
1030 		       mpdu_info->fragment_flag,
1031 		       mpdu_info->order,
1032 		       mpdu_info->u_apsd_trigger,
1033 		       mpdu_info->encrypt_required,
1034 		       mpdu_info->directed,
1035 		       mpdu_info->amsdu_present,
1036 		       mpdu_info->reserved_13,
1037 		       mpdu_info->mpdu_frame_control_field,
1038 		       mpdu_info->mpdu_duration_field);
1039 
1040 	__QDF_TRACE_RL(dbg_level, QDF_MODULE_ID_HAL,
1041 		       "rx_mpdu_start tlv (5/5) - "
1042 		       "mac_addr_ad1_31_0:%x "
1043 		       "mac_addr_ad1_47_32:%x "
1044 		       "mac_addr_ad2_15_0:%x "
1045 		       "mac_addr_ad2_47_16:%x "
1046 		       "mac_addr_ad3_31_0:%x "
1047 		       "mac_addr_ad3_47_32:%x "
1048 		       "mpdu_sequence_control_field :%x"
1049 		       "mac_addr_ad4_31_0:%x "
1050 		       "mac_addr_ad4_47_32:%x "
1051 		       "mpdu_qos_control_field:%x "
1052 		       "mpdu_ht_control_field:%x "
1053 		       "vdev_id:%x "
1054 		       "service_code:%x "
1055 		       "priority_valid:%x "
1056 		       "reserved_23a:%x ",
1057 		       mpdu_info->mac_addr_ad1_31_0,
1058 		       mpdu_info->mac_addr_ad1_47_32,
1059 		       mpdu_info->mac_addr_ad2_15_0,
1060 		       mpdu_info->mac_addr_ad2_47_16,
1061 		       mpdu_info->mac_addr_ad3_31_0,
1062 		       mpdu_info->mac_addr_ad3_47_32,
1063 		       mpdu_info->mpdu_sequence_control_field,
1064 		       mpdu_info->mac_addr_ad4_31_0,
1065 		       mpdu_info->mac_addr_ad4_47_32,
1066 		       mpdu_info->mpdu_qos_control_field,
1067 		       mpdu_info->mpdu_ht_control_field,
1068 		       mpdu_info->vdev_id,
1069 		       mpdu_info->service_code,
1070 		       mpdu_info->priority_valid,
1071 		       mpdu_info->reserved_23a);
1072 }
1073 
1074 /**
1075  * hal_rx_dump_pkt_tlvs_kiwi(): API to print RX Pkt TLVS for kiwi
1076  * @hal_soc_hdl: hal_soc handle
1077  * @buf: pointer the pkt buffer
1078  * @dbg_level: log level
1079  *
1080  * Return: void
1081  */
1082 static void hal_rx_dump_pkt_tlvs_kiwi(hal_soc_handle_t hal_soc_hdl,
1083 				      uint8_t *buf, uint8_t dbg_level)
1084 {
1085 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1086 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
1087 	struct rx_mpdu_start *mpdu_start =
1088 				&pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
1089 
1090 	hal_rx_dump_msdu_end_tlv_kiwi(msdu_end, dbg_level);
1091 	hal_rx_dump_mpdu_start_tlv_kiwi(mpdu_start, dbg_level);
1092 	hal_rx_dump_pkt_hdr_tlv_kiwi(pkt_tlvs, dbg_level);
1093 }
1094 
1095 /**
1096  * hal_rx_get_mpdu_flags_from_tlv() - Populate the local mpdu_flags elements
1097  *				      from the rx tlvs
1098  * @mpdu_info: buf address to rx_mpdu_info
1099  *
1100  * Return: mpdu_flags.
1101  */
1102 static inline uint32_t
1103 hal_rx_get_mpdu_flags_from_tlv(struct rx_mpdu_info *mpdu_info)
1104 {
1105 	uint32_t mpdu_flags = 0;
1106 
1107 	if (mpdu_info->fragment_flag)
1108 		mpdu_flags |= HAL_MPDU_F_FRAGMENT;
1109 
1110 	if (mpdu_info->mpdu_retry)
1111 		mpdu_flags |= HAL_MPDU_F_RETRY_BIT;
1112 
1113 	if (mpdu_info->ampdu_flag)
1114 		mpdu_flags |= HAL_MPDU_F_AMPDU_FLAG;
1115 
1116 	if (mpdu_info->raw_mpdu)
1117 		mpdu_flags |= HAL_MPDU_F_RAW_AMPDU;
1118 
1119 	if (mpdu_info->mpdu_qos_control_valid)
1120 		mpdu_flags |= HAL_MPDU_F_QOS_CONTROL_VALID;
1121 
1122 	return mpdu_flags;
1123 }
1124 
1125 /**
1126  * hal_rx_tlv_populate_mpdu_desc_info_kiwi() - Populate the local mpdu_desc_info
1127  *			elements from the rx tlvs
1128  * @buf: start address of rx tlvs [Validated by caller]
1129  * @mpdu_desc_info_hdl: Buffer to populate the mpdu_dsc_info
1130  *			[To be validated by caller]
1131  *
1132  * Return: None
1133  */
1134 static void
1135 hal_rx_tlv_populate_mpdu_desc_info_kiwi(uint8_t *buf,
1136 					void *mpdu_desc_info_hdl)
1137 {
1138 	struct hal_rx_mpdu_desc_info *mpdu_desc_info =
1139 		(struct hal_rx_mpdu_desc_info *)mpdu_desc_info_hdl;
1140 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1141 	struct rx_mpdu_start *mpdu_start =
1142 					&pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
1143 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
1144 
1145 	mpdu_desc_info->mpdu_seq = mpdu_info->mpdu_sequence_number;
1146 	mpdu_desc_info->mpdu_flags = hal_rx_get_mpdu_flags_from_tlv(mpdu_info);
1147 	mpdu_desc_info->peer_meta_data = mpdu_info->peer_meta_data;
1148 	mpdu_desc_info->bar_frame = mpdu_info->bar_frame;
1149 }
1150 
1151 /**
1152  * hal_reo_status_get_header_kiwi() - Process reo desc info
1153  * @ring_desc: Pointer to reo descriptor
1154  * @b: tlv type info
1155  * @h1: Pointer to hal_reo_status_header where info to be stored
1156  *
1157  * Return: none.
1158  *
1159  */
1160 static void hal_reo_status_get_header_kiwi(hal_ring_desc_t ring_desc, int b,
1161 					   void *h1)
1162 {
1163 	uint64_t *d = (uint64_t *)ring_desc;
1164 	uint64_t val1 = 0;
1165 	struct hal_reo_status_header *h =
1166 			(struct hal_reo_status_header *)h1;
1167 
1168 	/* Offsets of descriptor fields defined in HW headers start
1169 	 * from the field after TLV header
1170 	 */
1171 	d += HAL_GET_NUM_QWORDS(sizeof(struct tlv_32_hdr));
1172 
1173 	switch (b) {
1174 	case HAL_REO_QUEUE_STATS_STATUS_TLV:
1175 		val1 = d[HAL_OFFSET_QW(REO_GET_QUEUE_STATS_STATUS,
1176 			STATUS_HEADER_REO_STATUS_NUMBER)];
1177 		break;
1178 	case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
1179 		val1 = d[HAL_OFFSET_QW(REO_FLUSH_QUEUE_STATUS,
1180 			STATUS_HEADER_REO_STATUS_NUMBER)];
1181 		break;
1182 	case HAL_REO_FLUSH_CACHE_STATUS_TLV:
1183 		val1 = d[HAL_OFFSET_QW(REO_FLUSH_CACHE_STATUS,
1184 			STATUS_HEADER_REO_STATUS_NUMBER)];
1185 		break;
1186 	case HAL_REO_UNBLK_CACHE_STATUS_TLV:
1187 		val1 = d[HAL_OFFSET_QW(REO_UNBLOCK_CACHE_STATUS,
1188 			STATUS_HEADER_REO_STATUS_NUMBER)];
1189 		break;
1190 	case HAL_REO_TIMOUT_LIST_STATUS_TLV:
1191 		val1 = d[HAL_OFFSET_QW(REO_FLUSH_TIMEOUT_LIST_STATUS,
1192 			STATUS_HEADER_REO_STATUS_NUMBER)];
1193 		break;
1194 	case HAL_REO_DESC_THRES_STATUS_TLV:
1195 		val1 =
1196 		  d[HAL_OFFSET_QW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS,
1197 		  STATUS_HEADER_REO_STATUS_NUMBER)];
1198 		break;
1199 	case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
1200 		val1 = d[HAL_OFFSET_QW(REO_UPDATE_RX_REO_QUEUE_STATUS,
1201 			STATUS_HEADER_REO_STATUS_NUMBER)];
1202 		break;
1203 	default:
1204 		qdf_nofl_err("ERROR: Unknown tlv\n");
1205 		break;
1206 	}
1207 	h->cmd_num =
1208 		HAL_GET_FIELD(
1209 			      UNIFORM_REO_STATUS_HEADER, REO_STATUS_NUMBER,
1210 			      val1);
1211 	h->exec_time =
1212 		HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER,
1213 			      CMD_EXECUTION_TIME, val1);
1214 	h->status =
1215 		HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER,
1216 			      REO_CMD_EXECUTION_STATUS, val1);
1217 	switch (b) {
1218 	case HAL_REO_QUEUE_STATS_STATUS_TLV:
1219 		val1 = d[HAL_OFFSET_QW(REO_GET_QUEUE_STATS_STATUS,
1220 			STATUS_HEADER_TIMESTAMP)];
1221 		break;
1222 	case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
1223 		val1 = d[HAL_OFFSET_QW(REO_FLUSH_QUEUE_STATUS,
1224 			STATUS_HEADER_TIMESTAMP)];
1225 		break;
1226 	case HAL_REO_FLUSH_CACHE_STATUS_TLV:
1227 		val1 = d[HAL_OFFSET_QW(REO_FLUSH_CACHE_STATUS,
1228 			STATUS_HEADER_TIMESTAMP)];
1229 		break;
1230 	case HAL_REO_UNBLK_CACHE_STATUS_TLV:
1231 		val1 = d[HAL_OFFSET_QW(REO_UNBLOCK_CACHE_STATUS,
1232 			STATUS_HEADER_TIMESTAMP)];
1233 		break;
1234 	case HAL_REO_TIMOUT_LIST_STATUS_TLV:
1235 		val1 = d[HAL_OFFSET_QW(REO_FLUSH_TIMEOUT_LIST_STATUS,
1236 			STATUS_HEADER_TIMESTAMP)];
1237 		break;
1238 	case HAL_REO_DESC_THRES_STATUS_TLV:
1239 		val1 =
1240 		  d[HAL_OFFSET_QW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS,
1241 		  STATUS_HEADER_TIMESTAMP)];
1242 		break;
1243 	case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
1244 		val1 = d[HAL_OFFSET_QW(REO_UPDATE_RX_REO_QUEUE_STATUS,
1245 			STATUS_HEADER_TIMESTAMP)];
1246 		break;
1247 	default:
1248 		qdf_nofl_err("ERROR: Unknown tlv\n");
1249 		break;
1250 	}
1251 	h->tstamp =
1252 		HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER, TIMESTAMP, val1);
1253 }
1254 
1255 static
1256 void *hal_rx_msdu0_buffer_addr_lsb_kiwi(void *link_desc_va)
1257 {
1258 	return (void *)HAL_RX_MSDU0_BUFFER_ADDR_LSB(link_desc_va);
1259 }
1260 
1261 static
1262 void *hal_rx_msdu_desc_info_ptr_get_kiwi(void *msdu0)
1263 {
1264 	return (void *)HAL_RX_MSDU_DESC_INFO_PTR_GET(msdu0);
1265 }
1266 
1267 static
1268 void *hal_ent_mpdu_desc_info_kiwi(void *ent_ring_desc)
1269 {
1270 	return (void *)HAL_ENT_MPDU_DESC_INFO(ent_ring_desc);
1271 }
1272 
1273 static
1274 void *hal_dst_mpdu_desc_info_kiwi(void *dst_ring_desc)
1275 {
1276 	return (void *)HAL_DST_MPDU_DESC_INFO(dst_ring_desc);
1277 }
1278 
1279 /**
1280  * hal_rx_get_tlv_kiwi() - API to get the tlv
1281  * @rx_tlv: TLV data extracted from the rx packet
1282  *
1283  * Return: uint8_t
1284  */
1285 static uint8_t hal_rx_get_tlv_kiwi(void *rx_tlv)
1286 {
1287 	return HAL_RX_GET(rx_tlv, PHYRX_RSSI_LEGACY, RECEIVE_BANDWIDTH);
1288 }
1289 
1290 /**
1291  * hal_rx_proc_phyrx_other_receive_info_tlv_kiwi()
1292  *				    - process other receive info TLV
1293  * @rx_tlv_hdr: pointer to TLV header
1294  * @ppdu_info_handle: pointer to ppdu_info
1295  *
1296  * Return: None
1297  */
1298 static
1299 void hal_rx_proc_phyrx_other_receive_info_tlv_kiwi(void *rx_tlv_hdr,
1300 						   void *ppdu_info_handle)
1301 {
1302 	uint32_t tlv_tag, tlv_len;
1303 	uint32_t temp_len, other_tlv_len, other_tlv_tag;
1304 	void *rx_tlv = (uint8_t *)rx_tlv_hdr + HAL_RX_TLV32_HDR_SIZE;
1305 	void *other_tlv_hdr = NULL;
1306 	void *other_tlv = NULL;
1307 
1308 	tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(rx_tlv_hdr);
1309 	tlv_len = HAL_RX_GET_USER_TLV32_LEN(rx_tlv_hdr);
1310 	temp_len = 0;
1311 
1312 	other_tlv_hdr = rx_tlv + HAL_RX_TLV32_HDR_SIZE;
1313 
1314 	other_tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(other_tlv_hdr);
1315 	other_tlv_len = HAL_RX_GET_USER_TLV32_LEN(other_tlv_hdr);
1316 	temp_len += other_tlv_len;
1317 	other_tlv = other_tlv_hdr + HAL_RX_TLV32_HDR_SIZE;
1318 
1319 	switch (other_tlv_tag) {
1320 	default:
1321 		hal_err_rl("unhandled TLV type: %d, TLV len:%d",
1322 			   other_tlv_tag, other_tlv_len);
1323 		break;
1324 	}
1325 }
1326 
1327 /**
1328  * hal_reo_config_kiwi(): Set reo config parameters
1329  * @soc: hal soc handle
1330  * @reg_val: value to be set
1331  * @reo_params: reo parameters
1332  *
1333  * Return: void
1334  */
1335 static
1336 void hal_reo_config_kiwi(struct hal_soc *soc,
1337 			 uint32_t reg_val,
1338 			 struct hal_reo_params *reo_params)
1339 {
1340 	HAL_REO_R0_CONFIG(soc, reg_val, reo_params);
1341 }
1342 
1343 /**
1344  * hal_rx_msdu_desc_info_get_ptr_kiwi() - Get msdu desc info ptr
1345  * @msdu_details_ptr: Pointer to msdu_details_ptr
1346  *
1347  * Return: Pointer to rx_msdu_desc_info structure.
1348  *
1349  */
1350 static void *hal_rx_msdu_desc_info_get_ptr_kiwi(void *msdu_details_ptr)
1351 {
1352 	return HAL_RX_MSDU_DESC_INFO_GET(msdu_details_ptr);
1353 }
1354 
1355 /**
1356  * hal_rx_link_desc_msdu0_ptr_kiwi() - Get pointer to rx_msdu details
1357  * @link_desc: Pointer to link desc
1358  *
1359  * Return: Pointer to rx_msdu_details structure
1360  *
1361  */
1362 static void *hal_rx_link_desc_msdu0_ptr_kiwi(void *link_desc)
1363 {
1364 	return HAL_RX_LINK_DESC_MSDU0_PTR(link_desc);
1365 }
1366 
1367 /**
1368  * hal_get_window_address_kiwi(): Function to get hp/tp address
1369  * @hal_soc: Pointer to hal_soc
1370  * @addr: address offset of register
1371  *
1372  * Return: modified address offset of register
1373  */
1374 static inline qdf_iomem_t hal_get_window_address_kiwi(struct hal_soc *hal_soc,
1375 						      qdf_iomem_t addr)
1376 {
1377 	return addr;
1378 }
1379 
1380 /**
1381  * hal_reo_set_err_dst_remap_kiwi(): Function to set REO error destination
1382  *				     ring remap register
1383  * @hal_soc: Pointer to hal_soc
1384  *
1385  * Return: none.
1386  */
1387 static void
1388 hal_reo_set_err_dst_remap_kiwi(void *hal_soc)
1389 {
1390 	/*
1391 	 * Set REO error 2k jump (error code 5) / OOR (error code 7)
1392 	 * frame routed to REO2SW0 ring.
1393 	 */
1394 	uint32_t dst_remap_ix0 =
1395 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_TCL, 0) |
1396 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_TCL, 1) |
1397 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_TCL, 2) |
1398 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_TCL, 3) |
1399 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_TCL, 4) |
1400 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_TCL, 5) |
1401 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_TCL, 6) |
1402 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_TCL, 7);
1403 
1404 	uint32_t dst_remap_ix1 =
1405 		HAL_REO_ERR_REMAP_IX1(REO_REMAP_TCL, 14) |
1406 		HAL_REO_ERR_REMAP_IX1(REO_REMAP_TCL, 13) |
1407 		HAL_REO_ERR_REMAP_IX1(REO_REMAP_TCL, 12) |
1408 		HAL_REO_ERR_REMAP_IX1(REO_REMAP_TCL, 11) |
1409 		HAL_REO_ERR_REMAP_IX1(REO_REMAP_TCL, 10) |
1410 		HAL_REO_ERR_REMAP_IX1(REO_REMAP_TCL, 9) |
1411 		HAL_REO_ERR_REMAP_IX1(REO_REMAP_TCL, 8);
1412 
1413 		HAL_REG_WRITE(hal_soc,
1414 			      HWIO_REO_R0_ERROR_DESTINATION_MAPPING_IX_0_ADDR(
1415 			      REO_REG_REG_BASE),
1416 			      dst_remap_ix0);
1417 
1418 		hal_info("HWIO_REO_R0_ERROR_DESTINATION_MAPPING_IX_0 0x%x",
1419 			 HAL_REG_READ(
1420 			 hal_soc,
1421 			 HWIO_REO_R0_ERROR_DESTINATION_MAPPING_IX_0_ADDR(
1422 			 REO_REG_REG_BASE)));
1423 
1424 		HAL_REG_WRITE(hal_soc,
1425 			      HWIO_REO_R0_ERROR_DESTINATION_MAPPING_IX_1_ADDR(
1426 			      REO_REG_REG_BASE),
1427 			      dst_remap_ix1);
1428 
1429 		hal_info("HWIO_REO_R0_ERROR_DESTINATION_MAPPING_IX_1 0x%x",
1430 			 HAL_REG_READ(
1431 			 hal_soc,
1432 			 HWIO_REO_R0_ERROR_DESTINATION_MAPPING_IX_1_ADDR(
1433 			 REO_REG_REG_BASE)));
1434 }
1435 
1436 /**
1437  * hal_reo_enable_pn_in_dest_kiwi() - Set the REO register to enable previous PN
1438  *				for OOR and 2K-jump frames
1439  * @hal_soc: HAL SoC handle
1440  *
1441  * Return: 1, since the register is set.
1442  */
1443 static uint8_t hal_reo_enable_pn_in_dest_kiwi(void *hal_soc)
1444 {
1445 	HAL_REG_WRITE(hal_soc, HWIO_REO_R0_PN_IN_DEST_ADDR(REO_REG_REG_BASE),
1446 		      1);
1447 	return 1;
1448 }
1449 
1450 /**
1451  * hal_rx_flow_setup_fse_kiwi() - Setup a flow search entry in HW FST
1452  * @rx_fst: Pointer to the Rx Flow Search Table
1453  * @table_offset: offset into the table where the flow is to be setup
1454  * @rx_flow: Flow Parameters
1455  *
1456  * Flow table entry fields are updated in host byte order, little endian order.
1457  *
1458  * Return: Success/Failure
1459  */
1460 static void *
1461 hal_rx_flow_setup_fse_kiwi(uint8_t *rx_fst, uint32_t table_offset,
1462 			   uint8_t *rx_flow)
1463 {
1464 	struct hal_rx_fst *fst = (struct hal_rx_fst *)rx_fst;
1465 	struct hal_rx_flow *flow = (struct hal_rx_flow *)rx_flow;
1466 	uint8_t *fse;
1467 	bool fse_valid;
1468 
1469 	if (table_offset >= fst->max_entries) {
1470 		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
1471 			  "HAL FSE table offset %u exceeds max entries %u",
1472 			  table_offset, fst->max_entries);
1473 		return NULL;
1474 	}
1475 
1476 	fse = (uint8_t *)fst->base_vaddr +
1477 		(table_offset * HAL_RX_FST_ENTRY_SIZE);
1478 
1479 	fse_valid = HAL_GET_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID);
1480 
1481 	if (fse_valid) {
1482 		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
1483 			  "HAL FSE %pK already valid", fse);
1484 		return NULL;
1485 	}
1486 
1487 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_127_96) =
1488 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_127_96,
1489 			       (flow->tuple_info.src_ip_127_96));
1490 
1491 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_95_64) =
1492 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_95_64,
1493 			       (flow->tuple_info.src_ip_95_64));
1494 
1495 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_63_32) =
1496 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_63_32,
1497 			       (flow->tuple_info.src_ip_63_32));
1498 
1499 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_31_0) =
1500 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_31_0,
1501 			       (flow->tuple_info.src_ip_31_0));
1502 
1503 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_127_96) =
1504 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_127_96,
1505 			       (flow->tuple_info.dest_ip_127_96));
1506 
1507 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_95_64) =
1508 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_95_64,
1509 			       (flow->tuple_info.dest_ip_95_64));
1510 
1511 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_63_32) =
1512 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_63_32,
1513 			       (flow->tuple_info.dest_ip_63_32));
1514 
1515 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_31_0) =
1516 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_31_0,
1517 			       (flow->tuple_info.dest_ip_31_0));
1518 
1519 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_PORT);
1520 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_PORT) |=
1521 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_PORT,
1522 			       (flow->tuple_info.dest_port));
1523 
1524 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_PORT);
1525 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_PORT) |=
1526 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_PORT,
1527 			       (flow->tuple_info.src_port));
1528 
1529 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL);
1530 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL) |=
1531 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL,
1532 			       flow->tuple_info.l4_protocol);
1533 
1534 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER);
1535 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER) |=
1536 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER,
1537 			       flow->reo_destination_handler);
1538 
1539 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID);
1540 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID) |=
1541 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, VALID, 1);
1542 
1543 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, METADATA);
1544 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, METADATA) =
1545 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, METADATA,
1546 			       (flow->fse_metadata));
1547 
1548 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_INDICATION);
1549 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_INDICATION) |=
1550 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY,
1551 			       REO_DESTINATION_INDICATION,
1552 			       flow->reo_destination_indication);
1553 
1554 	/* Reset all the other fields in FSE */
1555 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, RESERVED_9);
1556 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_DROP);
1557 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_COUNT);
1558 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_BYTE_COUNT);
1559 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, TIMESTAMP);
1560 
1561 	return fse;
1562 }
1563 
1564 /**
1565  * hal_rx_flow_setup_cmem_fse_kiwi() - Setup a flow search entry in HW CMEM FST
1566  * @hal_soc: hal_soc reference
1567  * @cmem_ba: CMEM base address
1568  * @table_offset: offset into the table where the flow is to be setup
1569  * @rx_flow: Flow Parameters
1570  *
1571  * Return: Success/Failure
1572  */
1573 static uint32_t
1574 hal_rx_flow_setup_cmem_fse_kiwi(struct hal_soc *hal_soc, uint32_t cmem_ba,
1575 				uint32_t table_offset, uint8_t *rx_flow)
1576 {
1577 	struct hal_rx_flow *flow = (struct hal_rx_flow *)rx_flow;
1578 	uint32_t fse_offset;
1579 	uint32_t value;
1580 
1581 	fse_offset = cmem_ba + (table_offset * HAL_RX_FST_ENTRY_SIZE);
1582 
1583 	/* Reset the Valid bit */
1584 	HAL_CMEM_WRITE(hal_soc, fse_offset + HAL_OFFSET(RX_FLOW_SEARCH_ENTRY,
1585 							VALID), 0);
1586 
1587 	value  = HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_127_96,
1588 				(flow->tuple_info.src_ip_127_96));
1589 	HAL_CMEM_WRITE(hal_soc, fse_offset + HAL_OFFSET(RX_FLOW_SEARCH_ENTRY,
1590 							SRC_IP_127_96), value);
1591 
1592 	value  = HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_95_64,
1593 				(flow->tuple_info.src_ip_95_64));
1594 	HAL_CMEM_WRITE(hal_soc, fse_offset + HAL_OFFSET(RX_FLOW_SEARCH_ENTRY,
1595 							SRC_IP_95_64), value);
1596 
1597 	value  = HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_63_32,
1598 				(flow->tuple_info.src_ip_63_32));
1599 	HAL_CMEM_WRITE(hal_soc, fse_offset + HAL_OFFSET(RX_FLOW_SEARCH_ENTRY,
1600 							SRC_IP_63_32), value);
1601 
1602 	value  = HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_31_0,
1603 				(flow->tuple_info.src_ip_31_0));
1604 	HAL_CMEM_WRITE(hal_soc, fse_offset + HAL_OFFSET(RX_FLOW_SEARCH_ENTRY,
1605 							SRC_IP_31_0), value);
1606 
1607 	value  = HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_127_96,
1608 				(flow->tuple_info.dest_ip_127_96));
1609 	HAL_CMEM_WRITE(hal_soc, fse_offset + HAL_OFFSET(RX_FLOW_SEARCH_ENTRY,
1610 							DEST_IP_127_96), value);
1611 
1612 	value  = HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_95_64,
1613 				(flow->tuple_info.dest_ip_95_64));
1614 	HAL_CMEM_WRITE(hal_soc, fse_offset + HAL_OFFSET(RX_FLOW_SEARCH_ENTRY,
1615 							DEST_IP_95_64), value);
1616 
1617 	value  = HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_63_32,
1618 				(flow->tuple_info.dest_ip_63_32));
1619 	HAL_CMEM_WRITE(hal_soc, fse_offset + HAL_OFFSET(RX_FLOW_SEARCH_ENTRY,
1620 							DEST_IP_63_32), value);
1621 
1622 	value  = HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_31_0,
1623 				(flow->tuple_info.dest_ip_31_0));
1624 	HAL_CMEM_WRITE(hal_soc, fse_offset + HAL_OFFSET(RX_FLOW_SEARCH_ENTRY,
1625 							DEST_IP_31_0), value);
1626 
1627 	value = 0 | HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_PORT,
1628 				(flow->tuple_info.dest_port));
1629 	value |= HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_PORT,
1630 				(flow->tuple_info.src_port));
1631 	HAL_CMEM_WRITE(hal_soc, fse_offset + HAL_OFFSET(RX_FLOW_SEARCH_ENTRY,
1632 							SRC_PORT), value);
1633 
1634 	value  = HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, METADATA,
1635 				(flow->fse_metadata));
1636 	HAL_CMEM_WRITE(hal_soc, fse_offset + HAL_OFFSET(RX_FLOW_SEARCH_ENTRY,
1637 							METADATA), value);
1638 
1639 	/* Reset all the other fields in FSE */
1640 	HAL_CMEM_WRITE(hal_soc, fse_offset + HAL_OFFSET(RX_FLOW_SEARCH_ENTRY,
1641 							MSDU_COUNT), 0);
1642 	HAL_CMEM_WRITE(hal_soc, fse_offset + HAL_OFFSET(RX_FLOW_SEARCH_ENTRY,
1643 							MSDU_BYTE_COUNT), 0);
1644 	HAL_CMEM_WRITE(hal_soc, fse_offset + HAL_OFFSET(RX_FLOW_SEARCH_ENTRY,
1645 							TIMESTAMP), 0);
1646 
1647 	value = 0 | HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL,
1648 				   flow->tuple_info.l4_protocol);
1649 	value |= HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER,
1650 				flow->reo_destination_handler);
1651 	value |= HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY,
1652 				REO_DESTINATION_INDICATION,
1653 				flow->reo_destination_indication);
1654 	value |= HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, VALID, 1);
1655 	HAL_CMEM_WRITE(hal_soc, fse_offset + HAL_OFFSET(RX_FLOW_SEARCH_ENTRY,
1656 							L4_PROTOCOL), value);
1657 
1658 	return fse_offset;
1659 }
1660 
1661 /**
1662  * hal_rx_flow_get_cmem_fse_ts_kiwi() - Get timestamp field from CMEM FSE
1663  * @hal_soc: hal_soc reference
1664  * @fse_offset: CMEM FSE offset
1665  *
1666  * Return: Timestamp
1667  */
1668 static uint32_t hal_rx_flow_get_cmem_fse_ts_kiwi(struct hal_soc *hal_soc,
1669 						 uint32_t fse_offset)
1670 {
1671 	return HAL_CMEM_READ(hal_soc, fse_offset +
1672 			     HAL_OFFSET(RX_FLOW_SEARCH_ENTRY, TIMESTAMP));
1673 }
1674 
1675 /**
1676  * hal_rx_flow_get_cmem_fse_kiwi() - Get FSE from CMEM
1677  * @hal_soc: hal_soc reference
1678  * @fse_offset: CMEM FSE offset
1679  * @fse: reference where FSE will be copied
1680  * @len: length of FSE
1681  *
1682  * Return: If read is successful or not
1683  */
1684 static void
1685 hal_rx_flow_get_cmem_fse_kiwi(struct hal_soc *hal_soc, uint32_t fse_offset,
1686 			      uint32_t *fse, qdf_size_t len)
1687 {
1688 	int i;
1689 
1690 	if (len != HAL_RX_FST_ENTRY_SIZE)
1691 		return;
1692 
1693 	for (i = 0; i < NUM_OF_DWORDS_RX_FLOW_SEARCH_ENTRY; i++)
1694 		fse[i] = HAL_CMEM_READ(hal_soc, fse_offset + i * 4);
1695 }
1696 
1697 static
1698 void hal_compute_reo_remap_ix2_ix3_kiwi(uint32_t *ring_map,
1699 					uint32_t num_rings, uint32_t *remap1,
1700 					uint32_t *remap2)
1701 {
1702 
1703 	switch (num_rings) {
1704 	/* should we have all the different possible ring configs */
1705 	default:
1706 	case 3:
1707 		*remap1 = HAL_REO_REMAP_IX2(ring_map[0], 16) |
1708 			  HAL_REO_REMAP_IX2(ring_map[1], 17) |
1709 			  HAL_REO_REMAP_IX2(ring_map[2], 18) |
1710 			  HAL_REO_REMAP_IX2(ring_map[0], 19) |
1711 			  HAL_REO_REMAP_IX2(ring_map[1], 20) |
1712 			  HAL_REO_REMAP_IX2(ring_map[2], 21) |
1713 			  HAL_REO_REMAP_IX2(ring_map[0], 22) |
1714 			  HAL_REO_REMAP_IX2(ring_map[1], 23);
1715 
1716 		*remap2 = HAL_REO_REMAP_IX3(ring_map[2], 24) |
1717 			  HAL_REO_REMAP_IX3(ring_map[0], 25) |
1718 			  HAL_REO_REMAP_IX3(ring_map[1], 26) |
1719 			  HAL_REO_REMAP_IX3(ring_map[2], 27) |
1720 			  HAL_REO_REMAP_IX3(ring_map[0], 28) |
1721 			  HAL_REO_REMAP_IX3(ring_map[1], 29) |
1722 			  HAL_REO_REMAP_IX3(ring_map[2], 30) |
1723 			  HAL_REO_REMAP_IX3(ring_map[0], 31);
1724 		break;
1725 	case 4:
1726 		*remap1 = HAL_REO_REMAP_IX2(ring_map[0], 16) |
1727 			  HAL_REO_REMAP_IX2(ring_map[1], 17) |
1728 			  HAL_REO_REMAP_IX2(ring_map[2], 18) |
1729 			  HAL_REO_REMAP_IX2(ring_map[3], 19) |
1730 			  HAL_REO_REMAP_IX2(ring_map[0], 20) |
1731 			  HAL_REO_REMAP_IX2(ring_map[1], 21) |
1732 			  HAL_REO_REMAP_IX2(ring_map[2], 22) |
1733 			  HAL_REO_REMAP_IX2(ring_map[3], 23);
1734 
1735 		*remap2 = HAL_REO_REMAP_IX3(ring_map[0], 24) |
1736 			  HAL_REO_REMAP_IX3(ring_map[1], 25) |
1737 			  HAL_REO_REMAP_IX3(ring_map[2], 26) |
1738 			  HAL_REO_REMAP_IX3(ring_map[3], 27) |
1739 			  HAL_REO_REMAP_IX3(ring_map[0], 28) |
1740 			  HAL_REO_REMAP_IX3(ring_map[1], 29) |
1741 			  HAL_REO_REMAP_IX3(ring_map[2], 30) |
1742 			  HAL_REO_REMAP_IX3(ring_map[3], 31);
1743 		break;
1744 	case 6:
1745 		*remap1 = HAL_REO_REMAP_IX2(ring_map[0], 16) |
1746 			  HAL_REO_REMAP_IX2(ring_map[1], 17) |
1747 			  HAL_REO_REMAP_IX2(ring_map[2], 18) |
1748 			  HAL_REO_REMAP_IX2(ring_map[3], 19) |
1749 			  HAL_REO_REMAP_IX2(ring_map[4], 20) |
1750 			  HAL_REO_REMAP_IX2(ring_map[5], 21) |
1751 			  HAL_REO_REMAP_IX2(ring_map[0], 22) |
1752 			  HAL_REO_REMAP_IX2(ring_map[1], 23);
1753 
1754 		*remap2 = HAL_REO_REMAP_IX3(ring_map[2], 24) |
1755 			  HAL_REO_REMAP_IX3(ring_map[3], 25) |
1756 			  HAL_REO_REMAP_IX3(ring_map[4], 26) |
1757 			  HAL_REO_REMAP_IX3(ring_map[5], 27) |
1758 			  HAL_REO_REMAP_IX3(ring_map[0], 28) |
1759 			  HAL_REO_REMAP_IX3(ring_map[1], 29) |
1760 			  HAL_REO_REMAP_IX3(ring_map[2], 30) |
1761 			  HAL_REO_REMAP_IX3(ring_map[3], 31);
1762 		break;
1763 	case 8:
1764 		*remap1 = HAL_REO_REMAP_IX2(ring_map[0], 16) |
1765 			  HAL_REO_REMAP_IX2(ring_map[1], 17) |
1766 			  HAL_REO_REMAP_IX2(ring_map[2], 18) |
1767 			  HAL_REO_REMAP_IX2(ring_map[3], 19) |
1768 			  HAL_REO_REMAP_IX2(ring_map[4], 20) |
1769 			  HAL_REO_REMAP_IX2(ring_map[5], 21) |
1770 			  HAL_REO_REMAP_IX2(ring_map[6], 22) |
1771 			  HAL_REO_REMAP_IX2(ring_map[7], 23);
1772 
1773 		*remap2 = HAL_REO_REMAP_IX3(ring_map[0], 24) |
1774 			  HAL_REO_REMAP_IX3(ring_map[1], 25) |
1775 			  HAL_REO_REMAP_IX3(ring_map[2], 26) |
1776 			  HAL_REO_REMAP_IX3(ring_map[3], 27) |
1777 			  HAL_REO_REMAP_IX3(ring_map[4], 28) |
1778 			  HAL_REO_REMAP_IX3(ring_map[5], 29) |
1779 			  HAL_REO_REMAP_IX3(ring_map[6], 30) |
1780 			  HAL_REO_REMAP_IX3(ring_map[7], 31);
1781 		break;
1782 	}
1783 }
1784 
1785 /* NUM TCL Bank registers in KIWI */
1786 #define HAL_NUM_TCL_BANKS_KIWI 8
1787 
1788 /**
1789  * hal_tx_get_num_tcl_banks_kiwi() - Get number of banks in target
1790  *
1791  * Returns: number of bank
1792  */
1793 static uint8_t hal_tx_get_num_tcl_banks_kiwi(void)
1794 {
1795 	return HAL_NUM_TCL_BANKS_KIWI;
1796 }
1797 
1798 /**
1799  * hal_rx_reo_prev_pn_get_kiwi() - Get the previous PN from the REO ring desc.
1800  * @ring_desc: REO ring descriptor [To be validated by caller ]
1801  * @prev_pn: Buffer where the previous PN is to be populated.
1802  *		[To be validated by caller]
1803  *
1804  * Return: None
1805  */
1806 static void hal_rx_reo_prev_pn_get_kiwi(void *ring_desc,
1807 					uint64_t *prev_pn)
1808 {
1809 	struct reo_destination_ring_with_pn *reo_desc =
1810 		(struct reo_destination_ring_with_pn *)ring_desc;
1811 
1812 	*prev_pn = reo_desc->prev_pn_23_0;
1813 	*prev_pn |= ((uint64_t)reo_desc->prev_pn_55_24 << 24);
1814 }
1815 
1816 /**
1817  * hal_cmem_write_kiwi() - function for CMEM buffer writing
1818  * @hal_soc_hdl: HAL SOC handle
1819  * @offset: CMEM address
1820  * @value: value to write
1821  *
1822  * Return: None.
1823  */
1824 static inline void hal_cmem_write_kiwi(hal_soc_handle_t hal_soc_hdl,
1825 				       uint32_t offset,
1826 				       uint32_t value)
1827 {
1828 	struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl;
1829 
1830 	hal_write32_mb(hal, offset, value);
1831 }
1832 
1833 /**
1834  * hal_get_idle_link_bm_id_kiwi() - Get idle link BM id from chid_id
1835  * @chip_id: mlo chip_id
1836  *
1837  * Returns: RBM ID
1838  */
1839 static uint8_t hal_get_idle_link_bm_id_kiwi(uint8_t chip_id)
1840 {
1841 	return WBM_IDLE_DESC_LIST;
1842 }
1843 
1844 #ifdef WLAN_FEATURE_MARK_FIRST_WAKEUP_PACKET
1845 /**
1846  * hal_get_first_wow_wakeup_packet_kiwi(): Function to get if the buffer
1847  * is the first one that wakes up host from WoW.
1848  *
1849  * @buf: network buffer
1850  *
1851  * Dummy function for KIWI
1852  *
1853  * Returns: 1 to indicate it is first packet received that wakes up host from
1854  *	    WoW. Otherwise 0
1855  */
1856 static inline uint8_t hal_get_first_wow_wakeup_packet_kiwi(uint8_t *buf)
1857 {
1858 	return 0;
1859 }
1860 #endif
1861 
1862 static uint16_t hal_get_rx_max_ba_window_kiwi(int tid)
1863 {
1864 	return HAL_RX_BA_WINDOW_1024;
1865 }
1866 
1867 /**
1868  * hal_get_reo_qdesc_size_kiwi()- Get the reo queue descriptor size
1869  *				  from the give Block-Ack window size
1870  * @ba_window_size: Block-Ack window size
1871  * @tid: TID
1872  *
1873  * Return: reo queue descriptor size
1874  */
1875 static uint32_t hal_get_reo_qdesc_size_kiwi(uint32_t ba_window_size, int tid)
1876 {
1877 	/* Hardcode the ba_window_size to HAL_RX_MAX_BA_WINDOW for
1878 	 * NON_QOS_TID until HW issues are resolved.
1879 	 */
1880 	if (tid != HAL_NON_QOS_TID)
1881 		ba_window_size = hal_get_rx_max_ba_window_kiwi(tid);
1882 
1883 	/* Return descriptor size corresponding to window size of 2 since
1884 	 * we set ba_window_size to 2 while setting up REO descriptors as
1885 	 * a WAR to get 2k jump exception aggregates are received without
1886 	 * a BA session.
1887 	 */
1888 	if (ba_window_size <= 1) {
1889 		if (tid != HAL_NON_QOS_TID)
1890 			return sizeof(struct rx_reo_queue) +
1891 				sizeof(struct rx_reo_queue_ext);
1892 		else
1893 			return sizeof(struct rx_reo_queue);
1894 	}
1895 
1896 	if (ba_window_size <= 105)
1897 		return sizeof(struct rx_reo_queue) +
1898 			sizeof(struct rx_reo_queue_ext);
1899 
1900 	if (ba_window_size <= 210)
1901 		return sizeof(struct rx_reo_queue) +
1902 			(2 * sizeof(struct rx_reo_queue_ext));
1903 
1904 	if (ba_window_size <= 256)
1905 		return sizeof(struct rx_reo_queue) +
1906 			(3 * sizeof(struct rx_reo_queue_ext));
1907 
1908 	return sizeof(struct rx_reo_queue) +
1909 		(10 * sizeof(struct rx_reo_queue_ext)) +
1910 		sizeof(struct rx_reo_queue_1k);
1911 }
1912 
1913 #ifdef QCA_GET_TSF_VIA_REG
1914 static inline uint32_t
1915 hal_tsf_read_scratch_reg(struct hal_soc *soc,
1916 			 enum hal_scratch_reg_enum reg_enum)
1917 {
1918 	return hal_read32_mb(soc, PMM_REG_BASE + (reg_enum * 4));
1919 }
1920 
1921 static inline
1922 uint64_t hal_tsf_get_fw_time(struct hal_soc *soc)
1923 {
1924 	uint64_t fw_time_low;
1925 	uint64_t fw_time_high;
1926 
1927 	fw_time_low = hal_read32_mb(soc, PCIE_PCIE_MHI_TIME_LOW);
1928 	fw_time_high = hal_read32_mb(soc, PCIE_PCIE_MHI_TIME_HIGH);
1929 	return (fw_time_high << 32 | fw_time_low);
1930 }
1931 
1932 static inline
1933 uint64_t hal_fw_qtime_to_usecs(uint64_t time)
1934 {
1935 	/*
1936 	 * Try to preserve precision by multiplying by 10 first.
1937 	 * If that would cause a wrap around, divide first instead.
1938 	 */
1939 	if (time * 10 < time) {
1940 		time = qdf_do_div(time, FW_QTIME_CYCLES_PER_10_USEC);
1941 		return time * 10;
1942 	}
1943 
1944 	time = time * 10;
1945 	time = qdf_do_div(time, FW_QTIME_CYCLES_PER_10_USEC);
1946 
1947 	return time;
1948 }
1949 
1950 /**
1951  * hal_get_tsf_time_kiwi() - Get tsf time from scratch register
1952  * @hal_soc_hdl: HAL soc handle
1953  * @tsf_id: TSF id
1954  * @mac_id: mac_id
1955  * @tsf: pointer to update tsf value
1956  * @tsf_sync_soc_time: pointer to update tsf sync time
1957  *
1958  * Return: None.
1959  */
1960 static void
1961 hal_get_tsf_time_kiwi(hal_soc_handle_t hal_soc_hdl, uint32_t tsf_id,
1962 		      uint32_t mac_id, uint64_t *tsf,
1963 		      uint64_t *tsf_sync_soc_time)
1964 {
1965 	struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
1966 	uint64_t global_time_low_offset, global_time_high_offset;
1967 	uint64_t tsf_offset_low, tsf_offset_hi;
1968 	uint64_t fw_time, global_time, sync_time;
1969 	enum hal_scratch_reg_enum tsf_enum_low = 0, tsf_enum_high = 0;
1970 
1971 	if (hif_force_wake_request(soc->hif_handle))
1972 		return;
1973 
1974 	hal_get_tsf_enum(tsf_id, mac_id, &tsf_enum_low, &tsf_enum_high);
1975 	sync_time = qdf_get_log_timestamp();
1976 	fw_time = hal_tsf_get_fw_time(soc);
1977 
1978 	global_time_low_offset =
1979 		hal_tsf_read_scratch_reg(soc, PMM_QTIMER_GLOBAL_OFFSET_LO_US);
1980 	global_time_high_offset =
1981 		hal_tsf_read_scratch_reg(soc, PMM_QTIMER_GLOBAL_OFFSET_HI_US);
1982 
1983 	tsf_offset_low = hal_tsf_read_scratch_reg(soc, tsf_enum_low);
1984 	tsf_offset_hi = hal_tsf_read_scratch_reg(soc, tsf_enum_high);
1985 
1986 	fw_time = hal_fw_qtime_to_usecs(fw_time);
1987 	global_time = fw_time +
1988 		      (global_time_low_offset |
1989 		      (global_time_high_offset << 32));
1990 
1991 	*tsf = global_time + (tsf_offset_low | (tsf_offset_hi << 32));
1992 	*tsf_sync_soc_time = qdf_log_timestamp_to_usecs(sync_time);
1993 
1994 	hif_force_wake_release(soc->hif_handle);
1995 }
1996 #else
1997 static inline void
1998 hal_get_tsf_time_kiwi(hal_soc_handle_t hal_soc_hdl, uint32_t tsf_id,
1999 		      uint32_t mac_id, uint64_t *tsf,
2000 		      uint64_t *tsf_sync_soc_time)
2001 {
2002 }
2003 #endif
2004 
2005 static QDF_STATUS hal_rx_reo_ent_get_src_link_id_kiwi(hal_rxdma_desc_t rx_desc,
2006 						      uint8_t *src_link_id)
2007 {
2008 	struct reo_entrance_ring *reo_ent_desc =
2009 					(struct reo_entrance_ring *)rx_desc;
2010 
2011 	*src_link_id = reo_ent_desc->src_link_id;
2012 
2013 	return QDF_STATUS_SUCCESS;
2014 }
2015 
2016 /**
2017  * hal_rx_en_mcast_fp_data_filter_kiwi() - Is mcast filter pass enabled
2018  *
2019  * Return: false for BE MCC
2020  */
2021 static inline
2022 bool hal_rx_en_mcast_fp_data_filter_kiwi(void)
2023 {
2024 	return false;
2025 }
2026 
2027 #ifdef QCA_WIFI_KIWI_V2
2028 /**
2029  * hal_srng_dst_hw_init_misc_1_kiwi() - Function to initialize MISC_1 register
2030  *                                      of destination ring HW
2031  * @srng: SRNG ring pointer
2032  *
2033  * Return: None
2034  */
2035 static inline
2036 void hal_srng_dst_hw_init_misc_1_kiwi(struct hal_srng *srng)
2037 {
2038 	uint32_t reg_val = 0;
2039 
2040 	/* number threshold for pointer update */
2041 	if (srng->pointer_num_threshold)
2042 		reg_val |= SRNG_SM(SRNG_DST_HW_FLD(MISC_1,
2043 						   NUM_THRESHOLD_TO_UPDATE),
2044 				   srng->pointer_num_threshold);
2045 	/* timer threshold for pointer update */
2046 	if (srng->pointer_timer_threshold)
2047 		reg_val |= SRNG_SM(SRNG_DST_HW_FLD(MISC_1,
2048 						   TIME_THRESHOLD_TO_UPDATE),
2049 				   srng->pointer_timer_threshold);
2050 
2051 	if (reg_val)
2052 		SRNG_DST_REG_WRITE(srng, MISC_1, reg_val);
2053 }
2054 
2055 /**
2056  * hal_srng_hw_reg_offset_init_misc_1_kiwi() - Initialize the HW srng register
2057  *                                             offset of MISC_1
2058  * @hal_soc: HAL Soc handle
2059  *
2060  * Return: None
2061  */
2062 static inline
2063 void hal_srng_hw_reg_offset_init_misc_1_kiwi(struct hal_soc *hal_soc)
2064 {
2065 	int32_t *hw_reg_offset = hal_soc->hal_hw_reg_offset;
2066 
2067 	hw_reg_offset[DST_MISC_1] = REG_OFFSET(DST, MISC_1);
2068 }
2069 #else
2070 static inline
2071 void hal_srng_dst_hw_init_misc_1_kiwi(struct hal_srng *srng)
2072 {
2073 }
2074 
2075 static inline
2076 void hal_srng_hw_reg_offset_init_misc_1_kiwi(struct hal_soc *hal_soc)
2077 {
2078 }
2079 #endif
2080 
2081 /**
2082  * hal_srng_dst_hw_init_kiwi() - Function to initialize SRNG
2083  *                               destination ring HW
2084  * @hal_soc: HAL SOC handle
2085  * @srng: SRNG ring pointer
2086  * @idle_check: Check if ring is idle
2087  * @idx: Ring index
2088  *
2089  * Return: None
2090  */
2091 static inline
2092 void hal_srng_dst_hw_init_kiwi(struct hal_soc *hal_soc,
2093 			       struct hal_srng *srng,
2094 			       bool idle_check,
2095 			       uint32_t idx)
2096 {
2097 	hal_srng_dst_hw_init_misc_1_kiwi(srng);
2098 
2099 	hal_srng_dst_hw_init_generic(hal_soc, srng, idle_check, idx);
2100 }
2101 
2102 static void hal_hw_txrx_ops_attach_kiwi(struct hal_soc *hal_soc)
2103 {
2104 	/* init and setup */
2105 	hal_soc->ops->hal_srng_dst_hw_init = hal_srng_dst_hw_init_kiwi;
2106 	hal_soc->ops->hal_srng_src_hw_init = hal_srng_src_hw_init_generic;
2107 	hal_soc->ops->hal_get_hw_hptp = hal_get_hw_hptp_generic;
2108 	hal_soc->ops->hal_get_window_address = hal_get_window_address_kiwi;
2109 	hal_soc->ops->hal_reo_set_err_dst_remap =
2110 						hal_reo_set_err_dst_remap_kiwi;
2111 	hal_soc->ops->hal_reo_enable_pn_in_dest =
2112 						hal_reo_enable_pn_in_dest_kiwi;
2113 	/* Overwrite the default BE ops */
2114 	hal_soc->ops->hal_get_rx_max_ba_window = hal_get_rx_max_ba_window_kiwi;
2115 	hal_soc->ops->hal_get_reo_qdesc_size = hal_get_reo_qdesc_size_kiwi;
2116 
2117 	/* tx */
2118 	hal_soc->ops->hal_tx_set_dscp_tid_map = hal_tx_set_dscp_tid_map_kiwi;
2119 	hal_soc->ops->hal_tx_update_dscp_tid = hal_tx_update_dscp_tid_kiwi;
2120 	hal_soc->ops->hal_tx_comp_get_status =
2121 					hal_tx_comp_get_status_generic_be;
2122 	hal_soc->ops->hal_tx_init_cmd_credit_ring =
2123 					hal_tx_init_cmd_credit_ring_kiwi;
2124 	hal_soc->ops->hal_tx_config_rbm_mapping_be =
2125 				hal_tx_config_rbm_mapping_be_kiwi;
2126 
2127 	/* rx */
2128 	hal_soc->ops->hal_rx_msdu_start_nss_get = hal_rx_tlv_nss_get_be;
2129 	hal_soc->ops->hal_rx_mon_hw_desc_get_mpdu_status =
2130 		hal_rx_mon_hw_desc_get_mpdu_status_be;
2131 	hal_soc->ops->hal_rx_get_tlv = hal_rx_get_tlv_kiwi;
2132 	hal_soc->ops->hal_rx_pkt_hdr_get = hal_rx_pkt_hdr_get_be;
2133 	hal_soc->ops->hal_rx_proc_phyrx_other_receive_info_tlv =
2134 		hal_rx_proc_phyrx_other_receive_info_tlv_kiwi;
2135 
2136 	hal_soc->ops->hal_rx_dump_msdu_end_tlv = hal_rx_dump_msdu_end_tlv_kiwi;
2137 	hal_soc->ops->hal_rx_dump_mpdu_start_tlv =
2138 					hal_rx_dump_mpdu_start_tlv_kiwi;
2139 	hal_soc->ops->hal_rx_dump_pkt_tlvs = hal_rx_dump_pkt_tlvs_kiwi;
2140 	hal_soc->ops->hal_rx_desc_get_80211_hdr = hal_rx_desc_get_80211_hdr_be;
2141 
2142 	hal_soc->ops->hal_get_link_desc_size = hal_get_link_desc_size_kiwi;
2143 	hal_soc->ops->hal_rx_mpdu_start_tid_get = hal_rx_tlv_tid_get_be;
2144 	hal_soc->ops->hal_rx_msdu_start_reception_type_get =
2145 		hal_rx_tlv_reception_type_get_be;
2146 	hal_soc->ops->hal_rx_msdu_end_da_idx_get =
2147 					hal_rx_msdu_end_da_idx_get_be;
2148 	hal_soc->ops->hal_rx_msdu_desc_info_get_ptr =
2149 					hal_rx_msdu_desc_info_get_ptr_kiwi;
2150 	hal_soc->ops->hal_rx_link_desc_msdu0_ptr =
2151 					hal_rx_link_desc_msdu0_ptr_kiwi;
2152 	hal_soc->ops->hal_reo_status_get_header =
2153 					hal_reo_status_get_header_kiwi;
2154 	hal_soc->ops->hal_rx_status_get_tlv_info =
2155 					hal_rx_status_get_tlv_info_wrapper_be;
2156 	hal_soc->ops->hal_rx_wbm_err_info_get =
2157 					hal_rx_wbm_err_info_get_generic_be;
2158 	hal_soc->ops->hal_rx_priv_info_set_in_tlv =
2159 					hal_rx_priv_info_set_in_tlv_be;
2160 	hal_soc->ops->hal_rx_priv_info_get_from_tlv =
2161 					hal_rx_priv_info_get_from_tlv_be;
2162 
2163 	hal_soc->ops->hal_tx_set_pcp_tid_map =
2164 					hal_tx_set_pcp_tid_map_generic_be;
2165 	hal_soc->ops->hal_tx_update_pcp_tid_map =
2166 					hal_tx_update_pcp_tid_generic_be;
2167 	hal_soc->ops->hal_tx_set_tidmap_prty =
2168 					hal_tx_update_tidmap_prty_generic_be;
2169 	hal_soc->ops->hal_rx_get_rx_fragment_number =
2170 					hal_rx_get_rx_fragment_number_be;
2171 	hal_soc->ops->hal_rx_msdu_end_da_is_mcbc_get =
2172 					hal_rx_tlv_da_is_mcbc_get_be;
2173 	hal_soc->ops->hal_rx_msdu_end_sa_is_valid_get =
2174 		hal_rx_tlv_sa_is_valid_get_be;
2175 	hal_soc->ops->hal_rx_msdu_end_sa_idx_get = hal_rx_tlv_sa_idx_get_be,
2176 	hal_soc->ops->hal_rx_desc_is_first_msdu =
2177 					hal_rx_desc_is_first_msdu_be;
2178 	hal_soc->ops->hal_rx_msdu_end_l3_hdr_padding_get =
2179 		hal_rx_tlv_l3_hdr_padding_get_be;
2180 	hal_soc->ops->hal_rx_encryption_info_valid =
2181 					hal_rx_encryption_info_valid_be;
2182 	hal_soc->ops->hal_rx_print_pn = hal_rx_print_pn_be;
2183 	hal_soc->ops->hal_rx_msdu_end_first_msdu_get =
2184 					hal_rx_tlv_first_msdu_get_be;
2185 	hal_soc->ops->hal_rx_msdu_end_da_is_valid_get =
2186 		hal_rx_tlv_da_is_valid_get_be;
2187 	hal_soc->ops->hal_rx_msdu_end_last_msdu_get =
2188 					hal_rx_tlv_last_msdu_get_be;
2189 	hal_soc->ops->hal_rx_get_mpdu_mac_ad4_valid =
2190 					hal_rx_get_mpdu_mac_ad4_valid_be;
2191 	hal_soc->ops->hal_rx_mpdu_start_sw_peer_id_get =
2192 		hal_rx_mpdu_start_sw_peer_id_get_be;
2193 	hal_soc->ops->hal_rx_tlv_peer_meta_data_get =
2194 		hal_rx_mpdu_peer_meta_data_get_be;
2195 	hal_soc->ops->hal_rx_mpdu_get_to_ds = hal_rx_mpdu_get_to_ds_be;
2196 	hal_soc->ops->hal_rx_mpdu_get_fr_ds = hal_rx_mpdu_get_fr_ds_be;
2197 	hal_soc->ops->hal_rx_get_mpdu_frame_control_valid =
2198 		hal_rx_get_mpdu_frame_control_valid_be;
2199 	hal_soc->ops->hal_rx_mpdu_get_addr1 = hal_rx_mpdu_get_addr1_be;
2200 	hal_soc->ops->hal_rx_mpdu_get_addr2 = hal_rx_mpdu_get_addr2_be;
2201 	hal_soc->ops->hal_rx_mpdu_get_addr3 = hal_rx_mpdu_get_addr3_be;
2202 	hal_soc->ops->hal_rx_mpdu_get_addr4 = hal_rx_mpdu_get_addr4_be;
2203 	hal_soc->ops->hal_rx_get_mpdu_sequence_control_valid =
2204 		hal_rx_get_mpdu_sequence_control_valid_be;
2205 	hal_soc->ops->hal_rx_is_unicast = hal_rx_is_unicast_be;
2206 	hal_soc->ops->hal_rx_tid_get = hal_rx_tid_get_be;
2207 	hal_soc->ops->hal_rx_hw_desc_get_ppduid_get =
2208 					hal_rx_hw_desc_get_ppduid_get_be;
2209 	hal_soc->ops->hal_rx_msdu0_buffer_addr_lsb =
2210 					hal_rx_msdu0_buffer_addr_lsb_kiwi;
2211 	hal_soc->ops->hal_rx_msdu_desc_info_ptr_get =
2212 					hal_rx_msdu_desc_info_ptr_get_kiwi;
2213 	hal_soc->ops->hal_ent_mpdu_desc_info = hal_ent_mpdu_desc_info_kiwi;
2214 	hal_soc->ops->hal_dst_mpdu_desc_info = hal_dst_mpdu_desc_info_kiwi;
2215 	hal_soc->ops->hal_rx_get_fc_valid = hal_rx_get_fc_valid_be;
2216 	hal_soc->ops->hal_rx_get_to_ds_flag = hal_rx_get_to_ds_flag_be;
2217 	hal_soc->ops->hal_rx_get_mac_addr2_valid =
2218 					hal_rx_get_mac_addr2_valid_be;
2219 	hal_soc->ops->hal_rx_get_filter_category =
2220 					hal_rx_get_filter_category_be;
2221 	hal_soc->ops->hal_rx_get_ppdu_id = hal_rx_get_ppdu_id_be;
2222 	hal_soc->ops->hal_reo_config = hal_reo_config_kiwi;
2223 	hal_soc->ops->hal_rx_msdu_flow_idx_get = hal_rx_msdu_flow_idx_get_be;
2224 	hal_soc->ops->hal_rx_msdu_flow_idx_invalid =
2225 					hal_rx_msdu_flow_idx_invalid_be;
2226 	hal_soc->ops->hal_rx_msdu_flow_idx_timeout =
2227 					hal_rx_msdu_flow_idx_timeout_be;
2228 	hal_soc->ops->hal_rx_msdu_fse_metadata_get =
2229 					hal_rx_msdu_fse_metadata_get_be;
2230 	hal_soc->ops->hal_rx_msdu_cce_match_get =
2231 					hal_rx_msdu_cce_match_get_be;
2232 	hal_soc->ops->hal_rx_msdu_cce_metadata_get =
2233 					hal_rx_msdu_cce_metadata_get_be;
2234 	hal_soc->ops->hal_rx_msdu_get_flow_params =
2235 					hal_rx_msdu_get_flow_params_be;
2236 	hal_soc->ops->hal_rx_tlv_get_tcp_chksum =
2237 					hal_rx_tlv_get_tcp_chksum_be;
2238 	hal_soc->ops->hal_rx_get_rx_sequence = hal_rx_get_rx_sequence_be;
2239 #if defined(QCA_WIFI_KIWI) && defined(WLAN_CFR_ENABLE) && \
2240 	defined(WLAN_ENH_CFR_ENABLE)
2241 	hal_soc->ops->hal_rx_get_bb_info = hal_rx_get_bb_info_kiwi;
2242 	hal_soc->ops->hal_rx_get_rtt_info = hal_rx_get_rtt_info_kiwi;
2243 #else
2244 	hal_soc->ops->hal_rx_get_bb_info = NULL;
2245 	hal_soc->ops->hal_rx_get_rtt_info = NULL;
2246 #endif
2247 	/* rx - msdu end fast path info fields */
2248 	hal_soc->ops->hal_rx_msdu_packet_metadata_get =
2249 		hal_rx_msdu_packet_metadata_get_generic_be;
2250 	hal_soc->ops->hal_rx_get_fisa_cumulative_l4_checksum =
2251 		hal_rx_get_fisa_cumulative_l4_checksum_be;
2252 	hal_soc->ops->hal_rx_get_fisa_cumulative_ip_length =
2253 		hal_rx_get_fisa_cumulative_ip_length_be;
2254 	hal_soc->ops->hal_rx_get_udp_proto = hal_rx_get_udp_proto_be;
2255 	hal_soc->ops->hal_rx_get_fisa_flow_agg_continuation =
2256 		hal_rx_get_flow_agg_continuation_be;
2257 	hal_soc->ops->hal_rx_get_fisa_flow_agg_count =
2258 					hal_rx_get_flow_agg_count_be;
2259 	hal_soc->ops->hal_rx_get_fisa_timeout = hal_rx_get_fisa_timeout_be;
2260 	hal_soc->ops->hal_rx_mpdu_start_tlv_tag_valid =
2261 		hal_rx_mpdu_start_tlv_tag_valid_be;
2262 	hal_soc->ops->hal_rx_reo_prev_pn_get = hal_rx_reo_prev_pn_get_kiwi;
2263 
2264 	/* rx - TLV struct offsets */
2265 	hal_register_rx_pkt_hdr_tlv_api_kiwi(hal_soc);
2266 	hal_soc->ops->hal_rx_msdu_end_offset_get =
2267 					hal_rx_msdu_end_offset_get_generic;
2268 	hal_soc->ops->hal_rx_mpdu_start_offset_get =
2269 					hal_rx_mpdu_start_offset_get_generic;
2270 	hal_soc->ops->hal_rx_flow_setup_fse = hal_rx_flow_setup_fse_kiwi;
2271 	hal_soc->ops->hal_rx_flow_get_tuple_info =
2272 					hal_rx_flow_get_tuple_info_be;
2273 	hal_soc->ops->hal_rx_flow_delete_entry =
2274 					hal_rx_flow_delete_entry_be;
2275 	hal_soc->ops->hal_rx_fst_get_fse_size = hal_rx_fst_get_fse_size_be;
2276 	hal_soc->ops->hal_compute_reo_remap_ix2_ix3 =
2277 					hal_compute_reo_remap_ix2_ix3_kiwi;
2278 	hal_soc->ops->hal_rx_flow_setup_cmem_fse =
2279 						hal_rx_flow_setup_cmem_fse_kiwi;
2280 	hal_soc->ops->hal_rx_flow_get_cmem_fse_ts =
2281 					hal_rx_flow_get_cmem_fse_ts_kiwi;
2282 	hal_soc->ops->hal_rx_flow_get_cmem_fse = hal_rx_flow_get_cmem_fse_kiwi;
2283 	hal_soc->ops->hal_cmem_write = hal_cmem_write_kiwi;
2284 	hal_soc->ops->hal_rx_msdu_get_reo_destination_indication =
2285 		hal_rx_msdu_get_reo_destination_indication_be;
2286 	hal_soc->ops->hal_tx_get_num_tcl_banks = hal_tx_get_num_tcl_banks_kiwi;
2287 	hal_soc->ops->hal_rx_get_tlv_size = hal_rx_get_tlv_size_generic_be;
2288 	hal_soc->ops->hal_rx_msdu_is_wlan_mcast =
2289 					hal_rx_msdu_is_wlan_mcast_generic_be;
2290 	hal_soc->ops->hal_rx_tlv_bw_get =
2291 					hal_rx_tlv_bw_get_be;
2292 	hal_soc->ops->hal_rx_tlv_get_is_decrypted =
2293 						hal_rx_tlv_get_is_decrypted_be;
2294 	hal_soc->ops->hal_rx_tlv_mic_err_get = hal_rx_tlv_mic_err_get_be;
2295 	hal_soc->ops->hal_rx_tlv_get_pkt_type = hal_rx_tlv_get_pkt_type_be;
2296 	hal_soc->ops->hal_rx_tlv_get_freq = hal_rx_tlv_get_freq_be;
2297 	hal_soc->ops->hal_rx_tlv_get_freq = hal_rx_tlv_get_freq_be;
2298 	hal_soc->ops->hal_rx_tlv_mpdu_len_err_get =
2299 					hal_rx_tlv_mpdu_len_err_get_be;
2300 	hal_soc->ops->hal_rx_tlv_mpdu_fcs_err_get =
2301 					hal_rx_tlv_mpdu_fcs_err_get_be;
2302 
2303 	hal_soc->ops->hal_rx_tlv_first_mpdu_get = hal_rx_tlv_first_mpdu_get_be;
2304 	hal_soc->ops->hal_rx_tlv_decrypt_err_get =
2305 					hal_rx_tlv_decrypt_err_get_be;
2306 	hal_soc->ops->hal_rx_tlv_rate_mcs_get = hal_rx_tlv_rate_mcs_get_be;
2307 	hal_soc->ops->hal_rx_tlv_sgi_get = hal_rx_tlv_sgi_get_be;
2308 	hal_soc->ops->hal_rx_tlv_decap_format_get =
2309 					hal_rx_tlv_decap_format_get_be;
2310 	hal_soc->ops->hal_rx_tlv_get_offload_info =
2311 					hal_rx_tlv_get_offload_info_be;
2312 	hal_soc->ops->hal_rx_tlv_phy_ppdu_id_get =
2313 					hal_rx_attn_phy_ppdu_id_get_be;
2314 	hal_soc->ops->hal_rx_tlv_msdu_done_get = hal_rx_tlv_msdu_done_get_be;
2315 	hal_soc->ops->hal_rx_tlv_msdu_len_get =
2316 					hal_rx_msdu_start_msdu_len_get_be;
2317 	hal_soc->ops->hal_rx_get_frame_ctrl_field =
2318 					hal_rx_get_frame_ctrl_field_be;
2319 	hal_soc->ops->hal_rx_get_proto_params = hal_rx_get_proto_params_be;
2320 	hal_soc->ops->hal_rx_get_l3_l4_offsets = hal_rx_get_l3_l4_offsets_be;
2321 	hal_soc->ops->hal_rx_tlv_csum_err_get = hal_rx_tlv_csum_err_get_be;
2322 	hal_soc->ops->hal_rx_mpdu_info_ampdu_flag_get =
2323 					hal_rx_mpdu_info_ampdu_flag_get_be;
2324 	hal_soc->ops->hal_rx_tlv_msdu_len_set =
2325 					hal_rx_msdu_start_msdu_len_set_be;
2326 	hal_soc->ops->hal_rx_tlv_populate_mpdu_desc_info =
2327 				hal_rx_tlv_populate_mpdu_desc_info_kiwi;
2328 	hal_soc->ops->hal_get_idle_link_bm_id = hal_get_idle_link_bm_id_kiwi;
2329 #ifdef WLAN_FEATURE_MARK_FIRST_WAKEUP_PACKET
2330 	hal_soc->ops->hal_get_first_wow_wakeup_packet =
2331 		hal_get_first_wow_wakeup_packet_kiwi;
2332 #endif
2333 	hal_soc->ops->hal_compute_reo_remap_ix0 = NULL;
2334 
2335 	hal_soc->ops->hal_rx_tlv_l3_type_get = hal_rx_tlv_l3_type_get_be;
2336 	hal_soc->ops->hal_tx_vdev_mismatch_routing_set =
2337 		hal_tx_vdev_mismatch_routing_set_generic_be;
2338 	hal_soc->ops->hal_tx_mcast_mlo_reinject_routing_set =
2339 		hal_tx_mcast_mlo_reinject_routing_set_generic_be;
2340 	hal_soc->ops->hal_get_ba_aging_timeout =
2341 		hal_get_ba_aging_timeout_be_generic;
2342 	hal_soc->ops->hal_setup_link_idle_list =
2343 		hal_setup_link_idle_list_generic_be;
2344 	hal_soc->ops->hal_cookie_conversion_reg_cfg_be =
2345 		hal_cookie_conversion_reg_cfg_generic_be;
2346 	hal_soc->ops->hal_set_ba_aging_timeout =
2347 		hal_set_ba_aging_timeout_be_generic;
2348 	hal_soc->ops->hal_tx_populate_bank_register =
2349 		hal_tx_populate_bank_register_be;
2350 	hal_soc->ops->hal_tx_vdev_mcast_ctrl_set =
2351 		hal_tx_vdev_mcast_ctrl_set_be;
2352 	hal_soc->ops->hal_get_tsf_time = hal_get_tsf_time_kiwi;
2353 	hal_soc->ops->hal_rx_reo_ent_get_src_link_id =
2354 					hal_rx_reo_ent_get_src_link_id_kiwi;
2355 #ifdef FEATURE_DIRECT_LINK
2356 	hal_soc->ops->hal_srng_set_msi_config = hal_srng_set_msi_config;
2357 #endif
2358 	hal_soc->ops->hal_rx_en_mcast_fp_data_filter =
2359 					hal_rx_en_mcast_fp_data_filter_kiwi;
2360 #ifdef WLAN_PKT_CAPTURE_TX_2_0
2361 	hal_soc->ops->hal_txmon_is_mon_buf_addr_tlv =
2362 				hal_txmon_is_mon_buf_addr_tlv_generic_be;
2363 	hal_soc->ops->hal_txmon_populate_packet_info =
2364 				hal_txmon_populate_packet_info_generic_be;
2365 	hal_soc->ops->hal_txmon_status_parse_tlv =
2366 				hal_txmon_status_parse_tlv_generic_be;
2367 	hal_soc->ops->hal_txmon_status_get_num_users =
2368 				hal_txmon_status_get_num_users_generic_be;
2369 #endif /* WLAN_PKT_CAPTURE_TX_2_0 */
2370 };
2371 
2372 struct hal_hw_srng_config hw_srng_table_kiwi[] = {
2373 	/* TODO: max_rings can populated by querying HW capabilities */
2374 	{ /* REO_DST */
2375 		.start_ring_id = HAL_SRNG_REO2SW1,
2376 		.max_rings = 8,
2377 		.entry_size = sizeof(struct reo_destination_ring) >> 2,
2378 		.lmac_ring = FALSE,
2379 		.ring_dir = HAL_SRNG_DST_RING,
2380 		.nf_irq_support = true,
2381 		.reg_start = {
2382 			HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(
2383 				REO_REG_REG_BASE),
2384 			HWIO_REO_R2_REO2SW1_RING_HP_ADDR(
2385 				REO_REG_REG_BASE)
2386 		},
2387 		.reg_size = {
2388 			HWIO_REO_R0_REO2SW2_RING_BASE_LSB_ADDR(0) -
2389 				HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(0),
2390 			HWIO_REO_R2_REO2SW2_RING_HP_ADDR(0) -
2391 				HWIO_REO_R2_REO2SW1_RING_HP_ADDR(0),
2392 		},
2393 		.max_size =
2394 			HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_BMSK >>
2395 			HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_SHFT,
2396 	},
2397 	{ /* REO_EXCEPTION */
2398 		/* Designating REO2SW0 ring as exception ring. */
2399 		.start_ring_id = HAL_SRNG_REO2SW0,
2400 		.max_rings = 1,
2401 		.entry_size = sizeof(struct reo_destination_ring) >> 2,
2402 		.lmac_ring = FALSE,
2403 		.ring_dir = HAL_SRNG_DST_RING,
2404 		.reg_start = {
2405 			HWIO_REO_R0_REO2SW0_RING_BASE_LSB_ADDR(
2406 				REO_REG_REG_BASE),
2407 			HWIO_REO_R2_REO2SW0_RING_HP_ADDR(
2408 				REO_REG_REG_BASE)
2409 		},
2410 		/* Single ring - provide ring size if multiple rings of this
2411 		 * type are supported
2412 		 */
2413 		.reg_size = {},
2414 		.max_size =
2415 			HWIO_REO_R0_REO2SW0_RING_BASE_MSB_RING_SIZE_BMSK >>
2416 			HWIO_REO_R0_REO2SW0_RING_BASE_MSB_RING_SIZE_SHFT,
2417 	},
2418 	{ /* REO_REINJECT */
2419 		.start_ring_id = HAL_SRNG_SW2REO,
2420 		.max_rings = 1,
2421 		.entry_size = sizeof(struct reo_entrance_ring) >> 2,
2422 		.lmac_ring = FALSE,
2423 		.ring_dir = HAL_SRNG_SRC_RING,
2424 		.reg_start = {
2425 			HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(
2426 				REO_REG_REG_BASE),
2427 			HWIO_REO_R2_SW2REO_RING_HP_ADDR(
2428 				REO_REG_REG_BASE)
2429 		},
2430 		/* Single ring - provide ring size if multiple rings of this
2431 		 * type are supported
2432 		 */
2433 		.reg_size = {},
2434 		.max_size = HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_BMSK >>
2435 				HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_SHFT,
2436 	},
2437 	{ /* REO_CMD */
2438 		.start_ring_id = HAL_SRNG_REO_CMD,
2439 		.max_rings = 1,
2440 		.entry_size = (sizeof(struct tlv_32_hdr) +
2441 			sizeof(struct reo_get_queue_stats)) >> 2,
2442 		.lmac_ring = FALSE,
2443 		.ring_dir = HAL_SRNG_SRC_RING,
2444 		.reg_start = {
2445 			HWIO_REO_R0_REO_CMD_RING_BASE_LSB_ADDR(
2446 				REO_REG_REG_BASE),
2447 			HWIO_REO_R2_REO_CMD_RING_HP_ADDR(
2448 				REO_REG_REG_BASE),
2449 		},
2450 		/* Single ring - provide ring size if multiple rings of this
2451 		 * type are supported
2452 		 */
2453 		.reg_size = {},
2454 		.max_size =
2455 			HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_BMSK >>
2456 			HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_SHFT,
2457 	},
2458 	{ /* REO_STATUS */
2459 		.start_ring_id = HAL_SRNG_REO_STATUS,
2460 		.max_rings = 1,
2461 		.entry_size = (sizeof(struct tlv_32_hdr) +
2462 			sizeof(struct reo_get_queue_stats_status)) >> 2,
2463 		.lmac_ring = FALSE,
2464 		.ring_dir = HAL_SRNG_DST_RING,
2465 		.reg_start = {
2466 			HWIO_REO_R0_REO_STATUS_RING_BASE_LSB_ADDR(
2467 				REO_REG_REG_BASE),
2468 			HWIO_REO_R2_REO_STATUS_RING_HP_ADDR(
2469 				REO_REG_REG_BASE),
2470 		},
2471 		/* Single ring - provide ring size if multiple rings of this
2472 		 * type are supported
2473 		 */
2474 		.reg_size = {},
2475 		.max_size =
2476 			HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
2477 			HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
2478 	},
2479 	{ /* TCL_DATA */
2480 		.start_ring_id = HAL_SRNG_SW2TCL1,
2481 		.max_rings = 5,
2482 		.entry_size = sizeof(struct tcl_data_cmd) >> 2,
2483 		.lmac_ring = FALSE,
2484 		.ring_dir = HAL_SRNG_SRC_RING,
2485 		.reg_start = {
2486 			HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(
2487 				MAC_TCL_REG_REG_BASE),
2488 			HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(
2489 				MAC_TCL_REG_REG_BASE),
2490 		},
2491 		.reg_size = {
2492 			HWIO_TCL_R0_SW2TCL2_RING_BASE_LSB_ADDR(0) -
2493 				HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(0),
2494 			HWIO_TCL_R2_SW2TCL2_RING_HP_ADDR(0) -
2495 				HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(0),
2496 		},
2497 		.max_size =
2498 			HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >>
2499 			HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT,
2500 	},
2501 	{ /* TCL_CMD */
2502 		.start_ring_id = HAL_SRNG_SW2TCL_CMD,
2503 #ifndef WLAN_DP_DISABLE_TCL_CMD_CRED_SRNG
2504 		.max_rings = 1,
2505 #else
2506 		.max_rings = 0,
2507 #endif
2508 		.entry_size = sizeof(struct tcl_gse_cmd) >> 2,
2509 		.lmac_ring =  FALSE,
2510 		.ring_dir = HAL_SRNG_SRC_RING,
2511 		.reg_start = {
2512 			HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_LSB_ADDR(
2513 				MAC_TCL_REG_REG_BASE),
2514 			HWIO_TCL_R2_SW2TCL_CREDIT_RING_HP_ADDR(
2515 				MAC_TCL_REG_REG_BASE),
2516 		},
2517 		/* Single ring - provide ring size if multiple rings of this
2518 		 * type are supported
2519 		 */
2520 		.reg_size = {},
2521 		.max_size =
2522 		      HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_BMSK >>
2523 		      HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_SHFT,
2524 	},
2525 	{ /* TCL_STATUS */
2526 		.start_ring_id = HAL_SRNG_TCL_STATUS,
2527 #ifndef WLAN_DP_DISABLE_TCL_CMD_CRED_SRNG
2528 		.max_rings = 1,
2529 #else
2530 		.max_rings = 0,
2531 #endif
2532 		/* confirm that TLV header is needed */
2533 		.entry_size = sizeof(struct tcl_status_ring) >> 2,
2534 		.lmac_ring = FALSE,
2535 		.ring_dir = HAL_SRNG_DST_RING,
2536 		.reg_start = {
2537 			HWIO_TCL_R0_TCL_STATUS1_RING_BASE_LSB_ADDR(
2538 				MAC_TCL_REG_REG_BASE),
2539 			HWIO_TCL_R2_TCL_STATUS1_RING_HP_ADDR(
2540 				MAC_TCL_REG_REG_BASE),
2541 		},
2542 		/* Single ring - provide ring size if multiple rings of this
2543 		 * type are supported
2544 		 */
2545 		.reg_size = {},
2546 		.max_size =
2547 			HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_BMSK >>
2548 			HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_SHFT,
2549 	},
2550 	{ /* CE_SRC */
2551 		.start_ring_id = HAL_SRNG_CE_0_SRC,
2552 		.max_rings = 12,
2553 		.entry_size = sizeof(struct ce_src_desc) >> 2,
2554 		.lmac_ring = FALSE,
2555 		.ring_dir = HAL_SRNG_SRC_RING,
2556 		.reg_start = {
2557 		HWIO_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR,
2558 		HWIO_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R2_SRC_RING_HP_ADDR,
2559 		},
2560 		.reg_size = {
2561 		SOC_CE_1_SRC_WFSS_CE_1_CHANNEL_SRC_REG_REG_BASE -
2562 		SOC_CE_0_SRC_WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE,
2563 		SOC_CE_1_SRC_WFSS_CE_1_CHANNEL_SRC_REG_REG_BASE -
2564 		SOC_CE_0_SRC_WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE,
2565 		},
2566 		.max_size =
2567 		HWIO_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_MSB_RING_SIZE_BMSK >>
2568 		HWIO_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_MSB_RING_SIZE_SHFT,
2569 	},
2570 	{ /* CE_DST */
2571 		.start_ring_id = HAL_SRNG_CE_0_DST,
2572 		.max_rings = 12,
2573 		.entry_size = 8 >> 2,
2574 		/*TODO: entry_size above should actually be
2575 		 * sizeof(struct ce_dst_desc) >> 2, but couldn't find definition
2576 		 * of struct ce_dst_desc in HW header files
2577 		 */
2578 		.lmac_ring = FALSE,
2579 		.ring_dir = HAL_SRNG_SRC_RING,
2580 		.reg_start = {
2581 		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR,
2582 		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR,
2583 		},
2584 		.reg_size = {
2585 		SOC_CE_1_DST_WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
2586 		SOC_CE_0_DST_WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
2587 		SOC_CE_1_DST_WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
2588 		SOC_CE_0_DST_WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
2589 		},
2590 		.max_size =
2591 		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
2592 		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
2593 	},
2594 	{ /* CE_DST_STATUS */
2595 		.start_ring_id = HAL_SRNG_CE_0_DST_STATUS,
2596 		.max_rings = 12,
2597 		.entry_size = sizeof(struct ce_stat_desc) >> 2,
2598 		.lmac_ring = FALSE,
2599 		.ring_dir = HAL_SRNG_DST_RING,
2600 		.reg_start = {
2601 		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR,
2602 		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR,
2603 		},
2604 		.reg_size = {
2605 		SOC_CE_1_DST_WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
2606 		SOC_CE_0_DST_WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
2607 		SOC_CE_1_DST_WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
2608 		SOC_CE_0_DST_WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
2609 		},
2610 		.max_size =
2611 		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
2612 		HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
2613 	},
2614 	{ /* WBM_IDLE_LINK */
2615 		.start_ring_id = HAL_SRNG_WBM_IDLE_LINK,
2616 		.max_rings = 1,
2617 		.entry_size = sizeof(struct wbm_link_descriptor_ring) >> 2,
2618 		.lmac_ring = FALSE,
2619 		.ring_dir = HAL_SRNG_SRC_RING,
2620 		.reg_start = {
2621 		HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE),
2622 		HWIO_WBM_R2_WBM_IDLE_LINK_RING_HP_ADDR(WBM_REG_REG_BASE),
2623 		},
2624 		/* Single ring - provide ring size if multiple rings of this
2625 		 * type are supported
2626 		 */
2627 		.reg_size = {},
2628 		.max_size =
2629 		HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_BMSK >>
2630 		HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_SHFT,
2631 	},
2632 	{ /* SW2WBM_RELEASE */
2633 		.start_ring_id = HAL_SRNG_WBM_SW_RELEASE,
2634 		.max_rings = 1,
2635 		.entry_size = sizeof(struct wbm_release_ring) >> 2,
2636 		.lmac_ring = FALSE,
2637 		.ring_dir = HAL_SRNG_SRC_RING,
2638 		.reg_start = {
2639 		HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE),
2640 		HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE),
2641 		},
2642 		/* Single ring - provide ring size if multiple rings of this
2643 		 * type are supported
2644 		 */
2645 		.reg_size = {},
2646 		.max_size =
2647 		HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
2648 		HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
2649 	},
2650 	{ /* WBM2SW_RELEASE */
2651 		.start_ring_id = HAL_SRNG_WBM2SW0_RELEASE,
2652 		.max_rings = 8,
2653 		.entry_size = sizeof(struct wbm_release_ring) >> 2,
2654 		.lmac_ring = FALSE,
2655 		.ring_dir = HAL_SRNG_DST_RING,
2656 		.nf_irq_support = true,
2657 		.reg_start = {
2658 		HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE),
2659 		HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE),
2660 		},
2661 		.reg_size = {
2662 		HWIO_WBM_R0_WBM2SW1_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE) -
2663 		HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE),
2664 		HWIO_WBM_R2_WBM2SW1_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE) -
2665 		HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE),
2666 		},
2667 		.max_size =
2668 		HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
2669 		HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
2670 	},
2671 	{ /* RXDMA_BUF */
2672 		.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF0,
2673 #if defined(IPA_OFFLOAD) && defined(FEATURE_DIRECT_LINK)
2674 		.max_rings = 4,
2675 #elif defined(IPA_OFFLOAD) || defined(FEATURE_DIRECT_LINK)
2676 		.max_rings = 3,
2677 #else
2678 		.max_rings = 2,
2679 #endif
2680 		.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
2681 		.lmac_ring = TRUE,
2682 		.ring_dir = HAL_SRNG_SRC_RING,
2683 		/* reg_start is not set because LMAC rings are not accessed
2684 		 * from host
2685 		 */
2686 		.reg_start = {},
2687 		.reg_size = {},
2688 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
2689 	},
2690 	{ /* RXDMA_DST */
2691 		.start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW0,
2692 		.max_rings = 1,
2693 		.entry_size = sizeof(struct reo_entrance_ring) >> 2,
2694 		.lmac_ring =  TRUE,
2695 		.ring_dir = HAL_SRNG_DST_RING,
2696 		/* reg_start is not set because LMAC rings are not accessed
2697 		 * from host
2698 		 */
2699 		.reg_start = {},
2700 		.reg_size = {},
2701 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
2702 	},
2703 	{ /* RXDMA_MONITOR_BUF */
2704 		.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA2_BUF,
2705 		.max_rings = 1,
2706 		.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
2707 		.lmac_ring = TRUE,
2708 		.ring_dir = HAL_SRNG_SRC_RING,
2709 		/* reg_start is not set because LMAC rings are not accessed
2710 		 * from host
2711 		 */
2712 		.reg_start = {},
2713 		.reg_size = {},
2714 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
2715 	},
2716 	{ /* RXDMA_MONITOR_STATUS */
2717 		.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF,
2718 		.max_rings = 1,
2719 		.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
2720 		.lmac_ring = TRUE,
2721 		.ring_dir = HAL_SRNG_SRC_RING,
2722 		/* reg_start is not set because LMAC rings are not accessed
2723 		 * from host
2724 		 */
2725 		.reg_start = {},
2726 		.reg_size = {},
2727 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
2728 	},
2729 	{ /* RXDMA_MONITOR_DST */
2730 		.start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW1,
2731 		.max_rings = 1,
2732 		.entry_size = sizeof(struct reo_entrance_ring) >> 2,
2733 		.lmac_ring = TRUE,
2734 		.ring_dir = HAL_SRNG_DST_RING,
2735 		/* reg_start is not set because LMAC rings are not accessed
2736 		 * from host
2737 		 */
2738 		.reg_start = {},
2739 		.reg_size = {},
2740 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
2741 	},
2742 	{ /* RXDMA_MONITOR_DESC */
2743 		.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_DESC,
2744 		.max_rings = 1,
2745 		.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
2746 		.lmac_ring = TRUE,
2747 		.ring_dir = HAL_SRNG_SRC_RING,
2748 		/* reg_start is not set because LMAC rings are not accessed
2749 		 * from host
2750 		 */
2751 		.reg_start = {},
2752 		.reg_size = {},
2753 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
2754 	},
2755 	{ /* DIR_BUF_RX_DMA_SRC */
2756 		.start_ring_id = HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING,
2757 		/*
2758 		 * one ring is for spectral scan
2759 		 * the other is for cfr
2760 		 */
2761 		.max_rings = 2,
2762 		.entry_size = 2,
2763 		.lmac_ring = TRUE,
2764 		.ring_dir = HAL_SRNG_SRC_RING,
2765 		/* reg_start is not set because LMAC rings are not accessed
2766 		 * from host
2767 		 */
2768 		.reg_start = {},
2769 		.reg_size = {},
2770 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
2771 	},
2772 #ifdef WLAN_FEATURE_CIF_CFR
2773 	{ /* WIFI_POS_SRC */
2774 		.start_ring_id = HAL_SRNG_WIFI_POS_SRC_DMA_RING,
2775 		.max_rings = 1,
2776 		.entry_size = sizeof(wmi_oem_dma_buf_release_entry)  >> 2,
2777 		.lmac_ring = TRUE,
2778 		.ring_dir = HAL_SRNG_SRC_RING,
2779 		/* reg_start is not set because LMAC rings are not accessed
2780 		 * from host
2781 		 */
2782 		.reg_start = {},
2783 		.reg_size = {},
2784 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
2785 	},
2786 #endif
2787 	{ /* REO2PPE */ 0},
2788 	{ /* PPE2TCL */ 0},
2789 	{ /* PPE_RELEASE */ 0},
2790 #ifdef WLAN_PKT_CAPTURE_TX_2_0
2791 	{ /* TX_MONITOR_BUF */
2792 		.start_ring_id = HAL_SRNG_SW2TXMON_BUF0,
2793 		.max_rings = 1,
2794 		.entry_size = sizeof(struct mon_ingress_ring) >> 2,
2795 		.lmac_ring = TRUE,
2796 		.ring_dir = HAL_SRNG_SRC_RING,
2797 		/* reg_start is not set because LMAC rings are not accessed
2798 		 * from host
2799 		 */
2800 		.reg_start = {},
2801 		.reg_size = {},
2802 		.max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
2803 	},
2804 	{ /* TX_MONITOR_DST */
2805 		.start_ring_id = HAL_SRNG_WMAC1_TXMON2SW0,
2806 		.max_rings = 2,
2807 		.entry_size = sizeof(struct mon_destination_ring) >> 2,
2808 		.lmac_ring = TRUE,
2809 		.ring_dir = HAL_SRNG_DST_RING,
2810 		/* reg_start is not set because LMAC rings are not accessed
2811 		 * from host
2812 		 */
2813 		.reg_start = {},
2814 		.reg_size = {},
2815 		.max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
2816 	},
2817 #else
2818 	{0},
2819 	{0},
2820 #endif
2821 	{ /* SW2RXDMA_NEW */ 0},
2822 	{ /* SW2RXDMA_LINK_RELEASE */ 0},
2823 };
2824 
2825 /**
2826  * hal_srng_hw_reg_offset_init_kiwi() - Initialize the HW srng reg offset
2827  *				applicable only for KIWI
2828  * @hal_soc: HAL Soc handle
2829  *
2830  * Return: None
2831  */
2832 static inline void hal_srng_hw_reg_offset_init_kiwi(struct hal_soc *hal_soc)
2833 {
2834 	int32_t *hw_reg_offset = hal_soc->hal_hw_reg_offset;
2835 
2836 	hw_reg_offset[DST_MSI2_BASE_LSB] = REG_OFFSET(DST, MSI2_BASE_LSB),
2837 	hw_reg_offset[DST_MSI2_BASE_MSB] = REG_OFFSET(DST, MSI2_BASE_MSB),
2838 	hw_reg_offset[DST_MSI2_DATA] = REG_OFFSET(DST, MSI2_DATA),
2839 	hw_reg_offset[DST_PRODUCER_INT2_SETUP] =
2840 					REG_OFFSET(DST, PRODUCER_INT2_SETUP);
2841 	hal_srng_hw_reg_offset_init_misc_1_kiwi(hal_soc);
2842 }
2843 
2844 void hal_kiwi_attach(struct hal_soc *hal_soc)
2845 {
2846 	hal_soc->hw_srng_table = hw_srng_table_kiwi;
2847 
2848 	hal_srng_hw_reg_offset_init_generic(hal_soc);
2849 	hal_srng_hw_reg_offset_init_kiwi(hal_soc);
2850 	hal_hw_txrx_default_ops_attach_be(hal_soc);
2851 	hal_hw_txrx_ops_attach_kiwi(hal_soc);
2852 }
2853