Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * This header file contains public constants and structures used by
0004  * both the SCSI initiator and the SCSI target code.
0005  *
0006  * For documentation on the OPCODES, MESSAGES, and SENSE values,
0007  * please consult the SCSI standard.
0008  */
0009 
0010 #ifndef _SCSI_PROTO_H_
0011 #define _SCSI_PROTO_H_
0012 
0013 #include <linux/types.h>
0014 
0015 /*
0016  *      SCSI opcodes
0017  */
0018 
0019 #define TEST_UNIT_READY       0x00
0020 #define REZERO_UNIT           0x01
0021 #define REQUEST_SENSE         0x03
0022 #define FORMAT_UNIT           0x04
0023 #define READ_BLOCK_LIMITS     0x05
0024 #define REASSIGN_BLOCKS       0x07
0025 #define INITIALIZE_ELEMENT_STATUS 0x07
0026 #define READ_6                0x08
0027 #define WRITE_6               0x0a
0028 #define SEEK_6                0x0b
0029 #define READ_REVERSE          0x0f
0030 #define WRITE_FILEMARKS       0x10
0031 #define SPACE                 0x11
0032 #define INQUIRY               0x12
0033 #define RECOVER_BUFFERED_DATA 0x14
0034 #define MODE_SELECT           0x15
0035 #define RESERVE               0x16
0036 #define RELEASE               0x17
0037 #define COPY                  0x18
0038 #define ERASE                 0x19
0039 #define MODE_SENSE            0x1a
0040 #define START_STOP            0x1b
0041 #define RECEIVE_DIAGNOSTIC    0x1c
0042 #define SEND_DIAGNOSTIC       0x1d
0043 #define ALLOW_MEDIUM_REMOVAL  0x1e
0044 
0045 #define READ_FORMAT_CAPACITIES 0x23
0046 #define SET_WINDOW            0x24
0047 #define READ_CAPACITY         0x25
0048 #define READ_10               0x28
0049 #define WRITE_10              0x2a
0050 #define SEEK_10               0x2b
0051 #define POSITION_TO_ELEMENT   0x2b
0052 #define WRITE_VERIFY          0x2e
0053 #define VERIFY                0x2f
0054 #define SEARCH_HIGH           0x30
0055 #define SEARCH_EQUAL          0x31
0056 #define SEARCH_LOW            0x32
0057 #define SET_LIMITS            0x33
0058 #define PRE_FETCH             0x34
0059 #define READ_POSITION         0x34
0060 #define SYNCHRONIZE_CACHE     0x35
0061 #define LOCK_UNLOCK_CACHE     0x36
0062 #define READ_DEFECT_DATA      0x37
0063 #define MEDIUM_SCAN           0x38
0064 #define COMPARE               0x39
0065 #define COPY_VERIFY           0x3a
0066 #define WRITE_BUFFER          0x3b
0067 #define READ_BUFFER           0x3c
0068 #define UPDATE_BLOCK          0x3d
0069 #define READ_LONG             0x3e
0070 #define WRITE_LONG            0x3f
0071 #define CHANGE_DEFINITION     0x40
0072 #define WRITE_SAME            0x41
0073 #define UNMAP             0x42
0074 #define READ_TOC              0x43
0075 #define READ_HEADER           0x44
0076 #define GET_EVENT_STATUS_NOTIFICATION 0x4a
0077 #define LOG_SELECT            0x4c
0078 #define LOG_SENSE             0x4d
0079 #define XDWRITEREAD_10        0x53
0080 #define MODE_SELECT_10        0x55
0081 #define RESERVE_10            0x56
0082 #define RELEASE_10            0x57
0083 #define MODE_SENSE_10         0x5a
0084 #define PERSISTENT_RESERVE_IN 0x5e
0085 #define PERSISTENT_RESERVE_OUT 0x5f
0086 #define VARIABLE_LENGTH_CMD   0x7f
0087 #define REPORT_LUNS           0xa0
0088 #define SECURITY_PROTOCOL_IN  0xa2
0089 #define MAINTENANCE_IN        0xa3
0090 #define MAINTENANCE_OUT       0xa4
0091 #define MOVE_MEDIUM           0xa5
0092 #define EXCHANGE_MEDIUM       0xa6
0093 #define READ_12               0xa8
0094 #define SERVICE_ACTION_OUT_12 0xa9
0095 #define WRITE_12              0xaa
0096 #define READ_MEDIA_SERIAL_NUMBER 0xab /* Obsolete with SPC-2 */
0097 #define SERVICE_ACTION_IN_12  0xab
0098 #define WRITE_VERIFY_12       0xae
0099 #define VERIFY_12         0xaf
0100 #define SEARCH_HIGH_12        0xb0
0101 #define SEARCH_EQUAL_12       0xb1
0102 #define SEARCH_LOW_12         0xb2
0103 #define SECURITY_PROTOCOL_OUT 0xb5
0104 #define READ_ELEMENT_STATUS   0xb8
0105 #define SEND_VOLUME_TAG       0xb6
0106 #define WRITE_LONG_2          0xea
0107 #define EXTENDED_COPY         0x83
0108 #define RECEIVE_COPY_RESULTS  0x84
0109 #define ACCESS_CONTROL_IN     0x86
0110 #define ACCESS_CONTROL_OUT    0x87
0111 #define READ_16               0x88
0112 #define COMPARE_AND_WRITE     0x89
0113 #define WRITE_16              0x8a
0114 #define READ_ATTRIBUTE        0x8c
0115 #define WRITE_ATTRIBUTE       0x8d
0116 #define WRITE_VERIFY_16       0x8e
0117 #define VERIFY_16         0x8f
0118 #define SYNCHRONIZE_CACHE_16  0x91
0119 #define WRITE_SAME_16         0x93
0120 #define ZBC_OUT           0x94
0121 #define ZBC_IN            0x95
0122 #define SERVICE_ACTION_BIDIRECTIONAL 0x9d
0123 #define SERVICE_ACTION_IN_16  0x9e
0124 #define SERVICE_ACTION_OUT_16 0x9f
0125 /* values for service action in */
0126 #define SAI_READ_CAPACITY_16  0x10
0127 #define SAI_GET_LBA_STATUS    0x12
0128 #define SAI_REPORT_REFERRALS  0x13
0129 /* values for maintenance in */
0130 #define MI_REPORT_IDENTIFYING_INFORMATION 0x05
0131 #define MI_REPORT_TARGET_PGS  0x0a
0132 #define MI_REPORT_ALIASES     0x0b
0133 #define MI_REPORT_SUPPORTED_OPERATION_CODES 0x0c
0134 #define MI_REPORT_SUPPORTED_TASK_MANAGEMENT_FUNCTIONS 0x0d
0135 #define MI_REPORT_PRIORITY    0x0e
0136 #define MI_REPORT_TIMESTAMP   0x0f
0137 #define MI_MANAGEMENT_PROTOCOL_IN 0x10
0138 /* value for MI_REPORT_TARGET_PGS ext header */
0139 #define MI_EXT_HDR_PARAM_FMT  0x20
0140 /* values for maintenance out */
0141 #define MO_SET_IDENTIFYING_INFORMATION 0x06
0142 #define MO_SET_TARGET_PGS     0x0a
0143 #define MO_CHANGE_ALIASES     0x0b
0144 #define MO_SET_PRIORITY       0x0e
0145 #define MO_SET_TIMESTAMP      0x0f
0146 #define MO_MANAGEMENT_PROTOCOL_OUT 0x10
0147 /* values for ZBC_IN */
0148 #define ZI_REPORT_ZONES       0x00
0149 /* values for ZBC_OUT */
0150 #define ZO_CLOSE_ZONE         0x01
0151 #define ZO_FINISH_ZONE        0x02
0152 #define ZO_OPEN_ZONE          0x03
0153 #define ZO_RESET_WRITE_POINTER 0x04
0154 /* values for variable length command */
0155 #define XDREAD_32         0x03
0156 #define XDWRITE_32        0x04
0157 #define XPWRITE_32        0x06
0158 #define XDWRITEREAD_32        0x07
0159 #define READ_32           0x09
0160 #define VERIFY_32         0x0a
0161 #define WRITE_32          0x0b
0162 #define WRITE_VERIFY_32       0x0c
0163 #define WRITE_SAME_32         0x0d
0164 #define ATA_32            0x1ff0
0165 
0166 /* Values for T10/04-262r7 */
0167 #define ATA_16            0x85  /* 16-byte pass-thru */
0168 #define ATA_12            0xa1  /* 12-byte pass-thru */
0169 
0170 /* Vendor specific CDBs start here */
0171 #define VENDOR_SPECIFIC_CDB 0xc0
0172 
0173 /*
0174  *  SCSI command lengths
0175  */
0176 
0177 #define SCSI_MAX_VARLEN_CDB_SIZE 260
0178 
0179 /* defined in T10 SCSI Primary Commands-2 (SPC2) */
0180 struct scsi_varlen_cdb_hdr {
0181     __u8 opcode;        /* opcode always == VARIABLE_LENGTH_CMD */
0182     __u8 control;
0183     __u8 misc[5];
0184     __u8 additional_cdb_length;         /* total cdb length - 8 */
0185     __be16 service_action;
0186     /* service specific data follows */
0187 };
0188 
0189 /*
0190  *  SCSI Architecture Model (SAM) Status codes. Taken from SAM-3 draft
0191  *  T10/1561-D Revision 4 Draft dated 7th November 2002.
0192  */
0193 enum sam_status {
0194     SAM_STAT_GOOD               = 0x00,
0195     SAM_STAT_CHECK_CONDITION        = 0x02,
0196     SAM_STAT_CONDITION_MET          = 0x04,
0197     SAM_STAT_BUSY               = 0x08,
0198     SAM_STAT_INTERMEDIATE           = 0x10,
0199     SAM_STAT_INTERMEDIATE_CONDITION_MET = 0x14,
0200     SAM_STAT_RESERVATION_CONFLICT       = 0x18,
0201     SAM_STAT_COMMAND_TERMINATED     = 0x22, /* obsolete in SAM-3 */
0202     SAM_STAT_TASK_SET_FULL          = 0x28,
0203     SAM_STAT_ACA_ACTIVE         = 0x30,
0204     SAM_STAT_TASK_ABORTED           = 0x40,
0205 };
0206 
0207 #define STATUS_MASK         0xfe
0208 /*
0209  *  SENSE KEYS
0210  */
0211 
0212 #define NO_SENSE            0x00
0213 #define RECOVERED_ERROR     0x01
0214 #define NOT_READY           0x02
0215 #define MEDIUM_ERROR        0x03
0216 #define HARDWARE_ERROR      0x04
0217 #define ILLEGAL_REQUEST     0x05
0218 #define UNIT_ATTENTION      0x06
0219 #define DATA_PROTECT        0x07
0220 #define BLANK_CHECK         0x08
0221 #define VENDOR_SPECIFIC     0x09
0222 #define COPY_ABORTED        0x0a
0223 #define ABORTED_COMMAND     0x0b
0224 #define VOLUME_OVERFLOW     0x0d
0225 #define MISCOMPARE          0x0e
0226 
0227 
0228 /*
0229  *  DEVICE TYPES
0230  *  Please keep them in 0x%02x format for $MODALIAS to work
0231  */
0232 
0233 #define TYPE_DISK           0x00
0234 #define TYPE_TAPE           0x01
0235 #define TYPE_PRINTER        0x02
0236 #define TYPE_PROCESSOR      0x03    /* HP scanners use this */
0237 #define TYPE_WORM           0x04    /* Treated as ROM by our system */
0238 #define TYPE_ROM            0x05
0239 #define TYPE_SCANNER        0x06
0240 #define TYPE_MOD            0x07    /* Magneto-optical disk -
0241                      * - treated as TYPE_DISK */
0242 #define TYPE_MEDIUM_CHANGER 0x08
0243 #define TYPE_COMM           0x09    /* Communications device */
0244 #define TYPE_RAID           0x0c
0245 #define TYPE_ENCLOSURE      0x0d    /* Enclosure Services Device */
0246 #define TYPE_RBC        0x0e
0247 #define TYPE_OSD            0x11
0248 #define TYPE_ZBC            0x14
0249 #define TYPE_WLUN           0x1e    /* well-known logical unit */
0250 #define TYPE_NO_LUN         0x7f
0251 
0252 /* SCSI protocols; these are taken from SPC-3 section 7.5 */
0253 enum scsi_protocol {
0254     SCSI_PROTOCOL_FCP = 0,  /* Fibre Channel */
0255     SCSI_PROTOCOL_SPI = 1,  /* parallel SCSI */
0256     SCSI_PROTOCOL_SSA = 2,  /* Serial Storage Architecture - Obsolete */
0257     SCSI_PROTOCOL_SBP = 3,  /* firewire */
0258     SCSI_PROTOCOL_SRP = 4,  /* Infiniband RDMA */
0259     SCSI_PROTOCOL_ISCSI = 5,
0260     SCSI_PROTOCOL_SAS = 6,
0261     SCSI_PROTOCOL_ADT = 7,  /* Media Changers */
0262     SCSI_PROTOCOL_ATA = 8,
0263     SCSI_PROTOCOL_UNSPEC = 0xf, /* No specific protocol */
0264 };
0265 
0266 /*
0267  * ScsiLun: 8 byte LUN.
0268  */
0269 struct scsi_lun {
0270     __u8 scsi_lun[8];
0271 };
0272 
0273 /* SPC asymmetric access states */
0274 #define SCSI_ACCESS_STATE_OPTIMAL     0x00
0275 #define SCSI_ACCESS_STATE_ACTIVE      0x01
0276 #define SCSI_ACCESS_STATE_STANDBY     0x02
0277 #define SCSI_ACCESS_STATE_UNAVAILABLE 0x03
0278 #define SCSI_ACCESS_STATE_LBA         0x04
0279 #define SCSI_ACCESS_STATE_OFFLINE     0x0e
0280 #define SCSI_ACCESS_STATE_TRANSITIONING 0x0f
0281 
0282 /* Values for REPORT TARGET GROUP STATES */
0283 #define SCSI_ACCESS_STATE_MASK        0x0f
0284 #define SCSI_ACCESS_STATE_PREFERRED   0x80
0285 
0286 /* Reporting options for REPORT ZONES */
0287 enum zbc_zone_reporting_options {
0288     ZBC_ZONE_REPORTING_OPTION_ALL       = 0x00,
0289     ZBC_ZONE_REPORTING_OPTION_EMPTY     = 0x01,
0290     ZBC_ZONE_REPORTING_OPTION_IMPLICIT_OPEN = 0x02,
0291     ZBC_ZONE_REPORTING_OPTION_EXPLICIT_OPEN = 0x03,
0292     ZBC_ZONE_REPORTING_OPTION_CLOSED    = 0x04,
0293     ZBC_ZONE_REPORTING_OPTION_FULL      = 0x05,
0294     ZBC_ZONE_REPORTING_OPTION_READONLY  = 0x06,
0295     ZBC_ZONE_REPORTING_OPTION_OFFLINE   = 0x07,
0296     /* 0x08 to 0x0f are reserved */
0297     ZBC_ZONE_REPORTING_OPTION_NEED_RESET_WP = 0x10,
0298     ZBC_ZONE_REPORTING_OPTION_NON_SEQWRITE  = 0x11,
0299     /* 0x12 to 0x3e are reserved */
0300     ZBC_ZONE_REPORTING_OPTION_NON_WP    = 0x3f,
0301 };
0302 
0303 #define ZBC_REPORT_ZONE_PARTIAL 0x80
0304 
0305 /* Zone types of REPORT ZONES zone descriptors */
0306 enum zbc_zone_type {
0307     ZBC_ZONE_TYPE_CONV      = 0x1,
0308     ZBC_ZONE_TYPE_SEQWRITE_REQ  = 0x2,
0309     ZBC_ZONE_TYPE_SEQWRITE_PREF = 0x3,
0310     ZBC_ZONE_TYPE_SEQ_OR_BEFORE_REQ = 0x4,
0311     ZBC_ZONE_TYPE_GAP       = 0x5,
0312     /* 0x6 to 0xf are reserved */
0313 };
0314 
0315 /* Zone conditions of REPORT ZONES zone descriptors */
0316 enum zbc_zone_cond {
0317     ZBC_ZONE_COND_NO_WP     = 0x0,
0318     ZBC_ZONE_COND_EMPTY     = 0x1,
0319     ZBC_ZONE_COND_IMP_OPEN      = 0x2,
0320     ZBC_ZONE_COND_EXP_OPEN      = 0x3,
0321     ZBC_ZONE_COND_CLOSED        = 0x4,
0322     /* 0x5 to 0xc are reserved */
0323     ZBC_ZONE_COND_READONLY      = 0xd,
0324     ZBC_ZONE_COND_FULL      = 0xe,
0325     ZBC_ZONE_COND_OFFLINE       = 0xf,
0326 };
0327 
0328 enum zbc_zone_alignment_method {
0329     ZBC_CONSTANT_ZONE_LENGTH    = 0x1,
0330     ZBC_CONSTANT_ZONE_START_OFFSET  = 0x8,
0331 };
0332 
0333 /* Version descriptor values for INQUIRY */
0334 enum scsi_version_descriptor {
0335     SCSI_VERSION_DESCRIPTOR_FCP4    = 0x0a40,
0336     SCSI_VERSION_DESCRIPTOR_ISCSI   = 0x0960,
0337     SCSI_VERSION_DESCRIPTOR_SAM5    = 0x00a0,
0338     SCSI_VERSION_DESCRIPTOR_SAS3    = 0x0c60,
0339     SCSI_VERSION_DESCRIPTOR_SBC3    = 0x04c0,
0340     SCSI_VERSION_DESCRIPTOR_SBP3    = 0x0980,
0341     SCSI_VERSION_DESCRIPTOR_SPC4    = 0x0460,
0342     SCSI_VERSION_DESCRIPTOR_SRP = 0x0940
0343 };
0344 
0345 #endif /* _SCSI_PROTO_H_ */