|
|
1.1 root 1: /*
2: * Mach Operating System
3: * Copyright (c) 1993-1989 Carnegie Mellon University
4: * All Rights Reserved.
5: *
6: * Permission to use, copy, modify and distribute this software and its
7: * documentation is hereby granted, provided that both the copyright
8: * notice and this permission notice appear in all copies of the
9: * software, derivative works or modified versions, and any portions
10: * thereof, and that both notices appear in supporting documentation.
11: *
12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15: *
16: * Carnegie Mellon requests users of this software to return to
17: *
18: * Software Distribution Coordinator or [email protected]
19: * School of Computer Science
20: * Carnegie Mellon University
21: * Pittsburgh PA 15213-3890
22: *
23: * any improvements or extensions that they make and grant Carnegie Mellon
24: * the rights to redistribute these changes.
25: */
26: /*
27: * File: scsi_defs.h
28: * Author: Alessandro Forin, Carnegie Mellon University
29: * Date: 9/90
30: *
31: * Controller-independent definitions for the SCSI driver
32: */
33:
34: #ifndef _SCSI_SCSI_DEFS_H_
35: #define _SCSI_SCSI_DEFS_H_
36:
37: #include <kern/queue.h>
38: #include <kern/lock.h>
39:
40: #include <rz_labels.h>
41:
42: #define await(event) sleep(event,0)
43: extern void wakeup();
44:
45: typedef vm_offset_t opaque_t; /* should be elsewhere */
46:
47: /*
48: * Internal error codes, and return values
49: * XXX use the mach/error.h scheme XXX
50: */
51: typedef unsigned int scsi_ret_t;
52:
53: #define SCSI_ERR_GRAVITY(x) ((unsigned)(x)&0xf0000000U)
54: #define SCSI_ERR_GRAVE 0x80000000U
55: #define SCSI_ERR_BAD 0x40000000
56:
57: #define SCSI_ERR_CLASS(x) ((unsigned)(x)&0x0fffffffU)
58: #define SCSI_ERR_STATUS 0x00000001
59: #define SCSI_ERR_SENSE 0x00000002
60: #define SCSI_ERR_MSEL 0x00000004
61:
62: extern void scsi_error(/* target_info_t *, unsigned, unsigned */);
63:
64: #define SCSI_RET_IN_PROGRESS 0x00
65: #define SCSI_RET_SUCCESS 0x01
66: #define SCSI_RET_RETRY 0x02
67: #define SCSI_RET_NEED_SENSE 0x04
68: #define SCSI_RET_ABORTED 0x08
69: #define SCSI_RET_DEVICE_DOWN 0x10
70:
71: /*
72: * Device-specific information kept by driver
73: */
74: #define MAX_SCSI_PARTS 32 /* maximum partitions on a disk;can be larger */
75: typedef struct {
76: struct disklabel l; /* NOT accurate. partitions stored below */
77: struct {
78: unsigned int badblockno;
79: unsigned int save_rec;
80: char *save_addr;
81: int save_count;
82: int save_resid;
83: int retry_count;
84: } b;
85: #if 0 /* no longer used by partition code */
86: int labelsector;
87: int labeloffset;
88: #endif 0
89: struct diskpart scsi_array[MAX_SCSI_PARTS]; /* new partition info */
90: } scsi_disk_info_t;
91:
92: typedef struct {
93: boolean_t read_only;
94: unsigned int speed;
95: unsigned int density;
96: unsigned int maxreclen;
97: boolean_t fixed_size;
98: } scsi_tape_info_t;
99:
100: typedef struct {
101: char req_pending;
102: char req_id;
103: char req_lun;
104: char req_cmd;
105: unsigned int req_len;
106: /* more later */
107: } scsi_processor_info_t;
108:
109: typedef struct {
110: void *result;
111: boolean_t result_available;
112: int result_size;
113: struct red_list *violates_standards;
114: } scsi_cdrom_info_t;
115:
116: typedef struct {
117: # define SCSI_MAX_COMM_TTYS 16
118: struct tty *tty[SCSI_MAX_COMM_TTYS];
119: io_req_t ior;
120: } scsi_comm_info_t;
121:
122: /*
123: * Device descriptor
124: */
125:
126: #define SCSI_TARGET_NAME_LEN 8+16+4+8 /* our way to keep it */
127:
128: typedef struct target_info {
129: queue_chain_t links; /* to queue for bus */
130: io_req_t ior; /* what we are doing */
131:
132: unsigned int flags;
133: #define TGT_DID_SYNCH 0x00000001 /* finished the synch neg */
134: #define TGT_TRY_SYNCH 0x00000002 /* do the synch negotiation */
135: #define TGT_FULLY_PROBED 0x00000004 /* can sleep to wait */
136: #define TGT_ONLINE 0x00000008 /* did the once-only stuff */
137: #define TGT_ALIVE 0x00000010
138: #define TGT_BBR_ACTIVE 0x00000020 /* bad block replc in progress */
139: #define TGT_DISCONNECTED 0x00000040 /* waiting for reconnect */
140: #define TGT_WRITTEN_TO 0x00000080 /* tapes: needs a filemark on close */
141: #define TGT_REWIND_ON_CLOSE 0x00000100 /* tapes: rewind */
142: #define TGT_BIG 0x00000200 /* disks: > 1Gb, use long R/W */
143: #define TGT_REMOVABLE_MEDIA 0x00000400 /* e.g. floppy, cd-rom,.. */
144: #define TGT_READONLY 0x00000800 /* cd-rom, scanner, .. */
145: #define TGT_OPTIONAL_CMD 0x00001000 /* optional cmd, ignore errors */
146: #define TGT_WRITE_LABEL 0x00002000 /* disks: enable overwriting of label */
147: #define TGT_US 0x00004000 /* our desc, when target role */
148:
149: #define TGT_HW_SPECIFIC_BITS 0xffff0000U /* see specific HBA */
150: char *hw_state; /* opaque */
151: char *dma_ptr;
152: char *cmd_ptr;
153: struct scsi_devsw_struct *dev_ops; /* circularity */
154: struct target_info *next_lun; /* if multi-LUN */
155: char target_id;
156: char unit_no;
157: unsigned char sync_period;
158: unsigned char sync_offset;
159: decl_simple_lock_data(,target_lock)
160: #ifdef MACH_KERNEL
161: #else /*MACH_KERNEL*/
162: struct fdma fdma;
163: #endif /*MACH_KERNEL*/
164: /*
165: * State info kept while waiting to seize bus, either for first
166: * selection or while in disconnected state
167: */
168: struct {
169: struct script *script;
170: int (*handler)();
171: unsigned int out_count;
172: unsigned int in_count;
173: unsigned int copy_count; /* optional */
174: unsigned int dma_offset;
175: unsigned char identify;
176: unsigned char cmd_count;
177: unsigned char hba_dep[2];
178: } transient_state;
179: unsigned int block_size;
180: volatile char done;
181: unsigned char cur_cmd;
182: unsigned char lun;
183: char masterno;
184: char tgt_name[SCSI_TARGET_NAME_LEN];
185: union {
186: scsi_disk_info_t disk;
187: scsi_tape_info_t tape;
188: scsi_cdrom_info_t cdrom;
189: scsi_processor_info_t cpu;
190: scsi_comm_info_t comm;
191: } dev_info;
192: } target_info_t;
193:
194:
195: /*
196: * Device-specific operations
197: */
198: typedef struct scsi_devsw_struct {
199: char *(*driver_name)(boolean_t); /* my driver's name */
200: void (*optimize)(target_info_t *); /* tune up internal params */
201: scsi_ret_t (*open)(target_info_t *,io_req_t);/* open time ops */
202: scsi_ret_t (*close)(target_info_t *); /* close time ops */
203: int (*strategy)(io_req_t); /* sort/start routine */
204: void (*restart)(target_info_t *,
205: boolean_t); /* completion routine */
206: io_return_t (*get_status)(int,
207: target_info_t *,
208: dev_flavor_t,
209: dev_status_t,
210: natural_t *); /* specialization */
211: io_return_t (*set_status)(int,
212: target_info_t *,
213: dev_flavor_t,
214: dev_status_t,
215: natural_t); /* specialization */
216: } scsi_devsw_t;
217:
218: #define SCSI_OPTIMIZE_NULL ((void (*)(target_info_t *)) 0)
219: #define SCSI_OPEN_NULL ((scsi_ret_t (*)(target_info_t *,io_req_t)) 0)
220: #define SCSI_CLOSE_NULL ((scsi_ret_t (*)(target_info_t *)) 0)
221:
222: extern scsi_devsw_t scsi_devsw[];
223:
224: /*
225: * HBA descriptor
226: */
227:
228: typedef struct {
229: /* initiator (us) state */
230: unsigned char initiator_id;
231: unsigned char masterno;
232: unsigned int max_dma_data;
233: char *hw_state; /* opaque */
234: int (*go)();
235: void (*watchdog)();
236: boolean_t (*probe)();
237: /* per-target state */
238: target_info_t *target[8];
239: } scsi_softc_t;
240:
241: extern scsi_softc_t *scsi_softc[];
242: extern scsi_softc_t *scsi_master_alloc(/* int unit */);
243: extern target_info_t *scsi_slave_alloc(/* int unit, int slave, char *hw */);
244:
245: #define BGET(d,mid,id) (d[mid] & (1 << id)) /* bitmap ops */
246: #define BSET(d,mid,id) d[mid] |= (1 << id)
247: #define BCLR(d,mid,id) d[mid] &= ~(1 << id)
248:
249: extern unsigned char scsi_no_synchronous_xfer[]; /* one bitmap per ctlr */
250: extern unsigned char scsi_use_long_form[]; /* one bitmap per ctlr */
251: extern unsigned char scsi_might_disconnect[]; /* one bitmap per ctlr */
252: extern unsigned char scsi_should_disconnect[]; /* one bitmap per ctlr */
253: extern unsigned char scsi_initiator_id[]; /* one id per ctlr */
254:
255: extern boolean_t scsi_exabyte_filemarks;
256: extern boolean_t scsi_no_automatic_bbr;
257: extern int scsi_bbr_retries;
258: extern int scsi_watchdog_period;
259: extern int scsi_delay_after_reset;
260: extern unsigned int scsi_per_target_virtual; /* 2.5 only */
261:
262: extern int scsi_debug;
263:
264: /*
265: * HBA-independent Watchdog
266: */
267: typedef struct {
268:
269: unsigned short reset_count;
270: char nactive;
271:
272: char watchdog_state;
273:
274: #define SCSI_WD_INACTIVE 0
275: #define SCSI_WD_ACTIVE 1
276: #define SCSI_WD_EXPIRED 2
277:
278: int (*reset)();
279:
280: } watchdog_t;
281:
282: extern void scsi_watchdog( watchdog_t* );
283:
284: #endif _SCSI_SCSI_DEFS_H_
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.