^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * QLogic FCoE Offload Driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (c) 2016-2018 Cavium Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include "qedf_dbg.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/vmalloc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) qedf_dbg_err(struct qedf_dbg_ctx *qedf, const char *func, u32 line,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) const char *fmt, ...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) va_list va;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) struct va_format vaf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) va_start(va, fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) vaf.fmt = fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) vaf.va = &va;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) if (likely(qedf) && likely(qedf->pdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) pr_err("[%s]:[%s:%d]:%d: %pV", dev_name(&(qedf->pdev->dev)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) func, line, qedf->host_no, &vaf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) pr_err("[0000:00:00.0]:[%s:%d]: %pV", func, line, &vaf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) va_end(va);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) qedf_dbg_warn(struct qedf_dbg_ctx *qedf, const char *func, u32 line,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) const char *fmt, ...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) va_list va;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) struct va_format vaf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) va_start(va, fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) vaf.fmt = fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) vaf.va = &va;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) if (!(qedf_debug & QEDF_LOG_WARN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) goto ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) if (likely(qedf) && likely(qedf->pdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) pr_warn("[%s]:[%s:%d]:%d: %pV", dev_name(&(qedf->pdev->dev)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) func, line, qedf->host_no, &vaf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) pr_warn("[0000:00:00.0]:[%s:%d]: %pV", func, line, &vaf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) ret:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) va_end(va);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) qedf_dbg_notice(struct qedf_dbg_ctx *qedf, const char *func, u32 line,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) const char *fmt, ...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) va_list va;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) struct va_format vaf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) va_start(va, fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) vaf.fmt = fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) vaf.va = &va;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) if (!(qedf_debug & QEDF_LOG_NOTICE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) goto ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) if (likely(qedf) && likely(qedf->pdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) pr_notice("[%s]:[%s:%d]:%d: %pV",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) dev_name(&(qedf->pdev->dev)), func, line,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) qedf->host_no, &vaf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) pr_notice("[0000:00:00.0]:[%s:%d]: %pV", func, line, &vaf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) ret:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) va_end(va);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) qedf_dbg_info(struct qedf_dbg_ctx *qedf, const char *func, u32 line,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) u32 level, const char *fmt, ...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) va_list va;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) struct va_format vaf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) va_start(va, fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) vaf.fmt = fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) vaf.va = &va;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) if (!(qedf_debug & level))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) goto ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) if (likely(qedf) && likely(qedf->pdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) pr_info("[%s]:[%s:%d]:%d: %pV", dev_name(&(qedf->pdev->dev)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) func, line, qedf->host_no, &vaf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) pr_info("[0000:00:00.0]:[%s:%d]: %pV", func, line, &vaf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) ret:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) va_end(va);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) qedf_alloc_grc_dump_buf(u8 **buf, uint32_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) *buf = vmalloc(len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) if (!(*buf))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) memset(*buf, 0, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) qedf_free_grc_dump_buf(uint8_t **buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) vfree(*buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) *buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) qedf_get_grc_dump(struct qed_dev *cdev, const struct qed_common_ops *common,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) u8 **buf, uint32_t *grcsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) if (!*buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) return common->dbg_all_data(cdev, *buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) qedf_uevent_emit(struct Scsi_Host *shost, u32 code, char *msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) char event_string[40];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) char *envp[] = {event_string, NULL};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) memset(event_string, 0, sizeof(event_string));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) switch (code) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) case QEDF_UEVENT_CODE_GRCDUMP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) if (msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) strscpy(event_string, msg, sizeof(event_string));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) sprintf(event_string, "GRCDUMP=%u", shost->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) /* do nothing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) kobject_uevent_env(&shost->shost_gendev.kobj, KOBJ_CHANGE, envp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) qedf_create_sysfs_attr(struct Scsi_Host *shost, struct sysfs_bin_attrs *iter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) for (; iter->name; iter++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) ret = sysfs_create_bin_file(&shost->shost_gendev.kobj,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) iter->attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) pr_err("Unable to create sysfs %s attr, err(%d).\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) iter->name, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) qedf_remove_sysfs_attr(struct Scsi_Host *shost, struct sysfs_bin_attrs *iter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) for (; iter->name; iter++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) sysfs_remove_bin_file(&shost->shost_gendev.kobj, iter->attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) }