root/drivers/net/wireless/intel/iwlwifi/iwl-debug.c
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
/*
 * Copyright (C) 2005-2011, 2021-2022 Intel Corporation
 */
#include <linux/device.h>
#include <linux/interrupt.h>
#include <linux/export.h>
#include "iwl-drv.h"
#include "iwl-debug.h"
#include "iwl-devtrace.h"

#define __iwl_fn(fn)                                            \
void __iwl_ ##fn(struct device *dev, const char *fmt, ...)      \
{                                                               \
        struct va_format vaf = {                                \
                .fmt = fmt,                                     \
        };                                                      \
        va_list args;                                           \
                                                                \
        va_start(args, fmt);                                    \
        vaf.va = &args;                                         \
        dev_ ##fn(dev, "%pV", &vaf);                            \
        trace_iwlwifi_ ##fn(&vaf);                              \
        va_end(args);                                           \
}

__iwl_fn(warn)
IWL_EXPORT_SYMBOL(__iwl_warn);
__iwl_fn(info)
IWL_EXPORT_SYMBOL(__iwl_info);
__iwl_fn(crit)
IWL_EXPORT_SYMBOL(__iwl_crit);

void __iwl_err(struct device *dev, enum iwl_err_mode mode, const char *fmt, ...)
{
        struct va_format vaf = {
                .fmt = fmt,
        };
        va_list args, args2;

        va_start(args, fmt);
        switch (mode) {
        case IWL_ERR_MODE_RATELIMIT:
                if (net_ratelimit())
                        break;
                fallthrough;
        case IWL_ERR_MODE_REGULAR:
        case IWL_ERR_MODE_RFKILL:
                va_copy(args2, args);
                vaf.va = &args2;
                if (mode == IWL_ERR_MODE_RFKILL)
                        dev_err(dev, "(RFKILL) %pV", &vaf);
                else
                        dev_err(dev, "%pV", &vaf);
                va_end(args2);
                break;
        default:
                break;
        }
        vaf.va = &args;
        trace_iwlwifi_err(&vaf);
        va_end(args);
}
IWL_EXPORT_SYMBOL(__iwl_err);

#if defined(CONFIG_IWLWIFI_DEBUG) || defined(CONFIG_IWLWIFI_DEVICE_TRACING)
void __iwl_dbg(struct device *dev,
               u32 level, bool limit, const char *function,
               const char *fmt, ...)
{
        struct va_format vaf = {
                .fmt = fmt,
        };
        va_list args;

        va_start(args, fmt);
        vaf.va = &args;
#ifdef CONFIG_IWLWIFI_DEBUG
        if (iwl_have_debug_level(level) &&
            (!limit || net_ratelimit()))
                dev_printk(KERN_DEBUG, dev, "%s %pV", function, &vaf);
#endif
        trace_iwlwifi_dbg(level, function, &vaf);
        va_end(args);
}
IWL_EXPORT_SYMBOL(__iwl_dbg);
#endif