162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2005-2011, 2021-2022 Intel Corporation 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci#include <linux/device.h> 662306a36Sopenharmony_ci#include <linux/interrupt.h> 762306a36Sopenharmony_ci#include <linux/export.h> 862306a36Sopenharmony_ci#include "iwl-drv.h" 962306a36Sopenharmony_ci#include "iwl-debug.h" 1062306a36Sopenharmony_ci#include "iwl-devtrace.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define __iwl_fn(fn) \ 1362306a36Sopenharmony_civoid __iwl_ ##fn(struct device *dev, const char *fmt, ...) \ 1462306a36Sopenharmony_ci{ \ 1562306a36Sopenharmony_ci struct va_format vaf = { \ 1662306a36Sopenharmony_ci .fmt = fmt, \ 1762306a36Sopenharmony_ci }; \ 1862306a36Sopenharmony_ci va_list args; \ 1962306a36Sopenharmony_ci \ 2062306a36Sopenharmony_ci va_start(args, fmt); \ 2162306a36Sopenharmony_ci vaf.va = &args; \ 2262306a36Sopenharmony_ci dev_ ##fn(dev, "%pV", &vaf); \ 2362306a36Sopenharmony_ci trace_iwlwifi_ ##fn(&vaf); \ 2462306a36Sopenharmony_ci va_end(args); \ 2562306a36Sopenharmony_ci} 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci__iwl_fn(warn) 2862306a36Sopenharmony_ciIWL_EXPORT_SYMBOL(__iwl_warn); 2962306a36Sopenharmony_ci__iwl_fn(info) 3062306a36Sopenharmony_ciIWL_EXPORT_SYMBOL(__iwl_info); 3162306a36Sopenharmony_ci__iwl_fn(crit) 3262306a36Sopenharmony_ciIWL_EXPORT_SYMBOL(__iwl_crit); 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_civoid __iwl_err(struct device *dev, enum iwl_err_mode mode, const char *fmt, ...) 3562306a36Sopenharmony_ci{ 3662306a36Sopenharmony_ci struct va_format vaf = { 3762306a36Sopenharmony_ci .fmt = fmt, 3862306a36Sopenharmony_ci }; 3962306a36Sopenharmony_ci va_list args, args2; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci va_start(args, fmt); 4262306a36Sopenharmony_ci switch (mode) { 4362306a36Sopenharmony_ci case IWL_ERR_MODE_RATELIMIT: 4462306a36Sopenharmony_ci if (net_ratelimit()) 4562306a36Sopenharmony_ci break; 4662306a36Sopenharmony_ci fallthrough; 4762306a36Sopenharmony_ci case IWL_ERR_MODE_REGULAR: 4862306a36Sopenharmony_ci case IWL_ERR_MODE_RFKILL: 4962306a36Sopenharmony_ci va_copy(args2, args); 5062306a36Sopenharmony_ci vaf.va = &args2; 5162306a36Sopenharmony_ci if (mode == IWL_ERR_MODE_RFKILL) 5262306a36Sopenharmony_ci dev_err(dev, "(RFKILL) %pV", &vaf); 5362306a36Sopenharmony_ci else 5462306a36Sopenharmony_ci dev_err(dev, "%pV", &vaf); 5562306a36Sopenharmony_ci va_end(args2); 5662306a36Sopenharmony_ci break; 5762306a36Sopenharmony_ci default: 5862306a36Sopenharmony_ci break; 5962306a36Sopenharmony_ci } 6062306a36Sopenharmony_ci vaf.va = &args; 6162306a36Sopenharmony_ci trace_iwlwifi_err(&vaf); 6262306a36Sopenharmony_ci va_end(args); 6362306a36Sopenharmony_ci} 6462306a36Sopenharmony_ciIWL_EXPORT_SYMBOL(__iwl_err); 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci#if defined(CONFIG_IWLWIFI_DEBUG) || defined(CONFIG_IWLWIFI_DEVICE_TRACING) 6762306a36Sopenharmony_civoid __iwl_dbg(struct device *dev, 6862306a36Sopenharmony_ci u32 level, bool limit, const char *function, 6962306a36Sopenharmony_ci const char *fmt, ...) 7062306a36Sopenharmony_ci{ 7162306a36Sopenharmony_ci struct va_format vaf = { 7262306a36Sopenharmony_ci .fmt = fmt, 7362306a36Sopenharmony_ci }; 7462306a36Sopenharmony_ci va_list args; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci va_start(args, fmt); 7762306a36Sopenharmony_ci vaf.va = &args; 7862306a36Sopenharmony_ci#ifdef CONFIG_IWLWIFI_DEBUG 7962306a36Sopenharmony_ci if (iwl_have_debug_level(level) && 8062306a36Sopenharmony_ci (!limit || net_ratelimit())) 8162306a36Sopenharmony_ci dev_printk(KERN_DEBUG, dev, "%s %pV", function, &vaf); 8262306a36Sopenharmony_ci#endif 8362306a36Sopenharmony_ci trace_iwlwifi_dbg(level, function, &vaf); 8462306a36Sopenharmony_ci va_end(args); 8562306a36Sopenharmony_ci} 8662306a36Sopenharmony_ciIWL_EXPORT_SYMBOL(__iwl_dbg); 8762306a36Sopenharmony_ci#endif 88