• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *	ultrastor.c	Copyright (C) 1992 David B. Gentzel
3  *	Low-level SCSI driver for UltraStor 14F, 24F, and 34F
4  *	by David B. Gentzel, Whitfield Software Services, Carnegie, PA
5  *	    (gentzel@nova.enet.dec.com)
6  *  scatter/gather added by Scott Taylor (n217cg@tamuts.tamu.edu)
7  *  24F and multiple command support by John F. Carr (jfc@athena.mit.edu)
8  *    John's work modified by Caleb Epstein (cae@jpmorgan.com) and
9  *    Eric Youngdale (ericy@cais.com).
10  *	Thanks to UltraStor for providing the necessary documentation
11  *
12  *  This is an old driver, for the 14F and 34F you should be using the
13  *  u14-34f driver instead.
14  */
15 
16 /*
17  * TODO:
18  *	1. Find out why scatter/gather is limited to 16 requests per command.
19  *         This is fixed, at least on the 24F, as of version 1.12 - CAE.
20  *	2. Look at command linking (mscp.command_link and
21  *	   mscp.command_link_id).  (Does not work with many disks,
22  *				and no performance increase.  ERY).
23  *	3. Allow multiple adapters.
24  */
25 
26 /*
27  * NOTES:
28  *    The UltraStor 14F, 24F, and 34F are a family of intelligent, high
29  *    performance SCSI-2 host adapters.  They all support command queueing
30  *    and scatter/gather I/O.  Some of them can also emulate the standard
31  *    WD1003 interface for use with OS's which don't support SCSI.  Here
32  *    is the scoop on the various models:
33  *	14F - ISA first-party DMA HA with floppy support and WD1003 emulation.
34  *	14N - ISA HA with floppy support.  I think that this is a non-DMA
35  *	      HA.  Nothing further known.
36  *	24F - EISA Bus Master HA with floppy support and WD1003 emulation.
37  *	34F - VL-Bus Bus Master HA with floppy support (no WD1003 emulation).
38  *
39  *    The 14F, 24F, and 34F are supported by this driver.
40  *
41  *    Places flagged with a triple question-mark are things which are either
42  *    unfinished, questionable, or wrong.
43  */
44 
45 /* Changes from version 1.11 alpha to 1.12
46  *
47  * Increased the size of the scatter-gather list to 33 entries for
48  * the 24F adapter (it was 16).  I don't have the specs for the 14F
49  * or the 34F, so they may support larger s-g lists as well.
50  *
51  * Caleb Epstein <cae@jpmorgan.com>
52  */
53 
54 /* Changes from version 1.9 to 1.11
55  *
56  * Patches to bring this driver up to speed with the default kernel
57  * driver which supports only the 14F and 34F adapters.  This version
58  * should compile cleanly into 0.99.13, 0.99.12 and probably 0.99.11.
59  *
60  * Fixes from Eric Youngdale to fix a few possible race conditions and
61  * several problems with bit testing operations (insufficient
62  * parentheses).
63  *
64  * Removed the ultrastor_abort() and ultrastor_reset() functions
65  * (enclosed them in #if 0 / #endif).  These functions, at least on
66  * the 24F, cause the SCSI bus to do odd things and generally lead to
67  * kernel panics and machine hangs.  This is like the Adaptec code.
68  *
69  * Use check/snarf_region for 14f, 34f to avoid I/O space address conflicts.
70  */
71 
72 /* Changes from version 1.8 to version 1.9
73  *
74  *  0.99.11 patches (cae@jpmorgan.com) */
75 
76 /* Changes from version 1.7 to version 1.8
77  *
78  * Better error reporting.
79  */
80 
81 /* Changes from version 1.6 to version 1.7
82  *
83  * Removed CSIR command code.
84  *
85  * Better race condition avoidance (xchgb function added).
86  *
87  * Set ICM and OGM status to zero at probe (24F)
88  *
89  * reset sends soft reset to UltraStor adapter
90  *
91  * reset adapter if adapter interrupts with an invalid MSCP address
92  *
93  * handle aborted command interrupt (24F)
94  *
95  */
96 
97 /* Changes from version 1.5 to version 1.6:
98  *
99  * Read MSCP address from ICM _before_ clearing the interrupt flag.
100  * This fixes a race condition.
101  */
102 
103 /* Changes from version 1.4 to version 1.5:
104  *
105  * Abort now calls done when multiple commands are enabled.
106  *
107  * Clear busy when aborted command finishes, not when abort is called.
108  *
109  * More debugging messages for aborts.
110  */
111 
112 /* Changes from version 1.3 to version 1.4:
113  *
114  * Enable automatic request of sense data on error (requires newer version
115  * of scsi.c to be useful).
116  *
117  * Fix PORT_OVERRIDE for 14F.
118  *
119  * Fix abort and reset to work properly (config.aborted wasn't cleared
120  * after it was tested, so after a command abort no further commands would
121  * work).
122  *
123  * Boot time test to enable SCSI bus reset (defaults to not allowing reset).
124  *
125  * Fix test for OGM busy -- the busy bit is in different places on the 24F.
126  *
127  * Release ICM slot by clearing first byte on 24F.
128  */
129 
130 #include <linux/module.h>
131 #include <linux/blkdev.h>
132 #include <linux/interrupt.h>
133 #include <linux/stddef.h>
134 #include <linux/string.h>
135 #include <linux/kernel.h>
136 #include <linux/ioport.h>
137 #include <linux/proc_fs.h>
138 #include <linux/spinlock.h>
139 #include <linux/stat.h>
140 #include <linux/bitops.h>
141 
142 #include <asm/io.h>
143 #include <asm/system.h>
144 #include <asm/dma.h>
145 
146 #define ULTRASTOR_PRIVATE	/* Get the private stuff from ultrastor.h */
147 #include "scsi.h"
148 #include <scsi/scsi_host.h>
149 #include "ultrastor.h"
150 
151 #define FALSE 0
152 #define TRUE 1
153 
154 #ifndef ULTRASTOR_DEBUG
155 #define ULTRASTOR_DEBUG (UD_ABORT|UD_CSIR|UD_RESET)
156 #endif
157 
158 #define VERSION "1.12"
159 
160 #define PACKED		__attribute__((packed))
161 #define ALIGNED(x)	__attribute__((aligned(x)))
162 
163 
164 /* The 14F uses an array of 4-byte ints for its scatter/gather list.
165    The data can be unaligned, but need not be.  It's easier to give
166    the list normal alignment since it doesn't need to fit into a
167    packed structure.  */
168 
169 typedef struct {
170   u32 address;
171   u32 num_bytes;
172 } ultrastor_sg_list;
173 
174 
175 /* MailBox SCSI Command Packet.  Basic command structure for communicating
176    with controller. */
177 struct mscp {
178   unsigned char opcode: 3;		/* type of command */
179   unsigned char xdir: 2;		/* data transfer direction */
180   unsigned char dcn: 1;		/* disable disconnect */
181   unsigned char ca: 1;		/* use cache (if available) */
182   unsigned char sg: 1;		/* scatter/gather operation */
183   unsigned char target_id: 3;		/* target SCSI id */
184   unsigned char ch_no: 2;		/* SCSI channel (always 0 for 14f) */
185   unsigned char lun: 3;		/* logical unit number */
186   unsigned int transfer_data PACKED;	/* transfer data pointer */
187   unsigned int transfer_data_length PACKED;	/* length in bytes */
188   unsigned int command_link PACKED;	/* for linking command chains */
189   unsigned char scsi_command_link_id;	/* identifies command in chain */
190   unsigned char number_of_sg_list;	/* (if sg is set) 8 bytes per list */
191   unsigned char length_of_sense_byte;
192   unsigned char length_of_scsi_cdbs;	/* 6, 10, or 12 */
193   unsigned char scsi_cdbs[12];	/* SCSI commands */
194   unsigned char adapter_status;	/* non-zero indicates HA error */
195   unsigned char target_status;	/* non-zero indicates target error */
196   u32 sense_data PACKED;
197   /* The following fields are for software only.  They are included in
198      the MSCP structure because they are associated with SCSI requests.  */
199   void (*done) (struct scsi_cmnd *);
200   struct scsi_cmnd *SCint;
201   ultrastor_sg_list sglist[ULTRASTOR_24F_MAX_SG]; /* use larger size for 24F */
202 };
203 
204 
205 /* Port addresses (relative to the base address) */
206 #define U14F_PRODUCT_ID(port) ((port) + 0x4)
207 #define CONFIG(port) ((port) + 0x6)
208 
209 /* Port addresses relative to the doorbell base address.  */
210 #define LCL_DOORBELL_MASK(port) ((port) + 0x0)
211 #define LCL_DOORBELL_INTR(port) ((port) + 0x1)
212 #define SYS_DOORBELL_MASK(port) ((port) + 0x2)
213 #define SYS_DOORBELL_INTR(port) ((port) + 0x3)
214 
215 
216 /* Used to store configuration info read from config i/o registers.  Most of
217    this is not used yet, but might as well save it.
218 
219    This structure also holds port addresses that are not at the same offset
220    on the 14F and 24F.
221 
222    This structure holds all data that must be duplicated to support multiple
223    adapters.  */
224 
225 static struct ultrastor_config
226 {
227   unsigned short port_address;		/* base address of card */
228   unsigned short doorbell_address;	/* base address of doorbell CSRs */
229   unsigned short ogm_address;		/* base address of OGM */
230   unsigned short icm_address;		/* base address of ICM */
231   const void *bios_segment;
232   unsigned char interrupt: 4;
233   unsigned char dma_channel: 3;
234   unsigned char bios_drive_number: 1;
235   unsigned char heads;
236   unsigned char sectors;
237   unsigned char ha_scsi_id: 3;
238   unsigned char subversion: 4;
239   unsigned char revision;
240   /* The slot number is used to distinguish the 24F (slot != 0) from
241      the 14F and 34F (slot == 0). */
242   unsigned char slot;
243 
244 #ifdef PRINT_U24F_VERSION
245   volatile int csir_done;
246 #endif
247 
248   /* A pool of MSCP structures for this adapter, and a bitmask of
249      busy structures.  (If ULTRASTOR_14F_MAX_CMDS == 1, a 1 byte
250      busy flag is used instead.)  */
251 
252 #if ULTRASTOR_MAX_CMDS == 1
253   unsigned char mscp_busy;
254 #else
255   unsigned long mscp_free;
256 #endif
257   volatile unsigned char aborted[ULTRASTOR_MAX_CMDS];
258   struct mscp mscp[ULTRASTOR_MAX_CMDS];
259 } config = {0};
260 
261 /* Set this to 1 to reset the SCSI bus on error.  */
262 static int ultrastor_bus_reset;
263 
264 
265 /* Allowed BIOS base addresses (NULL indicates reserved) */
266 static const void *const bios_segment_table[8] = {
267   NULL,	     (void *)0xC4000, (void *)0xC8000, (void *)0xCC000,
268   (void *)0xD0000, (void *)0xD4000, (void *)0xD8000, (void *)0xDC000,
269 };
270 
271 /* Allowed IRQs for 14f */
272 static const unsigned char interrupt_table_14f[4] = { 15, 14, 11, 10 };
273 
274 /* Allowed DMA channels for 14f (0 indicates reserved) */
275 static const unsigned char dma_channel_table_14f[4] = { 5, 6, 7, 0 };
276 
277 /* Head/sector mappings allowed by 14f */
278 static const struct {
279   unsigned char heads;
280   unsigned char sectors;
281 } mapping_table[4] = { { 16, 63 }, { 64, 32 }, { 64, 63 }, { 64, 32 } };
282 
283 #ifndef PORT_OVERRIDE
284 /* ??? A probe of address 0x310 screws up NE2000 cards */
285 static const unsigned short ultrastor_ports_14f[] = {
286   0x330, 0x340, /*0x310,*/ 0x230, 0x240, 0x210, 0x130, 0x140,
287 };
288 #endif
289 
290 static void ultrastor_interrupt(void *);
291 static irqreturn_t do_ultrastor_interrupt(int, void *);
292 static inline void build_sg_list(struct mscp *, struct scsi_cmnd *SCpnt);
293 
294 
295 /* Always called with host lock held */
296 
find_and_clear_bit_16(unsigned long * field)297 static inline int find_and_clear_bit_16(unsigned long *field)
298 {
299   int rv;
300 
301   if (*field == 0)
302     panic("No free mscp");
303 
304   asm volatile (
305 	"xorl %0,%0\n\t"
306 	"0: bsfw %1,%w0\n\t"
307 	"btr %0,%1\n\t"
308 	"jnc 0b"
309 	: "=&r" (rv), "=m" (*field) :);
310 
311   return rv;
312 }
313 
314 /* This has been re-implemented with the help of Richard Earnshaw,
315    <rwe@pegasus.esprit.ec.org> and works with gcc-2.5.8 and gcc-2.6.0.
316    The instability noted by jfc below appears to be a bug in
317    gcc-2.5.x when compiling w/o optimization.  --Caleb
318 
319    This asm is fragile: it doesn't work without the casts and it may
320    not work without optimization.  Maybe I should add a swap builtin
321    to gcc.  --jfc  */
xchgb(unsigned char reg,volatile unsigned char * mem)322 static inline unsigned char xchgb(unsigned char reg,
323 				  volatile unsigned char *mem)
324 {
325   __asm__ ("xchgb %0,%1" : "=q" (reg), "=m" (*mem) : "0" (reg));
326   return reg;
327 }
328 
329 #if ULTRASTOR_DEBUG & (UD_COMMAND | UD_ABORT)
330 
331 /* Always called with the host lock held */
log_ultrastor_abort(struct ultrastor_config * config,int command)332 static void log_ultrastor_abort(struct ultrastor_config *config,
333 				int command)
334 {
335   static char fmt[80] = "abort %d (%x); MSCP free pool: %x;";
336   int i;
337 
338   for (i = 0; i < ULTRASTOR_MAX_CMDS; i++)
339     {
340       fmt[20 + i*2] = ' ';
341       if (! (config->mscp_free & (1 << i)))
342 	fmt[21 + i*2] = '0' + config->mscp[i].target_id;
343       else
344 	fmt[21 + i*2] = '-';
345     }
346   fmt[20 + ULTRASTOR_MAX_CMDS * 2] = '\n';
347   fmt[21 + ULTRASTOR_MAX_CMDS * 2] = 0;
348   printk(fmt, command, &config->mscp[command], config->mscp_free);
349 
350 }
351 #endif
352 
ultrastor_14f_detect(struct scsi_host_template * tpnt)353 static int ultrastor_14f_detect(struct scsi_host_template * tpnt)
354 {
355     size_t i;
356     unsigned char in_byte, version_byte = 0;
357     struct config_1 {
358       unsigned char bios_segment: 3;
359       unsigned char removable_disks_as_fixed: 1;
360       unsigned char interrupt: 2;
361     unsigned char dma_channel: 2;
362     } config_1;
363     struct config_2 {
364       unsigned char ha_scsi_id: 3;
365       unsigned char mapping_mode: 2;
366       unsigned char bios_drive_number: 1;
367       unsigned char tfr_port: 2;
368     } config_2;
369 
370 #if (ULTRASTOR_DEBUG & UD_DETECT)
371     printk("US14F: detect: called\n");
372 #endif
373 
374     /* If a 24F has already been configured, don't look for a 14F.  */
375     if (config.bios_segment)
376 	return FALSE;
377 
378 #ifdef PORT_OVERRIDE
379     if(!request_region(PORT_OVERRIDE, 0xc, "ultrastor")) {
380       printk("Ultrastor I/O space already in use\n");
381       return FALSE;
382     };
383     config.port_address = PORT_OVERRIDE;
384 #else
385     for (i = 0; i < ARRAY_SIZE(ultrastor_ports_14f); i++) {
386       if(!request_region(ultrastor_ports_14f[i], 0x0c, "ultrastor")) continue;
387       config.port_address = ultrastor_ports_14f[i];
388 #endif
389 
390 #if (ULTRASTOR_DEBUG & UD_DETECT)
391 	printk("US14F: detect: testing port address %03X\n", config.port_address);
392 #endif
393 
394 	in_byte = inb(U14F_PRODUCT_ID(config.port_address));
395 	if (in_byte != US14F_PRODUCT_ID_0) {
396 #if (ULTRASTOR_DEBUG & UD_DETECT)
397 # ifdef PORT_OVERRIDE
398 	    printk("US14F: detect: wrong product ID 0 - %02X\n", in_byte);
399 # else
400 	    printk("US14F: detect: no adapter at port %03X\n", config.port_address);
401 # endif
402 #endif
403 #ifdef PORT_OVERRIDE
404 	    goto out_release_port;
405 #else
406 	    release_region(config.port_address, 0x0c);
407 	    continue;
408 #endif
409 	}
410 	in_byte = inb(U14F_PRODUCT_ID(config.port_address) + 1);
411 	/* Only upper nibble is significant for Product ID 1 */
412 	if ((in_byte & 0xF0) != US14F_PRODUCT_ID_1) {
413 #if (ULTRASTOR_DEBUG & UD_DETECT)
414 # ifdef PORT_OVERRIDE
415 	    printk("US14F: detect: wrong product ID 1 - %02X\n", in_byte);
416 # else
417 	    printk("US14F: detect: no adapter at port %03X\n", config.port_address);
418 # endif
419 #endif
420 #ifdef PORT_OVERRIDE
421 	    goto out_release_port;
422 #else
423 	    release_region(config.port_address, 0x0c);
424 	    continue;
425 #endif
426 	}
427 	version_byte = in_byte;
428 #ifndef PORT_OVERRIDE
429 	break;
430     }
431     if (i == ARRAY_SIZE(ultrastor_ports_14f)) {
432 # if (ULTRASTOR_DEBUG & UD_DETECT)
433 	printk("US14F: detect: no port address found!\n");
434 # endif
435 	/* all ports probed already released - we can just go straight out */
436 	return FALSE;
437     }
438 #endif
439 
440 #if (ULTRASTOR_DEBUG & UD_DETECT)
441     printk("US14F: detect: adapter found at port address %03X\n",
442 	   config.port_address);
443 #endif
444 
445     /* Set local doorbell mask to disallow bus reset unless
446        ultrastor_bus_reset is true.  */
447     outb(ultrastor_bus_reset ? 0xc2 : 0x82, LCL_DOORBELL_MASK(config.port_address));
448 
449     /* All above tests passed, must be the right thing.  Get some useful
450        info. */
451 
452     /* Register the I/O space that we use */
453 
454     *(char *)&config_1 = inb(CONFIG(config.port_address + 0));
455     *(char *)&config_2 = inb(CONFIG(config.port_address + 1));
456     config.bios_segment = bios_segment_table[config_1.bios_segment];
457     config.doorbell_address = config.port_address;
458     config.ogm_address = config.port_address + 0x8;
459     config.icm_address = config.port_address + 0xC;
460     config.interrupt = interrupt_table_14f[config_1.interrupt];
461     config.ha_scsi_id = config_2.ha_scsi_id;
462     config.heads = mapping_table[config_2.mapping_mode].heads;
463     config.sectors = mapping_table[config_2.mapping_mode].sectors;
464     config.bios_drive_number = config_2.bios_drive_number;
465     config.subversion = (version_byte & 0x0F);
466     if (config.subversion == U34F)
467 	config.dma_channel = 0;
468     else
469 	config.dma_channel = dma_channel_table_14f[config_1.dma_channel];
470 
471     if (!config.bios_segment) {
472 #if (ULTRASTOR_DEBUG & UD_DETECT)
473 	printk("US14F: detect: not detected.\n");
474 #endif
475 	goto out_release_port;
476     }
477 
478     /* Final consistency check, verify previous info. */
479     if (config.subversion != U34F)
480 	if (!config.dma_channel || !(config_2.tfr_port & 0x2)) {
481 #if (ULTRASTOR_DEBUG & UD_DETECT)
482 	    printk("US14F: detect: consistency check failed\n");
483 #endif
484            goto out_release_port;
485 	}
486 
487     /* If we were TRULY paranoid, we could issue a host adapter inquiry
488        command here and verify the data returned.  But frankly, I'm
489        exhausted! */
490 
491     /* Finally!  Now I'm satisfied... */
492 #if (ULTRASTOR_DEBUG & UD_DETECT)
493     printk("US14F: detect: detect succeeded\n"
494 	   "  Port address: %03X\n"
495 	   "  BIOS segment: %05X\n"
496 	   "  Interrupt: %u\n"
497 	   "  DMA channel: %u\n"
498 	   "  H/A SCSI ID: %u\n"
499 	   "  Subversion: %u\n",
500 	   config.port_address, config.bios_segment, config.interrupt,
501 	   config.dma_channel, config.ha_scsi_id, config.subversion);
502 #endif
503     tpnt->this_id = config.ha_scsi_id;
504     tpnt->unchecked_isa_dma = (config.subversion != U34F);
505 
506 #if ULTRASTOR_MAX_CMDS > 1
507     config.mscp_free = ~0;
508 #endif
509 
510     /*
511      * Brrr, &config.mscp[0].SCint->host) it is something magical....
512      * XXX and FIXME
513      */
514     if (request_irq(config.interrupt, do_ultrastor_interrupt, 0, "Ultrastor", &config.mscp[0].SCint->device->host)) {
515 	printk("Unable to allocate IRQ%u for UltraStor controller.\n",
516 	       config.interrupt);
517 	goto out_release_port;
518     }
519     if (config.dma_channel && request_dma(config.dma_channel,"Ultrastor")) {
520 	printk("Unable to allocate DMA channel %u for UltraStor controller.\n",
521 	       config.dma_channel);
522 	free_irq(config.interrupt, NULL);
523 	goto out_release_port;
524     }
525     tpnt->sg_tablesize = ULTRASTOR_14F_MAX_SG;
526     printk("UltraStor driver version" VERSION ".  Using %d SG lists.\n",
527 	   ULTRASTOR_14F_MAX_SG);
528 
529     return TRUE;
530 out_release_port:
531     release_region(config.port_address, 0x0c);
532     return FALSE;
533 }
534 
ultrastor_24f_detect(struct scsi_host_template * tpnt)535 static int ultrastor_24f_detect(struct scsi_host_template * tpnt)
536 {
537   int i;
538   struct Scsi_Host * shpnt = NULL;
539 
540 #if (ULTRASTOR_DEBUG & UD_DETECT)
541   printk("US24F: detect");
542 #endif
543 
544   /* probe each EISA slot at slot address C80 */
545   for (i = 1; i < 15; i++)
546     {
547       unsigned char config_1, config_2;
548       unsigned short addr = (i << 12) | ULTRASTOR_24F_PORT;
549 
550       if (inb(addr) != US24F_PRODUCT_ID_0 &&
551 	  inb(addr+1) != US24F_PRODUCT_ID_1 &&
552 	  inb(addr+2) != US24F_PRODUCT_ID_2)
553 	continue;
554 
555       config.revision = inb(addr+3);
556       config.slot = i;
557       if (! (inb(addr+4) & 1))
558 	{
559 #if (ULTRASTOR_DEBUG & UD_DETECT)
560 	  printk("U24F: found disabled card in slot %u\n", i);
561 #endif
562 	  continue;
563 	}
564 #if (ULTRASTOR_DEBUG & UD_DETECT)
565       printk("U24F: found card in slot %u\n", i);
566 #endif
567       config_1 = inb(addr + 5);
568       config.bios_segment = bios_segment_table[config_1 & 7];
569       switch(config_1 >> 4)
570 	{
571 	case 1:
572 	  config.interrupt = 15;
573 	  break;
574 	case 2:
575 	  config.interrupt = 14;
576 	  break;
577 	case 4:
578 	  config.interrupt = 11;
579 	  break;
580 	case 8:
581 	  config.interrupt = 10;
582 	  break;
583 	default:
584 	  printk("U24F: invalid IRQ\n");
585 	  return FALSE;
586 	}
587 
588       /* BIOS addr set */
589       /* base port set */
590       config.port_address = addr;
591       config.doorbell_address = addr + 12;
592       config.ogm_address = addr + 0x17;
593       config.icm_address = addr + 0x1C;
594       config_2 = inb(addr + 7);
595       config.ha_scsi_id = config_2 & 7;
596       config.heads = mapping_table[(config_2 >> 3) & 3].heads;
597       config.sectors = mapping_table[(config_2 >> 3) & 3].sectors;
598 #if (ULTRASTOR_DEBUG & UD_DETECT)
599       printk("US24F: detect: detect succeeded\n"
600 	     "  Port address: %03X\n"
601 	     "  BIOS segment: %05X\n"
602 	     "  Interrupt: %u\n"
603 	     "  H/A SCSI ID: %u\n",
604 	     config.port_address, config.bios_segment,
605 	     config.interrupt, config.ha_scsi_id);
606 #endif
607       tpnt->this_id = config.ha_scsi_id;
608       tpnt->unchecked_isa_dma = 0;
609       tpnt->sg_tablesize = ULTRASTOR_24F_MAX_SG;
610 
611       shpnt = scsi_register(tpnt, 0);
612       if (!shpnt) {
613              printk(KERN_WARNING "(ultrastor:) Could not register scsi device. Aborting registration.\n");
614              free_irq(config.interrupt, do_ultrastor_interrupt);
615              return FALSE;
616       }
617 
618       if (request_irq(config.interrupt, do_ultrastor_interrupt, 0, "Ultrastor", shpnt))
619 	{
620 	  printk("Unable to allocate IRQ%u for UltraStor controller.\n",
621 		 config.interrupt);
622 	  return FALSE;
623 	}
624 
625       shpnt->irq = config.interrupt;
626       shpnt->dma_channel = config.dma_channel;
627       shpnt->io_port = config.port_address;
628 
629 #if ULTRASTOR_MAX_CMDS > 1
630       config.mscp_free = ~0;
631 #endif
632       /* Mark ICM and OGM free */
633       outb(0, addr + 0x16);
634       outb(0, addr + 0x1B);
635 
636       /* Set local doorbell mask to disallow bus reset unless
637 	 ultrastor_bus_reset is true.  */
638       outb(ultrastor_bus_reset ? 0xc2 : 0x82, LCL_DOORBELL_MASK(addr+12));
639       outb(0x02, SYS_DOORBELL_MASK(addr+12));
640       printk("UltraStor driver version " VERSION ".  Using %d SG lists.\n",
641 	     tpnt->sg_tablesize);
642       return TRUE;
643     }
644   return FALSE;
645 }
646 
ultrastor_detect(struct scsi_host_template * tpnt)647 static int ultrastor_detect(struct scsi_host_template * tpnt)
648 {
649 	tpnt->proc_name = "ultrastor";
650 	return ultrastor_14f_detect(tpnt) || ultrastor_24f_detect(tpnt);
651 }
652 
ultrastor_release(struct Scsi_Host * shost)653 static int ultrastor_release(struct Scsi_Host *shost)
654 {
655 	if (shost->irq)
656 		free_irq(shost->irq, NULL);
657 	if (shost->dma_channel != 0xff)
658 		free_dma(shost->dma_channel);
659 	if (shost->io_port && shost->n_io_port)
660 		release_region(shost->io_port, shost->n_io_port);
661 	scsi_unregister(shost);
662 	return 0;
663 }
664 
ultrastor_info(struct Scsi_Host * shpnt)665 static const char *ultrastor_info(struct Scsi_Host * shpnt)
666 {
667     static char buf[64];
668 
669     if (config.slot)
670       sprintf(buf, "UltraStor 24F SCSI @ Slot %u IRQ%u",
671 	      config.slot, config.interrupt);
672     else if (config.subversion)
673       sprintf(buf, "UltraStor 34F SCSI @ Port %03X BIOS %05X IRQ%u",
674 	      config.port_address, (int)config.bios_segment,
675 	      config.interrupt);
676     else
677       sprintf(buf, "UltraStor 14F SCSI @ Port %03X BIOS %05X IRQ%u DMA%u",
678 	      config.port_address, (int)config.bios_segment,
679 	      config.interrupt, config.dma_channel);
680     return buf;
681 }
682 
build_sg_list(struct mscp * mscp,struct scsi_cmnd * SCpnt)683 static inline void build_sg_list(struct mscp *mscp, struct scsi_cmnd *SCpnt)
684 {
685 	struct scatterlist *sg;
686 	long transfer_length = 0;
687 	int i, max;
688 
689 	max = scsi_sg_count(SCpnt);
690 	scsi_for_each_sg(SCpnt, sg, max, i) {
691 		mscp->sglist[i].address = isa_page_to_bus(sg_page(sg)) + sg->offset;
692 		mscp->sglist[i].num_bytes = sg->length;
693 		transfer_length += sg->length;
694 	}
695 	mscp->number_of_sg_list = max;
696 	mscp->transfer_data = isa_virt_to_bus(mscp->sglist);
697 	/* ??? May not be necessary.  Docs are unclear as to whether transfer
698 	   length field is ignored or whether it should be set to the total
699 	   number of bytes of the transfer.  */
700 	mscp->transfer_data_length = transfer_length;
701 }
702 
ultrastor_queuecommand(struct scsi_cmnd * SCpnt,void (* done)(struct scsi_cmnd *))703 static int ultrastor_queuecommand(struct scsi_cmnd *SCpnt,
704 				void (*done) (struct scsi_cmnd *))
705 {
706     struct mscp *my_mscp;
707 #if ULTRASTOR_MAX_CMDS > 1
708     int mscp_index;
709 #endif
710     unsigned int status;
711 
712     /* Next test is for debugging; "can't happen" */
713     if ((config.mscp_free & ((1U << ULTRASTOR_MAX_CMDS) - 1)) == 0)
714 	panic("ultrastor_queuecommand: no free MSCP\n");
715     mscp_index = find_and_clear_bit_16(&config.mscp_free);
716 
717     /* Has the command been aborted?  */
718     if (xchgb(0xff, &config.aborted[mscp_index]) != 0)
719       {
720 	status = DID_ABORT << 16;
721 	goto aborted;
722       }
723 
724     my_mscp = &config.mscp[mscp_index];
725 
726     *(unsigned char *)my_mscp = OP_SCSI | (DTD_SCSI << 3);
727 
728     /* Tape drives don't work properly if the cache is used.  The SCSI
729        READ command for a tape doesn't have a block offset, and the adapter
730        incorrectly assumes that all reads from the tape read the same
731        blocks.  Results will depend on read buffer size and other disk
732        activity.
733 
734        ???  Which other device types should never use the cache?   */
735     my_mscp->ca = SCpnt->device->type != TYPE_TAPE;
736     my_mscp->target_id = SCpnt->device->id;
737     my_mscp->ch_no = 0;
738     my_mscp->lun = SCpnt->device->lun;
739     if (scsi_sg_count(SCpnt)) {
740 	/* Set scatter/gather flag in SCSI command packet */
741 	my_mscp->sg = TRUE;
742 	build_sg_list(my_mscp, SCpnt);
743     } else {
744 	/* Unset scatter/gather flag in SCSI command packet */
745 	my_mscp->sg = FALSE;
746 	my_mscp->transfer_data = isa_virt_to_bus(scsi_sglist(SCpnt));
747 	my_mscp->transfer_data_length = scsi_bufflen(SCpnt);
748     }
749     my_mscp->command_link = 0;		/*???*/
750     my_mscp->scsi_command_link_id = 0;	/*???*/
751     my_mscp->length_of_sense_byte = SCSI_SENSE_BUFFERSIZE;
752     my_mscp->length_of_scsi_cdbs = SCpnt->cmd_len;
753     memcpy(my_mscp->scsi_cdbs, SCpnt->cmnd, my_mscp->length_of_scsi_cdbs);
754     my_mscp->adapter_status = 0;
755     my_mscp->target_status = 0;
756     my_mscp->sense_data = isa_virt_to_bus(&SCpnt->sense_buffer);
757     my_mscp->done = done;
758     my_mscp->SCint = SCpnt;
759     SCpnt->host_scribble = (unsigned char *)my_mscp;
760 
761     /* Find free OGM slot.  On 24F, look for OGM status byte == 0.
762        On 14F and 34F, wait for local interrupt pending flag to clear.
763 
764        FIXME: now we are using new_eh we should punt here and let the
765        midlayer sort it out */
766 
767 retry:
768     if (config.slot)
769 	while (inb(config.ogm_address - 1) != 0 && config.aborted[mscp_index] == 0xff)
770 		barrier();
771 
772     /* else??? */
773 
774     while ((inb(LCL_DOORBELL_INTR(config.doorbell_address)) & (config.slot ? 2 : 1))  && config.aborted[mscp_index] == 0xff)
775     	barrier();
776 
777     /* To avoid race conditions, keep the code to write to the adapter
778        atomic.  This simplifies the abort code.  Right now the
779        scsi mid layer has the host_lock already held
780      */
781 
782     if (inb(LCL_DOORBELL_INTR(config.doorbell_address)) & (config.slot ? 2 : 1))
783       goto retry;
784 
785     status = xchgb(0, &config.aborted[mscp_index]);
786     if (status != 0xff) {
787 
788 #if ULTRASTOR_DEBUG & (UD_COMMAND | UD_ABORT)
789 	printk("USx4F: queuecommand: aborted\n");
790 #if ULTRASTOR_MAX_CMDS > 1
791 	log_ultrastor_abort(&config, mscp_index);
792 #endif
793 #endif
794 	status <<= 16;
795 
796       aborted:
797 	set_bit(mscp_index, &config.mscp_free);
798 	/* If the driver queues commands, call the done proc here.  Otherwise
799 	   return an error.  */
800 #if ULTRASTOR_MAX_CMDS > 1
801 	SCpnt->result = status;
802 	done(SCpnt);
803 	return 0;
804 #else
805 	return status;
806 #endif
807     }
808 
809     /* Store pointer in OGM address bytes */
810     outl(isa_virt_to_bus(my_mscp), config.ogm_address);
811 
812     /* Issue OGM interrupt */
813     if (config.slot) {
814 	/* Write OGM command register on 24F */
815 	outb(1, config.ogm_address - 1);
816 	outb(0x2, LCL_DOORBELL_INTR(config.doorbell_address));
817     } else {
818 	outb(0x1, LCL_DOORBELL_INTR(config.doorbell_address));
819     }
820 
821 #if (ULTRASTOR_DEBUG & UD_COMMAND)
822     printk("USx4F: queuecommand: returning\n");
823 #endif
824 
825     return 0;
826 }
827 
828 /* This code must deal with 2 cases:
829 
830    1. The command has not been written to the OGM.  In this case, set
831    the abort flag and return.
832 
833    2. The command has been written to the OGM and is stuck somewhere in
834    the adapter.
835 
836    2a.  On a 24F, ask the adapter to abort the command.  It will interrupt
837    when it does.
838 
839    2b.  Call the command's done procedure.
840 
841  */
842 
ultrastor_abort(struct scsi_cmnd * SCpnt)843 static int ultrastor_abort(struct scsi_cmnd *SCpnt)
844 {
845 #if ULTRASTOR_DEBUG & UD_ABORT
846     char out[108];
847     unsigned char icm_status = 0, ogm_status = 0;
848     unsigned int icm_addr = 0, ogm_addr = 0;
849 #endif
850     unsigned int mscp_index;
851     unsigned char old_aborted;
852     unsigned long flags;
853     void (*done)(struct scsi_cmnd *);
854     struct Scsi_Host *host = SCpnt->device->host;
855 
856     if(config.slot)
857       return FAILED;  /* Do not attempt an abort for the 24f */
858 
859     /* Simple consistency checking */
860     if(!SCpnt->host_scribble)
861       return FAILED;
862 
863     mscp_index = ((struct mscp *)SCpnt->host_scribble) - config.mscp;
864     if (mscp_index >= ULTRASTOR_MAX_CMDS)
865 	panic("Ux4F aborting invalid MSCP");
866 
867 #if ULTRASTOR_DEBUG & UD_ABORT
868     if (config.slot)
869       {
870 	int port0 = (config.slot << 12) | 0xc80;
871 	int i;
872 	unsigned long flags;
873 
874 	spin_lock_irqsave(host->host_lock, flags);
875 	strcpy(out, "OGM %d:%x ICM %d:%x ports:  ");
876 	for (i = 0; i < 16; i++)
877 	  {
878 	    unsigned char p = inb(port0 + i);
879 	    out[28 + i * 3] = "0123456789abcdef"[p >> 4];
880 	    out[29 + i * 3] = "0123456789abcdef"[p & 15];
881 	    out[30 + i * 3] = ' ';
882 	  }
883 	out[28 + i * 3] = '\n';
884 	out[29 + i * 3] = 0;
885 	ogm_status = inb(port0 + 22);
886 	ogm_addr = (unsigned int)isa_bus_to_virt(inl(port0 + 23));
887 	icm_status = inb(port0 + 27);
888 	icm_addr = (unsigned int)isa_bus_to_virt(inl(port0 + 28));
889 	spin_unlock_irqrestore(host->host_lock, flags);
890       }
891 
892     /* First check to see if an interrupt is pending.  I suspect the SiS
893        chipset loses interrupts.  (I also suspect is mangles data, but
894        one bug at a time... */
895     if (config.slot ? inb(config.icm_address - 1) == 2 :
896 	(inb(SYS_DOORBELL_INTR(config.doorbell_address)) & 1))
897       {
898 	printk("Ux4F: abort while completed command pending\n");
899 
900 	spin_lock_irqsave(host->host_lock, flags);
901 	/* FIXME: Ewww... need to think about passing host around properly */
902 	ultrastor_interrupt(NULL);
903 	spin_unlock_irqrestore(host->host_lock, flags);
904 	return SUCCESS;
905       }
906 #endif
907 
908     old_aborted = xchgb(DID_ABORT, &config.aborted[mscp_index]);
909 
910     /* aborted == 0xff is the signal that queuecommand has not yet sent
911        the command.  It will notice the new abort flag and fail.  */
912     if (old_aborted == 0xff)
913 	return SUCCESS;
914 
915     /* On 24F, send an abort MSCP request.  The adapter will interrupt
916        and the interrupt handler will call done.  */
917     if (config.slot && inb(config.ogm_address - 1) == 0)
918       {
919 	unsigned long flags;
920 
921 	spin_lock_irqsave(host->host_lock, flags);
922 	outl(isa_virt_to_bus(&config.mscp[mscp_index]), config.ogm_address);
923 	udelay(8);
924 	outb(0x80, config.ogm_address - 1);
925 	outb(0x2, LCL_DOORBELL_INTR(config.doorbell_address));
926 #if ULTRASTOR_DEBUG & UD_ABORT
927 	log_ultrastor_abort(&config, mscp_index);
928 	printk(out, ogm_status, ogm_addr, icm_status, icm_addr);
929 #endif
930 	spin_unlock_irqrestore(host->host_lock, flags);
931 	/* FIXME: add a wait for the abort to complete */
932 	return SUCCESS;
933       }
934 
935 #if ULTRASTOR_DEBUG & UD_ABORT
936     log_ultrastor_abort(&config, mscp_index);
937 #endif
938 
939     /* Can't request a graceful abort.  Either this is not a 24F or
940        the OGM is busy.  Don't free the command -- the adapter might
941        still be using it.  Setting SCint = 0 causes the interrupt
942        handler to ignore the command.  */
943 
944     /* FIXME - devices that implement soft resets will still be running
945        the command after a bus reset.  We would probably rather leave
946        the command in the queue.  The upper level code will automatically
947        leave the command in the active state instead of requeueing it. ERY */
948 
949 #if ULTRASTOR_DEBUG & UD_ABORT
950     if (config.mscp[mscp_index].SCint != SCpnt)
951 	printk("abort: command mismatch, %p != %p\n",
952 	       config.mscp[mscp_index].SCint, SCpnt);
953 #endif
954     if (config.mscp[mscp_index].SCint == NULL)
955 	return FAILED;
956 
957     if (config.mscp[mscp_index].SCint != SCpnt) panic("Bad abort");
958     config.mscp[mscp_index].SCint = NULL;
959     done = config.mscp[mscp_index].done;
960     config.mscp[mscp_index].done = NULL;
961     SCpnt->result = DID_ABORT << 16;
962 
963     /* Take the host lock to guard against scsi layer re-entry */
964     done(SCpnt);
965 
966     /* Need to set a timeout here in case command never completes.  */
967     return SUCCESS;
968 }
969 
ultrastor_host_reset(struct scsi_cmnd * SCpnt)970 static int ultrastor_host_reset(struct scsi_cmnd * SCpnt)
971 {
972     unsigned long flags;
973     int i;
974     struct Scsi_Host *host = SCpnt->device->host;
975 
976 #if (ULTRASTOR_DEBUG & UD_RESET)
977     printk("US14F: reset: called\n");
978 #endif
979 
980     if(config.slot)
981     	return FAILED;
982 
983     spin_lock_irqsave(host->host_lock, flags);
984     /* Reset the adapter and SCSI bus.  The SCSI bus reset can be
985        inhibited by clearing ultrastor_bus_reset before probe.  */
986     outb(0xc0, LCL_DOORBELL_INTR(config.doorbell_address));
987     if (config.slot)
988       {
989 	outb(0, config.ogm_address - 1);
990 	outb(0, config.icm_address - 1);
991       }
992 
993 #if ULTRASTOR_MAX_CMDS == 1
994     if (config.mscp_busy && config.mscp->done && config.mscp->SCint)
995       {
996 	config.mscp->SCint->result = DID_RESET << 16;
997 	config.mscp->done(config.mscp->SCint);
998       }
999     config.mscp->SCint = 0;
1000 #else
1001     for (i = 0; i < ULTRASTOR_MAX_CMDS; i++)
1002       {
1003 	if (! (config.mscp_free & (1 << i)) &&
1004 	    config.mscp[i].done && config.mscp[i].SCint)
1005 	  {
1006 	    config.mscp[i].SCint->result = DID_RESET << 16;
1007 	    config.mscp[i].done(config.mscp[i].SCint);
1008 	    config.mscp[i].done = NULL;
1009 	  }
1010 	config.mscp[i].SCint = NULL;
1011       }
1012 #endif
1013 
1014     /* FIXME - if the device implements soft resets, then the command
1015        will still be running.  ERY
1016 
1017        Even bigger deal with new_eh!
1018      */
1019 
1020     memset((unsigned char *)config.aborted, 0, sizeof config.aborted);
1021 #if ULTRASTOR_MAX_CMDS == 1
1022     config.mscp_busy = 0;
1023 #else
1024     config.mscp_free = ~0;
1025 #endif
1026 
1027     spin_unlock_irqrestore(host->host_lock, flags);
1028     return SUCCESS;
1029 
1030 }
1031 
ultrastor_biosparam(struct scsi_device * sdev,struct block_device * bdev,sector_t capacity,int * dkinfo)1032 int ultrastor_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1033 		sector_t capacity, int * dkinfo)
1034 {
1035     int size = capacity;
1036     unsigned int s = config.heads * config.sectors;
1037 
1038     dkinfo[0] = config.heads;
1039     dkinfo[1] = config.sectors;
1040     dkinfo[2] = size / s;	/* Ignore partial cylinders */
1041 #if 0
1042     if (dkinfo[2] > 1024)
1043 	dkinfo[2] = 1024;
1044 #endif
1045     return 0;
1046 }
1047 
ultrastor_interrupt(void * dev_id)1048 static void ultrastor_interrupt(void *dev_id)
1049 {
1050     unsigned int status;
1051 #if ULTRASTOR_MAX_CMDS > 1
1052     unsigned int mscp_index;
1053 #endif
1054     struct mscp *mscp;
1055     void (*done) (struct scsi_cmnd *);
1056     struct scsi_cmnd *SCtmp;
1057 
1058 #if ULTRASTOR_MAX_CMDS == 1
1059     mscp = &config.mscp[0];
1060 #else
1061     mscp = (struct mscp *)isa_bus_to_virt(inl(config.icm_address));
1062     mscp_index = mscp - config.mscp;
1063     if (mscp_index >= ULTRASTOR_MAX_CMDS) {
1064 	printk("Ux4F interrupt: bad MSCP address %x\n", (unsigned int) mscp);
1065 	/* A command has been lost.  Reset and report an error
1066 	   for all commands.  */
1067 	ultrastor_host_reset(dev_id);
1068 	return;
1069     }
1070 #endif
1071 
1072     /* Clean ICM slot (set ICMINT bit to 0) */
1073     if (config.slot) {
1074 	unsigned char icm_status = inb(config.icm_address - 1);
1075 #if ULTRASTOR_DEBUG & (UD_INTERRUPT|UD_ERROR|UD_ABORT)
1076 	if (icm_status != 1 && icm_status != 2)
1077 	    printk("US24F: ICM status %x for MSCP %d (%x)\n", icm_status,
1078 		   mscp_index, (unsigned int) mscp);
1079 #endif
1080 	/* The manual says clear interrupt then write 0 to ICM status.
1081 	   This seems backwards, but I'll do it anyway.  --jfc */
1082 	outb(2, SYS_DOORBELL_INTR(config.doorbell_address));
1083 	outb(0, config.icm_address - 1);
1084 	if (icm_status == 4) {
1085 	    printk("UltraStor abort command failed\n");
1086 	    return;
1087 	}
1088 	if (icm_status == 3) {
1089 	    void (*done)(struct scsi_cmnd *) = mscp->done;
1090 	    if (done) {
1091 		mscp->done = NULL;
1092 		mscp->SCint->result = DID_ABORT << 16;
1093 		done(mscp->SCint);
1094 	    }
1095 	    return;
1096 	}
1097     } else {
1098 	outb(1, SYS_DOORBELL_INTR(config.doorbell_address));
1099     }
1100 
1101     SCtmp = mscp->SCint;
1102     mscp->SCint = NULL;
1103 
1104     if (!SCtmp)
1105       {
1106 #if ULTRASTOR_DEBUG & (UD_ABORT|UD_INTERRUPT)
1107 	printk("MSCP %d (%x): no command\n", mscp_index, (unsigned int) mscp);
1108 #endif
1109 #if ULTRASTOR_MAX_CMDS == 1
1110 	config.mscp_busy = FALSE;
1111 #else
1112 	set_bit(mscp_index, &config.mscp_free);
1113 #endif
1114 	config.aborted[mscp_index] = 0;
1115 	return;
1116       }
1117 
1118     /* Save done locally and zero before calling.  This is needed as
1119        once we call done, we may get another command queued before this
1120        interrupt service routine can return. */
1121     done = mscp->done;
1122     mscp->done = NULL;
1123 
1124     /* Let the higher levels know that we're done */
1125     switch (mscp->adapter_status)
1126       {
1127       case 0:
1128 	status = DID_OK << 16;
1129 	break;
1130       case 0x01:	/* invalid command */
1131       case 0x02:	/* invalid parameters */
1132       case 0x03:	/* invalid data list */
1133       default:
1134 	status = DID_ERROR << 16;
1135 	break;
1136       case 0x84:	/* SCSI bus abort */
1137 	status = DID_ABORT << 16;
1138 	break;
1139       case 0x91:
1140 	status = DID_TIME_OUT << 16;
1141 	break;
1142       }
1143 
1144     SCtmp->result = status | mscp->target_status;
1145 
1146     SCtmp->host_scribble = NULL;
1147 
1148     /* Free up mscp block for next command */
1149 #if ULTRASTOR_MAX_CMDS == 1
1150     config.mscp_busy = FALSE;
1151 #else
1152     set_bit(mscp_index, &config.mscp_free);
1153 #endif
1154 
1155 #if ULTRASTOR_DEBUG & (UD_ABORT|UD_INTERRUPT)
1156     if (config.aborted[mscp_index])
1157 	printk("Ux4 interrupt: MSCP %d (%x) aborted = %d\n",
1158 	       mscp_index, (unsigned int) mscp, config.aborted[mscp_index]);
1159 #endif
1160     config.aborted[mscp_index] = 0;
1161 
1162     if (done)
1163 	done(SCtmp);
1164     else
1165 	printk("US14F: interrupt: unexpected interrupt\n");
1166 
1167     if (config.slot ? inb(config.icm_address - 1) :
1168        (inb(SYS_DOORBELL_INTR(config.doorbell_address)) & 1))
1169 #if (ULTRASTOR_DEBUG & UD_MULTI_CMD)
1170       printk("Ux4F: multiple commands completed\n");
1171 #else
1172       ;
1173 #endif
1174 
1175 #if (ULTRASTOR_DEBUG & UD_INTERRUPT)
1176     printk("USx4F: interrupt: returning\n");
1177 #endif
1178 }
1179 
do_ultrastor_interrupt(int irq,void * dev_id)1180 static irqreturn_t do_ultrastor_interrupt(int irq, void *dev_id)
1181 {
1182     unsigned long flags;
1183     struct Scsi_Host *dev = dev_id;
1184 
1185     spin_lock_irqsave(dev->host_lock, flags);
1186     ultrastor_interrupt(dev_id);
1187     spin_unlock_irqrestore(dev->host_lock, flags);
1188     return IRQ_HANDLED;
1189 }
1190 
1191 MODULE_LICENSE("GPL");
1192 
1193 static struct scsi_host_template driver_template = {
1194 	.name              = "UltraStor 14F/24F/34F",
1195 	.detect            = ultrastor_detect,
1196 	.release	   = ultrastor_release,
1197 	.info              = ultrastor_info,
1198 	.queuecommand      = ultrastor_queuecommand,
1199 	.eh_abort_handler  = ultrastor_abort,
1200 	.eh_host_reset_handler  = ultrastor_host_reset,
1201 	.bios_param        = ultrastor_biosparam,
1202 	.can_queue         = ULTRASTOR_MAX_CMDS,
1203 	.sg_tablesize      = ULTRASTOR_14F_MAX_SG,
1204 	.cmd_per_lun       = ULTRASTOR_MAX_CMDS_PER_LUN,
1205 	.unchecked_isa_dma = 1,
1206 	.use_clustering    = ENABLE_CLUSTERING,
1207 };
1208 #include "scsi_module.c"
1209