xref: /wlan-driver/qca-wifi-host-cmn/dp/wifi3.0/li/dp_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 _DP_LI_RX_H_
21*5113495bSYour Name #define _DP_LI_RX_H_
22*5113495bSYour Name 
23*5113495bSYour Name #include <dp_types.h>
24*5113495bSYour Name #include <dp_rx.h>
25*5113495bSYour Name #include "dp_li.h"
26*5113495bSYour Name 
27*5113495bSYour Name /**
28*5113495bSYour Name  * dp_rx_process_li() - Brain of the Rx processing functionality
29*5113495bSYour Name  *		     Called from the bottom half (tasklet/NET_RX_SOFTIRQ)
30*5113495bSYour Name  * @int_ctx: per interrupt context
31*5113495bSYour Name  * @hal_ring_hdl: opaque pointer to the HAL Rx Ring, which will be serviced
32*5113495bSYour Name  * @reo_ring_num: ring number (0, 1, 2 or 3) of the reo ring.
33*5113495bSYour Name  * @quota: No. of units (packets) that can be serviced in one shot.
34*5113495bSYour Name  *
35*5113495bSYour Name  * This function implements the core of Rx functionality. This is
36*5113495bSYour Name  * expected to handle only non-error frames.
37*5113495bSYour Name  *
38*5113495bSYour Name  * Return: uint32_t: No. of elements processed
39*5113495bSYour Name  */
40*5113495bSYour Name uint32_t dp_rx_process_li(struct dp_intr *int_ctx,
41*5113495bSYour Name 			  hal_ring_handle_t hal_ring_hdl, uint8_t reo_ring_num,
42*5113495bSYour Name 			  uint32_t quota);
43*5113495bSYour Name 
44*5113495bSYour Name /**
45*5113495bSYour Name  * dp_rx_chain_msdus_li() - Function to chain all msdus of a mpdu
46*5113495bSYour Name  *			    to pdev invalid peer list
47*5113495bSYour Name  *
48*5113495bSYour Name  * @soc: core DP main context
49*5113495bSYour Name  * @nbuf: Buffer pointer
50*5113495bSYour Name  * @rx_tlv_hdr: start of rx tlv header
51*5113495bSYour Name  * @mac_id: mac id
52*5113495bSYour Name  *
53*5113495bSYour Name  *  Return: bool: true for last msdu of mpdu
54*5113495bSYour Name  */
55*5113495bSYour Name bool dp_rx_chain_msdus_li(struct dp_soc *soc, qdf_nbuf_t nbuf,
56*5113495bSYour Name 			  uint8_t *rx_tlv_hdr, uint8_t mac_id);
57*5113495bSYour Name 
58*5113495bSYour Name /**
59*5113495bSYour Name  * dp_rx_desc_pool_init_li() - Initialize Rx Descriptor pool(s)
60*5113495bSYour Name  * @soc: Handle to DP Soc structure
61*5113495bSYour Name  * @rx_desc_pool: Rx descriptor pool handler
62*5113495bSYour Name  * @pool_id: Rx descriptor pool ID
63*5113495bSYour Name  *
64*5113495bSYour Name  * Return: None
65*5113495bSYour Name  */
66*5113495bSYour Name QDF_STATUS dp_rx_desc_pool_init_li(struct dp_soc *soc,
67*5113495bSYour Name 				   struct rx_desc_pool *rx_desc_pool,
68*5113495bSYour Name 				   uint32_t pool_id);
69*5113495bSYour Name 
70*5113495bSYour Name /**
71*5113495bSYour Name  * dp_rx_desc_pool_deinit_li() - De-initialize Rx Descriptor pool(s)
72*5113495bSYour Name  * @soc: Handle to DP Soc structure
73*5113495bSYour Name  * @rx_desc_pool: Rx descriptor pool handler
74*5113495bSYour Name  * @pool_id: Rx descriptor pool ID
75*5113495bSYour Name  *
76*5113495bSYour Name  * Return: None
77*5113495bSYour Name  */
78*5113495bSYour Name void dp_rx_desc_pool_deinit_li(struct dp_soc *soc,
79*5113495bSYour Name 			       struct rx_desc_pool *rx_desc_pool,
80*5113495bSYour Name 			       uint32_t pool_id);
81*5113495bSYour Name 
82*5113495bSYour Name /**
83*5113495bSYour Name  * dp_wbm_get_rx_desc_from_hal_desc_li() - Get corresponding Rx Desc
84*5113495bSYour Name  *					address from WBM ring Desc
85*5113495bSYour Name  * @soc: Handle to DP Soc structure
86*5113495bSYour Name  * @ring_desc: ring descriptor structure pointer
87*5113495bSYour Name  * @r_rx_desc: pointer to a pointer of Rx Desc
88*5113495bSYour Name  *
89*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS - succeeded, others - failed
90*5113495bSYour Name  */
91*5113495bSYour Name QDF_STATUS dp_wbm_get_rx_desc_from_hal_desc_li(
92*5113495bSYour Name 					struct dp_soc *soc,
93*5113495bSYour Name 					void *ring_desc,
94*5113495bSYour Name 					struct dp_rx_desc **r_rx_desc);
95*5113495bSYour Name /**
96*5113495bSYour Name  * dp_rx_get_reo_qdesc_addr_li(): API to get qdesc address of reo
97*5113495bSYour Name  * entrance ring desc
98*5113495bSYour Name  *
99*5113495bSYour Name  * @hal_soc: Handle to HAL Soc structure
100*5113495bSYour Name  * @dst_ring_desc: reo dest ring descriptor (used for Lithium DP)
101*5113495bSYour Name  * @buf: pointer to the start of RX PKT TLV headers
102*5113495bSYour Name  * @txrx_peer: pointer to txrx_peer
103*5113495bSYour Name  * @tid: tid value
104*5113495bSYour Name  *
105*5113495bSYour Name  * Return: qdesc address in reo destination ring buffer
106*5113495bSYour Name  */
107*5113495bSYour Name static inline
dp_rx_get_reo_qdesc_addr_li(hal_soc_handle_t hal_soc,uint8_t * dst_ring_desc,uint8_t * buf,struct dp_txrx_peer * txrx_peer,unsigned int tid)108*5113495bSYour Name uint64_t dp_rx_get_reo_qdesc_addr_li(hal_soc_handle_t hal_soc,
109*5113495bSYour Name 				     uint8_t *dst_ring_desc,
110*5113495bSYour Name 				     uint8_t *buf,
111*5113495bSYour Name 				     struct dp_txrx_peer *txrx_peer,
112*5113495bSYour Name 				     unsigned int tid)
113*5113495bSYour Name {
114*5113495bSYour Name 	return hal_rx_get_qdesc_addr(hal_soc, dst_ring_desc, buf);
115*5113495bSYour Name }
116*5113495bSYour Name 
117*5113495bSYour Name /**
118*5113495bSYour Name  * dp_rx_desc_cookie_2_va_li() - Convert RX Desc cookie ID to VA
119*5113495bSYour Name  * @soc:Handle to DP Soc structure
120*5113495bSYour Name  * @cookie: cookie used to lookup virtual address
121*5113495bSYour Name  *
122*5113495bSYour Name  * Return: Rx descriptor virtual address
123*5113495bSYour Name  */
124*5113495bSYour Name static inline
dp_rx_desc_cookie_2_va_li(struct dp_soc * soc,uint32_t cookie)125*5113495bSYour Name struct dp_rx_desc *dp_rx_desc_cookie_2_va_li(struct dp_soc *soc,
126*5113495bSYour Name 					     uint32_t cookie)
127*5113495bSYour Name {
128*5113495bSYour Name 	return dp_rx_cookie_2_va_rxdma_buf(soc, cookie);
129*5113495bSYour Name }
130*5113495bSYour Name 
131*5113495bSYour Name #define DP_PEER_METADATA_VDEV_ID_MASK	0x003f0000
132*5113495bSYour Name #define DP_PEER_METADATA_VDEV_ID_SHIFT	16
133*5113495bSYour Name #define DP_PEER_METADATA_OFFLOAD_MASK	0x01000000
134*5113495bSYour Name #define DP_PEER_METADATA_OFFLOAD_SHIFT	24
135*5113495bSYour Name 
136*5113495bSYour Name #define DP_PEER_METADATA_VDEV_ID_GET_LI(_peer_metadata)		\
137*5113495bSYour Name 	(((_peer_metadata) & DP_PEER_METADATA_VDEV_ID_MASK)	\
138*5113495bSYour Name 			>> DP_PEER_METADATA_VDEV_ID_SHIFT)
139*5113495bSYour Name 
140*5113495bSYour Name #define DP_PEER_METADATA_OFFLOAD_GET_LI(_peer_metadata)		\
141*5113495bSYour Name 	(((_peer_metadata) & DP_PEER_METADATA_OFFLOAD_MASK)	\
142*5113495bSYour Name 			>> DP_PEER_METADATA_OFFLOAD_SHIFT)
143*5113495bSYour Name 
144*5113495bSYour Name static inline uint16_t
dp_rx_peer_metadata_peer_id_get_li(struct dp_soc * soc,uint32_t peer_metadata)145*5113495bSYour Name dp_rx_peer_metadata_peer_id_get_li(struct dp_soc *soc, uint32_t peer_metadata)
146*5113495bSYour Name {
147*5113495bSYour Name 	struct htt_rx_peer_metadata_v0 *metadata =
148*5113495bSYour Name 			(struct htt_rx_peer_metadata_v0 *)&peer_metadata;
149*5113495bSYour Name 
150*5113495bSYour Name 	return metadata->peer_id;
151*5113495bSYour Name }
152*5113495bSYour Name 
153*5113495bSYour Name bool
154*5113495bSYour Name dp_rx_intrabss_handle_nawds_li(struct dp_soc *soc, struct dp_txrx_peer *ta_peer,
155*5113495bSYour Name 			       qdf_nbuf_t nbuf_copy,
156*5113495bSYour Name 			       struct cdp_tid_rx_stats *tid_stats,
157*5113495bSYour Name 			       uint8_t link_id);
158*5113495bSYour Name 
159*5113495bSYour Name #ifdef QCA_DP_RX_NBUF_AND_NBUF_DATA_PREFETCH
160*5113495bSYour Name static inline
dp_rx_prefetch_nbuf_data(qdf_nbuf_t nbuf,qdf_nbuf_t next)161*5113495bSYour Name void dp_rx_prefetch_nbuf_data(qdf_nbuf_t nbuf, qdf_nbuf_t next)
162*5113495bSYour Name {
163*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs;
164*5113495bSYour Name 
165*5113495bSYour Name 	if (next) {
166*5113495bSYour Name 		/* prefetch skb->next and first few bytes of skb->cb */
167*5113495bSYour Name 		qdf_prefetch(next);
168*5113495bSYour Name 		/* skb->cb spread across 2 cache lines hence below prefetch */
169*5113495bSYour Name 		qdf_prefetch(&next->_skb_refdst);
170*5113495bSYour Name 		qdf_prefetch(&next->len);
171*5113495bSYour Name 		qdf_prefetch(&next->protocol);
172*5113495bSYour Name 		pkt_tlvs = (struct rx_pkt_tlvs *)next->data;
173*5113495bSYour Name 		/* sa_idx, da_idx, l3_pad in RX msdu_end TLV */
174*5113495bSYour Name 		qdf_prefetch(pkt_tlvs);
175*5113495bSYour Name 		/* msdu_done in RX attention TLV */
176*5113495bSYour Name 		qdf_prefetch(&pkt_tlvs->attn_tlv);
177*5113495bSYour Name 		/* fr_ds & to_ds in RX MPDU start TLV */
178*5113495bSYour Name 		if (qdf_nbuf_is_rx_chfrag_end(nbuf))
179*5113495bSYour Name 			qdf_prefetch(&pkt_tlvs->mpdu_start_tlv);
180*5113495bSYour Name 	}
181*5113495bSYour Name }
182*5113495bSYour Name #else
183*5113495bSYour Name static inline
dp_rx_prefetch_nbuf_data(qdf_nbuf_t nbuf,qdf_nbuf_t next)184*5113495bSYour Name void dp_rx_prefetch_nbuf_data(qdf_nbuf_t nbuf, qdf_nbuf_t next)
185*5113495bSYour Name {
186*5113495bSYour Name }
187*5113495bSYour Name #endif
188*5113495bSYour Name 
189*5113495bSYour Name #ifdef QCA_DP_RX_HW_SW_NBUF_DESC_PREFETCH
190*5113495bSYour Name /**
191*5113495bSYour Name  * dp_rx_cookie_2_va_rxdma_buf_prefetch() - function to prefetch the SW desc
192*5113495bSYour Name  * @soc: Handle to DP Soc structure
193*5113495bSYour Name  * @cookie: cookie used to lookup virtual address
194*5113495bSYour Name  *
195*5113495bSYour Name  * Return: prefetched Rx descriptor virtual address
196*5113495bSYour Name  */
197*5113495bSYour Name static inline
dp_rx_cookie_2_va_rxdma_buf_prefetch(struct dp_soc * soc,uint32_t cookie)198*5113495bSYour Name void *dp_rx_cookie_2_va_rxdma_buf_prefetch(struct dp_soc *soc, uint32_t cookie)
199*5113495bSYour Name {
200*5113495bSYour Name 	uint8_t pool_id = DP_RX_DESC_COOKIE_POOL_ID_GET(cookie);
201*5113495bSYour Name 	uint16_t index = DP_RX_DESC_COOKIE_INDEX_GET(cookie);
202*5113495bSYour Name 	struct rx_desc_pool *rx_desc_pool;
203*5113495bSYour Name 	void *prefetch_desc;
204*5113495bSYour Name 
205*5113495bSYour Name 	if (qdf_unlikely(pool_id >= MAX_RXDESC_POOLS))
206*5113495bSYour Name 		return NULL;
207*5113495bSYour Name 
208*5113495bSYour Name 	rx_desc_pool = &soc->rx_desc_buf[pool_id];
209*5113495bSYour Name 
210*5113495bSYour Name 	if (qdf_unlikely(index >= rx_desc_pool->pool_size))
211*5113495bSYour Name 		return NULL;
212*5113495bSYour Name 
213*5113495bSYour Name 	prefetch_desc = &soc->rx_desc_buf[pool_id].array[index].rx_desc;
214*5113495bSYour Name 	qdf_prefetch(prefetch_desc);
215*5113495bSYour Name 	return prefetch_desc;
216*5113495bSYour Name }
217*5113495bSYour Name 
218*5113495bSYour Name /**
219*5113495bSYour Name  * dp_rx_prefetch_hw_sw_nbuf_desc() - function to prefetch HW and SW desc
220*5113495bSYour Name  * @soc: Handle to DP Soc structure
221*5113495bSYour Name  * @hal_soc: Handle to HAL Soc structure
222*5113495bSYour Name  * @num_entries: valid number of HW descriptors
223*5113495bSYour Name  * @hal_ring_hdl: Destination ring pointer
224*5113495bSYour Name  * @last_prefetched_hw_desc: pointer to the last prefetched HW descriptor
225*5113495bSYour Name  * @last_prefetched_sw_desc: input & output param of last prefetch SW desc
226*5113495bSYour Name  *
227*5113495bSYour Name  * Return: None
228*5113495bSYour Name  */
229*5113495bSYour Name static inline
dp_rx_prefetch_hw_sw_nbuf_desc(struct dp_soc * soc,hal_soc_handle_t hal_soc,uint32_t num_entries,hal_ring_handle_t hal_ring_hdl,hal_ring_desc_t * last_prefetched_hw_desc,struct dp_rx_desc ** last_prefetched_sw_desc)230*5113495bSYour Name void dp_rx_prefetch_hw_sw_nbuf_desc(struct dp_soc *soc,
231*5113495bSYour Name 				    hal_soc_handle_t hal_soc,
232*5113495bSYour Name 				    uint32_t num_entries,
233*5113495bSYour Name 				    hal_ring_handle_t hal_ring_hdl,
234*5113495bSYour Name 				    hal_ring_desc_t *last_prefetched_hw_desc,
235*5113495bSYour Name 				    struct dp_rx_desc **last_prefetched_sw_desc)
236*5113495bSYour Name {
237*5113495bSYour Name 	if (*last_prefetched_sw_desc) {
238*5113495bSYour Name 		qdf_prefetch((uint8_t *)(*last_prefetched_sw_desc)->nbuf);
239*5113495bSYour Name 		qdf_prefetch((uint8_t *)(*last_prefetched_sw_desc)->nbuf + 64);
240*5113495bSYour Name 	}
241*5113495bSYour Name 
242*5113495bSYour Name 	if (num_entries) {
243*5113495bSYour Name 		*last_prefetched_sw_desc = dp_rx_cookie_2_va_rxdma_buf_prefetch(soc, HAL_RX_REO_BUF_COOKIE_GET(*last_prefetched_hw_desc));
244*5113495bSYour Name 		*last_prefetched_hw_desc = hal_srng_dst_prefetch_next_cached_desc(hal_soc,
245*5113495bSYour Name 										  hal_ring_hdl,
246*5113495bSYour Name 										  (uint8_t *)*last_prefetched_hw_desc);
247*5113495bSYour Name 	}
248*5113495bSYour Name }
249*5113495bSYour Name #else
250*5113495bSYour Name static inline
dp_rx_prefetch_hw_sw_nbuf_desc(struct dp_soc * soc,hal_soc_handle_t hal_soc,uint32_t quota,hal_ring_handle_t hal_ring_hdl,hal_ring_desc_t * last_prefetched_hw_desc,struct dp_rx_desc ** last_prefetched_sw_desc)251*5113495bSYour Name void dp_rx_prefetch_hw_sw_nbuf_desc(struct dp_soc *soc,
252*5113495bSYour Name 				    hal_soc_handle_t hal_soc,
253*5113495bSYour Name 				    uint32_t quota,
254*5113495bSYour Name 				    hal_ring_handle_t hal_ring_hdl,
255*5113495bSYour Name 				    hal_ring_desc_t *last_prefetched_hw_desc,
256*5113495bSYour Name 				    struct dp_rx_desc **last_prefetched_sw_desc)
257*5113495bSYour Name {
258*5113495bSYour Name }
259*5113495bSYour Name #endif
260*5113495bSYour Name 
261*5113495bSYour Name static inline
dp_peer_rx_reorder_queue_setup_li(struct dp_soc * soc,struct dp_peer * peer,uint32_t tid_bitmap,uint32_t ba_window_size)262*5113495bSYour Name QDF_STATUS dp_peer_rx_reorder_queue_setup_li(struct dp_soc *soc,
263*5113495bSYour Name 					     struct dp_peer *peer,
264*5113495bSYour Name 					     uint32_t tid_bitmap,
265*5113495bSYour Name 					     uint32_t ba_window_size)
266*5113495bSYour Name {
267*5113495bSYour Name 	int tid;
268*5113495bSYour Name 	struct dp_rx_tid *rx_tid;
269*5113495bSYour Name 
270*5113495bSYour Name 	if (!soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup) {
271*5113495bSYour Name 		dp_peer_debug("peer_rx_reorder_queue_setup NULL");
272*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
273*5113495bSYour Name 	}
274*5113495bSYour Name 
275*5113495bSYour Name 	for (tid = 0; tid < DP_MAX_TIDS; tid++) {
276*5113495bSYour Name 		if (!(BIT(tid) & tid_bitmap))
277*5113495bSYour Name 			continue;
278*5113495bSYour Name 
279*5113495bSYour Name 		rx_tid = &peer->rx_tid[tid];
280*5113495bSYour Name 		if (!rx_tid->hw_qdesc_paddr) {
281*5113495bSYour Name 			tid_bitmap &= ~BIT(tid);
282*5113495bSYour Name 			continue;
283*5113495bSYour Name 		}
284*5113495bSYour Name 
285*5113495bSYour Name 		if (soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup(
286*5113495bSYour Name 		    soc->ctrl_psoc,
287*5113495bSYour Name 		    peer->vdev->pdev->pdev_id,
288*5113495bSYour Name 		    peer->vdev->vdev_id,
289*5113495bSYour Name 		    peer->mac_addr.raw, rx_tid->hw_qdesc_paddr, tid, tid,
290*5113495bSYour Name 		    1, ba_window_size)) {
291*5113495bSYour Name 			dp_peer_err("%pK: Fail to send reo q setup. tid %d",
292*5113495bSYour Name 				    soc, tid);
293*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
294*5113495bSYour Name 		}
295*5113495bSYour Name 
296*5113495bSYour Name 		if (!tid_bitmap) {
297*5113495bSYour Name 			dp_peer_err("tid_bitmap=0. All tids setup fail");
298*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
299*5113495bSYour Name 		}
300*5113495bSYour Name 	}
301*5113495bSYour Name 
302*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
303*5113495bSYour Name }
304*5113495bSYour Name 
305*5113495bSYour Name /**
306*5113495bSYour Name  * dp_rx_wbm_err_reap_desc_li() - Function to reap and replenish
307*5113495bSYour Name  *                                WBM RX Error descriptors
308*5113495bSYour Name  *
309*5113495bSYour Name  * @int_ctx: pointer to DP interrupt context
310*5113495bSYour Name  * @soc: core DP main context
311*5113495bSYour Name  * @hal_ring_hdl: opaque pointer to the HAL Rx Error Ring, to be serviced
312*5113495bSYour Name  * @quota: No. of units (packets) that can be serviced in one shot.
313*5113495bSYour Name  * @rx_bufs_used: No. of descriptors reaped
314*5113495bSYour Name  *
315*5113495bSYour Name  * This function implements the core Rx functionality like reap and
316*5113495bSYour Name  * replenish the RX error ring Descriptors, and create a nbuf list
317*5113495bSYour Name  * out of it. It also reads wbm error information from descriptors
318*5113495bSYour Name  * and update the nbuf tlv area.
319*5113495bSYour Name  *
320*5113495bSYour Name  * Return: qdf_nbuf_t: head pointer to the nbuf list created
321*5113495bSYour Name  */
322*5113495bSYour Name qdf_nbuf_t
323*5113495bSYour Name dp_rx_wbm_err_reap_desc_li(struct dp_intr *int_ctx, struct dp_soc *soc,
324*5113495bSYour Name 			   hal_ring_handle_t hal_ring_hdl, uint32_t quota,
325*5113495bSYour Name 			   uint32_t *rx_bufs_used);
326*5113495bSYour Name 
327*5113495bSYour Name /**
328*5113495bSYour Name  * dp_rx_null_q_desc_handle_li() - Function to handle NULL Queue
329*5113495bSYour Name  *                                 descriptor violation on either a
330*5113495bSYour Name  *                                 REO or WBM ring
331*5113495bSYour Name  *
332*5113495bSYour Name  * @soc: core DP main context
333*5113495bSYour Name  * @nbuf: buffer pointer
334*5113495bSYour Name  * @rx_tlv_hdr: start of rx tlv header
335*5113495bSYour Name  * @pool_id: mac id
336*5113495bSYour Name  * @txrx_peer: txrx peer handle
337*5113495bSYour Name  * @is_reo_exception: flag to check if the error is from REO or WBM
338*5113495bSYour Name  * @link_id: link Id on which packet is received
339*5113495bSYour Name  *
340*5113495bSYour Name  * This function handles NULL queue descriptor violations arising out
341*5113495bSYour Name  * a missing REO queue for a given peer or a given TID. This typically
342*5113495bSYour Name  * may happen if a packet is received on a QOS enabled TID before the
343*5113495bSYour Name  * ADDBA negotiation for that TID, when the TID queue is setup. Or
344*5113495bSYour Name  * it may also happen for MC/BC frames if they are not routed to the
345*5113495bSYour Name  * non-QOS TID queue, in the absence of any other default TID queue.
346*5113495bSYour Name  * This error can show up both in a REO destination or WBM release ring.
347*5113495bSYour Name  *
348*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS, if nbuf handled successfully. QDF status code
349*5113495bSYour Name  *         if nbuf could not be handled or dropped.
350*5113495bSYour Name  */
351*5113495bSYour Name QDF_STATUS
352*5113495bSYour Name dp_rx_null_q_desc_handle_li(struct dp_soc *soc, qdf_nbuf_t nbuf,
353*5113495bSYour Name 			    uint8_t *rx_tlv_hdr, uint8_t pool_id,
354*5113495bSYour Name 			    struct dp_txrx_peer *txrx_peer,
355*5113495bSYour Name 			    bool is_reo_exception,
356*5113495bSYour Name 			    uint8_t link_id);
357*5113495bSYour Name #endif
358