linux-bk/include/scsi/scsi.h
<<
>>
Prefs
   1/*
   2 * This header file contains public constants and structures used by
   3 * the scsi code for linux.
   4 *
   5 * For documentation on the OPCODES, MESSAGES, and SENSE values,
   6 * please consult the SCSI standard.
   7 */
   8#ifndef _SCSI_SCSI_H
   9#define _SCSI_SCSI_H
  10
  11#include <linux/types.h>
  12
  13/*
  14 *      The maximum sg list length SCSI can cope with
  15 *      (currently must be a power of 2 between 32 and 256)
  16 */
  17#define SCSI_MAX_PHYS_SEGMENTS  MAX_PHYS_SEGMENTS
  18
  19
  20/*
  21 *      SCSI command lengths
  22 */
  23
  24extern const unsigned char scsi_command_size[8];
  25#define COMMAND_SIZE(opcode) scsi_command_size[((opcode) >> 5) & 7]
  26
  27/*
  28 *      SCSI device types
  29 */
  30
  31#define MAX_SCSI_DEVICE_CODE 14
  32extern const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE];
  33
  34/*
  35 *      SCSI opcodes
  36 */
  37
  38#define TEST_UNIT_READY       0x00
  39#define REZERO_UNIT           0x01
  40#define REQUEST_SENSE         0x03
  41#define FORMAT_UNIT           0x04
  42#define READ_BLOCK_LIMITS     0x05
  43#define REASSIGN_BLOCKS       0x07
  44#define READ_6                0x08
  45#define WRITE_6               0x0a
  46#define SEEK_6                0x0b
  47#define READ_REVERSE          0x0f
  48#define WRITE_FILEMARKS       0x10
  49#define SPACE                 0x11
  50#define INQUIRY               0x12
  51#define RECOVER_BUFFERED_DATA 0x14
  52#define MODE_SELECT           0x15
  53#define RESERVE               0x16
  54#define RELEASE               0x17
  55#define COPY                  0x18
  56#define ERASE                 0x19
  57#define MODE_SENSE            0x1a
  58#define START_STOP            0x1b
  59#define RECEIVE_DIAGNOSTIC    0x1c
  60#define SEND_DIAGNOSTIC       0x1d
  61#define ALLOW_MEDIUM_REMOVAL  0x1e
  62
  63#define SET_WINDOW            0x24
  64#define READ_CAPACITY         0x25
  65#define READ_10               0x28
  66#define WRITE_10              0x2a
  67#define SEEK_10               0x2b
  68#define WRITE_VERIFY          0x2e
  69#define VERIFY                0x2f
  70#define SEARCH_HIGH           0x30
  71#define SEARCH_EQUAL          0x31
  72#define SEARCH_LOW            0x32
  73#define SET_LIMITS            0x33
  74#define PRE_FETCH             0x34
  75#define READ_POSITION         0x34
  76#define SYNCHRONIZE_CACHE     0x35
  77#define LOCK_UNLOCK_CACHE     0x36
  78#define READ_DEFECT_DATA      0x37
  79#define MEDIUM_SCAN           0x38
  80#define COMPARE               0x39
  81#define COPY_VERIFY           0x3a
  82#define WRITE_BUFFER          0x3b
  83#define READ_BUFFER           0x3c
  84#define UPDATE_BLOCK          0x3d
  85#define READ_LONG             0x3e
  86#define WRITE_LONG            0x3f
  87#define CHANGE_DEFINITION     0x40
  88#define WRITE_SAME            0x41
  89#define READ_TOC              0x43
  90#define LOG_SELECT            0x4c
  91#define LOG_SENSE             0x4d
  92#define MODE_SELECT_10        0x55
  93#define RESERVE_10            0x56
  94#define RELEASE_10            0x57
  95#define MODE_SENSE_10         0x5a
  96#define PERSISTENT_RESERVE_IN 0x5e
  97#define PERSISTENT_RESERVE_OUT 0x5f
  98#define REPORT_LUNS           0xa0
  99#define MOVE_MEDIUM           0xa5
 100#define READ_12               0xa8
 101#define WRITE_12              0xaa
 102#define WRITE_VERIFY_12       0xae
 103#define SEARCH_HIGH_12        0xb0
 104#define SEARCH_EQUAL_12       0xb1
 105#define SEARCH_LOW_12         0xb2
 106#define READ_ELEMENT_STATUS   0xb8
 107#define SEND_VOLUME_TAG       0xb6
 108#define WRITE_LONG_2          0xea
 109#define READ_16               0x88
 110#define WRITE_16              0x8a
 111#define SERVICE_ACTION_IN     0x9e
 112/* values for service action in */
 113#define SAI_READ_CAPACITY_16  0x10
 114
 115
 116/*
 117 *  SCSI Architecture Model (SAM) Status codes. Taken from SAM-3 draft
 118 *  T10/1561-D Revision 4 Draft dated 7th November 2002.
 119 */
 120#define SAM_STAT_GOOD            0x00
 121#define SAM_STAT_CHECK_CONDITION 0x02
 122#define SAM_STAT_CONDITION_MET   0x04
 123#define SAM_STAT_BUSY            0x08
 124#define SAM_STAT_INTERMEDIATE    0x10
 125#define SAM_STAT_INTERMEDIATE_CONDITION_MET 0x14
 126#define SAM_STAT_RESERVATION_CONFLICT 0x18
 127#define SAM_STAT_COMMAND_TERMINATED 0x22        /* obsolete in SAM-3 */
 128#define SAM_STAT_TASK_SET_FULL   0x28
 129#define SAM_STAT_ACA_ACTIVE      0x30
 130#define SAM_STAT_TASK_ABORTED    0x40
 131
 132/** scsi_status_is_good - check the status return.
 133 *
 134 * @status: the status passed up from the driver (including host and
 135 *          driver components)
 136 *
 137 * This returns true for known good conditions that may be treated as
 138 * command completed normally
 139 */
 140static inline int scsi_status_is_good(int status)
 141{
 142        /*
 143         * FIXME: bit0 is listed as reserved in SCSI-2, but is
 144         * significant in SCSI-3.  For now, we follow the SCSI-2
 145         * behaviour and ignore reserved bits.
 146         */
 147        status &= 0xfe;
 148        return ((status == SAM_STAT_GOOD) ||
 149                (status == SAM_STAT_INTERMEDIATE) ||
 150                (status == SAM_STAT_INTERMEDIATE_CONDITION_MET) ||
 151                /* FIXME: this is obsolete in SAM-3 */
 152                (status == SAM_STAT_COMMAND_TERMINATED));
 153}
 154
 155/*
 156 *  Status codes. These are deprecated as they are shifted 1 bit right
 157 *  from those found in the SCSI standards. This causes confusion for
 158 *  applications that are ported to several OSes. Prefer SAM Status codes
 159 *  above.
 160 */
 161
 162#define GOOD                 0x00
 163#define CHECK_CONDITION      0x01
 164#define CONDITION_GOOD       0x02
 165#define BUSY                 0x04
 166#define INTERMEDIATE_GOOD    0x08
 167#define INTERMEDIATE_C_GOOD  0x0a
 168#define RESERVATION_CONFLICT 0x0c
 169#define COMMAND_TERMINATED   0x11
 170#define QUEUE_FULL           0x14
 171
 172#define STATUS_MASK          0x3e
 173
 174/*
 175 *  SENSE KEYS
 176 */
 177
 178#define NO_SENSE            0x00
 179#define RECOVERED_ERROR     0x01
 180#define NOT_READY           0x02
 181#define MEDIUM_ERROR        0x03
 182#define HARDWARE_ERROR      0x04
 183#define ILLEGAL_REQUEST     0x05
 184#define UNIT_ATTENTION      0x06
 185#define DATA_PROTECT        0x07
 186#define BLANK_CHECK         0x08
 187#define COPY_ABORTED        0x0a
 188#define ABORTED_COMMAND     0x0b
 189#define VOLUME_OVERFLOW     0x0d
 190#define MISCOMPARE          0x0e
 191
 192
 193/*
 194 *  DEVICE TYPES
 195 */
 196
 197#define TYPE_DISK           0x00
 198#define TYPE_TAPE           0x01
 199#define TYPE_PRINTER        0x02
 200#define TYPE_PROCESSOR      0x03    /* HP scanners use this */
 201#define TYPE_WORM           0x04    /* Treated as ROM by our system */
 202#define TYPE_ROM            0x05
 203#define TYPE_SCANNER        0x06
 204#define TYPE_MOD            0x07    /* Magneto-optical disk - 
 205                                     * - treated as TYPE_DISK */
 206#define TYPE_MEDIUM_CHANGER 0x08
 207#define TYPE_COMM           0x09    /* Communications device */
 208#define TYPE_ENCLOSURE      0x0d    /* Enclosure Services Device */
 209#define TYPE_RAID           0x0c
 210#define TYPE_NO_LUN         0x7f
 211
 212/*
 213 * standard mode-select header prepended to all mode-select commands
 214 */
 215
 216struct ccs_modesel_head {
 217        __u8 _r1;                       /* reserved */
 218        __u8 medium;            /* device-specific medium type */
 219        __u8 _r2;                       /* reserved */
 220        __u8 block_desc_length; /* block descriptor length */
 221        __u8 density;           /* device-specific density code */
 222        __u8 number_blocks_hi;  /* number of blocks in this block desc */
 223        __u8 number_blocks_med;
 224        __u8 number_blocks_lo;
 225        __u8 _r3;
 226        __u8 block_length_hi;   /* block length for blocks in this desc */
 227        __u8 block_length_med;
 228        __u8 block_length_lo;
 229};
 230
 231/*
 232 * ScsiLun: 8 byte LUN.
 233 */
 234struct scsi_lun {
 235        __u8 scsi_lun[8];
 236};
 237
 238/*
 239 *  MESSAGE CODES
 240 */
 241
 242#define COMMAND_COMPLETE    0x00
 243#define EXTENDED_MESSAGE    0x01
 244#define     EXTENDED_MODIFY_DATA_POINTER    0x00
 245#define     EXTENDED_SDTR                   0x01
 246#define     EXTENDED_EXTENDED_IDENTIFY      0x02    /* SCSI-I only */
 247#define     EXTENDED_WDTR                   0x03
 248#define SAVE_POINTERS       0x02
 249#define RESTORE_POINTERS    0x03
 250#define DISCONNECT          0x04
 251#define INITIATOR_ERROR     0x05
 252#define ABORT               0x06
 253#define MESSAGE_REJECT      0x07
 254#define NOP                 0x08
 255#define MSG_PARITY_ERROR    0x09
 256#define LINKED_CMD_COMPLETE 0x0a
 257#define LINKED_FLG_CMD_COMPLETE 0x0b
 258#define BUS_DEVICE_RESET    0x0c
 259
 260#define INITIATE_RECOVERY   0x0f            /* SCSI-II only */
 261#define RELEASE_RECOVERY    0x10            /* SCSI-II only */
 262
 263#define SIMPLE_QUEUE_TAG    0x20
 264#define HEAD_OF_QUEUE_TAG   0x21
 265#define ORDERED_QUEUE_TAG   0x22
 266
 267/*
 268 * Host byte codes
 269 */
 270
 271#define DID_OK          0x00    /* NO error                                */
 272#define DID_NO_CONNECT  0x01    /* Couldn't connect before timeout period  */
 273#define DID_BUS_BUSY    0x02    /* BUS stayed busy through time out period */
 274#define DID_TIME_OUT    0x03    /* TIMED OUT for other reason              */
 275#define DID_BAD_TARGET  0x04    /* BAD target.                             */
 276#define DID_ABORT       0x05    /* Told to abort for some other reason     */
 277#define DID_PARITY      0x06    /* Parity error                            */
 278#define DID_ERROR       0x07    /* Internal error                          */
 279#define DID_RESET       0x08    /* Reset by somebody.                      */
 280#define DID_BAD_INTR    0x09    /* Got an interrupt we weren't expecting.  */
 281#define DID_PASSTHROUGH 0x0a    /* Force command past mid-layer            */
 282#define DID_SOFT_ERROR  0x0b    /* The low level driver just wish a retry  */
 283#define DID_IMM_RETRY   0x0c    /* Retry without decrementing retry count  */
 284#define DRIVER_OK       0x00    /* Driver status                           */
 285
 286/*
 287 *  These indicate the error that occurred, and what is available.
 288 */
 289
 290#define DRIVER_BUSY         0x01
 291#define DRIVER_SOFT         0x02
 292#define DRIVER_MEDIA        0x03
 293#define DRIVER_ERROR        0x04
 294
 295#define DRIVER_INVALID      0x05
 296#define DRIVER_TIMEOUT      0x06
 297#define DRIVER_HARD         0x07
 298#define DRIVER_SENSE        0x08
 299
 300#define SUGGEST_RETRY       0x10
 301#define SUGGEST_ABORT       0x20
 302#define SUGGEST_REMAP       0x30
 303#define SUGGEST_DIE         0x40
 304#define SUGGEST_SENSE       0x80
 305#define SUGGEST_IS_OK       0xff
 306
 307#define DRIVER_MASK         0x0f
 308#define SUGGEST_MASK        0xf0
 309
 310/*
 311 * Internal return values.
 312 */
 313
 314#define NEEDS_RETRY     0x2001
 315#define SUCCESS         0x2002
 316#define FAILED          0x2003
 317#define QUEUED          0x2004
 318#define SOFT_ERROR      0x2005
 319#define ADD_TO_MLQUEUE  0x2006
 320#define TIMEOUT_ERROR   0x2007
 321
 322/*
 323 * Midlevel queue return values.
 324 */
 325#define SCSI_MLQUEUE_HOST_BUSY   0x1055
 326#define SCSI_MLQUEUE_DEVICE_BUSY 0x1056
 327#define SCSI_MLQUEUE_EH_RETRY    0x1057
 328
 329/*
 330 *  Use these to separate status msg and our bytes
 331 *
 332 *  These are set by:
 333 *
 334 *      status byte = set from target device
 335 *      msg_byte    = return status from host adapter itself.
 336 *      host_byte   = set by low-level driver to indicate status.
 337 *      driver_byte = set by mid-level.
 338 */
 339#define status_byte(result) (((result) >> 1) & 0x1f)
 340#define msg_byte(result)    (((result) >> 8) & 0xff)
 341#define host_byte(result)   (((result) >> 16) & 0xff)
 342#define driver_byte(result) (((result) >> 24) & 0xff)
 343#define suggestion(result)  (driver_byte(result) & SUGGEST_MASK)
 344
 345#define sense_class(sense)  (((sense) >> 4) & 0x7)
 346#define sense_error(sense)  ((sense) & 0xf)
 347#define sense_valid(sense)  ((sense) & 0x80);
 348
 349
 350#define IDENTIFY_BASE       0x80
 351#define IDENTIFY(can_disconnect, lun)   (IDENTIFY_BASE |\
 352                     ((can_disconnect) ?  0x40 : 0) |\
 353                     ((lun) & 0x07))
 354
 355/*
 356 *  SCSI command sets
 357 */
 358
 359#define SCSI_UNKNOWN    0
 360#define SCSI_1          1
 361#define SCSI_1_CCS      2
 362#define SCSI_2          3
 363#define SCSI_3          4
 364
 365/*
 366 * INQ PERIPHERAL QUALIFIERS
 367 */
 368#define SCSI_INQ_PQ_CON         0x00
 369#define SCSI_INQ_PQ_NOT_CON     0x01
 370#define SCSI_INQ_PQ_NOT_CAP     0x03
 371
 372
 373/*
 374 * Here are some scsi specific ioctl commands which are sometimes useful.
 375 *
 376 * Note that include/linux/cdrom.h also defines IOCTL 0x5300 - 0x5395
 377 */
 378
 379/* Used to obtain PUN and LUN info.  Conflicts with CDROMAUDIOBUFSIZ */
 380#define SCSI_IOCTL_GET_IDLUN            0x5382
 381
 382/* 0x5383 and 0x5384 were used for SCSI_IOCTL_TAGGED_{ENABLE,DISABLE} */
 383
 384/* Used to obtain the host number of a device. */
 385#define SCSI_IOCTL_PROBE_HOST           0x5385
 386
 387/* Used to obtain the bus number for a device */
 388#define SCSI_IOCTL_GET_BUS_NUMBER       0x5386
 389
 390/* Used to obtain the PCI location of a device */
 391#define SCSI_IOCTL_GET_PCI              0x5387
 392
 393#endif /* _SCSI_SCSI_H */
 394
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.