1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_SCSI_GENERIC_SENSE_H 28 #define _SYS_SCSI_GENERIC_SENSE_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 /* 37 * Standard (Non-Extended) SCSI Sense. 38 * 39 * For Error Classe 0-6. This is all 40 * Vendor Unique sense information. 41 * 42 * Note: This is pre-SCSI-2. 43 */ 44 45 struct scsi_sense { 46 #if defined(_BIT_FIELDS_LTOH) 47 uchar_t ns_code : 4, /* Vendor Uniqe error code */ 48 ns_class : 3, /* Error class */ 49 ns_valid : 1; /* Logical Block Address is val */ 50 uchar_t ns_lba_hi : 5, /* High Logical Block Address */ 51 ns_vu : 3; /* Vendor Unique value */ 52 #elif defined(_BIT_FIELDS_HTOL) 53 uchar_t ns_valid : 1, /* Logical Block Address is valid */ 54 ns_class : 3, /* Error class */ 55 ns_code : 4; /* Vendor Uniqe error code */ 56 uchar_t ns_vu : 3, /* Vendor Unique value */ 57 ns_lba_hi : 5; /* High Logical Block Address */ 58 #else 59 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 60 #endif /* _BIT_FIELDS_LTOH */ 61 uchar_t ns_lba_mid; /* Middle Logical Block Address */ 62 uchar_t ns_lba_lo; /* Low part of Logical Block Address */ 63 }; 64 65 /* 66 * SCSI Extended Sense structure 67 * 68 * For Error Class 7, the Extended Sense Structure is applicable (now referred 69 * to in SPC-3 as "fixed format sense data"). The es_code field is used 70 * to determine whether the extended sense data is actually "fixed format" or 71 * the newer "descriptor format" introduced in SPC-3. 72 */ 73 74 #define CLASS_EXTENDED_SENSE 0x7 /* indicates extended sense */ 75 76 struct scsi_extended_sense { 77 #if defined(_BIT_FIELDS_LTOH) 78 uchar_t es_code : 4, /* Vendor Unique error code */ 79 es_class : 3, /* Error Class- fixed at 0x7 */ 80 es_valid : 1; /* sense data is valid */ 81 82 uchar_t es_segnum; /* segment number: for COPY cmd */ 83 84 uchar_t es_key : 4, /* Sense key (see below) */ 85 : 1, /* reserved */ 86 es_ili : 1, /* Incorrect Length Indicator */ 87 es_eom : 1, /* End of Media */ 88 es_filmk : 1; /* File Mark Detected */ 89 #elif defined(_BIT_FIELDS_HTOL) 90 uchar_t es_valid : 1, /* sense data is valid */ 91 es_class : 3, /* Error Class- fixed at 0x7 */ 92 es_code : 4; /* Vendor Unique error code */ 93 94 uchar_t es_segnum; /* segment number: for COPY cmd */ 95 96 uchar_t es_filmk : 1, /* File Mark Detected */ 97 es_eom : 1, /* End of Media */ 98 es_ili : 1, /* Incorrect Length Indicator */ 99 : 1, /* reserved */ 100 es_key : 4; /* Sense key (see below) */ 101 #else 102 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 103 #endif /* _BIT_FIELDS_LTOH */ 104 105 uchar_t es_info_1; /* information byte 1 */ 106 uchar_t es_info_2; /* information byte 2 */ 107 uchar_t es_info_3; /* information byte 3 */ 108 uchar_t es_info_4; /* information byte 4 */ 109 uchar_t es_add_len; /* number of additional bytes */ 110 111 uchar_t es_cmd_info[4]; /* command specific information */ 112 uchar_t es_add_code; /* Additional Sense Code */ 113 uchar_t es_qual_code; /* Additional Sense Code Qualifier */ 114 uchar_t es_fru_code; /* Field Replaceable Unit Code */ 115 uchar_t es_skey_specific[3]; /* Sense Key Specific information */ 116 117 /* 118 * Additional bytes may be defined in each implementation. 119 * The actual amount of space allocated for Sense Information 120 * is also implementation dependent. 121 * 122 * Modulo that, the declaration of an array two bytes in size 123 * nicely rounds this entire structure to a size of 20 bytes. 124 */ 125 126 uchar_t es_add_info[2]; /* additional information */ 127 128 }; 129 130 /* 131 * Sense code values for Extended Sense 132 */ 133 134 #define CODE_FMT_FIXED_CURRENT 0x0 135 #define CODE_FMT_FIXED_DEFERRED 0x1 136 #define CODE_FMT_DESCR_CURRENT 0x2 137 #define CODE_FMT_DESCR_DEFERRED 0x3 138 #define CODE_FMT_VENDOR_SPECIFIC 0xF 139 140 /* 141 * Sense Key values for Extended Sense. 142 */ 143 144 #define KEY_NO_SENSE 0x00 145 #define KEY_RECOVERABLE_ERROR 0x01 146 #define KEY_NOT_READY 0x02 147 #define KEY_MEDIUM_ERROR 0x03 148 #define KEY_HARDWARE_ERROR 0x04 149 #define KEY_ILLEGAL_REQUEST 0x05 150 #define KEY_UNIT_ATTENTION 0x06 151 #define KEY_WRITE_PROTECT 0x07 152 #define KEY_DATA_PROTECT KEY_WRITE_PROTECT 153 #define KEY_BLANK_CHECK 0x08 154 #define KEY_VENDOR_UNIQUE 0x09 155 #define KEY_COPY_ABORTED 0x0A 156 #define KEY_ABORTED_COMMAND 0x0B 157 #define KEY_EQUAL 0x0C 158 #define KEY_VOLUME_OVERFLOW 0x0D 159 #define KEY_MISCOMPARE 0x0E 160 #define KEY_RESERVED 0x0F 161 162 /* 163 * Descriptor sense data header 164 * 165 * Descriptor format sense data is described in the SPC-3 standard. Unlike 166 * the fixed format sense data, descriptor format consists of a header 167 * followed by a variable length list of sense data descriptors. 168 */ 169 170 struct scsi_descr_sense_hdr { 171 #if defined(_BIT_FIELDS_LTOH) 172 uchar_t ds_code : 4, /* Vendor Unique error code */ 173 ds_class : 3, /* Error Class- fixed at 0x7 */ 174 ds_reserved : 1; /* sense data is valid */ 175 176 uchar_t ds_key : 4, /* Sense key */ 177 ds_reserved2 : 4; /* reserved */ 178 #elif defined(_BIT_FIELDS_HTOL) 179 uchar_t ds_reserved : 1, /* sense data is valid */ 180 ds_class : 3, /* Error Class- fixed at 0x7 */ 181 ds_code : 4; /* Vendor Unique error code */ 182 183 uchar_t ds_reserved2 : 4, /* reserved */ 184 ds_key : 4; /* Sense key (see below) */ 185 #else 186 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 187 #endif /* _BIT_FIELDS_LTOH */ 188 189 uchar_t ds_add_code; /* Additional Sense Code */ 190 uchar_t ds_qual_code; /* Additional Sense Code Qualifier */ 191 192 uchar_t ds_reserved3[3]; /* reserved */ 193 194 uchar_t ds_addl_sense_length; /* Additional sense data length */ 195 }; 196 197 /* 198 * SCSI sense descriptors 199 */ 200 201 struct scsi_information_sense_descr { 202 uchar_t isd_descr_type; /* Descriptor type (0x00) */ 203 uchar_t isd_addl_length; /* Additional byte count (0x0A) */ 204 #if defined(_BIT_FIELDS_LTOH) 205 uchar_t isd_reserved1 : 7, /* reserved */ 206 isd_valid : 1; /* Always set to 1 */ 207 #elif defined(_BIT_FIELDS_HTOL) 208 uchar_t isd_valid : 1, /* Always set to 1 */ 209 isd_reserved1 : 7; /* reserved */ 210 #else 211 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 212 #endif /* _BIT_FIELDS_LTOH */ 213 uchar_t isd_reserved2; /* reserved */ 214 uchar_t isd_information[8]; /* Information bytes */ 215 }; 216 217 struct scsi_cmd_specific_sense_descr { 218 uchar_t css_descr_type; /* Descriptor type (0x01) */ 219 uchar_t css_addl_length; /* Additional byte count (0x0A) */ 220 uchar_t css_reserved[2]; /* reserved */ 221 uchar_t css_cmd_specific_info[8]; /* Command specific info */ 222 }; 223 224 struct scsi_sk_specific_sense_descr { 225 uchar_t sss_descr_type; /* Descriptor type */ 226 uchar_t sss_addl_length; /* Additional byte count (0x06) */ 227 uchar_t sss_reserved[2]; /* reserved */ 228 union { 229 /* 230 * Field pointer (Sense key = Illegal Request) 231 */ 232 struct { 233 #if defined(_BIT_FIELDS_LTOH) 234 uchar_t bit_pointer : 3, 235 bpv : 1, 236 reserved : 2, 237 cd : 1, 238 sksv : 1; 239 #elif defined(_BIT_FIELDS_HTOL) 240 uchar_t sksv : 1, 241 cd : 1, 242 reserved : 2, 243 bpv : 1, 244 bit_pointer : 3; 245 #else 246 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 247 #endif /* _BIT_FIELDS_LTOH */ 248 uchar_t field_pointer[2]; 249 } fp; 250 /* 251 * Actual Retry Count (Sense key = Hardware error, 252 * Medium Error or Recovered Error) 253 */ 254 struct { 255 uchar_t sksv; 256 uchar_t actual_retry_count[2]; 257 } arc; 258 /* 259 * Progress Indication (Sense key = No Sense or Not Ready 260 */ 261 struct { 262 uchar_t sksv; 263 uchar_t progress_indication[2]; 264 } pi; 265 /* 266 * Segment Pointer (Sense key = Copy Aborted) 267 */ 268 struct { 269 #if defined(_BIT_FIELDS_LTOH) 270 uchar_t bit_pointer : 3, 271 bpv : 1, 272 reserved : 1, 273 sd : 1, 274 reserved2 : 1, 275 sksv : 1; 276 #elif defined(_BIT_FIELDS_HTOL) 277 uchar_t sksv : 1, 278 reserved2 : 1, 279 sd : 1, 280 reserved : 1, 281 bpv : 1, 282 bit_pointer : 3; 283 #else 284 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 285 #endif /* _BIT_FIELDS_LTOH */ 286 uchar_t field_pointer[2]; 287 } sp; 288 } sss_data; 289 uchar_t sss_reserved2; /* reserved */ 290 }; 291 292 struct scsi_fru_sense_descr { 293 uchar_t fs_descr_type; /* Descriptor type (0x03) */ 294 uchar_t fs_addl_length; /* Additional byte count (0x02) */ 295 uchar_t fs_reserved; /* reserved */ 296 uchar_t fs_fru_code; /* Field Replaceable Unit Code */ 297 }; 298 299 struct scsi_stream_cmd_sense_descr { 300 uchar_t scs_descr_type; /* Descriptor type (0x04) */ 301 uchar_t scs_addl_length; /* Additional byte count (0x02) */ 302 uchar_t scs_reserved; /* reserved */ 303 #if defined(_BIT_FIELDS_LTOH) 304 uchar_t scs_reserved2 : 5, 305 scs_ili : 1, 306 scs_eom : 1, 307 scs_filemark : 1; 308 #elif defined(_BIT_FIELDS_HTOL) 309 uchar_t scs_filemark : 1, 310 scs_eom : 1, 311 scs_ili : 1, 312 scs_reserved2 : 5; 313 #else 314 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 315 #endif /* _BIT_FIELDS_LTOH */ 316 }; 317 318 struct scsi_block_cmd_sense_descr { 319 uchar_t bcs_descr_type; /* Descriptor type (0x05) */ 320 uchar_t bcs_addl_length; /* Additional byte count (0x02) */ 321 uchar_t bcs_reserved; /* reserved */ 322 #if defined(_BIT_FIELDS_LTOH) 323 uchar_t bcs_reserved2 : 5, 324 bcs_ili : 1, 325 bcs_reserved3 : 2; 326 #elif defined(_BIT_FIELDS_HTOL) 327 uchar_t bcs_reserved3 : 2, 328 bcs_ili : 1, 329 bcs_reserved2 : 5; 330 #else 331 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 332 #endif /* _BIT_FIELDS_LTOH */ 333 }; 334 335 struct scsi_vendor_specific_sense_descr { 336 uchar_t vss_descr_type; /* Descriptor type (0x80-0xFF) */ 337 uchar_t vss_addl_length; /* Additional byte count */ 338 /* 339 * Variable length vendor specific data 340 */ 341 uchar_t vss_vendor_specific_info[1]; 342 }; 343 344 /* 345 * SCSI Descriptor Types 346 */ 347 #define DESCR_INFORMATION 0x00 348 #define DESCR_COMMAND_SPECIFIC 0x01 349 #define DESCR_SENSE_KEY_SPECIFIC 0x02 350 #define DESCR_FRU 0x03 351 #define DESCR_STREAM_COMMANDS 0x04 352 #define DESCR_BLOCK_COMMANDS 0x05 353 354 #ifdef __cplusplus 355 } 356 #endif 357 358 /* 359 * Each implementation will have specific mappings to what 360 * Sense Information means 361 */ 362 363 #include <sys/scsi/impl/sense.h> 364 365 #endif /* _SYS_SCSI_GENERIC_SENSE_H */ 366