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