0001
0002
0003
0004
0005
0006 #ifndef _SCSI_SCSI_H
0007 #define _SCSI_SCSI_H
0008
0009 #include <linux/types.h>
0010 #include <linux/scatterlist.h>
0011 #include <linux/kernel.h>
0012 #include <scsi/scsi_common.h>
0013 #include <scsi/scsi_proto.h>
0014 #include <scsi/scsi_status.h>
0015
0016 struct scsi_cmnd;
0017
0018 enum scsi_timeouts {
0019 SCSI_DEFAULT_EH_TIMEOUT = 10 * HZ,
0020 };
0021
0022
0023
0024
0025
0026 #define SCSI_MAX_PROT_SG_SEGMENTS 0xFFFF
0027
0028
0029
0030
0031
0032 #define SCAN_WILD_CARD ~0
0033
0034
0035
0036
0037
0038 struct ccs_modesel_head {
0039 __u8 _r1;
0040 __u8 medium;
0041 __u8 _r2;
0042 __u8 block_desc_length;
0043 __u8 density;
0044 __u8 number_blocks_hi;
0045 __u8 number_blocks_med;
0046 __u8 number_blocks_lo;
0047 __u8 _r3;
0048 __u8 block_length_hi;
0049 __u8 block_length_med;
0050 __u8 block_length_lo;
0051 };
0052
0053
0054
0055
0056 #define SCSI_W_LUN_BASE 0xc100
0057 #define SCSI_W_LUN_REPORT_LUNS (SCSI_W_LUN_BASE + 1)
0058 #define SCSI_W_LUN_ACCESS_CONTROL (SCSI_W_LUN_BASE + 2)
0059 #define SCSI_W_LUN_TARGET_LOG_PAGE (SCSI_W_LUN_BASE + 3)
0060
0061 static inline int scsi_is_wlun(u64 lun)
0062 {
0063 return (lun & 0xff00) == SCSI_W_LUN_BASE;
0064 }
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074 static inline int scsi_status_is_check_condition(int status)
0075 {
0076 if (status < 0)
0077 return false;
0078 status &= 0xfe;
0079 return status == SAM_STAT_CHECK_CONDITION;
0080 }
0081
0082
0083
0084
0085 #define EXTENDED_MODIFY_DATA_POINTER 0x00
0086 #define EXTENDED_SDTR 0x01
0087 #define EXTENDED_EXTENDED_IDENTIFY 0x02
0088 #define EXTENDED_WDTR 0x03
0089 #define EXTENDED_PPR 0x04
0090 #define EXTENDED_MODIFY_BIDI_DATA_PTR 0x05
0091
0092
0093
0094
0095 enum scsi_disposition {
0096 NEEDS_RETRY = 0x2001,
0097 SUCCESS = 0x2002,
0098 FAILED = 0x2003,
0099 QUEUED = 0x2004,
0100 SOFT_ERROR = 0x2005,
0101 ADD_TO_MLQUEUE = 0x2006,
0102 TIMEOUT_ERROR = 0x2007,
0103 SCSI_RETURN_NOT_HANDLED = 0x2008,
0104 FAST_IO_FAIL = 0x2009,
0105 };
0106
0107
0108
0109
0110 #define SCSI_MLQUEUE_HOST_BUSY 0x1055
0111 #define SCSI_MLQUEUE_DEVICE_BUSY 0x1056
0112 #define SCSI_MLQUEUE_EH_RETRY 0x1057
0113 #define SCSI_MLQUEUE_TARGET_BUSY 0x1058
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124 #define host_byte(result) (((result) >> 16) & 0xff)
0125
0126 #define sense_class(sense) (((sense) >> 4) & 0x7)
0127 #define sense_error(sense) ((sense) & 0xf)
0128 #define sense_valid(sense) ((sense) & 0x80)
0129
0130
0131
0132
0133 #define FORMAT_UNIT_TIMEOUT (2 * 60 * 60 * HZ)
0134 #define START_STOP_TIMEOUT (60 * HZ)
0135 #define MOVE_MEDIUM_TIMEOUT (5 * 60 * HZ)
0136 #define READ_ELEMENT_STATUS_TIMEOUT (5 * 60 * HZ)
0137 #define READ_DEFECT_DATA_TIMEOUT (60 * HZ )
0138
0139
0140 #define IDENTIFY_BASE 0x80
0141 #define IDENTIFY(can_disconnect, lun) (IDENTIFY_BASE |\
0142 ((can_disconnect) ? 0x40 : 0) |\
0143 ((lun) & 0x07))
0144
0145
0146
0147
0148
0149
0150
0151
0152 #define SCSI_UNKNOWN 0
0153 #define SCSI_1 1
0154 #define SCSI_1_CCS 2
0155 #define SCSI_2 3
0156 #define SCSI_3 4
0157 #define SCSI_SPC_2 5
0158 #define SCSI_SPC_3 6
0159
0160
0161
0162
0163 #define SCSI_INQ_PQ_CON 0x00
0164 #define SCSI_INQ_PQ_NOT_CON 0x01
0165 #define SCSI_INQ_PQ_NOT_CAP 0x03
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175 #define SCSI_IOCTL_GET_IDLUN 0x5382
0176
0177
0178
0179
0180 #define SCSI_IOCTL_PROBE_HOST 0x5385
0181
0182
0183 #define SCSI_IOCTL_GET_BUS_NUMBER 0x5386
0184
0185
0186 #define SCSI_IOCTL_GET_PCI 0x5387
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196 static inline bool scsi_status_is_good(int status)
0197 {
0198 if (status < 0)
0199 return false;
0200
0201 if (host_byte(status) == DID_NO_CONNECT)
0202 return false;
0203
0204
0205
0206
0207
0208
0209 status &= 0xfe;
0210 return ((status == SAM_STAT_GOOD) ||
0211 (status == SAM_STAT_CONDITION_MET) ||
0212
0213 (status == SAM_STAT_INTERMEDIATE) ||
0214 (status == SAM_STAT_INTERMEDIATE_CONDITION_MET) ||
0215
0216 (status == SAM_STAT_COMMAND_TERMINATED));
0217 }
0218
0219 #endif