1 /*- 2 * Macros for tracing/loging information in the CAM layer 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 * 6 * Copyright (c) 1997 Justin T. Gibbs. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions, and the following disclaimer, 14 * without modification, immediately at the beginning of the file. 15 * 2. The name of the author may not be used to endorse or promote products 16 * derived from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 22 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 */ 30 #ifndef _CAM_CAM_DEBUG_H 31 #define _CAM_CAM_DEBUG_H 1 32 33 /* 34 * Debugging flags. 35 */ 36 typedef enum { 37 CAM_DEBUG_NONE = 0x00, /* no debugging */ 38 CAM_DEBUG_INFO = 0x01, /* scsi commands, errors, data */ 39 CAM_DEBUG_TRACE = 0x02, /* routine flow tracking */ 40 CAM_DEBUG_SUBTRACE = 0x04, /* internal to routine flows */ 41 CAM_DEBUG_CDB = 0x08, /* print out SCSI CDBs only */ 42 CAM_DEBUG_XPT = 0x10, /* print out xpt scheduling */ 43 CAM_DEBUG_PERIPH = 0x20, /* print out peripheral calls */ 44 CAM_DEBUG_PROBE = 0x40 /* print out probe actions */ 45 } cam_debug_flags; 46 47 #if defined(_KERNEL) 48 49 #ifndef CAM_DEBUG_FLAGS 50 #define CAM_DEBUG_FLAGS CAM_DEBUG_NONE 51 #endif 52 53 #ifndef CAM_DEBUG_COMPILE 54 #ifdef CAMDEBUG 55 #define CAM_DEBUG_COMPILE (-1) 56 #else 57 #define CAM_DEBUG_COMPILE (CAM_DEBUG_INFO | CAM_DEBUG_CDB | \ 58 CAM_DEBUG_PERIPH | CAM_DEBUG_PROBE | \ 59 CAM_DEBUG_FLAGS) 60 #endif 61 #endif 62 63 #ifndef CAM_DEBUG_BUS 64 #define CAM_DEBUG_BUS CAM_BUS_WILDCARD 65 #endif 66 #ifndef CAM_DEBUG_TARGET 67 #define CAM_DEBUG_TARGET CAM_TARGET_WILDCARD 68 #endif 69 #ifndef CAM_DEBUG_LUN 70 #define CAM_DEBUG_LUN CAM_LUN_WILDCARD 71 #endif 72 73 #ifndef CAM_DEBUG_DELAY 74 #define CAM_DEBUG_DELAY 0 75 #endif 76 77 /* Path we want to debug */ 78 extern struct cam_path *cam_dpath; 79 /* Current debug levels set */ 80 extern uint32_t cam_dflags; 81 /* Printf delay value (to prevent scrolling) */ 82 extern uint32_t cam_debug_delay; 83 84 /* Helper routines -- helps conserve stack */ 85 struct cam_ed; 86 void xpt_cam_path_debug(struct cam_path *path, const char *fmt, ...); 87 void xpt_cam_dev_debug(struct cam_ed *dev, const char *fmt, ...); 88 void xpt_cam_debug(const char *fmt, ...); 89 90 /* Stupid macro to remove a layer of parens */ 91 #define _CAM_X(...) __VA_ARGS__ 92 93 /* Debugging macros. */ 94 #define CAM_DEBUGGED(path, flag) \ 95 (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags) \ 96 && (cam_dpath != NULL) \ 97 && (xpt_path_comp(cam_dpath, (path)) >= 0) \ 98 && (xpt_path_comp(cam_dpath, (path)) < 2)) 99 100 #define CAM_DEBUG(path, flag, printfargs) \ 101 if (CAM_DEBUGGED(path, flag)) { \ 102 xpt_cam_path_debug(path, _CAM_X printfargs); \ 103 } 104 105 #define CAM_DEBUG_DEV(dev, flag, printfargs) \ 106 if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags) \ 107 && (cam_dpath != NULL) \ 108 && (xpt_path_comp_dev(cam_dpath, (dev)) >= 0) \ 109 && (xpt_path_comp_dev(cam_dpath, (dev)) < 2)) { \ 110 xpt_cam_dev_debug(dev, _CAM_X printfargs); \ 111 } 112 113 #define CAM_DEBUG_PRINT(flag, printfargs) \ 114 if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags)) { \ 115 xpt_cam_debug(_CAM_X printfargs); \ 116 } 117 118 #else /* !_KERNEL */ 119 120 #define CAM_DEBUGGED(A, B) 0 121 #define CAM_DEBUG(A, B, C) 122 #define CAM_DEBUG_DEV(A, B, C) 123 #define CAM_DEBUG_PRINT(A, B) 124 125 #endif /* _KERNEL */ 126 127 #endif /* _CAM_CAM_DEBUG_H */ 128