1 /* 2 * Copyright (c) 2017 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_debugfs.h 21 * This file provides OS abstraction for debug filesystem APIs. 22 */ 23 24 #ifndef _QDF_DEBUGFS_H 25 #define _QDF_DEBUGFS_H 26 27 #include <qdf_status.h> 28 #include <i_qdf_debugfs.h> 29 #include <qdf_atomic.h> 30 #include <qdf_types.h> 31 32 /* representation of qdf dentry */ 33 typedef __qdf_dentry_t qdf_dentry_t; 34 typedef __qdf_debugfs_file_t qdf_debugfs_file_t; 35 36 /* qdf file modes */ 37 #define QDF_FILE_USR_READ 00400 38 #define QDF_FILE_USR_WRITE 00200 39 40 #define QDF_FILE_GRP_READ 00040 41 #define QDF_FILE_GRP_WRITE 00020 42 43 #define QDF_FILE_OTH_READ 00004 44 #define QDF_FILE_OTH_WRITE 00002 45 46 /** 47 * struct qdf_debugfs_fops - qdf debugfs operations 48 * @show: Callback for show operation. 49 * Following functions can be used to print data in the show function, 50 * qdf_debugfs_print() 51 * qdf_debugfs_hexdump() 52 * qdf_debugfs_write() 53 * @write: Callback for write operation. 54 * @priv: Private pointer which will be passed in the registered callbacks. 55 */ 56 struct qdf_debugfs_fops { 57 QDF_STATUS(*show)(qdf_debugfs_file_t file, void *arg); 58 QDF_STATUS(*write)(void *priv, const char *buf, qdf_size_t len); 59 void *priv; 60 }; 61 62 #ifdef WLAN_DEBUGFS 63 /** 64 * qdf_debugfs_init() - initialize debugfs 65 * 66 * Return: QDF_STATUS 67 */ 68 QDF_STATUS qdf_debugfs_init(void); 69 70 /** 71 * qdf_debugfs_exit() - cleanup debugfs 72 * 73 * Return: QDF_STATUS 74 */ 75 QDF_STATUS qdf_debugfs_exit(void); 76 77 /** 78 * qdf_debugfs_create_dir() - create a debugfs directory 79 * @name: name of the new directory 80 * @parent: parent node. If NULL, defaults to base qdf_debugfs_root 81 * 82 * Return: dentry structure pointer in case of success, otherwise NULL. 83 * 84 */ 85 qdf_dentry_t qdf_debugfs_create_dir(const char *name, qdf_dentry_t parent); 86 87 /** 88 * qdf_debugfs_create_file() - create a debugfs file 89 * @name: name of the file 90 * @mode: qdf file mode 91 * @parent: parent node. If NULL, defaults to base qdf_debugfs_root 92 * @fops: file operations { .read, .write ... } 93 * 94 * Return: dentry structure pointer in case of success, otherwise NULL. 95 * 96 */ 97 qdf_dentry_t qdf_debugfs_create_file(const char *name, uint16_t mode, 98 qdf_dentry_t parent, 99 struct qdf_debugfs_fops *fops); 100 101 /** 102 * qdf_debugfs_printf() - print formated string into debugfs file 103 * @file: debugfs file handle passed in fops->show() function 104 * @f: the format string to use 105 * @...: arguments for the format string 106 */ 107 void qdf_debugfs_printf(qdf_debugfs_file_t file, const char *f, ...); 108 109 /** 110 * qdf_debugfs_hexdump() - print hexdump into debugfs file 111 * @file: debugfs file handle passed in fops->show() function. 112 * @buf: data 113 * @len: data length 114 * 115 */ 116 void qdf_debugfs_hexdump(qdf_debugfs_file_t file, const uint8_t *buf, 117 qdf_size_t len); 118 119 /** 120 * qdf_debugfs_write() - write data into debugfs file 121 * @file: debugfs file handle passed in fops->show() function. 122 * @buf: data 123 * @len: data length 124 * 125 */ 126 void qdf_debugfs_write(qdf_debugfs_file_t file, const uint8_t *buf, 127 qdf_size_t len); 128 129 /** 130 * qdf_debugfs_create_u8() - create a debugfs file for a u8 variable 131 * @name: name of the file 132 * @mode: qdf file mode 133 * @parent: parent node. If NULL, defaults to base 'qdf_debugfs_root' 134 * @value: pointer to a u8 variable (global/static) 135 * 136 * Return: dentry for the file; NULL in case of failure. 137 * 138 */ 139 qdf_dentry_t qdf_debugfs_create_u8(const char *name, uint16_t mode, 140 qdf_dentry_t parent, u8 *value); 141 142 /** 143 * qdf_debugfs_create_u16() - create a debugfs file for a u16 variable 144 * @name: name of the file 145 * @mode: qdf file mode 146 * @parent: parent node. If NULL, defaults to base 'qdf_debugfs_root' 147 * @value: pointer to a u16 variable (global/static) 148 * 149 * Return: dentry for the file; NULL in case of failure. 150 * 151 */ 152 qdf_dentry_t qdf_debugfs_create_u16(const char *name, uint16_t mode, 153 qdf_dentry_t parent, u16 *value); 154 155 /** 156 * qdf_debugfs_create_u32() - create a debugfs file for a u32 variable 157 * @name: name of the file 158 * @mode: qdf file mode 159 * @parent: parent node. If NULL, defaults to base 'qdf_debugfs_root' 160 * @value: pointer to a u32 variable (global/static) 161 * 162 * Return: dentry for the file; NULL in case of failure. 163 * 164 */ 165 qdf_dentry_t qdf_debugfs_create_u32(const char *name, uint16_t mode, 166 qdf_dentry_t parent, u32 *value); 167 168 /** 169 * qdf_debugfs_create_u64() - create a debugfs file for a u64 variable 170 * @name: name of the file 171 * @mode: qdf file mode 172 * @parent: parent node. If NULL, defaults to base 'qdf_debugfs_root' 173 * @value: pointer to a u64 variable (global/static) 174 * 175 * Return: dentry for the file; NULL in case of failure. 176 * 177 */ 178 qdf_dentry_t qdf_debugfs_create_u64(const char *name, uint16_t mode, 179 qdf_dentry_t parent, u64 *value); 180 181 /** 182 * qdf_debugfs_create_atomic() - create a debugfs file for an atomic variable 183 * @name: name of the file 184 * @mode: qdf file mode 185 * @parent: parent node. If NULL, defaults to base 'qdf_debugfs_root' 186 * @value: pointer to an atomic variable (global/static) 187 * 188 * Return: dentry for the file; NULL in case of failure. 189 * 190 */ 191 qdf_dentry_t qdf_debugfs_create_atomic(const char *name, uint16_t mode, 192 qdf_dentry_t parent, 193 qdf_atomic_t *value); 194 195 /** 196 * qdf_debugfs_create_string() - create a debugfs file for a string 197 * @name: name of the file 198 * @mode: qdf file mode 199 * @parent: parent node. If NULL, defaults to base 'qdf_debugfs_root' 200 * @str: a pointer to NULL terminated string (global/static). 201 * 202 * Return: dentry for the file; NULL in case of failure. 203 * 204 */ 205 qdf_dentry_t qdf_debugfs_create_string(const char *name, uint16_t mode, 206 qdf_dentry_t parent, char *str); 207 208 /** 209 * qdf_debugfs_remove_dir_recursive() - remove directory recursively 210 * @d: debugfs node 211 * 212 * This function will recursively removes a dreictory in debugfs that was 213 * previously createed with a call to qdf_debugfs_create_file() or it's 214 * variant functions. 215 */ 216 void qdf_debugfs_remove_dir_recursive(qdf_dentry_t d); 217 218 /** 219 * qdf_debugfs_remove_dir() - remove debugfs directory 220 * @d: debugfs node 221 * 222 */ 223 void qdf_debugfs_remove_dir(qdf_dentry_t d); 224 225 /** 226 * qdf_debugfs_remove_file() - remove debugfs file 227 * @d: debugfs node 228 * 229 */ 230 void qdf_debugfs_remove_file(qdf_dentry_t d); 231 232 #else /* WLAN_DEBUGFS */ 233 234 static inline QDF_STATUS qdf_debugfs_init(void) 235 { 236 return QDF_STATUS_E_NOSUPPORT; 237 } 238 239 static inline QDF_STATUS qdf_debugfs_exit(void) 240 { 241 return QDF_STATUS_E_NOSUPPORT; 242 } 243 244 static inline qdf_dentry_t qdf_debugfs_create_dir(const char *name, 245 qdf_dentry_t parent) 246 { 247 return NULL; 248 } 249 250 static inline qdf_dentry_t 251 qdf_debugfs_create_file(const char *name, uint16_t mode, qdf_dentry_t parent, 252 struct qdf_debugfs_fops *fops) 253 { 254 return NULL; 255 } 256 257 static inline void qdf_debugfs_printf(qdf_debugfs_file_t file, const char *f, 258 ...) 259 { 260 } 261 262 static inline void qdf_debugfs_hexdump(qdf_debugfs_file_t file, 263 const uint8_t *buf, qdf_size_t len) 264 { 265 } 266 267 static inline void qdf_debugfs_write(qdf_debugfs_file_t file, 268 const uint8_t *buf, qdf_size_t len) 269 { 270 } 271 272 static inline qdf_dentry_t qdf_debugfs_create_u8(const char *name, 273 uint16_t mode, 274 qdf_dentry_t parent, u8 *value) 275 { 276 return NULL; 277 } 278 279 static inline qdf_dentry_t qdf_debugfs_create_u16(const char *name, 280 uint16_t mode, 281 qdf_dentry_t parent, 282 u16 *value) 283 { 284 return NULL; 285 } 286 287 static inline qdf_dentry_t qdf_debugfs_create_u32(const char *name, 288 uint16_t mode, 289 qdf_dentry_t parent, 290 u32 *value) 291 { 292 return NULL; 293 } 294 295 static inline qdf_dentry_t qdf_debugfs_create_u64(const char *name, 296 uint16_t mode, 297 qdf_dentry_t parent, 298 u64 *value) 299 { 300 return NULL; 301 } 302 303 static inline qdf_dentry_t qdf_debugfs_create_atomic(const char *name, 304 uint16_t mode, 305 qdf_dentry_t parent, 306 qdf_atomic_t *value) 307 { 308 return NULL; 309 } 310 311 static inline qdf_dentry_t debugfs_create_string(const char *name, 312 uint16_t mode, 313 qdf_dentry_t parent, char *str) 314 { 315 return NULL; 316 } 317 318 static inline void qdf_debugfs_remove_dir_recursive(qdf_dentry_t d) {} 319 static inline void qdf_debugfs_remove_dir(qdf_dentry_t d) {} 320 static inline void qdf_debugfs_remove_file(qdf_dentry_t d) {} 321 322 #endif /* WLAN_DEBUGFS */ 323 #endif /* _QDF_DEBUGFS_H */ 324