1 /* 2 * Copyright (c) 2017-2018 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 * @rowsize: row size in bytes to dump 115 * @groupsize: group size in bytes to dump 116 * 117 */ 118 void qdf_debugfs_hexdump(qdf_debugfs_file_t file, const uint8_t *buf, 119 qdf_size_t len, int rowsize, int groupsize); 120 121 /** 122 * qdf_debugfs_overflow() - check overflow occurrence in debugfs buffer 123 * @file: debugfs file handle passed in fops->show() function. 124 * 125 * Return: 1 on overflow occurrence else 0 126 * 127 */ 128 bool qdf_debugfs_overflow(qdf_debugfs_file_t file); 129 130 /** 131 * qdf_debugfs_write() - write data into debugfs file 132 * @file: debugfs file handle passed in fops->show() function. 133 * @buf: data 134 * @len: data length 135 * 136 */ 137 void qdf_debugfs_write(qdf_debugfs_file_t file, const uint8_t *buf, 138 qdf_size_t len); 139 140 /** 141 * qdf_debugfs_create_u8() - create a debugfs file for a u8 variable 142 * @name: name of the file 143 * @mode: qdf file mode 144 * @parent: parent node. If NULL, defaults to base 'qdf_debugfs_root' 145 * @value: pointer to a u8 variable (global/static) 146 * 147 * Return: dentry for the file; NULL in case of failure. 148 * 149 */ 150 qdf_dentry_t qdf_debugfs_create_u8(const char *name, uint16_t mode, 151 qdf_dentry_t parent, u8 *value); 152 153 /** 154 * qdf_debugfs_create_u16() - create a debugfs file for a u16 variable 155 * @name: name of the file 156 * @mode: qdf file mode 157 * @parent: parent node. If NULL, defaults to base 'qdf_debugfs_root' 158 * @value: pointer to a u16 variable (global/static) 159 * 160 * Return: dentry for the file; NULL in case of failure. 161 * 162 */ 163 qdf_dentry_t qdf_debugfs_create_u16(const char *name, uint16_t mode, 164 qdf_dentry_t parent, u16 *value); 165 166 /** 167 * qdf_debugfs_create_u32() - create a debugfs file for a u32 variable 168 * @name: name of the file 169 * @mode: qdf file mode 170 * @parent: parent node. If NULL, defaults to base 'qdf_debugfs_root' 171 * @value: pointer to a u32 variable (global/static) 172 * 173 * Return: dentry for the file; NULL in case of failure. 174 * 175 */ 176 qdf_dentry_t qdf_debugfs_create_u32(const char *name, uint16_t mode, 177 qdf_dentry_t parent, u32 *value); 178 179 /** 180 * qdf_debugfs_create_u64() - create a debugfs file for a u64 variable 181 * @name: name of the file 182 * @mode: qdf file mode 183 * @parent: parent node. If NULL, defaults to base 'qdf_debugfs_root' 184 * @value: pointer to a u64 variable (global/static) 185 * 186 * Return: dentry for the file; NULL in case of failure. 187 * 188 */ 189 qdf_dentry_t qdf_debugfs_create_u64(const char *name, uint16_t mode, 190 qdf_dentry_t parent, u64 *value); 191 192 /** 193 * qdf_debugfs_create_atomic() - create a debugfs file for an atomic variable 194 * @name: name of the file 195 * @mode: qdf file mode 196 * @parent: parent node. If NULL, defaults to base 'qdf_debugfs_root' 197 * @value: pointer to an atomic variable (global/static) 198 * 199 * Return: dentry for the file; NULL in case of failure. 200 * 201 */ 202 qdf_dentry_t qdf_debugfs_create_atomic(const char *name, uint16_t mode, 203 qdf_dentry_t parent, 204 qdf_atomic_t *value); 205 206 /** 207 * qdf_debugfs_create_string() - create a debugfs file for a string 208 * @name: name of the file 209 * @mode: qdf file mode 210 * @parent: parent node. If NULL, defaults to base 'qdf_debugfs_root' 211 * @str: a pointer to NULL terminated string (global/static). 212 * 213 * Return: dentry for the file; NULL in case of failure. 214 * 215 */ 216 qdf_dentry_t qdf_debugfs_create_string(const char *name, uint16_t mode, 217 qdf_dentry_t parent, char *str); 218 219 /** 220 * qdf_debugfs_remove_dir_recursive() - remove directory recursively 221 * @d: debugfs node 222 * 223 * This function will recursively removes a dreictory in debugfs that was 224 * previously createed with a call to qdf_debugfs_create_file() or it's 225 * variant functions. 226 */ 227 void qdf_debugfs_remove_dir_recursive(qdf_dentry_t d); 228 229 /** 230 * qdf_debugfs_remove_dir() - remove debugfs directory 231 * @d: debugfs node 232 * 233 */ 234 void qdf_debugfs_remove_dir(qdf_dentry_t d); 235 236 /** 237 * qdf_debugfs_remove_file() - remove debugfs file 238 * @d: debugfs node 239 * 240 */ 241 void qdf_debugfs_remove_file(qdf_dentry_t d); 242 243 #else /* WLAN_DEBUGFS */ 244 245 static inline QDF_STATUS qdf_debugfs_init(void) 246 { 247 return QDF_STATUS_E_NOSUPPORT; 248 } 249 250 static inline QDF_STATUS qdf_debugfs_exit(void) 251 { 252 return QDF_STATUS_E_NOSUPPORT; 253 } 254 255 static inline qdf_dentry_t qdf_debugfs_create_dir(const char *name, 256 qdf_dentry_t parent) 257 { 258 return NULL; 259 } 260 261 static inline qdf_dentry_t 262 qdf_debugfs_create_file(const char *name, uint16_t mode, qdf_dentry_t parent, 263 struct qdf_debugfs_fops *fops) 264 { 265 return NULL; 266 } 267 268 static inline void qdf_debugfs_printf(qdf_debugfs_file_t file, const char *f, 269 ...) 270 { 271 } 272 273 static inline void qdf_debugfs_hexdump(qdf_debugfs_file_t file, 274 const uint8_t *buf, qdf_size_t len, 275 int rowsize, int groupsize) 276 { 277 } 278 279 static inline bool qdf_debugfs_overflow(qdf_debugfs_file_t file) 280 { 281 return 0; 282 } 283 284 static inline void qdf_debugfs_write(qdf_debugfs_file_t file, 285 const uint8_t *buf, qdf_size_t len) 286 { 287 } 288 289 static inline qdf_dentry_t qdf_debugfs_create_u8(const char *name, 290 uint16_t mode, 291 qdf_dentry_t parent, u8 *value) 292 { 293 return NULL; 294 } 295 296 static inline qdf_dentry_t qdf_debugfs_create_u16(const char *name, 297 uint16_t mode, 298 qdf_dentry_t parent, 299 u16 *value) 300 { 301 return NULL; 302 } 303 304 static inline qdf_dentry_t qdf_debugfs_create_u32(const char *name, 305 uint16_t mode, 306 qdf_dentry_t parent, 307 u32 *value) 308 { 309 return NULL; 310 } 311 312 static inline qdf_dentry_t qdf_debugfs_create_u64(const char *name, 313 uint16_t mode, 314 qdf_dentry_t parent, 315 u64 *value) 316 { 317 return NULL; 318 } 319 320 static inline qdf_dentry_t qdf_debugfs_create_atomic(const char *name, 321 uint16_t mode, 322 qdf_dentry_t parent, 323 qdf_atomic_t *value) 324 { 325 return NULL; 326 } 327 328 static inline qdf_dentry_t debugfs_create_string(const char *name, 329 uint16_t mode, 330 qdf_dentry_t parent, char *str) 331 { 332 return NULL; 333 } 334 335 static inline void qdf_debugfs_remove_dir_recursive(qdf_dentry_t d) {} 336 static inline void qdf_debugfs_remove_dir(qdf_dentry_t d) {} 337 static inline void qdf_debugfs_remove_file(qdf_dentry_t d) {} 338 339 #endif /* WLAN_DEBUGFS */ 340 #endif /* _QDF_DEBUGFS_H */ 341