1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * Driver for Broadcom MPI3 Storage Controllers
4 *
5 * Copyright (C) 2017-2023 Broadcom Inc.
6 * (mailto: mpi3mr-linuxdrv.pdl@broadcom.com)
7 *
8 */
9
10#ifndef MPI3SAS_DEBUG_H_INCLUDED
11
12#define MPI3SAS_DEBUG_H_INCLUDED
13
14/*
15 * debug levels
16 */
17
18#define MPI3_DEBUG_EVENT 0x00000001
19#define MPI3_DEBUG_EVENT_WORK_TASK 0x00000002
20#define MPI3_DEBUG_INIT 0x00000004
21#define MPI3_DEBUG_EXIT 0x00000008
22#define MPI3_DEBUG_TM 0x00000010
23#define MPI3_DEBUG_RESET 0x00000020
24#define MPI3_DEBUG_SCSI_ERROR 0x00000040
25#define MPI3_DEBUG_REPLY 0x00000080
26#define MPI3_DEBUG_CFG_ERROR 0x00000100
27#define MPI3_DEBUG_TRANSPORT_ERROR 0x00000200
28#define MPI3_DEBUG_BSG_ERROR 0x00008000
29#define MPI3_DEBUG_BSG_INFO 0x00010000
30#define MPI3_DEBUG_SCSI_INFO 0x00020000
31#define MPI3_DEBUG_CFG_INFO 0x00040000
32#define MPI3_DEBUG_TRANSPORT_INFO 0x00080000
33#define MPI3_DEBUG 0x01000000
34#define MPI3_DEBUG_SG 0x02000000
35
36
37/*
38 * debug macros
39 */
40
41#define ioc_err(ioc, fmt, ...) \
42 pr_err("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
43#define ioc_notice(ioc, fmt, ...) \
44 pr_notice("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
45#define ioc_warn(ioc, fmt, ...) \
46 pr_warn("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
47#define ioc_info(ioc, fmt, ...) \
48 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
49
50#define dprint(ioc, fmt, ...) \
51 do { \
52 if (ioc->logging_level & MPI3_DEBUG) \
53 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
54 } while (0)
55
56#define dprint_event_th(ioc, fmt, ...) \
57 do { \
58 if (ioc->logging_level & MPI3_DEBUG_EVENT) \
59 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
60 } while (0)
61
62#define dprint_event_bh(ioc, fmt, ...) \
63 do { \
64 if (ioc->logging_level & MPI3_DEBUG_EVENT_WORK_TASK) \
65 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
66 } while (0)
67
68#define dprint_init(ioc, fmt, ...) \
69 do { \
70 if (ioc->logging_level & MPI3_DEBUG_INIT) \
71 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
72 } while (0)
73
74#define dprint_exit(ioc, fmt, ...) \
75 do { \
76 if (ioc->logging_level & MPI3_DEBUG_EXIT) \
77 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
78 } while (0)
79
80#define dprint_tm(ioc, fmt, ...) \
81 do { \
82 if (ioc->logging_level & MPI3_DEBUG_TM) \
83 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
84 } while (0)
85
86#define dprint_reply(ioc, fmt, ...) \
87 do { \
88 if (ioc->logging_level & MPI3_DEBUG_REPLY) \
89 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
90 } while (0)
91
92#define dprint_reset(ioc, fmt, ...) \
93 do { \
94 if (ioc->logging_level & MPI3_DEBUG_RESET) \
95 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
96 } while (0)
97
98#define dprint_scsi_info(ioc, fmt, ...) \
99 do { \
100 if (ioc->logging_level & MPI3_DEBUG_SCSI_INFO) \
101 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
102 } while (0)
103
104#define dprint_scsi_err(ioc, fmt, ...) \
105 do { \
106 if (ioc->logging_level & MPI3_DEBUG_SCSI_ERROR) \
107 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
108 } while (0)
109
110#define dprint_scsi_command(ioc, SCMD, LOG_LEVEL) \
111 do { \
112 if (ioc->logging_level & LOG_LEVEL) \
113 scsi_print_command(SCMD); \
114 } while (0)
115
116
117#define dprint_bsg_info(ioc, fmt, ...) \
118 do { \
119 if (ioc->logging_level & MPI3_DEBUG_BSG_INFO) \
120 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
121 } while (0)
122
123#define dprint_bsg_err(ioc, fmt, ...) \
124 do { \
125 if (ioc->logging_level & MPI3_DEBUG_BSG_ERROR) \
126 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
127 } while (0)
128
129#define dprint_cfg_info(ioc, fmt, ...) \
130 do { \
131 if (ioc->logging_level & MPI3_DEBUG_CFG_INFO) \
132 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
133 } while (0)
134
135#define dprint_cfg_err(ioc, fmt, ...) \
136 do { \
137 if (ioc->logging_level & MPI3_DEBUG_CFG_ERROR) \
138 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
139 } while (0)
140#define dprint_transport_info(ioc, fmt, ...) \
141 do { \
142 if (ioc->logging_level & MPI3_DEBUG_TRANSPORT_INFO) \
143 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
144 } while (0)
145
146#define dprint_transport_err(ioc, fmt, ...) \
147 do { \
148 if (ioc->logging_level & MPI3_DEBUG_TRANSPORT_ERROR) \
149 pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
150 } while (0)
151
152#endif /* MPT3SAS_DEBUG_H_INCLUDED */
153
154/**
155 * dprint_dump - print contents of a memory buffer
156 * @req: Pointer to a memory buffer
157 * @sz: Memory buffer size
158 * @namestr: Name String to identify the buffer type
159 */
160static inline void
161dprint_dump(void *req, int sz, const char *name_string)
162{
163 int i;
164 __le32 *mfp = (__le32 *)req;
165
166 sz = sz/4;
167 if (name_string)
168 pr_info("%s:\n\t", name_string);
169 else
170 pr_info("request:\n\t");
171 for (i = 0; i < sz; i++) {
172 if (i && ((i % 8) == 0))
173 pr_info("\n\t");
174 pr_info("%08x ", le32_to_cpu(mfp[i]));
175 }
176 pr_info("\n");
177}
178
179/**
180 * dprint_dump_req - print message frame contents
181 * @req: pointer to message frame
182 * @sz: number of dwords
183 */
184static inline void
185dprint_dump_req(void *req, int sz)
186{
187 int i;
188 __le32 *mfp = (__le32 *)req;
189
190 pr_info("request:\n\t");
191 for (i = 0; i < sz; i++) {
192 if (i && ((i % 8) == 0))
193 pr_info("\n\t");
194 pr_info("%08x ", le32_to_cpu(mfp[i]));
195 }
196 pr_info("\n");
197}
198

source code of linux/drivers/scsi/mpi3mr/mpi3mr_debug.h