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 */