1 // SPDX-License-Identifier: BSD-3-Clause-Clear 2 /* 3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. 4 * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. 5 * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. 6 */ 7 8 #include <linux/export.h> 9 #include <linux/vmalloc.h> 10 #include "core.h" 11 #include "debug.h" 12 13 void ath11k_info(struct ath11k_base *ab, const char *fmt, ...) 14 { 15 struct va_format vaf = { 16 .fmt = fmt, 17 }; 18 va_list args; 19 20 va_start(args, fmt); 21 vaf.va = &args; 22 #if defined(__linux__) 23 dev_info(ab->dev, "%pV", &vaf); 24 #elif defined(__FreeBSD__) 25 { 26 char *str; 27 vasprintf(&str, M_KMALLOC, fmt, args); 28 dev_printk(KERN_INFO, ab->dev, "%s", str); 29 free(str, M_KMALLOC); 30 } 31 #endif 32 trace_ath11k_log_info(ab, &vaf); 33 va_end(args); 34 } 35 EXPORT_SYMBOL(ath11k_info); 36 37 void ath11k_err(struct ath11k_base *ab, const char *fmt, ...) 38 { 39 struct va_format vaf = { 40 .fmt = fmt, 41 }; 42 va_list args; 43 44 va_start(args, fmt); 45 vaf.va = &args; 46 #if defined(__linux__) 47 dev_err(ab->dev, "%pV", &vaf); 48 #elif defined(__FreeBSD__) 49 { 50 char *str; 51 vasprintf(&str, M_KMALLOC, fmt, args); 52 dev_printk(KERN_ERR, ab->dev, "%s", str); 53 free(str, M_KMALLOC); 54 } 55 #endif 56 trace_ath11k_log_err(ab, &vaf); 57 va_end(args); 58 } 59 EXPORT_SYMBOL(ath11k_err); 60 61 void ath11k_warn(struct ath11k_base *ab, const char *fmt, ...) 62 { 63 struct va_format vaf = { 64 .fmt = fmt, 65 }; 66 va_list args; 67 68 va_start(args, fmt); 69 vaf.va = &args; 70 #if defined(__linux__) 71 dev_warn_ratelimited(ab->dev, "%pV", &vaf); 72 #elif defined(__FreeBSD__) 73 { 74 static linux_ratelimit_t __ratelimited; 75 76 if (linux_ratelimited(&__ratelimited)) { 77 char *str; 78 vasprintf(&str, M_KMALLOC, fmt, args); 79 dev_printk(KERN_WARN, ab->dev, "%s", str); 80 free(str, M_KMALLOC); 81 } 82 } 83 #endif 84 trace_ath11k_log_warn(ab, &vaf); 85 va_end(args); 86 } 87 EXPORT_SYMBOL(ath11k_warn); 88 89 #ifdef CONFIG_ATH11K_DEBUG 90 91 void __ath11k_dbg(struct ath11k_base *ab, enum ath11k_debug_mask mask, 92 const char *fmt, ...) 93 { 94 struct va_format vaf; 95 va_list args; 96 97 va_start(args, fmt); 98 99 vaf.fmt = fmt; 100 vaf.va = &args; 101 102 if (ath11k_debug_mask & mask) 103 #if defined(__linux__) 104 dev_printk(KERN_DEBUG, ab->dev, "%s %pV", ath11k_dbg_str(mask), &vaf); 105 #elif defined(__FreeBSD__) 106 { 107 char *str; 108 vasprintf(&str, M_KMALLOC, fmt, args); 109 dev_printk(KERN_DEBUG, ab->dev, "%s %s", ath11k_dbg_str(mask), str); 110 free(str, M_KMALLOC); 111 } 112 #endif 113 114 trace_ath11k_log_dbg(ab, mask, &vaf); 115 116 va_end(args); 117 } 118 EXPORT_SYMBOL(__ath11k_dbg); 119 120 void ath11k_dbg_dump(struct ath11k_base *ab, 121 enum ath11k_debug_mask mask, 122 const char *msg, const char *prefix, 123 const void *buf, size_t len) 124 { 125 #if defined(__linux__) 126 char linebuf[256]; 127 size_t linebuflen; 128 const void *ptr; 129 #elif defined(__FreeBSD__) 130 struct sbuf *sb; 131 int rc; 132 #endif 133 134 if (ath11k_debug_mask & mask) { 135 if (msg) 136 __ath11k_dbg(ab, mask, "%s\n", msg); 137 138 #if defined(__linux__) 139 for (ptr = buf; (ptr - buf) < len; ptr += 16) { 140 linebuflen = 0; 141 linebuflen += scnprintf(linebuf + linebuflen, 142 sizeof(linebuf) - linebuflen, 143 "%s%08x: ", 144 (prefix ? prefix : ""), 145 (unsigned int)(ptr - buf)); 146 hex_dump_to_buffer(ptr, len - (ptr - buf), 16, 1, 147 linebuf + linebuflen, 148 sizeof(linebuf) - linebuflen, true); 149 dev_printk(KERN_DEBUG, ab->dev, "%s\n", linebuf); 150 } 151 #elif defined(__FreeBSD__) 152 sb = sbuf_new_auto(); 153 if (sb == NULL) 154 goto trace; 155 156 sbuf_hexdump(sb, buf, len, prefix, 0); 157 sbuf_trim(sb); 158 rc = sbuf_finish(sb); 159 if (rc == 0) 160 dev_printk(KERN_DEBUG, ab->dev, "%s\n", sbuf_data(sb)); 161 sbuf_delete(sb); 162 trace: ; 163 #endif 164 } 165 166 /* tracing code doesn't like null strings */ 167 trace_ath11k_log_dbg_dump(ab, msg ? msg : "", prefix ? prefix : "", 168 buf, len); 169 } 170 EXPORT_SYMBOL(ath11k_dbg_dump); 171 172 #endif /* CONFIG_ATH11K_DEBUG */ 173