Home | History | Annotate | Download | only in generic
      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
     30 extern "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)
     42 struct 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 
    158 struct 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  */
    387 struct 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  */
    405 struct 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