xref: /openbmc/linux/drivers/scsi/qedf/qedf_dbg.c (revision 2a38d2a8)
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
qedf_dbg_err(struct qedf_dbg_ctx * qedf,const char * func,u32 line,const char * fmt,...)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
qedf_dbg_warn(struct qedf_dbg_ctx * qedf,const char * func,u32 line,const char * fmt,...)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
qedf_dbg_notice(struct qedf_dbg_ctx * qedf,const char * func,u32 line,const char * fmt,...)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
qedf_dbg_info(struct qedf_dbg_ctx * qedf,const char * func,u32 line,u32 level,const char * fmt,...)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
qedf_alloc_grc_dump_buf(u8 ** buf,uint32_t len)10761d8658bSDupuis, Chad qedf_alloc_grc_dump_buf(u8 **buf, uint32_t len)
10861d8658bSDupuis, Chad {
109*2a38d2a8SYang Yingliang 		*buf = vzalloc(len);
11061d8658bSDupuis, Chad 		if (!(*buf))
11161d8658bSDupuis, Chad 			return -ENOMEM;
11261d8658bSDupuis, Chad 
11361d8658bSDupuis, Chad 		return 0;
11461d8658bSDupuis, Chad }
11561d8658bSDupuis, Chad 
11661d8658bSDupuis, Chad void
qedf_free_grc_dump_buf(uint8_t ** buf)11761d8658bSDupuis, Chad qedf_free_grc_dump_buf(uint8_t **buf)
11861d8658bSDupuis, Chad {
11961d8658bSDupuis, Chad 		vfree(*buf);
12061d8658bSDupuis, Chad 		*buf = NULL;
12161d8658bSDupuis, Chad }
12261d8658bSDupuis, Chad 
12361d8658bSDupuis, Chad int
qedf_get_grc_dump(struct qed_dev * cdev,const struct qed_common_ops * common,u8 ** buf,uint32_t * grcsize)12461d8658bSDupuis, Chad qedf_get_grc_dump(struct qed_dev *cdev, const struct qed_common_ops *common,
12561d8658bSDupuis, Chad 		   u8 **buf, uint32_t *grcsize)
12661d8658bSDupuis, Chad {
12761d8658bSDupuis, Chad 	if (!*buf)
12861d8658bSDupuis, Chad 		return -EINVAL;
12961d8658bSDupuis, Chad 
1304b9b7fabSChad Dupuis 	return common->dbg_all_data(cdev, *buf);
13161d8658bSDupuis, Chad }
13261d8658bSDupuis, Chad 
13361d8658bSDupuis, Chad void
qedf_uevent_emit(struct Scsi_Host * shost,u32 code,char * msg)13461d8658bSDupuis, Chad qedf_uevent_emit(struct Scsi_Host *shost, u32 code, char *msg)
13561d8658bSDupuis, Chad {
13661d8658bSDupuis, Chad 	char event_string[40];
13761d8658bSDupuis, Chad 	char *envp[] = {event_string, NULL};
13861d8658bSDupuis, Chad 
13961d8658bSDupuis, Chad 	memset(event_string, 0, sizeof(event_string));
14061d8658bSDupuis, Chad 	switch (code) {
14161d8658bSDupuis, Chad 	case QEDF_UEVENT_CODE_GRCDUMP:
14261d8658bSDupuis, Chad 		if (msg)
143a8db6140SArnd Bergmann 			strscpy(event_string, msg, sizeof(event_string));
14461d8658bSDupuis, Chad 		else
14561d8658bSDupuis, Chad 			sprintf(event_string, "GRCDUMP=%u", shost->host_no);
14661d8658bSDupuis, Chad 		break;
14761d8658bSDupuis, Chad 	default:
14861d8658bSDupuis, Chad 		/* do nothing */
14961d8658bSDupuis, Chad 		break;
15061d8658bSDupuis, Chad 	}
15161d8658bSDupuis, Chad 
15261d8658bSDupuis, Chad 	kobject_uevent_env(&shost->shost_gendev.kobj, KOBJ_CHANGE, envp);
15361d8658bSDupuis, Chad }
15461d8658bSDupuis, Chad 
15561d8658bSDupuis, Chad int
qedf_create_sysfs_attr(struct Scsi_Host * shost,struct sysfs_bin_attrs * iter)15661d8658bSDupuis, Chad qedf_create_sysfs_attr(struct Scsi_Host *shost, struct sysfs_bin_attrs *iter)
15761d8658bSDupuis, Chad {
15861d8658bSDupuis, Chad 	int ret = 0;
15961d8658bSDupuis, Chad 
16061d8658bSDupuis, Chad 	for (; iter->name; iter++) {
16161d8658bSDupuis, Chad 		ret = sysfs_create_bin_file(&shost->shost_gendev.kobj,
16261d8658bSDupuis, Chad 					    iter->attr);
16361d8658bSDupuis, Chad 		if (ret)
16461d8658bSDupuis, Chad 			pr_err("Unable to create sysfs %s attr, err(%d).\n",
16561d8658bSDupuis, Chad 			       iter->name, ret);
16661d8658bSDupuis, Chad 	}
16761d8658bSDupuis, Chad 	return ret;
16861d8658bSDupuis, Chad }
16961d8658bSDupuis, Chad 
17061d8658bSDupuis, Chad void
qedf_remove_sysfs_attr(struct Scsi_Host * shost,struct sysfs_bin_attrs * iter)17161d8658bSDupuis, Chad qedf_remove_sysfs_attr(struct Scsi_Host *shost, struct sysfs_bin_attrs *iter)
17261d8658bSDupuis, Chad {
17361d8658bSDupuis, Chad 	for (; iter->name; iter++)
17461d8658bSDupuis, Chad 		sysfs_remove_bin_file(&shost->shost_gendev.kobj, iter->attr);
17561d8658bSDupuis, Chad }
176