xref: /wlan-dirver/qca-wifi-host-cmn/hal/wifi3.0/qcn9000/hal_9000.c (revision 2888b71da71bce103343119fa1b31f4a0cee07c8)
1 /*
2  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 #include "hal_li_hw_headers.h"
20 #include "hal_internal.h"
21 #include "hal_api.h"
22 #include "target_type.h"
23 #include "wcss_version.h"
24 #include "qdf_module.h"
25 #include "hal_9000_rx.h"
26 #include "hal_api_mon.h"
27 #include "hal_flow.h"
28 #include "rx_flow_search_entry.h"
29 #include "hal_rx_flow_info.h"
30 
31 #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_OFFSET \
32 	RXPCU_PPDU_END_INFO_9_RX_PPDU_DURATION_OFFSET
33 #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_MASK \
34 	RXPCU_PPDU_END_INFO_9_RX_PPDU_DURATION_MASK
35 #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_LSB \
36 	RXPCU_PPDU_END_INFO_9_RX_PPDU_DURATION_LSB
37 #define UNIFIED_RXPCU_PPDU_END_INFO_11_PHYRX_ABORT_REQUEST_INFO_DETAILS_PHYRX_ABORT_REASON_OFFSET \
38 	RXPCU_PPDU_END_INFO_11_PHYRX_ABORT_REQUEST_INFO_DETAILS_PHYRX_ABORT_REASON_OFFSET
39 #define UNIFIED_RXPCU_PPDU_END_INFO_11_PHYRX_ABORT_REQUEST_INFO_DETAILS_PHYRX_ABORT_REASON_MASK \
40 	RXPCU_PPDU_END_INFO_11_PHYRX_ABORT_REQUEST_INFO_DETAILS_PHYRX_ABORT_REASON_MASK
41 #define UNIFIED_RXPCU_PPDU_END_INFO_11_PHYRX_ABORT_REQUEST_INFO_DETAILS_PHYRX_ABORT_REASON_LSB \
42 	RXPCU_PPDU_END_INFO_11_PHYRX_ABORT_REQUEST_INFO_DETAILS_PHYRX_ABORT_REASON_LSB
43 #define UNIFIED_PHYRX_HT_SIG_0_HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS_OFFSET \
44 	PHYRX_HT_SIG_0_PHYRX_HT_SIG_INFO_DETAILS_MCS_OFFSET
45 #define UNIFIED_PHYRX_L_SIG_B_0_L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS_OFFSET \
46 	PHYRX_L_SIG_B_0_PHYRX_L_SIG_B_INFO_DETAILS_RATE_OFFSET
47 #define UNIFIED_PHYRX_L_SIG_A_0_L_SIG_A_INFO_PHYRX_L_SIG_A_INFO_DETAILS_OFFSET \
48 	PHYRX_L_SIG_A_0_PHYRX_L_SIG_A_INFO_DETAILS_RATE_OFFSET
49 #define UNIFIED_PHYRX_VHT_SIG_A_0_VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS_OFFSET \
50 	PHYRX_VHT_SIG_A_0_PHYRX_VHT_SIG_A_INFO_DETAILS_BANDWIDTH_OFFSET
51 #define UNIFIED_PHYRX_HE_SIG_A_SU_0_HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS_OFFSET \
52 	PHYRX_HE_SIG_A_SU_0_PHYRX_HE_SIG_A_SU_INFO_DETAILS_FORMAT_INDICATION_OFFSET
53 #define UNIFIED_PHYRX_HE_SIG_A_MU_DL_0_HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS_OFFSET \
54 	PHYRX_HE_SIG_A_MU_DL_0_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS_DL_UL_FLAG_OFFSET
55 #define UNIFIED_PHYRX_HE_SIG_B1_MU_0_HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS_OFFSET \
56 	PHYRX_HE_SIG_B1_MU_0_PHYRX_HE_SIG_B1_MU_INFO_DETAILS_RU_ALLOCATION_OFFSET
57 #define UNIFIED_PHYRX_HE_SIG_B2_MU_0_HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS_OFFSET \
58 	PHYRX_HE_SIG_B2_MU_0_PHYRX_HE_SIG_B2_MU_INFO_DETAILS_STA_ID_OFFSET
59 #define UNIFIED_PHYRX_HE_SIG_B2_OFDMA_0_HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS_OFFSET \
60 	PHYRX_HE_SIG_B2_OFDMA_0_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS_STA_ID_OFFSET
61 #define UNIFIED_PHYRX_RSSI_LEGACY_3_RECEIVE_RSSI_INFO_PRE_RSSI_INFO_DETAILS_OFFSET \
62 	PHYRX_RSSI_LEGACY_3_PRE_RSSI_INFO_DETAILS_RSSI_PRI20_CHAIN0_OFFSET
63 #define UNIFIED_PHYRX_RSSI_LEGACY_19_RECEIVE_RSSI_INFO_PREAMBLE_RSSI_INFO_DETAILS_OFFSET \
64 	PHYRX_RSSI_LEGACY_19_PREAMBLE_RSSI_INFO_DETAILS_RSSI_PRI20_CHAIN0_OFFSET
65 #define UNIFIED_RX_MPDU_START_0_RX_MPDU_INFO_RX_MPDU_INFO_DETAILS_OFFSET \
66 	RX_MPDU_START_9_RX_MPDU_INFO_DETAILS_RXPCU_MPDU_FILTER_IN_CATEGORY_OFFSET
67 #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \
68 	RX_MSDU_LINK_8_MSDU_0_BUFFER_ADDR_INFO_DETAILS_BUFFER_ADDR_31_0_OFFSET
69 #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \
70 	RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_DETAILS_FIRST_MSDU_IN_MPDU_FLAG_OFFSET
71 #define UNIFIED_RX_MPDU_DETAILS_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \
72 	RX_MPDU_DETAILS_2_RX_MPDU_DESC_INFO_DETAILS_MSDU_COUNT_OFFSET
73 #define UNIFIED_REO_DESTINATION_RING_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \
74 	REO_DESTINATION_RING_2_RX_MPDU_DESC_INFO_DETAILS_MSDU_COUNT_OFFSET
75 #define UNIFORM_REO_STATUS_HEADER_STATUS_HEADER \
76 	STATUS_HEADER_REO_STATUS_NUMBER
77 #define UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC \
78 	STATUS_HEADER_TIMESTAMP
79 #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \
80 	RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_DETAILS_FIRST_MSDU_IN_MPDU_FLAG_OFFSET
81 #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \
82 	RX_MSDU_LINK_8_MSDU_0_BUFFER_ADDR_INFO_DETAILS_BUFFER_ADDR_31_0_OFFSET
83 #define UNIFIED_TCL_DATA_CMD_0_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \
84 	TCL_DATA_CMD_0_BUF_ADDR_INFO_BUFFER_ADDR_31_0_OFFSET
85 #define UNIFIED_TCL_DATA_CMD_1_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \
86 	TCL_DATA_CMD_1_BUF_ADDR_INFO_BUFFER_ADDR_39_32_OFFSET
87 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_OFFSET \
88 	TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_OFFSET
89 #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB \
90 	BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB
91 #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK \
92 	BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK
93 #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB \
94 	BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB
95 #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK \
96 	BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK
97 #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB \
98 	BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB
99 #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK \
100 	BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK
101 #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB \
102 	BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB
103 #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK \
104 	BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK
105 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_LSB \
106 	TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_LSB
107 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_MASK \
108 	TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_MASK
109 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_MASK \
110 	WBM_RELEASE_RING_6_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_MASK
111 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_OFFSET \
112 	WBM_RELEASE_RING_6_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_OFFSET
113 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_LSB \
114 	WBM_RELEASE_RING_6_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_LSB
115 
116 #define CE_WINDOW_ADDRESS_9000 \
117 		((CE_WFSS_CE_REG_BASE >> WINDOW_SHIFT) & WINDOW_VALUE_MASK)
118 
119 #define UMAC_WINDOW_ADDRESS_9000 \
120 		((SEQ_WCSS_UMAC_OFFSET >> WINDOW_SHIFT) & WINDOW_VALUE_MASK)
121 
122 #define WINDOW_CONFIGURATION_VALUE_9000 \
123 		((CE_WINDOW_ADDRESS_9000 << 6) |\
124 		 (UMAC_WINDOW_ADDRESS_9000 << 12) | \
125 		 WINDOW_ENABLE_BIT)
126 
127 #include "hal_9000_tx.h"
128 #include <hal_generic_api.h>
129 #include "hal_li_rx.h"
130 #include "hal_li_api.h"
131 #include "hal_li_generic_api.h"
132 
133 /**
134  * hal_rx_sw_mon_desc_info_get_9000(): API to read the
135  * sw monitor ring descriptor
136  *
137  * @rxdma_dst_ring_desc: sw monitor ring descriptor
138  * @desc_info_buf: Descriptor info buffer to which
139  * sw monitor ring descriptor is populated to
140  *
141  * Return: void
142  */
143 static void
144 hal_rx_sw_mon_desc_info_get_9000(hal_ring_desc_t rxdma_dst_ring_desc,
145 				 hal_rx_mon_desc_info_t desc_info_buf)
146 {
147 	struct sw_monitor_ring *sw_mon_ring =
148 		(struct sw_monitor_ring *)rxdma_dst_ring_desc;
149 	struct buffer_addr_info *buf_addr_info;
150 	uint32_t *mpdu_info;
151 	uint32_t loop_cnt;
152 	struct hal_rx_mon_desc_info *desc_info;
153 
154 	desc_info = (struct hal_rx_mon_desc_info *)desc_info_buf;
155 	mpdu_info = (uint32_t *)&sw_mon_ring->
156 			reo_level_mpdu_frame_info.rx_mpdu_desc_info_details;
157 
158 	loop_cnt = HAL_RX_GET(sw_mon_ring, SW_MONITOR_RING_7, LOOPING_COUNT);
159 	desc_info->msdu_count = HAL_RX_MPDU_MSDU_COUNT_GET(mpdu_info);
160 
161 	/* Get msdu link descriptor buf_addr_info */
162 	buf_addr_info = &sw_mon_ring->
163 		reo_level_mpdu_frame_info.msdu_link_desc_addr_info;
164 	desc_info->link_desc.paddr = HAL_RX_BUFFER_ADDR_31_0_GET(buf_addr_info)
165 			| ((uint64_t)(HAL_RX_BUFFER_ADDR_39_32_GET(
166 			buf_addr_info)) << 32);
167 	desc_info->link_desc.sw_cookie = HAL_RX_BUF_COOKIE_GET(buf_addr_info);
168 	buf_addr_info = &sw_mon_ring->status_buff_addr_info;
169 	desc_info->status_buf.paddr = HAL_RX_BUFFER_ADDR_31_0_GET(buf_addr_info)
170 			| ((uint64_t)
171 			  (HAL_RX_BUFFER_ADDR_39_32_GET(buf_addr_info)) << 32);
172 	desc_info->status_buf.sw_cookie = HAL_RX_BUF_COOKIE_GET(buf_addr_info);
173 	desc_info->end_of_ppdu = HAL_RX_GET(sw_mon_ring,
174 					    SW_MONITOR_RING_6,
175 					    END_OF_PPDU);
176 	desc_info->status_buf_count = HAL_RX_GET(sw_mon_ring,
177 						 SW_MONITOR_RING_6,
178 						 STATUS_BUF_COUNT);
179 	desc_info->rxdma_push_reason = HAL_RX_GET(sw_mon_ring,
180 						  SW_MONITOR_RING_6,
181 						  RXDMA_PUSH_REASON);
182 	desc_info->rxdma_error_code = HAL_RX_GET(sw_mon_ring,
183 						 SW_MONITOR_RING_6,
184 						 RXDMA_ERROR_CODE);
185 	desc_info->ppdu_id = HAL_RX_GET(sw_mon_ring,
186 					SW_MONITOR_RING_7,
187 					PHY_PPDU_ID);
188 }
189 
190 /**
191  * hal_rx_msdu_start_nss_get_9000(): API to get the NSS
192  * Interval from rx_msdu_start
193  *
194  * @buf: pointer to the start of RX PKT TLV header
195  * Return: uint32_t(nss)
196  */
197 static uint32_t hal_rx_msdu_start_nss_get_9000(uint8_t *buf)
198 {
199 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
200 	struct rx_msdu_start *msdu_start =
201 				&pkt_tlvs->msdu_start_tlv.rx_msdu_start;
202 	uint8_t mimo_ss_bitmap;
203 
204 	mimo_ss_bitmap = HAL_RX_MSDU_START_MIMO_SS_BITMAP(msdu_start);
205 
206 	return qdf_get_hweight8(mimo_ss_bitmap);
207 }
208 
209 /**
210  * hal_rx_msdu_start_get_len_9000(): API to get the MSDU length
211  * from rx_msdu_start TLV
212  *
213  * @ buf: pointer to the start of RX PKT TLV headers
214  * Return: (uint32_t)msdu length
215  */
216 static uint32_t hal_rx_msdu_start_get_len_9000(uint8_t *buf)
217 {
218 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
219 	struct rx_msdu_start *msdu_start =
220 				&pkt_tlvs->msdu_start_tlv.rx_msdu_start;
221 	uint32_t msdu_len;
222 
223 	msdu_len = HAL_RX_MSDU_START_MSDU_LEN_GET(msdu_start);
224 
225 	return msdu_len;
226 }
227 
228 /**
229  * hal_rx_mon_hw_desc_get_mpdu_status_9000(): Retrieve MPDU status
230  *
231  * @ hw_desc_addr: Start address of Rx HW TLVs
232  * @ rs: Status for monitor mode
233  *
234  * Return: void
235  */
236 static void hal_rx_mon_hw_desc_get_mpdu_status_9000(void *hw_desc_addr,
237 						    struct mon_rx_status *rs)
238 {
239 	struct rx_msdu_start *rx_msdu_start;
240 	struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr;
241 	uint32_t reg_value;
242 	const uint32_t sgi_hw_to_cdp[] = {
243 		CDP_SGI_0_8_US,
244 		CDP_SGI_0_4_US,
245 		CDP_SGI_1_6_US,
246 		CDP_SGI_3_2_US,
247 	};
248 
249 	rx_msdu_start = &rx_desc->msdu_start_tlv.rx_msdu_start;
250 
251 	HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs);
252 
253 	rs->ant_signal_db = HAL_RX_GET(rx_msdu_start,
254 				RX_MSDU_START_5, USER_RSSI);
255 	rs->is_stbc = HAL_RX_GET(rx_msdu_start, RX_MSDU_START_5, STBC);
256 
257 	reg_value = HAL_RX_GET(rx_msdu_start, RX_MSDU_START_5, SGI);
258 	rs->sgi = sgi_hw_to_cdp[reg_value];
259 	reg_value = HAL_RX_GET(rx_msdu_start, RX_MSDU_START_5, RECEPTION_TYPE);
260 	rs->beamformed = (reg_value == HAL_RX_RECEPTION_TYPE_MU_MIMO) ? 1 : 0;
261 	/* TODO: rs->beamformed should be set for SU beamforming also */
262 }
263 
264 #define LINK_DESC_SIZE (NUM_OF_DWORDS_RX_MSDU_LINK << 2)
265 /**
266  * hal_get_link_desc_size_9000(): API to get the link desc size
267  *
268  * Return: uint32_t
269  */
270 static uint32_t hal_get_link_desc_size_9000(void)
271 {
272 	return LINK_DESC_SIZE;
273 }
274 
275 /**
276  * hal_rx_get_tlv_9000(): API to get the tlv
277  *
278  * @rx_tlv: TLV data extracted from the rx packet
279  * Return: uint8_t
280  */
281 static uint8_t hal_rx_get_tlv_9000(void *rx_tlv)
282 {
283 	return HAL_RX_GET(rx_tlv, PHYRX_RSSI_LEGACY_0, RECEIVE_BANDWIDTH);
284 }
285 
286 /**
287  * hal_rx_mpdu_start_tlv_tag_valid_9000 () - API to check if RX_MPDU_START
288  * tlv tag is valid
289  *
290  *@rx_tlv_hdr: start address of rx_pkt_tlvs
291  *
292  * Return: true if RX_MPDU_START is valied, else false.
293  */
294 uint8_t hal_rx_mpdu_start_tlv_tag_valid_9000(void *rx_tlv_hdr)
295 {
296 	struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr;
297 	uint32_t tlv_tag;
298 
299 	tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(&rx_desc->mpdu_start_tlv);
300 
301 	return tlv_tag == WIFIRX_MPDU_START_E ? true : false;
302 }
303 
304 /**
305  * hal_rx_wbm_err_msdu_continuation_get_9000 () - API to check if WBM
306  * msdu continuation bit is set
307  *
308  *@wbm_desc: wbm release ring descriptor
309  *
310  * Return: true if msdu continuation bit is set.
311  */
312 uint8_t hal_rx_wbm_err_msdu_continuation_get_9000(void *wbm_desc)
313 {
314 	uint32_t comp_desc =
315 		*(uint32_t *)(((uint8_t *)wbm_desc) +
316 				WBM_RELEASE_RING_3_MSDU_CONTINUATION_OFFSET);
317 
318 	return (comp_desc & WBM_RELEASE_RING_3_MSDU_CONTINUATION_MASK) >>
319 		WBM_RELEASE_RING_3_MSDU_CONTINUATION_LSB;
320 }
321 
322 /**
323  * hal_rx_proc_phyrx_other_receive_info_tlv_9000(): API to get tlv info
324  *
325  * Return: uint32_t
326  */
327 static inline
328 void hal_rx_proc_phyrx_other_receive_info_tlv_9000(void *rx_tlv_hdr,
329 						   void *ppdu_info_hdl)
330 {
331 }
332 
333 #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE)
334 static inline
335 void hal_rx_get_bb_info_9000(void *rx_tlv, void *ppdu_info_hdl)
336 {
337 	struct hal_rx_ppdu_info *ppdu_info  = ppdu_info_hdl;
338 
339 	ppdu_info->cfr_info.bb_captured_channel =
340 		HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_3, BB_CAPTURED_CHANNEL);
341 
342 	ppdu_info->cfr_info.bb_captured_timeout =
343 		HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_3, BB_CAPTURED_TIMEOUT);
344 
345 	ppdu_info->cfr_info.bb_captured_reason =
346 		HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_3, BB_CAPTURED_REASON);
347 }
348 
349 static inline
350 void hal_rx_get_rtt_info_9000(void *rx_tlv, void *ppdu_info_hdl)
351 {
352 	struct hal_rx_ppdu_info *ppdu_info  = ppdu_info_hdl;
353 
354 	ppdu_info->cfr_info.rx_location_info_valid =
355 	HAL_RX_GET(rx_tlv, PHYRX_PKT_END_13_RX_PKT_END_DETAILS,
356 		   RX_LOCATION_INFO_DETAILS_RX_LOCATION_INFO_VALID);
357 
358 	ppdu_info->cfr_info.rtt_che_buffer_pointer_low32 =
359 	HAL_RX_GET(rx_tlv,
360 		   PHYRX_PKT_END_12_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS,
361 		   RTT_CHE_BUFFER_POINTER_LOW32);
362 
363 	ppdu_info->cfr_info.rtt_che_buffer_pointer_high8 =
364 	HAL_RX_GET(rx_tlv,
365 		   PHYRX_PKT_END_11_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS,
366 		   RTT_CHE_BUFFER_POINTER_HIGH8);
367 
368 	ppdu_info->cfr_info.chan_capture_status =
369 		GET_RX_LOCATION_INFO_CHAN_CAPTURE_STATUS(rx_tlv);
370 
371 	ppdu_info->cfr_info.rx_start_ts =
372 	HAL_RX_GET(rx_tlv,
373 		   PHYRX_PKT_END_9_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS,
374 		   RX_START_TS);
375 
376 	ppdu_info->cfr_info.rtt_cfo_measurement = (int16_t)
377 	HAL_RX_GET(rx_tlv,
378 		   PHYRX_PKT_END_13_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS,
379 		   RTT_CFO_MEASUREMENT);
380 
381 	ppdu_info->cfr_info.agc_gain_info0 =
382 	HAL_RX_GET(rx_tlv,
383 		   PHYRX_PKT_END_1_RX_PKT_END_DETAILS,
384 		   PHY_TIMESTAMP_1_LOWER_32);
385 
386 	ppdu_info->cfr_info.agc_gain_info1 =
387 	HAL_RX_GET(rx_tlv,
388 		   PHYRX_PKT_END_2_RX_PKT_END_DETAILS,
389 		   PHY_TIMESTAMP_1_UPPER_32);
390 
391 	ppdu_info->cfr_info.agc_gain_info2 =
392 	HAL_RX_GET(rx_tlv,
393 		   PHYRX_PKT_END_3_RX_PKT_END_DETAILS,
394 		   PHY_TIMESTAMP_2_LOWER_32);
395 
396 	ppdu_info->cfr_info.agc_gain_info3 =
397 	HAL_RX_GET(rx_tlv,
398 		   PHYRX_PKT_END_4_RX_PKT_END_DETAILS,
399 		   PHY_TIMESTAMP_2_UPPER_32);
400 
401 	ppdu_info->cfr_info.mcs_rate =
402 	HAL_RX_GET(rx_tlv,
403 		   PHYRX_PKT_END_8_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS,
404 		   RTT_MCS_RATE);
405 
406 	ppdu_info->cfr_info.gi_type =
407 	HAL_RX_GET(rx_tlv,
408 		   PHYRX_PKT_END_8_RX_PKT_END_DETAILS_RX_LOCATION_INFO_DETAILS,
409 		   RTT_GI_TYPE);
410 }
411 #endif
412 /**
413  * hal_rx_dump_msdu_start_tlv_9000() : dump RX msdu_start TLV in structured
414  *			     human readable format.
415  * @ msdu_start: pointer the msdu_start TLV in pkt.
416  * @ dbg_level: log level.
417  *
418  * Return: void
419  */
420 static void hal_rx_dump_msdu_start_tlv_9000(void *msdustart,
421 					    uint8_t dbg_level)
422 {
423 	struct rx_msdu_start *msdu_start = (struct rx_msdu_start *)msdustart;
424 
425 	QDF_TRACE(QDF_MODULE_ID_DP, dbg_level,
426 		  "rx_msdu_start tlv - "
427 		  "rxpcu_mpdu_filter_in_category: %d "
428 		  "sw_frame_group_id: %d "
429 		  "phy_ppdu_id: %d "
430 		  "msdu_length: %d "
431 		  "ipsec_esp: %d "
432 		  "l3_offset: %d "
433 		  "ipsec_ah: %d "
434 		  "l4_offset: %d "
435 		  "msdu_number: %d "
436 		  "decap_format: %d "
437 		  "ipv4_proto: %d "
438 		  "ipv6_proto: %d "
439 		  "tcp_proto: %d "
440 		  "udp_proto: %d "
441 		  "ip_frag: %d "
442 		  "tcp_only_ack: %d "
443 		  "da_is_bcast_mcast: %d "
444 		  "ip4_protocol_ip6_next_header: %d "
445 		  "toeplitz_hash_2_or_4: %d "
446 		  "flow_id_toeplitz: %d "
447 		  "user_rssi: %d "
448 		  "pkt_type: %d "
449 		  "stbc: %d "
450 		  "sgi: %d "
451 		  "rate_mcs: %d "
452 		  "receive_bandwidth: %d "
453 		  "reception_type: %d "
454 		  "ppdu_start_timestamp: %d "
455 		  "sw_phy_meta_data: %d ",
456 		  msdu_start->rxpcu_mpdu_filter_in_category,
457 		  msdu_start->sw_frame_group_id,
458 		  msdu_start->phy_ppdu_id,
459 		  msdu_start->msdu_length,
460 		  msdu_start->ipsec_esp,
461 		  msdu_start->l3_offset,
462 		  msdu_start->ipsec_ah,
463 		  msdu_start->l4_offset,
464 		  msdu_start->msdu_number,
465 		  msdu_start->decap_format,
466 		  msdu_start->ipv4_proto,
467 		  msdu_start->ipv6_proto,
468 		  msdu_start->tcp_proto,
469 		  msdu_start->udp_proto,
470 		  msdu_start->ip_frag,
471 		  msdu_start->tcp_only_ack,
472 		  msdu_start->da_is_bcast_mcast,
473 		  msdu_start->ip4_protocol_ip6_next_header,
474 		  msdu_start->toeplitz_hash_2_or_4,
475 		  msdu_start->flow_id_toeplitz,
476 		  msdu_start->user_rssi,
477 		  msdu_start->pkt_type,
478 		  msdu_start->stbc,
479 		  msdu_start->sgi,
480 		  msdu_start->rate_mcs,
481 		  msdu_start->receive_bandwidth,
482 		  msdu_start->reception_type,
483 		  msdu_start->ppdu_start_timestamp,
484 		  msdu_start->sw_phy_meta_data);
485 }
486 
487 /**
488  * hal_rx_dump_msdu_end_tlv_9000: dump RX msdu_end TLV in structured
489  *			     human readable format.
490  * @ msdu_end: pointer the msdu_end TLV in pkt.
491  * @ dbg_level: log level.
492  *
493  * Return: void
494  */
495 static void hal_rx_dump_msdu_end_tlv_9000(void *msduend,
496 					  uint8_t dbg_level)
497 {
498 	struct rx_msdu_end *msdu_end = (struct rx_msdu_end *)msduend;
499 
500 	QDF_TRACE(QDF_MODULE_ID_DP, dbg_level,
501 		  "rx_msdu_end tlv - "
502 		  "rxpcu_mpdu_filter_in_category: %d "
503 		  "sw_frame_group_id: %d "
504 		  "phy_ppdu_id: %d "
505 		  "ip_hdr_chksum: %d "
506 		  "reported_mpdu_length: %d "
507 		  "key_id_octet: %d "
508 		  "cce_super_rule: %d "
509 		  "cce_classify_not_done_truncat: %d "
510 		  "cce_classify_not_done_cce_dis: %d "
511 		  "rule_indication_31_0: %d "
512 		  "rule_indication_63_32: %d "
513 		  "da_offset: %d "
514 		  "sa_offset: %d "
515 		  "da_offset_valid: %d "
516 		  "sa_offset_valid: %d "
517 		  "ipv6_options_crc: %d "
518 		  "tcp_seq_number: %d "
519 		  "tcp_ack_number: %d "
520 		  "tcp_flag: %d "
521 		  "lro_eligible: %d "
522 		  "window_size: %d "
523 		  "tcp_udp_chksum: %d "
524 		  "sa_idx_timeout: %d "
525 		  "da_idx_timeout: %d "
526 		  "msdu_limit_error: %d "
527 		  "flow_idx_timeout: %d "
528 		  "flow_idx_invalid: %d "
529 		  "wifi_parser_error: %d "
530 		  "amsdu_parser_error: %d "
531 		  "sa_is_valid: %d "
532 		  "da_is_valid: %d "
533 		  "da_is_mcbc: %d "
534 		  "l3_header_padding: %d "
535 		  "first_msdu: %d "
536 		  "last_msdu: %d "
537 		  "sa_idx: %d "
538 		  "msdu_drop: %d "
539 		  "reo_destination_indication: %d "
540 		  "flow_idx: %d "
541 		  "fse_metadata: %d "
542 		  "cce_metadata: %d "
543 		  "sa_sw_peer_id: %d ",
544 		  msdu_end->rxpcu_mpdu_filter_in_category,
545 		  msdu_end->sw_frame_group_id,
546 		  msdu_end->phy_ppdu_id,
547 		  msdu_end->ip_hdr_chksum,
548 		  msdu_end->reported_mpdu_length,
549 		  msdu_end->key_id_octet,
550 		  msdu_end->cce_super_rule,
551 		  msdu_end->cce_classify_not_done_truncate,
552 		  msdu_end->cce_classify_not_done_cce_dis,
553 		  msdu_end->rule_indication_31_0,
554 		  msdu_end->rule_indication_63_32,
555 		  msdu_end->da_offset,
556 		  msdu_end->sa_offset,
557 		  msdu_end->da_offset_valid,
558 		  msdu_end->sa_offset_valid,
559 		  msdu_end->ipv6_options_crc,
560 		  msdu_end->tcp_seq_number,
561 		  msdu_end->tcp_ack_number,
562 		  msdu_end->tcp_flag,
563 		  msdu_end->lro_eligible,
564 		  msdu_end->window_size,
565 		  msdu_end->tcp_udp_chksum,
566 		  msdu_end->sa_idx_timeout,
567 		  msdu_end->da_idx_timeout,
568 		  msdu_end->msdu_limit_error,
569 		  msdu_end->flow_idx_timeout,
570 		  msdu_end->flow_idx_invalid,
571 		  msdu_end->wifi_parser_error,
572 		  msdu_end->amsdu_parser_error,
573 		  msdu_end->sa_is_valid,
574 		  msdu_end->da_is_valid,
575 		  msdu_end->da_is_mcbc,
576 		  msdu_end->l3_header_padding,
577 		  msdu_end->first_msdu,
578 		  msdu_end->last_msdu,
579 		  msdu_end->sa_idx,
580 		  msdu_end->msdu_drop,
581 		  msdu_end->reo_destination_indication,
582 		  msdu_end->flow_idx,
583 		  msdu_end->fse_metadata,
584 		  msdu_end->cce_metadata,
585 		  msdu_end->sa_sw_peer_id);
586 }
587 
588 /**
589  * hal_rx_mpdu_start_tid_get_9000(): API to get tid
590  * from rx_msdu_start
591  *
592  * @buf: pointer to the start of RX PKT TLV header
593  * Return: uint32_t(tid value)
594  */
595 static uint32_t hal_rx_mpdu_start_tid_get_9000(uint8_t *buf)
596 {
597 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
598 	struct rx_mpdu_start *mpdu_start =
599 			&pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
600 	uint32_t tid;
601 
602 	tid = HAL_RX_MPDU_INFO_TID_GET(&mpdu_start->rx_mpdu_info_details);
603 
604 	return tid;
605 }
606 
607 /**
608  * hal_rx_msdu_start_reception_type_get(): API to get the reception type
609  * Interval from rx_msdu_start
610  *
611  * @buf: pointer to the start of RX PKT TLV header
612  * Return: uint32_t(reception_type)
613  */
614 static uint32_t hal_rx_msdu_start_reception_type_get_9000(uint8_t *buf)
615 {
616 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
617 	struct rx_msdu_start *msdu_start =
618 		&pkt_tlvs->msdu_start_tlv.rx_msdu_start;
619 	uint32_t reception_type;
620 
621 	reception_type = HAL_RX_MSDU_START_RECEPTION_TYPE_GET(msdu_start);
622 
623 	return reception_type;
624 }
625 
626  /**
627  * hal_rx_msdu_end_da_idx_get_9000: API to get da_idx
628  * from rx_msdu_end TLV
629  *
630  * @ buf: pointer to the start of RX PKT TLV headers
631  * Return: da index
632  */
633 static uint16_t hal_rx_msdu_end_da_idx_get_9000(uint8_t *buf)
634 {
635 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
636 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
637 	uint16_t da_idx;
638 
639 	da_idx = HAL_RX_MSDU_END_DA_IDX_GET(msdu_end);
640 
641 	return da_idx;
642 }
643 
644 /**
645  * hal_rx_get_rx_fragment_number_9000(): Function to retrieve rx fragment number
646  *
647  * @nbuf: Network buffer
648  * Returns: rx fragment number
649  */
650 static
651 uint8_t hal_rx_get_rx_fragment_number_9000(uint8_t *buf)
652 {
653 	struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
654 	struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
655 
656 	/* Return first 4 bits as fragment number */
657 	return (HAL_RX_MPDU_GET_SEQUENCE_NUMBER(rx_mpdu_info) &
658 		DOT11_SEQ_FRAG_MASK);
659 }
660 
661 /**
662  * hal_rx_msdu_end_da_is_mcbc_get_9000(): API to check if pkt is MCBC
663  * from rx_msdu_end TLV
664  *
665  * @ buf: pointer to the start of RX PKT TLV headers
666  * Return: da_is_mcbc
667  */
668 static uint8_t
669 hal_rx_msdu_end_da_is_mcbc_get_9000(uint8_t *buf)
670 {
671 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
672 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
673 
674 	return HAL_RX_MSDU_END_DA_IS_MCBC_GET(msdu_end);
675 }
676 
677 /**
678  * hal_rx_msdu_end_sa_is_valid_get_9000(): API to get_9000 the
679  * sa_is_valid bit from rx_msdu_end TLV
680  *
681  * @ buf: pointer to the start of RX PKT TLV headers
682  * Return: sa_is_valid bit
683  */
684 static uint8_t
685 hal_rx_msdu_end_sa_is_valid_get_9000(uint8_t *buf)
686 {
687 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
688 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
689 	uint8_t sa_is_valid;
690 
691 	sa_is_valid = HAL_RX_MSDU_END_SA_IS_VALID_GET(msdu_end);
692 
693 	return sa_is_valid;
694 }
695 
696 /**
697  * hal_rx_msdu_end_sa_idx_get_9000(): API to get_9000 the
698  * sa_idx from rx_msdu_end TLV
699  *
700  * @ buf: pointer to the start of RX PKT TLV headers
701  * Return: sa_idx (SA AST index)
702  */
703 static uint16_t hal_rx_msdu_end_sa_idx_get_9000(uint8_t *buf)
704 {
705 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
706 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
707 	uint16_t sa_idx;
708 
709 	sa_idx = HAL_RX_MSDU_END_SA_IDX_GET(msdu_end);
710 
711 	return sa_idx;
712 }
713 
714 /**
715  * hal_rx_desc_is_first_msdu_9000() - Check if first msdu
716  *
717  * @hal_soc_hdl: hal_soc handle
718  * @hw_desc_addr: hardware descriptor address
719  *
720  * Return: 0 - success/ non-zero failure
721  */
722 static uint32_t hal_rx_desc_is_first_msdu_9000(void *hw_desc_addr)
723 {
724 	struct rx_pkt_tlvs *rx_tlvs = (struct rx_pkt_tlvs *)hw_desc_addr;
725 	struct rx_msdu_end *msdu_end = &rx_tlvs->msdu_end_tlv.rx_msdu_end;
726 
727 	return HAL_RX_GET(msdu_end, RX_MSDU_END_10, FIRST_MSDU);
728 }
729 
730 /**
731  * hal_rx_msdu_end_l3_hdr_padding_get_9000(): API to get_9000 the
732  * l3_header padding from rx_msdu_end TLV
733  *
734  * @ buf: pointer to the start of RX PKT TLV headers
735  * Return: number of l3 header padding bytes
736  */
737 static uint32_t hal_rx_msdu_end_l3_hdr_padding_get_9000(uint8_t *buf)
738 {
739 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
740 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
741 	uint32_t l3_header_padding;
742 
743 	l3_header_padding = HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(msdu_end);
744 
745 	return l3_header_padding;
746 }
747 
748 /**
749  * @ hal_rx_encryption_info_valid_9000: Returns encryption type.
750  *
751  * @ buf: rx_tlv_hdr of the received packet
752  * @ Return: encryption type
753  */
754 inline uint32_t hal_rx_encryption_info_valid_9000(uint8_t *buf)
755 {
756 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
757 	struct rx_mpdu_start *mpdu_start =
758 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
759 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
760 	uint32_t encryption_info = HAL_RX_MPDU_ENCRYPTION_INFO_VALID(mpdu_info);
761 
762 	return encryption_info;
763 }
764 
765 /*
766  * @ hal_rx_print_pn_9000: Prints the PN of rx packet.
767  *
768  * @ buf: rx_tlv_hdr of the received packet
769  * @ Return: void
770  */
771 static void hal_rx_print_pn_9000(uint8_t *buf)
772 {
773 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
774 	struct rx_mpdu_start *mpdu_start =
775 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
776 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
777 
778 	uint32_t pn_31_0 = HAL_RX_MPDU_PN_31_0_GET(mpdu_info);
779 	uint32_t pn_63_32 = HAL_RX_MPDU_PN_63_32_GET(mpdu_info);
780 	uint32_t pn_95_64 = HAL_RX_MPDU_PN_95_64_GET(mpdu_info);
781 	uint32_t pn_127_96 = HAL_RX_MPDU_PN_127_96_GET(mpdu_info);
782 
783 	hal_debug("PN number pn_127_96 0x%x pn_95_64 0x%x pn_63_32 0x%x pn_31_0 0x%x ",
784 		  pn_127_96, pn_95_64, pn_63_32, pn_31_0);
785 }
786 
787 /**
788  * hal_rx_msdu_end_first_msdu_get_9000: API to get first msdu status
789  * from rx_msdu_end TLV
790  *
791  * @ buf: pointer to the start of RX PKT TLV headers
792  * Return: first_msdu
793  */
794 static uint8_t hal_rx_msdu_end_first_msdu_get_9000(uint8_t *buf)
795 {
796 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
797 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
798 	uint8_t first_msdu;
799 
800 	first_msdu = HAL_RX_MSDU_END_FIRST_MSDU_GET(msdu_end);
801 
802 	return first_msdu;
803 }
804 
805 /**
806  * hal_rx_msdu_end_da_is_valid_get_9000: API to check if da is valid
807  * from rx_msdu_end TLV
808  *
809  * @ buf: pointer to the start of RX PKT TLV headers
810  * Return: da_is_valid
811  */
812 static uint8_t hal_rx_msdu_end_da_is_valid_get_9000(uint8_t *buf)
813 {
814 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
815 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
816 	uint8_t da_is_valid;
817 
818 	da_is_valid = HAL_RX_MSDU_END_DA_IS_VALID_GET(msdu_end);
819 
820 	return da_is_valid;
821 }
822 
823 /**
824  * hal_rx_msdu_end_last_msdu_get_9000: API to get last msdu status
825  * from rx_msdu_end TLV
826  *
827  * @ buf: pointer to the start of RX PKT TLV headers
828  * Return: last_msdu
829  */
830 static uint8_t hal_rx_msdu_end_last_msdu_get_9000(uint8_t *buf)
831 {
832 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
833 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
834 	uint8_t last_msdu;
835 
836 	last_msdu = HAL_RX_MSDU_END_LAST_MSDU_GET(msdu_end);
837 
838 	return last_msdu;
839 }
840 
841 /*
842  * hal_rx_get_mpdu_mac_ad4_valid(): Retrieves if mpdu 4th addr is valid
843  *
844  * @nbuf: Network buffer
845  * Returns: value of mpdu 4th address valid field
846  */
847 inline bool hal_rx_get_mpdu_mac_ad4_valid_9000(uint8_t *buf)
848 {
849 	struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
850 	struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
851 	bool ad4_valid = 0;
852 
853 	ad4_valid = HAL_RX_MPDU_MAC_ADDR_AD4_VALID_GET(rx_mpdu_info);
854 
855 	return ad4_valid;
856 }
857 
858 /**
859  * hal_rx_mpdu_start_sw_peer_id_get_9000: Retrieve sw peer_id
860  * @buf: network buffer
861  *
862  * Return: sw peer_id
863  */
864 static uint32_t hal_rx_mpdu_start_sw_peer_id_get_9000(uint8_t *buf)
865 {
866 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
867 	struct rx_mpdu_start *mpdu_start =
868 			&pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
869 
870 	return HAL_RX_MPDU_INFO_SW_PEER_ID_GET(
871 		&mpdu_start->rx_mpdu_info_details);
872 }
873 
874 /*
875  * hal_rx_mpdu_get_to_ds_9000(): API to get the tods info
876  * from rx_mpdu_start
877  *
878  * @buf: pointer to the start of RX PKT TLV header
879  * Return: uint32_t(to_ds)
880  */
881 static uint32_t hal_rx_mpdu_get_to_ds_9000(uint8_t *buf)
882 {
883 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
884 	struct rx_mpdu_start *mpdu_start =
885 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
886 
887 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
888 
889 	return HAL_RX_MPDU_GET_TODS(mpdu_info);
890 }
891 
892 /*
893  * hal_rx_mpdu_get_fr_ds_9000(): API to get the from ds info
894  * from rx_mpdu_start
895  *
896  * @buf: pointer to the start of RX PKT TLV header
897  * Return: uint32_t(fr_ds)
898  */
899 static uint32_t hal_rx_mpdu_get_fr_ds_9000(uint8_t *buf)
900 {
901 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
902 	struct rx_mpdu_start *mpdu_start =
903 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
904 
905 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
906 
907 	return HAL_RX_MPDU_GET_FROMDS(mpdu_info);
908 }
909 
910 /*
911  * hal_rx_get_mpdu_frame_control_valid_9000(): Retrieves mpdu
912  * frame control valid
913  *
914  * @nbuf: Network buffer
915  * Returns: value of frame control valid field
916  */
917 static uint8_t hal_rx_get_mpdu_frame_control_valid_9000(uint8_t *buf)
918 {
919 	struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
920 	struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
921 
922 	return HAL_RX_MPDU_GET_FRAME_CONTROL_VALID(rx_mpdu_info);
923 }
924 
925 /*
926  * hal_rx_mpdu_get_addr1_9000(): API to check get address1 of the mpdu
927  *
928  * @buf: pointer to the start of RX PKT TLV headera
929  * @mac_addr: pointer to mac address
930  * Return: success/failure
931  */
932 static QDF_STATUS hal_rx_mpdu_get_addr1_9000(uint8_t *buf,
933 					     uint8_t *mac_addr)
934 {
935 	struct __attribute__((__packed__)) hal_addr1 {
936 		uint32_t ad1_31_0;
937 		uint16_t ad1_47_32;
938 	};
939 
940 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
941 	struct rx_mpdu_start *mpdu_start =
942 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
943 
944 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
945 	struct hal_addr1 *addr = (struct hal_addr1 *)mac_addr;
946 	uint32_t mac_addr_ad1_valid;
947 
948 	mac_addr_ad1_valid = HAL_RX_MPDU_MAC_ADDR_AD1_VALID_GET(mpdu_info);
949 
950 	if (mac_addr_ad1_valid) {
951 		addr->ad1_31_0 = HAL_RX_MPDU_AD1_31_0_GET(mpdu_info);
952 		addr->ad1_47_32 = HAL_RX_MPDU_AD1_47_32_GET(mpdu_info);
953 		return QDF_STATUS_SUCCESS;
954 	}
955 
956 	return QDF_STATUS_E_FAILURE;
957 }
958 
959 /*
960  * hal_rx_mpdu_get_addr2_9000(): API to check get address2 of the mpdu
961  * in the packet
962  *
963  * @buf: pointer to the start of RX PKT TLV header
964  * @mac_addr: pointer to mac address
965  * Return: success/failure
966  */
967 static QDF_STATUS hal_rx_mpdu_get_addr2_9000(uint8_t *buf, uint8_t *mac_addr)
968 {
969 	struct __attribute__((__packed__)) hal_addr2 {
970 		uint16_t ad2_15_0;
971 		uint32_t ad2_47_16;
972 	};
973 
974 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
975 	struct rx_mpdu_start *mpdu_start =
976 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
977 
978 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
979 	struct hal_addr2 *addr = (struct hal_addr2 *)mac_addr;
980 	uint32_t mac_addr_ad2_valid;
981 
982 	mac_addr_ad2_valid = HAL_RX_MPDU_MAC_ADDR_AD2_VALID_GET(mpdu_info);
983 
984 	if (mac_addr_ad2_valid) {
985 		addr->ad2_15_0 = HAL_RX_MPDU_AD2_15_0_GET(mpdu_info);
986 		addr->ad2_47_16 = HAL_RX_MPDU_AD2_47_16_GET(mpdu_info);
987 		return QDF_STATUS_SUCCESS;
988 	}
989 
990 	return QDF_STATUS_E_FAILURE;
991 }
992 
993 /*
994  * hal_rx_mpdu_get_addr3_9000(): API to get address3 of the mpdu
995  * in the packet
996  *
997  * @buf: pointer to the start of RX PKT TLV header
998  * @mac_addr: pointer to mac address
999  * Return: success/failure
1000  */
1001 static QDF_STATUS hal_rx_mpdu_get_addr3_9000(uint8_t *buf, uint8_t *mac_addr)
1002 {
1003 	struct __attribute__((__packed__)) hal_addr3 {
1004 		uint32_t ad3_31_0;
1005 		uint16_t ad3_47_32;
1006 	};
1007 
1008 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1009 	struct rx_mpdu_start *mpdu_start =
1010 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
1011 
1012 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
1013 	struct hal_addr3 *addr = (struct hal_addr3 *)mac_addr;
1014 	uint32_t mac_addr_ad3_valid;
1015 
1016 	mac_addr_ad3_valid = HAL_RX_MPDU_MAC_ADDR_AD3_VALID_GET(mpdu_info);
1017 
1018 	if (mac_addr_ad3_valid) {
1019 		addr->ad3_31_0 = HAL_RX_MPDU_AD3_31_0_GET(mpdu_info);
1020 		addr->ad3_47_32 = HAL_RX_MPDU_AD3_47_32_GET(mpdu_info);
1021 		return QDF_STATUS_SUCCESS;
1022 	}
1023 
1024 	return QDF_STATUS_E_FAILURE;
1025 }
1026 
1027 /*
1028  * hal_rx_mpdu_get_addr4_9000(): API to get address4 of the mpdu
1029  * in the packet
1030  *
1031  * @buf: pointer to the start of RX PKT TLV header
1032  * @mac_addr: pointer to mac address
1033  * Return: success/failure
1034  */
1035 static QDF_STATUS hal_rx_mpdu_get_addr4_9000(uint8_t *buf, uint8_t *mac_addr)
1036 {
1037 	struct __attribute__((__packed__)) hal_addr4 {
1038 		uint32_t ad4_31_0;
1039 		uint16_t ad4_47_32;
1040 	};
1041 
1042 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1043 	struct rx_mpdu_start *mpdu_start =
1044 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
1045 
1046 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
1047 	struct hal_addr4 *addr = (struct hal_addr4 *)mac_addr;
1048 	uint32_t mac_addr_ad4_valid;
1049 
1050 	mac_addr_ad4_valid = HAL_RX_MPDU_MAC_ADDR_AD4_VALID_GET(mpdu_info);
1051 
1052 	if (mac_addr_ad4_valid) {
1053 		addr->ad4_31_0 = HAL_RX_MPDU_AD4_31_0_GET(mpdu_info);
1054 		addr->ad4_47_32 = HAL_RX_MPDU_AD4_47_32_GET(mpdu_info);
1055 		return QDF_STATUS_SUCCESS;
1056 	}
1057 
1058 	return QDF_STATUS_E_FAILURE;
1059 }
1060 
1061 /*
1062  * hal_rx_get_mpdu_sequence_control_valid_9000(): Get mpdu
1063  * sequence control valid
1064  *
1065  * @nbuf: Network buffer
1066  * Returns: value of sequence control valid field
1067  */
1068 static uint8_t hal_rx_get_mpdu_sequence_control_valid_9000(uint8_t *buf)
1069 {
1070 	struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
1071 	struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
1072 
1073 	return HAL_RX_MPDU_GET_SEQUENCE_CONTROL_VALID(rx_mpdu_info);
1074 }
1075 
1076 /**
1077  * hal_rx_is_unicast_9000: check packet is unicast frame or not.
1078  *
1079  * @ buf: pointer to rx pkt TLV.
1080  *
1081  * Return: true on unicast.
1082  */
1083 static bool hal_rx_is_unicast_9000(uint8_t *buf)
1084 {
1085 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1086 	struct rx_mpdu_start *mpdu_start =
1087 		&pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
1088 	uint32_t grp_id;
1089 	uint8_t *rx_mpdu_info = (uint8_t *)&mpdu_start->rx_mpdu_info_details;
1090 
1091 	grp_id = (_HAL_MS((*_OFFSET_TO_WORD_PTR((rx_mpdu_info),
1092 			   RX_MPDU_INFO_9_SW_FRAME_GROUP_ID_OFFSET)),
1093 			  RX_MPDU_INFO_9_SW_FRAME_GROUP_ID_MASK,
1094 			  RX_MPDU_INFO_9_SW_FRAME_GROUP_ID_LSB));
1095 
1096 	return (HAL_MPDU_SW_FRAME_GROUP_UNICAST_DATA == grp_id) ? true : false;
1097 }
1098 
1099 /**
1100  * hal_rx_tid_get_9000: get tid based on qos control valid.
1101  * @hal_soc_hdl: hal soc handle
1102  * @buf: pointer to rx pkt TLV.
1103  *
1104  * Return: tid
1105  */
1106 static uint32_t hal_rx_tid_get_9000(hal_soc_handle_t hal_soc_hdl, uint8_t *buf)
1107 {
1108 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1109 	struct rx_mpdu_start *mpdu_start =
1110 	&pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
1111 	uint8_t *rx_mpdu_info = (uint8_t *)&mpdu_start->rx_mpdu_info_details;
1112 	uint8_t qos_control_valid =
1113 		(_HAL_MS((*_OFFSET_TO_WORD_PTR((rx_mpdu_info),
1114 			  RX_MPDU_INFO_11_MPDU_QOS_CONTROL_VALID_OFFSET)),
1115 			 RX_MPDU_INFO_11_MPDU_QOS_CONTROL_VALID_MASK,
1116 			 RX_MPDU_INFO_11_MPDU_QOS_CONTROL_VALID_LSB));
1117 
1118 	if (qos_control_valid)
1119 		return hal_rx_mpdu_start_tid_get_9000(buf);
1120 
1121 	return HAL_RX_NON_QOS_TID;
1122 }
1123 
1124 /**
1125  * hal_rx_hw_desc_get_ppduid_get_9000(): retrieve ppdu id
1126  * @rx_tlv_hdr: rx tlv header
1127  * @rxdma_dst_ring_desc: rxdma HW descriptor
1128  *
1129  * Return: ppdu id
1130  */
1131 static uint32_t hal_rx_hw_desc_get_ppduid_get_9000(void *rx_tlv_hdr,
1132 						   void *rxdma_dst_ring_desc)
1133 {
1134 	struct reo_entrance_ring *reo_ent = rxdma_dst_ring_desc;
1135 
1136 	return reo_ent->phy_ppdu_id;
1137 }
1138 
1139 /**
1140  * hal_reo_status_get_header_9000 - Process reo desc info
1141  * @ring_desc: REO status ring descriptor
1142  * @b - tlv type info
1143  * @h1 - Pointer to hal_reo_status_header where info to be stored
1144  *
1145  * Return - none.
1146  *
1147  */
1148 static void hal_reo_status_get_header_9000(hal_ring_desc_t ring_desc, int b,
1149 					   void *h1)
1150 {
1151 	uint32_t *d = (uint32_t *)ring_desc;
1152 	uint32_t val1 = 0;
1153 	struct hal_reo_status_header *h =
1154 			(struct hal_reo_status_header *)h1;
1155 
1156 	/* Offsets of descriptor fields defined in HW headers start
1157 	 * from the field after TLV header
1158 	 */
1159 	d += HAL_GET_NUM_DWORDS(sizeof(struct tlv_32_hdr));
1160 
1161 	switch (b) {
1162 	case HAL_REO_QUEUE_STATS_STATUS_TLV:
1163 		val1 = d[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_0,
1164 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
1165 		break;
1166 	case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
1167 		val1 = d[HAL_OFFSET_DW(REO_FLUSH_QUEUE_STATUS_0,
1168 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
1169 		break;
1170 	case HAL_REO_FLUSH_CACHE_STATUS_TLV:
1171 		val1 = d[HAL_OFFSET_DW(REO_FLUSH_CACHE_STATUS_0,
1172 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
1173 		break;
1174 	case HAL_REO_UNBLK_CACHE_STATUS_TLV:
1175 		val1 = d[HAL_OFFSET_DW(REO_UNBLOCK_CACHE_STATUS_0,
1176 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
1177 		break;
1178 	case HAL_REO_TIMOUT_LIST_STATUS_TLV:
1179 		val1 = d[HAL_OFFSET_DW(REO_FLUSH_TIMEOUT_LIST_STATUS_0,
1180 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
1181 		break;
1182 	case HAL_REO_DESC_THRES_STATUS_TLV:
1183 		val1 =
1184 		  d[HAL_OFFSET_DW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_0,
1185 		  UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
1186 		break;
1187 	case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
1188 		val1 = d[HAL_OFFSET_DW(REO_UPDATE_RX_REO_QUEUE_STATUS_0,
1189 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
1190 		break;
1191 	default:
1192 		qdf_nofl_err("ERROR: Unknown tlv\n");
1193 		break;
1194 	}
1195 	h->cmd_num =
1196 		HAL_GET_FIELD(
1197 			      UNIFORM_REO_STATUS_HEADER_0, REO_STATUS_NUMBER,
1198 			      val1);
1199 	h->exec_time =
1200 		HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER_0,
1201 			      CMD_EXECUTION_TIME, val1);
1202 	h->status =
1203 		HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER_0,
1204 			      REO_CMD_EXECUTION_STATUS, val1);
1205 	switch (b) {
1206 	case HAL_REO_QUEUE_STATS_STATUS_TLV:
1207 		val1 = d[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_1,
1208 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
1209 		break;
1210 	case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
1211 		val1 = d[HAL_OFFSET_DW(REO_FLUSH_QUEUE_STATUS_1,
1212 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
1213 		break;
1214 	case HAL_REO_FLUSH_CACHE_STATUS_TLV:
1215 		val1 = d[HAL_OFFSET_DW(REO_FLUSH_CACHE_STATUS_1,
1216 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
1217 		break;
1218 	case HAL_REO_UNBLK_CACHE_STATUS_TLV:
1219 		val1 = d[HAL_OFFSET_DW(REO_UNBLOCK_CACHE_STATUS_1,
1220 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
1221 		break;
1222 	case HAL_REO_TIMOUT_LIST_STATUS_TLV:
1223 		val1 = d[HAL_OFFSET_DW(REO_FLUSH_TIMEOUT_LIST_STATUS_1,
1224 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
1225 		break;
1226 	case HAL_REO_DESC_THRES_STATUS_TLV:
1227 		val1 =
1228 		  d[HAL_OFFSET_DW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_1,
1229 		  UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
1230 		break;
1231 	case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
1232 		val1 = d[HAL_OFFSET_DW(REO_UPDATE_RX_REO_QUEUE_STATUS_1,
1233 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
1234 		break;
1235 	default:
1236 		qdf_nofl_err("ERROR: Unknown tlv\n");
1237 		break;
1238 	}
1239 	h->tstamp =
1240 		HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER_1, TIMESTAMP, val1);
1241 }
1242 
1243 /**
1244  * hal_rx_mpdu_start_mpdu_qos_control_valid_get_9000():
1245  * Retrieve qos control valid bit from the tlv.
1246  * @buf: pointer to rx pkt TLV.
1247  *
1248  * Return: qos control value.
1249  */
1250 static inline uint32_t
1251 hal_rx_mpdu_start_mpdu_qos_control_valid_get_9000(uint8_t *buf)
1252 {
1253 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1254 	struct rx_mpdu_start *mpdu_start =
1255 			&pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
1256 
1257 	return HAL_RX_MPDU_INFO_QOS_CONTROL_VALID_GET(
1258 		&mpdu_start->rx_mpdu_info_details);
1259 }
1260 
1261 /**
1262  * hal_rx_msdu_end_sa_sw_peer_id_get_9000(): API to get the
1263  * sa_sw_peer_id from rx_msdu_end TLV
1264  * @buf: pointer to the start of RX PKT TLV headers
1265  *
1266  * Return: sa_sw_peer_id index
1267  */
1268 static inline uint32_t
1269 hal_rx_msdu_end_sa_sw_peer_id_get_9000(uint8_t *buf)
1270 {
1271 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1272 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
1273 
1274 	return HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(msdu_end);
1275 }
1276 
1277 /**
1278  * hal_tx_desc_set_mesh_en_9000 - Set mesh_enable flag in Tx descriptor
1279  * @desc: Handle to Tx Descriptor
1280  * @en:   For raw WiFi frames, this indicates transmission to a mesh STA,
1281  *        enabling the interpretation of the 'Mesh Control Present' bit
1282  *        (bit 8) of QoS Control (otherwise this bit is ignored),
1283  *        For native WiFi frames, this indicates that a 'Mesh Control' field
1284  *        is present between the header and the LLC.
1285  *
1286  * Return: void
1287  */
1288 static inline
1289 void hal_tx_desc_set_mesh_en_9000(void *desc, uint8_t en)
1290 {
1291 	HAL_SET_FLD(desc, TCL_DATA_CMD_5, MESH_ENABLE) |=
1292 		HAL_TX_SM(TCL_DATA_CMD_5, MESH_ENABLE, en);
1293 }
1294 
1295 static
1296 void *hal_rx_msdu0_buffer_addr_lsb_9000(void *link_desc_va)
1297 {
1298 	return (void *)HAL_RX_MSDU0_BUFFER_ADDR_LSB(link_desc_va);
1299 }
1300 
1301 static
1302 void *hal_rx_msdu_desc_info_ptr_get_9000(void *msdu0)
1303 {
1304 	return (void *)HAL_RX_MSDU_DESC_INFO_PTR_GET(msdu0);
1305 }
1306 
1307 static
1308 void *hal_ent_mpdu_desc_info_9000(void *ent_ring_desc)
1309 {
1310 	return (void *)HAL_ENT_MPDU_DESC_INFO(ent_ring_desc);
1311 }
1312 
1313 static
1314 void *hal_dst_mpdu_desc_info_9000(void *dst_ring_desc)
1315 {
1316 	return (void *)HAL_DST_MPDU_DESC_INFO(dst_ring_desc);
1317 }
1318 
1319 static
1320 uint8_t hal_rx_get_fc_valid_9000(uint8_t *buf)
1321 {
1322 	return HAL_RX_GET_FC_VALID(buf);
1323 }
1324 
1325 static uint8_t hal_rx_get_to_ds_flag_9000(uint8_t *buf)
1326 {
1327 	return HAL_RX_GET_TO_DS_FLAG(buf);
1328 }
1329 
1330 static uint8_t hal_rx_get_mac_addr2_valid_9000(uint8_t *buf)
1331 {
1332 	return HAL_RX_GET_MAC_ADDR2_VALID(buf);
1333 }
1334 
1335 static uint8_t hal_rx_get_filter_category_9000(uint8_t *buf)
1336 {
1337 	return HAL_RX_GET_FILTER_CATEGORY(buf);
1338 }
1339 
1340 static uint32_t
1341 hal_rx_get_ppdu_id_9000(uint8_t *buf)
1342 {
1343 	struct rx_mpdu_info *rx_mpdu_info;
1344 	struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)buf;
1345 
1346 	rx_mpdu_info =
1347 		&rx_desc->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details;
1348 
1349 	return HAL_RX_GET_PPDU_ID(rx_mpdu_info);
1350 }
1351 
1352 /**
1353  * hal_reo_config_9000(): Set reo config parameters
1354  * @soc: hal soc handle
1355  * @reg_val: value to be set
1356  * @reo_params: reo parameters
1357  *
1358  * Return: void
1359  */
1360 static void
1361 hal_reo_config_9000(struct hal_soc *soc,
1362 		    uint32_t reg_val,
1363 		    struct hal_reo_params *reo_params)
1364 {
1365 	HAL_REO_R0_CONFIG(soc, reg_val, reo_params);
1366 }
1367 
1368 /**
1369  * hal_rx_msdu_desc_info_get_ptr_9000() - Get msdu desc info ptr
1370  * @msdu_details_ptr - Pointer to msdu_details_ptr
1371  *
1372  * Return - Pointer to rx_msdu_desc_info structure.
1373  *
1374  */
1375 static void *hal_rx_msdu_desc_info_get_ptr_9000(void *msdu_details_ptr)
1376 {
1377 	return HAL_RX_MSDU_DESC_INFO_GET(msdu_details_ptr);
1378 }
1379 
1380 /**
1381  * hal_rx_link_desc_msdu0_ptr_9000 - Get pointer to rx_msdu details
1382  * @link_desc - Pointer to link desc
1383  *
1384  * Return - Pointer to rx_msdu_details structure
1385  *
1386  */
1387 static void *hal_rx_link_desc_msdu0_ptr_9000(void *link_desc)
1388 {
1389 	return HAL_RX_LINK_DESC_MSDU0_PTR(link_desc);
1390 }
1391 
1392 /**
1393  * hal_rx_msdu_flow_idx_get_9000: API to get flow index
1394  * from rx_msdu_end TLV
1395  * @buf: pointer to the start of RX PKT TLV headers
1396  *
1397  * Return: flow index value from MSDU END TLV
1398  */
1399 static inline uint32_t hal_rx_msdu_flow_idx_get_9000(uint8_t *buf)
1400 {
1401 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1402 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
1403 
1404 	return HAL_RX_MSDU_END_FLOW_IDX_GET(msdu_end);
1405 }
1406 
1407 /**
1408  * hal_rx_msdu_flow_idx_invalid_9000: API to get flow index invalid
1409  * from rx_msdu_end TLV
1410  * @buf: pointer to the start of RX PKT TLV headers
1411  *
1412  * Return: flow index invalid value from MSDU END TLV
1413  */
1414 static bool hal_rx_msdu_flow_idx_invalid_9000(uint8_t *buf)
1415 {
1416 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1417 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
1418 
1419 	return HAL_RX_MSDU_END_FLOW_IDX_INVALID_GET(msdu_end);
1420 }
1421 
1422 /**
1423  * hal_rx_msdu_flow_idx_timeout_9000: API to get flow index timeout
1424  * from rx_msdu_end TLV
1425  * @buf: pointer to the start of RX PKT TLV headers
1426  *
1427  * Return: flow index timeout value from MSDU END TLV
1428  */
1429 static bool hal_rx_msdu_flow_idx_timeout_9000(uint8_t *buf)
1430 {
1431 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1432 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
1433 
1434 	return HAL_RX_MSDU_END_FLOW_IDX_TIMEOUT_GET(msdu_end);
1435 }
1436 
1437 /**
1438  * hal_rx_msdu_fse_metadata_get_9000: API to get FSE metadata
1439  * from rx_msdu_end TLV
1440  * @buf: pointer to the start of RX PKT TLV headers
1441  *
1442  * Return: fse metadata value from MSDU END TLV
1443  */
1444 static uint32_t hal_rx_msdu_fse_metadata_get_9000(uint8_t *buf)
1445 {
1446 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1447 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
1448 
1449 	return HAL_RX_MSDU_END_FSE_METADATA_GET(msdu_end);
1450 }
1451 
1452 /**
1453  * hal_rx_msdu_cce_metadata_get_9000: API to get CCE metadata
1454  * from rx_msdu_end TLV
1455  * @buf: pointer to the start of RX PKT TLV headers
1456  *
1457  * Return: cce_metadata
1458  */
1459 static uint16_t
1460 hal_rx_msdu_cce_metadata_get_9000(uint8_t *buf)
1461 {
1462 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1463 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
1464 
1465 	return HAL_RX_MSDU_END_CCE_METADATA_GET(msdu_end);
1466 }
1467 
1468 /**
1469  * hal_rx_msdu_get_flow_params_9000: API to get flow index, flow index invalid
1470  * and flow index timeout from rx_msdu_end TLV
1471  * @buf: pointer to the start of RX PKT TLV headers
1472  * @flow_invalid: pointer to return value of flow_idx_valid
1473  * @flow_timeout: pointer to return value of flow_idx_timeout
1474  * @flow_index: pointer to return value of flow_idx
1475  *
1476  * Return: none
1477  */
1478 static inline void
1479 hal_rx_msdu_get_flow_params_9000(uint8_t *buf,
1480 				 bool *flow_invalid,
1481 				 bool *flow_timeout,
1482 				 uint32_t *flow_index)
1483 {
1484 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1485 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
1486 
1487 	*flow_invalid = HAL_RX_MSDU_END_FLOW_IDX_INVALID_GET(msdu_end);
1488 	*flow_timeout = HAL_RX_MSDU_END_FLOW_IDX_TIMEOUT_GET(msdu_end);
1489 	*flow_index = HAL_RX_MSDU_END_FLOW_IDX_GET(msdu_end);
1490 }
1491 
1492 /**
1493  * hal_rx_tlv_get_tcp_chksum_9000() - API to get tcp checksum
1494  * @buf: rx_tlv_hdr
1495  *
1496  * Return: tcp checksum
1497  */
1498 static uint16_t
1499 hal_rx_tlv_get_tcp_chksum_9000(uint8_t *buf)
1500 {
1501 	return HAL_RX_TLV_GET_TCP_CHKSUM(buf);
1502 }
1503 
1504 /**
1505  * hal_rx_get_rx_sequence_9000(): Function to retrieve rx sequence number
1506  *
1507  * @nbuf: Network buffer
1508  * Returns: rx sequence number
1509  */
1510 static
1511 uint16_t hal_rx_get_rx_sequence_9000(uint8_t *buf)
1512 {
1513 	struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
1514 	struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
1515 
1516 	return HAL_RX_MPDU_GET_SEQUENCE_NUMBER(rx_mpdu_info);
1517 }
1518 
1519 /**
1520  * hal_get_window_address_9000(): Function to get hp/tp address
1521  * @hal_soc: Pointer to hal_soc
1522  * @addr: address offset of register
1523  *
1524  * Return: modified address offset of register
1525  */
1526 static inline qdf_iomem_t hal_get_window_address_9000(struct hal_soc *hal_soc,
1527 						      qdf_iomem_t addr)
1528 {
1529 	uint32_t offset = addr - hal_soc->dev_base_addr;
1530 	qdf_iomem_t new_offset;
1531 
1532 	/*
1533 	 * If offset lies within DP register range, use 3rd window to write
1534 	 * into DP region.
1535 	 */
1536 	if ((offset ^ SEQ_WCSS_UMAC_OFFSET) < WINDOW_RANGE_MASK) {
1537 		new_offset = (hal_soc->dev_base_addr + (3 * WINDOW_START) +
1538 			  (offset & WINDOW_RANGE_MASK));
1539 	/*
1540 	 * If offset lies within CE register range, use 2nd window to write
1541 	 * into CE region.
1542 	 */
1543 	} else if ((offset ^ CE_WFSS_CE_REG_BASE) < WINDOW_RANGE_MASK) {
1544 		new_offset = (hal_soc->dev_base_addr + (2 * WINDOW_START) +
1545 			  (offset & WINDOW_RANGE_MASK));
1546 	} else {
1547 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1548 			  "%s: ERROR: Accessing Wrong register\n", __func__);
1549 		qdf_assert_always(0);
1550 		return 0;
1551 	}
1552 	return new_offset;
1553 }
1554 
1555 static inline void hal_write_window_register(struct hal_soc *hal_soc)
1556 {
1557 	/* Write value into window configuration register */
1558 	qdf_iowrite32(hal_soc->dev_base_addr + WINDOW_REG_ADDRESS,
1559 		      WINDOW_CONFIGURATION_VALUE_9000);
1560 }
1561 
1562 /**
1563  * hal_rx_msdu_packet_metadata_get_9000(): API to get the
1564  * msdu information from rx_msdu_end TLV
1565  *
1566  * @ buf: pointer to the start of RX PKT TLV headers
1567  * @ hal_rx_msdu_metadata: pointer to the msdu info structure
1568  */
1569 static void
1570 hal_rx_msdu_packet_metadata_get_9000(uint8_t *buf,
1571 				     void *msdu_pkt_metadata)
1572 {
1573 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
1574 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
1575 	struct hal_rx_msdu_metadata *msdu_metadata =
1576 		(struct hal_rx_msdu_metadata *)msdu_pkt_metadata;
1577 
1578 	msdu_metadata->l3_hdr_pad =
1579 		HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(msdu_end);
1580 	msdu_metadata->sa_idx = HAL_RX_MSDU_END_SA_IDX_GET(msdu_end);
1581 	msdu_metadata->da_idx = HAL_RX_MSDU_END_DA_IDX_GET(msdu_end);
1582 	msdu_metadata->sa_sw_peer_id =
1583 		HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(msdu_end);
1584 }
1585 
1586 /**
1587  * hal_rx_flow_setup_fse_9000() - Setup a flow search entry in HW FST
1588  * @fst: Pointer to the Rx Flow Search Table
1589  * @table_offset: offset into the table where the flow is to be setup
1590  * @flow: Flow Parameters
1591  *
1592  * Return: Success/Failure
1593  */
1594 static void *
1595 hal_rx_flow_setup_fse_9000(uint8_t *rx_fst, uint32_t table_offset,
1596 			   uint8_t *rx_flow)
1597 {
1598 	struct hal_rx_fst *fst = (struct hal_rx_fst *)rx_fst;
1599 	struct hal_rx_flow *flow = (struct hal_rx_flow *)rx_flow;
1600 	uint8_t *fse;
1601 	bool fse_valid;
1602 
1603 	if (table_offset >= fst->max_entries) {
1604 		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
1605 			  "HAL FSE table offset %u exceeds max entries %u",
1606 			  table_offset, fst->max_entries);
1607 		return NULL;
1608 	}
1609 
1610 	fse = (uint8_t *)fst->base_vaddr +
1611 			(table_offset * HAL_RX_FST_ENTRY_SIZE);
1612 
1613 	fse_valid = HAL_GET_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, VALID);
1614 
1615 	if (fse_valid) {
1616 		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
1617 			  "HAL FSE %pK already valid", fse);
1618 		return NULL;
1619 	}
1620 
1621 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY_0, SRC_IP_127_96) =
1622 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY_0, SRC_IP_127_96,
1623 			       qdf_htonl(flow->tuple_info.src_ip_127_96));
1624 
1625 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY_1, SRC_IP_95_64) =
1626 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY_1, SRC_IP_95_64,
1627 			       qdf_htonl(flow->tuple_info.src_ip_95_64));
1628 
1629 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY_2, SRC_IP_63_32) =
1630 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY_2, SRC_IP_63_32,
1631 			       qdf_htonl(flow->tuple_info.src_ip_63_32));
1632 
1633 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY_3, SRC_IP_31_0) =
1634 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY_3, SRC_IP_31_0,
1635 			       qdf_htonl(flow->tuple_info.src_ip_31_0));
1636 
1637 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY_4, DEST_IP_127_96) =
1638 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY_4, DEST_IP_127_96,
1639 			       qdf_htonl(flow->tuple_info.dest_ip_127_96));
1640 
1641 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY_5, DEST_IP_95_64) =
1642 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY_5, DEST_IP_95_64,
1643 			       qdf_htonl(flow->tuple_info.dest_ip_95_64));
1644 
1645 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY_6, DEST_IP_63_32) =
1646 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY_6, DEST_IP_63_32,
1647 			       qdf_htonl(flow->tuple_info.dest_ip_63_32));
1648 
1649 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY_7, DEST_IP_31_0) =
1650 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY_7, DEST_IP_31_0,
1651 			       qdf_htonl(flow->tuple_info.dest_ip_31_0));
1652 
1653 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY_8, DEST_PORT);
1654 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY_8, DEST_PORT) |=
1655 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY_8, DEST_PORT,
1656 			       (flow->tuple_info.dest_port));
1657 
1658 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY_8, SRC_PORT);
1659 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY_8, SRC_PORT) |=
1660 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY_8, SRC_PORT,
1661 			       (flow->tuple_info.src_port));
1662 
1663 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, L4_PROTOCOL);
1664 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, L4_PROTOCOL) |=
1665 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY_9, L4_PROTOCOL,
1666 			       flow->tuple_info.l4_protocol);
1667 
1668 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, REO_DESTINATION_HANDLER);
1669 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, REO_DESTINATION_HANDLER) |=
1670 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY_9, REO_DESTINATION_HANDLER,
1671 			       flow->reo_destination_handler);
1672 
1673 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, VALID);
1674 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, VALID) |=
1675 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY_9, VALID, 1);
1676 
1677 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY_10, METADATA);
1678 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY_10, METADATA) =
1679 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY_10, METADATA,
1680 			       flow->fse_metadata);
1681 
1682 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, REO_DESTINATION_INDICATION);
1683 	HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, REO_DESTINATION_INDICATION) |=
1684 		HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY_9,
1685 			       REO_DESTINATION_INDICATION,
1686 			       flow->reo_destination_indication);
1687 
1688 	/* Reset all the other fields in FSE */
1689 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, RESERVED_9);
1690 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, MSDU_DROP);
1691 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY_11, MSDU_COUNT);
1692 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY_12, MSDU_BYTE_COUNT);
1693 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY_13, TIMESTAMP);
1694 
1695 	return fse;
1696 }
1697 
1698 static
1699 void hal_compute_reo_remap_ix2_ix3_9000(uint32_t *ring, uint32_t num_rings,
1700 					uint32_t *remap1, uint32_t *remap2)
1701 {
1702 	switch (num_rings) {
1703 	case 1:
1704 		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
1705 				HAL_REO_REMAP_IX2(ring[0], 17) |
1706 				HAL_REO_REMAP_IX2(ring[0], 18) |
1707 				HAL_REO_REMAP_IX2(ring[0], 19) |
1708 				HAL_REO_REMAP_IX2(ring[0], 20) |
1709 				HAL_REO_REMAP_IX2(ring[0], 21) |
1710 				HAL_REO_REMAP_IX2(ring[0], 22) |
1711 				HAL_REO_REMAP_IX2(ring[0], 23);
1712 
1713 		*remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
1714 				HAL_REO_REMAP_IX3(ring[0], 25) |
1715 				HAL_REO_REMAP_IX3(ring[0], 26) |
1716 				HAL_REO_REMAP_IX3(ring[0], 27) |
1717 				HAL_REO_REMAP_IX3(ring[0], 28) |
1718 				HAL_REO_REMAP_IX3(ring[0], 29) |
1719 				HAL_REO_REMAP_IX3(ring[0], 30) |
1720 				HAL_REO_REMAP_IX3(ring[0], 31);
1721 		break;
1722 	case 2:
1723 		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
1724 				HAL_REO_REMAP_IX2(ring[0], 17) |
1725 				HAL_REO_REMAP_IX2(ring[1], 18) |
1726 				HAL_REO_REMAP_IX2(ring[1], 19) |
1727 				HAL_REO_REMAP_IX2(ring[0], 20) |
1728 				HAL_REO_REMAP_IX2(ring[0], 21) |
1729 				HAL_REO_REMAP_IX2(ring[1], 22) |
1730 				HAL_REO_REMAP_IX2(ring[1], 23);
1731 
1732 		*remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
1733 				HAL_REO_REMAP_IX3(ring[0], 25) |
1734 				HAL_REO_REMAP_IX3(ring[1], 26) |
1735 				HAL_REO_REMAP_IX3(ring[1], 27) |
1736 				HAL_REO_REMAP_IX3(ring[0], 28) |
1737 				HAL_REO_REMAP_IX3(ring[0], 29) |
1738 				HAL_REO_REMAP_IX3(ring[1], 30) |
1739 				HAL_REO_REMAP_IX3(ring[1], 31);
1740 		break;
1741 	case 3:
1742 		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
1743 				HAL_REO_REMAP_IX2(ring[1], 17) |
1744 				HAL_REO_REMAP_IX2(ring[2], 18) |
1745 				HAL_REO_REMAP_IX2(ring[0], 19) |
1746 				HAL_REO_REMAP_IX2(ring[1], 20) |
1747 				HAL_REO_REMAP_IX2(ring[2], 21) |
1748 				HAL_REO_REMAP_IX2(ring[0], 22) |
1749 				HAL_REO_REMAP_IX2(ring[1], 23);
1750 
1751 		*remap2 = HAL_REO_REMAP_IX3(ring[2], 24) |
1752 				HAL_REO_REMAP_IX3(ring[0], 25) |
1753 				HAL_REO_REMAP_IX3(ring[1], 26) |
1754 				HAL_REO_REMAP_IX3(ring[2], 27) |
1755 				HAL_REO_REMAP_IX3(ring[0], 28) |
1756 				HAL_REO_REMAP_IX3(ring[1], 29) |
1757 				HAL_REO_REMAP_IX3(ring[2], 30) |
1758 				HAL_REO_REMAP_IX3(ring[0], 31);
1759 		break;
1760 	case 4:
1761 		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
1762 				HAL_REO_REMAP_IX2(ring[1], 17) |
1763 				HAL_REO_REMAP_IX2(ring[2], 18) |
1764 				HAL_REO_REMAP_IX2(ring[3], 19) |
1765 				HAL_REO_REMAP_IX2(ring[0], 20) |
1766 				HAL_REO_REMAP_IX2(ring[1], 21) |
1767 				HAL_REO_REMAP_IX2(ring[2], 22) |
1768 				HAL_REO_REMAP_IX2(ring[3], 23);
1769 
1770 		*remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
1771 				HAL_REO_REMAP_IX3(ring[1], 25) |
1772 				HAL_REO_REMAP_IX3(ring[2], 26) |
1773 				HAL_REO_REMAP_IX3(ring[3], 27) |
1774 				HAL_REO_REMAP_IX3(ring[0], 28) |
1775 				HAL_REO_REMAP_IX3(ring[1], 29) |
1776 				HAL_REO_REMAP_IX3(ring[2], 30) |
1777 				HAL_REO_REMAP_IX3(ring[3], 31);
1778 		break;
1779 	}
1780 }
1781 
1782 static void hal_hw_txrx_ops_attach_qcn9000(struct hal_soc *hal_soc)
1783 {
1784 
1785 	/* init and setup */
1786 	hal_soc->ops->hal_srng_dst_hw_init = hal_srng_dst_hw_init_generic;
1787 	hal_soc->ops->hal_srng_src_hw_init = hal_srng_src_hw_init_generic;
1788 	hal_soc->ops->hal_get_hw_hptp = hal_get_hw_hptp_generic;
1789 	hal_soc->ops->hal_reo_setup = hal_reo_setup_generic_li;
1790 	hal_soc->ops->hal_get_window_address = hal_get_window_address_9000;
1791 
1792 	/* tx */
1793 	hal_soc->ops->hal_tx_desc_set_dscp_tid_table_id =
1794 		hal_tx_desc_set_dscp_tid_table_id_9000;
1795 	hal_soc->ops->hal_tx_set_dscp_tid_map = hal_tx_set_dscp_tid_map_9000;
1796 	hal_soc->ops->hal_tx_update_dscp_tid = hal_tx_update_dscp_tid_9000;
1797 	hal_soc->ops->hal_tx_desc_set_lmac_id = hal_tx_desc_set_lmac_id_9000;
1798 	hal_soc->ops->hal_tx_desc_set_buf_addr =
1799 					hal_tx_desc_set_buf_addr_generic_li;
1800 	hal_soc->ops->hal_tx_desc_set_search_type =
1801 					hal_tx_desc_set_search_type_generic_li;
1802 	hal_soc->ops->hal_tx_desc_set_search_index =
1803 					hal_tx_desc_set_search_index_generic_li;
1804 	hal_soc->ops->hal_tx_desc_set_cache_set_num =
1805 				hal_tx_desc_set_cache_set_num_generic_li;
1806 	hal_soc->ops->hal_tx_comp_get_status =
1807 					hal_tx_comp_get_status_generic_li;
1808 	hal_soc->ops->hal_tx_comp_get_release_reason =
1809 		hal_tx_comp_get_release_reason_generic_li;
1810 	hal_soc->ops->hal_get_wbm_internal_error =
1811 					hal_get_wbm_internal_error_generic_li;
1812 	hal_soc->ops->hal_tx_desc_set_mesh_en = hal_tx_desc_set_mesh_en_9000;
1813 	hal_soc->ops->hal_tx_init_cmd_credit_ring =
1814 					hal_tx_init_cmd_credit_ring_9000;
1815 
1816 	/* rx */
1817 	hal_soc->ops->hal_rx_msdu_start_nss_get =
1818 					hal_rx_msdu_start_nss_get_9000;
1819 	hal_soc->ops->hal_rx_mon_hw_desc_get_mpdu_status =
1820 		hal_rx_mon_hw_desc_get_mpdu_status_9000;
1821 	hal_soc->ops->hal_rx_get_tlv = hal_rx_get_tlv_9000;
1822 	hal_soc->ops->hal_rx_proc_phyrx_other_receive_info_tlv =
1823 		hal_rx_proc_phyrx_other_receive_info_tlv_9000;
1824 	hal_soc->ops->hal_rx_dump_msdu_start_tlv =
1825 					hal_rx_dump_msdu_start_tlv_9000;
1826 	hal_soc->ops->hal_rx_dump_msdu_end_tlv = hal_rx_dump_msdu_end_tlv_9000;
1827 	hal_soc->ops->hal_get_link_desc_size = hal_get_link_desc_size_9000;
1828 	hal_soc->ops->hal_rx_mpdu_start_tid_get =
1829 					hal_rx_mpdu_start_tid_get_9000;
1830 	hal_soc->ops->hal_rx_msdu_start_reception_type_get =
1831 		hal_rx_msdu_start_reception_type_get_9000;
1832 	hal_soc->ops->hal_rx_msdu_end_da_idx_get =
1833 					hal_rx_msdu_end_da_idx_get_9000;
1834 	hal_soc->ops->hal_rx_msdu_desc_info_get_ptr =
1835 					hal_rx_msdu_desc_info_get_ptr_9000;
1836 	hal_soc->ops->hal_rx_link_desc_msdu0_ptr =
1837 					hal_rx_link_desc_msdu0_ptr_9000;
1838 	hal_soc->ops->hal_reo_status_get_header =
1839 					hal_reo_status_get_header_9000;
1840 	hal_soc->ops->hal_rx_status_get_tlv_info =
1841 					hal_rx_status_get_tlv_info_generic_li;
1842 	hal_soc->ops->hal_rx_wbm_err_info_get =
1843 					hal_rx_wbm_err_info_get_generic_li;
1844 	hal_soc->ops->hal_rx_dump_mpdu_start_tlv =
1845 					hal_rx_dump_mpdu_start_tlv_generic_li;
1846 
1847 	hal_soc->ops->hal_tx_set_pcp_tid_map =
1848 					hal_tx_set_pcp_tid_map_generic_li;
1849 	hal_soc->ops->hal_tx_update_pcp_tid_map =
1850 					hal_tx_update_pcp_tid_generic_li;
1851 	hal_soc->ops->hal_tx_set_tidmap_prty =
1852 					hal_tx_update_tidmap_prty_generic_li;
1853 	hal_soc->ops->hal_rx_get_rx_fragment_number =
1854 					hal_rx_get_rx_fragment_number_9000;
1855 	hal_soc->ops->hal_rx_msdu_end_da_is_mcbc_get =
1856 					hal_rx_msdu_end_da_is_mcbc_get_9000;
1857 	hal_soc->ops->hal_rx_msdu_end_sa_is_valid_get =
1858 					hal_rx_msdu_end_sa_is_valid_get_9000;
1859 	hal_soc->ops->hal_rx_msdu_end_sa_idx_get =
1860 					hal_rx_msdu_end_sa_idx_get_9000;
1861 	hal_soc->ops->hal_rx_desc_is_first_msdu =
1862 					hal_rx_desc_is_first_msdu_9000;
1863 	hal_soc->ops->hal_rx_msdu_end_l3_hdr_padding_get =
1864 	hal_rx_msdu_end_l3_hdr_padding_get_9000;
1865 	hal_soc->ops->hal_rx_encryption_info_valid =
1866 					hal_rx_encryption_info_valid_9000;
1867 	hal_soc->ops->hal_rx_print_pn = hal_rx_print_pn_9000;
1868 	hal_soc->ops->hal_rx_msdu_end_first_msdu_get =
1869 					hal_rx_msdu_end_first_msdu_get_9000;
1870 	hal_soc->ops->hal_rx_msdu_end_da_is_valid_get =
1871 					hal_rx_msdu_end_da_is_valid_get_9000;
1872 	hal_soc->ops->hal_rx_msdu_end_last_msdu_get =
1873 					hal_rx_msdu_end_last_msdu_get_9000;
1874 	hal_soc->ops->hal_rx_get_mpdu_mac_ad4_valid =
1875 					hal_rx_get_mpdu_mac_ad4_valid_9000;
1876 	hal_soc->ops->hal_rx_mpdu_start_sw_peer_id_get =
1877 		hal_rx_mpdu_start_sw_peer_id_get_9000;
1878 	hal_soc->ops->hal_rx_tlv_peer_meta_data_get =
1879 		hal_rx_mpdu_peer_meta_data_get_li;
1880 	hal_soc->ops->hal_rx_mpdu_get_to_ds = hal_rx_mpdu_get_to_ds_9000;
1881 	hal_soc->ops->hal_rx_mpdu_get_fr_ds = hal_rx_mpdu_get_fr_ds_9000;
1882 	hal_soc->ops->hal_rx_get_mpdu_frame_control_valid =
1883 		hal_rx_get_mpdu_frame_control_valid_9000;
1884 	hal_soc->ops->hal_rx_mpdu_get_addr1 = hal_rx_mpdu_get_addr1_9000;
1885 	hal_soc->ops->hal_rx_mpdu_get_addr2 = hal_rx_mpdu_get_addr2_9000;
1886 	hal_soc->ops->hal_rx_mpdu_get_addr3 = hal_rx_mpdu_get_addr3_9000;
1887 	hal_soc->ops->hal_rx_mpdu_get_addr4 = hal_rx_mpdu_get_addr4_9000;
1888 	hal_soc->ops->hal_rx_get_mpdu_sequence_control_valid =
1889 		hal_rx_get_mpdu_sequence_control_valid_9000;
1890 	hal_soc->ops->hal_rx_is_unicast = hal_rx_is_unicast_9000;
1891 	hal_soc->ops->hal_rx_tid_get = hal_rx_tid_get_9000;
1892 	hal_soc->ops->hal_rx_hw_desc_get_ppduid_get =
1893 					hal_rx_hw_desc_get_ppduid_get_9000;
1894 	hal_soc->ops->hal_rx_mpdu_start_mpdu_qos_control_valid_get =
1895 		hal_rx_mpdu_start_mpdu_qos_control_valid_get_9000;
1896 	hal_soc->ops->hal_rx_msdu_end_sa_sw_peer_id_get =
1897 		hal_rx_msdu_end_sa_sw_peer_id_get_9000;
1898 	hal_soc->ops->hal_rx_msdu0_buffer_addr_lsb =
1899 					hal_rx_msdu0_buffer_addr_lsb_9000;
1900 	hal_soc->ops->hal_rx_msdu_desc_info_ptr_get =
1901 					hal_rx_msdu_desc_info_ptr_get_9000;
1902 	hal_soc->ops->hal_ent_mpdu_desc_info = hal_ent_mpdu_desc_info_9000;
1903 	hal_soc->ops->hal_dst_mpdu_desc_info = hal_dst_mpdu_desc_info_9000;
1904 	hal_soc->ops->hal_rx_get_fc_valid = hal_rx_get_fc_valid_9000;
1905 	hal_soc->ops->hal_rx_get_to_ds_flag = hal_rx_get_to_ds_flag_9000;
1906 	hal_soc->ops->hal_rx_get_mac_addr2_valid =
1907 					hal_rx_get_mac_addr2_valid_9000;
1908 	hal_soc->ops->hal_rx_get_filter_category =
1909 					hal_rx_get_filter_category_9000;
1910 	hal_soc->ops->hal_rx_get_ppdu_id = hal_rx_get_ppdu_id_9000;
1911 	hal_soc->ops->hal_reo_config = hal_reo_config_9000;
1912 	hal_soc->ops->hal_rx_msdu_flow_idx_get = hal_rx_msdu_flow_idx_get_9000;
1913 	hal_soc->ops->hal_rx_msdu_flow_idx_invalid =
1914 					hal_rx_msdu_flow_idx_invalid_9000;
1915 	hal_soc->ops->hal_rx_msdu_flow_idx_timeout =
1916 					hal_rx_msdu_flow_idx_timeout_9000;
1917 	hal_soc->ops->hal_rx_msdu_fse_metadata_get =
1918 					hal_rx_msdu_fse_metadata_get_9000;
1919 	hal_soc->ops->hal_rx_msdu_cce_match_get =
1920 					hal_rx_msdu_cce_match_get_li;
1921 	hal_soc->ops->hal_rx_msdu_cce_metadata_get =
1922 					hal_rx_msdu_cce_metadata_get_9000;
1923 	hal_soc->ops->hal_rx_msdu_get_flow_params =
1924 					hal_rx_msdu_get_flow_params_9000;
1925 	hal_soc->ops->hal_rx_tlv_get_tcp_chksum =
1926 					hal_rx_tlv_get_tcp_chksum_9000;
1927 	hal_soc->ops->hal_rx_get_rx_sequence = hal_rx_get_rx_sequence_9000;
1928 #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE)
1929 	hal_soc->ops->hal_rx_get_bb_info = hal_rx_get_bb_info_9000;
1930 	hal_soc->ops->hal_rx_get_rtt_info = hal_rx_get_rtt_info_9000;
1931 #endif
1932 	/* rx - msdu fast path info fields */
1933 	hal_soc->ops->hal_rx_msdu_packet_metadata_get =
1934 					hal_rx_msdu_packet_metadata_get_9000;
1935 	hal_soc->ops->hal_rx_mpdu_start_tlv_tag_valid =
1936 					hal_rx_mpdu_start_tlv_tag_valid_9000;
1937 	hal_soc->ops->hal_rx_sw_mon_desc_info_get =
1938 					hal_rx_sw_mon_desc_info_get_9000;
1939 	hal_soc->ops->hal_rx_wbm_err_msdu_continuation_get =
1940 		hal_rx_wbm_err_msdu_continuation_get_9000;
1941 
1942 	/* rx - TLV struct offsets */
1943 	hal_soc->ops->hal_rx_msdu_end_offset_get =
1944 					hal_rx_msdu_end_offset_get_generic;
1945 	hal_soc->ops->hal_rx_attn_offset_get = hal_rx_attn_offset_get_generic;
1946 	hal_soc->ops->hal_rx_msdu_start_offset_get =
1947 					hal_rx_msdu_start_offset_get_generic;
1948 	hal_soc->ops->hal_rx_mpdu_start_offset_get =
1949 					hal_rx_mpdu_start_offset_get_generic;
1950 	hal_soc->ops->hal_rx_mpdu_end_offset_get =
1951 					hal_rx_mpdu_end_offset_get_generic;
1952 #ifndef NO_RX_PKT_HDR_TLV
1953 	hal_soc->ops->hal_rx_pkt_tlv_offset_get =
1954 					hal_rx_pkt_tlv_offset_get_generic;
1955 #endif
1956 	hal_soc->ops->hal_rx_flow_setup_fse = hal_rx_flow_setup_fse_9000;
1957 
1958 	hal_soc->ops->hal_rx_flow_get_tuple_info =
1959 					hal_rx_flow_get_tuple_info_li;
1960 	 hal_soc->ops->hal_rx_flow_delete_entry =
1961 					hal_rx_flow_delete_entry_li;
1962 	hal_soc->ops->hal_rx_fst_get_fse_size = hal_rx_fst_get_fse_size_li;
1963 	hal_soc->ops->hal_compute_reo_remap_ix2_ix3 =
1964 					hal_compute_reo_remap_ix2_ix3_9000;
1965 	hal_soc->ops->hal_setup_link_idle_list =
1966 				hal_setup_link_idle_list_generic_li;
1967 	hal_soc->ops->hal_compute_reo_remap_ix0 = NULL;
1968 	hal_soc->ops->hal_rx_tlv_msdu_len_get =
1969 				hal_rx_msdu_start_get_len_9000;
1970 };
1971 
1972 struct hal_hw_srng_config hw_srng_table_9000[] = {
1973 	/* TODO: max_rings can populated by querying HW capabilities */
1974 	{ /* REO_DST */
1975 		.start_ring_id = HAL_SRNG_REO2SW1,
1976 		.max_rings = 4,
1977 		.entry_size = sizeof(struct reo_destination_ring) >> 2,
1978 		.lmac_ring = FALSE,
1979 		.ring_dir = HAL_SRNG_DST_RING,
1980 		.reg_start = {
1981 			HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(
1982 				SEQ_WCSS_UMAC_REO_REG_OFFSET),
1983 			HWIO_REO_R2_REO2SW1_RING_HP_ADDR(
1984 				SEQ_WCSS_UMAC_REO_REG_OFFSET)
1985 		},
1986 		.reg_size = {
1987 			HWIO_REO_R0_REO2SW2_RING_BASE_LSB_ADDR(0) -
1988 				HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(0),
1989 			HWIO_REO_R2_REO2SW2_RING_HP_ADDR(0) -
1990 				HWIO_REO_R2_REO2SW1_RING_HP_ADDR(0),
1991 		},
1992 		.max_size =
1993 			HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_BMSK >>
1994 			HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_SHFT,
1995 	},
1996 	{ /* REO_EXCEPTION */
1997 		/* Designating REO2TCL ring as exception ring. This ring is
1998 		 * similar to other REO2SW rings though it is named as REO2TCL.
1999 		 * Any of theREO2SW rings can be used as exception ring.
2000 		 */
2001 		.start_ring_id = HAL_SRNG_REO2TCL,
2002 		.max_rings = 1,
2003 		.entry_size = sizeof(struct reo_destination_ring) >> 2,
2004 		.lmac_ring = FALSE,
2005 		.ring_dir = HAL_SRNG_DST_RING,
2006 		.reg_start = {
2007 			HWIO_REO_R0_REO2TCL_RING_BASE_LSB_ADDR(
2008 				SEQ_WCSS_UMAC_REO_REG_OFFSET),
2009 			HWIO_REO_R2_REO2TCL_RING_HP_ADDR(
2010 				SEQ_WCSS_UMAC_REO_REG_OFFSET)
2011 		},
2012 		/* Single ring - provide ring size if multiple rings of this
2013 		 * type are supported
2014 		 */
2015 		.reg_size = {},
2016 		.max_size =
2017 			HWIO_REO_R0_REO2TCL_RING_BASE_MSB_RING_SIZE_BMSK >>
2018 			HWIO_REO_R0_REO2TCL_RING_BASE_MSB_RING_SIZE_SHFT,
2019 	},
2020 	{ /* REO_REINJECT */
2021 		.start_ring_id = HAL_SRNG_SW2REO,
2022 		.max_rings = 1,
2023 		.entry_size = sizeof(struct reo_entrance_ring) >> 2,
2024 		.lmac_ring = FALSE,
2025 		.ring_dir = HAL_SRNG_SRC_RING,
2026 		.reg_start = {
2027 			HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(
2028 				SEQ_WCSS_UMAC_REO_REG_OFFSET),
2029 			HWIO_REO_R2_SW2REO_RING_HP_ADDR(
2030 				SEQ_WCSS_UMAC_REO_REG_OFFSET)
2031 		},
2032 		/* Single ring - provide ring size if multiple rings of this
2033 		 * type are supported
2034 		 */
2035 		.reg_size = {},
2036 		.max_size = HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_BMSK >>
2037 				HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_SHFT,
2038 	},
2039 	{ /* REO_CMD */
2040 		.start_ring_id = HAL_SRNG_REO_CMD,
2041 		.max_rings = 1,
2042 		.entry_size = (sizeof(struct tlv_32_hdr) +
2043 			sizeof(struct reo_get_queue_stats)) >> 2,
2044 		.lmac_ring = FALSE,
2045 		.ring_dir = HAL_SRNG_SRC_RING,
2046 		.reg_start = {
2047 			HWIO_REO_R0_REO_CMD_RING_BASE_LSB_ADDR(
2048 				SEQ_WCSS_UMAC_REO_REG_OFFSET),
2049 			HWIO_REO_R2_REO_CMD_RING_HP_ADDR(
2050 				SEQ_WCSS_UMAC_REO_REG_OFFSET),
2051 		},
2052 		/* Single ring - provide ring size if multiple rings of this
2053 		 * type are supported
2054 		 */
2055 		.reg_size = {},
2056 		.max_size = HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_BMSK >>
2057 			HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_SHFT,
2058 	},
2059 	{ /* REO_STATUS */
2060 		.start_ring_id = HAL_SRNG_REO_STATUS,
2061 		.max_rings = 1,
2062 		.entry_size = (sizeof(struct tlv_32_hdr) +
2063 			sizeof(struct reo_get_queue_stats_status)) >> 2,
2064 		.lmac_ring = FALSE,
2065 		.ring_dir = HAL_SRNG_DST_RING,
2066 		.reg_start = {
2067 			HWIO_REO_R0_REO_STATUS_RING_BASE_LSB_ADDR(
2068 				SEQ_WCSS_UMAC_REO_REG_OFFSET),
2069 			HWIO_REO_R2_REO_STATUS_RING_HP_ADDR(
2070 				SEQ_WCSS_UMAC_REO_REG_OFFSET),
2071 		},
2072 		/* Single ring - provide ring size if multiple rings of this
2073 		 * type are supported
2074 		 */
2075 		.reg_size = {},
2076 		.max_size =
2077 		HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
2078 			HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
2079 	},
2080 	{ /* TCL_DATA */
2081 		.start_ring_id = HAL_SRNG_SW2TCL1,
2082 		.max_rings = 3,
2083 		.entry_size = (sizeof(struct tlv_32_hdr) +
2084 			sizeof(struct tcl_data_cmd)) >> 2,
2085 		.lmac_ring = FALSE,
2086 		.ring_dir = HAL_SRNG_SRC_RING,
2087 		.reg_start = {
2088 			HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(
2089 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
2090 			HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(
2091 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
2092 		},
2093 		.reg_size = {
2094 			HWIO_TCL_R0_SW2TCL2_RING_BASE_LSB_ADDR(0) -
2095 				HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(0),
2096 			HWIO_TCL_R2_SW2TCL2_RING_HP_ADDR(0) -
2097 				HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(0),
2098 		},
2099 		.max_size =
2100 			HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >>
2101 			HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT,
2102 	},
2103 	{ /* TCL_CMD/CREDIT */
2104 	  /* qca8074v2 and qcn9000 uses this ring for data commands */
2105 		.start_ring_id = HAL_SRNG_SW2TCL_CMD,
2106 		.max_rings = 1,
2107 		.entry_size = (sizeof(struct tlv_32_hdr) +
2108 			sizeof(struct tcl_data_cmd)) >> 2,
2109 		.lmac_ring =  FALSE,
2110 		.ring_dir = HAL_SRNG_SRC_RING,
2111 		.reg_start = {
2112 			HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_LSB_ADDR(
2113 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
2114 			HWIO_TCL_R2_SW2TCL_CREDIT_RING_HP_ADDR(
2115 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
2116 		},
2117 		/* Single ring - provide ring size if multiple rings of this
2118 		 * type are supported
2119 		 */
2120 		.reg_size = {},
2121 		.max_size =
2122 			HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_BMSK >>
2123 			HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_SHFT,
2124 	},
2125 	{ /* TCL_STATUS */
2126 		.start_ring_id = HAL_SRNG_TCL_STATUS,
2127 		.max_rings = 1,
2128 		.entry_size = (sizeof(struct tlv_32_hdr) +
2129 			sizeof(struct tcl_status_ring)) >> 2,
2130 		.lmac_ring = FALSE,
2131 		.ring_dir = HAL_SRNG_DST_RING,
2132 		.reg_start = {
2133 			HWIO_TCL_R0_TCL_STATUS1_RING_BASE_LSB_ADDR(
2134 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
2135 			HWIO_TCL_R2_TCL_STATUS1_RING_HP_ADDR(
2136 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
2137 		},
2138 		/* Single ring - provide ring size if multiple rings of this
2139 		 * type are supported
2140 		 */
2141 		.reg_size = {},
2142 		.max_size =
2143 			HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_BMSK >>
2144 			HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_SHFT,
2145 	},
2146 	{ /* CE_SRC */
2147 		.start_ring_id = HAL_SRNG_CE_0_SRC,
2148 		.max_rings = 12,
2149 		.entry_size = sizeof(struct ce_src_desc) >> 2,
2150 		.lmac_ring = FALSE,
2151 		.ring_dir = HAL_SRNG_SRC_RING,
2152 		.reg_start = {
2153 		HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR(
2154 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET),
2155 		HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR(
2156 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET),
2157 		},
2158 		.reg_size = {
2159 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_SRC_REG_OFFSET -
2160 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET,
2161 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_SRC_REG_OFFSET -
2162 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET,
2163 		},
2164 		.max_size =
2165 		HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
2166 		HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
2167 	},
2168 	{ /* CE_DST */
2169 		.start_ring_id = HAL_SRNG_CE_0_DST,
2170 		.max_rings = 12,
2171 		.entry_size = 8 >> 2,
2172 		/*TODO: entry_size above should actually be
2173 		 * sizeof(struct ce_dst_desc) >> 2, but couldn't find definition
2174 		 * of struct ce_dst_desc in HW header files
2175 		 */
2176 		.lmac_ring = FALSE,
2177 		.ring_dir = HAL_SRNG_SRC_RING,
2178 		.reg_start = {
2179 		HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR(
2180 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
2181 		HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR(
2182 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
2183 		},
2184 		.reg_size = {
2185 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
2186 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
2187 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
2188 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
2189 		},
2190 		.max_size =
2191 		HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
2192 		HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
2193 	},
2194 	{ /* CE_DST_STATUS */
2195 		.start_ring_id = HAL_SRNG_CE_0_DST_STATUS,
2196 		.max_rings = 12,
2197 		.entry_size = sizeof(struct ce_stat_desc) >> 2,
2198 		.lmac_ring = FALSE,
2199 		.ring_dir = HAL_SRNG_DST_RING,
2200 		.reg_start = {
2201 		HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR(
2202 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
2203 		HWIO_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR(
2204 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
2205 		},
2206 			/* TODO: check destination status ring registers */
2207 		.reg_size = {
2208 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
2209 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
2210 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
2211 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
2212 		},
2213 		.max_size =
2214 		HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
2215 		HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
2216 	},
2217 	{ /* WBM_IDLE_LINK */
2218 		.start_ring_id = HAL_SRNG_WBM_IDLE_LINK,
2219 		.max_rings = 1,
2220 		.entry_size = sizeof(struct wbm_link_descriptor_ring) >> 2,
2221 		.lmac_ring = FALSE,
2222 		.ring_dir = HAL_SRNG_SRC_RING,
2223 		.reg_start = {
2224 		HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2225 		HWIO_WBM_R2_WBM_IDLE_LINK_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2226 		},
2227 		/* Single ring - provide ring size if multiple rings of this
2228 		 * type are supported
2229 		 */
2230 		.reg_size = {},
2231 		.max_size =
2232 			HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_BMSK >>
2233 				HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_SHFT,
2234 	},
2235 	{ /* SW2WBM_RELEASE */
2236 		.start_ring_id = HAL_SRNG_WBM_SW_RELEASE,
2237 		.max_rings = 1,
2238 		.entry_size = sizeof(struct wbm_release_ring) >> 2,
2239 		.lmac_ring = FALSE,
2240 		.ring_dir = HAL_SRNG_SRC_RING,
2241 		.reg_start = {
2242 		HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2243 		HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2244 		},
2245 		/* Single ring - provide ring size if multiple rings of this
2246 		 * type are supported
2247 		 */
2248 		.reg_size = {},
2249 		.max_size =
2250 		HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
2251 		HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
2252 	},
2253 	{ /* WBM2SW_RELEASE */
2254 		.start_ring_id = HAL_SRNG_WBM2SW0_RELEASE,
2255 		.max_rings = 5,
2256 		.entry_size = sizeof(struct wbm_release_ring) >> 2,
2257 		.lmac_ring = FALSE,
2258 		.ring_dir = HAL_SRNG_DST_RING,
2259 		.reg_start = {
2260 			HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2261 			HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2262 		},
2263 		.reg_size = {
2264 			HWIO_WBM_R0_WBM2SW1_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET) -
2265 				HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2266 			HWIO_WBM_R2_WBM2SW1_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET) -
2267 				HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2268 		},
2269 		.max_size =
2270 			HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
2271 				HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
2272 	},
2273 	{ /* RXDMA_BUF */
2274 		.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF0,
2275 #ifdef IPA_OFFLOAD
2276 #ifdef IPA_WDI3_VLAN_SUPPORT
2277 		.max_rings = 4,
2278 #else
2279 		.max_rings = 3,
2280 #endif
2281 #else
2282 		.max_rings = 2,
2283 #endif
2284 		.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
2285 		.lmac_ring = TRUE,
2286 		.ring_dir = HAL_SRNG_SRC_RING,
2287 		/* reg_start is not set because LMAC rings are not accessed
2288 		 * from host
2289 		 */
2290 		.reg_start = {},
2291 		.reg_size = {},
2292 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
2293 	},
2294 	{ /* RXDMA_DST */
2295 		.start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW0,
2296 		.max_rings = 1,
2297 		.entry_size = sizeof(struct reo_entrance_ring) >> 2,
2298 		.lmac_ring =  TRUE,
2299 		.ring_dir = HAL_SRNG_DST_RING,
2300 		/* reg_start is not set because LMAC rings are not accessed
2301 		 * from host
2302 		 */
2303 		.reg_start = {},
2304 		.reg_size = {},
2305 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
2306 	},
2307 	{ /* RXDMA_MONITOR_BUF */
2308 		.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA2_BUF,
2309 		.max_rings = 1,
2310 		.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
2311 		.lmac_ring = TRUE,
2312 		.ring_dir = HAL_SRNG_SRC_RING,
2313 		/* reg_start is not set because LMAC rings are not accessed
2314 		 * from host
2315 		 */
2316 		.reg_start = {},
2317 		.reg_size = {},
2318 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
2319 	},
2320 	{ /* RXDMA_MONITOR_STATUS */
2321 		.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF,
2322 		.max_rings = 1,
2323 		.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
2324 		.lmac_ring = TRUE,
2325 		.ring_dir = HAL_SRNG_SRC_RING,
2326 		/* reg_start is not set because LMAC rings are not accessed
2327 		 * from host
2328 		 */
2329 		.reg_start = {},
2330 		.reg_size = {},
2331 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
2332 	},
2333 	{ /* RXDMA_MONITOR_DST */
2334 		.start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW1,
2335 		.max_rings = 1,
2336 		.entry_size = sizeof(struct sw_monitor_ring) >> 2,
2337 		.lmac_ring = TRUE,
2338 		.ring_dir = HAL_SRNG_DST_RING,
2339 		/* reg_start is not set because LMAC rings are not accessed
2340 		 * from host
2341 		 */
2342 		.reg_start = {},
2343 		.reg_size = {},
2344 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
2345 	},
2346 	{ /* RXDMA_MONITOR_DESC */
2347 		.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_DESC,
2348 		.max_rings = 1,
2349 		.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
2350 		.lmac_ring = TRUE,
2351 		.ring_dir = HAL_SRNG_SRC_RING,
2352 		/* reg_start is not set because LMAC rings are not accessed
2353 		 * from host
2354 		 */
2355 		.reg_start = {},
2356 		.reg_size = {},
2357 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
2358 	},
2359 	{ /* DIR_BUF_RX_DMA_SRC */
2360 		.start_ring_id = HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING,
2361 		/* one ring for spectral and one ring for cfr */
2362 		.max_rings = 2,
2363 		.entry_size = 2,
2364 		.lmac_ring = TRUE,
2365 		.ring_dir = HAL_SRNG_SRC_RING,
2366 		/* reg_start is not set because LMAC rings are not accessed
2367 		 * from host
2368 		 */
2369 		.reg_start = {},
2370 		.reg_size = {},
2371 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
2372 	},
2373 #ifdef WLAN_FEATURE_CIF_CFR
2374 	{ /* WIFI_POS_SRC */
2375 		.start_ring_id = HAL_SRNG_WIFI_POS_SRC_DMA_RING,
2376 		.max_rings = 1,
2377 		.entry_size = sizeof(wmi_oem_dma_buf_release_entry)  >> 2,
2378 		.lmac_ring = TRUE,
2379 		.ring_dir = HAL_SRNG_SRC_RING,
2380 		/* reg_start is not set because LMAC rings are not accessed
2381 		 * from host
2382 		 */
2383 		.reg_start = {},
2384 		.reg_size = {},
2385 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
2386 	},
2387 #endif
2388 	{ /* REO2PPE */ 0},
2389 	{ /* PPE2TCL */ 0},
2390 	{ /* PPE_RELEASE */ 0},
2391 	{ /* TX_MONITOR_BUF */ 0},
2392 	{ /* TX_MONITOR_DST */ 0},
2393 	{ /* SW2RXDMA_NEW */ 0},
2394 };
2395 
2396 /**
2397  * hal_qcn9000_attach()- Attach 9000 target specific hal_soc ops,
2398  *			  offset and srng table
2399  * Return: void
2400  */
2401 void hal_qcn9000_attach(struct hal_soc *hal_soc)
2402 {
2403 	hal_soc->hw_srng_table = hw_srng_table_9000;
2404 	hal_srng_hw_reg_offset_init_generic(hal_soc);
2405 	hal_hw_txrx_default_ops_attach_li(hal_soc);
2406 	hal_hw_txrx_ops_attach_qcn9000(hal_soc);
2407 	if (hal_soc->static_window_map)
2408 		hal_write_window_register(hal_soc);
2409 }
2410