1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Driver for Broadcom MPI3 Storage Controllers
4  *
5  * Copyright (C) 2017-2022 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_BSG_ERROR		0x00008000
27 #define MPI3_DEBUG_BSG_INFO		0x00010000
28 #define MPI3_DEBUG_SCSI_INFO		0x00020000
29 #define MPI3_DEBUG			0x01000000
30 #define MPI3_DEBUG_SG			0x02000000
31 
32 
33 /*
34  * debug macros
35  */
36 
37 #define ioc_err(ioc, fmt, ...) \
38 	pr_err("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
39 #define ioc_notice(ioc, fmt, ...) \
40 	pr_notice("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
41 #define ioc_warn(ioc, fmt, ...) \
42 	pr_warn("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
43 #define ioc_info(ioc, fmt, ...) \
44 	pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
45 
46 #define dprint(ioc, fmt, ...) \
47 	do { \
48 		if (ioc->logging_level & MPI3_DEBUG) \
49 			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
50 	} while (0)
51 
52 #define dprint_event_th(ioc, fmt, ...) \
53 	do { \
54 		if (ioc->logging_level & MPI3_DEBUG_EVENT) \
55 			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
56 	} while (0)
57 
58 #define dprint_event_bh(ioc, fmt, ...) \
59 	do { \
60 		if (ioc->logging_level & MPI3_DEBUG_EVENT_WORK_TASK) \
61 			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
62 	} while (0)
63 
64 #define dprint_init(ioc, fmt, ...) \
65 	do { \
66 		if (ioc->logging_level & MPI3_DEBUG_INIT) \
67 			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
68 	} while (0)
69 
70 #define dprint_exit(ioc, fmt, ...) \
71 	do { \
72 		if (ioc->logging_level & MPI3_DEBUG_EXIT) \
73 			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
74 	} while (0)
75 
76 #define dprint_tm(ioc, fmt, ...) \
77 	do { \
78 		if (ioc->logging_level & MPI3_DEBUG_TM) \
79 			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
80 	} while (0)
81 
82 #define dprint_reply(ioc, fmt, ...) \
83 	do { \
84 		if (ioc->logging_level & MPI3_DEBUG_REPLY) \
85 			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
86 	} while (0)
87 
88 #define dprint_reset(ioc, fmt, ...) \
89 	do { \
90 		if (ioc->logging_level & MPI3_DEBUG_RESET) \
91 			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
92 	} while (0)
93 
94 #define dprint_scsi_info(ioc, fmt, ...) \
95 	do { \
96 		if (ioc->logging_level & MPI3_DEBUG_SCSI_INFO) \
97 			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
98 	} while (0)
99 
100 #define dprint_scsi_err(ioc, fmt, ...) \
101 	do { \
102 		if (ioc->logging_level & MPI3_DEBUG_SCSI_ERROR) \
103 			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
104 	} while (0)
105 
106 #define dprint_scsi_command(ioc, SCMD, LOG_LEVEL) \
107 	do { \
108 		if (ioc->logging_level & LOG_LEVEL) \
109 			scsi_print_command(SCMD); \
110 	} while (0)
111 
112 
113 #define dprint_bsg_info(ioc, fmt, ...) \
114 	do { \
115 		if (ioc->logging_level & MPI3_DEBUG_BSG_INFO) \
116 			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
117 	} while (0)
118 
119 #define dprint_bsg_err(ioc, fmt, ...) \
120 	do { \
121 		if (ioc->logging_level & MPI3_DEBUG_BSG_ERROR) \
122 			pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__); \
123 	} while (0)
124 
125 #endif /* MPT3SAS_DEBUG_H_INCLUDED */
126 
127 /**
128  * dprint_dump - print contents of a memory buffer
129  * @req: Pointer to a memory buffer
130  * @sz: Memory buffer size
131  * @namestr: Name String to identify the buffer type
132  */
133 static inline void
134 dprint_dump(void *req, int sz, const char *name_string)
135 {
136 	int i;
137 	__le32 *mfp = (__le32 *)req;
138 
139 	sz = sz/4;
140 	if (name_string)
141 		pr_info("%s:\n\t", name_string);
142 	else
143 		pr_info("request:\n\t");
144 	for (i = 0; i < sz; i++) {
145 		if (i && ((i % 8) == 0))
146 			pr_info("\n\t");
147 		pr_info("%08x ", le32_to_cpu(mfp[i]));
148 	}
149 	pr_info("\n");
150 }
151 
152 /**
153  * dprint_dump_req - print message frame contents
154  * @req: pointer to message frame
155  * @sz: number of dwords
156  */
157 static inline void
158 dprint_dump_req(void *req, int sz)
159 {
160 	int i;
161 	__le32 *mfp = (__le32 *)req;
162 
163 	pr_info("request:\n\t");
164 	for (i = 0; i < sz; i++) {
165 		if (i && ((i % 8) == 0))
166 			pr_info("\n\t");
167 		pr_info("%08x ", le32_to_cpu(mfp[i]));
168 	}
169 	pr_info("\n");
170 }
171