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