1  /*
2   * Copyright (c) 2018, 2020 The Linux Foundation. All rights reserved.
3   *
4   * Permission to use, copy, modify, and/or distribute this software for
5   * any purpose with or without fee is hereby granted, provided that the
6   * above copyright notice and this permission notice appear in all
7   * copies.
8   *
9   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10   * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11   * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12   * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13   * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14   * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16   * PERFORMANCE OF THIS SOFTWARE.
17   */
18  
19  /**
20   * DOC: qdf_streamfs
21   * This file provides QDF stream file system APIs
22   */
23  
24  #include <i_qdf_streamfs.h>
25  #include <qdf_trace.h>
26  #include <qdf_streamfs.h>
27  #include <qdf_module.h>
28  
29  /**
30   * qdf_create_buf_file_handler() - Create streamfs buffer file
31   * @filename: base name of files to create, NULL for buffering only
32   * @parent: dentry of parent directory, NULL for root directory
33   * @mode: filemode
34   * @buf: streamfs channel buf
35   * @is_global: pointer to set whether this buf file is global or not.
36   *
37   *  Returns dentry if successful, NULL otherwise.
38   */
39  static qdf_dentry_t
qdf_create_buf_file_handler(const char * filename,qdf_dentry_t parent,uint16_t mode,qdf_streamfs_chan_buf_t buf,int32_t * is_global)40  qdf_create_buf_file_handler(const char *filename, qdf_dentry_t parent,
41  			    uint16_t mode, qdf_streamfs_chan_buf_t buf,
42  			    int32_t *is_global)
43  {
44  	qdf_dentry_t buf_file;
45  	*is_global = 1;
46  	buf_file = qdf_streamfs_create_file(filename, mode, parent, buf);
47  
48  	if (!buf_file)
49  		return NULL;
50  
51  	return buf_file;
52  }
53  
54  /**
55   * qdf_remove_buf_file_handler() - Remove streamfs buffer file
56   *  @dentry:dentry
57   */
qdf_remove_buf_file_handler(qdf_dentry_t dentry)58  static int qdf_remove_buf_file_handler(qdf_dentry_t dentry)
59  {
60  	qdf_streamfs_remove_file(dentry);
61  
62  	return 0;
63  }
64  
65  static struct rchan_callbacks g_qdf_streamfs_cb = {
66  	.create_buf_file = qdf_create_buf_file_handler,
67  	.remove_buf_file = qdf_remove_buf_file_handler,
68  };
69  
70  qdf_dentry_t
qdf_streamfs_create_file(const char * name,uint16_t mode,qdf_dentry_t parent,qdf_streamfs_chan_buf_t buf)71  qdf_streamfs_create_file(const char *name, uint16_t mode,
72  			 qdf_dentry_t parent,
73  			 qdf_streamfs_chan_buf_t buf)
74  {
75  	qdf_dentry_t file = NULL;
76  
77  	if (!name)
78  		return NULL;
79  
80  	file = debugfs_create_file(name, mode,
81  				   (struct dentry *)parent,
82  				   buf, &relay_file_operations);
83  
84  	return file;
85  }
86  
87  qdf_export_symbol(qdf_streamfs_create_file);
88  
89  qdf_streamfs_chan_t
qdf_streamfs_open(const char * base_filename,qdf_dentry_t parent,size_t subbuf_size,size_t n_subbufs,void * private_data)90  qdf_streamfs_open(const char *base_filename, qdf_dentry_t parent,
91  		  size_t subbuf_size, size_t n_subbufs,
92  		  void *private_data)
93  {
94  	qdf_streamfs_chan_t channel_ptr = NULL;
95  
96  	channel_ptr = relay_open(base_filename,
97  				 (struct dentry *)parent,
98  				 subbuf_size, n_subbufs,
99  				 &g_qdf_streamfs_cb,
100  				 private_data);
101  
102  	return channel_ptr;
103  }
104  
105  qdf_export_symbol(qdf_streamfs_open);
106  
qdf_streamfs_close(qdf_streamfs_chan_t chan)107  void qdf_streamfs_close(qdf_streamfs_chan_t chan)
108  {
109  	if (chan)
110  		relay_close(chan);
111  }
112  
113  qdf_export_symbol(qdf_streamfs_close);
114  
qdf_streamfs_flush(qdf_streamfs_chan_t chan)115  void qdf_streamfs_flush(qdf_streamfs_chan_t chan)
116  {
117  	if (chan)
118  		relay_flush(chan);
119  }
120  
121  qdf_export_symbol(qdf_streamfs_flush);
122  
qdf_streamfs_reset(qdf_streamfs_chan_t chan)123  void qdf_streamfs_reset(qdf_streamfs_chan_t chan)
124  {
125  	if (chan)
126  		relay_reset(chan);
127  }
128  
129  qdf_export_symbol(qdf_streamfs_reset);
130  
qdf_streamfs_subbufs_consumed(qdf_streamfs_chan_t chan,unsigned int cpu,size_t consumed)131  void qdf_streamfs_subbufs_consumed(qdf_streamfs_chan_t chan,
132  				   unsigned int cpu,
133  				   size_t consumed)
134  {
135  	if (chan)
136  		relay_subbufs_consumed(chan, cpu, consumed);
137  }
138  
139  qdf_export_symbol(qdf_streamfs_subbufs_consumed);
140  
qdf_streamfs_write(qdf_streamfs_chan_t chan,const void * data,size_t length)141  void qdf_streamfs_write(qdf_streamfs_chan_t chan,
142  			const void *data,
143  			size_t length)
144  {
145  	if (chan)
146  		relay_write(chan, data, length);
147  }
148  
149  qdf_export_symbol(qdf_streamfs_write);
150