Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  *  QLogic FCoE Offload Driver
0004  *  Copyright (c) 2016-2018 Cavium Inc.
0005  */
0006 #include "qedf_dbg.h"
0007 #include <linux/vmalloc.h>
0008 
0009 void
0010 qedf_dbg_err(struct qedf_dbg_ctx *qedf, const char *func, u32 line,
0011           const char *fmt, ...)
0012 {
0013     va_list va;
0014     struct va_format vaf;
0015 
0016     va_start(va, fmt);
0017 
0018     vaf.fmt = fmt;
0019     vaf.va = &va;
0020 
0021     if (likely(qedf) && likely(qedf->pdev))
0022         pr_err("[%s]:[%s:%d]:%d: %pV", dev_name(&(qedf->pdev->dev)),
0023             func, line, qedf->host_no, &vaf);
0024     else
0025         pr_err("[0000:00:00.0]:[%s:%d]: %pV", func, line, &vaf);
0026 
0027     va_end(va);
0028 }
0029 
0030 void
0031 qedf_dbg_warn(struct qedf_dbg_ctx *qedf, const char *func, u32 line,
0032            const char *fmt, ...)
0033 {
0034     va_list va;
0035     struct va_format vaf;
0036 
0037     va_start(va, fmt);
0038 
0039     vaf.fmt = fmt;
0040     vaf.va = &va;
0041 
0042     if (!(qedf_debug & QEDF_LOG_WARN))
0043         goto ret;
0044 
0045     if (likely(qedf) && likely(qedf->pdev))
0046         pr_warn("[%s]:[%s:%d]:%d: %pV", dev_name(&(qedf->pdev->dev)),
0047             func, line, qedf->host_no, &vaf);
0048     else
0049         pr_warn("[0000:00:00.0]:[%s:%d]: %pV", func, line, &vaf);
0050 
0051 ret:
0052     va_end(va);
0053 }
0054 
0055 void
0056 qedf_dbg_notice(struct qedf_dbg_ctx *qedf, const char *func, u32 line,
0057          const char *fmt, ...)
0058 {
0059     va_list va;
0060     struct va_format vaf;
0061 
0062     va_start(va, fmt);
0063 
0064     vaf.fmt = fmt;
0065     vaf.va = &va;
0066 
0067     if (!(qedf_debug & QEDF_LOG_NOTICE))
0068         goto ret;
0069 
0070     if (likely(qedf) && likely(qedf->pdev))
0071         pr_notice("[%s]:[%s:%d]:%d: %pV",
0072               dev_name(&(qedf->pdev->dev)), func, line,
0073               qedf->host_no, &vaf);
0074     else
0075         pr_notice("[0000:00:00.0]:[%s:%d]: %pV", func, line, &vaf);
0076 
0077 ret:
0078     va_end(va);
0079 }
0080 
0081 void
0082 qedf_dbg_info(struct qedf_dbg_ctx *qedf, const char *func, u32 line,
0083            u32 level, const char *fmt, ...)
0084 {
0085     va_list va;
0086     struct va_format vaf;
0087 
0088     va_start(va, fmt);
0089 
0090     vaf.fmt = fmt;
0091     vaf.va = &va;
0092 
0093     if (!(qedf_debug & level))
0094         goto ret;
0095 
0096     if (likely(qedf) && likely(qedf->pdev))
0097         pr_info("[%s]:[%s:%d]:%d: %pV", dev_name(&(qedf->pdev->dev)),
0098             func, line, qedf->host_no, &vaf);
0099     else
0100         pr_info("[0000:00:00.0]:[%s:%d]: %pV", func, line, &vaf);
0101 
0102 ret:
0103     va_end(va);
0104 }
0105 
0106 int
0107 qedf_alloc_grc_dump_buf(u8 **buf, uint32_t len)
0108 {
0109         *buf = vzalloc(len);
0110         if (!(*buf))
0111             return -ENOMEM;
0112 
0113         return 0;
0114 }
0115 
0116 void
0117 qedf_free_grc_dump_buf(uint8_t **buf)
0118 {
0119         vfree(*buf);
0120         *buf = NULL;
0121 }
0122 
0123 int
0124 qedf_get_grc_dump(struct qed_dev *cdev, const struct qed_common_ops *common,
0125            u8 **buf, uint32_t *grcsize)
0126 {
0127     if (!*buf)
0128         return -EINVAL;
0129 
0130     return common->dbg_all_data(cdev, *buf);
0131 }
0132 
0133 void
0134 qedf_uevent_emit(struct Scsi_Host *shost, u32 code, char *msg)
0135 {
0136     char event_string[40];
0137     char *envp[] = {event_string, NULL};
0138 
0139     memset(event_string, 0, sizeof(event_string));
0140     switch (code) {
0141     case QEDF_UEVENT_CODE_GRCDUMP:
0142         if (msg)
0143             strscpy(event_string, msg, sizeof(event_string));
0144         else
0145             sprintf(event_string, "GRCDUMP=%u", shost->host_no);
0146         break;
0147     default:
0148         /* do nothing */
0149         break;
0150     }
0151 
0152     kobject_uevent_env(&shost->shost_gendev.kobj, KOBJ_CHANGE, envp);
0153 }
0154 
0155 int
0156 qedf_create_sysfs_attr(struct Scsi_Host *shost, struct sysfs_bin_attrs *iter)
0157 {
0158     int ret = 0;
0159 
0160     for (; iter->name; iter++) {
0161         ret = sysfs_create_bin_file(&shost->shost_gendev.kobj,
0162                         iter->attr);
0163         if (ret)
0164             pr_err("Unable to create sysfs %s attr, err(%d).\n",
0165                    iter->name, ret);
0166     }
0167     return ret;
0168 }
0169 
0170 void
0171 qedf_remove_sysfs_attr(struct Scsi_Host *shost, struct sysfs_bin_attrs *iter)
0172 {
0173     for (; iter->name; iter++)
0174         sysfs_remove_bin_file(&shost->shost_gendev.kobj, iter->attr);
0175 }