xref: /wlan-driver/qca-wifi-host-cmn/qdf/inc/qdf_nbuf_frag.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2020 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 /**
21*5113495bSYour Name  * DOC: qdf_nbuf_frag.h
22*5113495bSYour Name  * This file defines the nbuf frag abstraction.
23*5113495bSYour Name  */
24*5113495bSYour Name 
25*5113495bSYour Name #ifndef _QDF_NBUF_FRAG_H
26*5113495bSYour Name #define _QDF_NBUF_FRAG_H
27*5113495bSYour Name 
28*5113495bSYour Name #include <qdf_util.h>
29*5113495bSYour Name #include <i_qdf_trace.h>
30*5113495bSYour Name #include <i_qdf_nbuf_frag.h>
31*5113495bSYour Name 
32*5113495bSYour Name /*
33*5113495bSYour Name  * typedef qdf_frag_cache_t - Platform independent
34*5113495bSYour Name  * frag cache abstraction
35*5113495bSYour Name  */
36*5113495bSYour Name typedef __qdf_frag_cache_t qdf_frag_cache_t;
37*5113495bSYour Name 
38*5113495bSYour Name /*
39*5113495bSYour Name  * typedef qdf_frag_t - Platform independent frag address abstraction
40*5113495bSYour Name  */
41*5113495bSYour Name typedef __qdf_frag_t qdf_frag_t;
42*5113495bSYour Name 
43*5113495bSYour Name /*
44*5113495bSYour Name  * Maximum number of frags an SKB can hold
45*5113495bSYour Name  */
46*5113495bSYour Name #define QDF_NBUF_MAX_FRAGS __QDF_NBUF_MAX_FRAGS
47*5113495bSYour Name 
48*5113495bSYour Name #ifdef NBUF_FRAG_MEMORY_DEBUG
49*5113495bSYour Name /**
50*5113495bSYour Name  * qdf_frag_debug_init() - Initialize frag debug tracker
51*5113495bSYour Name  *
52*5113495bSYour Name  * Return: none
53*5113495bSYour Name  */
54*5113495bSYour Name void qdf_frag_debug_init(void);
55*5113495bSYour Name 
56*5113495bSYour Name /**
57*5113495bSYour Name  * qdf_frag_debug_exit() - Exit network frag debug functionality
58*5113495bSYour Name  *
59*5113495bSYour Name  * Exit network frag tracking debug functionality and log frag memory leaks
60*5113495bSYour Name  *
61*5113495bSYour Name  * Return: none
62*5113495bSYour Name  */
63*5113495bSYour Name void qdf_frag_debug_exit(void);
64*5113495bSYour Name 
65*5113495bSYour Name /**
66*5113495bSYour Name  * qdf_frag_debug_add_node() - Add frag node in the debug hash table
67*5113495bSYour Name  * @fragp: Pointer to frag
68*5113495bSYour Name  * @func_name: Caller function name
69*5113495bSYour Name  * @line_num: Caller function line no.
70*5113495bSYour Name  *
71*5113495bSYour Name  * Return: none
72*5113495bSYour Name  */
73*5113495bSYour Name void qdf_frag_debug_add_node(qdf_frag_t fragp, const char *func_name,
74*5113495bSYour Name 			     uint32_t line_num);
75*5113495bSYour Name 
76*5113495bSYour Name /**
77*5113495bSYour Name  * qdf_frag_debug_refcount_inc() - Increment refcount for frag node
78*5113495bSYour Name  * @fragp: Pointer to frag
79*5113495bSYour Name  * @func_name: Caller function name
80*5113495bSYour Name  * @line_num: Caller function line no.
81*5113495bSYour Name  *
82*5113495bSYour Name  * Return: none
83*5113495bSYour Name  */
84*5113495bSYour Name void qdf_frag_debug_refcount_inc(qdf_frag_t fragp, const char *func_name,
85*5113495bSYour Name 				 uint32_t line_num);
86*5113495bSYour Name 
87*5113495bSYour Name /**
88*5113495bSYour Name  * qdf_frag_debug_refcount_dec() - Decrement refcount for frag node
89*5113495bSYour Name  * @fragp: Pointer to frag
90*5113495bSYour Name  * @func_name: Caller function name
91*5113495bSYour Name  * @line_num: Caller function line no.
92*5113495bSYour Name  *
93*5113495bSYour Name  * Return: none
94*5113495bSYour Name  */
95*5113495bSYour Name void qdf_frag_debug_refcount_dec(qdf_frag_t fragp, const char *func_name,
96*5113495bSYour Name 				 uint32_t line_num);
97*5113495bSYour Name 
98*5113495bSYour Name /**
99*5113495bSYour Name  * qdf_frag_debug_delete_node() - Remove frag node from debug hash table
100*5113495bSYour Name  * @fragp: Pointer to frag
101*5113495bSYour Name  * @func_name: Caller function name
102*5113495bSYour Name  * @line_num: Caller function line no.
103*5113495bSYour Name  *
104*5113495bSYour Name  * Return: none
105*5113495bSYour Name  */
106*5113495bSYour Name void qdf_frag_debug_delete_node(qdf_frag_t fragp, const char *func_name,
107*5113495bSYour Name 				uint32_t line_num);
108*5113495bSYour Name 
109*5113495bSYour Name /**
110*5113495bSYour Name  * qdf_frag_debug_update_addr() - Update frag address in debug tracker
111*5113495bSYour Name  * @p_fragp: Previous frag address
112*5113495bSYour Name  * @n_fragp: New frag address
113*5113495bSYour Name  * @func_name: Caller function name
114*5113495bSYour Name  * @line_num: Caller function line no.
115*5113495bSYour Name  *
116*5113495bSYour Name  * Return: none
117*5113495bSYour Name  */
118*5113495bSYour Name void qdf_frag_debug_update_addr(qdf_frag_t p_fragp, qdf_frag_t n_fragp,
119*5113495bSYour Name 				const char *func_name, uint32_t line_num);
120*5113495bSYour Name 
121*5113495bSYour Name #define qdf_frag_alloc(p, s) \
122*5113495bSYour Name 	qdf_frag_alloc_debug(p, s, __func__, __LINE__)
123*5113495bSYour Name 
124*5113495bSYour Name /**
125*5113495bSYour Name  * qdf_frag_alloc_debug() - Allocate frag memory
126*5113495bSYour Name  * @pf_cache: page frag cache
127*5113495bSYour Name  * @fragsz: Size of frag memory to be allocated
128*5113495bSYour Name  * @func_name: Caller function name
129*5113495bSYour Name  * @line_num: Caller function line no.
130*5113495bSYour Name  *
131*5113495bSYour Name  * Return: Allocated frag address
132*5113495bSYour Name  */
133*5113495bSYour Name qdf_frag_t qdf_frag_alloc_debug(qdf_frag_cache_t *pf_cache,
134*5113495bSYour Name 				unsigned int fragsz,
135*5113495bSYour Name 				const char *func_name,
136*5113495bSYour Name 				uint32_t line_num);
137*5113495bSYour Name 
138*5113495bSYour Name #define qdf_frag_free(p) \
139*5113495bSYour Name 	qdf_frag_free_debug(p, __func__, __LINE__)
140*5113495bSYour Name 
141*5113495bSYour Name /**
142*5113495bSYour Name  * qdf_frag_free_debug() - Free allocated frag memory
143*5113495bSYour Name  * @vaddr: Frag address to be freed
144*5113495bSYour Name  * @func_name: Caller function name
145*5113495bSYour Name  * @line_num: Caller function line no.
146*5113495bSYour Name  *
147*5113495bSYour Name  * Return: none
148*5113495bSYour Name  */
149*5113495bSYour Name void qdf_frag_free_debug(qdf_frag_t vaddr, const char *func_name,
150*5113495bSYour Name 			 uint32_t line_num);
151*5113495bSYour Name 
152*5113495bSYour Name #else /* NBUF_FRAG_MEMORY_DEBUG */
153*5113495bSYour Name 
qdf_frag_debug_init(void)154*5113495bSYour Name static inline void qdf_frag_debug_init(void)
155*5113495bSYour Name {
156*5113495bSYour Name }
157*5113495bSYour Name 
qdf_frag_debug_exit(void)158*5113495bSYour Name static inline void qdf_frag_debug_exit(void)
159*5113495bSYour Name {
160*5113495bSYour Name }
161*5113495bSYour Name 
qdf_frag_debug_add_node(qdf_frag_t fragp,const char * func_name,uint32_t line_num)162*5113495bSYour Name static inline void qdf_frag_debug_add_node(qdf_frag_t fragp,
163*5113495bSYour Name 					   const char *func_name,
164*5113495bSYour Name 					   uint32_t line_num)
165*5113495bSYour Name {
166*5113495bSYour Name }
167*5113495bSYour Name 
qdf_frag_debug_refcount_inc(qdf_frag_t fragp,const char * func_name,uint32_t line_num)168*5113495bSYour Name static inline void qdf_frag_debug_refcount_inc(qdf_frag_t fragp,
169*5113495bSYour Name 					       const char *func_name,
170*5113495bSYour Name 					       uint32_t line_num)
171*5113495bSYour Name {
172*5113495bSYour Name }
173*5113495bSYour Name 
qdf_frag_debug_refcount_dec(qdf_frag_t fragp,const char * func_name,uint32_t line_num)174*5113495bSYour Name static inline void qdf_frag_debug_refcount_dec(qdf_frag_t fragp,
175*5113495bSYour Name 					       const char *func_name,
176*5113495bSYour Name 					       uint32_t line_num)
177*5113495bSYour Name {
178*5113495bSYour Name }
179*5113495bSYour Name 
qdf_frag_debug_delete_node(qdf_frag_t fragp,const char * func_name,uint32_t line_num)180*5113495bSYour Name static inline void qdf_frag_debug_delete_node(qdf_frag_t fragp,
181*5113495bSYour Name 					      const char *func_name,
182*5113495bSYour Name 					      uint32_t line_num)
183*5113495bSYour Name {
184*5113495bSYour Name }
185*5113495bSYour Name 
qdf_frag_debug_update_addr(qdf_frag_t p_fragp,qdf_frag_t n_fragp,const char * func_name,uint32_t line_num)186*5113495bSYour Name static inline void qdf_frag_debug_update_addr(qdf_frag_t p_fragp,
187*5113495bSYour Name 					      qdf_frag_t n_fragp,
188*5113495bSYour Name 					      const char *func_name,
189*5113495bSYour Name 					      uint32_t line_num)
190*5113495bSYour Name {
191*5113495bSYour Name }
192*5113495bSYour Name 
193*5113495bSYour Name /**
194*5113495bSYour Name  * qdf_frag_alloc() - Allocate frag memory
195*5113495bSYour Name  * @pf_cache: page frag cache
196*5113495bSYour Name  * @fragsz: Size of frag memory to be allocated
197*5113495bSYour Name  *
198*5113495bSYour Name  * Return: Allocated frag address
199*5113495bSYour Name  */
qdf_frag_alloc(qdf_frag_cache_t * pf_cache,unsigned int fragsz)200*5113495bSYour Name static inline qdf_frag_t qdf_frag_alloc(qdf_frag_cache_t *pf_cache,
201*5113495bSYour Name 					unsigned int fragsz)
202*5113495bSYour Name {
203*5113495bSYour Name 	return __qdf_frag_alloc(pf_cache, fragsz);
204*5113495bSYour Name }
205*5113495bSYour Name 
206*5113495bSYour Name /**
207*5113495bSYour Name  * qdf_frag_free() - Free allocated frag memory
208*5113495bSYour Name  * @vaddr: Frag address to be freed
209*5113495bSYour Name  *
210*5113495bSYour Name  * Return: none
211*5113495bSYour Name  */
qdf_frag_free(qdf_frag_t vaddr)212*5113495bSYour Name static inline void qdf_frag_free(qdf_frag_t vaddr)
213*5113495bSYour Name {
214*5113495bSYour Name 	__qdf_frag_free(vaddr);
215*5113495bSYour Name }
216*5113495bSYour Name 
217*5113495bSYour Name #endif /* NBUF_FRAG_MEMORY_DEBUG */
218*5113495bSYour Name 
219*5113495bSYour Name /**
220*5113495bSYour Name  * qdf_frag_count_get() - Get global frag gauge
221*5113495bSYour Name  *
222*5113495bSYour Name  * Return: Global frag gauge
223*5113495bSYour Name  */
qdf_frag_count_get(void)224*5113495bSYour Name static inline uint32_t qdf_frag_count_get(void)
225*5113495bSYour Name {
226*5113495bSYour Name 	return __qdf_frag_count_get();
227*5113495bSYour Name }
228*5113495bSYour Name 
229*5113495bSYour Name /**
230*5113495bSYour Name  * qdf_frag_count_inc() - Increment global frag count
231*5113495bSYour Name  * @value: Increment value
232*5113495bSYour Name  *
233*5113495bSYour Name  * Return: none
234*5113495bSYour Name  */
qdf_frag_count_inc(uint32_t value)235*5113495bSYour Name static inline void qdf_frag_count_inc(uint32_t value)
236*5113495bSYour Name {
237*5113495bSYour Name 	return __qdf_frag_count_inc(value);
238*5113495bSYour Name }
239*5113495bSYour Name 
240*5113495bSYour Name /**
241*5113495bSYour Name  * qdf_frag_count_dec() - Decrement global frag count
242*5113495bSYour Name  * @value: Decrement value
243*5113495bSYour Name  *
244*5113495bSYour Name  * Return: none
245*5113495bSYour Name  */
qdf_frag_count_dec(uint32_t value)246*5113495bSYour Name static inline void qdf_frag_count_dec(uint32_t value)
247*5113495bSYour Name {
248*5113495bSYour Name 	return __qdf_frag_count_dec(value);
249*5113495bSYour Name }
250*5113495bSYour Name 
251*5113495bSYour Name /**
252*5113495bSYour Name  * qdf_frag_mod_init() - Initialization routine for qdf_frag
253*5113495bSYour Name  *
254*5113495bSYour Name  * Return: none
255*5113495bSYour Name  */
qdf_frag_mod_init(void)256*5113495bSYour Name static inline void qdf_frag_mod_init(void)
257*5113495bSYour Name {
258*5113495bSYour Name 	return __qdf_frag_mod_init();
259*5113495bSYour Name }
260*5113495bSYour Name 
261*5113495bSYour Name /**
262*5113495bSYour Name  * qdf_frag_mod_exit() - Unintialization routine for qdf_frag
263*5113495bSYour Name  *
264*5113495bSYour Name  * Return: none
265*5113495bSYour Name  */
qdf_frag_mod_exit(void)266*5113495bSYour Name static inline void qdf_frag_mod_exit(void)
267*5113495bSYour Name {
268*5113495bSYour Name 	return __qdf_frag_mod_exit();
269*5113495bSYour Name }
270*5113495bSYour Name 
271*5113495bSYour Name /**
272*5113495bSYour Name  * qdf_mem_map_page() - Map Page
273*5113495bSYour Name  * @osdev: qdf_device_t
274*5113495bSYour Name  * @buf: Virtual page address to be mapped
275*5113495bSYour Name  * @dir: qdf_dma_dir_t
276*5113495bSYour Name  * @nbytes: Size of memory to be mapped
277*5113495bSYour Name  * @phy_addr: Corresponding mapped physical address
278*5113495bSYour Name  *
279*5113495bSYour Name  * Return: QDF_STATUS
280*5113495bSYour Name  */
qdf_mem_map_page(qdf_device_t osdev,qdf_frag_t buf,qdf_dma_dir_t dir,size_t nbytes,qdf_dma_addr_t * phy_addr)281*5113495bSYour Name static inline QDF_STATUS qdf_mem_map_page(qdf_device_t osdev, qdf_frag_t buf,
282*5113495bSYour Name 					  qdf_dma_dir_t dir, size_t nbytes,
283*5113495bSYour Name 					  qdf_dma_addr_t *phy_addr)
284*5113495bSYour Name {
285*5113495bSYour Name 	return __qdf_mem_map_page(osdev, buf, dir, nbytes, phy_addr);
286*5113495bSYour Name }
287*5113495bSYour Name 
288*5113495bSYour Name /**
289*5113495bSYour Name  * qdf_mem_unmap_page() - Unmap Page
290*5113495bSYour Name  * @osdev: qdf_device_t
291*5113495bSYour Name  * @paddr: Physical memory to be unmapped
292*5113495bSYour Name  * @nbytes: Size of memory to be unmapped
293*5113495bSYour Name  * @dir: qdf_dma_dir_t
294*5113495bSYour Name  */
qdf_mem_unmap_page(qdf_device_t osdev,qdf_dma_addr_t paddr,size_t nbytes,qdf_dma_dir_t dir)295*5113495bSYour Name static inline void qdf_mem_unmap_page(qdf_device_t osdev, qdf_dma_addr_t paddr,
296*5113495bSYour Name 				      size_t nbytes, qdf_dma_dir_t dir)
297*5113495bSYour Name {
298*5113495bSYour Name 	__qdf_mem_unmap_page(osdev, paddr, nbytes, dir);
299*5113495bSYour Name }
300*5113495bSYour Name 
301*5113495bSYour Name /*
302*5113495bSYour Name  * qdf_frag_cache_drain() - Drain page frag cache
303*5113495bSYour Name  *
304*5113495bSYour Name  * @pf_cache: page frag cache
305*5113495bSYour Name  *
306*5113495bSYour Name  * Return: void
307*5113495bSYour Name  */
qdf_frag_cache_drain(qdf_frag_cache_t * pf_cache)308*5113495bSYour Name static inline void qdf_frag_cache_drain(qdf_frag_cache_t *pf_cache)
309*5113495bSYour Name {
310*5113495bSYour Name 	__qdf_frag_cache_drain(pf_cache);
311*5113495bSYour Name }
312*5113495bSYour Name #endif /* _QDF_NBUF_FRAG_H */
313