0001
0002
0003
0004
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
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 }