1 /*
2  * Copyright (c) 2017-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 #ifndef _WLAN_HDD_SYSFS_H_
21 #define _WLAN_HDD_SYSFS_H_
22 
23 /**
24  * struct hdd_sysfs_print_ctx - keeps track of sysfs buffer printing
25  * @buf: pointer to sysfs char buffer
26  * @idx: current position in char buffer
27  * @new_line: if set true, newline will be added at end of each print
28  */
29 struct hdd_sysfs_print_ctx {
30 	char *buf;
31 	int idx;
32 	bool new_line;
33 };
34 
35 #ifdef WLAN_SYSFS
36 
37 #define MAX_SYSFS_USER_COMMAND_SIZE_LENGTH (32)
38 #define MAX_CMD_INPUT (512)
39 
40 /**
41  * hdd_sysfs_validate_and_copy_buf() - validate sysfs input buf and copy into
42  *                                     destination buffer
43  * @dest_buf: pointer to destination buffer where data should be copied
44  * @dest_buf_size: size of destination buffer
45  * @src_buf: pointer to constant sysfs source buffer
46  * @src_buf_size: size of source buffer
47  *
48  * Return: 0 for success and error code for failure
49  */
50 int
51 hdd_sysfs_validate_and_copy_buf(char *dest_buf, size_t dest_buf_size,
52 				char const *src_buf, size_t src_buf_size);
53 
54 /**
55  * hdd_create_sysfs_files() - create sysfs files
56  * @hdd_ctx: pointer to hdd context
57  *
58  * Return: none
59  */
60 void hdd_create_sysfs_files(struct hdd_context *hdd_ctx);
61 
62 /**
63  * hdd_destroy_sysfs_files() - destroy sysfs files
64  *
65  * Return: none
66  */
67 void hdd_destroy_sysfs_files(void);
68 
69 /**
70  * hdd_create_adapter_sysfs_files - create adapter sysfs files
71  * @adapter: pointer to adapter
72  *
73  * Return: none
74  */
75 void hdd_create_adapter_sysfs_files(struct hdd_adapter *adapter);
76 
77 /**
78  * hdd_destroy_adapter_sysfs_files - destroy adapter sysfs files
79  * @adapter: pointer to adapter
80  *
81  * Return: none
82  */
83 void hdd_destroy_adapter_sysfs_files(struct hdd_adapter *adapter);
84 
85 /**
86  * hdd_create_wifi_feature_interface_sysfs_file - Create wifi feature interface
87  * sysfs file
88  *
89  * Return: none
90  */
91 void hdd_create_wifi_feature_interface_sysfs_file(void);
92 
93 /**
94  * hdd_destroy_wifi_feature_interface_sysfs_file - Destroy wifi feature
95  * interface sysfs file
96  *
97  * Return: none
98  */
99 void hdd_destroy_wifi_feature_interface_sysfs_file(void);
100 
101 /**
102  * hdd_sysfs_create_wifi_root_obj() - create wifi root kobj
103  *
104  * Return: none
105  */
106 void hdd_sysfs_create_wifi_root_obj(void);
107 
108 /**
109  * hdd_sysfs_destroy_wifi_root_obj() - Destroy wifi root kobj
110  *
111  * Return: none
112  */
113 void hdd_sysfs_destroy_wifi_root_obj(void);
114 
115 /*
116  * hdd_sysfs_print() - print to sysfs char buffer
117  * @ctx: pointer to struct hdd_sysfs_print_ctx
118  * @fmt: string format
119  *
120  * To use this function, create a hdd_sysfs_print_ctx variable, set
121  * idx to 0, set buf to the outbuffer and set new_line to true or false.
122  * Pass this context struct to every function call.
123  * Using this function will then write the data to the outbuffer and
124  * increment the counter.
125  *
126  * The context pointer is void to be compatible with qdf_abstract_print,
127  * to allow for abstract printing.
128  *
129  * Return: Number of characters written
130  */
131 int hdd_sysfs_print(void *ctx, const char *fmt, ...);
132 
133 #else
134 static inline int
hdd_sysfs_validate_and_copy_buf(char * dest_buf,size_t dest_buf_size,char const * src_buf,size_t src_buf_size)135 hdd_sysfs_validate_and_copy_buf(char *dest_buf, size_t dest_buf_size,
136 				char const *src_buf, size_t src_buf_size)
137 {
138 	return -EPERM;
139 }
140 
hdd_create_sysfs_files(struct hdd_context * hdd_ctx)141 static inline void hdd_create_sysfs_files(struct hdd_context *hdd_ctx)
142 {
143 }
144 
hdd_destroy_sysfs_files(void)145 static inline void hdd_destroy_sysfs_files(void)
146 {
147 }
148 
hdd_create_adapter_sysfs_files(struct hdd_adapter * adapter)149 static inline void hdd_create_adapter_sysfs_files(struct hdd_adapter *adapter)
150 {
151 }
152 
hdd_destroy_adapter_sysfs_files(struct hdd_adapter * adapter)153 static inline void hdd_destroy_adapter_sysfs_files(struct hdd_adapter *adapter)
154 {
155 }
156 
hdd_create_wifi_feature_interface_sysfs_file(void)157 static inline void hdd_create_wifi_feature_interface_sysfs_file(void)
158 {
159 }
160 
hdd_destroy_wifi_feature_interface_sysfs_file(void)161 static inline void hdd_destroy_wifi_feature_interface_sysfs_file(void)
162 {
163 }
164 
hdd_sysfs_create_wifi_root_obj(void)165 static inline void hdd_sysfs_create_wifi_root_obj(void)
166 {
167 }
168 
hdd_sysfs_destroy_wifi_root_obj(void)169 static inline void hdd_sysfs_destroy_wifi_root_obj(void)
170 {
171 }
172 
173 #endif /* End of WLAN SYSFS*/
174 
175 #endif /* End of _WLAN_HDD_SYSFS_H_ */
176