Path: blob/main/sys/contrib/dev/athk/ath11k/debug.c
48375 views
// SPDX-License-Identifier: BSD-3-Clause-Clear1/*2* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.3*/45#include <linux/vmalloc.h>6#include "core.h"7#include "debug.h"89void ath11k_info(struct ath11k_base *ab, const char *fmt, ...)10{11struct va_format vaf = {12.fmt = fmt,13};14va_list args;1516va_start(args, fmt);17vaf.va = &args;18#if defined(__linux__)19dev_info(ab->dev, "%pV", &vaf);20#elif defined(__FreeBSD__)21{22char *str;23vasprintf(&str, M_KMALLOC, fmt, args);24dev_printk(KERN_INFO, ab->dev, "%s", str);25free(str, M_KMALLOC);26}27#endif28trace_ath11k_log_info(ab, &vaf);29va_end(args);30}31EXPORT_SYMBOL(ath11k_info);3233void ath11k_err(struct ath11k_base *ab, const char *fmt, ...)34{35struct va_format vaf = {36.fmt = fmt,37};38va_list args;3940va_start(args, fmt);41vaf.va = &args;42#if defined(__linux__)43dev_err(ab->dev, "%pV", &vaf);44#elif defined(__FreeBSD__)45{46char *str;47vasprintf(&str, M_KMALLOC, fmt, args);48dev_printk(KERN_ERR, ab->dev, "%s", str);49free(str, M_KMALLOC);50}51#endif52trace_ath11k_log_err(ab, &vaf);53va_end(args);54}55EXPORT_SYMBOL(ath11k_err);5657void ath11k_warn(struct ath11k_base *ab, const char *fmt, ...)58{59struct va_format vaf = {60.fmt = fmt,61};62va_list args;6364va_start(args, fmt);65vaf.va = &args;66#if defined(__linux__)67dev_warn_ratelimited(ab->dev, "%pV", &vaf);68#elif defined(__FreeBSD__)69{70static linux_ratelimit_t __ratelimited;7172if (linux_ratelimited(&__ratelimited)) {73char *str;74vasprintf(&str, M_KMALLOC, fmt, args);75dev_printk(KERN_WARN, ab->dev, "%s", str);76free(str, M_KMALLOC);77}78}79#endif80trace_ath11k_log_warn(ab, &vaf);81va_end(args);82}83EXPORT_SYMBOL(ath11k_warn);8485#ifdef CONFIG_ATH11K_DEBUG8687void __ath11k_dbg(struct ath11k_base *ab, enum ath11k_debug_mask mask,88const char *fmt, ...)89{90struct va_format vaf;91va_list args;9293va_start(args, fmt);9495vaf.fmt = fmt;96vaf.va = &args;9798if (ath11k_debug_mask & mask)99#if defined(__linux__)100dev_printk(KERN_DEBUG, ab->dev, "%s %pV", ath11k_dbg_str(mask), &vaf);101#elif defined(__FreeBSD__)102{103char *str;104vasprintf(&str, M_KMALLOC, fmt, args);105dev_printk(KERN_DEBUG, ab->dev, "%s %s", ath11k_dbg_str(mask), str);106free(str, M_KMALLOC);107}108#endif109110trace_ath11k_log_dbg(ab, mask, &vaf);111112va_end(args);113}114EXPORT_SYMBOL(__ath11k_dbg);115116void ath11k_dbg_dump(struct ath11k_base *ab,117enum ath11k_debug_mask mask,118const char *msg, const char *prefix,119const void *buf, size_t len)120{121#if defined(__linux__)122char linebuf[256];123size_t linebuflen;124const void *ptr;125#elif defined(__FreeBSD__)126struct sbuf *sb;127int rc;128#endif129130if (ath11k_debug_mask & mask) {131if (msg)132__ath11k_dbg(ab, mask, "%s\n", msg);133134#if defined(__linux__)135for (ptr = buf; (ptr - buf) < len; ptr += 16) {136linebuflen = 0;137linebuflen += scnprintf(linebuf + linebuflen,138sizeof(linebuf) - linebuflen,139"%s%08x: ",140(prefix ? prefix : ""),141(unsigned int)(ptr - buf));142hex_dump_to_buffer(ptr, len - (ptr - buf), 16, 1,143linebuf + linebuflen,144sizeof(linebuf) - linebuflen, true);145dev_printk(KERN_DEBUG, ab->dev, "%s\n", linebuf);146}147#elif defined(__FreeBSD__)148sb = sbuf_new_auto();149if (sb == NULL)150goto trace;151152sbuf_hexdump(sb, buf, len, prefix, 0);153sbuf_trim(sb);154rc = sbuf_finish(sb);155if (rc == 0)156dev_printk(KERN_DEBUG, ab->dev, "%s\n", sbuf_data(sb));157sbuf_delete(sb);158trace: ;159#endif160}161162/* tracing code doesn't like null strings */163trace_ath11k_log_dbg_dump(ab, msg ? msg : "", prefix ? prefix : "",164buf, len);165}166EXPORT_SYMBOL(ath11k_dbg_dump);167168#endif /* CONFIG_ATH11K_DEBUG */169170171