xref: /wlan-dirver/qca-wifi-host-cmn/hal/wifi3.0/qca6390/hal_6390.c (revision ed7ed761f307f964abd13da4df8dcb908086bd83)
1 /*
2  * Copyright (c) 2016-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 #include "qdf_types.h"
20 #include "qdf_util.h"
21 #include "qdf_types.h"
22 #include "qdf_lock.h"
23 #include "qdf_mem.h"
24 #include "qdf_nbuf.h"
25 #include "hal_li_hw_headers.h"
26 #include "hal_internal.h"
27 #include "hal_api.h"
28 #include "target_type.h"
29 #include "wcss_version.h"
30 #include "qdf_module.h"
31 
32 #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_OFFSET \
33 	RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_OFFSET
34 #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_MASK \
35 	RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_MASK
36 #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_LSB \
37 	RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_LSB
38 #define UNIFIED_PHYRX_HT_SIG_0_HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS_OFFSET \
39 	PHYRX_HT_SIG_0_HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS_OFFSET
40 #define UNIFIED_PHYRX_L_SIG_B_0_L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS_OFFSET \
41 	PHYRX_L_SIG_B_0_L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS_OFFSET
42 #define UNIFIED_PHYRX_L_SIG_A_0_L_SIG_A_INFO_PHYRX_L_SIG_A_INFO_DETAILS_OFFSET \
43 	PHYRX_L_SIG_A_0_L_SIG_A_INFO_PHYRX_L_SIG_A_INFO_DETAILS_OFFSET
44 #define UNIFIED_PHYRX_VHT_SIG_A_0_VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS_OFFSET \
45 	PHYRX_VHT_SIG_A_0_VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS_OFFSET
46 #define UNIFIED_PHYRX_HE_SIG_A_SU_0_HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS_OFFSET \
47 	PHYRX_HE_SIG_A_SU_0_HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS_OFFSET
48 #define UNIFIED_PHYRX_HE_SIG_A_MU_DL_0_HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS_OFFSET \
49 	PHYRX_HE_SIG_A_MU_DL_0_HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS_OFFSET
50 #define UNIFIED_PHYRX_HE_SIG_B1_MU_0_HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS_OFFSET \
51 	PHYRX_HE_SIG_B1_MU_0_HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS_OFFSET
52 #define UNIFIED_PHYRX_HE_SIG_B2_MU_0_HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS_OFFSET \
53 	PHYRX_HE_SIG_B2_MU_0_HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS_OFFSET
54 #define UNIFIED_PHYRX_HE_SIG_B2_OFDMA_0_HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS_OFFSET \
55 	PHYRX_HE_SIG_B2_OFDMA_0_HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS_OFFSET
56 #define UNIFIED_PHYRX_RSSI_LEGACY_3_RECEIVE_RSSI_INFO_PRE_RSSI_INFO_DETAILS_OFFSET \
57 	PHYRX_RSSI_LEGACY_3_RECEIVE_RSSI_INFO_PRE_RSSI_INFO_DETAILS_OFFSET
58 #define UNIFIED_PHYRX_RSSI_LEGACY_19_RECEIVE_RSSI_INFO_PREAMBLE_RSSI_INFO_DETAILS_OFFSET \
59 	PHYRX_RSSI_LEGACY_19_RECEIVE_RSSI_INFO_PREAMBLE_RSSI_INFO_DETAILS_OFFSET
60 #define UNIFIED_RX_MPDU_START_0_RX_MPDU_INFO_RX_MPDU_INFO_DETAILS_OFFSET \
61 	RX_MPDU_START_0_RX_MPDU_INFO_RX_MPDU_INFO_DETAILS_OFFSET
62 #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \
63 	RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET
64 #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \
65 	RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET
66 #define UNIFIED_RX_MPDU_DETAILS_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \
67 	RX_MPDU_DETAILS_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET
68 #define UNIFIED_REO_DESTINATION_RING_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \
69 	REO_DESTINATION_RING_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET
70 #define UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC \
71 	UNIFORM_REO_STATUS_HEADER_STATUS_HEADER
72 #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \
73 	RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET
74 #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \
75 	RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET
76 #define UNIFIED_TCL_DATA_CMD_0_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \
77 	TCL_DATA_CMD_0_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET
78 #define UNIFIED_TCL_DATA_CMD_1_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \
79 	TCL_DATA_CMD_1_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET
80 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_OFFSET \
81 	TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_OFFSET
82 #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB \
83 	BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB
84 #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK \
85 	BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK
86 #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB \
87 	BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB
88 #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK \
89 	BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK
90 #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB \
91 	BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB
92 #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK \
93 	BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK
94 #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB \
95 	BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB
96 #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK \
97 	BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK
98 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_LSB \
99 	TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_LSB
100 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_MASK \
101 	TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_MASK
102 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_MASK \
103 	WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_MASK
104 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_OFFSET \
105 	WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_OFFSET
106 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_LSB \
107 	WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_LSB
108 
109 #include "hal_6390_tx.h"
110 #include "hal_6390_rx.h"
111 #include <hal_generic_api.h>
112 #include "hal_li_rx.h"
113 #include "hal_li_api.h"
114 #include "hal_li_generic_api.h"
115 
116 /**
117  * hal_rx_get_rx_fragment_number_6390() - API to retrieve rx fragment number
118  * @buf: Network buffer
119  *
120  * Return: rx fragment number
121  */
122 static
123 uint8_t hal_rx_get_rx_fragment_number_6390(uint8_t *buf)
124 {
125 	struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
126 	struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
127 
128 	/* Return first 4 bits as fragment number */
129 	return (HAL_RX_MPDU_GET_SEQUENCE_NUMBER(rx_mpdu_info) &
130 		DOT11_SEQ_FRAG_MASK);
131 }
132 
133 /**
134  * hal_rx_msdu_end_da_is_mcbc_get_6390() - API to check if pkt is MCBC
135  *                                         from rx_msdu_end TLV
136  * @buf: pointer to the start of RX PKT TLV headers
137  *
138  * Return: da_is_mcbc
139  */
140 static uint8_t
141 hal_rx_msdu_end_da_is_mcbc_get_6390(uint8_t *buf)
142 {
143 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
144 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
145 
146 	return HAL_RX_MSDU_END_DA_IS_MCBC_GET(msdu_end);
147 }
148 
149 /**
150  * hal_rx_msdu_end_sa_is_valid_get_6390() - API to get_6390 the sa_is_valid
151  *                                          bit from rx_msdu_end TLV
152  * @buf: pointer to the start of RX PKT TLV headers
153  *
154  * Return: sa_is_valid bit
155  */
156 static uint8_t
157 hal_rx_msdu_end_sa_is_valid_get_6390(uint8_t *buf)
158 {
159 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
160 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
161 	uint8_t sa_is_valid;
162 
163 	sa_is_valid = HAL_RX_MSDU_END_SA_IS_VALID_GET(msdu_end);
164 
165 	return sa_is_valid;
166 }
167 
168 /**
169  * hal_rx_msdu_end_sa_idx_get_6390() - API to get_6390 the sa_idx from
170  *                                     rx_msdu_end TLV
171  * @buf: pointer to the start of RX PKT TLV headers
172  *
173  * Return: sa_idx (SA AST index)
174  */
175 static
176 uint16_t hal_rx_msdu_end_sa_idx_get_6390(uint8_t *buf)
177 {
178 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
179 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
180 	uint16_t sa_idx;
181 
182 	sa_idx = HAL_RX_MSDU_END_SA_IDX_GET(msdu_end);
183 
184 	return sa_idx;
185 }
186 
187 /**
188  * hal_rx_desc_is_first_msdu_6390() - Check if first msdu
189  * @hw_desc_addr: hardware descriptor address
190  *
191  * Return: 0 - success/ non-zero failure
192  */
193 static uint32_t hal_rx_desc_is_first_msdu_6390(void *hw_desc_addr)
194 {
195 	struct rx_pkt_tlvs *rx_tlvs = (struct rx_pkt_tlvs *)hw_desc_addr;
196 	struct rx_msdu_end *msdu_end = &rx_tlvs->msdu_end_tlv.rx_msdu_end;
197 
198 	return HAL_RX_GET(msdu_end, RX_MSDU_END_5, FIRST_MSDU);
199 }
200 
201 /**
202  * hal_rx_msdu_end_l3_hdr_padding_get_6390() - API to get_6390 the l3_header
203  *                                             padding from rx_msdu_end TLV
204  * @buf: pointer to the start of RX PKT TLV headers
205  *
206  * Return: number of l3 header padding bytes
207  */
208 static uint32_t hal_rx_msdu_end_l3_hdr_padding_get_6390(uint8_t *buf)
209 {
210 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
211 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
212 	uint32_t l3_header_padding;
213 
214 	l3_header_padding = HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(msdu_end);
215 
216 	return l3_header_padding;
217 }
218 
219 /**
220  * hal_rx_encryption_info_valid_6390() - Returns encryption type.
221  * @buf: rx_tlv_hdr of the received packet
222  *
223  * Return: encryption type
224  */
225 static uint32_t hal_rx_encryption_info_valid_6390(uint8_t *buf)
226 {
227 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
228 	struct rx_mpdu_start *mpdu_start =
229 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
230 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
231 	uint32_t encryption_info = HAL_RX_MPDU_ENCRYPTION_INFO_VALID(mpdu_info);
232 
233 	return encryption_info;
234 }
235 
236 /**
237  * hal_rx_print_pn_6390() - Prints the PN of rx packet.
238  * @buf: rx_tlv_hdr of the received packet
239  *
240  * Return: void
241  */
242 static void hal_rx_print_pn_6390(uint8_t *buf)
243 {
244 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
245 	struct rx_mpdu_start *mpdu_start =
246 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
247 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
248 
249 	uint32_t pn_31_0 = HAL_RX_MPDU_PN_31_0_GET(mpdu_info);
250 	uint32_t pn_63_32 = HAL_RX_MPDU_PN_63_32_GET(mpdu_info);
251 	uint32_t pn_95_64 = HAL_RX_MPDU_PN_95_64_GET(mpdu_info);
252 	uint32_t pn_127_96 = HAL_RX_MPDU_PN_127_96_GET(mpdu_info);
253 
254 	hal_debug("PN number pn_127_96 0x%x pn_95_64 0x%x pn_63_32 0x%x pn_31_0 0x%x ",
255 		  pn_127_96, pn_95_64, pn_63_32, pn_31_0);
256 }
257 
258 /**
259  * hal_rx_msdu_end_first_msdu_get_6390() - API to get first msdu status
260  *                                         from rx_msdu_end TLV
261  * @buf: pointer to the start of RX PKT TLV headers
262  *
263  * Return: first_msdu
264  */
265 static uint8_t hal_rx_msdu_end_first_msdu_get_6390(uint8_t *buf)
266 {
267 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
268 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
269 	uint8_t first_msdu;
270 
271 	first_msdu = HAL_RX_MSDU_END_FIRST_MSDU_GET(msdu_end);
272 
273 	return first_msdu;
274 }
275 
276 /**
277  * hal_rx_msdu_end_da_is_valid_get_6390() - API to check if da is valid
278  *                                          from rx_msdu_end TLV
279  * @buf: pointer to the start of RX PKT TLV headers
280  *
281  * Return: da_is_valid
282  */
283 static uint8_t hal_rx_msdu_end_da_is_valid_get_6390(uint8_t *buf)
284 {
285 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
286 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
287 	uint8_t da_is_valid;
288 
289 	da_is_valid = HAL_RX_MSDU_END_DA_IS_VALID_GET(msdu_end);
290 
291 	return da_is_valid;
292 }
293 
294 /**
295  * hal_rx_msdu_end_last_msdu_get_6390() - API to get last msdu status
296  *                                        from rx_msdu_end TLV
297  * @buf: pointer to the start of RX PKT TLV headers
298  *
299  * Return: last_msdu
300  */
301 static uint8_t hal_rx_msdu_end_last_msdu_get_6390(uint8_t *buf)
302 {
303 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
304 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
305 	uint8_t last_msdu;
306 
307 	last_msdu = HAL_RX_MSDU_END_LAST_MSDU_GET(msdu_end);
308 
309 	return last_msdu;
310 }
311 
312 /**
313  * hal_rx_get_mpdu_mac_ad4_valid_6390() - Retrieves if mpdu 4th addr is valid
314  * @buf: Network buffer
315  *
316  * Return: value of mpdu 4th address valid field
317  */
318 static bool hal_rx_get_mpdu_mac_ad4_valid_6390(uint8_t *buf)
319 {
320 	struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
321 	struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
322 	bool ad4_valid = 0;
323 
324 	ad4_valid = HAL_RX_MPDU_GET_MAC_AD4_VALID(rx_mpdu_info);
325 
326 	return ad4_valid;
327 }
328 
329 /**
330  * hal_rx_mpdu_start_sw_peer_id_get_6390() - Retrieve sw peer_id
331  * @buf: network buffer
332  *
333  * Return: sw peer_id
334  */
335 static uint32_t hal_rx_mpdu_start_sw_peer_id_get_6390(uint8_t *buf)
336 {
337 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
338 	struct rx_mpdu_start *mpdu_start =
339 			&pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
340 
341 	return HAL_RX_MPDU_INFO_SW_PEER_ID_GET(
342 		&mpdu_start->rx_mpdu_info_details);
343 }
344 
345 /**
346  * hal_rx_mpdu_get_to_ds_6390() - API to get the tods info
347  *                                from rx_mpdu_start
348  * @buf: pointer to the start of RX PKT TLV header
349  *
350  * Return: uint32_t(to_ds)
351  */
352 static uint32_t hal_rx_mpdu_get_to_ds_6390(uint8_t *buf)
353 {
354 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
355 	struct rx_mpdu_start *mpdu_start =
356 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
357 
358 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
359 
360 	return HAL_RX_MPDU_GET_TODS(mpdu_info);
361 }
362 
363 /**
364  * hal_rx_mpdu_get_fr_ds_6390() - API to get the from ds info
365  *                                from rx_mpdu_start
366  * @buf: pointer to the start of RX PKT TLV header
367  *
368  * Return: uint32_t(fr_ds)
369  */
370 static uint32_t hal_rx_mpdu_get_fr_ds_6390(uint8_t *buf)
371 {
372 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
373 	struct rx_mpdu_start *mpdu_start =
374 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
375 
376 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
377 
378 	return HAL_RX_MPDU_GET_FROMDS(mpdu_info);
379 }
380 
381 /**
382  * hal_rx_get_mpdu_frame_control_valid_6390() - Retrieves mpdu
383  *                                              frame control valid
384  * @buf: Network buffer
385  *
386  * Return: value of frame control valid field
387  */
388 static uint8_t hal_rx_get_mpdu_frame_control_valid_6390(uint8_t *buf)
389 {
390 	struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
391 	struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
392 
393 	return HAL_RX_MPDU_GET_FRAME_CONTROL_VALID(rx_mpdu_info);
394 }
395 
396 /**
397  * hal_rx_mpdu_get_addr1_6390() - API to check get address1 of the mpdu
398  * @buf: pointer to the start of RX PKT TLV headera
399  * @mac_addr: pointer to mac address
400  *
401  * Return: success/failure
402  */
403 static QDF_STATUS hal_rx_mpdu_get_addr1_6390(uint8_t *buf, uint8_t *mac_addr)
404 {
405 	struct __attribute__((__packed__)) hal_addr1 {
406 		uint32_t ad1_31_0;
407 		uint16_t ad1_47_32;
408 	};
409 
410 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
411 	struct rx_mpdu_start *mpdu_start =
412 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
413 
414 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
415 	struct hal_addr1 *addr = (struct hal_addr1 *)mac_addr;
416 	uint32_t mac_addr_ad1_valid;
417 
418 	mac_addr_ad1_valid = HAL_RX_MPDU_MAC_ADDR_AD1_VALID_GET(mpdu_info);
419 
420 	if (mac_addr_ad1_valid) {
421 		addr->ad1_31_0 = HAL_RX_MPDU_AD1_31_0_GET(mpdu_info);
422 		addr->ad1_47_32 = HAL_RX_MPDU_AD1_47_32_GET(mpdu_info);
423 		return QDF_STATUS_SUCCESS;
424 	}
425 
426 	return QDF_STATUS_E_FAILURE;
427 }
428 
429 /**
430  * hal_rx_mpdu_get_addr2_6390() - API to check get address2 of the mpdu
431  *                                in the packet
432  * @buf: pointer to the start of RX PKT TLV header
433  * @mac_addr: pointer to mac address
434  *
435  * Return: success/failure
436  */
437 static QDF_STATUS hal_rx_mpdu_get_addr2_6390(uint8_t *buf,
438 					     uint8_t *mac_addr)
439 {
440 	struct __attribute__((__packed__)) hal_addr2 {
441 		uint16_t ad2_15_0;
442 		uint32_t ad2_47_16;
443 	};
444 
445 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
446 	struct rx_mpdu_start *mpdu_start =
447 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
448 
449 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
450 	struct hal_addr2 *addr = (struct hal_addr2 *)mac_addr;
451 	uint32_t mac_addr_ad2_valid;
452 
453 	mac_addr_ad2_valid = HAL_RX_MPDU_MAC_ADDR_AD2_VALID_GET(mpdu_info);
454 
455 	if (mac_addr_ad2_valid) {
456 		addr->ad2_15_0 = HAL_RX_MPDU_AD2_15_0_GET(mpdu_info);
457 		addr->ad2_47_16 = HAL_RX_MPDU_AD2_47_16_GET(mpdu_info);
458 		return QDF_STATUS_SUCCESS;
459 	}
460 
461 	return QDF_STATUS_E_FAILURE;
462 }
463 
464 /**
465  * hal_rx_mpdu_get_addr3_6390() - API to get address3 of the mpdu
466  *                                in the packet
467  * @buf: pointer to the start of RX PKT TLV header
468  * @mac_addr: pointer to mac address
469  *
470  * Return: success/failure
471  */
472 static QDF_STATUS hal_rx_mpdu_get_addr3_6390(uint8_t *buf, uint8_t *mac_addr)
473 {
474 	struct __attribute__((__packed__)) hal_addr3 {
475 		uint32_t ad3_31_0;
476 		uint16_t ad3_47_32;
477 	};
478 
479 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
480 	struct rx_mpdu_start *mpdu_start =
481 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
482 
483 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
484 	struct hal_addr3 *addr = (struct hal_addr3 *)mac_addr;
485 	uint32_t mac_addr_ad3_valid;
486 
487 	mac_addr_ad3_valid = HAL_RX_MPDU_MAC_ADDR_AD3_VALID_GET(mpdu_info);
488 
489 	if (mac_addr_ad3_valid) {
490 		addr->ad3_31_0 = HAL_RX_MPDU_AD3_31_0_GET(mpdu_info);
491 		addr->ad3_47_32 = HAL_RX_MPDU_AD3_47_32_GET(mpdu_info);
492 		return QDF_STATUS_SUCCESS;
493 	}
494 
495 	return QDF_STATUS_E_FAILURE;
496 }
497 
498 /**
499  * hal_rx_mpdu_get_addr4_6390() - API to get address4 of the mpdu
500  *                                in the packet
501  * @buf: pointer to the start of RX PKT TLV header
502  * @mac_addr: pointer to mac address
503  *
504  * Return: success/failure
505  */
506 static QDF_STATUS hal_rx_mpdu_get_addr4_6390(uint8_t *buf, uint8_t *mac_addr)
507 {
508 	struct __attribute__((__packed__)) hal_addr4 {
509 		uint32_t ad4_31_0;
510 		uint16_t ad4_47_32;
511 	};
512 
513 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
514 	struct rx_mpdu_start *mpdu_start =
515 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
516 
517 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
518 	struct hal_addr4 *addr = (struct hal_addr4 *)mac_addr;
519 	uint32_t mac_addr_ad4_valid;
520 
521 	mac_addr_ad4_valid = HAL_RX_MPDU_MAC_ADDR_AD4_VALID_GET(mpdu_info);
522 
523 	if (mac_addr_ad4_valid) {
524 		addr->ad4_31_0 = HAL_RX_MPDU_AD4_31_0_GET(mpdu_info);
525 		addr->ad4_47_32 = HAL_RX_MPDU_AD4_47_32_GET(mpdu_info);
526 		return QDF_STATUS_SUCCESS;
527 	}
528 
529 	return QDF_STATUS_E_FAILURE;
530 }
531 
532 /**
533  * hal_rx_get_mpdu_sequence_control_valid_6390() - Get mpdu sequence
534  *                                                 control valid
535  * @buf: Network buffer
536  *
537  * Return: value of sequence control valid field
538  */
539 static uint8_t hal_rx_get_mpdu_sequence_control_valid_6390(uint8_t *buf)
540 {
541 	struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
542 	struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
543 
544 	return HAL_RX_MPDU_GET_SEQUENCE_CONTROL_VALID(rx_mpdu_info);
545 }
546 
547 /**
548  * hal_rx_is_unicast_6390() - check packet is unicast frame or not.
549  * @buf: pointer to rx pkt TLV.
550  *
551  * Return: true on unicast.
552  */
553 static bool hal_rx_is_unicast_6390(uint8_t *buf)
554 {
555 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
556 	struct rx_mpdu_start *mpdu_start =
557 		&pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
558 	uint32_t grp_id;
559 	uint8_t *rx_mpdu_info = (uint8_t *)&mpdu_start->rx_mpdu_info_details;
560 
561 	grp_id = (_HAL_MS((*_OFFSET_TO_WORD_PTR((rx_mpdu_info),
562 			   RX_MPDU_INFO_0_SW_FRAME_GROUP_ID_OFFSET)),
563 			  RX_MPDU_INFO_0_SW_FRAME_GROUP_ID_MASK,
564 			  RX_MPDU_INFO_0_SW_FRAME_GROUP_ID_LSB));
565 
566 	return (HAL_MPDU_SW_FRAME_GROUP_UNICAST_DATA == grp_id) ? true : false;
567 }
568 
569 /**
570  * hal_rx_tid_get_6390() - get tid based on qos control valid.
571  * @hal_soc_hdl: hal soc handle
572  * @buf: pointer to rx pkt TLV.
573  *
574  * Return: tid
575  */
576 static uint32_t hal_rx_tid_get_6390(hal_soc_handle_t hal_soc_hdl, uint8_t *buf)
577 {
578 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
579 	struct rx_mpdu_start *mpdu_start =
580 	&pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
581 	uint8_t *rx_mpdu_info = (uint8_t *)&mpdu_start->rx_mpdu_info_details;
582 	uint8_t qos_control_valid =
583 		(_HAL_MS((*_OFFSET_TO_WORD_PTR((rx_mpdu_info),
584 			  RX_MPDU_INFO_2_MPDU_QOS_CONTROL_VALID_OFFSET)),
585 			 RX_MPDU_INFO_2_MPDU_QOS_CONTROL_VALID_MASK,
586 			 RX_MPDU_INFO_2_MPDU_QOS_CONTROL_VALID_LSB));
587 
588 	if (qos_control_valid)
589 		return hal_rx_mpdu_start_tid_get_6390(buf);
590 
591 	return HAL_RX_NON_QOS_TID;
592 }
593 
594 /**
595  * hal_rx_hw_desc_get_ppduid_get_6390() - retrieve ppdu id
596  * @rx_tlv_hdr: start address of rx_pkt_tlvs
597  * @rxdma_dst_ring_desc: Rx HW descriptor
598  *
599  * Return: ppdu id
600  */
601 static uint32_t hal_rx_hw_desc_get_ppduid_get_6390(void *rx_tlv_hdr,
602 						   void *rxdma_dst_ring_desc)
603 {
604 	struct rx_mpdu_info *rx_mpdu_info;
605 	struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr;
606 
607 	rx_mpdu_info =
608 		&rx_desc->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details;
609 
610 	return HAL_RX_GET(rx_mpdu_info, RX_MPDU_INFO_0, PHY_PPDU_ID);
611 }
612 
613 /**
614  * hal_reo_status_get_header_6390() - Process reo desc info
615  * @ring_desc: REO status ring descriptor
616  * @b: tlv type info
617  * @h1: Pointer to hal_reo_status_header where info to be stored
618  *
619  * Return: none.
620  */
621 static void hal_reo_status_get_header_6390(hal_ring_desc_t ring_desc, int b,
622 					   void *h1)
623 {
624 	uint32_t *d = (uint32_t *)ring_desc;
625 	uint32_t val1 = 0;
626 	struct hal_reo_status_header *h =
627 			(struct hal_reo_status_header *)h1;
628 
629 	/* Offsets of descriptor fields defined in HW headers start
630 	 * from the field after TLV header
631 	 */
632 	d += HAL_GET_NUM_DWORDS(sizeof(struct tlv_32_hdr));
633 
634 	switch (b) {
635 	case HAL_REO_QUEUE_STATS_STATUS_TLV:
636 		val1 = d[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_0,
637 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
638 		break;
639 	case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
640 		val1 = d[HAL_OFFSET_DW(REO_FLUSH_QUEUE_STATUS_0,
641 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
642 		break;
643 	case HAL_REO_FLUSH_CACHE_STATUS_TLV:
644 		val1 = d[HAL_OFFSET_DW(REO_FLUSH_CACHE_STATUS_0,
645 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
646 		break;
647 	case HAL_REO_UNBLK_CACHE_STATUS_TLV:
648 		val1 = d[HAL_OFFSET_DW(REO_UNBLOCK_CACHE_STATUS_0,
649 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
650 		break;
651 	case HAL_REO_TIMOUT_LIST_STATUS_TLV:
652 		val1 = d[HAL_OFFSET_DW(REO_FLUSH_TIMEOUT_LIST_STATUS_0,
653 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
654 		break;
655 	case HAL_REO_DESC_THRES_STATUS_TLV:
656 		val1 =
657 		  d[HAL_OFFSET_DW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_0,
658 		  UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
659 		break;
660 	case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
661 		val1 = d[HAL_OFFSET_DW(REO_UPDATE_RX_REO_QUEUE_STATUS_0,
662 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
663 		break;
664 	default:
665 		qdf_nofl_err("ERROR: Unknown tlv\n");
666 		break;
667 	}
668 	h->cmd_num =
669 		HAL_GET_FIELD(
670 			      UNIFORM_REO_STATUS_HEADER_0, REO_STATUS_NUMBER,
671 			      val1);
672 	h->exec_time =
673 		HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER_0,
674 			      CMD_EXECUTION_TIME, val1);
675 	h->status =
676 		HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER_0,
677 			      REO_CMD_EXECUTION_STATUS, val1);
678 	switch (b) {
679 	case HAL_REO_QUEUE_STATS_STATUS_TLV:
680 		val1 = d[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_1,
681 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
682 		break;
683 	case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
684 		val1 = d[HAL_OFFSET_DW(REO_FLUSH_QUEUE_STATUS_1,
685 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
686 		break;
687 	case HAL_REO_FLUSH_CACHE_STATUS_TLV:
688 		val1 = d[HAL_OFFSET_DW(REO_FLUSH_CACHE_STATUS_1,
689 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
690 		break;
691 	case HAL_REO_UNBLK_CACHE_STATUS_TLV:
692 		val1 = d[HAL_OFFSET_DW(REO_UNBLOCK_CACHE_STATUS_1,
693 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
694 		break;
695 	case HAL_REO_TIMOUT_LIST_STATUS_TLV:
696 		val1 = d[HAL_OFFSET_DW(REO_FLUSH_TIMEOUT_LIST_STATUS_1,
697 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
698 		break;
699 	case HAL_REO_DESC_THRES_STATUS_TLV:
700 		val1 =
701 		  d[HAL_OFFSET_DW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_1,
702 		  UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
703 		break;
704 	case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
705 		val1 = d[HAL_OFFSET_DW(REO_UPDATE_RX_REO_QUEUE_STATUS_1,
706 			UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
707 		break;
708 	default:
709 		qdf_nofl_err("ERROR: Unknown tlv\n");
710 		break;
711 	}
712 	h->tstamp =
713 		HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER_1, TIMESTAMP, val1);
714 }
715 
716 /**
717  * hal_rx_mpdu_start_mpdu_qos_control_valid_get_6390() - Retrieve qos control
718  *                                                       valid bit from the tlv.
719  * @buf: pointer to rx pkt TLV.
720  *
721  * Return: qos control value.
722  */
723 static inline uint32_t
724 hal_rx_mpdu_start_mpdu_qos_control_valid_get_6390(uint8_t *buf)
725 {
726 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
727 	struct rx_mpdu_start *mpdu_start =
728 			&pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
729 
730 	return HAL_RX_MPDU_INFO_QOS_CONTROL_VALID_GET(
731 		&mpdu_start->rx_mpdu_info_details);
732 }
733 
734 /**
735  * hal_rx_msdu_end_sa_sw_peer_id_get_6390() - API to get the sa_sw_peer_id
736  *                                            from rx_msdu_end TLV
737  * @buf: pointer to the start of RX PKT TLV headers
738  *
739  * Return: sa_sw_peer_id index
740  */
741 static inline uint32_t
742 hal_rx_msdu_end_sa_sw_peer_id_get_6390(uint8_t *buf)
743 {
744 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
745 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
746 
747 	return HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(msdu_end);
748 }
749 
750 /**
751  * hal_tx_desc_set_mesh_en_6390() - Set mesh_enable flag in Tx descriptor
752  * @desc: Handle to Tx Descriptor
753  * @en:   For raw WiFi frames, this indicates transmission to a mesh STA,
754  *        enabling the interpretation of the 'Mesh Control Present' bit
755  *        (bit 8) of QoS Control (otherwise this bit is ignored),
756  *        For native WiFi frames, this indicates that a 'Mesh Control' field
757  *        is present between the header and the LLC.
758  *
759  * Return: void
760  */
761 static inline
762 void hal_tx_desc_set_mesh_en_6390(void *desc, uint8_t en)
763 {
764 	HAL_SET_FLD(desc, TCL_DATA_CMD_4, MESH_ENABLE) |=
765 		HAL_TX_SM(TCL_DATA_CMD_4, MESH_ENABLE, en);
766 }
767 
768 static
769 void *hal_rx_msdu0_buffer_addr_lsb_6390(void *link_desc_va)
770 {
771 	return (void *)HAL_RX_MSDU0_BUFFER_ADDR_LSB(link_desc_va);
772 }
773 
774 static
775 void *hal_rx_msdu_desc_info_ptr_get_6390(void *msdu0)
776 {
777 	return (void *)HAL_RX_MSDU_DESC_INFO_PTR_GET(msdu0);
778 }
779 
780 static
781 void *hal_ent_mpdu_desc_info_6390(void *ent_ring_desc)
782 {
783 	return (void *)HAL_ENT_MPDU_DESC_INFO(ent_ring_desc);
784 }
785 
786 static
787 void *hal_dst_mpdu_desc_info_6390(void *dst_ring_desc)
788 {
789 	return (void *)HAL_DST_MPDU_DESC_INFO(dst_ring_desc);
790 }
791 
792 static
793 uint8_t hal_rx_get_fc_valid_6390(uint8_t *buf)
794 {
795 	return HAL_RX_GET_FC_VALID(buf);
796 }
797 
798 static uint8_t hal_rx_get_to_ds_flag_6390(uint8_t *buf)
799 {
800 	return HAL_RX_GET_TO_DS_FLAG(buf);
801 }
802 
803 static uint8_t hal_rx_get_mac_addr2_valid_6390(uint8_t *buf)
804 {
805 	return HAL_RX_GET_MAC_ADDR2_VALID(buf);
806 }
807 
808 static uint8_t hal_rx_get_filter_category_6390(uint8_t *buf)
809 {
810 	return HAL_RX_GET_FILTER_CATEGORY(buf);
811 }
812 
813 static uint32_t
814 hal_rx_get_ppdu_id_6390(uint8_t *buf)
815 {
816 	return HAL_RX_GET_PPDU_ID(buf);
817 }
818 
819 /**
820  * hal_reo_config_6390() - Set reo config parameters
821  * @soc: hal soc handle
822  * @reg_val: value to be set
823  * @reo_params: reo parameters
824  *
825  * Return: void
826  */
827 static
828 void hal_reo_config_6390(struct hal_soc *soc,
829 			 uint32_t reg_val,
830 			 struct hal_reo_params *reo_params)
831 {
832 	HAL_REO_R0_CONFIG(soc, reg_val, reo_params);
833 }
834 
835 /**
836  * hal_rx_msdu_desc_info_get_ptr_6390() - Get msdu desc info ptr
837  * @msdu_details_ptr: Pointer to msdu_details_ptr
838  *
839  * Return: Pointer to rx_msdu_desc_info structure.
840  *
841  */
842 static void *hal_rx_msdu_desc_info_get_ptr_6390(void *msdu_details_ptr)
843 {
844 	return HAL_RX_MSDU_DESC_INFO_GET(msdu_details_ptr);
845 }
846 
847 /**
848  * hal_rx_link_desc_msdu0_ptr_6390() - Get pointer to rx_msdu details
849  * @link_desc: Pointer to link desc
850  *
851  * Return: Pointer to rx_msdu_details structure
852  *
853  */
854 static void *hal_rx_link_desc_msdu0_ptr_6390(void *link_desc)
855 {
856 	return HAL_RX_LINK_DESC_MSDU0_PTR(link_desc);
857 }
858 
859 /**
860  * hal_rx_msdu_flow_idx_get_6390() - API to get flow index from rx_msdu_end TLV
861  * @buf: pointer to the start of RX PKT TLV headers
862  *
863  * Return: flow index value from MSDU END TLV
864  */
865 static inline uint32_t hal_rx_msdu_flow_idx_get_6390(uint8_t *buf)
866 {
867 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
868 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
869 
870 	return HAL_RX_MSDU_END_FLOW_IDX_GET(msdu_end);
871 }
872 
873 /**
874  * hal_rx_msdu_flow_idx_invalid_6390() - API to get flow index invalid
875  *                                       from rx_msdu_end TLV
876  * @buf: pointer to the start of RX PKT TLV headers
877  *
878  * Return: flow index invalid value from MSDU END TLV
879  */
880 static bool hal_rx_msdu_flow_idx_invalid_6390(uint8_t *buf)
881 {
882 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
883 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
884 
885 	return HAL_RX_MSDU_END_FLOW_IDX_INVALID_GET(msdu_end);
886 }
887 
888 /**
889  * hal_rx_msdu_flow_idx_timeout_6390() - API to get flow index timeout
890  *                                       from rx_msdu_end TLV
891  * @buf: pointer to the start of RX PKT TLV headers
892  *
893  * Return: flow index timeout value from MSDU END TLV
894  */
895 static bool hal_rx_msdu_flow_idx_timeout_6390(uint8_t *buf)
896 {
897 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
898 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
899 
900 	return HAL_RX_MSDU_END_FLOW_IDX_TIMEOUT_GET(msdu_end);
901 }
902 
903 /**
904  * hal_rx_msdu_fse_metadata_get_6390() - API to get FSE metadata
905  *                                       from rx_msdu_end TLV
906  * @buf: pointer to the start of RX PKT TLV headers
907  *
908  * Return: fse metadata value from MSDU END TLV
909  */
910 static uint32_t hal_rx_msdu_fse_metadata_get_6390(uint8_t *buf)
911 {
912 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
913 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
914 
915 	return HAL_RX_MSDU_END_FSE_METADATA_GET(msdu_end);
916 }
917 
918 /**
919  * hal_rx_msdu_cce_metadata_get_6390() - API to get CCE metadata
920  *                                       from rx_msdu_end TLV
921  * @buf: pointer to the start of RX PKT TLV headers
922  *
923  * Return: cce metadata
924  */
925 static uint16_t
926 hal_rx_msdu_cce_metadata_get_6390(uint8_t *buf)
927 {
928 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
929 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
930 
931 	return HAL_RX_MSDU_END_CCE_METADATA_GET(msdu_end);
932 }
933 
934 /**
935  * hal_rx_msdu_get_flow_params_6390() - API to get flow index, flow index
936  *                                      invalid and flow index timeout from
937  *                                      rx_msdu_end TLV
938  * @buf: pointer to the start of RX PKT TLV headers
939  * @flow_invalid: pointer to return value of flow_idx_valid
940  * @flow_timeout: pointer to return value of flow_idx_timeout
941  * @flow_index: pointer to return value of flow_idx
942  *
943  * Return: none
944  */
945 static inline void
946 hal_rx_msdu_get_flow_params_6390(uint8_t *buf,
947 				 bool *flow_invalid,
948 				 bool *flow_timeout,
949 				 uint32_t *flow_index)
950 {
951 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
952 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
953 
954 	*flow_invalid = HAL_RX_MSDU_END_FLOW_IDX_INVALID_GET(msdu_end);
955 	*flow_timeout = HAL_RX_MSDU_END_FLOW_IDX_TIMEOUT_GET(msdu_end);
956 	*flow_index = HAL_RX_MSDU_END_FLOW_IDX_GET(msdu_end);
957 }
958 
959 /**
960  * hal_rx_tlv_get_tcp_chksum_6390() - API to get tcp checksum
961  * @buf: rx_tlv_hdr
962  *
963  * Return: tcp checksum
964  */
965 static uint16_t
966 hal_rx_tlv_get_tcp_chksum_6390(uint8_t *buf)
967 {
968 	return HAL_RX_TLV_GET_TCP_CHKSUM(buf);
969 }
970 
971 /**
972  * hal_rx_get_rx_sequence_6390() - Function to retrieve rx sequence number
973  * @buf: Network buffer
974  *
975  * Return: rx sequence number
976  */
977 static
978 uint16_t hal_rx_get_rx_sequence_6390(uint8_t *buf)
979 {
980 	struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
981 	struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
982 
983 	return HAL_RX_MPDU_GET_SEQUENCE_NUMBER(rx_mpdu_info);
984 }
985 
986 /**
987  * hal_rx_mpdu_start_tlv_tag_valid_6390() - API to check if RX_MPDU_START
988  *                                          tlv tag is valid
989  * @rx_tlv_hdr: start address of rx_pkt_tlvs
990  *
991  * Return: true if RX_MPDU_START is valid, else false.
992  */
993 static uint8_t hal_rx_mpdu_start_tlv_tag_valid_6390(void *rx_tlv_hdr)
994 {
995 	struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr;
996 	uint32_t tlv_tag;
997 
998 	tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(&rx_desc->mpdu_start_tlv);
999 
1000 	return tlv_tag == WIFIRX_MPDU_START_E ? true : false;
1001 }
1002 
1003 /**
1004  * hal_get_window_address_6390() - Function to get hp/tp address
1005  * @hal_soc: Pointer to hal_soc
1006  * @addr: address offset of register
1007  *
1008  * Return: modified address offset of register
1009  */
1010 static inline qdf_iomem_t hal_get_window_address_6390(struct hal_soc *hal_soc,
1011 						      qdf_iomem_t addr)
1012 {
1013 	return addr;
1014 }
1015 
1016 /**
1017  * hal_reo_set_err_dst_remap_6390() - Function to set REO error destination
1018  *				     ring remap register
1019  * @hal_soc: Pointer to hal_soc
1020  *
1021  * Return: none.
1022  */
1023 static void
1024 hal_reo_set_err_dst_remap_6390(void *hal_soc)
1025 {
1026 	/*
1027 	 * Set REO error 2k jump (error code 5) / OOR (error code 7)
1028 	 * frame routed to REO2TCL ring.
1029 	 */
1030 	uint32_t dst_remap_ix0 =
1031 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_RELEASE, 0) |
1032 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_RELEASE, 1) |
1033 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_RELEASE, 2) |
1034 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_RELEASE, 3) |
1035 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_RELEASE, 4) |
1036 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_TCL, 5) |
1037 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_TCL, 6) |
1038 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_TCL, 7) |
1039 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_TCL, 8) |
1040 		HAL_REO_ERR_REMAP_IX0(REO_REMAP_RELEASE, 9);
1041 
1042 		HAL_REG_WRITE(hal_soc,
1043 			      HWIO_REO_R0_ERROR_DESTINATION_MAPPING_IX_0_ADDR(
1044 			      SEQ_WCSS_UMAC_REO_REG_OFFSET),
1045 			      dst_remap_ix0);
1046 
1047 		hal_info("HWIO_REO_R0_ERROR_DESTINATION_MAPPING_IX_0 0x%x",
1048 			 HAL_REG_READ(
1049 			 hal_soc,
1050 			 HWIO_REO_R0_ERROR_DESTINATION_MAPPING_IX_0_ADDR(
1051 			 SEQ_WCSS_UMAC_REO_REG_OFFSET)));
1052 }
1053 
1054 static
1055 void hal_compute_reo_remap_ix2_ix3_6390(uint32_t *ring, uint32_t num_rings,
1056 					uint32_t *remap1, uint32_t *remap2)
1057 {
1058 	switch (num_rings) {
1059 	case 3:
1060 		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
1061 				HAL_REO_REMAP_IX2(ring[1], 17) |
1062 				HAL_REO_REMAP_IX2(ring[2], 18) |
1063 				HAL_REO_REMAP_IX2(ring[0], 19) |
1064 				HAL_REO_REMAP_IX2(ring[1], 20) |
1065 				HAL_REO_REMAP_IX2(ring[2], 21) |
1066 				HAL_REO_REMAP_IX2(ring[0], 22) |
1067 				HAL_REO_REMAP_IX2(ring[1], 23);
1068 
1069 		*remap2 = HAL_REO_REMAP_IX3(ring[2], 24) |
1070 				HAL_REO_REMAP_IX3(ring[0], 25) |
1071 				HAL_REO_REMAP_IX3(ring[1], 26) |
1072 				HAL_REO_REMAP_IX3(ring[2], 27) |
1073 				HAL_REO_REMAP_IX3(ring[0], 28) |
1074 				HAL_REO_REMAP_IX3(ring[1], 29) |
1075 				HAL_REO_REMAP_IX3(ring[2], 30) |
1076 				HAL_REO_REMAP_IX3(ring[0], 31);
1077 		break;
1078 	case 4:
1079 		*remap1 = HAL_REO_REMAP_IX2(ring[0], 16) |
1080 				HAL_REO_REMAP_IX2(ring[1], 17) |
1081 				HAL_REO_REMAP_IX2(ring[2], 18) |
1082 				HAL_REO_REMAP_IX2(ring[3], 19) |
1083 				HAL_REO_REMAP_IX2(ring[0], 20) |
1084 				HAL_REO_REMAP_IX2(ring[1], 21) |
1085 				HAL_REO_REMAP_IX2(ring[2], 22) |
1086 				HAL_REO_REMAP_IX2(ring[3], 23);
1087 
1088 		*remap2 = HAL_REO_REMAP_IX3(ring[0], 24) |
1089 				HAL_REO_REMAP_IX3(ring[1], 25) |
1090 				HAL_REO_REMAP_IX3(ring[2], 26) |
1091 				HAL_REO_REMAP_IX3(ring[3], 27) |
1092 				HAL_REO_REMAP_IX3(ring[0], 28) |
1093 				HAL_REO_REMAP_IX3(ring[1], 29) |
1094 				HAL_REO_REMAP_IX3(ring[2], 30) |
1095 				HAL_REO_REMAP_IX3(ring[3], 31);
1096 		break;
1097 	}
1098 }
1099 
1100 static
1101 void hal_compute_reo_remap_ix0_6390(uint32_t *remap0)
1102 {
1103 	*remap0 = HAL_REO_REMAP_IX0(REO_REMAP_SW1, 0) |
1104 			HAL_REO_REMAP_IX0(REO_REMAP_SW1, 1) |
1105 			HAL_REO_REMAP_IX0(REO_REMAP_SW2, 2) |
1106 			HAL_REO_REMAP_IX0(REO_REMAP_SW3, 3) |
1107 			HAL_REO_REMAP_IX0(REO_REMAP_SW2, 4) |
1108 			HAL_REO_REMAP_IX0(REO_REMAP_RELEASE, 5) |
1109 			HAL_REO_REMAP_IX0(REO_REMAP_FW, 6) |
1110 			HAL_REO_REMAP_IX0(REO_REMAP_FW, 7);
1111 }
1112 
1113 #ifdef WLAN_FEATURE_MARK_FIRST_WAKEUP_PACKET
1114 /**
1115  * hal_get_first_wow_wakeup_packet_6390() - Function to get if the buffer is
1116  *                                          the first one that wakes up host
1117  *                                          from WoW.
1118  * @buf: network buffer
1119  *
1120  * Dummy function for QCA6390
1121  *
1122  * Return: 1 to indicate it is first packet received that wakes up host from
1123  *	    WoW. Otherwise 0
1124  */
1125 static inline uint8_t hal_get_first_wow_wakeup_packet_6390(uint8_t *buf)
1126 {
1127 	return 0;
1128 }
1129 #endif
1130 
1131 static void hal_hw_txrx_ops_attach_qca6390(struct hal_soc *hal_soc)
1132 {
1133 	/* init and setup */
1134 	hal_soc->ops->hal_srng_dst_hw_init = hal_srng_dst_hw_init_generic;
1135 	hal_soc->ops->hal_srng_src_hw_init = hal_srng_src_hw_init_generic;
1136 	hal_soc->ops->hal_get_hw_hptp = hal_get_hw_hptp_generic;
1137 	hal_soc->ops->hal_reo_setup = hal_reo_setup_generic_li;
1138 	hal_soc->ops->hal_get_window_address = hal_get_window_address_6390;
1139 	hal_soc->ops->hal_reo_set_err_dst_remap =
1140 					hal_reo_set_err_dst_remap_6390;
1141 
1142 	/* tx */
1143 	hal_soc->ops->hal_tx_desc_set_dscp_tid_table_id =
1144 		hal_tx_desc_set_dscp_tid_table_id_6390;
1145 	hal_soc->ops->hal_tx_set_dscp_tid_map = hal_tx_set_dscp_tid_map_6390;
1146 	hal_soc->ops->hal_tx_update_dscp_tid = hal_tx_update_dscp_tid_6390;
1147 	hal_soc->ops->hal_tx_desc_set_lmac_id = hal_tx_desc_set_lmac_id_6390;
1148 	hal_soc->ops->hal_tx_desc_set_buf_addr =
1149 					hal_tx_desc_set_buf_addr_generic_li;
1150 	hal_soc->ops->hal_tx_desc_set_search_type =
1151 					hal_tx_desc_set_search_type_generic_li;
1152 	hal_soc->ops->hal_tx_desc_set_search_index =
1153 					hal_tx_desc_set_search_index_generic_li;
1154 	hal_soc->ops->hal_tx_desc_set_cache_set_num =
1155 				hal_tx_desc_set_cache_set_num_generic_li;
1156 	hal_soc->ops->hal_tx_comp_get_status =
1157 					hal_tx_comp_get_status_generic_li;
1158 	hal_soc->ops->hal_tx_comp_get_release_reason =
1159 		hal_tx_comp_get_release_reason_generic_li;
1160 	hal_soc->ops->hal_get_wbm_internal_error =
1161 					hal_get_wbm_internal_error_generic_li;
1162 	hal_soc->ops->hal_tx_desc_set_mesh_en = hal_tx_desc_set_mesh_en_6390;
1163 	hal_soc->ops->hal_tx_init_cmd_credit_ring =
1164 					hal_tx_init_cmd_credit_ring_6390;
1165 
1166 	/* rx */
1167 	hal_soc->ops->hal_rx_msdu_start_nss_get =
1168 					hal_rx_msdu_start_nss_get_6390;
1169 	hal_soc->ops->hal_rx_mon_hw_desc_get_mpdu_status =
1170 		hal_rx_mon_hw_desc_get_mpdu_status_6390;
1171 	hal_soc->ops->hal_rx_get_tlv = hal_rx_get_tlv_6390;
1172 	hal_soc->ops->hal_rx_proc_phyrx_other_receive_info_tlv =
1173 		hal_rx_proc_phyrx_other_receive_info_tlv_6390;
1174 	hal_soc->ops->hal_rx_dump_msdu_start_tlv =
1175 					hal_rx_dump_msdu_start_tlv_6390;
1176 	hal_soc->ops->hal_rx_dump_msdu_end_tlv = hal_rx_dump_msdu_end_tlv_6390;
1177 	hal_soc->ops->hal_get_link_desc_size = hal_get_link_desc_size_6390;
1178 	hal_soc->ops->hal_rx_mpdu_start_tid_get =
1179 					hal_rx_mpdu_start_tid_get_6390;
1180 	hal_soc->ops->hal_rx_msdu_start_reception_type_get =
1181 		hal_rx_msdu_start_reception_type_get_6390;
1182 	hal_soc->ops->hal_rx_msdu_end_da_idx_get =
1183 					hal_rx_msdu_end_da_idx_get_6390;
1184 	hal_soc->ops->hal_rx_msdu_desc_info_get_ptr =
1185 					hal_rx_msdu_desc_info_get_ptr_6390;
1186 	hal_soc->ops->hal_rx_link_desc_msdu0_ptr =
1187 					hal_rx_link_desc_msdu0_ptr_6390;
1188 	hal_soc->ops->hal_reo_status_get_header =
1189 					hal_reo_status_get_header_6390;
1190 	hal_soc->ops->hal_rx_status_get_tlv_info =
1191 					hal_rx_status_get_tlv_info_generic_li;
1192 	hal_soc->ops->hal_rx_wbm_err_info_get =
1193 					hal_rx_wbm_err_info_get_generic_li;
1194 	hal_soc->ops->hal_rx_dump_mpdu_start_tlv =
1195 					hal_rx_dump_mpdu_start_tlv_generic_li;
1196 
1197 	hal_soc->ops->hal_tx_set_pcp_tid_map =
1198 					hal_tx_set_pcp_tid_map_generic_li;
1199 	hal_soc->ops->hal_tx_update_pcp_tid_map =
1200 					hal_tx_update_pcp_tid_generic_li;
1201 	hal_soc->ops->hal_tx_set_tidmap_prty =
1202 					hal_tx_update_tidmap_prty_generic_li;
1203 	hal_soc->ops->hal_rx_get_rx_fragment_number =
1204 					hal_rx_get_rx_fragment_number_6390;
1205 	hal_soc->ops->hal_rx_msdu_end_da_is_mcbc_get =
1206 					hal_rx_msdu_end_da_is_mcbc_get_6390;
1207 	hal_soc->ops->hal_rx_msdu_end_sa_is_valid_get =
1208 					hal_rx_msdu_end_sa_is_valid_get_6390;
1209 	hal_soc->ops->hal_rx_msdu_end_sa_idx_get =
1210 					hal_rx_msdu_end_sa_idx_get_6390;
1211 	hal_soc->ops->hal_rx_desc_is_first_msdu =
1212 					hal_rx_desc_is_first_msdu_6390;
1213 	hal_soc->ops->hal_rx_msdu_end_l3_hdr_padding_get =
1214 		hal_rx_msdu_end_l3_hdr_padding_get_6390;
1215 	hal_soc->ops->hal_rx_encryption_info_valid =
1216 					hal_rx_encryption_info_valid_6390;
1217 	hal_soc->ops->hal_rx_print_pn = hal_rx_print_pn_6390;
1218 	hal_soc->ops->hal_rx_msdu_end_first_msdu_get =
1219 					hal_rx_msdu_end_first_msdu_get_6390;
1220 	hal_soc->ops->hal_rx_msdu_end_da_is_valid_get =
1221 					hal_rx_msdu_end_da_is_valid_get_6390;
1222 	hal_soc->ops->hal_rx_msdu_end_last_msdu_get =
1223 					hal_rx_msdu_end_last_msdu_get_6390;
1224 	hal_soc->ops->hal_rx_get_mpdu_mac_ad4_valid =
1225 					hal_rx_get_mpdu_mac_ad4_valid_6390;
1226 	hal_soc->ops->hal_rx_mpdu_start_sw_peer_id_get =
1227 		hal_rx_mpdu_start_sw_peer_id_get_6390;
1228 	hal_soc->ops->hal_rx_tlv_peer_meta_data_get =
1229 		hal_rx_mpdu_peer_meta_data_get_li;
1230 	hal_soc->ops->hal_rx_mpdu_get_to_ds = hal_rx_mpdu_get_to_ds_6390;
1231 	hal_soc->ops->hal_rx_mpdu_get_fr_ds = hal_rx_mpdu_get_fr_ds_6390;
1232 	hal_soc->ops->hal_rx_get_mpdu_frame_control_valid =
1233 		hal_rx_get_mpdu_frame_control_valid_6390;
1234 	hal_soc->ops->hal_rx_get_frame_ctrl_field =
1235 		hal_rx_get_frame_ctrl_field_li;
1236 	hal_soc->ops->hal_rx_mpdu_get_addr1 = hal_rx_mpdu_get_addr1_6390;
1237 	hal_soc->ops->hal_rx_mpdu_get_addr2 = hal_rx_mpdu_get_addr2_6390;
1238 	hal_soc->ops->hal_rx_mpdu_get_addr3 = hal_rx_mpdu_get_addr3_6390;
1239 	hal_soc->ops->hal_rx_mpdu_get_addr4 = hal_rx_mpdu_get_addr4_6390;
1240 	hal_soc->ops->hal_rx_get_mpdu_sequence_control_valid =
1241 		hal_rx_get_mpdu_sequence_control_valid_6390;
1242 	hal_soc->ops->hal_rx_is_unicast = hal_rx_is_unicast_6390;
1243 	hal_soc->ops->hal_rx_tid_get = hal_rx_tid_get_6390;
1244 	hal_soc->ops->hal_rx_hw_desc_get_ppduid_get =
1245 					hal_rx_hw_desc_get_ppduid_get_6390;
1246 	hal_soc->ops->hal_rx_mpdu_start_mpdu_qos_control_valid_get =
1247 		hal_rx_mpdu_start_mpdu_qos_control_valid_get_6390;
1248 	hal_soc->ops->hal_rx_msdu_end_sa_sw_peer_id_get =
1249 		hal_rx_msdu_end_sa_sw_peer_id_get_6390;
1250 	hal_soc->ops->hal_rx_msdu0_buffer_addr_lsb =
1251 					hal_rx_msdu0_buffer_addr_lsb_6390;
1252 	hal_soc->ops->hal_rx_msdu_desc_info_ptr_get =
1253 					hal_rx_msdu_desc_info_ptr_get_6390;
1254 	hal_soc->ops->hal_ent_mpdu_desc_info = hal_ent_mpdu_desc_info_6390;
1255 	hal_soc->ops->hal_dst_mpdu_desc_info = hal_dst_mpdu_desc_info_6390;
1256 	hal_soc->ops->hal_rx_get_fc_valid = hal_rx_get_fc_valid_6390;
1257 	hal_soc->ops->hal_rx_get_to_ds_flag = hal_rx_get_to_ds_flag_6390;
1258 	hal_soc->ops->hal_rx_get_mac_addr2_valid =
1259 					hal_rx_get_mac_addr2_valid_6390;
1260 	hal_soc->ops->hal_rx_get_filter_category =
1261 					hal_rx_get_filter_category_6390;
1262 	hal_soc->ops->hal_rx_get_ppdu_id = hal_rx_get_ppdu_id_6390;
1263 	hal_soc->ops->hal_reo_config = hal_reo_config_6390;
1264 	hal_soc->ops->hal_rx_msdu_flow_idx_get = hal_rx_msdu_flow_idx_get_6390;
1265 	hal_soc->ops->hal_rx_msdu_flow_idx_invalid =
1266 					hal_rx_msdu_flow_idx_invalid_6390;
1267 	hal_soc->ops->hal_rx_msdu_flow_idx_timeout =
1268 					hal_rx_msdu_flow_idx_timeout_6390;
1269 	hal_soc->ops->hal_rx_msdu_fse_metadata_get =
1270 					hal_rx_msdu_fse_metadata_get_6390;
1271 	hal_soc->ops->hal_rx_msdu_cce_match_get =
1272 					hal_rx_msdu_cce_match_get_li;
1273 	hal_soc->ops->hal_rx_msdu_cce_metadata_get =
1274 					hal_rx_msdu_cce_metadata_get_6390;
1275 	hal_soc->ops->hal_rx_msdu_get_flow_params =
1276 					hal_rx_msdu_get_flow_params_6390;
1277 	hal_soc->ops->hal_rx_tlv_get_tcp_chksum =
1278 					hal_rx_tlv_get_tcp_chksum_6390;
1279 	hal_soc->ops->hal_rx_get_rx_sequence = hal_rx_get_rx_sequence_6390;
1280 	/* rx - msdu end fast path info fields */
1281 	hal_soc->ops->hal_rx_msdu_packet_metadata_get =
1282 				hal_rx_msdu_packet_metadata_get_generic_li;
1283 	hal_soc->ops->hal_rx_mpdu_start_tlv_tag_valid =
1284 					hal_rx_mpdu_start_tlv_tag_valid_6390;
1285 
1286 	/* rx - TLV struct offsets */
1287 	hal_soc->ops->hal_rx_msdu_end_offset_get =
1288 					hal_rx_msdu_end_offset_get_generic;
1289 	hal_soc->ops->hal_rx_attn_offset_get = hal_rx_attn_offset_get_generic;
1290 	hal_soc->ops->hal_rx_msdu_start_offset_get =
1291 					hal_rx_msdu_start_offset_get_generic;
1292 	hal_soc->ops->hal_rx_mpdu_start_offset_get =
1293 					hal_rx_mpdu_start_offset_get_generic;
1294 	hal_soc->ops->hal_rx_mpdu_end_offset_get =
1295 					hal_rx_mpdu_end_offset_get_generic;
1296 #ifndef NO_RX_PKT_HDR_TLV
1297 	hal_soc->ops->hal_rx_pkt_tlv_offset_get =
1298 					hal_rx_pkt_tlv_offset_get_generic;
1299 #endif
1300 	hal_soc->ops->hal_compute_reo_remap_ix2_ix3 =
1301 					hal_compute_reo_remap_ix2_ix3_6390;
1302 	hal_soc->ops->hal_setup_link_idle_list =
1303 				hal_setup_link_idle_list_generic_li;
1304 #ifdef WLAN_FEATURE_MARK_FIRST_WAKEUP_PACKET
1305 	hal_soc->ops->hal_get_first_wow_wakeup_packet =
1306 		hal_get_first_wow_wakeup_packet_6390;
1307 #endif
1308 	hal_soc->ops->hal_compute_reo_remap_ix0 =
1309 				hal_compute_reo_remap_ix0_6390;
1310 };
1311 
1312 struct hal_hw_srng_config hw_srng_table_6390[] = {
1313 	/* TODO: max_rings can populated by querying HW capabilities */
1314 	{ /* REO_DST */
1315 		.start_ring_id = HAL_SRNG_REO2SW1,
1316 		.max_rings = 4,
1317 		.entry_size = sizeof(struct reo_destination_ring) >> 2,
1318 		.lmac_ring = FALSE,
1319 		.ring_dir = HAL_SRNG_DST_RING,
1320 		.reg_start = {
1321 			HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(
1322 				SEQ_WCSS_UMAC_REO_REG_OFFSET),
1323 			HWIO_REO_R2_REO2SW1_RING_HP_ADDR(
1324 				SEQ_WCSS_UMAC_REO_REG_OFFSET)
1325 		},
1326 		.reg_size = {
1327 			HWIO_REO_R0_REO2SW2_RING_BASE_LSB_ADDR(0) -
1328 				HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(0),
1329 			HWIO_REO_R2_REO2SW2_RING_HP_ADDR(0) -
1330 				HWIO_REO_R2_REO2SW1_RING_HP_ADDR(0),
1331 		},
1332 		.max_size =
1333 			HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_BMSK >>
1334 			HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_SHFT,
1335 	},
1336 	{ /* REO_EXCEPTION */
1337 		/* Designating REO2TCL ring as exception ring. This ring is
1338 		 * similar to other REO2SW rings though it is named as REO2TCL.
1339 		 * Any of theREO2SW rings can be used as exception ring.
1340 		 */
1341 		.start_ring_id = HAL_SRNG_REO2TCL,
1342 		.max_rings = 1,
1343 		.entry_size = sizeof(struct reo_destination_ring) >> 2,
1344 		.lmac_ring = FALSE,
1345 		.ring_dir = HAL_SRNG_DST_RING,
1346 		.reg_start = {
1347 			HWIO_REO_R0_REO2TCL_RING_BASE_LSB_ADDR(
1348 				SEQ_WCSS_UMAC_REO_REG_OFFSET),
1349 			HWIO_REO_R2_REO2TCL_RING_HP_ADDR(
1350 				SEQ_WCSS_UMAC_REO_REG_OFFSET)
1351 		},
1352 		/* Single ring - provide ring size if multiple rings of this
1353 		 * type are supported
1354 		 */
1355 		.reg_size = {},
1356 		.max_size =
1357 			HWIO_REO_R0_REO2TCL_RING_BASE_MSB_RING_SIZE_BMSK >>
1358 			HWIO_REO_R0_REO2TCL_RING_BASE_MSB_RING_SIZE_SHFT,
1359 	},
1360 	{ /* REO_REINJECT */
1361 		.start_ring_id = HAL_SRNG_SW2REO,
1362 		.max_rings = 1,
1363 		.entry_size = sizeof(struct reo_entrance_ring) >> 2,
1364 		.lmac_ring = FALSE,
1365 		.ring_dir = HAL_SRNG_SRC_RING,
1366 		.reg_start = {
1367 			HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(
1368 				SEQ_WCSS_UMAC_REO_REG_OFFSET),
1369 			HWIO_REO_R2_SW2REO_RING_HP_ADDR(
1370 				SEQ_WCSS_UMAC_REO_REG_OFFSET)
1371 		},
1372 		/* Single ring - provide ring size if multiple rings of this
1373 		 * type are supported
1374 		 */
1375 		.reg_size = {},
1376 		.max_size = HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_BMSK >>
1377 				HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_SHFT,
1378 	},
1379 	{ /* REO_CMD */
1380 		.start_ring_id = HAL_SRNG_REO_CMD,
1381 		.max_rings = 1,
1382 		.entry_size = (sizeof(struct tlv_32_hdr) +
1383 			sizeof(struct reo_get_queue_stats)) >> 2,
1384 		.lmac_ring = FALSE,
1385 		.ring_dir = HAL_SRNG_SRC_RING,
1386 		.reg_start = {
1387 			HWIO_REO_R0_REO_CMD_RING_BASE_LSB_ADDR(
1388 				SEQ_WCSS_UMAC_REO_REG_OFFSET),
1389 			HWIO_REO_R2_REO_CMD_RING_HP_ADDR(
1390 				SEQ_WCSS_UMAC_REO_REG_OFFSET),
1391 		},
1392 		/* Single ring - provide ring size if multiple rings of this
1393 		 * type are supported
1394 		 */
1395 		.reg_size = {},
1396 		.max_size =
1397 			HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_BMSK >>
1398 			HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_SHFT,
1399 	},
1400 	{ /* REO_STATUS */
1401 		.start_ring_id = HAL_SRNG_REO_STATUS,
1402 		.max_rings = 1,
1403 		.entry_size = (sizeof(struct tlv_32_hdr) +
1404 			sizeof(struct reo_get_queue_stats_status)) >> 2,
1405 		.lmac_ring = FALSE,
1406 		.ring_dir = HAL_SRNG_DST_RING,
1407 		.reg_start = {
1408 			HWIO_REO_R0_REO_STATUS_RING_BASE_LSB_ADDR(
1409 				SEQ_WCSS_UMAC_REO_REG_OFFSET),
1410 			HWIO_REO_R2_REO_STATUS_RING_HP_ADDR(
1411 				SEQ_WCSS_UMAC_REO_REG_OFFSET),
1412 		},
1413 		/* Single ring - provide ring size if multiple rings of this
1414 		 * type are supported
1415 		 */
1416 		.reg_size = {},
1417 		.max_size =
1418 			HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
1419 			HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
1420 	},
1421 	{ /* TCL_DATA */
1422 		.start_ring_id = HAL_SRNG_SW2TCL1,
1423 		.max_rings = 3,
1424 		.entry_size = (sizeof(struct tlv_32_hdr) +
1425 			sizeof(struct tcl_data_cmd)) >> 2,
1426 		.lmac_ring = FALSE,
1427 		.ring_dir = HAL_SRNG_SRC_RING,
1428 		.reg_start = {
1429 			HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(
1430 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
1431 			HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(
1432 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
1433 		},
1434 		.reg_size = {
1435 			HWIO_TCL_R0_SW2TCL2_RING_BASE_LSB_ADDR(0) -
1436 				HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(0),
1437 			HWIO_TCL_R2_SW2TCL2_RING_HP_ADDR(0) -
1438 				HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(0),
1439 		},
1440 		.max_size =
1441 			HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >>
1442 			HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT,
1443 	},
1444 	{ /* TCL_CMD */
1445 		.start_ring_id = HAL_SRNG_SW2TCL_CMD,
1446 		.max_rings = 1,
1447 		.entry_size = (sizeof(struct tlv_32_hdr) +
1448 			sizeof(struct tcl_gse_cmd)) >> 2,
1449 		.lmac_ring =  FALSE,
1450 		.ring_dir = HAL_SRNG_SRC_RING,
1451 		.reg_start = {
1452 			HWIO_TCL_R0_SW2TCL_CMD_RING_BASE_LSB_ADDR(
1453 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
1454 			HWIO_TCL_R2_SW2TCL_CMD_RING_HP_ADDR(
1455 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
1456 		},
1457 		/* Single ring - provide ring size if multiple rings of this
1458 		 * type are supported
1459 		 */
1460 		.reg_size = {},
1461 		.max_size =
1462 			HWIO_TCL_R0_SW2TCL_CMD_RING_BASE_MSB_RING_SIZE_BMSK >>
1463 			HWIO_TCL_R0_SW2TCL_CMD_RING_BASE_MSB_RING_SIZE_SHFT,
1464 	},
1465 	{ /* TCL_STATUS */
1466 		.start_ring_id = HAL_SRNG_TCL_STATUS,
1467 		.max_rings = 1,
1468 		.entry_size = (sizeof(struct tlv_32_hdr) +
1469 			sizeof(struct tcl_status_ring)) >> 2,
1470 		.lmac_ring = FALSE,
1471 		.ring_dir = HAL_SRNG_DST_RING,
1472 		.reg_start = {
1473 			HWIO_TCL_R0_TCL_STATUS1_RING_BASE_LSB_ADDR(
1474 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
1475 			HWIO_TCL_R2_TCL_STATUS1_RING_HP_ADDR(
1476 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
1477 		},
1478 		/* Single ring - provide ring size if multiple rings of this
1479 		 * type are supported
1480 		 */
1481 		.reg_size = {},
1482 		.max_size =
1483 			HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_BMSK >>
1484 			HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_SHFT,
1485 	},
1486 	{ /* CE_SRC */
1487 		.start_ring_id = HAL_SRNG_CE_0_SRC,
1488 		.max_rings = 12,
1489 		.entry_size = sizeof(struct ce_src_desc) >> 2,
1490 		.lmac_ring = FALSE,
1491 		.ring_dir = HAL_SRNG_SRC_RING,
1492 		.reg_start = {
1493 		HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR(
1494 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET),
1495 		HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR(
1496 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET),
1497 		},
1498 		.reg_size = {
1499 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_SRC_REG_OFFSET -
1500 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET,
1501 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_SRC_REG_OFFSET -
1502 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET,
1503 		},
1504 		.max_size =
1505 		HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
1506 		HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
1507 	},
1508 	{ /* CE_DST */
1509 		.start_ring_id = HAL_SRNG_CE_0_DST,
1510 		.max_rings = 12,
1511 		.entry_size = 8 >> 2,
1512 		/*TODO: entry_size above should actually be
1513 		 * sizeof(struct ce_dst_desc) >> 2, but couldn't find definition
1514 		 * of struct ce_dst_desc in HW header files
1515 		 */
1516 		.lmac_ring = FALSE,
1517 		.ring_dir = HAL_SRNG_SRC_RING,
1518 		.reg_start = {
1519 		HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR(
1520 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
1521 		HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR(
1522 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
1523 		},
1524 		.reg_size = {
1525 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
1526 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
1527 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
1528 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
1529 		},
1530 		.max_size =
1531 		HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
1532 		HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
1533 	},
1534 	{ /* CE_DST_STATUS */
1535 		.start_ring_id = HAL_SRNG_CE_0_DST_STATUS,
1536 		.max_rings = 12,
1537 		.entry_size = sizeof(struct ce_stat_desc) >> 2,
1538 		.lmac_ring = FALSE,
1539 		.ring_dir = HAL_SRNG_DST_RING,
1540 		.reg_start = {
1541 		HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR(
1542 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
1543 		HWIO_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR(
1544 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
1545 		},
1546 			/* TODO: check destination status ring registers */
1547 		.reg_size = {
1548 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
1549 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
1550 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
1551 		SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
1552 		},
1553 		.max_size =
1554 		HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
1555 		HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
1556 	},
1557 	{ /* WBM_IDLE_LINK */
1558 		.start_ring_id = HAL_SRNG_WBM_IDLE_LINK,
1559 		.max_rings = 1,
1560 		.entry_size = sizeof(struct wbm_link_descriptor_ring) >> 2,
1561 		.lmac_ring = FALSE,
1562 		.ring_dir = HAL_SRNG_SRC_RING,
1563 		.reg_start = {
1564 		HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
1565 		HWIO_WBM_R2_WBM_IDLE_LINK_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
1566 		},
1567 		/* Single ring - provide ring size if multiple rings of this
1568 		 * type are supported
1569 		 */
1570 		.reg_size = {},
1571 		.max_size =
1572 		HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_BMSK >>
1573 		HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_SHFT,
1574 	},
1575 	{ /* SW2WBM_RELEASE */
1576 		.start_ring_id = HAL_SRNG_WBM_SW_RELEASE,
1577 		.max_rings = 1,
1578 		.entry_size = sizeof(struct wbm_release_ring) >> 2,
1579 		.lmac_ring = FALSE,
1580 		.ring_dir = HAL_SRNG_SRC_RING,
1581 		.reg_start = {
1582 		HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
1583 		HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
1584 		},
1585 		/* Single ring - provide ring size if multiple rings of this
1586 		 * type are supported
1587 		 */
1588 		.reg_size = {},
1589 		.max_size =
1590 		HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
1591 		HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
1592 	},
1593 	{ /* WBM2SW_RELEASE */
1594 		.start_ring_id = HAL_SRNG_WBM2SW0_RELEASE,
1595 #ifdef IPA_WDI3_TX_TWO_PIPES
1596 		.max_rings = 5,
1597 #else
1598 		.max_rings = 4,
1599 #endif
1600 		.entry_size = sizeof(struct wbm_release_ring) >> 2,
1601 		.lmac_ring = FALSE,
1602 		.ring_dir = HAL_SRNG_DST_RING,
1603 		.reg_start = {
1604 		HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
1605 		HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
1606 		},
1607 		.reg_size = {
1608 		HWIO_WBM_R0_WBM2SW1_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET) -
1609 		HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
1610 		HWIO_WBM_R2_WBM2SW1_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET) -
1611 		HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
1612 		},
1613 		.max_size =
1614 		HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
1615 		HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
1616 	},
1617 	{ /* RXDMA_BUF */
1618 		.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF0,
1619 #ifdef IPA_OFFLOAD
1620 		.max_rings = 3,
1621 #else
1622 		.max_rings = 2,
1623 #endif
1624 		.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
1625 		.lmac_ring = TRUE,
1626 		.ring_dir = HAL_SRNG_SRC_RING,
1627 		/* reg_start is not set because LMAC rings are not accessed
1628 		 * from host
1629 		 */
1630 		.reg_start = {},
1631 		.reg_size = {},
1632 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
1633 	},
1634 	{ /* RXDMA_DST */
1635 		.start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW0,
1636 		.max_rings = 1,
1637 		.entry_size = sizeof(struct reo_entrance_ring) >> 2,
1638 		.lmac_ring =  TRUE,
1639 		.ring_dir = HAL_SRNG_DST_RING,
1640 		/* reg_start is not set because LMAC rings are not accessed
1641 		 * from host
1642 		 */
1643 		.reg_start = {},
1644 		.reg_size = {},
1645 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
1646 	},
1647 	{ /* RXDMA_MONITOR_BUF */
1648 		.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA2_BUF,
1649 		.max_rings = 1,
1650 		.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
1651 		.lmac_ring = TRUE,
1652 		.ring_dir = HAL_SRNG_SRC_RING,
1653 		/* reg_start is not set because LMAC rings are not accessed
1654 		 * from host
1655 		 */
1656 		.reg_start = {},
1657 		.reg_size = {},
1658 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
1659 	},
1660 	{ /* RXDMA_MONITOR_STATUS */
1661 		.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF,
1662 		.max_rings = 1,
1663 		.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
1664 		.lmac_ring = TRUE,
1665 		.ring_dir = HAL_SRNG_SRC_RING,
1666 		/* reg_start is not set because LMAC rings are not accessed
1667 		 * from host
1668 		 */
1669 		.reg_start = {},
1670 		.reg_size = {},
1671 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
1672 	},
1673 	{ /* RXDMA_MONITOR_DST */
1674 		.start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW1,
1675 		.max_rings = 1,
1676 		.entry_size = sizeof(struct reo_entrance_ring) >> 2,
1677 		.lmac_ring = TRUE,
1678 		.ring_dir = HAL_SRNG_DST_RING,
1679 		/* reg_start is not set because LMAC rings are not accessed
1680 		 * from host
1681 		 */
1682 		.reg_start = {},
1683 		.reg_size = {},
1684 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
1685 	},
1686 	{ /* RXDMA_MONITOR_DESC */
1687 		.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_DESC,
1688 		.max_rings = 1,
1689 		.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
1690 		.lmac_ring = TRUE,
1691 		.ring_dir = HAL_SRNG_SRC_RING,
1692 		/* reg_start is not set because LMAC rings are not accessed
1693 		 * from host
1694 		 */
1695 		.reg_start = {},
1696 		.reg_size = {},
1697 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
1698 	},
1699 	{ /* DIR_BUF_RX_DMA_SRC */
1700 		.start_ring_id = HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING,
1701 		/*
1702 		 * one ring is for spectral scan
1703 		 * the other one is for cfr
1704 		 */
1705 		.max_rings = 2,
1706 		.entry_size = 2,
1707 		.lmac_ring = TRUE,
1708 		.ring_dir = HAL_SRNG_SRC_RING,
1709 		/* reg_start is not set because LMAC rings are not accessed
1710 		 * from host
1711 		 */
1712 		.reg_start = {},
1713 		.reg_size = {},
1714 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
1715 	},
1716 #ifdef WLAN_FEATURE_CIF_CFR
1717 	{ /* WIFI_POS_SRC */
1718 		.start_ring_id = HAL_SRNG_WIFI_POS_SRC_DMA_RING,
1719 		.max_rings = 1,
1720 		.entry_size = sizeof(wmi_oem_dma_buf_release_entry)  >> 2,
1721 		.lmac_ring = TRUE,
1722 		.ring_dir = HAL_SRNG_SRC_RING,
1723 		/* reg_start is not set because LMAC rings are not accessed
1724 		 * from host
1725 		 */
1726 		.reg_start = {},
1727 		.reg_size = {},
1728 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
1729 	},
1730 #endif
1731 	{ /* REO2PPE */ 0},
1732 	{ /* PPE2TCL */ 0},
1733 	{ /* PPE_RELEASE */ 0},
1734 	{ /* TX_MONITOR_BUF */ 0},
1735 	{ /* TX_MONITOR_DST */ 0},
1736 	{ /* SW2RXDMA_NEW */ 0},
1737 };
1738 
1739 /**
1740  * hal_qca6390_attach() - Attach 6390 target specific hal_soc ops,
1741  *			  offset and srng table
1742  * @hal_soc: HAL SoC context
1743  */
1744 void hal_qca6390_attach(struct hal_soc *hal_soc)
1745 {
1746 	hal_soc->hw_srng_table = hw_srng_table_6390;
1747 	hal_srng_hw_reg_offset_init_generic(hal_soc);
1748 	hal_hw_txrx_default_ops_attach_li(hal_soc);
1749 	hal_hw_txrx_ops_attach_qca6390(hal_soc);
1750 }
1751