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