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 * $FreeBSD$ 31 */ 32 #ifndef _CAM_CAM_DEBUG_H 33 #define _CAM_CAM_DEBUG_H 1 34 35 /* 36 * Debugging flags. 37 */ 38 typedef enum { 39 CAM_DEBUG_NONE = 0x00, /* no debugging */ 40 CAM_DEBUG_INFO = 0x01, /* scsi commands, errors, data */ 41 CAM_DEBUG_TRACE = 0x02, /* routine flow tracking */ 42 CAM_DEBUG_SUBTRACE = 0x04, /* internal to routine flows */ 43 CAM_DEBUG_CDB = 0x08, /* print out SCSI CDBs only */ 44 CAM_DEBUG_XPT = 0x10, /* print out xpt scheduling */ 45 CAM_DEBUG_PERIPH = 0x20, /* print out peripheral calls */ 46 CAM_DEBUG_PROBE = 0x40 /* print out probe actions */ 47 } cam_debug_flags; 48 49 #if defined(_KERNEL) 50 51 #ifndef CAM_DEBUG_FLAGS 52 #define CAM_DEBUG_FLAGS CAM_DEBUG_NONE 53 #endif 54 55 #ifndef CAM_DEBUG_COMPILE 56 #ifdef CAMDEBUG 57 #define CAM_DEBUG_COMPILE (-1) 58 #else 59 #define CAM_DEBUG_COMPILE (CAM_DEBUG_INFO | CAM_DEBUG_CDB | \ 60 CAM_DEBUG_PERIPH | CAM_DEBUG_PROBE | \ 61 CAM_DEBUG_FLAGS) 62 #endif 63 #endif 64 65 #ifndef CAM_DEBUG_BUS 66 #define CAM_DEBUG_BUS CAM_BUS_WILDCARD 67 #endif 68 #ifndef CAM_DEBUG_TARGET 69 #define CAM_DEBUG_TARGET CAM_TARGET_WILDCARD 70 #endif 71 #ifndef CAM_DEBUG_LUN 72 #define CAM_DEBUG_LUN CAM_LUN_WILDCARD 73 #endif 74 75 #ifndef CAM_DEBUG_DELAY 76 #define CAM_DEBUG_DELAY 0 77 #endif 78 79 /* Path we want to debug */ 80 extern struct cam_path *cam_dpath; 81 /* Current debug levels set */ 82 extern uint32_t cam_dflags; 83 /* Printf delay value (to prevent scrolling) */ 84 extern uint32_t cam_debug_delay; 85 86 /* Debugging macros. */ 87 #define CAM_DEBUGGED(path, flag) \ 88 (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags) \ 89 && (cam_dpath != NULL) \ 90 && (xpt_path_comp(cam_dpath, path) >= 0) \ 91 && (xpt_path_comp(cam_dpath, path) < 2)) 92 93 #define CAM_DEBUG(path, flag, printfargs) \ 94 if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags) \ 95 && (cam_dpath != NULL) \ 96 && (xpt_path_comp(cam_dpath, path) >= 0) \ 97 && (xpt_path_comp(cam_dpath, path) < 2)) { \ 98 xpt_print_path(path); \ 99 printf printfargs; \ 100 if (cam_debug_delay != 0) \ 101 DELAY(cam_debug_delay); \ 102 } 103 104 #define CAM_DEBUG_DEV(dev, flag, printfargs) \ 105 if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags) \ 106 && (cam_dpath != NULL) \ 107 && (xpt_path_comp_dev(cam_dpath, dev) >= 0) \ 108 && (xpt_path_comp_dev(cam_dpath, dev) < 2)) { \ 109 xpt_print_device(dev); \ 110 printf printfargs; \ 111 if (cam_debug_delay != 0) \ 112 DELAY(cam_debug_delay); \ 113 } 114 115 #define CAM_DEBUG_PRINT(flag, printfargs) \ 116 if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags)) { \ 117 printf("cam_debug: "); \ 118 printf printfargs; \ 119 if (cam_debug_delay != 0) \ 120 DELAY(cam_debug_delay); \ 121 } 122 123 #define CAM_DEBUG_PATH_PRINT(flag, path, printfargs) \ 124 if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags)) { \ 125 xpt_print(path, "cam_debug: "); \ 126 printf printfargs; \ 127 if (cam_debug_delay != 0) \ 128 DELAY(cam_debug_delay); \ 129 } 130 131 #else /* !_KERNEL */ 132 133 #define CAM_DEBUGGED(A, B) 0 134 #define CAM_DEBUG(A, B, C) 135 #define CAM_DEBUG_PRINT(A, B) 136 #define CAM_DEBUG_PATH_PRINT(A, B, C) 137 138 #endif /* _KERNEL */ 139 140 #endif /* _CAM_CAM_DEBUG_H */ 141