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