xref: /wlan-driver/qca-wifi-host-cmn/hal/wifi3.0/li/hal_li_rx.h (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 
20*5113495bSYour Name #ifndef _HAL_LI_RX_H_
21*5113495bSYour Name #define _HAL_LI_RX_H_
22*5113495bSYour Name 
23*5113495bSYour Name #include <hal_rx.h>
24*5113495bSYour Name 
25*5113495bSYour Name /*
26*5113495bSYour Name  * macro to set the cookie into the rxdma ring entry
27*5113495bSYour Name  */
28*5113495bSYour Name #define HAL_RXDMA_COOKIE_SET(buff_addr_info, cookie) \
29*5113495bSYour Name 		((*(((unsigned int *)buff_addr_info) + \
30*5113495bSYour Name 		(BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_OFFSET >> 2))) &= \
31*5113495bSYour Name 		~BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK); \
32*5113495bSYour Name 		((*(((unsigned int *)buff_addr_info) + \
33*5113495bSYour Name 		(BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_OFFSET >> 2))) |= \
34*5113495bSYour Name 		((cookie) << BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB) & \
35*5113495bSYour Name 		BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK)
36*5113495bSYour Name 
37*5113495bSYour Name /*
38*5113495bSYour Name  * macro to set the manager into the rxdma ring entry
39*5113495bSYour Name  */
40*5113495bSYour Name #define HAL_RXDMA_MANAGER_SET(buff_addr_info, manager) \
41*5113495bSYour Name 		((*(((unsigned int *)buff_addr_info) + \
42*5113495bSYour Name 		(BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_OFFSET >> 2))) &= \
43*5113495bSYour Name 		~BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK); \
44*5113495bSYour Name 		((*(((unsigned int *)buff_addr_info) + \
45*5113495bSYour Name 		(BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_OFFSET >> 2))) |= \
46*5113495bSYour Name 		((manager) << BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB) & \
47*5113495bSYour Name 		BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK)
48*5113495bSYour Name 
49*5113495bSYour Name #define HAL_RX_ERROR_STATUS_GET(reo_desc)			\
50*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(reo_desc,		\
51*5113495bSYour Name 		REO_DESTINATION_RING_7_REO_PUSH_REASON_OFFSET)),\
52*5113495bSYour Name 		REO_DESTINATION_RING_7_REO_PUSH_REASON_MASK,	\
53*5113495bSYour Name 		REO_DESTINATION_RING_7_REO_PUSH_REASON_LSB))
54*5113495bSYour Name 
55*5113495bSYour Name #define HAL_RX_BUF_COOKIE_GET(buff_addr_info)			\
56*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(buff_addr_info,		\
57*5113495bSYour Name 		BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_OFFSET)),	\
58*5113495bSYour Name 		BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK,	\
59*5113495bSYour Name 		BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB))
60*5113495bSYour Name 
61*5113495bSYour Name #define HAL_RX_BUF_RBM_GET(buff_addr_info)			\
62*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(buff_addr_info,		\
63*5113495bSYour Name 		BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_OFFSET)),\
64*5113495bSYour Name 		BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK,	\
65*5113495bSYour Name 		BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB))
66*5113495bSYour Name 
67*5113495bSYour Name /* TODO: Convert the following structure fields accesseses to offsets */
68*5113495bSYour Name 
69*5113495bSYour Name #define HAL_RX_REO_BUF_COOKIE_GET(reo_desc)	\
70*5113495bSYour Name 	(HAL_RX_BUF_COOKIE_GET(&		\
71*5113495bSYour Name 	(((struct reo_destination_ring *)	\
72*5113495bSYour Name 		reo_desc)->buf_or_link_desc_addr_info)))
73*5113495bSYour Name 
74*5113495bSYour Name #define HAL_RX_MPDU_SEQUENCE_NUMBER_GET(mpdu_info_ptr)	\
75*5113495bSYour Name 	((mpdu_info_ptr					\
76*5113495bSYour Name 	[RX_MPDU_DESC_INFO_0_MPDU_SEQUENCE_NUMBER_OFFSET >> 2] & \
77*5113495bSYour Name 	RX_MPDU_DESC_INFO_0_MPDU_SEQUENCE_NUMBER_MASK) >> \
78*5113495bSYour Name 	RX_MPDU_DESC_INFO_0_MPDU_SEQUENCE_NUMBER_LSB)
79*5113495bSYour Name 
80*5113495bSYour Name #define HAL_RX_MPDU_DESC_PEER_META_DATA_GET(mpdu_info_ptr)	\
81*5113495bSYour Name 	((mpdu_info_ptr					\
82*5113495bSYour Name 	[RX_MPDU_DESC_INFO_1_PEER_META_DATA_OFFSET >> 2] & \
83*5113495bSYour Name 	RX_MPDU_DESC_INFO_1_PEER_META_DATA_MASK) >> \
84*5113495bSYour Name 	RX_MPDU_DESC_INFO_1_PEER_META_DATA_LSB)
85*5113495bSYour Name 
86*5113495bSYour Name #define HAL_RX_MPDU_MSDU_COUNT_GET(mpdu_info_ptr) \
87*5113495bSYour Name 	((mpdu_info_ptr[RX_MPDU_DESC_INFO_0_MSDU_COUNT_OFFSET >> 2] & \
88*5113495bSYour Name 	RX_MPDU_DESC_INFO_0_MSDU_COUNT_MASK) >> \
89*5113495bSYour Name 	RX_MPDU_DESC_INFO_0_MSDU_COUNT_LSB)
90*5113495bSYour Name 
91*5113495bSYour Name #define HAL_RX_MPDU_FRAGMENT_FLAG_GET(mpdu_info_ptr) \
92*5113495bSYour Name 	(mpdu_info_ptr[RX_MPDU_DESC_INFO_0_FRAGMENT_FLAG_OFFSET >> 2] & \
93*5113495bSYour Name 	RX_MPDU_DESC_INFO_0_FRAGMENT_FLAG_MASK)
94*5113495bSYour Name 
95*5113495bSYour Name #define HAL_RX_MPDU_RETRY_BIT_GET(mpdu_info_ptr) \
96*5113495bSYour Name 	(mpdu_info_ptr[RX_MPDU_DESC_INFO_0_MPDU_RETRY_BIT_OFFSET >> 2] & \
97*5113495bSYour Name 	RX_MPDU_DESC_INFO_0_MPDU_RETRY_BIT_MASK)
98*5113495bSYour Name 
99*5113495bSYour Name #define HAL_RX_MPDU_AMPDU_FLAG_GET(mpdu_info_ptr) \
100*5113495bSYour Name 	(mpdu_info_ptr[RX_MPDU_DESC_INFO_0_AMPDU_FLAG_OFFSET >> 2] & \
101*5113495bSYour Name 	RX_MPDU_DESC_INFO_0_AMPDU_FLAG_MASK)
102*5113495bSYour Name 
103*5113495bSYour Name #define HAL_RX_MPDU_RAW_MPDU_GET(mpdu_info_ptr) \
104*5113495bSYour Name 	(mpdu_info_ptr[RX_MPDU_DESC_INFO_0_RAW_MPDU_OFFSET >> 2] & \
105*5113495bSYour Name 	RX_MPDU_DESC_INFO_0_RAW_MPDU_MASK)
106*5113495bSYour Name 
107*5113495bSYour Name #define HAL_RX_MPDU_FLAGS_GET(mpdu_info_ptr) \
108*5113495bSYour Name 	(HAL_RX_MPDU_FRAGMENT_FLAG_GET(mpdu_info_ptr) | \
109*5113495bSYour Name 	HAL_RX_MPDU_RETRY_BIT_GET(mpdu_info_ptr) |	\
110*5113495bSYour Name 	HAL_RX_MPDU_AMPDU_FLAG_GET(mpdu_info_ptr) |	\
111*5113495bSYour Name 	HAL_RX_MPDU_RAW_MPDU_GET(mpdu_info_ptr))
112*5113495bSYour Name 
113*5113495bSYour Name #define HAL_RX_MPDU_BAR_FRAME_GET(mpdu_info_ptr) \
114*5113495bSYour Name 	((mpdu_info_ptr[RX_MPDU_DESC_INFO_0_BAR_FRAME_OFFSET >> 2] & \
115*5113495bSYour Name 	RX_MPDU_DESC_INFO_0_BAR_FRAME_MASK) >> \
116*5113495bSYour Name 	RX_MPDU_DESC_INFO_0_BAR_FRAME_LSB)
117*5113495bSYour Name 
118*5113495bSYour Name /*
119*5113495bSYour Name  * NOTE: None of the following _GET macros need a right
120*5113495bSYour Name  * shift by the corresponding _LSB. This is because, they are
121*5113495bSYour Name  * finally taken and "OR'ed" into a single word again.
122*5113495bSYour Name  */
123*5113495bSYour Name #define HAL_RX_MSDU_CONTINUATION_FLAG_SET(msdu_info_ptr, val)		\
124*5113495bSYour Name 	((*(((uint32_t *)msdu_info_ptr) +				\
125*5113495bSYour Name 		(RX_MSDU_DESC_INFO_0_MSDU_CONTINUATION_OFFSET >> 2))) |= \
126*5113495bSYour Name 		((val) << RX_MSDU_DESC_INFO_0_MSDU_CONTINUATION_LSB) & \
127*5113495bSYour Name 		RX_MSDU_DESC_INFO_0_MSDU_CONTINUATION_MASK)
128*5113495bSYour Name 
129*5113495bSYour Name #define HAL_RX_MSDU_CONTINUATION_FLAG_GET(msdu_info_ptr)	\
130*5113495bSYour Name 	((*_OFFSET_TO_WORD_PTR(msdu_info_ptr,			\
131*5113495bSYour Name 		RX_MSDU_DESC_INFO_0_MSDU_CONTINUATION_OFFSET)) & \
132*5113495bSYour Name 		RX_MSDU_DESC_INFO_0_MSDU_CONTINUATION_MASK)
133*5113495bSYour Name 
134*5113495bSYour Name #define HAL_RX_MSDU_REO_DST_IND_GET(msdu_info_ptr)	\
135*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(msdu_info_ptr,	\
136*5113495bSYour Name 	RX_MSDU_DESC_INFO_0_REO_DESTINATION_INDICATION_OFFSET)),	\
137*5113495bSYour Name 	RX_MSDU_DESC_INFO_0_REO_DESTINATION_INDICATION_MASK,		\
138*5113495bSYour Name 	RX_MSDU_DESC_INFO_0_REO_DESTINATION_INDICATION_LSB))
139*5113495bSYour Name 
140*5113495bSYour Name #define HAL_RX_MSDU_SA_IS_VALID_FLAG_GET(msdu_info_ptr)		\
141*5113495bSYour Name 	((*_OFFSET_TO_WORD_PTR(msdu_info_ptr,			\
142*5113495bSYour Name 		RX_MSDU_DESC_INFO_0_SA_IS_VALID_OFFSET)) &	\
143*5113495bSYour Name 		RX_MSDU_DESC_INFO_0_SA_IS_VALID_MASK)
144*5113495bSYour Name 
145*5113495bSYour Name #define HAL_RX_MSDU_SA_IDX_TIMEOUT_FLAG_GET(msdu_info_ptr)	\
146*5113495bSYour Name 	((*_OFFSET_TO_WORD_PTR(msdu_info_ptr,			\
147*5113495bSYour Name 		RX_MSDU_DESC_INFO_0_SA_IDX_TIMEOUT_OFFSET)) &	\
148*5113495bSYour Name 		RX_MSDU_DESC_INFO_0_SA_IDX_TIMEOUT_MASK)
149*5113495bSYour Name 
150*5113495bSYour Name #define HAL_RX_MSDU_DA_IS_VALID_FLAG_GET(msdu_info_ptr)		\
151*5113495bSYour Name 	((*_OFFSET_TO_WORD_PTR(msdu_info_ptr,			\
152*5113495bSYour Name 		RX_MSDU_DESC_INFO_0_DA_IS_VALID_OFFSET)) &	\
153*5113495bSYour Name 		RX_MSDU_DESC_INFO_0_DA_IS_VALID_MASK)
154*5113495bSYour Name 
155*5113495bSYour Name #define HAL_RX_MSDU_DA_IS_MCBC_FLAG_GET(msdu_info_ptr)		\
156*5113495bSYour Name 	((*_OFFSET_TO_WORD_PTR(msdu_info_ptr,			\
157*5113495bSYour Name 		RX_MSDU_DESC_INFO_0_DA_IS_MCBC_OFFSET)) &	\
158*5113495bSYour Name 		RX_MSDU_DESC_INFO_0_DA_IS_MCBC_MASK)
159*5113495bSYour Name 
160*5113495bSYour Name #define HAL_RX_MSDU_DA_IDX_TIMEOUT_FLAG_GET(msdu_info_ptr) \
161*5113495bSYour Name 	((*_OFFSET_TO_WORD_PTR(msdu_info_ptr,			\
162*5113495bSYour Name 		RX_MSDU_DESC_INFO_0_DA_IDX_TIMEOUT_OFFSET)) &	\
163*5113495bSYour Name 		RX_MSDU_DESC_INFO_0_DA_IDX_TIMEOUT_MASK)
164*5113495bSYour Name 
165*5113495bSYour Name #define HAL_RX_REO_MSDU_REO_DST_IND_GET(reo_desc)	\
166*5113495bSYour Name 	(HAL_RX_MSDU_REO_DST_IND_GET(&		\
167*5113495bSYour Name 	(((struct reo_destination_ring *)	\
168*5113495bSYour Name 	   reo_desc)->rx_msdu_desc_info_details)))
169*5113495bSYour Name 
170*5113495bSYour Name #define HAL_RX_MPDU_ENCRYPT_TYPE_GET(_rx_mpdu_info)	\
171*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info,	\
172*5113495bSYour Name 	RX_MPDU_INFO_3_ENCRYPT_TYPE_OFFSET)),		\
173*5113495bSYour Name 	RX_MPDU_INFO_3_ENCRYPT_TYPE_MASK,		\
174*5113495bSYour Name 	RX_MPDU_INFO_3_ENCRYPT_TYPE_LSB))
175*5113495bSYour Name 
176*5113495bSYour Name #define HAL_RX_MSDU_DESC_INFO_SET(_msdu_info_ptr, _field, _val)		\
177*5113495bSYour Name 	HAL_RX_FLD_SET(_msdu_info_ptr, RX_MSDU_DESC_INFO_0,		\
178*5113495bSYour Name 			_field, _val)
179*5113495bSYour Name 
180*5113495bSYour Name #define HAL_RX_MPDU_DESC_INFO_SET(_mpdu_info_ptr, _field, _val)		\
181*5113495bSYour Name 	HAL_RX_FLD_SET(_mpdu_info_ptr, RX_MPDU_DESC_INFO_0,		\
182*5113495bSYour Name 			_field, _val)
183*5113495bSYour Name 
184*5113495bSYour Name /*
185*5113495bSYour Name  * Structures & Macros to obtain fields from the TLV's in the Rx packet
186*5113495bSYour Name  * pre-header.
187*5113495bSYour Name  */
188*5113495bSYour Name 
189*5113495bSYour Name /*
190*5113495bSYour Name  * Every Rx packet starts at an offset from the top of the buffer.
191*5113495bSYour Name  * If the host hasn't subscribed to any specific TLV, there is
192*5113495bSYour Name  * still space reserved for the following TLV's from the start of
193*5113495bSYour Name  * the buffer:
194*5113495bSYour Name  *	-- RX ATTENTION
195*5113495bSYour Name  *	-- RX MPDU START
196*5113495bSYour Name  *	-- RX MSDU START
197*5113495bSYour Name  *	-- RX MSDU END
198*5113495bSYour Name  *	-- RX MPDU END
199*5113495bSYour Name  *	-- RX PACKET HEADER (802.11)
200*5113495bSYour Name  * If the host subscribes to any of the TLV's above, that TLV
201*5113495bSYour Name  * if populated by the HW
202*5113495bSYour Name  */
203*5113495bSYour Name 
204*5113495bSYour Name #define NUM_DWORDS_TAG		1
205*5113495bSYour Name 
206*5113495bSYour Name /* By default the packet header TLV is 128 bytes */
207*5113495bSYour Name #define  NUM_OF_BYTES_RX_802_11_HDR_TLV		128
208*5113495bSYour Name #define  NUM_OF_DWORDS_RX_802_11_HDR_TLV	\
209*5113495bSYour Name 		(NUM_OF_BYTES_RX_802_11_HDR_TLV >> 2)
210*5113495bSYour Name 
211*5113495bSYour Name #define RX_PKT_OFFSET_WORDS					\
212*5113495bSYour Name 	(							\
213*5113495bSYour Name 	 NUM_OF_DWORDS_RX_ATTENTION + NUM_DWORDS_TAG		\
214*5113495bSYour Name 	 NUM_OF_DWORDS_RX_MPDU_START + NUM_DWORDS_TAG		\
215*5113495bSYour Name 	 NUM_OF_DWORDS_RX_MSDU_START + NUM_DWORDS_TAG		\
216*5113495bSYour Name 	 NUM_OF_DWORDS_RX_MSDU_END + NUM_DWORDS_TAG		\
217*5113495bSYour Name 	 NUM_OF_DWORDS_RX_MPDU_END + NUM_DWORDS_TAG		\
218*5113495bSYour Name 	 NUM_OF_DWORDS_RX_802_11_HDR_TLV + NUM_DWORDS_TAG	\
219*5113495bSYour Name 	)
220*5113495bSYour Name 
221*5113495bSYour Name #define RX_PKT_OFFSET_BYTES			\
222*5113495bSYour Name 	(RX_PKT_OFFSET_WORDS << 2)
223*5113495bSYour Name 
224*5113495bSYour Name #define RX_PKT_HDR_TLV_LEN		120
225*5113495bSYour Name 
226*5113495bSYour Name /*
227*5113495bSYour Name  * Each RX descriptor TLV is preceded by 1 DWORD "tag"
228*5113495bSYour Name  */
229*5113495bSYour Name struct rx_attention_tlv {
230*5113495bSYour Name 	uint32_t tag;
231*5113495bSYour Name 	struct rx_attention rx_attn;
232*5113495bSYour Name };
233*5113495bSYour Name 
234*5113495bSYour Name struct rx_mpdu_start_tlv {
235*5113495bSYour Name 	uint32_t tag;
236*5113495bSYour Name 	struct rx_mpdu_start rx_mpdu_start;
237*5113495bSYour Name };
238*5113495bSYour Name 
239*5113495bSYour Name struct rx_msdu_start_tlv {
240*5113495bSYour Name 	uint32_t tag;
241*5113495bSYour Name 	struct rx_msdu_start rx_msdu_start;
242*5113495bSYour Name };
243*5113495bSYour Name 
244*5113495bSYour Name struct rx_msdu_end_tlv {
245*5113495bSYour Name 	uint32_t tag;
246*5113495bSYour Name 	struct rx_msdu_end rx_msdu_end;
247*5113495bSYour Name };
248*5113495bSYour Name 
249*5113495bSYour Name struct rx_mpdu_end_tlv {
250*5113495bSYour Name 	uint32_t tag;
251*5113495bSYour Name 	struct rx_mpdu_end rx_mpdu_end;
252*5113495bSYour Name };
253*5113495bSYour Name 
254*5113495bSYour Name struct rx_pkt_hdr_tlv {
255*5113495bSYour Name 	uint32_t tag;				/* 4 B */
256*5113495bSYour Name 	uint32_t phy_ppdu_id;                   /* 4 B */
257*5113495bSYour Name 	char rx_pkt_hdr[RX_PKT_HDR_TLV_LEN];	/* 120 B */
258*5113495bSYour Name };
259*5113495bSYour Name 
260*5113495bSYour Name /* rx_pkt_tlvs structure should be used to process Data buffers, monitor status
261*5113495bSYour Name  * buffers, monitor destination buffers and monitor descriptor buffers.
262*5113495bSYour Name  */
263*5113495bSYour Name #ifdef RXDMA_OPTIMIZATION
264*5113495bSYour Name /*
265*5113495bSYour Name  * The RX_PADDING_BYTES is required so that the TLV's don't
266*5113495bSYour Name  * spread across the 128 byte boundary
267*5113495bSYour Name  * RXDMA optimization requires:
268*5113495bSYour Name  * 1) MSDU_END & ATTENTION TLV's follow in that order
269*5113495bSYour Name  * 2) TLV's don't span across 128 byte lines
270*5113495bSYour Name  * 3) Rx Buffer is nicely aligned on the 128 byte boundary
271*5113495bSYour Name  */
272*5113495bSYour Name #define RX_PADDING0_BYTES	4
273*5113495bSYour Name #define RX_PADDING1_BYTES	16
274*5113495bSYour Name #if defined(IPA_OFFLOAD) && defined(IPA_WDS_EASYMESH_FEATURE)
275*5113495bSYour Name struct rx_pkt_tlvs {
276*5113495bSYour Name 	struct rx_msdu_end_tlv   msdu_end_tlv;	/*  72 bytes */
277*5113495bSYour Name 	struct rx_attention_tlv  attn_tlv;	/*  16 bytes */
278*5113495bSYour Name 	struct rx_mpdu_start_tlv mpdu_start_tlv;/*  96 bytes */
279*5113495bSYour Name 	struct rx_msdu_start_tlv msdu_start_tlv;/*  40 bytes */
280*5113495bSYour Name 	uint8_t rx_padding0[RX_PADDING0_BYTES];	/*   4 bytes */
281*5113495bSYour Name 	struct rx_mpdu_end_tlv   mpdu_end_tlv;	/*  12 bytes */
282*5113495bSYour Name 	uint8_t rx_padding1[RX_PADDING1_BYTES];	/*  16 bytes */
283*5113495bSYour Name #ifndef NO_RX_PKT_HDR_TLV
284*5113495bSYour Name 	struct rx_pkt_hdr_tlv	 pkt_hdr_tlv;	/* 128 bytes */
285*5113495bSYour Name #endif
286*5113495bSYour Name };
287*5113495bSYour Name #else
288*5113495bSYour Name struct rx_pkt_tlvs {
289*5113495bSYour Name 	struct rx_msdu_end_tlv   msdu_end_tlv;	/*  72 bytes */
290*5113495bSYour Name 	struct rx_attention_tlv  attn_tlv;	/*  16 bytes */
291*5113495bSYour Name 	struct rx_msdu_start_tlv msdu_start_tlv;/*  40 bytes */
292*5113495bSYour Name 	uint8_t rx_padding0[RX_PADDING0_BYTES];	/*   4 bytes */
293*5113495bSYour Name 	struct rx_mpdu_start_tlv mpdu_start_tlv;/*  96 bytes */
294*5113495bSYour Name 	struct rx_mpdu_end_tlv   mpdu_end_tlv;	/*  12 bytes */
295*5113495bSYour Name 	uint8_t rx_padding1[RX_PADDING1_BYTES];	/*  16 bytes */
296*5113495bSYour Name #ifndef NO_RX_PKT_HDR_TLV
297*5113495bSYour Name 	struct rx_pkt_hdr_tlv	 pkt_hdr_tlv;	/* 128 bytes */
298*5113495bSYour Name #endif
299*5113495bSYour Name };
300*5113495bSYour Name #endif
301*5113495bSYour Name #else /* RXDMA_OPTIMIZATION */
302*5113495bSYour Name struct rx_pkt_tlvs {
303*5113495bSYour Name 	struct rx_attention_tlv  attn_tlv;
304*5113495bSYour Name 	struct rx_mpdu_start_tlv mpdu_start_tlv;
305*5113495bSYour Name 	struct rx_msdu_start_tlv msdu_start_tlv;
306*5113495bSYour Name 	struct rx_msdu_end_tlv   msdu_end_tlv;
307*5113495bSYour Name 	struct rx_mpdu_end_tlv   mpdu_end_tlv;
308*5113495bSYour Name 	struct rx_pkt_hdr_tlv	 pkt_hdr_tlv;
309*5113495bSYour Name };
310*5113495bSYour Name #endif /* RXDMA_OPTIMIZATION */
311*5113495bSYour Name 
312*5113495bSYour Name /* rx_mon_pkt_tlvs structure should be used to process monitor data buffers */
313*5113495bSYour Name #ifdef RXDMA_OPTIMIZATION
314*5113495bSYour Name struct rx_mon_pkt_tlvs {
315*5113495bSYour Name 	struct rx_msdu_end_tlv   msdu_end_tlv;	/*  72 bytes */
316*5113495bSYour Name 	struct rx_attention_tlv  attn_tlv;	/*  16 bytes */
317*5113495bSYour Name 	struct rx_msdu_start_tlv msdu_start_tlv;/*  40 bytes */
318*5113495bSYour Name 	uint8_t rx_padding0[RX_PADDING0_BYTES];	/*   4 bytes */
319*5113495bSYour Name 	struct rx_mpdu_start_tlv mpdu_start_tlv;/*  96 bytes */
320*5113495bSYour Name 	struct rx_mpdu_end_tlv   mpdu_end_tlv;	/*  12 bytes */
321*5113495bSYour Name 	uint8_t rx_padding1[RX_PADDING1_BYTES];	/*  16 bytes */
322*5113495bSYour Name 	struct rx_pkt_hdr_tlv	 pkt_hdr_tlv;	/* 128 bytes */
323*5113495bSYour Name };
324*5113495bSYour Name #else /* RXDMA_OPTIMIZATION */
325*5113495bSYour Name struct rx_mon_pkt_tlvs {
326*5113495bSYour Name 	struct rx_attention_tlv  attn_tlv;
327*5113495bSYour Name 	struct rx_mpdu_start_tlv mpdu_start_tlv;
328*5113495bSYour Name 	struct rx_msdu_start_tlv msdu_start_tlv;
329*5113495bSYour Name 	struct rx_msdu_end_tlv   msdu_end_tlv;
330*5113495bSYour Name 	struct rx_mpdu_end_tlv   mpdu_end_tlv;
331*5113495bSYour Name 	struct rx_pkt_hdr_tlv	 pkt_hdr_tlv;
332*5113495bSYour Name };
333*5113495bSYour Name #endif
334*5113495bSYour Name 
335*5113495bSYour Name #define SIZE_OF_MONITOR_TLV sizeof(struct rx_mon_pkt_tlvs)
336*5113495bSYour Name #define SIZE_OF_DATA_RX_TLV sizeof(struct rx_pkt_tlvs)
337*5113495bSYour Name 
338*5113495bSYour Name #define RX_PKT_TLVS_LEN		SIZE_OF_DATA_RX_TLV
339*5113495bSYour Name 
340*5113495bSYour Name #define RX_PKT_TLV_OFFSET(field) qdf_offsetof(struct rx_pkt_tlvs, field)
341*5113495bSYour Name 
342*5113495bSYour Name #define HAL_RX_PKT_TLV_MPDU_START_OFFSET(hal_soc) \
343*5113495bSYour Name 					RX_PKT_TLV_OFFSET(mpdu_start_tlv)
344*5113495bSYour Name #define HAL_RX_PKT_TLV_MPDU_END_OFFSET(hal_soc) RX_PKT_TLV_OFFSET(mpdu_end_tlv)
345*5113495bSYour Name #define HAL_RX_PKT_TLV_MSDU_START_OFFSET(hal_soc) \
346*5113495bSYour Name 					RX_PKT_TLV_OFFSET(msdu_start_tlv)
347*5113495bSYour Name #define HAL_RX_PKT_TLV_MSDU_END_OFFSET(hal_soc) RX_PKT_TLV_OFFSET(msdu_end_tlv)
348*5113495bSYour Name #define HAL_RX_PKT_TLV_ATTN_OFFSET(hal_soc) RX_PKT_TLV_OFFSET(attn_tlv)
349*5113495bSYour Name #define HAL_RX_PKT_TLV_PKT_HDR_OFFSET(hal_soc) RX_PKT_TLV_OFFSET(pkt_hdr_tlv)
350*5113495bSYour Name 
351*5113495bSYour Name /**
352*5113495bSYour Name  * hal_rx_get_pkt_tlvs(): Function to retrieve pkt tlvs from nbuf
353*5113495bSYour Name  * @rx_buf_start: Pointer to data buffer field
354*5113495bSYour Name  *
355*5113495bSYour Name  * Return: pointer to rx_pkt_tlvs
356*5113495bSYour Name  */
357*5113495bSYour Name static inline
hal_rx_get_pkt_tlvs(uint8_t * rx_buf_start)358*5113495bSYour Name struct rx_pkt_tlvs *hal_rx_get_pkt_tlvs(uint8_t *rx_buf_start)
359*5113495bSYour Name {
360*5113495bSYour Name 	return (struct rx_pkt_tlvs *)rx_buf_start;
361*5113495bSYour Name }
362*5113495bSYour Name 
363*5113495bSYour Name /**
364*5113495bSYour Name  * hal_rx_get_mpdu_info(): Function to retrieve mpdu info from pkt tlvs
365*5113495bSYour Name  * @pkt_tlvs: Pointer to pkt_tlvs
366*5113495bSYour Name  *
367*5113495bSYour Name  * Return: pointer to rx_mpdu_info structure
368*5113495bSYour Name  */
369*5113495bSYour Name static inline
hal_rx_get_mpdu_info(struct rx_pkt_tlvs * pkt_tlvs)370*5113495bSYour Name struct rx_mpdu_info *hal_rx_get_mpdu_info(struct rx_pkt_tlvs *pkt_tlvs)
371*5113495bSYour Name {
372*5113495bSYour Name 	return &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details;
373*5113495bSYour Name }
374*5113495bSYour Name 
375*5113495bSYour Name /**
376*5113495bSYour Name  * hal_rx_mon_dest_get_buffer_info_from_tlv(): Retrieve mon dest frame info
377*5113495bSYour Name  * from the reserved bytes of rx_tlv_hdr.
378*5113495bSYour Name  * @buf: start of rx_tlv_hdr
379*5113495bSYour Name  * @buf_info: hal_rx_mon_dest_buf_info structure
380*5113495bSYour Name  *
381*5113495bSYour Name  * Return: void
382*5113495bSYour Name  */
hal_rx_mon_dest_get_buffer_info_from_tlv(uint8_t * buf,struct hal_rx_mon_dest_buf_info * buf_info)383*5113495bSYour Name static inline void hal_rx_mon_dest_get_buffer_info_from_tlv(
384*5113495bSYour Name 				uint8_t *buf,
385*5113495bSYour Name 				struct hal_rx_mon_dest_buf_info *buf_info)
386*5113495bSYour Name {
387*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
388*5113495bSYour Name 
389*5113495bSYour Name 	qdf_mem_copy(buf_info, pkt_tlvs->rx_padding0,
390*5113495bSYour Name 		     sizeof(struct hal_rx_mon_dest_buf_info));
391*5113495bSYour Name }
392*5113495bSYour Name 
393*5113495bSYour Name /*
394*5113495bSYour Name  * Get msdu_done bit from the RX_ATTENTION TLV
395*5113495bSYour Name  */
396*5113495bSYour Name #define HAL_RX_ATTN_MSDU_DONE_GET(_rx_attn)		\
397*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn,	\
398*5113495bSYour Name 		RX_ATTENTION_2_MSDU_DONE_OFFSET)),	\
399*5113495bSYour Name 		RX_ATTENTION_2_MSDU_DONE_MASK,		\
400*5113495bSYour Name 		RX_ATTENTION_2_MSDU_DONE_LSB))
401*5113495bSYour Name 
402*5113495bSYour Name #define HAL_RX_ATTN_FIRST_MPDU_GET(_rx_attn)		\
403*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn,	\
404*5113495bSYour Name 		RX_ATTENTION_1_FIRST_MPDU_OFFSET)),	\
405*5113495bSYour Name 		RX_ATTENTION_1_FIRST_MPDU_MASK,		\
406*5113495bSYour Name 		RX_ATTENTION_1_FIRST_MPDU_LSB))
407*5113495bSYour Name 
408*5113495bSYour Name #define HAL_RX_ATTN_TCP_UDP_CKSUM_FAIL_GET(_rx_attn)		\
409*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn,		\
410*5113495bSYour Name 		RX_ATTENTION_1_TCP_UDP_CHKSUM_FAIL_OFFSET)),	\
411*5113495bSYour Name 		RX_ATTENTION_1_TCP_UDP_CHKSUM_FAIL_MASK,	\
412*5113495bSYour Name 		RX_ATTENTION_1_TCP_UDP_CHKSUM_FAIL_LSB))
413*5113495bSYour Name 
414*5113495bSYour Name /**
415*5113495bSYour Name  * hal_rx_attn_tcp_udp_cksum_fail_get() - get tcp_udp cksum fail bit
416*5113495bSYour Name  *                                        from rx attention
417*5113495bSYour Name  * @buf: pointer to rx_pkt_tlvs
418*5113495bSYour Name  *
419*5113495bSYour Name  * Return: tcp_udp_cksum_fail
420*5113495bSYour Name  */
421*5113495bSYour Name static inline bool
hal_rx_attn_tcp_udp_cksum_fail_get(uint8_t * buf)422*5113495bSYour Name hal_rx_attn_tcp_udp_cksum_fail_get(uint8_t *buf)
423*5113495bSYour Name {
424*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
425*5113495bSYour Name 	struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
426*5113495bSYour Name 	uint8_t tcp_udp_cksum_fail;
427*5113495bSYour Name 
428*5113495bSYour Name 	tcp_udp_cksum_fail = HAL_RX_ATTN_TCP_UDP_CKSUM_FAIL_GET(rx_attn);
429*5113495bSYour Name 
430*5113495bSYour Name 	return !!tcp_udp_cksum_fail;
431*5113495bSYour Name }
432*5113495bSYour Name 
433*5113495bSYour Name #define HAL_RX_ATTN_IP_CKSUM_FAIL_GET(_rx_attn)		\
434*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn,	\
435*5113495bSYour Name 		RX_ATTENTION_1_IP_CHKSUM_FAIL_OFFSET)),	\
436*5113495bSYour Name 		RX_ATTENTION_1_IP_CHKSUM_FAIL_MASK,	\
437*5113495bSYour Name 		RX_ATTENTION_1_IP_CHKSUM_FAIL_LSB))
438*5113495bSYour Name 
439*5113495bSYour Name /**
440*5113495bSYour Name  * hal_rx_attn_ip_cksum_fail_get() - get ip cksum fail bit
441*5113495bSYour Name  *                                   from rx attention
442*5113495bSYour Name  * @buf: pointer to rx_pkt_tlvs
443*5113495bSYour Name  *
444*5113495bSYour Name  * Return: ip_cksum_fail
445*5113495bSYour Name  */
446*5113495bSYour Name static inline bool
hal_rx_attn_ip_cksum_fail_get(uint8_t * buf)447*5113495bSYour Name hal_rx_attn_ip_cksum_fail_get(uint8_t *buf)
448*5113495bSYour Name {
449*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
450*5113495bSYour Name 	struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
451*5113495bSYour Name 	uint8_t	 ip_cksum_fail;
452*5113495bSYour Name 
453*5113495bSYour Name 	ip_cksum_fail = HAL_RX_ATTN_IP_CKSUM_FAIL_GET(rx_attn);
454*5113495bSYour Name 
455*5113495bSYour Name 	return !!ip_cksum_fail;
456*5113495bSYour Name }
457*5113495bSYour Name 
458*5113495bSYour Name #define HAL_RX_ATTN_PHY_PPDU_ID_GET(_rx_attn)		\
459*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn,	\
460*5113495bSYour Name 		RX_ATTENTION_0_PHY_PPDU_ID_OFFSET)),	\
461*5113495bSYour Name 		RX_ATTENTION_0_PHY_PPDU_ID_MASK,	\
462*5113495bSYour Name 		RX_ATTENTION_0_PHY_PPDU_ID_LSB))
463*5113495bSYour Name 
464*5113495bSYour Name #define HAL_RX_ATTN_CCE_MATCH_GET(_rx_attn)		\
465*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn,	\
466*5113495bSYour Name 		RX_ATTENTION_1_CCE_MATCH_OFFSET)),		\
467*5113495bSYour Name 		RX_ATTENTION_1_CCE_MATCH_MASK,			\
468*5113495bSYour Name 		RX_ATTENTION_1_CCE_MATCH_LSB))
469*5113495bSYour Name 
470*5113495bSYour Name /**
471*5113495bSYour Name  * hal_rx_msdu_cce_match_get_li() - get CCE match bit
472*5113495bSYour Name  *                                  from rx attention
473*5113495bSYour Name  * @buf: pointer to rx_pkt_tlvs
474*5113495bSYour Name  *
475*5113495bSYour Name  * Return: CCE match value
476*5113495bSYour Name  */
477*5113495bSYour Name static inline bool
hal_rx_msdu_cce_match_get_li(uint8_t * buf)478*5113495bSYour Name hal_rx_msdu_cce_match_get_li(uint8_t *buf)
479*5113495bSYour Name {
480*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
481*5113495bSYour Name 	struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
482*5113495bSYour Name 	uint8_t cce_match_val;
483*5113495bSYour Name 
484*5113495bSYour Name 	cce_match_val = HAL_RX_ATTN_CCE_MATCH_GET(rx_attn);
485*5113495bSYour Name 	return !!cce_match_val;
486*5113495bSYour Name }
487*5113495bSYour Name 
488*5113495bSYour Name /*
489*5113495bSYour Name  * Get peer_meta_data from RX_MPDU_INFO within RX_MPDU_START
490*5113495bSYour Name  */
491*5113495bSYour Name #define HAL_RX_MPDU_PEER_META_DATA_GET(_rx_mpdu_info)	\
492*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info,	\
493*5113495bSYour Name 		RX_MPDU_INFO_8_PEER_META_DATA_OFFSET)),	\
494*5113495bSYour Name 		RX_MPDU_INFO_8_PEER_META_DATA_MASK,	\
495*5113495bSYour Name 		RX_MPDU_INFO_8_PEER_META_DATA_LSB))
496*5113495bSYour Name 
497*5113495bSYour Name static inline uint32_t
hal_rx_mpdu_peer_meta_data_get_li(uint8_t * buf)498*5113495bSYour Name hal_rx_mpdu_peer_meta_data_get_li(uint8_t *buf)
499*5113495bSYour Name {
500*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
501*5113495bSYour Name 	struct rx_mpdu_start *mpdu_start =
502*5113495bSYour Name 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
503*5113495bSYour Name 
504*5113495bSYour Name 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
505*5113495bSYour Name 	uint32_t peer_meta_data;
506*5113495bSYour Name 
507*5113495bSYour Name 	peer_meta_data = HAL_RX_MPDU_PEER_META_DATA_GET(mpdu_info);
508*5113495bSYour Name 
509*5113495bSYour Name 	return peer_meta_data;
510*5113495bSYour Name }
511*5113495bSYour Name 
512*5113495bSYour Name #define HAL_RX_MPDU_INFO_AMPDU_FLAG_GET(_rx_mpdu_info)	\
513*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info,	\
514*5113495bSYour Name 		RX_MPDU_INFO_12_AMPDU_FLAG_OFFSET)),	\
515*5113495bSYour Name 		RX_MPDU_INFO_12_AMPDU_FLAG_MASK,	\
516*5113495bSYour Name 		RX_MPDU_INFO_12_AMPDU_FLAG_LSB))
517*5113495bSYour Name 
518*5113495bSYour Name #define HAL_RX_MPDU_PEER_META_DATA_SET(_rx_mpdu_info, peer_mdata)	\
519*5113495bSYour Name 		((*(((uint32_t *)_rx_mpdu_info) +			\
520*5113495bSYour Name 		(RX_MPDU_INFO_8_PEER_META_DATA_OFFSET >> 2))) =		\
521*5113495bSYour Name 		((peer_mdata) << RX_MPDU_INFO_8_PEER_META_DATA_LSB) &	\
522*5113495bSYour Name 		RX_MPDU_INFO_8_PEER_META_DATA_MASK)
523*5113495bSYour Name 
524*5113495bSYour Name /**
525*5113495bSYour Name  * hal_rx_mpdu_peer_meta_data_set() - set peer meta data in RX mpdu
526*5113495bSYour Name  *                                    start tlv
527*5113495bSYour Name  * @buf: rx_tlv_hdr of the received packet
528*5113495bSYour Name  * @peer_mdata: peer meta data to be set.
529*5113495bSYour Name  *
530*5113495bSYour Name  * Return: void
531*5113495bSYour Name  */
532*5113495bSYour Name static inline void
hal_rx_mpdu_peer_meta_data_set(uint8_t * buf,uint32_t peer_mdata)533*5113495bSYour Name hal_rx_mpdu_peer_meta_data_set(uint8_t *buf, uint32_t peer_mdata)
534*5113495bSYour Name {
535*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
536*5113495bSYour Name 	struct rx_mpdu_start *mpdu_start =
537*5113495bSYour Name 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
538*5113495bSYour Name 
539*5113495bSYour Name 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
540*5113495bSYour Name 
541*5113495bSYour Name 	HAL_RX_MPDU_PEER_META_DATA_SET(mpdu_info, peer_mdata);
542*5113495bSYour Name }
543*5113495bSYour Name 
544*5113495bSYour Name /*
545*5113495bSYour Name  * LRO information needed from the TLVs
546*5113495bSYour Name  */
547*5113495bSYour Name #define HAL_RX_TLV_GET_LRO_ELIGIBLE(buf) \
548*5113495bSYour Name 	(_HAL_MS( \
549*5113495bSYour Name 		 (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
550*5113495bSYour Name 			 msdu_end_tlv.rx_msdu_end), \
551*5113495bSYour Name 			 RX_MSDU_END_9_LRO_ELIGIBLE_OFFSET)), \
552*5113495bSYour Name 		RX_MSDU_END_9_LRO_ELIGIBLE_MASK, \
553*5113495bSYour Name 		RX_MSDU_END_9_LRO_ELIGIBLE_LSB))
554*5113495bSYour Name 
555*5113495bSYour Name #define HAL_RX_TLV_GET_TCP_ACK(buf) \
556*5113495bSYour Name 	(_HAL_MS( \
557*5113495bSYour Name 		 (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
558*5113495bSYour Name 			 msdu_end_tlv.rx_msdu_end), \
559*5113495bSYour Name 			 RX_MSDU_END_8_TCP_ACK_NUMBER_OFFSET)), \
560*5113495bSYour Name 		RX_MSDU_END_8_TCP_ACK_NUMBER_MASK, \
561*5113495bSYour Name 		RX_MSDU_END_8_TCP_ACK_NUMBER_LSB))
562*5113495bSYour Name 
563*5113495bSYour Name #define HAL_RX_TLV_GET_TCP_SEQ(buf) \
564*5113495bSYour Name 	(_HAL_MS( \
565*5113495bSYour Name 		 (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
566*5113495bSYour Name 			 msdu_end_tlv.rx_msdu_end), \
567*5113495bSYour Name 			 RX_MSDU_END_7_TCP_SEQ_NUMBER_OFFSET)), \
568*5113495bSYour Name 		RX_MSDU_END_7_TCP_SEQ_NUMBER_MASK, \
569*5113495bSYour Name 		RX_MSDU_END_7_TCP_SEQ_NUMBER_LSB))
570*5113495bSYour Name 
571*5113495bSYour Name #define HAL_RX_TLV_GET_TCP_WIN(buf) \
572*5113495bSYour Name 	(_HAL_MS( \
573*5113495bSYour Name 		 (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
574*5113495bSYour Name 			 msdu_end_tlv.rx_msdu_end), \
575*5113495bSYour Name 			 RX_MSDU_END_9_WINDOW_SIZE_OFFSET)), \
576*5113495bSYour Name 		RX_MSDU_END_9_WINDOW_SIZE_MASK, \
577*5113495bSYour Name 		RX_MSDU_END_9_WINDOW_SIZE_LSB))
578*5113495bSYour Name 
579*5113495bSYour Name #define HAL_RX_TLV_GET_TCP_PURE_ACK(buf) \
580*5113495bSYour Name 	(_HAL_MS( \
581*5113495bSYour Name 		 (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
582*5113495bSYour Name 			 msdu_start_tlv.rx_msdu_start), \
583*5113495bSYour Name 			 RX_MSDU_START_2_TCP_ONLY_ACK_OFFSET)), \
584*5113495bSYour Name 		RX_MSDU_START_2_TCP_ONLY_ACK_MASK, \
585*5113495bSYour Name 		RX_MSDU_START_2_TCP_ONLY_ACK_LSB))
586*5113495bSYour Name 
587*5113495bSYour Name #define HAL_RX_TLV_GET_TCP_PROTO(buf) \
588*5113495bSYour Name 	(_HAL_MS( \
589*5113495bSYour Name 		 (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
590*5113495bSYour Name 			 msdu_start_tlv.rx_msdu_start), \
591*5113495bSYour Name 			 RX_MSDU_START_2_TCP_PROTO_OFFSET)), \
592*5113495bSYour Name 		RX_MSDU_START_2_TCP_PROTO_MASK, \
593*5113495bSYour Name 		RX_MSDU_START_2_TCP_PROTO_LSB))
594*5113495bSYour Name 
595*5113495bSYour Name #define HAL_RX_TLV_GET_UDP_PROTO(buf) \
596*5113495bSYour Name 	(_HAL_MS( \
597*5113495bSYour Name 		 (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
598*5113495bSYour Name 			 msdu_start_tlv.rx_msdu_start), \
599*5113495bSYour Name 			 RX_MSDU_START_2_UDP_PROTO_OFFSET)), \
600*5113495bSYour Name 		RX_MSDU_START_2_UDP_PROTO_MASK, \
601*5113495bSYour Name 		RX_MSDU_START_2_UDP_PROTO_LSB))
602*5113495bSYour Name 
603*5113495bSYour Name #define HAL_RX_TLV_GET_IPV6(buf) \
604*5113495bSYour Name 	(_HAL_MS( \
605*5113495bSYour Name 		 (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
606*5113495bSYour Name 			 msdu_start_tlv.rx_msdu_start), \
607*5113495bSYour Name 			 RX_MSDU_START_2_IPV6_PROTO_OFFSET)), \
608*5113495bSYour Name 		RX_MSDU_START_2_IPV6_PROTO_MASK, \
609*5113495bSYour Name 		RX_MSDU_START_2_IPV6_PROTO_LSB))
610*5113495bSYour Name 
611*5113495bSYour Name #define HAL_RX_TLV_GET_IP_OFFSET(buf) \
612*5113495bSYour Name 	(_HAL_MS( \
613*5113495bSYour Name 		 (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
614*5113495bSYour Name 			 msdu_start_tlv.rx_msdu_start), \
615*5113495bSYour Name 			 RX_MSDU_START_1_L3_OFFSET_OFFSET)), \
616*5113495bSYour Name 		RX_MSDU_START_1_L3_OFFSET_MASK, \
617*5113495bSYour Name 		RX_MSDU_START_1_L3_OFFSET_LSB))
618*5113495bSYour Name 
619*5113495bSYour Name #define HAL_RX_TLV_GET_TCP_OFFSET(buf) \
620*5113495bSYour Name 	(_HAL_MS( \
621*5113495bSYour Name 		 (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
622*5113495bSYour Name 			 msdu_start_tlv.rx_msdu_start), \
623*5113495bSYour Name 			 RX_MSDU_START_1_L4_OFFSET_OFFSET)), \
624*5113495bSYour Name 		RX_MSDU_START_1_L4_OFFSET_MASK, \
625*5113495bSYour Name 		RX_MSDU_START_1_L4_OFFSET_LSB))
626*5113495bSYour Name 
627*5113495bSYour Name #define HAL_RX_TLV_GET_FLOW_ID_TOEPLITZ(buf) \
628*5113495bSYour Name 	(_HAL_MS( \
629*5113495bSYour Name 		 (*_OFFSET_TO_WORD_PTR(&(((struct rx_pkt_tlvs *)(buf))->\
630*5113495bSYour Name 			 msdu_start_tlv.rx_msdu_start), \
631*5113495bSYour Name 			 RX_MSDU_START_4_FLOW_ID_TOEPLITZ_OFFSET)), \
632*5113495bSYour Name 		RX_MSDU_START_4_FLOW_ID_TOEPLITZ_MASK, \
633*5113495bSYour Name 		RX_MSDU_START_4_FLOW_ID_TOEPLITZ_LSB))
634*5113495bSYour Name 
635*5113495bSYour Name #define HAL_RX_MSDU_START_MSDU_LEN_GET(_rx_msdu_start)		\
636*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_start,		\
637*5113495bSYour Name 		RX_MSDU_START_1_MSDU_LENGTH_OFFSET)),		\
638*5113495bSYour Name 		RX_MSDU_START_1_MSDU_LENGTH_MASK,		\
639*5113495bSYour Name 		RX_MSDU_START_1_MSDU_LENGTH_LSB))
640*5113495bSYour Name 
641*5113495bSYour Name #define HAL_RX_MSDU_START_BW_GET(_rx_msdu_start)     \
642*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start),\
643*5113495bSYour Name 	RX_MSDU_START_5_RECEIVE_BANDWIDTH_OFFSET)), \
644*5113495bSYour Name 	RX_MSDU_START_5_RECEIVE_BANDWIDTH_MASK,     \
645*5113495bSYour Name 	RX_MSDU_START_5_RECEIVE_BANDWIDTH_LSB))
646*5113495bSYour Name 
647*5113495bSYour Name #define HAL_RX_MSDU_START_FLOWID_TOEPLITZ_GET(_rx_msdu_start)	\
648*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_start,		\
649*5113495bSYour Name 		RX_MSDU_START_4_FLOW_ID_TOEPLITZ_OFFSET)),	\
650*5113495bSYour Name 		RX_MSDU_START_4_FLOW_ID_TOEPLITZ_MASK,		\
651*5113495bSYour Name 		RX_MSDU_START_4_FLOW_ID_TOEPLITZ_LSB))
652*5113495bSYour Name 
653*5113495bSYour Name /**
654*5113495bSYour Name  * hal_rx_msdu_start_toeplitz_get() - API to get the toeplitz hash
655*5113495bSYour Name  *                                    from rx_msdu_start TLV
656*5113495bSYour Name  * @buf: pointer to the start of RX PKT TLV headers
657*5113495bSYour Name  *
658*5113495bSYour Name  * Return: toeplitz hash
659*5113495bSYour Name  */
660*5113495bSYour Name static inline uint32_t
hal_rx_msdu_start_toeplitz_get(uint8_t * buf)661*5113495bSYour Name hal_rx_msdu_start_toeplitz_get(uint8_t *buf)
662*5113495bSYour Name {
663*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
664*5113495bSYour Name 	struct rx_msdu_start *msdu_start =
665*5113495bSYour Name 			&pkt_tlvs->msdu_start_tlv.rx_msdu_start;
666*5113495bSYour Name 
667*5113495bSYour Name 	return HAL_RX_MSDU_START_FLOWID_TOEPLITZ_GET(msdu_start);
668*5113495bSYour Name }
669*5113495bSYour Name 
670*5113495bSYour Name #define HAL_RX_MSDU_START_SGI_GET(_rx_msdu_start)	\
671*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start),\
672*5113495bSYour Name 		RX_MSDU_START_5_SGI_OFFSET)),		\
673*5113495bSYour Name 		RX_MSDU_START_5_SGI_MASK,		\
674*5113495bSYour Name 		RX_MSDU_START_5_SGI_LSB))
675*5113495bSYour Name 
676*5113495bSYour Name #define HAL_RX_MSDU_START_RATE_MCS_GET(_rx_msdu_start)	\
677*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start),\
678*5113495bSYour Name 		RX_MSDU_START_5_RATE_MCS_OFFSET)),	\
679*5113495bSYour Name 		RX_MSDU_START_5_RATE_MCS_MASK,		\
680*5113495bSYour Name 		RX_MSDU_START_5_RATE_MCS_LSB))
681*5113495bSYour Name 
682*5113495bSYour Name #define HAL_RX_ATTN_DECRYPT_STATUS_GET(_rx_attn)		\
683*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn,		\
684*5113495bSYour Name 		RX_ATTENTION_2_DECRYPT_STATUS_CODE_OFFSET)),	\
685*5113495bSYour Name 		RX_ATTENTION_2_DECRYPT_STATUS_CODE_MASK,	\
686*5113495bSYour Name 		RX_ATTENTION_2_DECRYPT_STATUS_CODE_LSB))
687*5113495bSYour Name 
688*5113495bSYour Name /*
689*5113495bSYour Name  * Get key index from RX_MSDU_END
690*5113495bSYour Name  */
691*5113495bSYour Name #define HAL_RX_MSDU_END_KEYID_OCTET_GET(_rx_msdu_end)	\
692*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_end,	\
693*5113495bSYour Name 		RX_MSDU_END_2_KEY_ID_OCTET_OFFSET)),	\
694*5113495bSYour Name 		RX_MSDU_END_2_KEY_ID_OCTET_MASK,	\
695*5113495bSYour Name 		RX_MSDU_END_2_KEY_ID_OCTET_LSB))
696*5113495bSYour Name 
697*5113495bSYour Name #define HAL_RX_MSDU_START_RSSI_GET(_rx_msdu_start)	\
698*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_start,  \
699*5113495bSYour Name 		RX_MSDU_START_5_USER_RSSI_OFFSET)),	\
700*5113495bSYour Name 		RX_MSDU_START_5_USER_RSSI_MASK,		\
701*5113495bSYour Name 		RX_MSDU_START_5_USER_RSSI_LSB))
702*5113495bSYour Name 
703*5113495bSYour Name /**
704*5113495bSYour Name  * hal_rx_msdu_start_get_rssi() - API to get the rssi of received pkt
705*5113495bSYour Name  *                                from rx_msdu_start
706*5113495bSYour Name  *
707*5113495bSYour Name  * @buf: pointer to the start of RX PKT TLV header
708*5113495bSYour Name  *
709*5113495bSYour Name  * Return: uint32_t(rssi)
710*5113495bSYour Name  */
711*5113495bSYour Name static inline uint32_t
hal_rx_msdu_start_get_rssi(uint8_t * buf)712*5113495bSYour Name hal_rx_msdu_start_get_rssi(uint8_t *buf)
713*5113495bSYour Name {
714*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
715*5113495bSYour Name 	struct rx_msdu_start *msdu_start =
716*5113495bSYour Name 				&pkt_tlvs->msdu_start_tlv.rx_msdu_start;
717*5113495bSYour Name 	uint32_t rssi;
718*5113495bSYour Name 
719*5113495bSYour Name 	rssi = HAL_RX_MSDU_START_RSSI_GET(msdu_start);
720*5113495bSYour Name 
721*5113495bSYour Name 	return rssi;
722*5113495bSYour Name }
723*5113495bSYour Name 
724*5113495bSYour Name #define HAL_RX_MSDU_START_FREQ_GET(_rx_msdu_start)		\
725*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_start,		\
726*5113495bSYour Name 		RX_MSDU_START_7_SW_PHY_META_DATA_OFFSET)),      \
727*5113495bSYour Name 		RX_MSDU_START_7_SW_PHY_META_DATA_MASK,		\
728*5113495bSYour Name 		RX_MSDU_START_7_SW_PHY_META_DATA_LSB))
729*5113495bSYour Name 
730*5113495bSYour Name #define HAL_RX_MSDU_START_PKT_TYPE_GET(_rx_msdu_start)	\
731*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_msdu_start,  \
732*5113495bSYour Name 		RX_MSDU_START_5_PKT_TYPE_OFFSET)),      \
733*5113495bSYour Name 		RX_MSDU_START_5_PKT_TYPE_MASK,		\
734*5113495bSYour Name 		RX_MSDU_START_5_PKT_TYPE_LSB))
735*5113495bSYour Name 
736*5113495bSYour Name #define HAL_RX_MPDU_AD4_31_0_GET(_rx_mpdu_info)	\
737*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info, \
738*5113495bSYour Name 		RX_MPDU_INFO_20_MAC_ADDR_AD4_31_0_OFFSET)), \
739*5113495bSYour Name 		RX_MPDU_INFO_20_MAC_ADDR_AD4_31_0_MASK,	\
740*5113495bSYour Name 		RX_MPDU_INFO_20_MAC_ADDR_AD4_31_0_LSB))
741*5113495bSYour Name 
742*5113495bSYour Name #define HAL_RX_MPDU_AD4_47_32_GET(_rx_mpdu_info)	\
743*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info, \
744*5113495bSYour Name 		RX_MPDU_INFO_21_MAC_ADDR_AD4_47_32_OFFSET)), \
745*5113495bSYour Name 		RX_MPDU_INFO_21_MAC_ADDR_AD4_47_32_MASK,	\
746*5113495bSYour Name 		RX_MPDU_INFO_21_MAC_ADDR_AD4_47_32_LSB))
747*5113495bSYour Name 
748*5113495bSYour Name /*******************************************************************************
749*5113495bSYour Name  * RX ERROR APIS
750*5113495bSYour Name  ******************************************************************************/
751*5113495bSYour Name 
752*5113495bSYour Name #define HAL_RX_MPDU_END_DECRYPT_ERR_GET(_rx_mpdu_end)	\
753*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_mpdu_end),\
754*5113495bSYour Name 		RX_MPDU_END_1_RX_IN_TX_DECRYPT_BYP_OFFSET)),	\
755*5113495bSYour Name 		RX_MPDU_END_1_RX_IN_TX_DECRYPT_BYP_MASK,	\
756*5113495bSYour Name 		RX_MPDU_END_1_RX_IN_TX_DECRYPT_BYP_LSB))
757*5113495bSYour Name 
758*5113495bSYour Name #define HAL_RX_MPDU_END_MIC_ERR_GET(_rx_mpdu_end)	\
759*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_mpdu_end),\
760*5113495bSYour Name 		RX_MPDU_END_1_TKIP_MIC_ERR_OFFSET)),	\
761*5113495bSYour Name 		RX_MPDU_END_1_TKIP_MIC_ERR_MASK,	\
762*5113495bSYour Name 		RX_MPDU_END_1_TKIP_MIC_ERR_LSB))
763*5113495bSYour Name 
764*5113495bSYour Name 
765*5113495bSYour Name /*******************************************************************************
766*5113495bSYour Name  * RX REO ERROR APIS
767*5113495bSYour Name  ******************************************************************************/
768*5113495bSYour Name 
769*5113495bSYour Name 
770*5113495bSYour Name #define HAL_RX_REO_BUF_TYPE_GET(reo_desc) (((*(((uint32_t *)reo_desc) + \
771*5113495bSYour Name 		(REO_DESTINATION_RING_7_REO_DEST_BUFFER_TYPE_OFFSET >> 2))) & \
772*5113495bSYour Name 		REO_DESTINATION_RING_7_REO_DEST_BUFFER_TYPE_MASK) >> \
773*5113495bSYour Name 		REO_DESTINATION_RING_7_REO_DEST_BUFFER_TYPE_LSB)
774*5113495bSYour Name 
775*5113495bSYour Name #define HAL_RX_REO_QUEUE_NUMBER_GET(reo_desc) (((*(((uint32_t *)reo_desc) + \
776*5113495bSYour Name 		(REO_DESTINATION_RING_7_RECEIVE_QUEUE_NUMBER_OFFSET >> 2))) & \
777*5113495bSYour Name 		REO_DESTINATION_RING_7_RECEIVE_QUEUE_NUMBER_MASK) >> \
778*5113495bSYour Name 		REO_DESTINATION_RING_7_RECEIVE_QUEUE_NUMBER_LSB)
779*5113495bSYour Name 
780*5113495bSYour Name #define HAL_RX_REO_ERROR_GET(reo_desc) (((*(((uint32_t *)reo_desc) + \
781*5113495bSYour Name 		(REO_DESTINATION_RING_7_REO_ERROR_CODE_OFFSET >> 2))) & \
782*5113495bSYour Name 		REO_DESTINATION_RING_7_REO_ERROR_CODE_MASK) >> \
783*5113495bSYour Name 		REO_DESTINATION_RING_7_REO_ERROR_CODE_LSB)
784*5113495bSYour Name 
785*5113495bSYour Name /**
786*5113495bSYour Name  * hal_rx_msdu_link_desc_reinject() - Re-injects the MSDU link
787*5113495bSYour Name  *                                    descriptor to REO entrance ring
788*5113495bSYour Name  *
789*5113495bSYour Name  * @soc: HAL version of the SOC pointer
790*5113495bSYour Name  * @pa: Physical address of the MSDU Link Descriptor
791*5113495bSYour Name  * @cookie: SW cookie to get to the virtual address
792*5113495bSYour Name  * @error_enabled_reo_q: Argument to determine whether this needs to go
793*5113495bSYour Name  * to the error enabled REO queue
794*5113495bSYour Name  *
795*5113495bSYour Name  * Return: void
796*5113495bSYour Name  */
797*5113495bSYour Name static inline
hal_rx_msdu_link_desc_reinject(struct hal_soc * soc,uint64_t pa,uint32_t cookie,bool error_enabled_reo_q)798*5113495bSYour Name void hal_rx_msdu_link_desc_reinject(struct hal_soc *soc,
799*5113495bSYour Name 				    uint64_t pa,
800*5113495bSYour Name 				    uint32_t cookie,
801*5113495bSYour Name 				    bool error_enabled_reo_q)
802*5113495bSYour Name {
803*5113495bSYour Name 	/* TODO */
804*5113495bSYour Name }
805*5113495bSYour Name 
806*5113495bSYour Name #define HAL_RX_WBM_FIRST_MSDU_GET(wbm_desc)		\
807*5113495bSYour Name 	(((*(((uint32_t *)wbm_desc) +			\
808*5113495bSYour Name 	(WBM_RELEASE_RING_4_FIRST_MSDU_OFFSET >> 2))) & \
809*5113495bSYour Name 	WBM_RELEASE_RING_4_FIRST_MSDU_MASK) >>		\
810*5113495bSYour Name 	WBM_RELEASE_RING_4_FIRST_MSDU_LSB)
811*5113495bSYour Name 
812*5113495bSYour Name #define HAL_RX_WBM_LAST_MSDU_GET(wbm_desc)		\
813*5113495bSYour Name 	(((*(((uint32_t *)wbm_desc) +			\
814*5113495bSYour Name 	(WBM_RELEASE_RING_4_LAST_MSDU_OFFSET >> 2))) &  \
815*5113495bSYour Name 	WBM_RELEASE_RING_4_LAST_MSDU_MASK) >>		\
816*5113495bSYour Name 	WBM_RELEASE_RING_4_LAST_MSDU_LSB)
817*5113495bSYour Name 
818*5113495bSYour Name #define HAL_RX_WBM_BUF_COOKIE_GET(wbm_desc) \
819*5113495bSYour Name 	HAL_RX_BUF_COOKIE_GET(&((struct wbm_release_ring *) \
820*5113495bSYour Name 	wbm_desc)->released_buff_or_desc_addr_info)
821*5113495bSYour Name 
822*5113495bSYour Name #define HAL_RX_WBM_BUF_ADDR_39_32_GET(wbm_desc)	\
823*5113495bSYour Name 	(HAL_RX_BUFFER_ADDR_39_32_GET(&			\
824*5113495bSYour Name 	(((struct wbm_release_ring *) \
825*5113495bSYour Name 	wbm_desc)->released_buff_or_desc_addr_info)))
826*5113495bSYour Name 
827*5113495bSYour Name #define HAL_RX_WBM_BUF_ADDR_31_0_GET(wbm_desc)	\
828*5113495bSYour Name 	(HAL_RX_BUFFER_ADDR_31_0_GET(&			\
829*5113495bSYour Name 	(((struct wbm_release_ring *) \
830*5113495bSYour Name 	wbm_desc)->released_buff_or_desc_addr_info)))
831*5113495bSYour Name 
832*5113495bSYour Name static inline
833*5113495bSYour Name uint32_t
HAL_RX_DESC_GET_DECAP_FORMAT(void * hw_desc_addr)834*5113495bSYour Name HAL_RX_DESC_GET_DECAP_FORMAT(void *hw_desc_addr) {
835*5113495bSYour Name 	struct rx_msdu_start *rx_msdu_start;
836*5113495bSYour Name 	struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr;
837*5113495bSYour Name 
838*5113495bSYour Name 	rx_msdu_start = &rx_desc->msdu_start_tlv.rx_msdu_start;
839*5113495bSYour Name 
840*5113495bSYour Name 	return HAL_RX_GET(rx_msdu_start, RX_MSDU_START_2, DECAP_FORMAT);
841*5113495bSYour Name }
842*5113495bSYour Name 
843*5113495bSYour Name #define HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(_rx_mpdu_info)	\
844*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_mpdu_info,	\
845*5113495bSYour Name 		RX_MPDU_INFO_14_MPDU_FRAME_CONTROL_FIELD_OFFSET)),	\
846*5113495bSYour Name 		RX_MPDU_INFO_14_MPDU_FRAME_CONTROL_FIELD_MASK,	\
847*5113495bSYour Name 		RX_MPDU_INFO_14_MPDU_FRAME_CONTROL_FIELD_LSB))
848*5113495bSYour Name /**
849*5113495bSYour Name  * hal_rx_get_rx_more_frag_bit(): Function to retrieve more fragment bit
850*5113495bSYour Name  * @buf: Network buffer
851*5113495bSYour Name  *
852*5113495bSYour Name  * Return: rx more fragment bit
853*5113495bSYour Name  */
854*5113495bSYour Name static inline
hal_rx_get_rx_more_frag_bit(uint8_t * buf)855*5113495bSYour Name uint8_t hal_rx_get_rx_more_frag_bit(uint8_t *buf)
856*5113495bSYour Name {
857*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
858*5113495bSYour Name 	struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
859*5113495bSYour Name 	uint16_t frame_ctrl = 0;
860*5113495bSYour Name 
861*5113495bSYour Name 	frame_ctrl = HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(rx_mpdu_info) >>
862*5113495bSYour Name 		DOT11_FC1_MORE_FRAG_OFFSET;
863*5113495bSYour Name 
864*5113495bSYour Name 	/* more fragment bit if at offset bit 4 */
865*5113495bSYour Name 	return frame_ctrl;
866*5113495bSYour Name }
867*5113495bSYour Name 
868*5113495bSYour Name static inline
hal_rx_mpdu_desc_info_get_li(void * desc_addr,void * mpdu_desc_info_hdl)869*5113495bSYour Name void hal_rx_mpdu_desc_info_get_li(void *desc_addr,
870*5113495bSYour Name 				  void *mpdu_desc_info_hdl)
871*5113495bSYour Name {
872*5113495bSYour Name 	struct reo_destination_ring *reo_dst_ring;
873*5113495bSYour Name 	struct hal_rx_mpdu_desc_info *mpdu_desc_info =
874*5113495bSYour Name 		(struct hal_rx_mpdu_desc_info *)mpdu_desc_info_hdl;
875*5113495bSYour Name 	uint32_t *mpdu_info;
876*5113495bSYour Name 
877*5113495bSYour Name 	reo_dst_ring = (struct reo_destination_ring *)desc_addr;
878*5113495bSYour Name 
879*5113495bSYour Name 	mpdu_info = (uint32_t *)&reo_dst_ring->rx_mpdu_desc_info_details;
880*5113495bSYour Name 
881*5113495bSYour Name 	mpdu_desc_info->msdu_count = HAL_RX_MPDU_MSDU_COUNT_GET(mpdu_info);
882*5113495bSYour Name 	mpdu_desc_info->mpdu_seq = HAL_RX_MPDU_SEQUENCE_NUMBER_GET(mpdu_info);
883*5113495bSYour Name 	mpdu_desc_info->mpdu_flags = HAL_RX_MPDU_FLAGS_GET(mpdu_info);
884*5113495bSYour Name 	mpdu_desc_info->peer_meta_data =
885*5113495bSYour Name 		HAL_RX_MPDU_DESC_PEER_META_DATA_GET(mpdu_info);
886*5113495bSYour Name 	mpdu_desc_info->bar_frame = HAL_RX_MPDU_BAR_FRAME_GET(mpdu_info);
887*5113495bSYour Name }
888*5113495bSYour Name 
889*5113495bSYour Name /**
890*5113495bSYour Name  * hal_rx_attn_msdu_done_get_li() - Get msdi done flag from RX TLV
891*5113495bSYour Name  * @buf: RX tlv address
892*5113495bSYour Name  *
893*5113495bSYour Name  * Return: msdu done flag
894*5113495bSYour Name  */
hal_rx_attn_msdu_done_get_li(uint8_t * buf)895*5113495bSYour Name static inline uint32_t hal_rx_attn_msdu_done_get_li(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_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
899*5113495bSYour Name 	uint32_t msdu_done;
900*5113495bSYour Name 
901*5113495bSYour Name 	msdu_done = HAL_RX_ATTN_MSDU_DONE_GET(rx_attn);
902*5113495bSYour Name 
903*5113495bSYour Name 	return msdu_done;
904*5113495bSYour Name }
905*5113495bSYour Name 
906*5113495bSYour Name #define HAL_RX_MSDU_FLAGS_GET(msdu_info_ptr) \
907*5113495bSYour Name 	(HAL_RX_FIRST_MSDU_IN_MPDU_FLAG_GET(msdu_info_ptr) | \
908*5113495bSYour Name 	HAL_RX_LAST_MSDU_IN_MPDU_FLAG_GET(msdu_info_ptr) | \
909*5113495bSYour Name 	HAL_RX_MSDU_CONTINUATION_FLAG_GET(msdu_info_ptr) | \
910*5113495bSYour Name 	HAL_RX_MSDU_SA_IS_VALID_FLAG_GET(msdu_info_ptr) | \
911*5113495bSYour Name 	HAL_RX_MSDU_SA_IDX_TIMEOUT_FLAG_GET(msdu_info_ptr) | \
912*5113495bSYour Name 	HAL_RX_MSDU_DA_IS_VALID_FLAG_GET(msdu_info_ptr) | \
913*5113495bSYour Name 	HAL_RX_MSDU_DA_IS_MCBC_FLAG_GET(msdu_info_ptr) | \
914*5113495bSYour Name 	HAL_RX_MSDU_DA_IDX_TIMEOUT_FLAG_GET(msdu_info_ptr))
915*5113495bSYour Name 
916*5113495bSYour Name /**
917*5113495bSYour Name  * hal_rx_msdu_flags_get_li() - Get msdu flags from ring desc
918*5113495bSYour Name  * @msdu_desc_info_hdl: msdu desc info handle
919*5113495bSYour Name  *
920*5113495bSYour Name  * Return: msdu flags
921*5113495bSYour Name  */
922*5113495bSYour Name static inline
hal_rx_msdu_flags_get_li(rx_msdu_desc_info_t msdu_desc_info_hdl)923*5113495bSYour Name uint32_t hal_rx_msdu_flags_get_li(rx_msdu_desc_info_t msdu_desc_info_hdl)
924*5113495bSYour Name {
925*5113495bSYour Name 	struct rx_msdu_desc_info *msdu_desc_info =
926*5113495bSYour Name 		(struct rx_msdu_desc_info *)msdu_desc_info_hdl;
927*5113495bSYour Name 
928*5113495bSYour Name 	return HAL_RX_MSDU_FLAGS_GET(msdu_desc_info);
929*5113495bSYour Name }
930*5113495bSYour Name 
931*5113495bSYour Name /**
932*5113495bSYour Name  * hal_rx_msdu_desc_info_get_li() - Gets the flags related to MSDU descriptor.
933*5113495bSYour Name  * @desc_addr: REO ring descriptor addr
934*5113495bSYour Name  * @msdu_desc_info: Holds MSDU descriptor info from HAL Rx descriptor
935*5113495bSYour Name  *
936*5113495bSYour Name  * Specifically flags needed are: first_msdu_in_mpdu,
937*5113495bSYour Name  * last_msdu_in_mpdu, msdu_continuation, sa_is_valid,
938*5113495bSYour Name  * sa_idx_timeout, da_is_valid, da_idx_timeout, da_is_MCBC
939*5113495bSYour Name  *
940*5113495bSYour Name  * Return: void
941*5113495bSYour Name  */
942*5113495bSYour Name static inline void
hal_rx_msdu_desc_info_get_li(void * desc_addr,struct hal_rx_msdu_desc_info * msdu_desc_info)943*5113495bSYour Name hal_rx_msdu_desc_info_get_li(void *desc_addr,
944*5113495bSYour Name 			     struct hal_rx_msdu_desc_info *msdu_desc_info)
945*5113495bSYour Name {
946*5113495bSYour Name 	struct reo_destination_ring *reo_dst_ring;
947*5113495bSYour Name 	uint32_t *msdu_info;
948*5113495bSYour Name 
949*5113495bSYour Name 	reo_dst_ring = (struct reo_destination_ring *)desc_addr;
950*5113495bSYour Name 
951*5113495bSYour Name 	msdu_info = (uint32_t *)&reo_dst_ring->rx_msdu_desc_info_details;
952*5113495bSYour Name 	msdu_desc_info->msdu_flags =
953*5113495bSYour Name 		hal_rx_msdu_flags_get_li((struct rx_msdu_desc_info *)msdu_info);
954*5113495bSYour Name 	msdu_desc_info->msdu_len = HAL_RX_MSDU_PKT_LENGTH_GET(msdu_info);
955*5113495bSYour Name }
956*5113495bSYour Name 
957*5113495bSYour Name #define HAL_RX_MSDU_START_NSS_GET(_rx_msdu_start)		\
958*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR((_rx_msdu_start),	\
959*5113495bSYour Name 	RX_MSDU_START_5_NSS_OFFSET)),				\
960*5113495bSYour Name 	RX_MSDU_START_5_NSS_MASK,				\
961*5113495bSYour Name 	RX_MSDU_START_5_NSS_LSB))
962*5113495bSYour Name 
963*5113495bSYour Name #define HAL_RX_ATTN_MSDU_LEN_ERR_GET(_rx_attn)		\
964*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn,	\
965*5113495bSYour Name 		RX_ATTENTION_1_MSDU_LENGTH_ERR_OFFSET)),	\
966*5113495bSYour Name 		RX_ATTENTION_1_MSDU_LENGTH_ERR_MASK,		\
967*5113495bSYour Name 		RX_ATTENTION_1_MSDU_LENGTH_ERR_LSB))
968*5113495bSYour Name 
969*5113495bSYour Name /**
970*5113495bSYour Name  * hal_rx_attn_msdu_len_err_get_li() - Get msdu_len_err value from rx
971*5113495bSYour Name  *                                     attention tlvs
972*5113495bSYour Name  * @buf: pointer to rx pkt tlvs hdr
973*5113495bSYour Name  *
974*5113495bSYour Name  * Return: msdu_len_err value
975*5113495bSYour Name  */
976*5113495bSYour Name static inline uint32_t
hal_rx_attn_msdu_len_err_get_li(uint8_t * buf)977*5113495bSYour Name hal_rx_attn_msdu_len_err_get_li(uint8_t *buf)
978*5113495bSYour Name {
979*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
980*5113495bSYour Name 	struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
981*5113495bSYour Name 
982*5113495bSYour Name 	return HAL_RX_ATTN_MSDU_LEN_ERR_GET(rx_attn);
983*5113495bSYour Name }
984*5113495bSYour Name #endif /* _HAL_LI_RX_H_ */
985