1 /*
2 * hosts.h Copyright (C) 1992 Drew Eckhardt
3 * mid to low-level SCSI driver interface header by
4 * Drew Eckhardt
5 *
6 * <drew@colorado.edu>
7 *
8 * Modified by Eric Youngdale eric@tantalus.nrl.navy.mil to
9 * add scatter-gather, multiple outstanding request, and other
10 * enhancements.
11 *
12 * Further modified by Eric Youngdale to support multiple host adapters
13 * of the same type.
14 */
15
16 #ifndef _HOSTS_H
17 #define _HOSTS_H
18
19 /*
20 $Header: /usr/src/linux/kernel/blk_drv/scsi/RCS/hosts.h,v 1.3 1993/09/24 12:21:00 drew Exp drew $
21 */
22
23
24 /* It is senseless to set SG_ALL any higher than this - the performance
25 * does not get any better, and it wastes memory
26 */
27 #define SG_NONE 0
28 #define SG_ALL 0xff
29
30 #define DISABLE_CLUSTERING 0
31 #define ENABLE_CLUSTERING 1
32
33 /* The various choices mean:
34 * NONE: Self evident. Host adapter is not capable of scatter-gather.
35 * ALL: Means that the host adapter module can do scatter-gather,
36 * and that there is no limit to the size of the table to which
37 * we scatter/gather data.
38 * Anything else: Indicates the maximum number of chains that can be
39 * used in one scatter-gather request.
40 */
41
42 /*
43 * The Scsi_Host_Template type has all that is needed to interface with a SCSI
44 * host in a device independent matter. There is one entry for each different
45 * type of host adapter that is supported on the system.
46 */
47
48 typedef struct scsi_disk Disk;
49
50 typedef struct SHT
51 {
52
53 /* Used with loadable modules so we can construct a linked list. */
54 struct SHT * next;
55
56 /* Used with loadable modules so that we know when it is safe to unload */
57 int * usage_count;
58
59 /* proc-fs info function.
60 * Can be used to export driver statistics and other infos to the world
61 * outside the kernel ie. userspace and it also provides an interface
62 * to feed the driver with information. Check eata_dma_proc.c for reference.
63 */
64 int (*proc_info)(char *, char **, off_t, int, int, int);
65
66 /* driver name that will appear in the /proc/scsi directory */
67 char *procname;
68
69 /* low_ino of the drivers /proc/scsi entry. Defined in proc_fs.h */
70 unsigned short low_ino;
71
72 /*
73 * The name pointer is a pointer to the name of the SCSI
74 * device detected.
75 */
76 char *name;
77
78 /*
79 * The detect function shall return non zero on detection,
80 * indicating the number of host adapters of this particular
81 * type were found. It should also
82 * initialize all data necessary for this particular
83 * SCSI driver. It is passed the host number, so this host
84 * knows where the first entry is in the scsi_hosts[] array.
85 *
86 * Note that the detect routine MUST not call any of the mid level
87 * functions to queue commands because things are not guaranteed
88 * to be set up yet. The detect routine can send commands to
89 * the host adapter as long as the program control will not be
90 * passed to scsi.c in the processing of the command. Note
91 * especially that scsi_malloc/scsi_free must not be called.
92 */
93 int (* detect)(struct SHT *);
94
95 /* Used with loadable modules to unload the host structures. Note:
96 * there is a default action built into the modules code which may
97 * be sufficient for most host adapters. Thus you may not have to supply
98 * this at all.
99 */
100 int (*release)(struct Scsi_Host *);
101
102 /*
103 * The info function will return whatever useful
104 * information the developer sees fit. If not provided, then
105 * the name field will be used instead.
106 */
107 const char *(* info)(struct Scsi_Host *);
108
109 /*
110 * The command function takes a target, a command (this is a SCSI
111 * command formatted as per the SCSI spec, nothing strange), a
112 * data buffer pointer, and data buffer length pointer. The return
113 * is a status int, bit fielded as follows :
114 * Byte What
115 * 0 SCSI status code
116 * 1 SCSI 1 byte message
117 * 2 host error return.
118 * 3 mid level error return
119 */
120 int (* command)(Scsi_Cmnd *);
121
122 /*
123 * The QueueCommand function works in a similar manner
124 * to the command function. It takes an additional parameter,
125 * void (* done)(int host, int code) which is passed the host
126 * # and exit result when the command is complete.
127 * Host number is the POSITION IN THE hosts array of THIS
128 * host adapter.
129 */
130 int (* queuecommand)(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
131
132 /*
133 * Since the mid level driver handles time outs, etc, we want to
134 * be able to abort the current command. Abort returns 0 if the
135 * abortion was successful. The field SCpnt->abort reason
136 * can be filled in with the appropriate reason why we wanted
137 * the abort in the first place, and this will be used
138 * in the mid-level code instead of the host_byte().
139 * If non-zero, the code passed to it
140 * will be used as the return code, otherwise
141 * DID_ABORT should be returned.
142 *
143 * Note that the scsi driver should "clean up" after itself,
144 * resetting the bus, etc. if necessary.
145 */
146 int (* abort)(Scsi_Cmnd *);
147
148 /*
149 * The reset function will reset the SCSI bus. Any executing
150 * commands should fail with a DID_RESET in the host byte.
151 * The Scsi_Cmnd is passed so that the reset routine can figure
152 * out which host adapter should be reset, and also which command
153 * within the command block was responsible for the reset in
154 * the first place. Some hosts do not implement a reset function,
155 * and these hosts must call scsi_request_sense(SCpnt) to keep
156 * the command alive.
157 */
158 int (* reset)(Scsi_Cmnd *);
159
160 /*
161 * This function is used to select synchronous communications,
162 * which will result in a higher data throughput. Not implemented
163 * yet.
164 */
165 int (* slave_attach)(int, int);
166
167 /*
168 * This function determines the bios parameters for a given
169 * harddisk. These tend to be numbers that are made up by
170 * the host adapter. Parameters:
171 * size, device number, list (heads, sectors, cylinders)
172 */
173 int (* bios_param)(Disk *, int, int []);
174
175 /*
176 * This determines if we will use a non-interrupt driven
177 * or an interrupt driven scheme, It is set to the maximum number
178 * of simultaneous commands a given host adapter will accept.
179 */
180 int can_queue;
181
182 /*
183 * In many instances, especially where disconnect / reconnect are
184 * supported, our host also has an ID on the SCSI bus. If this is
185 * the case, then it must be reserved. Please set this_id to -1 if
186 * your setup is in single initiator mode, and the host lacks an
187 * ID.
188 */
189 int this_id;
190
191 /*
192 * This determines the degree to which the host adapter is capable
193 * of scatter-gather.
194 */
195 short unsigned int sg_tablesize;
196
197 /*
198 * True if this host adapter can make good use of linked commands.
199 * This will allow more than one command to be queued to a given
200 * unit on a given host. Set this to the maximum number of command
201 * blocks to be provided for each device. Set this to 1 for one
202 * command block per lun, 2 for two, etc. Do not set this to 0.
203 * You should make sure that the host adapter will do the right thing
204 * before you try setting this above 1.
205 */
206 short cmd_per_lun;
207
208 /*
209 * present contains counter indicating how many boards of this
210 * type were found when we did the scan.
211 */
212 unsigned char present;
213
214 /*
215 * true if this host adapter uses unchecked DMA onto an ISA bus.
216 */
217 unsigned unchecked_isa_dma:1;
218
219 /*
220 * true if this host adapter can make good use of clustering.
221 * I originally thought that if the tablesize was large that it
222 * was a waste of CPU cycles to prepare a cluster list, but
223 * it works out that the Buslogic is faster if you use a smaller
224 * number of segments (i.e. use clustering). I guess it is
225 * inefficient.
226 */
227 unsigned use_clustering:1;
228
229 } Scsi_Host_Template;
230
231 /*
232 * The scsi_hosts array is the array containing the data for all
233 * possible <supported> scsi hosts. This is similar to the
234 * Scsi_Host_Template, except that we have one entry for each
235 * actual physical host adapter on the system, stored as a linked
236 * list. Note that if there are 2 aha1542 boards, then there will
237 * be two Scsi_Host entries, but only 1 Scsi_Host_Template entries.
238 */
239
240 struct Scsi_Host
241 {
242 struct Scsi_Host * next;
243 unsigned short extra_bytes;
244 volatile unsigned char host_busy;
245 char host_no; /* Used for IOCTL_GET_IDLUN, /proc/scsi et al. */
246 int last_reset;
247 struct wait_queue *host_wait;
248 Scsi_Cmnd *host_queue;
249 Scsi_Host_Template * hostt;
250
251 /*
252 * These three parameters can be used to allow for wide scsi,
253 * and for host adapters that support multiple busses
254 * The first two should be set to 1 more than the actual max id
255 * or lun (i.e. 8 for normal systems).
256 */
257 unsigned int max_id;
258 unsigned int max_lun;
259 unsigned int max_channel;
260
261 /*
262 * Pointer to a circularly linked list - this indicates the hosts
263 * that should be locked out of performing I/O while we have an active
264 * command on this host.
265 */
266 struct Scsi_Host * block;
267 unsigned wish_block:1;
268
269 /* These parameters should be set by the detect routine */
270 unsigned char *base;
271 unsigned int io_port;
272 unsigned char n_io_port;
273 unsigned char irq;
274 unsigned char dma_channel;
275
276 /*
277 * Set these if there are conflicts between memory
278 * in the < 1mb region and regions at 16mb multiples.
279 * The address must be on a page boundary.
280 */
281 unsigned long forbidden_addr;
282 unsigned long forbidden_size;
283
284 /*
285 * The rest can be copied from the template, or specifically
286 * initialized, as required.
287 */
288
289 int this_id;
290 int can_queue;
291 short cmd_per_lun;
292 short unsigned int sg_tablesize;
293 unsigned unchecked_isa_dma:1;
294 unsigned use_clustering:1;
295 /*
296 * True if this host was loaded as a loadable module
297 */
298 unsigned loaded_as_module:1;
299
300 int hostdata[0]; /* Used for storage of host specific stuff */
301 };
302
303 extern struct Scsi_Host * scsi_hostlist;
304 extern struct Scsi_Device_Template * scsi_devicelist;
305
306 extern Scsi_Host_Template * scsi_hosts;
307
308 /*
309 * scsi_init initializes the scsi hosts.
310 */
311
312 /*
313 * We use these goofy things because the MM is not set up when we init
314 * the scsi subsystem. By using these functions we can write code that
315 * looks normal. Also, it makes it possible to use the same code for a
316 * loadable module.
317 */
318
319 extern void * scsi_init_malloc(unsigned int size, int priority);
320 extern void scsi_init_free(char * ptr, unsigned int size);
321
322 void scan_scsis (struct Scsi_Host * shpnt, unchar hardcoded,
323 unchar hchannel, unchar hid, unchar hlun);
324
325 extern int next_scsi_host;
326
327 extern int scsi_loadable_module_flag;
328 unsigned int scsi_init(void);
329 extern struct Scsi_Host * scsi_register(Scsi_Host_Template *, int j);
330 extern void scsi_unregister(struct Scsi_Host * i);
331 extern int scsicam_bios_param (Disk *, int, int *);
332
333 #define BLANK_HOST {"", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
334
335 struct Scsi_Device_Template
336 {
337 struct Scsi_Device_Template * next;
338 char * name;
339 char * tag;
340 int * usage_count; /* Used for loadable modules */
341 unsigned char scsi_type;
342 unsigned char major;
343 unsigned char nr_dev; /* Number currently attached */
344 unsigned char dev_noticed; /* Number of devices detected. */
345 unsigned char dev_max; /* Current size of arrays */
346 unsigned blk:1; /* 0 if character device */
347 int (*detect)(Scsi_Device *); /* Returns 1 if we can attach this device */
348 void (*init)(void); /* Sizes arrays based upon number of devices
349 * detected */
350 void (*finish)(void); /* Perform initialization after attachment */
351 int (*attach)(Scsi_Device *); /* Attach devices to arrays */
352 void (*detach)(Scsi_Device *);
353 };
354
355 extern struct Scsi_Device_Template sd_template;
356 extern struct Scsi_Device_Template st_template;
357 extern struct Scsi_Device_Template sr_template;
358 extern struct Scsi_Device_Template sg_template;
359
360 int scsi_register_device(struct Scsi_Device_Template * sdpnt);
361
362 /* These are used by loadable modules */
363 extern int scsi_register_module(int, void *);
364 extern void scsi_unregister_module(int, void *);
365
366 /* The different types of modules that we can load and unload */
367 #define MODULE_SCSI_HA 1
368 #define MODULE_SCSI_CONST 2
369 #define MODULE_SCSI_IOCTL 3
370 #define MODULE_SCSI_DEV 4
371
372
373 /*
374 * This is an ugly hack. If we expect to be able to load devices at run time,
375 * we need to leave extra room in some of the data structures. Doing a
376 * realloc to enlarge the structures would be riddled with race conditions,
377 * so until a better solution is discovered, we use this crude approach
378 */
379 #define SD_EXTRA_DEVS 2
380 #define ST_EXTRA_DEVS 2
381 #define SR_EXTRA_DEVS 2
382 #define SG_EXTRA_DEVS (SD_EXTRA_DEVS + SR_EXTRA_DEVS + ST_EXTRA_DEVS)
383
384 #endif
385 /*
386 * Overrides for Emacs so that we follow Linus's tabbing style.
387 * Emacs will notice this stuff at the end of the file and automatically
388 * adjust the settings for this buffer only. This must remain at the end
389 * of the file.
390 * ---------------------------------------------------------------------------
391 * Local variables:
392 * c-indent-level: 4
393 * c-brace-imaginary-offset: 0
394 * c-brace-offset: -4
395 * c-argdecl-indent: 4
396 * c-label-offset: -4
397 * c-continued-statement-offset: 4
398 * c-continued-brace-offset: 0
399 * indent-tabs-mode: nil
400 * tab-width: 8
401 * End:
402 */