Path: blob/main/sys/contrib/dev/athk/ath11k/debug.c
103756 views
// SPDX-License-Identifier: BSD-3-Clause-Clear1/*2* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.3* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.4* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.5*/67#include <linux/export.h>8#include <linux/vmalloc.h>9#include "core.h"10#include "debug.h"1112void ath11k_info(struct ath11k_base *ab, const char *fmt, ...)13{14struct va_format vaf = {15.fmt = fmt,16};17va_list args;1819va_start(args, fmt);20vaf.va = &args;21#if defined(__linux__)22dev_info(ab->dev, "%pV", &vaf);23#elif defined(__FreeBSD__)24{25char *str;26vasprintf(&str, M_KMALLOC, fmt, args);27dev_printk(KERN_INFO, ab->dev, "%s", str);28free(str, M_KMALLOC);29}30#endif31trace_ath11k_log_info(ab, &vaf);32va_end(args);33}34EXPORT_SYMBOL(ath11k_info);3536void ath11k_err(struct ath11k_base *ab, const char *fmt, ...)37{38struct va_format vaf = {39.fmt = fmt,40};41va_list args;4243va_start(args, fmt);44vaf.va = &args;45#if defined(__linux__)46dev_err(ab->dev, "%pV", &vaf);47#elif defined(__FreeBSD__)48{49char *str;50vasprintf(&str, M_KMALLOC, fmt, args);51dev_printk(KERN_ERR, ab->dev, "%s", str);52free(str, M_KMALLOC);53}54#endif55trace_ath11k_log_err(ab, &vaf);56va_end(args);57}58EXPORT_SYMBOL(ath11k_err);5960void ath11k_warn(struct ath11k_base *ab, const char *fmt, ...)61{62struct va_format vaf = {63.fmt = fmt,64};65va_list args;6667va_start(args, fmt);68vaf.va = &args;69#if defined(__linux__)70dev_warn_ratelimited(ab->dev, "%pV", &vaf);71#elif defined(__FreeBSD__)72{73static linux_ratelimit_t __ratelimited;7475if (linux_ratelimited(&__ratelimited)) {76char *str;77vasprintf(&str, M_KMALLOC, fmt, args);78dev_printk(KERN_WARN, ab->dev, "%s", str);79free(str, M_KMALLOC);80}81}82#endif83trace_ath11k_log_warn(ab, &vaf);84va_end(args);85}86EXPORT_SYMBOL(ath11k_warn);8788#ifdef CONFIG_ATH11K_DEBUG8990void __ath11k_dbg(struct ath11k_base *ab, enum ath11k_debug_mask mask,91const char *fmt, ...)92{93struct va_format vaf;94va_list args;9596va_start(args, fmt);9798vaf.fmt = fmt;99vaf.va = &args;100101if (ath11k_debug_mask & mask)102#if defined(__linux__)103dev_printk(KERN_DEBUG, ab->dev, "%s %pV", ath11k_dbg_str(mask), &vaf);104#elif defined(__FreeBSD__)105{106char *str;107vasprintf(&str, M_KMALLOC, fmt, args);108dev_printk(KERN_DEBUG, ab->dev, "%s %s", ath11k_dbg_str(mask), str);109free(str, M_KMALLOC);110}111#endif112113trace_ath11k_log_dbg(ab, mask, &vaf);114115va_end(args);116}117EXPORT_SYMBOL(__ath11k_dbg);118119void ath11k_dbg_dump(struct ath11k_base *ab,120enum ath11k_debug_mask mask,121const char *msg, const char *prefix,122const void *buf, size_t len)123{124#if defined(__linux__)125char linebuf[256];126size_t linebuflen;127const void *ptr;128#elif defined(__FreeBSD__)129struct sbuf *sb;130int rc;131#endif132133if (ath11k_debug_mask & mask) {134if (msg)135__ath11k_dbg(ab, mask, "%s\n", msg);136137#if defined(__linux__)138for (ptr = buf; (ptr - buf) < len; ptr += 16) {139linebuflen = 0;140linebuflen += scnprintf(linebuf + linebuflen,141sizeof(linebuf) - linebuflen,142"%s%08x: ",143(prefix ? prefix : ""),144(unsigned int)(ptr - buf));145hex_dump_to_buffer(ptr, len - (ptr - buf), 16, 1,146linebuf + linebuflen,147sizeof(linebuf) - linebuflen, true);148dev_printk(KERN_DEBUG, ab->dev, "%s\n", linebuf);149}150#elif defined(__FreeBSD__)151sb = sbuf_new_auto();152if (sb == NULL)153goto trace;154155sbuf_hexdump(sb, buf, len, prefix, 0);156sbuf_trim(sb);157rc = sbuf_finish(sb);158if (rc == 0)159dev_printk(KERN_DEBUG, ab->dev, "%s\n", sbuf_data(sb));160sbuf_delete(sb);161trace: ;162#endif163}164165/* tracing code doesn't like null strings */166trace_ath11k_log_dbg_dump(ab, msg ? msg : "", prefix ? prefix : "",167buf, len);168}169EXPORT_SYMBOL(ath11k_dbg_dump);170171#endif /* CONFIG_ATH11K_DEBUG */172173174