1 /*
2  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: wbuff.h
22  * wbuff buffer management APIs
23  */
24 
25 #ifndef _WBUFF_H
26 #define _WBUFF_H
27 
28 #include <qdf_status.h>
29 #include <qdf_nbuf.h>
30 
31 /* Number of pools supported per module */
32 #define WBUFF_MAX_POOLS 16
33 #define WBUFF_MAX_POOL_ID WBUFF_MAX_POOLS
34 
35 enum wbuff_module_id {
36 	WBUFF_MODULE_WMI_TX,
37 	WBUFF_MODULE_CE_RX,
38 	WBUFF_MAX_MODULES,
39 };
40 
41 /**
42  * struct wbuff_alloc_request - allocation structure for registering each
43  * pool for wbuff module.
44  * @pool_id: pool identifier
45  * @pool_size: number of buffers for @pool_id
46  * @buffer_size: size of each buffer in this @pool_id
47  */
48 struct wbuff_alloc_request {
49 	uint8_t pool_id;
50 	uint16_t pool_size;
51 	uint16_t buffer_size;
52 };
53 
54 /* Opaque handle for wbuff */
55 struct wbuff_mod_handle;
56 
57 #ifdef WLAN_FEATURE_WBUFF
58 /**
59  * wbuff_module_init() - Initializes the wbuff module
60  *
61  * Return: QDF_STATUS_SUCCESS - init success
62  *         QDF_STATUS_E_NOSUPPORT - init failure
63  */
64 QDF_STATUS wbuff_module_init(void);
65 
66 /**
67  * wbuff_module_deinit() - De-initializes the wbuff module
68  *
69  * Return: QDF_STATUS_SUCCESS - de-init success
70  *         QDF_STATUS_E_INVAL - de-init failure (wbuff not initialized)
71  */
72 QDF_STATUS wbuff_module_deinit(void);
73 
74 /**
75  * wbuff_module_register() - Registers a module with wbuff
76  * @req: allocation request from registered module
77  * @num_pools: number of pools required
78  * @reserve: nbuf headroom to start with
79  * @align: alignment for the nbuf
80  * @module_id: module identifier
81  *
82  * Return: Handle if registration success
83  *         NULL if registration failure
84  */
85 struct wbuff_mod_handle *
86 wbuff_module_register(struct wbuff_alloc_request *req, uint8_t num_pools,
87 		      int reserve, int align, enum wbuff_module_id module_id);
88 
89 /**
90  * wbuff_module_deregister() - De-registers a module with wbuff
91  * @hdl: wbuff_handle corresponding to the module
92  *
93  * Return: QDF_STATUS_SUCCESS - deregistration success
94  *         QDF_STATUS_E_INVAL - deregistration failure
95  */
96 QDF_STATUS wbuff_module_deregister(struct wbuff_mod_handle *hdl);
97 
98 /**
99  * wbuff_buff_get() - return buffer to the requester
100  * @hdl: wbuff_handle corresponding to the module
101  * @pool_id: pool identifier
102  * @len: length of buffer requested
103  * @func_name: function from which buffer is requested
104  * @line_num: line number in the file
105  *
106  * Return: Network buffer if success
107  *         NULL if failure
108  */
109 qdf_nbuf_t
110 wbuff_buff_get(struct wbuff_mod_handle *hdl, uint8_t pool_id, uint32_t len,
111 	       const char *func_name, uint32_t line_num);
112 
113 /**
114  * wbuff_buff_put() - put the buffer back to wbuff pool
115  * @buf: pointer to network buffer
116  *
117  * Return: NULL if success (buffer consumed)
118  *         @buf if failure (buffer not consumed)
119  */
120 qdf_nbuf_t wbuff_buff_put(qdf_nbuf_t buf);
121 
122 #else
123 
wbuff_module_init(void)124 static inline QDF_STATUS wbuff_module_init(void)
125 {
126 	return QDF_STATUS_E_NOSUPPORT;
127 }
128 
wbuff_module_deinit(void)129 static inline QDF_STATUS wbuff_module_deinit(void)
130 {
131 	return QDF_STATUS_E_NOSUPPORT;
132 }
133 
134 static inline struct wbuff_mod_handle *
wbuff_module_register(struct wbuff_alloc_request * req,uint8_t num_pools,int reserve,int align,enum wbuff_module_id module_id)135 wbuff_module_register(struct wbuff_alloc_request *req, uint8_t num_pools,
136 		      int reserve, int align, enum wbuff_module_id module_id)
137 {
138 	return NULL;
139 }
140 
wbuff_module_deregister(struct wbuff_mod_handle * hdl)141 static inline QDF_STATUS wbuff_module_deregister(struct wbuff_mod_handle *hdl)
142 {
143 	return QDF_STATUS_E_NOSUPPORT;
144 }
145 
146 static inline qdf_nbuf_t
wbuff_buff_get(struct wbuff_mod_handle * hdl,uint8_t pool_id,uint32_t len,const char * func_name,uint32_t line_num)147 wbuff_buff_get(struct wbuff_mod_handle *hdl, uint8_t pool_id, uint32_t len,
148 	       const char *func_name, uint32_t line_num)
149 {
150 	return NULL;
151 }
152 
153 static inline qdf_nbuf_t
wbuff_buff_put(qdf_nbuf_t buf)154 wbuff_buff_put(qdf_nbuf_t buf)
155 {
156 	return buf;
157 }
158 
159 #endif
160 #endif /* _WBUFF_H */
161