Commit | Line | Data |
---|---|---|
60f56dfc | 1 | /* |
030a8056 KB |
2 | * Copyright (c) 1990, 1993 |
3 | * The Regents of the University of California. All rights reserved. | |
60f56dfc KM |
4 | * |
5 | * This code is derived from software contributed to Berkeley by | |
6 | * Van Jacobson of Lawrence Berkeley Laboratory. | |
7 | * | |
8 | * %sccs.include.redist.c% | |
9 | * | |
030a8056 | 10 | * @(#)scsireg.h 8.1 (Berkeley) %G% |
60f56dfc KM |
11 | */ |
12 | ||
13 | /* | |
14 | * HP 98265A SCSI Interface Hardware Description. | |
15 | */ | |
16 | ||
17 | struct scsidevice { | |
18 | u_char p0, scsi_id; | |
19 | #define ID_MASK 0x1f | |
20 | #define SCSI_ID 0x07 | |
21 | #define ID_WORD_DMA 0x20 | |
22 | u_char p2, scsi_csr; | |
23 | #define CSR_IE 0x80 | |
24 | #define CSR_IR 0x40 | |
25 | #define SCSI_IPL(csr) ((((csr)>>4)&3)+3) | |
26 | #define CSR_DMA32 0x08 | |
27 | #define CSR_DMAIN 0x04 | |
28 | #define CSR_DE1 0x02 | |
29 | #define CSR_DE0 0x01 | |
30 | u_char p4, scsi_wrap; | |
31 | #define WRAP_REQ 0x80 | |
32 | #define WRAP_ACK 0x40 | |
33 | #define WRAP_BSY 0x08 | |
34 | #define WRAP_MSG 0x04 | |
35 | #define WRAP_CD 0x02 | |
36 | #define WRAP_IO 0x01 | |
37 | u_char p6, scsi_hconf; | |
38 | #define HCONF_TP 0x80 | |
39 | #define SCSI_SYNC_XFER(hconf) (((hconf)>>5)&3) | |
40 | #define HCONF_SD 0x10 | |
41 | #define HCONF_PARITY 0x08 | |
42 | u_char p8[24]; | |
43 | u_char p32, scsi_bdid; | |
44 | u_char p34, scsi_sctl; | |
45 | #define SCTL_DISABLE 0x80 | |
46 | #define SCTL_CTRLRST 0x40 | |
47 | #define SCTL_DIAG 0x20 | |
48 | #define SCTL_ABRT_ENAB 0x10 | |
49 | #define SCTL_PARITY_ENAB 0x08 | |
50 | #define SCTL_SEL_ENAB 0x04 | |
51 | #define SCTL_RESEL_ENAB 0x02 | |
52 | #define SCTL_INTR_ENAB 0x01 | |
53 | u_char p36, scsi_scmd; | |
54 | #define SCMD_RST 0x10 | |
55 | #define SCMD_ICPT_XFR 0x08 | |
56 | #define SCMD_PROG_XFR 0x04 | |
57 | #define SCMD_PAD 0x01 /* if initiator */ | |
58 | #define SCMD_PERR_STOP 0x01 /* if target */ | |
59 | /* command codes */ | |
60 | #define SCMD_BUS_REL 0x00 | |
61 | #define SCMD_SELECT 0x20 | |
62 | #define SCMD_RST_ATN 0x40 | |
63 | #define SCMD_SET_ATN 0x60 | |
64 | #define SCMD_XFR 0x80 | |
65 | #define SCMD_XFR_PAUSE 0xa0 | |
66 | #define SCMD_RST_ACK 0xc0 | |
67 | #define SCMD_SET_ACK 0xe0 | |
68 | u_char p38, scsi_tmod; | |
69 | #define TMOD_SYNC 0x80 | |
70 | u_char p40, scsi_ints; | |
71 | #define INTS_SEL 0x80 | |
72 | #define INTS_RESEL 0x40 | |
73 | #define INTS_DISCON 0x20 | |
74 | #define INTS_CMD_DONE 0x10 | |
75 | #define INTS_SRV_REQ 0x08 | |
76 | #define INTS_TIMEOUT 0x04 | |
77 | #define INTS_HARD_ERR 0x02 | |
78 | #define INTS_RST 0x01 | |
79 | u_char p42, scsi_psns; | |
80 | #define PSNS_REQ 0x80 | |
81 | #define PSNS_ACK 0x40 | |
82 | #define PSNS_ATN 0x20 | |
83 | #define PSNS_SEL 0x10 | |
84 | #define PSNS_BSY 0x08 | |
85 | u_char p44, scsi_ssts; | |
86 | #define SSTS_INITIATOR 0x80 | |
87 | #define SSTS_TARGET 0x40 | |
88 | #define SSTS_BUSY 0x20 | |
89 | #define SSTS_XFR 0x10 | |
90 | #define SSTS_ACTIVE (SSTS_INITIATOR|SSTS_XFR) | |
91 | #define SSTS_RST 0x08 | |
92 | #define SSTS_TCZERO 0x04 | |
93 | #define SSTS_DREG_FULL 0x02 | |
94 | #define SSTS_DREG_EMPTY 0x01 | |
95 | u_char p46, scsi_serr; | |
96 | #define SERR_SCSI_PAR 0x80 | |
97 | #define SERR_SPC_PAR 0x40 | |
98 | #define SERR_TC_PAR 0x08 | |
99 | #define SERR_PHASE_ERR 0x04 | |
100 | #define SERR_SHORT_XFR 0x02 | |
101 | #define SERR_OFFSET 0x01 | |
102 | u_char p48, scsi_pctl; | |
103 | #define PCTL_BFINT_ENAB 0x80 | |
104 | u_char p50, scsi_mbc; | |
105 | u_char p52, scsi_dreg; | |
106 | u_char p54, scsi_temp; | |
107 | u_char p56, scsi_tch; | |
108 | u_char p58, scsi_tcm; | |
109 | u_char p60, scsi_tcl; | |
110 | u_char p62, scsi_exbf; | |
111 | }; | |
112 | ||
113 | /* psns/pctl phase lines as bits */ | |
114 | #define PHASE_MSG 0x04 | |
115 | #define PHASE_CD 0x02 /* =1 if 'command' */ | |
116 | #define PHASE_IO 0x01 /* =1 if data inbound */ | |
117 | /* Phase lines as values */ | |
118 | #define PHASE 0x07 /* mask for psns/pctl phase */ | |
119 | #define DATA_OUT_PHASE 0x00 | |
120 | #define DATA_IN_PHASE 0x01 | |
121 | #define CMD_PHASE 0x02 | |
122 | #define STATUS_PHASE 0x03 | |
123 | #define BUS_FREE_PHASE 0x04 | |
124 | #define ARB_SEL_PHASE 0x05 /* Fuji chip combines arbitration with sel. */ | |
125 | #define MESG_OUT_PHASE 0x06 | |
126 | #define MESG_IN_PHASE 0x07 | |
127 | ||
128 | /* SCSI Messages */ | |
129 | ||
130 | #define MSG_CMD_COMPLETE 0x00 | |
131 | #define MSG_EXT_MESSAGE 0x01 | |
132 | #define MSG_SAVE_DATA_PTR 0x02 | |
133 | #define MSG_RESTORE_PTR 0x03 | |
134 | #define MSG_DISCONNECT 0x04 | |
135 | #define MSG_INIT_DETECT_ERROR 0x05 | |
136 | #define MSG_ABORT 0x06 | |
137 | #define MSG_REJECT 0x07 | |
138 | #define MSG_NOOP 0x08 | |
139 | #define MSG_PARITY_ERROR 0x09 | |
140 | #define MSG_BUS_DEVICE_RESET 0x0C | |
141 | #define MSG_IDENTIFY 0x80 | |
142 | #define MSG_IDENTIFY_DR 0xc0 /* (disconnect/reconnect allowed) */ | |
143 | #define MSG_SYNC_REQ 0x01 | |
144 | ||
145 | /* SCSI Commands */ | |
146 | ||
147 | #define CMD_TEST_UNIT_READY 0x00 | |
148 | #define CMD_REQUEST_SENSE 0x03 | |
149 | #define CMD_INQUIRY 0x12 | |
150 | #define CMD_SEND_DIAGNOSTIC 0x1D | |
151 | ||
98511a3b | 152 | #define CMD_REWIND 0x01 |
9acfa6cd | 153 | #define CMD_REZERO 0x01 |
60f56dfc | 154 | #define CMD_FORMAT_UNIT 0x04 |
98511a3b | 155 | #define CMD_READ_BLOCK_LIMITS 0x05 |
60f56dfc KM |
156 | #define CMD_REASSIGN_BLOCKS 0x07 |
157 | #define CMD_READ 0x08 | |
158 | #define CMD_WRITE 0x0A | |
98511a3b KM |
159 | #define CMD_WRITE_FILEMARK 0x10 |
160 | #define CMD_SPACE 0x11 | |
60f56dfc KM |
161 | #define CMD_MODE_SELECT 0x15 |
162 | #define CMD_RELEASE_UNIT 0x17 | |
98511a3b | 163 | #define CMD_ERASE 0x19 |
60f56dfc | 164 | #define CMD_MODE_SENSE 0x1A |
98511a3b KM |
165 | #define CMD_LOADUNLOAD 0x1B |
166 | #define CMD_RECEIVE_DIAG 0x1C | |
60f56dfc | 167 | #define CMD_SEND_DIAG 0x1D |
98511a3b | 168 | #define CMD_P_A_MEDIA_REMOVAL 0x1E |
60f56dfc KM |
169 | #define CMD_READ_CAPACITY 0x25 |
170 | #define CMD_READ_EXT 0x28 | |
171 | #define CMD_WRITE_EXT 0x2A | |
172 | #define CMD_READ_DEFECT_DATA 0x37 | |
173 | #define SD_MANUFAC_DEFECTS 0x14000000 | |
174 | #define SD_GROWN_DEFECTS 0x0c000000 | |
175 | #define CMD_READ_BUFFER 0x3B | |
176 | #define CMD_WRITE_BUFFER 0x3C | |
177 | #define CMD_READ_FULL 0xF0 | |
178 | #define CMD_MEDIA_TEST 0xF1 | |
179 | #define CMD_ACCESS_LOG 0xF2 | |
180 | #define CMD_WRITE_FULL 0xFC | |
181 | #define CMD_MANAGE_PRIMARY 0xFD | |
182 | #define CMD_EXECUTE_DATA 0xFE | |
183 | ||
184 | /* SCSI status bits */ | |
185 | ||
186 | #define STS_CHECKCOND 0x02 /* Check Condition (ie., read sense) */ | |
187 | #define STS_CONDMET 0x04 /* Condition Met (ie., search worked) */ | |
188 | #define STS_BUSY 0x08 | |
189 | #define STS_INTERMED 0x10 /* Intermediate status sent */ | |
190 | #define STS_EXT 0x80 /* Extended status valid */ | |
191 | ||
192 | /* command descriptor blocks */ | |
193 | ||
194 | struct scsi_cdb6 { | |
195 | u_char cmd; /* command code */ | |
196 | u_char lun: 3, /* logical unit on ctlr */ | |
197 | lbah: 5; /* msb of read/write logical block addr */ | |
198 | u_char lbam; /* middle byte of l.b.a. */ | |
199 | u_char lbal; /* lsb of l.b.a. */ | |
200 | u_char len; /* transfer length */ | |
201 | u_char xtra; | |
202 | }; | |
203 | ||
204 | struct scsi_cdb10 { | |
205 | u_char cmd; /* command code */ | |
206 | u_char lun: 3, /* logical unit on ctlr */ | |
207 | : 4, | |
208 | rel: 1; /* l.b.a. is relative addr if =1 */ | |
209 | u_char lbah; /* msb of read/write logical block addr */ | |
210 | u_char lbahm; /* high middle byte of l.b.a. */ | |
211 | u_char lbalm; /* low middle byte of l.b.a. */ | |
212 | u_char lbal; /* lsb of l.b.a. */ | |
213 | u_char reserved; | |
214 | u_char lenh; /* msb transfer length */ | |
215 | u_char lenl; /* lsb transfer length */ | |
216 | u_char xtra; | |
217 | }; | |
218 | ||
219 | /* basic sense data */ | |
220 | ||
221 | struct scsi_sense { | |
222 | u_char valid: 1, /* l.b.a. is valid */ | |
223 | class: 3, | |
224 | code: 4; | |
225 | u_char vu: 4, /* vendor unique */ | |
226 | lbah: 4; | |
227 | u_char lbam; | |
228 | u_char lbal; | |
229 | }; | |
230 | ||
231 | struct scsi_xsense { | |
232 | u_char valid: 1, /* l.b.a. is valid */ | |
233 | class: 3, | |
234 | code: 4; | |
235 | u_char segment; | |
236 | u_char filemark: 1, | |
237 | eom: 1, | |
238 | ili: 1, /* illegal length indicator */ | |
239 | rsvd: 1, | |
240 | key: 4; | |
241 | u_char info1; | |
242 | u_char info2; | |
243 | u_char info3; | |
244 | u_char info4; | |
245 | u_char len; /* additional sense length */ | |
246 | }; | |
247 | ||
248 | /* inquiry data */ | |
249 | struct scsi_inquiry { | |
250 | u_char type; | |
251 | u_char qual; | |
252 | u_char version; | |
253 | u_char rsvd; | |
254 | u_char len; | |
255 | char class[3]; | |
256 | char vendor_id[8]; | |
257 | char product_id[16]; | |
258 | char rev[4]; | |
259 | }; | |
260 | ||
261 | struct scsi_format_parms { /* physical BFI format */ | |
262 | u_short reserved; | |
263 | u_short list_len; | |
264 | struct defect { | |
265 | unsigned cyl : 24; | |
266 | unsigned head : 8; | |
267 | long bytes_from_index; | |
268 | } defect[127]; | |
269 | } format_parms; | |
270 | ||
271 | struct scsi_reassign_parms { | |
272 | u_short reserved; | |
273 | u_short list_len; /* length in bytes of defects only */ | |
274 | struct new_defect { | |
275 | unsigned lba; /* logical block address */ | |
276 | } new_defect[2]; | |
277 | } reassign_parms; | |
278 | ||
279 | struct scsi_modesel_hdr { | |
280 | u_char rsvd1; | |
281 | u_char media_type; | |
282 | u_char rsvd2; | |
283 | u_char block_desc_len; | |
284 | u_int density : 8; | |
285 | u_int number_blocks :24; | |
286 | u_int rsvd3 : 8; | |
287 | u_int block_length :24; | |
288 | }; | |
289 | ||
290 | struct scsi_modesense_hdr { | |
291 | u_char len; | |
292 | u_char media_type; | |
293 | u_char wp : 1; | |
294 | u_char rsvd1 : 7; | |
295 | u_char block_desc_len; | |
296 | u_int density : 8; | |
297 | u_int number_blocks :24; | |
298 | u_int rsvd2 : 8; | |
299 | u_int block_length :24; | |
300 | }; | |
301 | ||
302 | /* | |
303 | * Mode Select / Mode sense "pages" | |
304 | */ | |
305 | ||
306 | /* | |
307 | * Page One - Error Recovery Parameters | |
308 | */ | |
309 | struct scsi_err_recovery { | |
310 | u_char page_savable : 1; /* save parameters */ | |
311 | u_char reserved : 1; | |
312 | u_char page_code : 6; /* = 0x01 */ | |
313 | u_char page_length; /* = 6 */ | |
314 | u_char awre : 1; /* auto write realloc enabled */ | |
315 | u_char arre : 1; /* auto read realloc enabled */ | |
316 | u_char tb : 1; /* transfer block */ | |
317 | u_char rc : 1; /* read continuous */ | |
318 | u_char eec : 1; /* enable early correction */ | |
319 | u_char per : 1; /* post error */ | |
320 | u_char dte : 1; /* disable transfer on error */ | |
321 | u_char dcr : 1; /* disable correction */ | |
322 | u_char retry_count; | |
323 | u_char correction_span; | |
324 | u_char head_offset_count; | |
325 | u_char strobe_offset_count; | |
326 | u_char recovery_time_limit; | |
327 | }; | |
328 | ||
329 | /* | |
330 | * Page Two - Disconnect / Reconnect Control Parameters | |
331 | */ | |
332 | struct scsi_disco_reco { | |
333 | u_char page_savable : 1; /* save parameters */ | |
334 | u_char rsvd : 1; | |
335 | u_char page_code : 6; /* = 0x02 */ | |
336 | u_char page_length; /* = 10 */ | |
337 | u_char buffer_full_ratio; /* write, how full before reconnect? */ | |
338 | u_char buffer_empty_ratio; /* read, how full before reconnect? */ | |
339 | ||
340 | u_short bus_inactivity_limit; /* how much bus time for busy */ | |
341 | u_short disconnect_time_limit; /* min to remain disconnected */ | |
342 | u_short connect_time_limit; /* min to remain connected */ | |
343 | u_short reserved_1; | |
344 | }; | |
345 | ||
346 | /* | |
347 | * Page Three - Direct Access Device Format Parameters | |
348 | */ | |
349 | struct scsi_format { | |
350 | u_char page_savable : 1; /* save parameters */ | |
351 | u_char rsvd : 1; | |
352 | u_char page_code : 6; /* = 0x03 */ | |
353 | u_char page_length; /* = 22 */ | |
354 | u_short tracks_per_zone; /* Handling of Defects Fields */ | |
355 | u_short alt_sect_zone; | |
356 | u_short alt_tracks_zone; | |
357 | u_short alt_tracks_vol; | |
358 | u_short sect_track; /* Track Format Field */ | |
359 | u_short data_sect; /* Sector Format Fields */ | |
360 | u_short interleave; | |
361 | u_short track_skew_factor; | |
362 | u_short cyl_skew_factor; | |
363 | u_char ssec : 1; /* Drive Type Field */ | |
364 | u_char hsec : 1; | |
365 | u_char rmb : 1; | |
366 | u_char surf : 1; | |
367 | u_char ins : 1; | |
368 | u_char reserved_1 : 3; | |
369 | u_char reserved_2; | |
370 | u_char reserved_3; | |
371 | u_char reserved_4; | |
372 | }; | |
373 | ||
374 | /* | |
375 | * Page Four - Rigid Disk Drive Geometry Parameters | |
376 | */ | |
377 | struct scsi_geometry { | |
378 | u_char page_savable : 1; /* save parameters */ | |
379 | u_char rsvd : 1; | |
380 | u_char page_code : 6; /* = 0x04 */ | |
381 | u_char page_length; /* = 18 */ | |
382 | u_char cyl_ub; /* number of cylinders */ | |
383 | u_char cyl_mb; | |
384 | u_char cyl_lb; | |
385 | u_char heads; /* number of heads */ | |
386 | u_char precomp_cyl_ub; /* cylinder to start precomp */ | |
387 | u_char precomp_cyl_mb; | |
388 | u_char precomp_cyl_lb; | |
389 | u_char current_cyl_ub; /* cyl to start reduced current */ | |
390 | u_char current_cyl_mb; | |
391 | u_char current_cyl_lb; | |
392 | u_short step_rate; /* drive step rate */ | |
393 | u_char landing_cyl_ub; /* landing zone cylinder */ | |
394 | u_char landing_cyl_mb; | |
395 | u_char landing_cyl_lb; | |
396 | u_char reserved_1; | |
397 | u_char reserved_2; | |
398 | u_char reserved_3; | |
399 | }; | |
400 | ||
401 | /* | |
402 | * Page 0x38 - Cache Control Parameters | |
403 | */ | |
404 | struct scsi_cache { | |
405 | u_char page_savable : 1; /* save parameters */ | |
406 | u_char rsvd : 1; | |
407 | u_char page_code : 6; /* = 0x38 */ | |
408 | u_char page_length; /* = 14 */ | |
409 | u_char rsvd_1 : 1; | |
410 | u_char wie : 1; /* write index enable */ | |
411 | u_char rsvd_2 : 1; | |
412 | u_char ce : 1; /* cache enable */ | |
413 | u_char table_size : 4; | |
414 | u_char prefetch_threshold; | |
415 | u_char maximum_threshold; | |
416 | u_char maximumprefetch_multiplier; | |
417 | u_char minimum_threshold; | |
418 | u_char minimum_prefetch_multiplier; | |
419 | u_char reserved[8]; | |
420 | }; | |
421 | ||
60f56dfc KM |
422 | /* |
423 | * Control for SCSI "format" mode. | |
424 | * | |
425 | * "Format" mode allows a privileged process to issue direct SCSI | |
426 | * commands to a drive (it is intended primarily to allow on-line | |
427 | * formatting). SDIOCSFORMAT with a non-zero arg will put the drive | |
428 | * into format mode; a zero arg will take it out. When in format | |
429 | * mode, only the process that issued the SDIOCFORMAT can read or | |
430 | * write the drive. | |
431 | * | |
432 | * In format mode, process is expected to | |
433 | * - do SDIOCSCSICOMMAND to supply cdb for next SCSI op | |
434 | * - do read or write as appropriate for cdb | |
435 | * - if i/o error, optionally do SDIOCSENSE to get completion | |
436 | * status and sense data from last scsi operation. | |
437 | */ | |
438 | ||
439 | struct scsi_fmt_cdb { | |
440 | int len; /* cdb length (in bytes) */ | |
441 | u_char cdb[28]; /* cdb to use on next read/write */ | |
442 | }; | |
443 | ||
444 | struct scsi_fmt_sense { | |
445 | u_int status; /* completion status of last op */ | |
446 | u_char sense[28]; /* sense data (if any) from last op */ | |
447 | }; | |
448 | ||
449 | #define SDIOCSFORMAT _IOW('S', 0x1, int) | |
450 | #define SDIOCGFORMAT _IOR('S', 0x2, int) | |
451 | #define SDIOCSCSICOMMAND _IOW('S', 0x3, struct scsi_fmt_cdb) | |
452 | #define SDIOCSENSE _IOR('S', 0x4, struct scsi_fmt_sense) |