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