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