xref: /wlan-driver/qca-wifi-host-cmn/dp/wifi3.0/dp_rx_buffer_pool.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022-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_RX_BUFFER_POOL_H_
21*5113495bSYour Name #define _DP_RX_BUFFER_POOL_H_
22*5113495bSYour Name 
23*5113495bSYour Name #include "dp_types.h"
24*5113495bSYour Name #include "qdf_nbuf.h"
25*5113495bSYour Name #include "qdf_module.h"
26*5113495bSYour Name #include "athdefs.h"
27*5113495bSYour Name #include "wlan_cfg.h"
28*5113495bSYour Name #include "dp_internal.h"
29*5113495bSYour Name #include "dp_rx.h"
30*5113495bSYour Name 
31*5113495bSYour Name #ifdef WLAN_FEATURE_RX_PREALLOC_BUFFER_POOL
32*5113495bSYour Name /**
33*5113495bSYour Name  * dp_rx_buffer_pool_init() - Initialize emergency buffer pool
34*5113495bSYour Name  * @soc: SoC handle
35*5113495bSYour Name  * @mac_id: MAC ID
36*5113495bSYour Name  *
37*5113495bSYour Name  * Return: None
38*5113495bSYour Name  */
39*5113495bSYour Name void dp_rx_buffer_pool_init(struct dp_soc *soc, u8 mac_id);
40*5113495bSYour Name 
41*5113495bSYour Name /**
42*5113495bSYour Name  * dp_rx_buffer_pool_deinit() - De-Initialize emergency buffer pool
43*5113495bSYour Name  * @soc: SoC handle
44*5113495bSYour Name  * @mac_id: MAC ID
45*5113495bSYour Name  *
46*5113495bSYour Name  * Return: None
47*5113495bSYour Name  */
48*5113495bSYour Name void dp_rx_buffer_pool_deinit(struct dp_soc *soc, u8 mac_id);
49*5113495bSYour Name 
50*5113495bSYour Name /**
51*5113495bSYour Name  * dp_rx_buffer_pool_refill() - Process the rx nbuf list and
52*5113495bSYour Name  * refill the emergency buffer pool
53*5113495bSYour Name  * @soc: SoC handle
54*5113495bSYour Name  * @nbuf: RX buffer
55*5113495bSYour Name  * @mac_id: MAC ID
56*5113495bSYour Name  *
57*5113495bSYour Name  * Return: Whether the rx nbuf is consumed into the pool or not.
58*5113495bSYour Name  */
59*5113495bSYour Name bool dp_rx_buffer_pool_refill(struct dp_soc *soc, qdf_nbuf_t nbuf, u8 mac_id);
60*5113495bSYour Name 
61*5113495bSYour Name /**
62*5113495bSYour Name  * dp_rx_buffer_pool_nbuf_free() - Free the nbuf or queue it
63*5113495bSYour Name  * back into the pool
64*5113495bSYour Name  * @soc: SoC handle
65*5113495bSYour Name  * @nbuf: RX buffer
66*5113495bSYour Name  * @mac_id: MAC ID
67*5113495bSYour Name  *
68*5113495bSYour Name  * Return: None
69*5113495bSYour Name  */
70*5113495bSYour Name void dp_rx_buffer_pool_nbuf_free(struct dp_soc *soc, qdf_nbuf_t nbuf,
71*5113495bSYour Name 				 u8 mac_id);
72*5113495bSYour Name 
73*5113495bSYour Name /**
74*5113495bSYour Name  * dp_rx_buffer_pool_nbuf_alloc() - Allocate nbuf for buffer replenish,
75*5113495bSYour Name  * give nbuf from the pool if allocation fails
76*5113495bSYour Name  * @soc: SoC handle
77*5113495bSYour Name  * @mac_id: MAC ID
78*5113495bSYour Name  * @rx_desc_pool: RX descriptor pool
79*5113495bSYour Name  * @num_available_buffers: number of available buffers in the ring.
80*5113495bSYour Name  *
81*5113495bSYour Name  * Return: nbuf
82*5113495bSYour Name  */
83*5113495bSYour Name qdf_nbuf_t dp_rx_buffer_pool_nbuf_alloc(struct dp_soc *soc, uint32_t mac_id,
84*5113495bSYour Name 					struct rx_desc_pool *rx_desc_pool,
85*5113495bSYour Name 					uint32_t num_available_buffers);
86*5113495bSYour Name 
87*5113495bSYour Name /**
88*5113495bSYour Name  * dp_rx_buffer_pool_nbuf_map() - Map nbuff for buffer replenish
89*5113495bSYour Name  * @soc: SoC handle
90*5113495bSYour Name  * @rx_desc_pool: RX descriptor pool
91*5113495bSYour Name  * @nbuf_frag_info_t: nbuf frag info
92*5113495bSYour Name  *
93*5113495bSYour Name  * Return: nbuf
94*5113495bSYour Name  */
95*5113495bSYour Name QDF_STATUS
96*5113495bSYour Name dp_rx_buffer_pool_nbuf_map(struct dp_soc *soc,
97*5113495bSYour Name 			   struct rx_desc_pool *rx_desc_pool,
98*5113495bSYour Name 			   struct dp_rx_nbuf_frag_info *nbuf_frag_info_t);
99*5113495bSYour Name 
100*5113495bSYour Name /**
101*5113495bSYour Name  * dp_rx_schedule_refill_thread() - Schedule RX refill thread to enqueue
102*5113495bSYour Name  * buffers in refill pool
103*5113495bSYour Name  * @soc: SoC handle
104*5113495bSYour Name  *
105*5113495bSYour Name  */
dp_rx_schedule_refill_thread(struct dp_soc * soc)106*5113495bSYour Name static inline void dp_rx_schedule_refill_thread(struct dp_soc *soc)
107*5113495bSYour Name {
108*5113495bSYour Name 	struct rx_refill_buff_pool *buff_pool = &soc->rx_refill_buff_pool;
109*5113495bSYour Name 	uint16_t head = buff_pool->head;
110*5113495bSYour Name 	uint16_t tail = buff_pool->tail;
111*5113495bSYour Name 	uint16_t num_refill;
112*5113495bSYour Name 
113*5113495bSYour Name 	if (!buff_pool->is_initialized)
114*5113495bSYour Name 		return;
115*5113495bSYour Name 
116*5113495bSYour Name 	if (tail > head)
117*5113495bSYour Name 		num_refill = (tail - head - 1);
118*5113495bSYour Name 	else
119*5113495bSYour Name 		num_refill = (buff_pool->max_bufq_len - head + tail - 1);
120*5113495bSYour Name 
121*5113495bSYour Name 	if (soc->cdp_soc.ol_ops->dp_rx_sched_refill_thread &&
122*5113495bSYour Name 	    num_refill >= DP_RX_REFILL_THRD_THRESHOLD)
123*5113495bSYour Name 		soc->cdp_soc.ol_ops->dp_rx_sched_refill_thread(
124*5113495bSYour Name 						dp_soc_to_cdp_soc_t(soc));
125*5113495bSYour Name }
126*5113495bSYour Name #else
127*5113495bSYour Name /**
128*5113495bSYour Name  * dp_rx_buffer_pool_init() - Initialize emergency buffer pool
129*5113495bSYour Name  * @soc: SoC handle
130*5113495bSYour Name  * @mac_id: MAC ID
131*5113495bSYour Name  *
132*5113495bSYour Name  * Return: None
133*5113495bSYour Name  */
134*5113495bSYour Name static inline
dp_rx_buffer_pool_init(struct dp_soc * soc,u8 mac_id)135*5113495bSYour Name void dp_rx_buffer_pool_init(struct dp_soc *soc, u8 mac_id)
136*5113495bSYour Name {
137*5113495bSYour Name 	soc->rx_buff_pool[mac_id].is_initialized = false;
138*5113495bSYour Name }
139*5113495bSYour Name 
140*5113495bSYour Name /**
141*5113495bSYour Name  * dp_rx_buffer_pool_deinit() - De-Initialize emergency buffer pool
142*5113495bSYour Name  * @soc: SoC handle
143*5113495bSYour Name  * @mac_id: MAC ID
144*5113495bSYour Name  *
145*5113495bSYour Name  * Return: None
146*5113495bSYour Name  */
147*5113495bSYour Name static inline
dp_rx_buffer_pool_deinit(struct dp_soc * soc,u8 mac_id)148*5113495bSYour Name void dp_rx_buffer_pool_deinit(struct dp_soc *soc, u8 mac_id)
149*5113495bSYour Name {
150*5113495bSYour Name }
151*5113495bSYour Name 
152*5113495bSYour Name /**
153*5113495bSYour Name  * dp_rx_buffer_pool_refill() - Process the rx nbuf list and
154*5113495bSYour Name  * refill the emergency buffer pool
155*5113495bSYour Name  * @soc: SoC handle
156*5113495bSYour Name  * @nbuf: RX buffer
157*5113495bSYour Name  * @mac_id: MAC ID
158*5113495bSYour Name  *
159*5113495bSYour Name  * Return: Whether the rx nbuf is consumed into the pool or not.
160*5113495bSYour Name  */
161*5113495bSYour Name static inline
dp_rx_buffer_pool_refill(struct dp_soc * soc,qdf_nbuf_t nbuf,u8 mac_id)162*5113495bSYour Name bool dp_rx_buffer_pool_refill(struct dp_soc *soc, qdf_nbuf_t nbuf, u8 mac_id)
163*5113495bSYour Name {
164*5113495bSYour Name 	return false;
165*5113495bSYour Name }
166*5113495bSYour Name 
167*5113495bSYour Name /**
168*5113495bSYour Name  * dp_rx_buffer_pool_nbuf_free() - Free the nbuf or queue it
169*5113495bSYour Name  * back into the pool
170*5113495bSYour Name  * @soc: SoC handle
171*5113495bSYour Name  * @nbuf: RX buffer
172*5113495bSYour Name  * @mac_id: MAC ID
173*5113495bSYour Name  *
174*5113495bSYour Name  * Return: None
175*5113495bSYour Name  */
176*5113495bSYour Name static inline
dp_rx_buffer_pool_nbuf_free(struct dp_soc * soc,qdf_nbuf_t nbuf,u8 mac_id)177*5113495bSYour Name void dp_rx_buffer_pool_nbuf_free(struct dp_soc *soc, qdf_nbuf_t nbuf,
178*5113495bSYour Name 				 u8 mac_id)
179*5113495bSYour Name {
180*5113495bSYour Name 	qdf_nbuf_free(nbuf);
181*5113495bSYour Name }
182*5113495bSYour Name 
183*5113495bSYour Name /**
184*5113495bSYour Name  * dp_rx_buffer_pool_nbuf_alloc() - Allocate nbuf for buffer replenish,
185*5113495bSYour Name  * give nbuf from the pool if allocation fails
186*5113495bSYour Name  * @soc: SoC handle
187*5113495bSYour Name  * @mac_id: MAC ID
188*5113495bSYour Name  * @rx_desc_pool: RX descriptor pool
189*5113495bSYour Name  * @num_available_buffers: number of available buffers in the ring.
190*5113495bSYour Name  *
191*5113495bSYour Name  * Return: nbuf
192*5113495bSYour Name  */
193*5113495bSYour Name static inline qdf_nbuf_t
dp_rx_buffer_pool_nbuf_alloc(struct dp_soc * soc,uint32_t mac_id,struct rx_desc_pool * rx_desc_pool,uint32_t num_available_buffers)194*5113495bSYour Name dp_rx_buffer_pool_nbuf_alloc(struct dp_soc *soc, uint32_t mac_id,
195*5113495bSYour Name 			     struct rx_desc_pool *rx_desc_pool,
196*5113495bSYour Name 			     uint32_t num_available_buffers)
197*5113495bSYour Name {
198*5113495bSYour Name 	return qdf_nbuf_alloc(soc->osdev, rx_desc_pool->buf_size,
199*5113495bSYour Name 			      RX_BUFFER_RESERVATION,
200*5113495bSYour Name 			      rx_desc_pool->buf_alignment, FALSE);
201*5113495bSYour Name }
202*5113495bSYour Name 
203*5113495bSYour Name /**
204*5113495bSYour Name  * dp_rx_buffer_pool_nbuf_map() - Map nbuff for buffer replenish
205*5113495bSYour Name  * @soc: SoC handle
206*5113495bSYour Name  * @rx_desc_pool: RX descriptor pool
207*5113495bSYour Name  * @nbuf_frag_info_t: nbuf frag info
208*5113495bSYour Name  *
209*5113495bSYour Name  * Return: nbuf
210*5113495bSYour Name  */
211*5113495bSYour Name static inline QDF_STATUS
dp_rx_buffer_pool_nbuf_map(struct dp_soc * soc,struct rx_desc_pool * rx_desc_pool,struct dp_rx_nbuf_frag_info * nbuf_frag_info_t)212*5113495bSYour Name dp_rx_buffer_pool_nbuf_map(struct dp_soc *soc,
213*5113495bSYour Name 			   struct rx_desc_pool *rx_desc_pool,
214*5113495bSYour Name 			   struct dp_rx_nbuf_frag_info *nbuf_frag_info_t)
215*5113495bSYour Name {
216*5113495bSYour Name 	QDF_STATUS status;
217*5113495bSYour Name 
218*5113495bSYour Name 	status = qdf_nbuf_map_nbytes_single(soc->osdev,
219*5113495bSYour Name 					    (nbuf_frag_info_t->virt_addr).nbuf,
220*5113495bSYour Name 					    QDF_DMA_FROM_DEVICE,
221*5113495bSYour Name 					    rx_desc_pool->buf_size);
222*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
223*5113495bSYour Name 		return status;
224*5113495bSYour Name 
225*5113495bSYour Name 	dp_audio_smmu_map(soc->osdev,
226*5113495bSYour Name 			  qdf_mem_paddr_from_dmaaddr(soc->osdev,
227*5113495bSYour Name 						     QDF_NBUF_CB_PADDR((nbuf_frag_info_t->virt_addr).nbuf)),
228*5113495bSYour Name 			  QDF_NBUF_CB_PADDR((nbuf_frag_info_t->virt_addr).nbuf),
229*5113495bSYour Name 			  rx_desc_pool->buf_size);
230*5113495bSYour Name 
231*5113495bSYour Name 	return status;
232*5113495bSYour Name }
233*5113495bSYour Name 
dp_rx_schedule_refill_thread(struct dp_soc * soc)234*5113495bSYour Name static inline void dp_rx_schedule_refill_thread(struct dp_soc *soc) { }
235*5113495bSYour Name 
236*5113495bSYour Name #endif /* WLAN_FEATURE_RX_PREALLOC_BUFFER_POOL */
237*5113495bSYour Name #endif /* _DP_RX_BUFFER_POOL_H_ */
238