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 /* Debugging macros. */ 85 #define CAM_DEBUGGED(path, flag) \ 86 (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags) \ 87 && (cam_dpath != NULL) \ 88 && (xpt_path_comp(cam_dpath, path) >= 0) \ 89 && (xpt_path_comp(cam_dpath, path) < 2)) 90 91 #define CAM_DEBUG(path, flag, printfargs) \ 92 if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags) \ 93 && (cam_dpath != NULL) \ 94 && (xpt_path_comp(cam_dpath, path) >= 0) \ 95 && (xpt_path_comp(cam_dpath, path) < 2)) { \ 96 xpt_print_path(path); \ 97 printf printfargs; \ 98 if (cam_debug_delay != 0) \ 99 DELAY(cam_debug_delay); \ 100 } 101 102 #define CAM_DEBUG_DEV(dev, flag, printfargs) \ 103 if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags) \ 104 && (cam_dpath != NULL) \ 105 && (xpt_path_comp_dev(cam_dpath, dev) >= 0) \ 106 && (xpt_path_comp_dev(cam_dpath, dev) < 2)) { \ 107 xpt_print_device(dev); \ 108 printf printfargs; \ 109 if (cam_debug_delay != 0) \ 110 DELAY(cam_debug_delay); \ 111 } 112 113 #define CAM_DEBUG_PRINT(flag, printfargs) \ 114 if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags)) { \ 115 printf("cam_debug: "); \ 116 printf printfargs; \ 117 if (cam_debug_delay != 0) \ 118 DELAY(cam_debug_delay); \ 119 } 120 121 #define CAM_DEBUG_PATH_PRINT(flag, path, printfargs) \ 122 if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags)) { \ 123 xpt_print(path, "cam_debug: "); \ 124 printf printfargs; \ 125 if (cam_debug_delay != 0) \ 126 DELAY(cam_debug_delay); \ 127 } 128 129 #else /* !_KERNEL */ 130 131 #define CAM_DEBUGGED(A, B) 0 132 #define CAM_DEBUG(A, B, C) 133 #define CAM_DEBUG_PRINT(A, B) 134 #define CAM_DEBUG_PATH_PRINT(A, B, C) 135 136 #endif /* _KERNEL */ 137 138 #endif /* _CAM_CAM_DEBUG_H */ 139