13287e96aSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 261d8658bSDupuis, Chad /* 361d8658bSDupuis, Chad * QLogic FCoE Offload Driver 45d1c8b5bSChad Dupuis * Copyright (c) 2016-2018 Cavium Inc. 561d8658bSDupuis, Chad */ 661d8658bSDupuis, Chad #include "qedf_dbg.h" 761d8658bSDupuis, Chad #include <linux/vmalloc.h> 861d8658bSDupuis, Chad 961d8658bSDupuis, Chad void 1061d8658bSDupuis, Chad qedf_dbg_err(struct qedf_dbg_ctx *qedf, const char *func, u32 line, 1161d8658bSDupuis, Chad const char *fmt, ...) 1261d8658bSDupuis, Chad { 1361d8658bSDupuis, Chad va_list va; 1461d8658bSDupuis, Chad struct va_format vaf; 1561d8658bSDupuis, Chad 1661d8658bSDupuis, Chad va_start(va, fmt); 1761d8658bSDupuis, Chad 1861d8658bSDupuis, Chad vaf.fmt = fmt; 1961d8658bSDupuis, Chad vaf.va = &va; 2061d8658bSDupuis, Chad 2161d8658bSDupuis, Chad if (likely(qedf) && likely(qedf->pdev)) 2261d8658bSDupuis, Chad pr_err("[%s]:[%s:%d]:%d: %pV", dev_name(&(qedf->pdev->dev)), 2365b1dc99SColin Ian King func, line, qedf->host_no, &vaf); 2461d8658bSDupuis, Chad else 2565b1dc99SColin Ian King pr_err("[0000:00:00.0]:[%s:%d]: %pV", func, line, &vaf); 2661d8658bSDupuis, Chad 2761d8658bSDupuis, Chad va_end(va); 2861d8658bSDupuis, Chad } 2961d8658bSDupuis, Chad 3061d8658bSDupuis, Chad void 3161d8658bSDupuis, Chad qedf_dbg_warn(struct qedf_dbg_ctx *qedf, const char *func, u32 line, 3261d8658bSDupuis, Chad const char *fmt, ...) 3361d8658bSDupuis, Chad { 3461d8658bSDupuis, Chad va_list va; 3561d8658bSDupuis, Chad struct va_format vaf; 3661d8658bSDupuis, Chad 3761d8658bSDupuis, Chad va_start(va, fmt); 3861d8658bSDupuis, Chad 3961d8658bSDupuis, Chad vaf.fmt = fmt; 4061d8658bSDupuis, Chad vaf.va = &va; 4161d8658bSDupuis, Chad 4261d8658bSDupuis, Chad if (!(qedf_debug & QEDF_LOG_WARN)) 4361d8658bSDupuis, Chad goto ret; 4461d8658bSDupuis, Chad 4561d8658bSDupuis, Chad if (likely(qedf) && likely(qedf->pdev)) 4661d8658bSDupuis, Chad pr_warn("[%s]:[%s:%d]:%d: %pV", dev_name(&(qedf->pdev->dev)), 4765b1dc99SColin Ian King func, line, qedf->host_no, &vaf); 4861d8658bSDupuis, Chad else 4965b1dc99SColin Ian King pr_warn("[0000:00:00.0]:[%s:%d]: %pV", func, line, &vaf); 5061d8658bSDupuis, Chad 5161d8658bSDupuis, Chad ret: 5261d8658bSDupuis, Chad va_end(va); 5361d8658bSDupuis, Chad } 5461d8658bSDupuis, Chad 5561d8658bSDupuis, Chad void 5661d8658bSDupuis, Chad qedf_dbg_notice(struct qedf_dbg_ctx *qedf, const char *func, u32 line, 5761d8658bSDupuis, Chad const char *fmt, ...) 5861d8658bSDupuis, Chad { 5961d8658bSDupuis, Chad va_list va; 6061d8658bSDupuis, Chad struct va_format vaf; 6161d8658bSDupuis, Chad 6261d8658bSDupuis, Chad va_start(va, fmt); 6361d8658bSDupuis, Chad 6461d8658bSDupuis, Chad vaf.fmt = fmt; 6561d8658bSDupuis, Chad vaf.va = &va; 6661d8658bSDupuis, Chad 6761d8658bSDupuis, Chad if (!(qedf_debug & QEDF_LOG_NOTICE)) 6861d8658bSDupuis, Chad goto ret; 6961d8658bSDupuis, Chad 7061d8658bSDupuis, Chad if (likely(qedf) && likely(qedf->pdev)) 7161d8658bSDupuis, Chad pr_notice("[%s]:[%s:%d]:%d: %pV", 7265b1dc99SColin Ian King dev_name(&(qedf->pdev->dev)), func, line, 7361d8658bSDupuis, Chad qedf->host_no, &vaf); 7461d8658bSDupuis, Chad else 7565b1dc99SColin Ian King pr_notice("[0000:00:00.0]:[%s:%d]: %pV", func, line, &vaf); 7661d8658bSDupuis, Chad 7761d8658bSDupuis, Chad ret: 7861d8658bSDupuis, Chad va_end(va); 7961d8658bSDupuis, Chad } 8061d8658bSDupuis, Chad 8161d8658bSDupuis, Chad void 8261d8658bSDupuis, Chad qedf_dbg_info(struct qedf_dbg_ctx *qedf, const char *func, u32 line, 8361d8658bSDupuis, Chad u32 level, const char *fmt, ...) 8461d8658bSDupuis, Chad { 8561d8658bSDupuis, Chad va_list va; 8661d8658bSDupuis, Chad struct va_format vaf; 8761d8658bSDupuis, Chad 8861d8658bSDupuis, Chad va_start(va, fmt); 8961d8658bSDupuis, Chad 9061d8658bSDupuis, Chad vaf.fmt = fmt; 9161d8658bSDupuis, Chad vaf.va = &va; 9261d8658bSDupuis, Chad 9361d8658bSDupuis, Chad if (!(qedf_debug & level)) 9461d8658bSDupuis, Chad goto ret; 9561d8658bSDupuis, Chad 9661d8658bSDupuis, Chad if (likely(qedf) && likely(qedf->pdev)) 9761d8658bSDupuis, Chad pr_info("[%s]:[%s:%d]:%d: %pV", dev_name(&(qedf->pdev->dev)), 9865b1dc99SColin Ian King func, line, qedf->host_no, &vaf); 9961d8658bSDupuis, Chad else 10065b1dc99SColin Ian King pr_info("[0000:00:00.0]:[%s:%d]: %pV", func, line, &vaf); 10161d8658bSDupuis, Chad 10261d8658bSDupuis, Chad ret: 10361d8658bSDupuis, Chad va_end(va); 10461d8658bSDupuis, Chad } 10561d8658bSDupuis, Chad 10661d8658bSDupuis, Chad int 10761d8658bSDupuis, Chad qedf_alloc_grc_dump_buf(u8 **buf, uint32_t len) 10861d8658bSDupuis, Chad { 10961d8658bSDupuis, Chad *buf = vmalloc(len); 11061d8658bSDupuis, Chad if (!(*buf)) 11161d8658bSDupuis, Chad return -ENOMEM; 11261d8658bSDupuis, Chad 11361d8658bSDupuis, Chad memset(*buf, 0, len); 11461d8658bSDupuis, Chad return 0; 11561d8658bSDupuis, Chad } 11661d8658bSDupuis, Chad 11761d8658bSDupuis, Chad void 11861d8658bSDupuis, Chad qedf_free_grc_dump_buf(uint8_t **buf) 11961d8658bSDupuis, Chad { 12061d8658bSDupuis, Chad vfree(*buf); 12161d8658bSDupuis, Chad *buf = NULL; 12261d8658bSDupuis, Chad } 12361d8658bSDupuis, Chad 12461d8658bSDupuis, Chad int 12561d8658bSDupuis, Chad qedf_get_grc_dump(struct qed_dev *cdev, const struct qed_common_ops *common, 12661d8658bSDupuis, Chad u8 **buf, uint32_t *grcsize) 12761d8658bSDupuis, Chad { 12861d8658bSDupuis, Chad if (!*buf) 12961d8658bSDupuis, Chad return -EINVAL; 13061d8658bSDupuis, Chad 1314b9b7fabSChad Dupuis return common->dbg_all_data(cdev, *buf); 13261d8658bSDupuis, Chad } 13361d8658bSDupuis, Chad 13461d8658bSDupuis, Chad void 13561d8658bSDupuis, Chad qedf_uevent_emit(struct Scsi_Host *shost, u32 code, char *msg) 13661d8658bSDupuis, Chad { 13761d8658bSDupuis, Chad char event_string[40]; 13861d8658bSDupuis, Chad char *envp[] = {event_string, NULL}; 13961d8658bSDupuis, Chad 14061d8658bSDupuis, Chad memset(event_string, 0, sizeof(event_string)); 14161d8658bSDupuis, Chad switch (code) { 14261d8658bSDupuis, Chad case QEDF_UEVENT_CODE_GRCDUMP: 14361d8658bSDupuis, Chad if (msg) 144a8db6140SArnd Bergmann strscpy(event_string, msg, sizeof(event_string)); 14561d8658bSDupuis, Chad else 14661d8658bSDupuis, Chad sprintf(event_string, "GRCDUMP=%u", shost->host_no); 14761d8658bSDupuis, Chad break; 14861d8658bSDupuis, Chad default: 14961d8658bSDupuis, Chad /* do nothing */ 15061d8658bSDupuis, Chad break; 15161d8658bSDupuis, Chad } 15261d8658bSDupuis, Chad 15361d8658bSDupuis, Chad kobject_uevent_env(&shost->shost_gendev.kobj, KOBJ_CHANGE, envp); 15461d8658bSDupuis, Chad } 15561d8658bSDupuis, Chad 15661d8658bSDupuis, Chad int 15761d8658bSDupuis, Chad qedf_create_sysfs_attr(struct Scsi_Host *shost, struct sysfs_bin_attrs *iter) 15861d8658bSDupuis, Chad { 15961d8658bSDupuis, Chad int ret = 0; 16061d8658bSDupuis, Chad 16161d8658bSDupuis, Chad for (; iter->name; iter++) { 16261d8658bSDupuis, Chad ret = sysfs_create_bin_file(&shost->shost_gendev.kobj, 16361d8658bSDupuis, Chad iter->attr); 16461d8658bSDupuis, Chad if (ret) 16561d8658bSDupuis, Chad pr_err("Unable to create sysfs %s attr, err(%d).\n", 16661d8658bSDupuis, Chad iter->name, ret); 16761d8658bSDupuis, Chad } 16861d8658bSDupuis, Chad return ret; 16961d8658bSDupuis, Chad } 17061d8658bSDupuis, Chad 17161d8658bSDupuis, Chad void 17261d8658bSDupuis, Chad qedf_remove_sysfs_attr(struct Scsi_Host *shost, struct sysfs_bin_attrs *iter) 17361d8658bSDupuis, Chad { 17461d8658bSDupuis, Chad for (; iter->name; iter++) 17561d8658bSDupuis, Chad sysfs_remove_bin_file(&shost->shost_gendev.kobj, iter->attr); 17661d8658bSDupuis, Chad } 177