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