| /***************************************************************************** |
| * |
| * Copyright (c) 2016-2018 Samsung Electronics Co., Ltd. All rights reserved |
| * |
| *****************************************************************************/ |
| |
| #ifndef _SCSC_LOGRING_H_ |
| #define _SCSC_LOGRING_H_ |
| #include <linux/types.h> |
| #include <linux/version.h> |
| #include <linux/types.h> |
| #include <linux/printk.h> |
| #include <linux/device.h> |
| #include <linux/sched/clock.h> |
| |
| /* NOTE_CREATING_TAGS: when adding a tag here REMEMBER to add it also |
| * where required, taking care to maintain the same ordering. |
| * (Search 4 NOTE_CREATING_TAGS) |
| * |
| * You must update "int *scsc_droplevels[]" to match. |
| */ |
| enum scsc_logring_tags { |
| FIRST_TAG, |
| FIRST_BIN_TAG = FIRST_TAG, |
| BINARY = FIRST_BIN_TAG, |
| BIN_WIFI_CTRL_RX, |
| BIN_WIFI_DATA_RX, |
| BIN_WIFI_CTRL_TX, |
| BIN_WIFI_DATA_TX, |
| LAST_BIN_TAG = BIN_WIFI_DATA_TX, |
| NO_TAG, |
| WLBT = NO_TAG, |
| WIFI_RX, |
| WIFI_TX, |
| BT_COMMON, |
| BT_H4, |
| BT_FW, |
| BT_RX, |
| BT_TX, |
| CPKTBUFF, |
| FW_LOAD, |
| FW_PANIC, |
| GDB_TRANS, |
| MIF, |
| CLK20, |
| CLK20_TEST, |
| FM, |
| FM_TEST, |
| MX_FILE, |
| MX_FW, |
| MX_SAMPLER, |
| MXLOG_TRANS, |
| MXMAN, |
| MXMAN_TEST, |
| MXMGT_TRANS, |
| MX_MMAP, |
| MX_PROC, |
| PANIC_MON, |
| PCIE_MIF, |
| PLAT_MIF, |
| KIC_COMMON, |
| WLBTD, |
| WLOG, |
| LERNA, |
| MX_CFG, |
| #ifdef CONFIG_SCSC_DEBUG_COMPATIBILITY |
| SLSI_INIT_DEINIT, |
| SLSI_NETDEV, |
| SLSI_CFG80211, |
| SLSI_MLME, |
| SLSI_SUMMARY_FRAMES, |
| SLSI_HYDRA, |
| SLSI_TX, |
| SLSI_RX, |
| SLSI_UDI, |
| SLSI_WIFI_FCQ, |
| SLSI_HIP, |
| SLSI_HIP_INIT_DEINIT, |
| SLSI_HIP_FW_DL, |
| SLSI_HIP_SDIO_OP, |
| SLSI_HIP_PS, |
| SLSI_HIP_TH, |
| SLSI_HIP_FH, |
| SLSI_HIP_SIG, |
| SLSI_FUNC_TRACE, |
| SLSI_TEST, |
| SLSI_SRC_SINK, |
| SLSI_FW_TEST, |
| SLSI_RX_BA, |
| SLSI_TDLS, |
| SLSI_GSCAN, |
| SLSI_MBULK, |
| SLSI_FLOWC, |
| SLSI_SMAPPER, |
| #endif |
| TEST_ME, |
| MAX_TAG = TEST_ME /* keep it last */ |
| }; |
| |
| |
| #define NODEV_LABEL "" |
| #define SCSC_SDEV_2_DEV(sdev) \ |
| (((sdev) && (sdev)->wiphy) ? &((sdev)->wiphy->dev) : NULL) |
| #define SCSC_NDEV_2_DEV(ndev) \ |
| ((ndev) ? SCSC_SDEV_2_DEV(((struct netdev_vif *)netdev_priv(ndev))->sdev) : NULL) |
| |
| #define SCSC_PREFIX "wlbt: " /* prepended to log statements */ |
| |
| #define SCSC_TAG_FMT(tag, fmt) SCSC_PREFIX"[" # tag "]: %-5s: - %s: "fmt |
| #define SCSC_TAG_DBG_FMT(tag, fmt) SCSC_PREFIX"[" # tag "]: %s: "fmt |
| #define SCSC_DEV_FMT(fmt) SCSC_PREFIX"%-5s: - %s: "fmt |
| #define SCSC_DBG_FMT(fmt) SCSC_PREFIX"%s: "fmt |
| |
| int scsc_logring_enable(bool logging_enable); |
| |
| #ifdef CONFIG_SCSC_PRINTK |
| |
| int scsc_printk_tag(int force, int tag, const char *fmt, ...); |
| int scsc_printk_tag_dev(int force, int tag, struct device *dev, const char *fmt, ...); |
| int scsc_printk_tag_dev_lvl(int force, int tag, struct device *dev, int lvl, const char *fmt, ...); |
| int scsc_printk_tag_lvl(int tag, int lvl, const char *fmt, ...); |
| int scsc_printk_bin(int force, int tag, int dlev, const void *start, size_t len); |
| |
| /** |
| * This fields helps in trimming the behavior respect the kernel ring buffer: |
| * - NO_FORCE_PRK: the tag-based filtering mechanism is obeyed. |
| * - FORCE_PRK: the tag-based filtering is bypassed by this macro and message |
| * always get to the kernel ring buffer |
| * - NO_ECHO_PRK: disable completely the printk redirect. |
| */ |
| #define NO_FORCE_PRK 0 |
| #define FORCE_PRK 1 |
| #define NO_ECHO_PRK 2 |
| |
| #define SCSC_PRINTK(args ...) scsc_printk_tag(NO_FORCE_PRK, WLBT, \ |
| args) |
| |
| #define SCSC_PRINTK_TAG(tag, args ...) scsc_printk_tag(NO_FORCE_PRK, (tag), \ |
| args) |
| #define SCSC_PRINTK_BIN(start, len) scsc_printk_bin(NO_FORCE_PRK, BINARY, \ |
| -1, (start), (len)) |
| |
| #define SCSC_EMERG(fmt, args...) scsc_printk_tag(NO_FORCE_PRK, WLBT, \ |
| KERN_EMERG SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_ALERT(fmt, args...) scsc_printk_tag(NO_FORCE_PRK, WLBT, \ |
| KERN_ALERT SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_CRIT(fmt, args...) scsc_printk_tag(NO_FORCE_PRK, WLBT, \ |
| KERN_CRIT SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_ERR(fmt, args...) scsc_printk_tag(NO_FORCE_PRK, WLBT, \ |
| KERN_ERR SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_WARNING(fmt, args...) scsc_printk_tag(NO_FORCE_PRK, WLBT, \ |
| KERN_WARNING SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_NOTICE(fmt, args...) scsc_printk_tag(NO_FORCE_PRK, WLBT, \ |
| KERN_NOTICE SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_INFO(fmt, args...) scsc_printk_tag(NO_FORCE_PRK, WLBT, \ |
| KERN_INFO SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_DEBUG(fmt, args...) scsc_printk_tag(NO_FORCE_PRK, WLBT, \ |
| KERN_DEBUG SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_EMERG(tag, fmt, args...) scsc_printk_tag(NO_FORCE_PRK, (tag), \ |
| KERN_EMERG SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_ALERT(tag, fmt, args...) scsc_printk_tag(NO_FORCE_PRK, (tag), \ |
| KERN_ALERT SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_CRIT(tag, fmt, args ...) scsc_printk_tag(NO_FORCE_PRK, (tag), \ |
| KERN_CRIT SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_ERR(tag, fmt, args...) scsc_printk_tag(NO_FORCE_PRK, (tag), \ |
| KERN_ERR SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_WARNING(tag, fmt, args...) scsc_printk_tag(NO_FORCE_PRK, (tag), \ |
| KERN_WARNING SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_NOTICE(tag, fmt, args...) scsc_printk_tag(NO_FORCE_PRK, (tag), \ |
| KERN_NOTICE SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_INFO(tag, fmt, args...) scsc_printk_tag(NO_FORCE_PRK, (tag), \ |
| KERN_INFO SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_DEBUG(tag, fmt, args...) scsc_printk_tag(NO_FORCE_PRK, (tag), \ |
| KERN_DEBUG SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_ERR_SDEV(sdev, tag, fmt, args...) \ |
| scsc_printk_tag_dev(NO_FORCE_PRK, (tag), SCSC_SDEV_2_DEV((sdev)), \ |
| KERN_ERR SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_WARNING_SDEV(sdev, tag, fmt, args...) \ |
| scsc_printk_tag_dev(NO_FORCE_PRK, (tag), SCSC_SDEV_2_DEV((sdev)), \ |
| KERN_WARNING SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_INFO_SDEV(sdev, tag, fmt, args...) \ |
| scsc_printk_tag_dev(NO_FORCE_PRK, (tag), SCSC_SDEV_2_DEV((sdev)), \ |
| KERN_INFO SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_DEBUG_SDEV(sdev, tag, fmt, args...) \ |
| scsc_printk_tag_dev(NO_FORCE_PRK, (tag), SCSC_SDEV_2_DEV((sdev)), \ |
| KERN_DEBUG SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_ERR_NDEV(ndev, tag, fmt, args...) \ |
| scsc_printk_tag_dev(NO_FORCE_PRK, (tag), SCSC_NDEV_2_DEV((ndev)), \ |
| KERN_ERR SCSC_DEV_FMT(fmt), \ |
| ((ndev) ? netdev_name(ndev) : NODEV_LABEL), \ |
| __func__, ## args) |
| #define SCSC_TAG_WARNING_NDEV(ndev, tag, fmt, args...) \ |
| scsc_printk_tag_dev(NO_FORCE_PRK, (tag), SCSC_NDEV_2_DEV((ndev)), \ |
| KERN_WARNING SCSC_DEV_FMT(fmt), \ |
| ((ndev) ? netdev_name(ndev) : NODEV_LABEL), \ |
| __func__, ## args) |
| #define SCSC_TAG_INFO_NDEV(ndev, tag, fmt, args...) \ |
| scsc_printk_tag_dev(NO_FORCE_PRK, (tag), SCSC_NDEV_2_DEV((ndev)), \ |
| KERN_INFO SCSC_DEV_FMT(fmt), \ |
| ((ndev) ? netdev_name(ndev) : NODEV_LABEL), \ |
| __func__, ## args) |
| #define SCSC_TAG_DEBUG_NDEV(ndev, tag, fmt, args...) \ |
| scsc_printk_tag_dev(NO_FORCE_PRK, (tag), SCSC_NDEV_2_DEV((ndev)), \ |
| KERN_DEBUG SCSC_DEV_FMT(fmt), \ |
| ((ndev) ? netdev_name(ndev) : NODEV_LABEL), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_ERR_DEV(tag, dev, fmt, args...) \ |
| scsc_printk_tag_dev(NO_FORCE_PRK, (tag), dev, \ |
| KERN_ERR SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_WARNING_DEV(tag, dev, fmt, args...) \ |
| scsc_printk_tag_dev(NO_FORCE_PRK, (tag), dev, \ |
| KERN_WARNING SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_INFO_DEV(tag, dev, fmt, args...) \ |
| scsc_printk_tag_dev(NO_FORCE_PRK, (tag), dev, \ |
| KERN_INFO SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_DEBUG_DEV(tag, dev, fmt, args...) \ |
| scsc_printk_tag_dev(NO_FORCE_PRK, (tag), dev, \ |
| KERN_DEBUG SCSC_DBG_FMT(fmt), \ |
| __func__, ## args) |
| |
| #define SCSC_ERR_SDEV(sdev, fmt, args...) \ |
| SCSC_TAG_ERR_SDEV(sdev, WLBT, fmt, ## args) |
| #define SCSC_WARNING_SDEV(sdev, fmt, args...) \ |
| SCSC_TAG_WARNING_SDEV(sdev, WLBT, fmt, ## args) |
| #define SCSC_INFO_SDEV(sdev, fmt, args...) \ |
| SCSC_TAG_INFO_SDEV(sdev, WLBT, fmt, ## args) |
| |
| #define SCSC_ERR_NDEV(ndev, fmt, args...) \ |
| SCSC_TAG_ERR_NDEV(ndev, WLBT, fmt, ## args) |
| #define SCSC_WARNING_NDEV(ndev, fmt, args...) \ |
| SCSC_TAG_WARNING_NDEV(ndev, WLBT, fmt, ## args) |
| #define SCSC_INFO_NDEV(ndev, fmt, args...) \ |
| SCSC_TAG_INFO_NDEV(ndev, WLBT, fmt, ## args) |
| |
| |
| #define SCSC_BIN_EMERG(start, len) scsc_printk_bin(NO_FORCE_PRK, BINARY, 0, \ |
| (start), (len)) |
| #define SCSC_BIN_ALERT(start, len) scsc_printk_bin(NO_FORCE_PRK, BINARY, 1, \ |
| (start), (len)) |
| #define SCSC_BIN_CRIT(start, len) scsc_printk_bin(NO_FORCE_PRK, BINARY, 2, \ |
| (start), (len)) |
| #define SCSC_BIN_ERR(start, len) scsc_printk_bin(NO_FORCE_PRK, BINARY, 3, \ |
| (start), (len)) |
| #define SCSC_BIN_WARNING(start, len) scsc_printk_bin(NO_FORCE_PRK, BINARY, 4, \ |
| (start), (len)) |
| #define SCSC_BIN_NOTICE(start, len) scsc_printk_bin(NO_FORCE_PRK, BINARY, 5, \ |
| (start), (len)) |
| #define SCSC_BIN_INFO(start, len) scsc_printk_bin(NO_FORCE_PRK, BINARY, 6, \ |
| (start), (len)) |
| #define SCSC_BIN_DEBUG(start, len) scsc_printk_bin(NO_FORCE_PRK, BINARY, 7, \ |
| (start), (len)) |
| |
| #define SCSC_BIN_TAG_EMERG(tag, start, len) scsc_printk_bin(NO_FORCE_PRK, (tag), 0, \ |
| (start), (len)) |
| #define SCSC_BIN_TAG_ALERT(tag, start, len) scsc_printk_bin(NO_FORCE_PRK, (tag), 1, \ |
| (start), (len)) |
| #define SCSC_BIN_TAG_CRIT(tag, start, len) scsc_printk_bin(NO_FORCE_PRK, (tag), 2, \ |
| (start), (len)) |
| #define SCSC_BIN_TAG_ERR(tag, start, len) scsc_printk_bin(NO_FORCE_PRK, (tag), 3, \ |
| (start), (len)) |
| #define SCSC_BIN_TAG_WARNING(tag, start, len) scsc_printk_bin(NO_FORCE_PRK, (tag), 4, \ |
| (start), (len)) |
| #define SCSC_BIN_TAG_NOTICE(tag, start, len) scsc_printk_bin(NO_FORCE_PRK, (tag), 5, \ |
| (start), (len)) |
| #define SCSC_BIN_TAG_INFO(tag, start, len) scsc_printk_bin(NO_FORCE_PRK, (tag), 6, \ |
| (start), (len)) |
| #define SCSC_BIN_TAG_DEBUG(tag, start, len) scsc_printk_bin(NO_FORCE_PRK, (tag), 7, \ |
| (start), (len)) |
| |
| |
| /* |
| * These macros forces a redundant copy of their output to kernel log buffer and |
| * console through standard kernel facilities, NO matter how the tag-based |
| * filtering is configured and NO matter what the value in |
| * scsc_redirect_to_printk_droplvl module param. |
| */ |
| #define SCSC_PRINTK_FF(args ...) scsc_printk_tag(FORCE_PRK, WLBT, args) |
| #define SCSC_PRINTK_TAG_FF(tag, args ...) scsc_printk_tag(FORCE_PRK, (tag), args) |
| #define SCSC_PRINTK_BIN_FF(start, len) scsc_printk_bin(FORCE_PRK, -1, \ |
| (start), (len)) |
| |
| #define SCSC_EMERG_FF(args ...) scsc_printk_tag(FORCE_PRK, WLBT, \ |
| KERN_EMERG SCSC_PREFIX args) |
| #define SCSC_ALERT_FF(args ...) scsc_printk_tag(FORCE_PRK, WLBT, \ |
| KERN_ALERT SCSC_PREFIX args) |
| #define SCSC_CRIT_FF(args ...) scsc_printk_tag(FORCE_PRK, WLBT, \ |
| KERN_CRIT SCSC_PREFIX args) |
| #define SCSC_ERR_FF(args ...) scsc_printk_tag(FORCE_PRK, WLBT, \ |
| KERN_ERR SCSC_PREFIX args) |
| #define SCSC_WARNING_FF(args ...) scsc_printk_tag(FORCE_PRK, WLBT, \ |
| KERN_WARNING SCSC_PREFIX args) |
| #define SCSC_NOTICE_FF(args ...) scsc_printk_tag(FORCE_PRK, WLBT, \ |
| KERN_NOTICE SCSC_PREFIX args) |
| #define SCSC_INFO_FF(args ...) scsc_printk_tag(FORCE_PRK, WLBT, \ |
| KERN_INFO SCSC_PREFIX args) |
| #define SCSC_DEBUG_FF(args ...) scsc_printk_tag(FORCE_PRK, WLBT, \ |
| KERN_DEBUG SCSC_PREFIX args) |
| |
| #define SCSC_TAG_EMERG_FF(tag, args ...) scsc_printk_tag(FORCE_PRK, (tag), \ |
| KERN_EMERG SCSC_PREFIX args) |
| #define SCSC_TAG_ALERT_FF(tag, args ...) scsc_printk_tag(FORCE_PRK, (tag), \ |
| KERN_ALERT SCSC_PREFIX args) |
| #define SCSC_TAG_CRIT_FF(tag, args ...) scsc_printk_tag(FORCE_PRK, (tag), \ |
| KERN_CRIT SCSC_PREFIX args) |
| #define SCSC_TAG_ERR_FF(tag, args ...) scsc_printk_tag(FORCE_PRK, (tag), \ |
| KERN_ERR SCSC_PREFIX args) |
| #define SCSC_TAG_WARNING_FF(tag, args ...) scsc_printk_tag(FORCE_PRK, (tag), \ |
| KERN_WARNING SCSC_PREFIX args) |
| #define SCSC_TAG_NOTICE_FF(tag, args ...) scsc_printk_tag(FORCE_PRK, (tag), \ |
| KERN_NOTICE SCSC_PREFIX args) |
| #define SCSC_TAG_INFO_FF(tag, args ...) scsc_printk_tag(FORCE_PRK, (tag), \ |
| KERN_INFO SCSC_PREFIX args) |
| #define SCSC_TAG_DEBUG_FF(tag, args ...) scsc_printk_tag(FORCE_PRK, (tag), \ |
| KERN_DEBUG SCSC_PREFIX args) |
| |
| #define SCSC_BIN_EMERG_FF(start, len) scsc_printk_bin(FORCE_PRK, 0, \ |
| (start), (len)) |
| #define SCSC_BIN_ALERT_FF(start, len) scsc_printk_bin(FORCE_PRK, 1, \ |
| (start), (len)) |
| #define SCSC_BIN_CRIT_FF(start, len) scsc_printk_bin(FORCE_PRK, 2, \ |
| (start), (len)) |
| #define SCSC_BIN_ERR_FF(start, len) scsc_printk_bin(FORCE_PRK, 3, \ |
| (start), (len)) |
| #define SCSC_BIN_WARNING_FF(start, len) scsc_printk_bin(FORCE_PRK, 4, \ |
| (start), (len)) |
| #define SCSC_BIN_NOTICE_FF(start, len) scsc_printk_bin(FORCE_PRK, 5, \ |
| (start), (len)) |
| #define SCSC_BIN_INFO_FF(start, len) scsc_printk_bin(FORCE_PRK, 6, \ |
| (start), (len)) |
| #define SCSC_BIN_DEBUG_FF(start, len) scsc_printk_bin(FORCE_PRK, 7, \ |
| (start), (len)) |
| |
| #define SCSC_TAG_LVL(tag, lvl, fmt, args...) \ |
| scsc_printk_tag_lvl((tag), (lvl), fmt, ## args) |
| |
| #define SCSC_TAG_DEV_LVL(tag, lvl, dev, fmt, args...) \ |
| scsc_printk_tag_dev_lvl(NO_FORCE_PRK, (tag), (dev), (lvl), fmt, ## args) |
| |
| |
| #define SCSC_TAG_DBG1_SDEV(sdev, tag, fmt, args...) \ |
| SCSC_TAG_DEV_LVL((tag), 7, SCSC_SDEV_2_DEV((sdev)), \ |
| SCSC_DBG_FMT(fmt), __func__, ## args) |
| |
| #define SCSC_TAG_DBG2_SDEV(sdev, tag, fmt, args...) \ |
| SCSC_TAG_DEV_LVL((tag), 8, SCSC_SDEV_2_DEV((sdev)), \ |
| SCSC_DBG_FMT(fmt), __func__, ## args) |
| |
| #define SCSC_TAG_DBG3_SDEV(sdev, tag, fmt, args...) \ |
| SCSC_TAG_DEV_LVL((tag), 9, SCSC_SDEV_2_DEV((sdev)), \ |
| SCSC_DBG_FMT(fmt), __func__, ## args) |
| |
| #define SCSC_TAG_DBG4_SDEV(sdev, tag, fmt, args...) \ |
| SCSC_TAG_DEV_LVL((tag), 10, SCSC_SDEV_2_DEV((sdev)), \ |
| SCSC_DBG_FMT(fmt), __func__, ## args) |
| |
| #define SCSC_TAG_DBG1_NDEV(ndev, tag, fmt, args...) \ |
| SCSC_TAG_DEV_LVL((tag), 7, SCSC_NDEV_2_DEV((ndev)), SCSC_DEV_FMT(fmt), \ |
| ((ndev) ? netdev_name(ndev) : NODEV_LABEL), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_DBG2_NDEV(ndev, tag, fmt, args...) \ |
| SCSC_TAG_DEV_LVL((tag), 8, SCSC_NDEV_2_DEV((ndev)), SCSC_DEV_FMT(fmt), \ |
| ((ndev) ? netdev_name(ndev) : NODEV_LABEL), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_DBG3_NDEV(ndev, tag, fmt, args...) \ |
| SCSC_TAG_DEV_LVL((tag), 9, SCSC_NDEV_2_DEV((ndev)), SCSC_DEV_FMT(fmt), \ |
| ((ndev) ? netdev_name(ndev) : NODEV_LABEL), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_DBG4_NDEV(ndev, tag, fmt, args...) \ |
| SCSC_TAG_DEV_LVL((tag), 10, SCSC_NDEV_2_DEV((ndev)), SCSC_DEV_FMT(fmt), \ |
| ((ndev) ? netdev_name(ndev) : NODEV_LABEL), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_DBG1(tag, fmt, args ...) \ |
| SCSC_TAG_LVL((tag), 7, fmt, ## args) |
| |
| #define SCSC_TAG_DBG2(tag, fmt, args ...) \ |
| SCSC_TAG_LVL((tag), 8, fmt, ## args) |
| |
| #define SCSC_TAG_DBG3(tag, fmt, args ...) \ |
| SCSC_TAG_LVL((tag), 9, fmt, ## args) |
| |
| #define SCSC_TAG_DBG4(tag, fmt, args ...) \ |
| SCSC_TAG_LVL((tag), 10, fmt, ## args) |
| |
| #else /* CONFIG_SCSC_PRINTK */ |
| |
| #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)) |
| #define SCSC_TAG_LVL(tag, lvl, fmt, args...) \ |
| do {\ |
| if ((lvl) < 7)\ |
| dev_printk_emit((lvl), NULL, fmt, ## args);\ |
| } while (0) |
| #else |
| #define SCSC_TAG_DEV_LVL(tag, lvl, dev, fmt, args...) \ |
| do {\ |
| if ((lvl) < 7)\ |
| printk_emit((lvl), (dev), fmt, ## args);\ |
| } while (0) |
| #endif |
| #define SCSC_PRINTK(fmt, args ...) printk(SCSC_PREFIX fmt, ## args) |
| #define SCSC_PRINTK_TAG(tag, fmt, args ...) printk(SCSC_PREFIX "[" # tag "] "fmt, ## args) |
| #define SCSC_PRINTK_BIN(start, len) print_hex_dump(KERN_INFO, \ |
| SCSC_PREFIX"[BINARY]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_PRINTK_FF(fmt, args ...) printk(SCSC_PREFIX fmt, ## args) |
| #define SCSC_PRINTK_TAG_FF(tag, fmt, args ...) printk(SCSC_PREFIX"[" # tag "] "fmt, ## args) |
| #define SCSC_PRINTK_BIN_FF(start, len) print_hex_dump(KERN_INFO, \ |
| SCSC_PREFIX"[BINARY]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_EMERG(fmt, args...) pr_emerg(SCSC_DBG_FMT(fmt), __func__, ## args) |
| #define SCSC_ALERT(fmt, args...) pr_alert(SCSC_DBG_FMT(fmt), __func__, ## args) |
| #define SCSC_CRIT(fmt, args...) pr_crit(SCSC_DBG_FMT(fmt), __func__, ## args) |
| #define SCSC_ERR(fmt, args...) pr_err(SCSC_DBG_FMT(fmt), __func__, ## args) |
| #define SCSC_WARNING(fmt, args...) pr_warn(SCSC_DBG_FMT(fmt), __func__, ## args) |
| #define SCSC_NOTICE(fmt, args...) pr_notice(SCSC_DBG_FMT(fmt), __func__, ## args) |
| #define SCSC_INFO(fmt, args...) pr_info(SCSC_DBG_FMT(fmt), __func__, ## args) |
| #define SCSC_DEBUG(args...) do {} while (0) |
| |
| /* Reverting to pr_* keeping the [tag] */ |
| #define SCSC_TAG_EMERG(tag, fmt, args...) \ |
| pr_emerg(SCSC_TAG_DBG_FMT(tag, fmt), __func__, ## args) |
| #define SCSC_TAG_ALERT(tag, fmt, args...) \ |
| pr_alert(SCSC_TAG_DBG_FMT(tag, fmt), __func__, ## args) |
| #define SCSC_TAG_CRIT(tag, fmt, args...) \ |
| pr_crit(SCSC_TAG_DBG_FMT(tag, fmt), __func__, ## args) |
| #define SCSC_TAG_ERR(tag, fmt, args...) \ |
| pr_err(SCSC_TAG_DBG_FMT(tag, fmt), __func__, ## args) |
| #define SCSC_TAG_WARNING(tag, fmt, args...) \ |
| pr_warn(SCSC_TAG_DBG_FMT(tag, fmt), __func__, ## args) |
| #define SCSC_TAG_NOTICE(tag, fmt, args...) \ |
| pr_notice(SCSC_TAG_DBG_FMT(tag, fmt), __func__, ## args) |
| #define SCSC_TAG_INFO(tag, fmt, args...) \ |
| pr_info(SCSC_TAG_DBG_FMT(tag, fmt), __func__, ## args) |
| #define SCSC_TAG_DEBUG(tag, fmt, args...) do {} while (0) |
| |
| |
| #define SCSC_BIN_EMERG(start, len) print_hex_dump(KERN_EMERG, \ |
| SCSC_PREFIX"[BINARY]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_ALERT(start, len) print_hex_dump(KERN_ALERT, \ |
| SCSC_PREFIX"[BINARY]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_CRIT(start, len) print_hex_dump(KERN_CRIT, \ |
| SCSC_PREFIX"[BINARY]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_ERR(start, len) print_hex_dump(KERN_ERR, \ |
| SCSC_PREFIX"[BINARY]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_WARNING(start, len) print_hex_dump(KERN_WARNING, \ |
| SCSC_PREFIX"[BINARY]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_NOTICE(start, len) print_hex_dump(KERN_NOTICE, \ |
| SCSC_PREFIX"[BINARY]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_INFO(start, len) print_hex_dump(KERN_INFO, \ |
| SCSC_PREFIX"[BINARY]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_DEBUG(start, len) do {} while (0) |
| |
| |
| #define SCSC_BIN_TAG_EMERG(tag, start, len) print_hex_dump(KERN_EMERG, \ |
| SCSC_PREFIX"[" # tag "]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_TAG_ALERT(tag, start, len) print_hex_dump(KERN_ALERT, \ |
| SCSC_PREFIX"[" # tag "]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_TAG_CRIT(tag, start, len) print_hex_dump(KERN_CRIT, \ |
| SCSC_PREFIX"[" # tag "]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_TAG_ERR(tag, start, len) print_hex_dump(KERN_ERR, \ |
| SCSC_PREFIX"[" # tag "]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_TAG_WARNING(tag, start, len) print_hex_dump(KERN_WARNING, \ |
| SCSC_PREFIX"[" # tag "]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_TAG_NOTICE(tag, start, len) print_hex_dump(KERN_NOTICE, \ |
| SCSC_PREFIX"[" # tag "]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_TAG_INFO(tag, start, len) print_hex_dump(KERN_INFO, \ |
| SCSC_PREFIX"[" # tag "]->|", \ |
| DUMP_PREFIX_NONE, \ |
| 16, 1, start, \ |
| len, false) |
| |
| #define SCSC_BIN_TAG_DEBUG(tag, start, len) do {} while (0) |
| |
| |
| #define SCSC_EMERG_FF(args ...) pr_emerg(SCSC_PREFIX args) |
| #define SCSC_ALERT_FF(args ...) pr_alert(SCSC_PREFIX args) |
| #define SCSC_CRIT_FF(args ...) pr_crit(SCSC_PREFIX args) |
| #define SCSC_ERR_FF(args ...) pr_err(SCSC_PREFIX args) |
| #define SCSC_WARNING_FF(args ...) pr_warn(SCSC_PREFIX args) |
| #define SCSC_NOTICE_FF(args ...) pr_notice(SCSC_PREFIX args) |
| #define SCSC_INFO_FF(args ...) pr_info(SCSC_PREFIX args) |
| #define SCSC_DEBUG_FF(args ...) do {} while (0) |
| |
| |
| #define SCSC_TAG_EMERG_FF(tag, fmt, args ...) pr_emerg(SCSC_TAG_DBG_FMT(tag, fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_ALERT_FF(tag, fmt, args ...) pr_alert(SCSC_TAG_DBG_FMT(tag, fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_CRIT_FF(tag, fmt, args ...) pr_crit(SCSC_TAG_DBG_FMT(tag, fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_ERR_FF(tag, fmt, args ...) pr_err(SCSC_TAG_DBG_FMT(tag, fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_WARNING_FF(tag, fmt, args ...) pr_warn(SCSC_TAG_DBG_FMT(tag, fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_NOTICE_FF(tag, fmt, args ...) pr_notice(SCSC_TAG_DBG_FMT(tag, fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_INFO_FF(tag, fmt, args ...) pr_info(SCSC_TAG_DBG_FMT(tag, fmt), \ |
| __func__, ## args) |
| #define SCSC_TAG_DEBUG_FF(tag, fmt, args ...) do {} while (0) |
| |
| #define SCSC_BIN_EMERG_FF(start, len) print_hex_dump(KERN_EMERG, \ |
| SCSC_PREFIX"[BINARY]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_ALERT_FF(start, len) print_hex_dump(KERN_ALERT, \ |
| SCSC_PREFIX"[BINARY]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_CRIT_FF(start, len) print_hex_dump(KERN_CRIT, \ |
| SCSC_PREFIX"[BINARY]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_ERR_FF(start, len) print_hex_dump(KERN_ERR, \ |
| SCSC_PREFIX"[BINARY]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_WARNING_FF(start, len) print_hex_dump(KERN_WARNING, \ |
| SCSC_PREFIX"[BINARY]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_NOTICE_FF(start, len) print_hex_dump(KERN_NOTICE, \ |
| SCSC_PREFIX"[BINARY]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_INFO_FF(start, len) print_hex_dump(KERN_INFO, \ |
| SCSC_PREFIX"[BINARY]->|", \ |
| DUMP_PREFIX_ADDRESS, \ |
| 16, 4, start, \ |
| len, true) |
| |
| #define SCSC_BIN_DEBUG_FF(start, len) do {} while (0) |
| |
| |
| #define SCSC_TAG_ERR_SDEV(sdev, tag, fmt, args...) \ |
| dev_err(SCSC_SDEV_2_DEV((sdev)), SCSC_TAG_DBG_FMT(tag, fmt), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_WARNING_SDEV(sdev, tag, fmt, args...) \ |
| dev_warn(SCSC_SDEV_2_DEV((sdev)), SCSC_TAG_DBG_FMT(tag, fmt), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_INFO_SDEV(sdev, tag, fmt, args...) \ |
| dev_info(SCSC_SDEV_2_DEV((sdev)), SCSC_TAG_DBG_FMT(tag, fmt), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_DEBUG_SDEV(sdev, tag, fmt, args...) do {} while (0) |
| |
| |
| #define SCSC_TAG_ERR_NDEV(ndev, tag, fmt, args...) \ |
| dev_err(SCSC_NDEV_2_DEV((ndev)), SCSC_TAG_FMT(tag, fmt), \ |
| ((ndev) ? netdev_name(ndev) : NODEV_LABEL), __func__, ## args) |
| #define SCSC_TAG_WARNING_NDEV(ndev, tag, fmt, args...) \ |
| dev_warn(SCSC_NDEV_2_DEV((ndev)), SCSC_TAG_FMT(tag, fmt), \ |
| ((ndev) ? netdev_name(ndev) : NODEV_LABEL), __func__, ## args) |
| #define SCSC_TAG_INFO_NDEV(ndev, tag, fmt, args...) \ |
| dev_info(SCSC_NDEV_2_DEV((ndev)), SCSC_TAG_FMT(tag, fmt), \ |
| ((ndev) ? netdev_name(ndev) : NODEV_LABEL), __func__, ## args) |
| |
| #define SCSC_TAG_DEBUG_NDEV(ndev, tag, fmt, args...) do {} while (0) |
| |
| #define SCSC_TAG_ERR_DEV(tag, dev, fmt, args...) \ |
| dev_err(dev, SCSC_TAG_DBG_FMT(tag, fmt), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_WARNING_DEV(tag, dev, fmt, args...) \ |
| dev_warn(dev, SCSC_TAG_DBG_FMT(tag, fmt), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_INFO_DEV(tag, dev, fmt, args...) \ |
| dev_info(dev, SCSC_TAG_DBG_FMT(tag, fmt), \ |
| __func__, ## args) |
| |
| #define SCSC_TAG_DEBUG_DEV(tag, dev, fmt, args...) do {} while (0) |
| |
| #define SCSC_ERR_SDEV(sdev, fmt, args...) \ |
| SCSC_TAG_ERR_SDEV(sdev, WLBT, fmt, ## args) |
| #define SCSC_WARNING_SDEV(sdev, fmt, args...) \ |
| SCSC_TAG_WARNING_SDEV(sdev, WLBT, fmt, ## args) |
| #define SCSC_INFO_SDEV(sdev, fmt, args...) \ |
| SCSC_TAG_INFO_SDEV(sdev, WLBT, fmt, ## args) |
| |
| #define SCSC_ERR_NDEV(ndev, fmt, args...) \ |
| SCSC_TAG_ERR_NDEV(ndev, WLBT, fmt, ## args) |
| #define SCSC_WARNING_NDEV(ndev, fmt, args...) \ |
| SCSC_TAG_WARNING_NDEV(ndev, WLBT, fmt, ## args) |
| #define SCSC_INFO_NDEV(ndev, fmt, args...) \ |
| SCSC_TAG_INFO_NDEV(ndev, WLBT, fmt, ## args) |
| |
| |
| #define SCSC_TAG_DBG1_SDEV(sdev, tag, fmt, args...) do {} while (0) |
| #define SCSC_TAG_DBG2_SDEV(sdev, tag, fmt, args...) do {} while (0) |
| #define SCSC_TAG_DBG3_SDEV(sdev, tag, fmt, args...) do {} while (0) |
| #define SCSC_TAG_DBG4_SDEV(sdev, tag, fmt, args...) do {} while (0) |
| |
| #define SCSC_TAG_DBG1_NDEV(ndev, tag, fmt, args...) do {} while (0) |
| #define SCSC_TAG_DBG2_NDEV(ndev, tag, fmt, args...) do {} while (0) |
| #define SCSC_TAG_DBG3_NDEV(ndev, tag, fmt, args...) do {} while (0) |
| #define SCSC_TAG_DBG4_NDEV(ndev, tag, fmt, args...) do {} while (0) |
| |
| #define SCSC_TAG_DBG1(tag, fmt, args ...) do {} while (0) |
| #define SCSC_TAG_DBG2(tag, fmt, args ...) do {} while (0) |
| #define SCSC_TAG_DBG3(tag, fmt, args ...) do {} while (0) |
| #define SCSC_TAG_DBG4(tag, fmt, args ...) do {} while (0) |
| |
| #endif |
| |
| /* callbacks to mxman */ |
| struct scsc_logring_mx_cb { |
| int (*scsc_logring_register_observer)(struct scsc_logring_mx_cb *mx_cb, char *name); |
| int (*scsc_logring_unregister_observer)(struct scsc_logring_mx_cb *mx_cb, char *name); |
| }; |
| |
| int scsc_logring_register_mx_cb(struct scsc_logring_mx_cb *mx_cb); |
| int scsc_logring_unregister_mx_cb(struct scsc_logring_mx_cb *mx_cb); |
| |
| #endif /* _SCSC_LOGRING_H_ */ |