1 /*
2 * Copyright (c) 2018, 2020 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2022-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: qdf_streamfs.h
22 * This file provides OS abstraction for stream filesystem APIs.
23 */
24
25 #ifndef _QDF_STREAMFS_H
26 #define _QDF_STREAMFS_H
27
28 #include <i_qdf_streamfs.h>
29 #include <qdf_types.h>
30 #include <qdf_debugfs.h>
31
32 typedef __qdf_streamfs_chan_t qdf_streamfs_chan_t;
33 typedef __qdf_streamfs_chan_buf_t qdf_streamfs_chan_buf_t;
34
35 #ifdef WLAN_STREAMFS
36 /**
37 * qdf_streamfs_create_dir() - wrapper to create a debugfs directory
38 * @name: name of the new directory
39 * @parent: parent node. If NULL, defaults to base qdf_debugfs_root
40 *
41 * Return: dentry structure pointer in case of success, otherwise NULL.
42 *
43 */
qdf_streamfs_create_dir(const char * name,qdf_dentry_t parent)44 static inline qdf_dentry_t qdf_streamfs_create_dir(
45 const char *name, qdf_dentry_t parent)
46 {
47 return qdf_debugfs_create_dir(name, parent);
48 }
49
50 /**
51 * qdf_streamfs_remove_file() - wrapper to remove streamfs file
52 * @d: streamfs node
53 *
54 */
qdf_streamfs_remove_file(qdf_dentry_t d)55 static inline void qdf_streamfs_remove_file(qdf_dentry_t d)
56 {
57 qdf_debugfs_remove_file(d);
58 }
59
60 /**
61 * qdf_streamfs_remove_dir_recursive() - wrapper to remove directory recursively
62 * @d: debugfs node
63 *
64 * This function will recursively remove a directory in streamfs that was
65 * previously created with a call to qdf_debugfs_create_file() or it's
66 * variant functions.
67 */
qdf_streamfs_remove_dir_recursive(qdf_dentry_t d)68 static inline void qdf_streamfs_remove_dir_recursive(qdf_dentry_t d)
69 {
70 qdf_debugfs_remove_dir_recursive(d);
71 }
72
73 /**
74 * qdf_streamfs_create_file() - Create streamfs chan buffer file
75 * @name: base name of file to create
76 * @mode: filemode
77 * @parent: dentry of parent directory, NULL for root directory
78 * @buf: pointer to chan buffer
79 *
80 * Returns file dentry pointer if successful, NULL otherwise.
81 */
82 qdf_dentry_t qdf_streamfs_create_file(const char *name, uint16_t mode,
83 qdf_dentry_t parent,
84 qdf_streamfs_chan_buf_t buf);
85
86 /**
87 * qdf_streamfs_open() - Create streamfs channel for data transfer
88 * @base_filename: base name of files to create, %NULL for buffering only
89 * @parent: dentry of parent directory, %NULL for root directory
90 * @subbuf_size: size of sub-buffers
91 * @n_subbufs: number of sub-buffers
92 * @private_data: user-defined data
93 *
94 * Returns channel pointer if successful, %NULL otherwise.
95 */
96 qdf_streamfs_chan_t qdf_streamfs_open(const char *base_filename,
97 qdf_dentry_t parent,
98 size_t subbuf_size, size_t n_subbufs,
99 void *private_data);
100
101 /**
102 * qdf_streamfs_close() - Closes all channel buffers and frees the channel.
103 * @chan: pointer to qdf_streamfs_chan.
104 *
105 * Returns NONE
106 */
107 void qdf_streamfs_close(qdf_streamfs_chan_t chan);
108
109 /**
110 * qdf_streamfs_flush() - Flushes all channel buffers.
111 * @chan: pointer to qdf_streamfs_chan.
112 *
113 * Returns NONE
114 */
115 void qdf_streamfs_flush(qdf_streamfs_chan_t chan);
116
117 /**
118 * qdf_streamfs_reset() - Reset streamfs channel
119 * @chan: pointer to qdf_streamfs_chan.
120 *
121 * This erases data from all channel buffers and restarting the channel
122 * in its initial state. The buffers are not freed, so any mappings are
123 * still in effect.
124 *
125 * Returns NONE
126 */
127 void qdf_streamfs_reset(qdf_streamfs_chan_t chan);
128
129 /**
130 * qdf_streamfs_subbufs_consumed() - update the buffer's sub-buffers-consumed
131 * count
132 * @chan: pointer to qdf_streamfs_chan.
133 * @cpu: the cpu associated with the channel buffer to update
134 * @consumed: number of sub-buffers to add to current buf's count
135 *
136 * Returns NONE
137 */
138 void qdf_streamfs_subbufs_consumed(qdf_streamfs_chan_t chan,
139 unsigned int cpu,
140 size_t consumed);
141
142 /**
143 * qdf_streamfs_write() - write data into the channel
144 * @chan: relay channel
145 * @data: data to be written
146 * @length: number of bytes to write
147 *
148 * Writes data into the current cpu's channel buffer.
149 */
150 void qdf_streamfs_write(qdf_streamfs_chan_t chan, const void *data,
151 size_t length);
152 #else
qdf_streamfs_create_dir(const char * name,qdf_dentry_t parent)153 static inline qdf_dentry_t qdf_streamfs_create_dir(
154 const char *name, qdf_dentry_t parent)
155 {
156 return NULL;
157 }
158
qdf_streamfs_remove_file(qdf_dentry_t d)159 static inline void qdf_streamfs_remove_file(qdf_dentry_t d)
160 {
161 }
162
qdf_streamfs_remove_dir_recursive(qdf_dentry_t d)163 static inline void qdf_streamfs_remove_dir_recursive(qdf_dentry_t d)
164 {
165 }
166
167 static inline
qdf_streamfs_create_file(const char * name,uint16_t mode,qdf_dentry_t parent,qdf_streamfs_chan_buf_t buf)168 qdf_dentry_t qdf_streamfs_create_file(const char *name, uint16_t mode,
169 qdf_dentry_t parent,
170 qdf_streamfs_chan_buf_t buf)
171 {
172 return NULL;
173 }
174
175 static inline
qdf_streamfs_open(const char * base_filename,qdf_dentry_t parent,size_t subbuf_size,size_t n_subbufs,void * private_data)176 qdf_streamfs_chan_t qdf_streamfs_open(const char *base_filename,
177 qdf_dentry_t parent,
178 size_t subbuf_size, size_t n_subbufs,
179 void *private_data)
180 {
181 return NULL;
182 }
183
qdf_streamfs_close(qdf_streamfs_chan_t chan)184 static inline void qdf_streamfs_close(qdf_streamfs_chan_t chan)
185 {
186 }
187
qdf_streamfs_flush(qdf_streamfs_chan_t chan)188 static inline void qdf_streamfs_flush(qdf_streamfs_chan_t chan)
189 {
190 }
191
qdf_streamfs_reset(qdf_streamfs_chan_t chan)192 static inline void qdf_streamfs_reset(qdf_streamfs_chan_t chan)
193 {
194 }
195
196 static inline void
qdf_streamfs_subbufs_consumed(qdf_streamfs_chan_t chan,unsigned int cpu,size_t consumed)197 qdf_streamfs_subbufs_consumed(qdf_streamfs_chan_t chan,
198 unsigned int cpu, size_t consumed)
199 {
200 }
201
202 static inline void
qdf_streamfs_write(qdf_streamfs_chan_t chan,const void * data,size_t length)203 qdf_streamfs_write(qdf_streamfs_chan_t chan, const void *data,
204 size_t length)
205 {
206 }
207 #endif /* WLAN_STREAMFS */
208 #endif /* _QDF_STREAMFS_H */
209