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_INQUIRY_H
27#define	_SYS_SCSI_GENERIC_INQUIRY_H
28
29#ifdef	__cplusplus
30extern "C" {
31#endif
32
33/*
34 * SCSI Standard Inquiry Data:
35 *
36 * Format of data returned as a result of an INQUIRY command.
37 *
38 * NOTE: Fields marked 'DEPRECATED' are defined in older versions of t10 "SCSI
39 * Primary Command" spec, and are marked 'Obsolete' in newer versions.
40 */
41#if defined(_BIT_FIELDS_LTOH)
42struct scsi_inquiry {
43	/*
44	 * byte 0
45	 *
46	 * Bits 7-5 are the Peripheral Device Qualifier
47	 * Bits 4-0 are the Peripheral Device Type
48	 */
49	uchar_t	inq_dtype;
50
51	/* byte 1 */
52	uchar_t	inq_qual	: 7,	/* device type qualifier */
53		inq_rmb		: 1;	/* removable media */
54
55	/* byte 2 */
56	uchar_t	inq_ansi	: 3,	/* ANSI version */
57		inq_ecma	: 3,	/* ECMA version */
58		inq_iso		: 2;	/* ISO version */
59
60	/* byte 3 */
61	uchar_t	inq_rdf		: 4,	/* response data format */
62		inq_hisup	: 1,	/* hierarchical addressing model */
63		inq_normaca	: 1,	/* setting NACA bit supported */
64		inq_trmiop	: 1,	/* DEPRECATED: terminate I/O proc */
65		inq_aenc	: 1;	/* DEPRECATED: async event notify */
66
67	/* bytes 4-7 */
68	uchar_t	inq_len;		/* additional length */
69
70	uchar_t	inq_protect	: 1,	/* supports protection information */
71		inq_5_1		: 1,
72		inq_5_2		: 1,
73		inq_3pc		: 1,	/* third-party copy */
74		inq_tpgs	: 2,	/* impl/expl asymmetric lun access */
75		inq_acc		: 1,	/* access controls coordinator */
76		inq_sccs	: 1;	/* embedded storage array */
77
78	uchar_t	inq_addr16	: 1,	/* SPI: 16-bit wide SCSI addr */
79		inq_addr32	: 1,	/* DEPRECATED: 32 bit wide address */
80		inq_ackqreqq	: 1,	/* DEPRECATED: data xfer on Q cable */
81		inq_mchngr	: 1,	/* DEPRECATED: embeded medium changer */
82		inq_dualp	: 1,	/* multi port device */
83		inq_port	: 1,	/* DEPRECATED: port rcv inquiry cmd */
84		inq_encserv	: 1,	/* embedded enclosure services */
85		inq_bque	: 1;	/* DEPRECATED: combined with cmdque */
86
87	uchar_t	inq_sftre	: 1,	/* DEPRECATED: Soft Reset option */
88		inq_cmdque	: 1,	/* supports command queueing */
89		inq_trandis	: 1,	/* DEPRECATED: transfer disable msgs */
90		inq_linked	: 1,	/* DEPRECATED: linked commands */
91		inq_sync	: 1,	/* SPI: synchronous data xfers */
92		inq_wbus16	: 1,	/* SPI: 16-bit wide data xfers */
93		inq_wbus32	: 1,	/* DEPRECATED: 32 bit wide data xfers */
94		inq_reladdr	: 1;	/* DEPRECATED: relative addressing */
95
96	/* bytes 8-35 */
97	char	inq_vid[8];		/* vendor ID */
98	char	inq_pid[16];		/* product ID */
99	char	inq_revision[4];	/* revision level */
100
101	/*
102	 * Bytes 36-47 are reserved:
103	 *	For Sun qualified hard disk drives the inq_serial field contains
104	 *		two bytes of mfg date year code (ascii)
105	 *		two bytes of mfg date week code (ascii)
106	 *		six bytes of mfg serial number (ascii)
107	 *		two bytes unused
108	 */
109	char	inq_serial[12];
110
111	/*
112	 * Bytes 48-55 are reserved.
113	 */
114	uchar_t	__inq_48	: 8;
115	uchar_t	__inq_49	: 8;
116	uchar_t	__inq_50	: 8;
117	uchar_t	__inq_51	: 8;
118	uchar_t	__inq_52	: 8;
119	uchar_t	__inq_53	: 8;
120	uchar_t	__inq_54	: 8;
121	uchar_t	__inq_55	: 8;
122
123	/*
124	 * The meanings of byte 56 is specific to SPI-3. For protocols older
125	 * or other than this these fields are reserved.
126	 */
127	uchar_t	inq_ius		: 1,	/* SPI3: information units */
128		inq_qas		: 1,	/* SPI3: quick arb sel */
129		inq_clk		: 2,	/* SPI3: clocking */
130		__inq_56_4	: 1,	/* reserved */
131		__inq_56_5	: 1,	/* reserved */
132		__inq_56_6	: 1,	/* reserved */
133		__inq_56_7	: 1;	/* reserved */
134
135	uchar_t	__inq_57	: 8;	/* reserved */
136
137	/*
138	 * byte pairs 58-73 are version descriptors
139	 *  See: Table 51: dpANS SCSI Primary Commands - 2 (SPC-2) T10/1236
140	 */
141	struct	inq_vd {
142		uchar_t		inq_vd_msb;
143		uchar_t		inq_vd_lsb;
144	}	inq_vd[8];
145
146	/*
147	 * Bytes 74-95 are reserved.
148	 * 96 to 'n' are vendor-specific parameter bytes.
149	 *
150	 * Pad structure to 132 bytes so that access to some vendor-specific
151	 * data is possible via scsi_device(9S) sd_inq (for mpxio).
152	 */
153	uchar_t	__inq_74_127[132 - 74];
154};
155
156#elif defined(_BIT_FIELDS_HTOL)
157
158struct scsi_inquiry {
159	/*
160	 * byte 0
161	 *
162	 * Bits 7-5 are the Peripheral Device Qualifier
163	 * Bits 4-0 are the Peripheral Device Type
164	 */
165	uchar_t	inq_dtype;
166
167	/* byte 1 */
168	uchar_t	inq_rmb		: 1,	/* removable media */
169		inq_qual	: 7;	/* device type qualifier */
170
171	/* byte 2 */
172	uchar_t	inq_iso		: 2,	/* ISO version */
173		inq_ecma	: 3,	/* ECMA version */
174		inq_ansi	: 3;	/* ANSI version */
175
176	/* byte 3 */
177	uchar_t	inq_aenc	: 1,	/* DEPRECATED: async event notify */
178		inq_trmiop	: 1,	/* DEPRECATED: terminate I/O proc */
179		inq_normaca	: 1,	/* setting NACA bit supported */
180		inq_hisup	: 1,	/* hierarchical addressing model */
181		inq_rdf		: 4;	/* response data format */
182
183	/* bytes 4-7 */
184	uchar_t	inq_len;		/* additional length */
185
186	uchar_t	inq_sccs	: 1,	/* embedded storage array */
187		inq_acc		: 1,	/* access controls coordinator */
188		inq_tpgs	: 2,	/* impl/expl asymmetric lun access */
189		inq_3pc		: 1,	/* third-party copy */
190		inq_5_2		: 1,
191		inq_5_1		: 1,
192		inq_protect	: 1;	/* supports protection information */
193
194	uchar_t	inq_bque	: 1,	/* DEPRECATED: combined with cmdque */
195		inq_encserv	: 1,	/* embedded enclosure services */
196		inq_port	: 1,	/* DEPRECATED: port rcv inquiry cmd */
197		inq_dualp	: 1,	/* multi port device */
198		inq_mchngr	: 1,	/* DEPRECATED: embeded medium changer */
199		inq_ackqreqq	: 1,	/* DEPRECATED: data xfer on Q cable */
200		inq_addr32	: 1,	/* DEPRECATED: 32 bit wide address */
201		inq_addr16	: 1;	/* SPI: 16-bit wide SCSI addr */
202
203	uchar_t	inq_reladdr	: 1,	/* DEPRECATED: relative addressing */
204		inq_wbus32	: 1,	/* DEPRECATED: 32 bit wide data xfers */
205		inq_wbus16	: 1,	/* SPI: 16-bit wide data xfers */
206		inq_sync	: 1,	/* SPI: synchronous data xfers */
207		inq_linked	: 1,	/* DEPRECATED: linked commands */
208		inq_trandis	: 1,	/* DEPRECATED: transfer disable msgs */
209		inq_cmdque	: 1,	/* supports command queueing */
210		inq_sftre	: 1;	/* DEPRECATED: Soft Reset option */
211
212	/* bytes 8-35 */
213	char	inq_vid[8];		/* vendor ID */
214	char	inq_pid[16];		/* product ID */
215	char	inq_revision[4];	/* revision level */
216
217	/*
218	 * Bytes 36-47 are reserved:
219	 *	For Sun qualified hard disk drives the inq_serial field contains
220	 *		two bytes of mfg date year code (ascii)
221	 *		two bytes of mfg date week code (ascii)
222	 *		six bytes of mfg serial number (ascii)
223	 *		two bytes unused
224	 */
225	char	inq_serial[12];
226
227	/*
228	 * Bytes 48-55 are reserved.
229	 */
230	uchar_t	__inq_48	: 8;
231	uchar_t	__inq_49	: 8;
232	uchar_t	__inq_50	: 8;
233	uchar_t	__inq_51	: 8;
234	uchar_t	__inq_52	: 8;
235	uchar_t	__inq_53	: 8;
236	uchar_t	__inq_54	: 8;
237	uchar_t	__inq_55	: 8;
238
239	/*
240	 * The meanings of byte 56 is specific to SPI-3. For protocols older
241	 * or other than this these fields are reserved.
242	 */
243	uchar_t	__inq_56_7	: 1,	/* reserved */
244		__inq_56_6	: 1,	/* reserved */
245		__inq_56_5	: 1,	/* reserved */
246		__inq_56_4	: 1,	/* reserved */
247		inq_clk		: 2,	/* SPI3: clocking */
248		inq_qas		: 1,	/* SPI3: quick arb sel */
249		inq_ius		: 1;	/* SPI3: information units */
250
251	uchar_t	__inq_57	: 8;		/* reserved */
252
253	/*
254	 * byte pairs 58-73 are version descriptors
255	 *  See: Table 51: dpANS SCSI Primary Commands - 2 (SPC-2) T10/1236
256	 */
257	struct	inq_vd {
258		uchar_t		inq_vd_msb;
259		uchar_t		inq_vd_lsb;
260	}	inq_vd[8];
261
262	/*
263	 * Bytes 74-95 are reserved.
264	 * 96 to 'n' are vendor-specific parameter bytes.
265	 *
266	 * Pad structure to 132 bytes so that access to some vendor-specific
267	 * data is possible via scsi_device(9S) sd_inq (for mpxio).
268	 */
269	uchar_t	__inq_74_127[132 - 74];
270};
271#else
272#error	One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
273#endif	/* _BIT_FIELDS_LTOH */
274
275/*
276 * Defined Peripheral Device Types
277 */
278#define	DTYPE_DIRECT		0x00	/* magnetic disk */
279#define	DTYPE_SEQUENTIAL	0x01	/* magnetic tape */
280#define	DTYPE_PRINTER		0x02
281#define	DTYPE_PROCESSOR		0x03
282#define	DTYPE_WORM		0x04	/* some optical disks */
283#define	DTYPE_RODIRECT		0x05
284#define	DTYPE_SCANNER		0x06	/* obsolete */
285#define	DTYPE_OPTICAL		0x07
286#define	DTYPE_CHANGER		0x08	/* jukeboxes */
287#define	DTYPE_COMM		0x09	/* obsolete */
288#define	DTYPE_ARRAY_CTRL	0x0C
289#define	DTYPE_ESI		0x0D	/* Enclosure services device */
290#define	DTYPE_RBC		0x0E	/* Simplified direct-access device */
291#define	DTYPE_OCRW		0x0F	/* Optical card reader/writer device */
292#define	DTYPE_BCC		0x10
293#define	DTYPE_OSD		0x11	/* Object-based Storage Device */
294#define	DTYPE_ADC		0x12
295/*
296 * Device types 0x13-0x1D are reserved in spc-3 (r23)
297 */
298
299#define	DTYPE_WELLKNOWN		0x1E
300#define	DTYPE_UNKNOWN		0x1F
301#define	DTYPE_MASK		0x1F
302
303/* ASCII mapping used by scsi_dname(9F) */
304#define	DTYPE_ASCII		{ \
305		"Direct Access", "Sequential Access", "Printer", "Processor", \
306		"Write-Once/Read-Many", "Read-Only Direct Access", "Scanner", \
307		"Optical", "Changer", "Communications", "Unknown-0A", \
308		"Unknown-0B", "Array Controller", "Enclosure-Services", \
309		"Simplified-Direct-Access", "Optical-Card", "Bridge", \
310		"Object-Storage", NULL}
311
312/*
313 * The peripheral qualifier tells us more about a particular device.
314 * (DPQ == DEVICE PERIPHERAL QUALIFIER).
315 */
316#define	DPQ_MASK	0x60	/* DPQ bits */
317#define	DPQ_POSSIBLE	0x00
318				/*
319				 * The specified peripheral device type is
320				 * currently connected to this logical unit.
321				 * If the target cannot determine whether
322				 * or not a physical device is currently
323				 * connected, it shall also return this
324				 * qualifier.
325				 */
326#define	DPQ_SUPPORTED	0x20
327				/*
328				 * The target is capable of supporting the
329				 * specified peripheral device type on this
330				 * logical unit, however the physical device
331				 * is not currently connected to this logical
332				 * unit.
333				 */
334#define	DPQ_NEVER	0x60
335				/*
336				 * The target is not capable of supporting a
337				 * physical device on this logical unit. For
338				 * this peripheral qualifier, the peripheral
339				 * device type will be set to DTYPE_UNKNOWN
340				 * in order to provide compatibility with
341				 * previous versions of SCSI.
342				 */
343#define	DPQ_VUNIQ	0x80
344				/*
345				 * If this bit is set, this is a vendor
346				 * unique qualifier.
347				 */
348
349/*
350 * To maintain compatibility with previous versions
351 * of inquiry data formats, if a device peripheral
352 * qualifier states that the target is not capable
353 * of supporting a physical device on this logical unit,
354 * then the qualifier DPQ_NEVER is set, *AND* the
355 * actual device type must be set to DTYPE_UNKNOWN.
356 *
357 * This may make for some problems with older drivers
358 * that blindly check the entire first byte, where they
359 * should be checking for only the least 5 bits to see
360 * whether the correct type is at the specified nexus.
361 */
362#define	DTYPE_NOTPRESENT	(DPQ_NEVER | DTYPE_UNKNOWN)
363
364/*
365 * Defined Response Data Formats:
366 */
367#define	RDF_LEVEL0		0x00	/* no conformance claim (SCSI-1) */
368#define	RDF_CCS			0x01	/* Obsolete (pseudo-spec) */
369#define	RDF_SCSI2		0x02	/* Obsolete (SCSI-2/3 spec) */
370#define	RDF_SCSI_SPC		0x03	/* ANSI INCITS 301-1997 (SPC) */
371#define	RDF_SCSI_SPC2		0x04	/* ANSI INCITS 351-2001 (SPC-2) */
372#define	RDF_SCSI_SPC3		0x05	/* ANSI INCITS 408-2005 (SPC-3) */
373#define	RDF_SCSI_SPC4		0x06	/* t10 (SPC-4) */
374
375/*
376 * Defined Target Port Group Select values:
377 */
378#define	TPGS_FAILOVER_NONE	0x0
379#define	TPGS_FAILOVER_IMPLICIT	0x1
380#define	TPGS_FAILOVER_EXPLICIT	0x2
381#define	TPGS_FAILOVER_BOTH	0x3
382
383/*
384 * SPC-3 revision 21c, section 7.6.4.1
385 * Table 289 -- Device Identification VPD page
386 */
387struct vpd_hdr {
388#if defined(_BIT_FIELDS_LTOH)
389	uchar_t	device_type	: 4,
390		periph_qual	: 4;
391#elif defined(_BIT_FIELDS_HTOL)
392	uchar_t	periph_qual	: 4,
393		device_type	: 4;
394#else
395#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
396#endif
397	uchar_t	page_code,
398		page_len[2];
399};
400
401/*
402 * SPC-3 revision 21c, section 7.6.4.1
403 * Table 290 -- Identification descriptor
404 */
405struct vpd_desc {
406#if defined(_BIT_FIELDS_LTOH)
407	uchar_t	code_set	: 4,
408		proto_id	: 4;
409	uchar_t	id_type		: 4,
410		association	: 2,
411				: 1,
412		piv		: 1;
413#elif defined(_BIT_FIELDS_HTOL)
414	uchar_t	proto_id	: 4,
415		code_set	: 4;
416	uchar_t	piv		: 1,
417				: 1,
418		association	: 2,
419		id_type		: 4;
420#else
421#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
422#endif
423	uchar_t	resrv1;
424	uchar_t	len;
425	/* ---- data follows ---- */
426};
427
428/*
429 * "pm-capable" integer property bit mask definitions
430 */
431#define	PM_CAPABLE_PM_MASK	0x0000ffff	/* use lower 16 bits to */
432						/* indicate PM mode */
433#define	PM_CAPABLE_CCS		RDF_CCS
434#define	PM_CAPABLE_SCSI2	RDF_SCSI2
435#define	PM_CAPABLE_SPC		RDF_SCSI_SPC
436#define	PM_CAPABLE_SPC2		RDF_SCSI_SPC2
437#define	PM_CAPABLE_SPC3		RDF_SCSI_SPC3
438#define	PM_CAPABLE_SPC4		RDF_SCSI_SPC4
439#define	PM_CAPABLE_LOG_MASK	0xffff0000	/* use upper 16 bit to */
440						/* indicate log specifics */
441#define	PM_CAPABLE_LOG_SUPPORTED	0x10000	/* Log page 0xE might be */
442						/* supported */
443#define	PM_CAPABLE_SMART_LOG		0x20000 /* Log page 0xE reports SMART */
444						/* attributes instead of the */
445						/* default SCSI Log pages */
446#ifdef	__cplusplus
447}
448#endif
449
450/*
451 * Include in implementation specifuc
452 * (non-generic) inquiry definitions.
453 */
454
455#include <sys/scsi/impl/inquiry.h>
456
457#endif	/* _SYS_SCSI_GENERIC_INQUIRY_H */
458