1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * QLogic iSCSI Offload Driver |
4 | * Copyright (c) 2016 Cavium Inc. |
5 | */ |
6 | |
7 | #include "qedi_dbg.h" |
8 | #include <linux/vmalloc.h> |
9 | |
10 | void |
11 | qedi_dbg_err(struct qedi_dbg_ctx *qedi, const char *func, u32 line, |
12 | const char *fmt, ...) |
13 | { |
14 | va_list va; |
15 | struct va_format vaf; |
16 | |
17 | va_start(va, fmt); |
18 | |
19 | vaf.fmt = fmt; |
20 | vaf.va = &va; |
21 | |
22 | if (likely(qedi) && likely(qedi->pdev)) |
23 | pr_err("[%s]:[%s:%d]:%d: %pV" , dev_name(&qedi->pdev->dev), |
24 | func, line, qedi->host_no, &vaf); |
25 | else |
26 | pr_err("[0000:00:00.0]:[%s:%d]: %pV" , func, line, &vaf); |
27 | |
28 | va_end(va); |
29 | } |
30 | |
31 | void |
32 | qedi_dbg_warn(struct qedi_dbg_ctx *qedi, const char *func, u32 line, |
33 | const char *fmt, ...) |
34 | { |
35 | va_list va; |
36 | struct va_format vaf; |
37 | |
38 | va_start(va, fmt); |
39 | |
40 | vaf.fmt = fmt; |
41 | vaf.va = &va; |
42 | |
43 | if (!(qedi_dbg_log & QEDI_LOG_WARN)) |
44 | goto ret; |
45 | |
46 | if (likely(qedi) && likely(qedi->pdev)) |
47 | pr_warn("[%s]:[%s:%d]:%d: %pV" , dev_name(&qedi->pdev->dev), |
48 | func, line, qedi->host_no, &vaf); |
49 | else |
50 | pr_warn("[0000:00:00.0]:[%s:%d]: %pV" , func, line, &vaf); |
51 | |
52 | ret: |
53 | va_end(va); |
54 | } |
55 | |
56 | void |
57 | qedi_dbg_notice(struct qedi_dbg_ctx *qedi, const char *func, u32 line, |
58 | const char *fmt, ...) |
59 | { |
60 | va_list va; |
61 | struct va_format vaf; |
62 | |
63 | va_start(va, fmt); |
64 | |
65 | vaf.fmt = fmt; |
66 | vaf.va = &va; |
67 | |
68 | if (!(qedi_dbg_log & QEDI_LOG_NOTICE)) |
69 | goto ret; |
70 | |
71 | if (likely(qedi) && likely(qedi->pdev)) |
72 | pr_notice("[%s]:[%s:%d]:%d: %pV" , |
73 | dev_name(&qedi->pdev->dev), func, line, |
74 | qedi->host_no, &vaf); |
75 | else |
76 | pr_notice("[0000:00:00.0]:[%s:%d]: %pV" , func, line, &vaf); |
77 | |
78 | ret: |
79 | va_end(va); |
80 | } |
81 | |
82 | void |
83 | qedi_dbg_info(struct qedi_dbg_ctx *qedi, const char *func, u32 line, |
84 | u32 level, const char *fmt, ...) |
85 | { |
86 | va_list va; |
87 | struct va_format vaf; |
88 | |
89 | va_start(va, fmt); |
90 | |
91 | vaf.fmt = fmt; |
92 | vaf.va = &va; |
93 | |
94 | if (!(qedi_dbg_log & level)) |
95 | goto ret; |
96 | |
97 | if (likely(qedi) && likely(qedi->pdev)) |
98 | pr_info("[%s]:[%s:%d]:%d: %pV" , dev_name(&qedi->pdev->dev), |
99 | func, line, qedi->host_no, &vaf); |
100 | else |
101 | pr_info("[0000:00:00.0]:[%s:%d]: %pV" , func, line, &vaf); |
102 | |
103 | ret: |
104 | va_end(va); |
105 | } |
106 | |
107 | int |
108 | qedi_create_sysfs_attr(struct Scsi_Host *shost, struct sysfs_bin_attrs *iter) |
109 | { |
110 | int ret = 0; |
111 | |
112 | for (; iter->name; iter++) { |
113 | ret = sysfs_create_bin_file(kobj: &shost->shost_gendev.kobj, |
114 | attr: iter->attr); |
115 | if (ret) |
116 | pr_err("Unable to create sysfs %s attr, err(%d).\n" , |
117 | iter->name, ret); |
118 | } |
119 | return ret; |
120 | } |
121 | |
122 | void |
123 | qedi_remove_sysfs_attr(struct Scsi_Host *shost, struct sysfs_bin_attrs *iter) |
124 | { |
125 | for (; iter->name; iter++) |
126 | sysfs_remove_bin_file(kobj: &shost->shost_gendev.kobj, attr: iter->attr); |
127 | } |
128 | |