1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * This header file contains public constants and structures used by 4 * the SCSI initiator code. 5 */ 6 #ifndef _SCSI_SCSI_H 7 #define _SCSI_SCSI_H 8 9 #include <linux/types.h> 10 #include <linux/scatterlist.h> 11 #include <linux/kernel.h> 12 #include <scsi/scsi_common.h> 13 #include <scsi/scsi_proto.h> 14 #include <scsi/scsi_status.h> 15 16 struct scsi_cmnd; 17 18 enum scsi_timeouts { 19 SCSI_DEFAULT_EH_TIMEOUT = 10 * HZ, 20 }; 21 22 /* 23 * DIX-capable adapters effectively support infinite chaining for the 24 * protection information scatterlist 25 */ 26 #define SCSI_MAX_PROT_SG_SEGMENTS 0xFFFF 27 28 /* 29 * Special value for scanning to specify scanning or rescanning of all 30 * possible channels, (target) ids, or luns on a given shost. 31 */ 32 #define SCAN_WILD_CARD ~0 33 34 /* 35 * standard mode-select header prepended to all mode-select commands 36 */ 37 38 struct ccs_modesel_head { 39 __u8 _r1; /* reserved */ 40 __u8 medium; /* device-specific medium type */ 41 __u8 _r2; /* reserved */ 42 __u8 block_desc_length; /* block descriptor length */ 43 __u8 density; /* device-specific density code */ 44 __u8 number_blocks_hi; /* number of blocks in this block desc */ 45 __u8 number_blocks_med; 46 __u8 number_blocks_lo; 47 __u8 _r3; 48 __u8 block_length_hi; /* block length for blocks in this desc */ 49 __u8 block_length_med; 50 __u8 block_length_lo; 51 }; 52 53 /* 54 * The Well Known LUNS (SAM-3) in our int representation of a LUN 55 */ 56 #define SCSI_W_LUN_BASE 0xc100 57 #define SCSI_W_LUN_REPORT_LUNS (SCSI_W_LUN_BASE + 1) 58 #define SCSI_W_LUN_ACCESS_CONTROL (SCSI_W_LUN_BASE + 2) 59 #define SCSI_W_LUN_TARGET_LOG_PAGE (SCSI_W_LUN_BASE + 3) 60 61 static inline int scsi_is_wlun(u64 lun) 62 { 63 return (lun & 0xff00) == SCSI_W_LUN_BASE; 64 } 65 66 /** 67 * scsi_status_is_check_condition - check the status return. 68 * 69 * @status: the status passed up from the driver (including host and 70 * driver components) 71 * 72 * This returns true if the status code is SAM_STAT_CHECK_CONDITION. 73 */ 74 static inline int scsi_status_is_check_condition(int status) 75 { 76 if (status < 0) 77 return false; 78 status &= 0xfe; 79 return status == SAM_STAT_CHECK_CONDITION; 80 } 81 82 /* 83 * Extended message codes. 84 */ 85 #define EXTENDED_MODIFY_DATA_POINTER 0x00 86 #define EXTENDED_SDTR 0x01 87 #define EXTENDED_EXTENDED_IDENTIFY 0x02 /* SCSI-I only */ 88 #define EXTENDED_WDTR 0x03 89 #define EXTENDED_PPR 0x04 90 #define EXTENDED_MODIFY_BIDI_DATA_PTR 0x05 91 92 /* 93 * Internal return values. 94 */ 95 enum scsi_disposition { 96 NEEDS_RETRY = 0x2001, 97 SUCCESS = 0x2002, 98 FAILED = 0x2003, 99 QUEUED = 0x2004, 100 SOFT_ERROR = 0x2005, 101 ADD_TO_MLQUEUE = 0x2006, 102 TIMEOUT_ERROR = 0x2007, 103 SCSI_RETURN_NOT_HANDLED = 0x2008, 104 FAST_IO_FAIL = 0x2009, 105 }; 106 107 /* 108 * Midlevel queue return values. 109 */ 110 #define SCSI_MLQUEUE_HOST_BUSY 0x1055 111 #define SCSI_MLQUEUE_DEVICE_BUSY 0x1056 112 #define SCSI_MLQUEUE_EH_RETRY 0x1057 113 #define SCSI_MLQUEUE_TARGET_BUSY 0x1058 114 115 /* 116 * Use these to separate status msg and our bytes 117 * 118 * These are set by: 119 * 120 * status byte = set from target device 121 * msg_byte (unused) 122 * host_byte = set by low-level driver to indicate status. 123 */ 124 #define status_byte(result) (result & 0xff) 125 #define host_byte(result) (((result) >> 16) & 0xff) 126 127 #define sense_class(sense) (((sense) >> 4) & 0x7) 128 #define sense_error(sense) ((sense) & 0xf) 129 #define sense_valid(sense) ((sense) & 0x80) 130 131 /* 132 * default timeouts 133 */ 134 #define FORMAT_UNIT_TIMEOUT (2 * 60 * 60 * HZ) 135 #define START_STOP_TIMEOUT (60 * HZ) 136 #define MOVE_MEDIUM_TIMEOUT (5 * 60 * HZ) 137 #define READ_ELEMENT_STATUS_TIMEOUT (5 * 60 * HZ) 138 #define READ_DEFECT_DATA_TIMEOUT (60 * HZ ) 139 140 141 #define IDENTIFY_BASE 0x80 142 #define IDENTIFY(can_disconnect, lun) (IDENTIFY_BASE |\ 143 ((can_disconnect) ? 0x40 : 0) |\ 144 ((lun) & 0x07)) 145 146 /* 147 * struct scsi_device::scsi_level values. For SCSI devices other than those 148 * prior to SCSI-2 (i.e. over 12 years old) this value is (resp[2] + 1) 149 * where "resp" is a byte array of the response to an INQUIRY. The scsi_level 150 * variable is visible to the user via sysfs. 151 */ 152 153 #define SCSI_UNKNOWN 0 154 #define SCSI_1 1 155 #define SCSI_1_CCS 2 156 #define SCSI_2 3 157 #define SCSI_3 4 /* SPC */ 158 #define SCSI_SPC_2 5 159 #define SCSI_SPC_3 6 160 #define SCSI_SPC_4 7 161 #define SCSI_SPC_5 8 162 #define SCSI_SPC_6 14 163 164 /* 165 * INQ PERIPHERAL QUALIFIERS 166 */ 167 #define SCSI_INQ_PQ_CON 0x00 168 #define SCSI_INQ_PQ_NOT_CON 0x01 169 #define SCSI_INQ_PQ_NOT_CAP 0x03 170 171 172 /* 173 * Here are some scsi specific ioctl commands which are sometimes useful. 174 * 175 * Note that include/linux/cdrom.h also defines IOCTL 0x5300 - 0x5395 176 */ 177 178 /* Used to obtain PUN and LUN info. Conflicts with CDROMAUDIOBUFSIZ */ 179 #define SCSI_IOCTL_GET_IDLUN 0x5382 180 181 /* 0x5383 and 0x5384 were used for SCSI_IOCTL_TAGGED_{ENABLE,DISABLE} */ 182 183 /* Used to obtain the host number of a device. */ 184 #define SCSI_IOCTL_PROBE_HOST 0x5385 185 186 /* Used to obtain the bus number for a device */ 187 #define SCSI_IOCTL_GET_BUS_NUMBER 0x5386 188 189 /* Used to obtain the PCI location of a device */ 190 #define SCSI_IOCTL_GET_PCI 0x5387 191 192 /** scsi_status_is_good - check the status return. 193 * 194 * @status: the status passed up from the driver (including host and 195 * driver components) 196 * 197 * This returns true for known good conditions that may be treated as 198 * command completed normally 199 */ 200 static inline bool scsi_status_is_good(int status) 201 { 202 if (status < 0) 203 return false; 204 205 if (host_byte(status) == DID_NO_CONNECT) 206 return false; 207 208 /* 209 * FIXME: bit0 is listed as reserved in SCSI-2, but is 210 * significant in SCSI-3. For now, we follow the SCSI-2 211 * behaviour and ignore reserved bits. 212 */ 213 status &= 0xfe; 214 return ((status == SAM_STAT_GOOD) || 215 (status == SAM_STAT_CONDITION_MET) || 216 /* Next two "intermediate" statuses are obsolete in SAM-4 */ 217 (status == SAM_STAT_INTERMEDIATE) || 218 (status == SAM_STAT_INTERMEDIATE_CONDITION_MET) || 219 /* FIXME: this is obsolete in SAM-3 */ 220 (status == SAM_STAT_COMMAND_TERMINATED)); 221 } 222 223 #endif /* _SCSI_SCSI_H */ 224