|
|
1.1 root 1: /* @(#)scsi.h 1.1 86/02/03 SMI */
2:
3: /*
4: * Copyright (c) 1983 by Sun Microsystems, Inc.
5: */
6:
7: /*
8: * Standard SCSI control blocks.
9: * These go in or out over the SCSI bus.
10: */
11: struct scsi_cdb { /* scsi command description block */
12: u_char cmd; /* command code */
13: u_char lun : 3; /* logical unit number */
14: u_char high_addr : 5; /* high part of address */
15: u_char mid_addr; /* middle part of address */
16: u_char low_addr; /* low part of address */
17: u_char count; /* block count */
18: u_char vu_57 : 1; /* vendor unique (byte 5 bit 7) */
19: u_char vu_56 : 1; /* vendor unique (byte 5 bit 6) */
20: u_char : 4; /* reserved */
21: u_char fr : 1; /* flag request (interrupt at completion) */
22: u_char link : 1; /* link (another command follows) */
23: };
24:
25: /*
26: * defines for SCSI tape cdb.
27: */
28: #define t_code high_addr
29: #define high_count mid_addr
30: #define mid_count low_addr
31: #define low_count count
32:
33: struct scsi_scb { /* scsi status completion block */
34: /* byte 0 */
35: u_char ext_st1 : 1; /* extended status (next byte valid) */
36: u_char vu_06 : 1; /* vendor unique */
37: u_char vu_05 : 1; /* vendor unique */
38: u_char is : 1; /* intermediate status sent */
39: u_char busy : 1; /* device busy or reserved */
40: u_char cm : 1; /* condition met */
41: u_char chk : 1; /* check condition: sense data available */
42: u_char vu_00 : 1; /* vendor unique */
43: /* byte 1 */
44: u_char ext_st2 : 1; /* extended status (next byte valid) */
45: u_char reserved: 6; /* reserved */
46: u_char ha_er : 1; /* host adapter detected error */
47: /* byte 2 */
48: u_char byte2; /* third byte */
49: };
50:
51: struct scsi_sense { /* scsi sense for error classes 0-6 */
52: u_char adr_val : 1; /* sense data is valid */
53: u_char class : 3; /* error class (0-6) */
54: u_char code : 4; /* error code */
55: u_char high_addr; /* high byte of block addr */
56: u_char mid_addr; /* middle byte of block addr */
57: u_char low_addr; /* low byte of block addr */
58: u_char extra[12]; /* pad this struct so it can hold max num */
59: /* of sense bytes we may receive */
60: };
61:
62: struct scsi_ext_sense { /* scsi extended sense for error class 7 */
63: /* byte 0 */
64: u_char adr_val : 1; /* sense data is valid */
65: u_char : 7; /* fixed at binary 1110000 */
66: u_char seg_num; /* segment number, applies to copy cmd only */
67: /* byte 2 */
68: u_char fil_mk : 1; /* file mark on device */
69: u_char eom : 1; /* end of media */
70: u_char ili : 1; /* incorrect length indicator */
71: u_char : 1; /* reserved */
72: u_char key : 4; /* sense key, see below */
73: u_char info_1; /* information byte 1 */
74: u_char info_2; /* information byte 2 */
75: u_char info_3; /* information byte 3 */
76: u_char info_4; /* information byte 4 */
77: u_char add_len; /* number of additional bytes */
78: /* additional bytes follow, if any */
79: };
80:
81: /*
82: * Sense key values for extended sense.
83: */
84: #define SC_NO_SENSE 0x0
85: #define SC_RECOVERABLE_ERROR 0x1
86: #define SC_NOT_READY 0x2
87: #define SC_MEDIUM_ERROR 0x3
88: #define SC_HARDWARE_ERROR 0x4
89: #define SC_ILLEGAL_REQUEST 0x5
90: #define SC_UNIT_ATTENTION 0x6
91: #define SC_DATA_PROTECT 0x7
92: #define SC_BLANK_CHECK 0x8
93: #define SC_VENDOR_UNIQUE 0x9
94: #define SC_COPY_ABORTED 0xa
95: #define SC_ABORT_COMMAND 0xb
96: #define SC_EQUAL 0xc
97: #define SC_VOLUME_OVERFLOW 0xd
98: #define SC_MISCOMPARE 0xe
99: #define SC_RESERVED 0xf
100:
101: /*
102: * SCSI Operation codes.
103: */
104: #define SC_TEST_UNIT_READY 0x00
105: #define SC_REZERO_UNIT 0x01
106: #define SC_REQUEST_SENSE 0x03
107: #define SC_READ 0x08
108: #define SC_WRITE 0x0a
109: #define SC_SEEK 0x0b
110:
111: /*
112: * Messages that SCSI can send.
113: */
114: #define SC_COMMAND_COMPLETE 0x00
115: #define SC_SAVE_DATA_PTR 0x02
116: #define SC_RESTORE_PTRS 0x03
117: #define SC_DISCONNECT 0x04
118: #define SC_IDENTIFY 0x80
119: #define SC_DR_IDENTIFY 0xc0
120:
121: #define MORE_STATUS 0x80 /* More status flag */
122: #define STATUS_LEN 3 /* Max status len for SCSI */
123:
124: #define cdbaddr(cdb, addr) (cdb)->high_addr = (addr) >> 16;\
125: (cdb)->mid_addr = ((addr) >> 8) & 0xFF;\
126: (cdb)->low_addr = (addr) & 0xFF
127:
128:
129: #define NLPART NDKMAP /* number of logical partitions (8) */
130:
131: /*
132: * SCSI unit block.
133: */
134: struct scsi_unit {
135: char un_target; /* scsi bus address of controller */
136: char un_lun; /* logical unit number of device */
137: char un_present; /* unit is present */
138: u_char un_scmd; /* special command */
139: u_short un_unit; /* real unit number of device */
140: struct scsi_unit_subr *un_ss; /* scsi device subroutines */
141: struct scsi_ctlr *un_c; /* scsi ctlr */
142: struct mb_device *un_md; /* mb device */
143: struct mb_ctlr *un_mc; /* mb controller */
144: struct buf un_utab; /* queue of requests */
145: struct buf un_sbuf; /* fake buffer for special commands */
146: struct buf un_rbuf; /* buffer for raw i/o */
147: /* current transfer: */
148: u_short un_flags; /* misc flags relating to cur xfer */
149: int un_baddr; /* virtual buffer address */
150: daddr_t un_blkno; /* current block */
151: short un_sec_left; /* sector count for single sectors */
152: short un_cmd; /* command (for cdb) */
153: short un_count; /* num sectors to xfer (for cdb) */
154: int un_dma_addr; /* dma address */
155: u_short un_dma_count; /* byte count expected */
156: short un_retries; /* retry count */
157: short un_restores; /* restore count */
158: char un_wantint; /* expecting interrupt */
159: /* the following save current dma information in case of disconnect */
160: int un_dma_curaddr; /* current addr to start dma to/from */
161: u_short un_dma_curcnt; /* current dma count */
162: u_short un_dma_curdir; /* direction of dma transfer */
163: };
164:
165: /*
166: * bits in the scsi unit flags field
167: */
168: #define SC_UNF_DVMA 0x0001 /* set if cur xfer requires dvma */
169:
170: struct scsi_ctlr {
171: struct scsi_ha_reg *c_har; /* sc bus registers in i/o space */
172: struct scsi_si_reg *c_sir; /* si scsi ctlr logic regs */
173: struct scsi_cdb c_cdb; /* command description block */
174: struct scsi_scb c_scb; /* status completion block */
175: struct scsi_sense *c_sense; /* sense info on errors */
176: int c_flags; /* misc state flags */
177: struct scsi_unit *c_un; /* scsi unit using the bus */
178: struct scsi_ctlr_subr *c_ss; /* scsi device subroutines */
179: struct udc_table c_udct; /* scsi dma info for Sun3/50 */
180: struct buf *c_disqh; /* ptr to head of disconnect q */
181: struct buf *c_disqt; /* ptr to tail of disconnect q */
182: struct buf *c_flush; /* ptr to last element to flush */
183: };
184:
185: /* misc controller flags */
186: #define SCSI_PRESENT 0x0001 /* scsi bus is alive */
187: #define SCSI_ONBOARD 0x0002 /* scsi logic is onboard */
188: #define SCSI_EN_RECON 0x0004 /* reconnect attempts are enabled */
189: #define SCSI_EN_DISCON 0x0008 /* disconnect attempts are enabled */
190: #define SCSI_FLUSH_DISQ 0x0010 /* flush disconnected tasks */
191: #define SCSI_FLUSHING 0x0020 /* flushing in progress */
192:
193: /*
194: * Unit specific subroutines called from controllers.
195: */
196: struct scsi_unit_subr {
197: int (*ss_attach)();
198: int (*ss_start)();
199: int (*ss_mkcdb)();
200: int (*ss_intr)();
201: int (*ss_unit_ptr)();
202: char *ss_devname;
203: };
204:
205: /*
206: * Controller specific subroutines called from units.
207: */
208: struct scsi_ctlr_subr {
209: int (*scs_ustart)();
210: int (*scs_start)();
211: int (*scs_done)();
212: int (*scs_cmd)();
213: int (*scs_getstat)();
214: int (*scs_cmd_wait)();
215: int (*scs_off)();
216: int (*scs_reset)();
217: int (*scs_dmacount)();
218: int (*scs_go)();
219: };
220:
221: /*
222: * Defines for getting configuration parameters out of mb_device.
223: */
224: #define TYPE(flags) (flags)
225: #define TARGET(slave) ((slave >> 3) & 07)
226: #define LUN(slave) (slave & 07)
227:
228: #define SCSI_DISK 0
229: #define SCSI_TAPE 1
230: #define SCSI_FLOPPY 2
231:
232: #define NUNIT 8 /* max nubmer of units per controller */
233:
234: /*
235: * SCSI Error codes passed to device routines.
236: * The codes refer to SCSI general errors, not to device
237: * specific errors. Device specific errors are discovered
238: * by checking the sense data.
239: * The distinction between retryable and fatal is somewhat ad hoc.
240: */
241: #define SE_NO_ERROR 0
242: #define SE_RETRYABLE 1
243: #define SE_FATAL 2
244:
245: struct scsi_disk {
246: struct dk_map un_map[NLPART]; /* logical partitions */
247: struct dk_geom un_g; /* disk geometry */
248: };
249:
250: struct scsi_tape {
251: int un_mspl; /* ptr to mode select param list */
252: int un_bufcnt; /* number of buffers in use */
253: int un_next_block; /* next record on tape */
254: int un_last_block; /* last record of file, if known */
255: short un_status; /* status from last sense */
256: short un_retry_ct; /* retry count */
257: short un_underruns; /* number of underruns */
258: char un_openf; /* tape is open */
259: char un_eof; /* eof seen but not sent to user */
260: char un_read_only; /* tape is read only */
261: char un_lastiow; /* last i/o was write */
262: char un_lastior; /* last i/o was read */
263: char un_reten_rewind; /* retension on next rewind */
264: char un_qic; /* qic format */
265: char un_ctype; /* controller type */
266: char un_reset_occurred; /* reset occured since last command */
267: char un_readmode; /* sysgen left in read mode */
268: char un_err_pending; /* illegal cmd error pending */
269: u_char un_last_cmd; /* last scsi command issued */
270: #ifdef sun2
271: char un_cipher_test; /* test for cipher drive in progres */
272: #endif
273: };
274:
275: struct scsi_floppy {
276: u_char sf_flags;
277: u_char sf_mdb; /* media descriptor byte */
278: u_char sf_spt; /* sectors per track */
279: u_char sf_nhead; /* number of heads */
280: int sf_nblk; /* number of blocks on the disk */
281: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.