scsipi_all.h revision 1.27 1 1.26 reinoud /* $NetBSD: scsipi_all.h,v 1.27 2005/02/01 00:19:34 reinoud Exp $ */
2 1.2 bouyer
3 1.2 bouyer /*
4 1.2 bouyer * SCSI and SCSI-like general interface description
5 1.2 bouyer */
6 1.2 bouyer
7 1.2 bouyer /*
8 1.2 bouyer * Largely written by Julian Elischer (julian (at) tfs.com)
9 1.2 bouyer * for TRW Financial Systems.
10 1.2 bouyer *
11 1.2 bouyer * TRW Financial Systems, in accordance with their agreement with Carnegie
12 1.2 bouyer * Mellon University, makes this software available to CMU to distribute
13 1.3 enami * or use in any manner that they see fit as long as this message is kept with
14 1.2 bouyer * the software. For this reason TFS also grants any other persons or
15 1.2 bouyer * organisations permission to use or modify this software.
16 1.2 bouyer *
17 1.2 bouyer * TFS supplies this software to be publicly redistributed
18 1.2 bouyer * on the understanding that TFS is not responsible for the correct
19 1.2 bouyer * functioning of this software in any circumstances.
20 1.2 bouyer *
21 1.2 bouyer * Ported to run under 386BSD by Julian Elischer (julian (at) tfs.com) Sept 1992
22 1.2 bouyer */
23 1.2 bouyer
24 1.11 thorpej #ifndef _DEV_SCSIPI_SCSIPI_ALL_H_
25 1.11 thorpej #define _DEV_SCSIPI_SCSIPI_ALL_H_
26 1.11 thorpej
27 1.2 bouyer /*
28 1.2 bouyer * SCSI-like command format and opcode
29 1.2 bouyer */
30 1.2 bouyer
31 1.8 mjacob /*
32 1.8 mjacob * Some basic, common SCSI command group definitions.
33 1.8 mjacob */
34 1.8 mjacob
35 1.8 mjacob #define CDB_GROUPID(cmd) ((cmd >> 5) & 0x7)
36 1.8 mjacob #define CDB_GROUPID_0 0
37 1.8 mjacob #define CDB_GROUPID_1 1
38 1.8 mjacob #define CDB_GROUPID_2 2
39 1.8 mjacob #define CDB_GROUPID_3 3
40 1.8 mjacob #define CDB_GROUPID_4 4
41 1.8 mjacob #define CDB_GROUPID_5 5
42 1.8 mjacob #define CDB_GROUPID_6 6
43 1.8 mjacob #define CDB_GROUPID_7 7
44 1.8 mjacob
45 1.8 mjacob #define CDB_GROUP0 6 /* 6-byte cdb's */
46 1.8 mjacob #define CDB_GROUP1 10 /* 10-byte cdb's */
47 1.8 mjacob #define CDB_GROUP2 10 /* 10-byte cdb's */
48 1.8 mjacob #define CDB_GROUP3 0 /* reserved */
49 1.8 mjacob #define CDB_GROUP4 16 /* 16-byte cdb's */
50 1.8 mjacob #define CDB_GROUP5 12 /* 12-byte cdb's */
51 1.8 mjacob #define CDB_GROUP6 0 /* vendor specific */
52 1.8 mjacob #define CDB_GROUP7 0 /* vendor specific */
53 1.8 mjacob
54 1.8 mjacob /*
55 1.8 mjacob * Some basic, common SCSI commands
56 1.8 mjacob */
57 1.2 bouyer #define TEST_UNIT_READY 0x00
58 1.2 bouyer struct scsipi_test_unit_ready {
59 1.27 reinoud u_int8_t opcode;
60 1.27 reinoud u_int8_t byte2;
61 1.27 reinoud u_int8_t unused[3];
62 1.27 reinoud u_int8_t control;
63 1.2 bouyer };
64 1.2 bouyer
65 1.3 enami #define REQUEST_SENSE 0x03
66 1.2 bouyer struct scsipi_sense {
67 1.27 reinoud u_int8_t opcode;
68 1.27 reinoud u_int8_t byte2;
69 1.27 reinoud u_int8_t unused[2];
70 1.27 reinoud u_int8_t length;
71 1.27 reinoud u_int8_t control;
72 1.2 bouyer };
73 1.2 bouyer
74 1.17 bouyer #define MODE_SENSE 0x1a
75 1.17 bouyer struct scsipi_mode_sense {
76 1.27 reinoud u_int8_t opcode;
77 1.27 reinoud u_int8_t byte2;
78 1.17 bouyer #define SMS_DBD 0x08 /* disable block descriptors */
79 1.27 reinoud u_int8_t page;
80 1.17 bouyer #define SMS_PAGE_CODE 0x3F
81 1.17 bouyer #define SMS_PAGE_CTRL 0xC0
82 1.17 bouyer #define SMS_PAGE_CTRL_CURRENT 0x00
83 1.17 bouyer #define SMS_PAGE_CTRL_CHANGEABLE 0x40
84 1.17 bouyer #define SMS_PAGE_CTRL_DEFAULT 0x80
85 1.17 bouyer #define SMS_PAGE_CTRL_SAVED 0xC0
86 1.27 reinoud u_int8_t unused;
87 1.27 reinoud u_int8_t length;
88 1.27 reinoud u_int8_t control;
89 1.18 is } __attribute__((packed));
90 1.17 bouyer
91 1.17 bouyer #define MODE_SENSE_BIG 0x5A
92 1.17 bouyer struct scsipi_mode_sense_big {
93 1.27 reinoud u_int8_t opcode;
94 1.27 reinoud u_int8_t byte2; /* same bits as small version */
95 1.27 reinoud u_int8_t page; /* same bits as small version */
96 1.27 reinoud u_int8_t unused[4];
97 1.27 reinoud u_int8_t length[2];
98 1.27 reinoud u_int8_t control;
99 1.18 is } __attribute__((packed));
100 1.17 bouyer
101 1.17 bouyer #define MODE_SELECT 0x15
102 1.17 bouyer struct scsipi_mode_select {
103 1.27 reinoud u_int8_t opcode;
104 1.27 reinoud u_int8_t byte2;
105 1.17 bouyer #define SMS_SP 0x01 /* save page */
106 1.21 thorpej #define SMS_PF 0x10 /* page format (0 = SCSI-1, 1 = SCSI-2) */
107 1.27 reinoud u_int8_t unused[2];
108 1.27 reinoud u_int8_t length;
109 1.27 reinoud u_int8_t control;
110 1.18 is } __attribute__((packed));
111 1.17 bouyer
112 1.17 bouyer #define MODE_SELECT_BIG 0x55
113 1.17 bouyer struct scsipi_mode_select_big {
114 1.27 reinoud u_int8_t opcode;
115 1.27 reinoud u_int8_t byte2; /* same bits as small version */
116 1.27 reinoud u_int8_t unused[5];
117 1.27 reinoud u_int8_t length[2];
118 1.27 reinoud u_int8_t control;
119 1.18 is } __attribute__((packed));
120 1.17 bouyer
121 1.3 enami #define INQUIRY 0x12
122 1.2 bouyer struct scsipi_inquiry {
123 1.27 reinoud u_int8_t opcode;
124 1.27 reinoud u_int8_t byte2;
125 1.27 reinoud u_int8_t unused[2];
126 1.27 reinoud u_int8_t length;
127 1.27 reinoud u_int8_t control;
128 1.18 is } __attribute__((packed));
129 1.22 soren
130 1.22 soren #define START_STOP 0x1b
131 1.22 soren struct scsipi_start_stop {
132 1.27 reinoud u_int8_t opcode;
133 1.27 reinoud u_int8_t byte2;
134 1.27 reinoud u_int8_t unused[2];
135 1.27 reinoud u_int8_t how;
136 1.22 soren #define SSS_STOP 0x00
137 1.22 soren #define SSS_START 0x01
138 1.22 soren #define SSS_LOEJ 0x02
139 1.27 reinoud u_int8_t control;
140 1.22 soren };
141 1.2 bouyer
142 1.3 enami #define PREVENT_ALLOW 0x1e
143 1.2 bouyer struct scsipi_prevent {
144 1.27 reinoud u_int8_t opcode;
145 1.27 reinoud u_int8_t byte2;
146 1.27 reinoud u_int8_t unused[2];
147 1.27 reinoud u_int8_t how;
148 1.27 reinoud u_int8_t control;
149 1.18 is } __attribute__((packed));
150 1.2 bouyer #define PR_PREVENT 0x01
151 1.3 enami #define PR_ALLOW 0x00
152 1.2 bouyer
153 1.2 bouyer /*
154 1.2 bouyer * inquiry and sense data format
155 1.2 bouyer */
156 1.2 bouyer
157 1.2 bouyer struct scsipi_sense_data {
158 1.27 reinoud /* 1*/ u_int8_t error_code;
159 1.3 enami #define SSD_ERRCODE 0x7F
160 1.3 enami #define SSD_ERRCODE_VALID 0x80
161 1.27 reinoud /* 2*/ u_int8_t segment;
162 1.27 reinoud /* 3*/ u_int8_t flags;
163 1.3 enami #define SSD_KEY 0x0F
164 1.3 enami #define SSD_ILI 0x20
165 1.3 enami #define SSD_EOM 0x40
166 1.3 enami #define SSD_FILEMARK 0x80
167 1.27 reinoud /* 7*/ u_int8_t info[4];
168 1.27 reinoud /* 8*/ u_int8_t extra_len;
169 1.27 reinoud /*12*/ u_int8_t cmd_spec_info[4];
170 1.27 reinoud /*13*/ u_int8_t add_sense_code;
171 1.27 reinoud /*14*/ u_int8_t add_sense_code_qual;
172 1.27 reinoud /*15*/ u_int8_t fru;
173 1.27 reinoud /*16*/ u_int8_t sense_key_spec_1;
174 1.3 enami #define SSD_SCS_VALID 0x80
175 1.27 reinoud /*17*/ u_int8_t sense_key_spec_2;
176 1.27 reinoud /*18*/ u_int8_t sense_key_spec_3;
177 1.27 reinoud /*32*/ u_int8_t extra_bytes[14];
178 1.18 is } __attribute__((packed));
179 1.9 mjacob
180 1.9 mjacob #define SKEY_NO_SENSE 0x00
181 1.10 mjacob #define SKEY_RECOVERED_ERROR 0x01
182 1.9 mjacob #define SKEY_NOT_READY 0x02
183 1.9 mjacob #define SKEY_MEDIUM_ERROR 0x03
184 1.9 mjacob #define SKEY_HARDWARE_ERROR 0x04
185 1.9 mjacob #define SKEY_ILLEGAL_REQUEST 0x05
186 1.9 mjacob #define SKEY_UNIT_ATTENTION 0x06
187 1.9 mjacob #define SKEY_WRITE_PROTECT 0x07
188 1.9 mjacob #define SKEY_BLANK_CHECK 0x08
189 1.9 mjacob #define SKEY_VENDOR_UNIQUE 0x09
190 1.9 mjacob #define SKEY_COPY_ABORTED 0x0A
191 1.9 mjacob #define SKEY_ABORTED_COMMAND 0x0B
192 1.9 mjacob #define SKEY_EQUAL 0x0C
193 1.9 mjacob #define SKEY_VOLUME_OVERFLOW 0x0D
194 1.9 mjacob #define SKEY_MISCOMPARE 0x0E
195 1.9 mjacob #define SKEY_RESERVED 0x0F
196 1.9 mjacob
197 1.4 mjacob /*
198 1.4 mjacob * Sense bytes described by the extra_len tag start at cmd_spec_info,
199 1.4 mjacob * and can only continue up to the end of the structure we've defined
200 1.4 mjacob * (which is too short for some cases).
201 1.4 mjacob */
202 1.4 mjacob #define ADD_BYTES_LIM(sp) \
203 1.12 dbj ((((int)(sp)->extra_len) < (int) sizeof(struct scsipi_sense_data) - 8)? \
204 1.12 dbj ((sp)->extra_len) : (sizeof (struct scsipi_sense_data) - 8))
205 1.4 mjacob
206 1.2 bouyer
207 1.2 bouyer struct scsipi_sense_data_unextended {
208 1.27 reinoud /* 1*/ u_int8_t error_code;
209 1.27 reinoud /* 4*/ u_int8_t block[3];
210 1.18 is } __attribute__((packed));
211 1.3 enami
212 1.5 thorpej #define T_REMOV 1 /* device is removable */
213 1.5 thorpej #define T_FIXED 0 /* device is not removable */
214 1.2 bouyer
215 1.2 bouyer /*
216 1.13 dante * According to SPC-2r16, in order to know if a U3W device support PPR,
217 1.16 bouyer * Inquiry Data structure should be at least 57 Bytes
218 1.2 bouyer */
219 1.2 bouyer
220 1.2 bouyer struct scsipi_inquiry_data {
221 1.27 reinoud /* 1*/ u_int8_t device;
222 1.16 bouyer #define SID_TYPE 0x1f /* device type mask */
223 1.16 bouyer #define SID_QUAL 0xe0 /* device qualifier mask */
224 1.16 bouyer #define SID_QUAL_LU_PRESENT 0x00 /* logical unit present */
225 1.16 bouyer #define SID_QUAL_LU_NOTPRESENT 0x20 /* logical unit not present */
226 1.16 bouyer #define SID_QUAL_reserved 0x40
227 1.16 bouyer #define SID_QUAL_LU_NOT_SUPP 0x60 /* logical unit not supported */
228 1.16 bouyer
229 1.16 bouyer #define T_DIRECT 0x00 /* direct access device */
230 1.16 bouyer #define T_SEQUENTIAL 0x01 /* sequential access device */
231 1.16 bouyer #define T_PRINTER 0x02 /* printer device */
232 1.16 bouyer #define T_PROCESSOR 0x03 /* processor device */
233 1.16 bouyer #define T_WORM 0x04 /* write once, read many device */
234 1.16 bouyer #define T_CDROM 0x05 /* cd-rom device */
235 1.16 bouyer #define T_SCANNER 0x06 /* scanner device */
236 1.16 bouyer #define T_OPTICAL 0x07 /* optical memory device */
237 1.16 bouyer #define T_CHANGER 0x08 /* medium changer device */
238 1.16 bouyer #define T_COMM 0x09 /* communication device */
239 1.16 bouyer #define T_IT8_1 0x0a /* Defined by ASC IT8... */
240 1.16 bouyer #define T_IT8_2 0x0b /* ...(Graphic arts pre-press devices) */
241 1.16 bouyer #define T_STORARRAY 0x0c /* storage array device */
242 1.16 bouyer #define T_ENCLOSURE 0x0d /* enclosure services device */
243 1.16 bouyer #define T_SIMPLE_DIRECT 0x0E /* Simplified direct-access device */
244 1.16 bouyer #define T_OPTIC_CARD_RW 0x0F /* Optical card reader/writer device */
245 1.16 bouyer #define T_OBJECT_STORED 0x11 /* Object-based Storage Device */
246 1.16 bouyer #define T_NODEVICE 0x1f
247 1.16 bouyer
248 1.27 reinoud u_int8_t dev_qual2;
249 1.16 bouyer #define SID_QUAL2 0x7F
250 1.16 bouyer #define SID_REMOVABLE 0x80
251 1.16 bouyer
252 1.27 reinoud /* 3*/ u_int8_t version;
253 1.3 enami #define SID_ANSII 0x07
254 1.3 enami #define SID_ECMA 0x38
255 1.3 enami #define SID_ISO 0xC0
256 1.16 bouyer
257 1.27 reinoud /* 4*/ u_int8_t response_format;
258 1.13 dante #define SID_RespDataFmt 0x0F
259 1.16 bouyer #define SID_FORMAT_SCSI1 0x00 /* SCSI-1 format */
260 1.16 bouyer #define SID_FORMAT_CCS 0x01 /* SCSI CCS format */
261 1.16 bouyer #define SID_FORMAT_ISO 0x02 /* ISO format */
262 1.16 bouyer
263 1.27 reinoud /* 5*/ u_int8_t additional_length; /* n-4 */
264 1.27 reinoud /* 6*/ u_int8_t flags1;
265 1.13 dante #define SID_SCC 0x80
266 1.27 reinoud /* 7*/ u_int8_t flags2;
267 1.13 dante #define SID_Addr16 0x01
268 1.16 bouyer #define SID_MChngr 0x08
269 1.13 dante #define SID_MultiPort 0x10
270 1.13 dante #define SID_EncServ 0x40
271 1.13 dante #define SID_BasQue 0x80
272 1.27 reinoud /* 8*/ u_int8_t flags3;
273 1.2 bouyer #define SID_SftRe 0x01
274 1.2 bouyer #define SID_CmdQue 0x02
275 1.2 bouyer #define SID_Linked 0x08
276 1.2 bouyer #define SID_Sync 0x10
277 1.2 bouyer #define SID_WBus16 0x20
278 1.2 bouyer #define SID_WBus32 0x40
279 1.2 bouyer #define SID_RelAdr 0x80
280 1.16 bouyer /* 9*/ char vendor[8];
281 1.16 bouyer /*17*/ char product[16];
282 1.16 bouyer /*33*/ char revision[4];
283 1.25 mycroft #define SCSIPI_INQUIRY_LENGTH_SCSI2 36
284 1.27 reinoud /*37*/ u_int8_t vendor_specific[20];
285 1.27 reinoud /*57*/ u_int8_t flags4;
286 1.16 bouyer #define SID_IUS 0x01
287 1.16 bouyer #define SID_QAS 0x02
288 1.16 bouyer #define SID_Clocking 0x0C
289 1.16 bouyer #define SID_CLOCKING_ST_ONLY 0x00
290 1.16 bouyer #define SID_CLOCKING_DT_ONLY 0x04
291 1.16 bouyer #define SID_CLOCKING_SD_DT 0x0C
292 1.27 reinoud /*58*/ u_int8_t reserved;
293 1.16 bouyer /*59*/ char version_descriptor[8][2];
294 1.25 mycroft #define SCSIPI_INQUIRY_LENGTH_SCSI3 74
295 1.18 is } __attribute__((packed)); /* 74 Bytes */
296 1.17 bouyer
297 1.17 bouyer /* Data structures for mode select/mode sense */
298 1.17 bouyer struct scsipi_mode_header {
299 1.27 reinoud u_int8_t data_length; /* Sense data length */
300 1.27 reinoud u_int8_t medium_type;
301 1.27 reinoud u_int8_t dev_spec;
302 1.27 reinoud u_int8_t blk_desc_len; /* unused on ATAPI */
303 1.18 is } __attribute__((packed));
304 1.17 bouyer
305 1.17 bouyer struct scsipi_mode_header_big {
306 1.27 reinoud u_int8_t data_length[2]; /* Sense data length */
307 1.27 reinoud u_int8_t medium_type;
308 1.27 reinoud u_int8_t dev_spec;
309 1.27 reinoud u_int8_t unused[2]; /* unused on ATAPI */
310 1.27 reinoud u_int8_t blk_desc_len[2]; /* unused on ATAPI */
311 1.18 is } __attribute__((packed));
312 1.17 bouyer
313 1.20 thorpej /*
314 1.21 thorpej * This part is common to all mode pages.
315 1.20 thorpej */
316 1.21 thorpej struct scsipi_mode_page_header {
317 1.27 reinoud u_int8_t pg_code; /* page code */
318 1.21 thorpej #define PGCODE_MASK 0x3f /* page code mask */
319 1.20 thorpej #define PGCODE_PS 0x80 /* page is savable */
320 1.27 reinoud u_int8_t pg_length; /* page length (not including hdr) */
321 1.21 thorpej } __attribute__((__packed__));
322 1.11 thorpej
323 1.11 thorpej #endif /* _DEV_SCSIPI_SCSIPI_ALL_H_ */
324