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 */ 160 static inline void 161 dprint_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 */ 184 static inline void 185 dprint_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