[PATCH] kthread: convert loop.c to kthread
[linux-2.6] / drivers / scsi / aha1542.c
1 /* $Id: aha1542.c,v 1.1 1992/07/24 06:27:38 root Exp root $
2  *  linux/kernel/aha1542.c
3  *
4  *  Copyright (C) 1992  Tommy Thorn
5  *  Copyright (C) 1993, 1994, 1995 Eric Youngdale
6  *
7  *  Modified by Eric Youngdale
8  *        Use request_irq and request_dma to help prevent unexpected conflicts
9  *        Set up on-board DMA controller, such that we do not have to
10  *        have the bios enabled to use the aha1542.
11  *  Modified by David Gentzel
12  *        Don't call request_dma if dma mask is 0 (for BusLogic BT-445S VL-Bus
13  *        controller).
14  *  Modified by Matti Aarnio
15  *        Accept parameters from LILO cmd-line. -- 1-Oct-94
16  *  Modified by Mike McLagan <mike.mclagan@linux.org>
17  *        Recognise extended mode on AHA1542CP, different bit than 1542CF
18  *        1-Jan-97
19  *  Modified by Bjorn L. Thordarson and Einar Thor Einarsson
20  *        Recognize that DMA0 is valid DMA channel -- 13-Jul-98
21  *  Modified by Chris Faulhaber <jedgar@fxp.org>
22  *        Added module command-line options
23  *        19-Jul-99
24  *  Modified by Adam Fritzler <mid@auk.cx>
25  *        Added proper detection of the AHA-1640 (MCA version of AHA-1540)
26  */
27
28 #include <linux/module.h>
29 #include <linux/interrupt.h>
30 #include <linux/kernel.h>
31 #include <linux/types.h>
32 #include <linux/string.h>
33 #include <linux/ioport.h>
34 #include <linux/delay.h>
35 #include <linux/proc_fs.h>
36 #include <linux/init.h>
37 #include <linux/spinlock.h>
38 #include <linux/pci.h>
39 #include <linux/isapnp.h>
40 #include <linux/blkdev.h>
41 #include <linux/mca.h>
42 #include <linux/mca-legacy.h>
43
44 #include <asm/dma.h>
45 #include <asm/system.h>
46 #include <asm/io.h>
47
48 #include "scsi.h"
49 #include <scsi/scsi_host.h>
50 #include "aha1542.h"
51
52 #define SCSI_BUF_PA(address)    isa_virt_to_bus(address)
53 #define SCSI_SG_PA(sgent)       (isa_page_to_bus((sgent)->page) + (sgent)->offset)
54
55 static void BAD_DMA(void *address, unsigned int length)
56 {
57         printk(KERN_CRIT "buf vaddress %p paddress 0x%lx length %d\n",
58                address,
59                SCSI_BUF_PA(address),
60                length);
61         panic("Buffer at physical address > 16Mb used for aha1542");
62 }
63
64 static void BAD_SG_DMA(Scsi_Cmnd * SCpnt,
65                        struct scatterlist *sgpnt,
66                        int nseg,
67                        int badseg)
68 {
69         printk(KERN_CRIT "sgpnt[%d:%d] page %p/0x%llx length %u\n",
70                badseg, nseg,
71                page_address(sgpnt[badseg].page) + sgpnt[badseg].offset,
72                (unsigned long long)SCSI_SG_PA(&sgpnt[badseg]),
73                sgpnt[badseg].length);
74
75         /*
76          * Not safe to continue.
77          */
78         panic("Buffer at physical address > 16Mb used for aha1542");
79 }
80
81 #include<linux/stat.h>
82
83 #ifdef DEBUG
84 #define DEB(x) x
85 #else
86 #define DEB(x)
87 #endif
88
89 /*
90    static const char RCSid[] = "$Header: /usr/src/linux/kernel/blk_drv/scsi/RCS/aha1542.c,v 1.1 1992/07/24 06:27:38 root Exp root $";
91  */
92
93 /* The adaptec can be configured for quite a number of addresses, but
94    I generally do not want the card poking around at random.  We allow
95    two addresses - this allows people to use the Adaptec with a Midi
96    card, which also used 0x330 -- can be overridden with LILO! */
97
98 #define MAXBOARDS 4             /* Increase this and the sizes of the
99                                    arrays below, if you need more.. */
100
101 /* Boards 3,4 slots are reserved for ISAPnP/MCA scans */
102
103 static unsigned int bases[MAXBOARDS] __initdata = {0x330, 0x334, 0, 0};
104
105 /* set by aha1542_setup according to the command line; they also may
106    be marked __initdata, but require zero initializers then */
107
108 static int setup_called[MAXBOARDS];
109 static int setup_buson[MAXBOARDS];
110 static int setup_busoff[MAXBOARDS];
111 static int setup_dmaspeed[MAXBOARDS] __initdata = { -1, -1, -1, -1 };
112
113 /*
114  * LILO/Module params:  aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]
115  *
116  * Where:  <PORTBASE> is any of the valid AHA addresses:
117  *                      0x130, 0x134, 0x230, 0x234, 0x330, 0x334
118  *         <BUSON>  is the time (in microsecs) that AHA spends on the AT-bus
119  *                  when transferring data.  1542A power-on default is 11us,
120  *                  valid values are in range: 2..15 (decimal)
121  *         <BUSOFF> is the time that AHA spends OFF THE BUS after while
122  *                  it is transferring data (not to monopolize the bus).
123  *                  Power-on default is 4us, valid range: 1..64 microseconds.
124  *         <DMASPEED> Default is jumper selected (1542A: on the J1),
125  *                  but experimenter can alter it with this.
126  *                  Valid values: 5, 6, 7, 8, 10 (MB/s)
127  *                  Factory default is 5 MB/s.
128  */
129
130 #if defined(MODULE)
131 static int isapnp = 0;
132 static int aha1542[] = {0x330, 11, 4, -1};
133 module_param_array(aha1542, int, NULL, 0);
134 module_param(isapnp, bool, 0);
135
136 static struct isapnp_device_id id_table[] __initdata = {
137         {
138                 ISAPNP_ANY_ID, ISAPNP_ANY_ID,
139                 ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1542),
140                 0
141         },
142         {0}
143 };
144
145 MODULE_DEVICE_TABLE(isapnp, id_table);
146
147 #else
148 static int isapnp = 1;
149 #endif
150
151 #define BIOS_TRANSLATION_1632 0 /* Used by some old 1542A boards */
152 #define BIOS_TRANSLATION_6432 1 /* Default case these days */
153 #define BIOS_TRANSLATION_25563 2        /* Big disk case */
154
155 struct aha1542_hostdata {
156         /* This will effectively start both of them at the first mailbox */
157         int bios_translation;   /* Mapping bios uses - for compatibility */
158         int aha1542_last_mbi_used;
159         int aha1542_last_mbo_used;
160         Scsi_Cmnd *SCint[AHA1542_MAILBOXES];
161         struct mailbox mb[2 * AHA1542_MAILBOXES];
162         struct ccb ccb[AHA1542_MAILBOXES];
163 };
164
165 #define HOSTDATA(host) ((struct aha1542_hostdata *) &host->hostdata)
166
167 static struct Scsi_Host *aha_host[7];   /* One for each IRQ level (9-15) */
168
169 static DEFINE_SPINLOCK(aha1542_lock);
170
171
172
173 #define WAITnexttimeout 3000000
174
175 static void setup_mailboxes(int base_io, struct Scsi_Host *shpnt);
176 static int aha1542_restart(struct Scsi_Host *shost);
177 static void aha1542_intr_handle(struct Scsi_Host *shost, void *dev_id, struct pt_regs *regs);
178 static irqreturn_t do_aha1542_intr_handle(int irq, void *dev_id,
179                                         struct pt_regs *regs);
180
181 #define aha1542_intr_reset(base)  outb(IRST, CONTROL(base))
182
183 #define WAIT(port, mask, allof, noneof)                                 \
184  { register int WAITbits;                                               \
185    register int WAITtimeout = WAITnexttimeout;                          \
186    while (1) {                                                          \
187      WAITbits = inb(port) & (mask);                                     \
188      if ((WAITbits & (allof)) == (allof) && ((WAITbits & (noneof)) == 0)) \
189        break;                                                           \
190      if (--WAITtimeout == 0) goto fail;                                 \
191    }                                                                    \
192  }
193
194 /* Similar to WAIT, except we use the udelay call to regulate the
195    amount of time we wait.  */
196 #define WAITd(port, mask, allof, noneof, timeout)                       \
197  { register int WAITbits;                                               \
198    register int WAITtimeout = timeout;                                  \
199    while (1) {                                                          \
200      WAITbits = inb(port) & (mask);                                     \
201      if ((WAITbits & (allof)) == (allof) && ((WAITbits & (noneof)) == 0)) \
202        break;                                                           \
203      mdelay(1);                                                 \
204      if (--WAITtimeout == 0) goto fail;                                 \
205    }                                                                    \
206  }
207
208 static void aha1542_stat(void)
209 {
210 /*      int s = inb(STATUS), i = inb(INTRFLAGS);
211         printk("status=%x intrflags=%x\n", s, i, WAITnexttimeout-WAITtimeout); */
212 }
213
214 /* This is a bit complicated, but we need to make sure that an interrupt
215    routine does not send something out while we are in the middle of this.
216    Fortunately, it is only at boot time that multi-byte messages
217    are ever sent. */
218 static int aha1542_out(unsigned int base, unchar * cmdp, int len)
219 {
220         unsigned long flags = 0;
221         int got_lock;
222
223         if (len == 1) {
224                 got_lock = 0;
225                 while (1 == 1) {
226                         WAIT(STATUS(base), CDF, 0, CDF);
227                         spin_lock_irqsave(&aha1542_lock, flags);
228                         if (inb(STATUS(base)) & CDF) {
229                                 spin_unlock_irqrestore(&aha1542_lock, flags);
230                                 continue;
231                         }
232                         outb(*cmdp, DATA(base));
233                         spin_unlock_irqrestore(&aha1542_lock, flags);
234                         return 0;
235                 }
236         } else {
237                 spin_lock_irqsave(&aha1542_lock, flags);
238                 got_lock = 1;
239                 while (len--) {
240                         WAIT(STATUS(base), CDF, 0, CDF);
241                         outb(*cmdp++, DATA(base));
242                 }
243                 spin_unlock_irqrestore(&aha1542_lock, flags);
244         }
245         return 0;
246 fail:
247         if (got_lock)
248                 spin_unlock_irqrestore(&aha1542_lock, flags);
249         printk(KERN_ERR "aha1542_out failed(%d): ", len + 1);
250         aha1542_stat();
251         return 1;
252 }
253
254 /* Only used at boot time, so we do not need to worry about latency as much
255    here */
256
257 static int __init aha1542_in(unsigned int base, unchar * cmdp, int len)
258 {
259         unsigned long flags;
260
261         spin_lock_irqsave(&aha1542_lock, flags);
262         while (len--) {
263                 WAIT(STATUS(base), DF, DF, 0);
264                 *cmdp++ = inb(DATA(base));
265         }
266         spin_unlock_irqrestore(&aha1542_lock, flags);
267         return 0;
268 fail:
269         spin_unlock_irqrestore(&aha1542_lock, flags);
270         printk(KERN_ERR "aha1542_in failed(%d): ", len + 1);
271         aha1542_stat();
272         return 1;
273 }
274
275 /* Similar to aha1542_in, except that we wait a very short period of time.
276    We use this if we know the board is alive and awake, but we are not sure
277    if the board will respond to the command we are about to send or not */
278 static int __init aha1542_in1(unsigned int base, unchar * cmdp, int len)
279 {
280         unsigned long flags;
281
282         spin_lock_irqsave(&aha1542_lock, flags);
283         while (len--) {
284                 WAITd(STATUS(base), DF, DF, 0, 100);
285                 *cmdp++ = inb(DATA(base));
286         }
287         spin_unlock_irqrestore(&aha1542_lock, flags);
288         return 0;
289 fail:
290         spin_unlock_irqrestore(&aha1542_lock, flags);
291         return 1;
292 }
293
294 static int makecode(unsigned hosterr, unsigned scsierr)
295 {
296         switch (hosterr) {
297         case 0x0:
298         case 0xa:               /* Linked command complete without error and linked normally */
299         case 0xb:               /* Linked command complete without error, interrupt generated */
300                 hosterr = 0;
301                 break;
302
303         case 0x11:              /* Selection time out-The initiator selection or target
304                                    reselection was not complete within the SCSI Time out period */
305                 hosterr = DID_TIME_OUT;
306                 break;
307
308         case 0x12:              /* Data overrun/underrun-The target attempted to transfer more data
309                                    than was allocated by the Data Length field or the sum of the
310                                    Scatter / Gather Data Length fields. */
311
312         case 0x13:              /* Unexpected bus free-The target dropped the SCSI BSY at an unexpected time. */
313
314         case 0x15:              /* MBO command was not 00, 01 or 02-The first byte of the CB was
315                                    invalid. This usually indicates a software failure. */
316
317         case 0x16:              /* Invalid CCB Operation Code-The first byte of the CCB was invalid.
318                                    This usually indicates a software failure. */
319
320         case 0x17:              /* Linked CCB does not have the same LUN-A subsequent CCB of a set
321                                    of linked CCB's does not specify the same logical unit number as
322                                    the first. */
323         case 0x18:              /* Invalid Target Direction received from Host-The direction of a
324                                    Target Mode CCB was invalid. */
325
326         case 0x19:              /* Duplicate CCB Received in Target Mode-More than once CCB was
327                                    received to service data transfer between the same target LUN
328                                    and initiator SCSI ID in the same direction. */
329
330         case 0x1a:              /* Invalid CCB or Segment List Parameter-A segment list with a zero
331                                    length segment or invalid segment list boundaries was received.
332                                    A CCB parameter was invalid. */
333                 DEB(printk("Aha1542: %x %x\n", hosterr, scsierr));
334                 hosterr = DID_ERROR;    /* Couldn't find any better */
335                 break;
336
337         case 0x14:              /* Target bus phase sequence failure-An invalid bus phase or bus
338                                    phase sequence was requested by the target. The host adapter
339                                    will generate a SCSI Reset Condition, notifying the host with
340                                    a SCRD interrupt */
341                 hosterr = DID_RESET;
342                 break;
343         default:
344                 printk(KERN_ERR "aha1542: makecode: unknown hoststatus %x\n", hosterr);
345                 break;
346         }
347         return scsierr | (hosterr << 16);
348 }
349
350 static int __init aha1542_test_port(int bse, struct Scsi_Host *shpnt)
351 {
352         unchar inquiry_cmd[] = {CMD_INQUIRY};
353         unchar inquiry_result[4];
354         unchar *cmdp;
355         int len;
356         volatile int debug = 0;
357
358         /* Quick and dirty test for presence of the card. */
359         if (inb(STATUS(bse)) == 0xff)
360                 return 0;
361
362         /* Reset the adapter. I ought to make a hard reset, but it's not really necessary */
363
364         /*  DEB(printk("aha1542_test_port called \n")); */
365
366         /* In case some other card was probing here, reset interrupts */
367         aha1542_intr_reset(bse);        /* reset interrupts, so they don't block */
368
369         outb(SRST | IRST /*|SCRST */ , CONTROL(bse));
370
371         mdelay(20);             /* Wait a little bit for things to settle down. */
372
373         debug = 1;
374         /* Expect INIT and IDLE, any of the others are bad */
375         WAIT(STATUS(bse), STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
376
377         debug = 2;
378         /* Shouldn't have generated any interrupts during reset */
379         if (inb(INTRFLAGS(bse)) & INTRMASK)
380                 goto fail;
381
382
383         /* Perform a host adapter inquiry instead so we do not need to set
384            up the mailboxes ahead of time */
385
386         aha1542_out(bse, inquiry_cmd, 1);
387
388         debug = 3;
389         len = 4;
390         cmdp = &inquiry_result[0];
391
392         while (len--) {
393                 WAIT(STATUS(bse), DF, DF, 0);
394                 *cmdp++ = inb(DATA(bse));
395         }
396
397         debug = 8;
398         /* Reading port should reset DF */
399         if (inb(STATUS(bse)) & DF)
400                 goto fail;
401
402         debug = 9;
403         /* When HACC, command is completed, and we're though testing */
404         WAIT(INTRFLAGS(bse), HACC, HACC, 0);
405         /* now initialize adapter */
406
407         debug = 10;
408         /* Clear interrupts */
409         outb(IRST, CONTROL(bse));
410
411         debug = 11;
412
413         return debug;           /* 1 = ok */
414 fail:
415         return 0;               /* 0 = not ok */
416 }
417
418 /* A quick wrapper for do_aha1542_intr_handle to grab the spin lock */
419 static irqreturn_t do_aha1542_intr_handle(int irq, void *dev_id,
420                                         struct pt_regs *regs)
421 {
422         unsigned long flags;
423         struct Scsi_Host *shost;
424
425         shost = aha_host[irq - 9];
426         if (!shost)
427                 panic("Splunge!");
428
429         spin_lock_irqsave(shost->host_lock, flags);
430         aha1542_intr_handle(shost, dev_id, regs);
431         spin_unlock_irqrestore(shost->host_lock, flags);
432         return IRQ_HANDLED;
433 }
434
435 /* A "high" level interrupt handler */
436 static void aha1542_intr_handle(struct Scsi_Host *shost, void *dev_id, struct pt_regs *regs)
437 {
438         void (*my_done) (Scsi_Cmnd *) = NULL;
439         int errstatus, mbi, mbo, mbistatus;
440         int number_serviced;
441         unsigned long flags;
442         Scsi_Cmnd *SCtmp;
443         int flag;
444         int needs_restart;
445         struct mailbox *mb;
446         struct ccb *ccb;
447
448         mb = HOSTDATA(shost)->mb;
449         ccb = HOSTDATA(shost)->ccb;
450
451 #ifdef DEBUG
452         {
453                 flag = inb(INTRFLAGS(shost->io_port));
454                 printk(KERN_DEBUG "aha1542_intr_handle: ");
455                 if (!(flag & ANYINTR))
456                         printk("no interrupt?");
457                 if (flag & MBIF)
458                         printk("MBIF ");
459                 if (flag & MBOA)
460                         printk("MBOF ");
461                 if (flag & HACC)
462                         printk("HACC ");
463                 if (flag & SCRD)
464                         printk("SCRD ");
465                 printk("status %02x\n", inb(STATUS(shost->io_port)));
466         };
467 #endif
468         number_serviced = 0;
469         needs_restart = 0;
470
471         while (1 == 1) {
472                 flag = inb(INTRFLAGS(shost->io_port));
473
474                 /* Check for unusual interrupts.  If any of these happen, we should
475                    probably do something special, but for now just printing a message
476                    is sufficient.  A SCSI reset detected is something that we really
477                    need to deal with in some way. */
478                 if (flag & ~MBIF) {
479                         if (flag & MBOA)
480                                 printk("MBOF ");
481                         if (flag & HACC)
482                                 printk("HACC ");
483                         if (flag & SCRD) {
484                                 needs_restart = 1;
485                                 printk("SCRD ");
486                         }
487                 }
488                 aha1542_intr_reset(shost->io_port);
489
490                 spin_lock_irqsave(&aha1542_lock, flags);
491                 mbi = HOSTDATA(shost)->aha1542_last_mbi_used + 1;
492                 if (mbi >= 2 * AHA1542_MAILBOXES)
493                         mbi = AHA1542_MAILBOXES;
494
495                 do {
496                         if (mb[mbi].status != 0)
497                                 break;
498                         mbi++;
499                         if (mbi >= 2 * AHA1542_MAILBOXES)
500                                 mbi = AHA1542_MAILBOXES;
501                 } while (mbi != HOSTDATA(shost)->aha1542_last_mbi_used);
502
503                 if (mb[mbi].status == 0) {
504                         spin_unlock_irqrestore(&aha1542_lock, flags);
505                         /* Hmm, no mail.  Must have read it the last time around */
506                         if (!number_serviced && !needs_restart)
507                                 printk(KERN_WARNING "aha1542.c: interrupt received, but no mail.\n");
508                         /* We detected a reset.  Restart all pending commands for
509                            devices that use the hard reset option */
510                         if (needs_restart)
511                                 aha1542_restart(shost);
512                         return;
513                 };
514
515                 mbo = (scsi2int(mb[mbi].ccbptr) - (SCSI_BUF_PA(&ccb[0]))) / sizeof(struct ccb);
516                 mbistatus = mb[mbi].status;
517                 mb[mbi].status = 0;
518                 HOSTDATA(shost)->aha1542_last_mbi_used = mbi;
519                 spin_unlock_irqrestore(&aha1542_lock, flags);
520
521 #ifdef DEBUG
522                 {
523                         if (ccb[mbo].tarstat | ccb[mbo].hastat)
524                                 printk(KERN_DEBUG "aha1542_command: returning %x (status %d)\n",
525                                        ccb[mbo].tarstat + ((int) ccb[mbo].hastat << 16), mb[mbi].status);
526                 };
527 #endif
528
529                 if (mbistatus == 3)
530                         continue;       /* Aborted command not found */
531
532 #ifdef DEBUG
533                 printk(KERN_DEBUG "...done %d %d\n", mbo, mbi);
534 #endif
535
536                 SCtmp = HOSTDATA(shost)->SCint[mbo];
537
538                 if (!SCtmp || !SCtmp->scsi_done) {
539                         printk(KERN_WARNING "aha1542_intr_handle: Unexpected interrupt\n");
540                         printk(KERN_WARNING "tarstat=%x, hastat=%x idlun=%x ccb#=%d \n", ccb[mbo].tarstat,
541                                ccb[mbo].hastat, ccb[mbo].idlun, mbo);
542                         return;
543                 }
544                 my_done = SCtmp->scsi_done;
545                 kfree(SCtmp->host_scribble);
546                 SCtmp->host_scribble = NULL;
547                 /* Fetch the sense data, and tuck it away, in the required slot.  The
548                    Adaptec automatically fetches it, and there is no guarantee that
549                    we will still have it in the cdb when we come back */
550                 if (ccb[mbo].tarstat == 2)
551                         memcpy(SCtmp->sense_buffer, &ccb[mbo].cdb[ccb[mbo].cdblen],
552                                sizeof(SCtmp->sense_buffer));
553
554
555                 /* is there mail :-) */
556
557                 /* more error checking left out here */
558                 if (mbistatus != 1)
559                         /* This is surely wrong, but I don't know what's right */
560                         errstatus = makecode(ccb[mbo].hastat, ccb[mbo].tarstat);
561                 else
562                         errstatus = 0;
563
564 #ifdef DEBUG
565                 if (errstatus)
566                         printk(KERN_DEBUG "(aha1542 error:%x %x %x) ", errstatus,
567                                ccb[mbo].hastat, ccb[mbo].tarstat);
568 #endif
569
570                 if (ccb[mbo].tarstat == 2) {
571 #ifdef DEBUG
572                         int i;
573 #endif
574                         DEB(printk("aha1542_intr_handle: sense:"));
575 #ifdef DEBUG
576                         for (i = 0; i < 12; i++)
577                                 printk("%02x ", ccb[mbo].cdb[ccb[mbo].cdblen + i]);
578                         printk("\n");
579 #endif
580                         /*
581                            DEB(printk("aha1542_intr_handle: buf:"));
582                            for (i = 0; i < bufflen; i++)
583                            printk("%02x ", ((unchar *)buff)[i]);
584                            printk("\n");
585                          */
586                 }
587                 DEB(if (errstatus) printk("aha1542_intr_handle: returning %6x\n", errstatus));
588                 SCtmp->result = errstatus;
589                 HOSTDATA(shost)->SCint[mbo] = NULL;     /* This effectively frees up the mailbox slot, as
590                                                            far as queuecommand is concerned */
591                 my_done(SCtmp);
592                 number_serviced++;
593         };
594 }
595
596 static int aha1542_queuecommand(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *))
597 {
598         unchar ahacmd = CMD_START_SCSI;
599         unchar direction;
600         unchar *cmd = (unchar *) SCpnt->cmnd;
601         unchar target = SCpnt->device->id;
602         unchar lun = SCpnt->device->lun;
603         unsigned long flags;
604         void *buff = SCpnt->request_buffer;
605         int bufflen = SCpnt->request_bufflen;
606         int mbo;
607         struct mailbox *mb;
608         struct ccb *ccb;
609
610         DEB(int i);
611
612         mb = HOSTDATA(SCpnt->device->host)->mb;
613         ccb = HOSTDATA(SCpnt->device->host)->ccb;
614
615         DEB(if (target > 1) {
616             SCpnt->result = DID_TIME_OUT << 16;
617             done(SCpnt); return 0;
618             }
619         );
620
621         if (*cmd == REQUEST_SENSE) {
622                 /* Don't do the command - we have the sense data already */
623 #if 0
624                 /* scsi_request_sense() provides a buffer of size 256,
625                    so there is no reason to expect equality */
626                 if (bufflen != sizeof(SCpnt->sense_buffer))
627                         printk(KERN_CRIT "aha1542: Wrong buffer length supplied "
628                                "for request sense (%d)\n", bufflen);
629 #endif
630                 SCpnt->result = 0;
631                 done(SCpnt);
632                 return 0;
633         }
634 #ifdef DEBUG
635         if (*cmd == READ_10 || *cmd == WRITE_10)
636                 i = xscsi2int(cmd + 2);
637         else if (*cmd == READ_6 || *cmd == WRITE_6)
638                 i = scsi2int(cmd + 2);
639         else
640                 i = -1;
641         if (done)
642                 printk(KERN_DEBUG "aha1542_queuecommand: dev %d cmd %02x pos %d len %d ", target, *cmd, i, bufflen);
643         else
644                 printk(KERN_DEBUG "aha1542_command: dev %d cmd %02x pos %d len %d ", target, *cmd, i, bufflen);
645         aha1542_stat();
646         printk(KERN_DEBUG "aha1542_queuecommand: dumping scsi cmd:");
647         for (i = 0; i < SCpnt->cmd_len; i++)
648                 printk("%02x ", cmd[i]);
649         printk("\n");
650         if (*cmd == WRITE_10 || *cmd == WRITE_6)
651                 return 0;       /* we are still testing, so *don't* write */
652 #endif
653         /* Use the outgoing mailboxes in a round-robin fashion, because this
654            is how the host adapter will scan for them */
655
656         spin_lock_irqsave(&aha1542_lock, flags);
657         mbo = HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used + 1;
658         if (mbo >= AHA1542_MAILBOXES)
659                 mbo = 0;
660
661         do {
662                 if (mb[mbo].status == 0 && HOSTDATA(SCpnt->device->host)->SCint[mbo] == NULL)
663                         break;
664                 mbo++;
665                 if (mbo >= AHA1542_MAILBOXES)
666                         mbo = 0;
667         } while (mbo != HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used);
668
669         if (mb[mbo].status || HOSTDATA(SCpnt->device->host)->SCint[mbo])
670                 panic("Unable to find empty mailbox for aha1542.\n");
671
672         HOSTDATA(SCpnt->device->host)->SCint[mbo] = SCpnt;      /* This will effectively prevent someone else from
673                                                            screwing with this cdb. */
674
675         HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used = mbo;
676         spin_unlock_irqrestore(&aha1542_lock, flags);
677
678 #ifdef DEBUG
679         printk(KERN_DEBUG "Sending command (%d %x)...", mbo, done);
680 #endif
681
682         any2scsi(mb[mbo].ccbptr, SCSI_BUF_PA(&ccb[mbo]));       /* This gets trashed for some reason */
683
684         memset(&ccb[mbo], 0, sizeof(struct ccb));
685
686         ccb[mbo].cdblen = SCpnt->cmd_len;
687
688         direction = 0;
689         if (*cmd == READ_10 || *cmd == READ_6)
690                 direction = 8;
691         else if (*cmd == WRITE_10 || *cmd == WRITE_6)
692                 direction = 16;
693
694         memcpy(ccb[mbo].cdb, cmd, ccb[mbo].cdblen);
695
696         if (SCpnt->use_sg) {
697                 struct scatterlist *sgpnt;
698                 struct chain *cptr;
699 #ifdef DEBUG
700                 unsigned char *ptr;
701 #endif
702                 int i;
703                 ccb[mbo].op = 2;        /* SCSI Initiator Command  w/scatter-gather */
704                 SCpnt->host_scribble = (unsigned char *) kmalloc(512, GFP_KERNEL | GFP_DMA);
705                 sgpnt = (struct scatterlist *) SCpnt->request_buffer;
706                 cptr = (struct chain *) SCpnt->host_scribble;
707                 if (cptr == NULL) {
708                         /* free the claimed mailbox slot */
709                         HOSTDATA(SCpnt->device->host)->SCint[mbo] = NULL;
710                         return SCSI_MLQUEUE_HOST_BUSY;
711                 }
712                 for (i = 0; i < SCpnt->use_sg; i++) {
713                         if (sgpnt[i].length == 0 || SCpnt->use_sg > 16 ||
714                             (((int) sgpnt[i].offset) & 1) || (sgpnt[i].length & 1)) {
715                                 unsigned char *ptr;
716                                 printk(KERN_CRIT "Bad segment list supplied to aha1542.c (%d, %d)\n", SCpnt->use_sg, i);
717                                 for (i = 0; i < SCpnt->use_sg; i++) {
718                                         printk(KERN_CRIT "%d: %p %d\n", i,
719                                                (page_address(sgpnt[i].page) +
720                                                 sgpnt[i].offset),
721                                                sgpnt[i].length);
722                                 };
723                                 printk(KERN_CRIT "cptr %x: ", (unsigned int) cptr);
724                                 ptr = (unsigned char *) &cptr[i];
725                                 for (i = 0; i < 18; i++)
726                                         printk("%02x ", ptr[i]);
727                                 panic("Foooooooood fight!");
728                         };
729                         any2scsi(cptr[i].dataptr, SCSI_SG_PA(&sgpnt[i]));
730                         if (SCSI_SG_PA(&sgpnt[i]) + sgpnt[i].length - 1 > ISA_DMA_THRESHOLD)
731                                 BAD_SG_DMA(SCpnt, sgpnt, SCpnt->use_sg, i);
732                         any2scsi(cptr[i].datalen, sgpnt[i].length);
733                 };
734                 any2scsi(ccb[mbo].datalen, SCpnt->use_sg * sizeof(struct chain));
735                 any2scsi(ccb[mbo].dataptr, SCSI_BUF_PA(cptr));
736 #ifdef DEBUG
737                 printk("cptr %x: ", cptr);
738                 ptr = (unsigned char *) cptr;
739                 for (i = 0; i < 18; i++)
740                         printk("%02x ", ptr[i]);
741 #endif
742         } else {
743                 ccb[mbo].op = 0;        /* SCSI Initiator Command */
744                 SCpnt->host_scribble = NULL;
745                 any2scsi(ccb[mbo].datalen, bufflen);
746                 if (buff && SCSI_BUF_PA(buff + bufflen - 1) > ISA_DMA_THRESHOLD)
747                         BAD_DMA(buff, bufflen);
748                 any2scsi(ccb[mbo].dataptr, SCSI_BUF_PA(buff));
749         };
750         ccb[mbo].idlun = (target & 7) << 5 | direction | (lun & 7);     /*SCSI Target Id */
751         ccb[mbo].rsalen = 16;
752         ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
753         ccb[mbo].commlinkid = 0;
754
755 #ifdef DEBUG
756         {
757                 int i;
758                 printk(KERN_DEBUG "aha1542_command: sending.. ");
759                 for (i = 0; i < sizeof(ccb[mbo]) - 10; i++)
760                         printk("%02x ", ((unchar *) & ccb[mbo])[i]);
761         };
762 #endif
763
764         if (done) {
765                 DEB(printk("aha1542_queuecommand: now waiting for interrupt ");
766                     aha1542_stat());
767                 SCpnt->scsi_done = done;
768                 mb[mbo].status = 1;
769                 aha1542_out(SCpnt->device->host->io_port, &ahacmd, 1);  /* start scsi command */
770                 DEB(aha1542_stat());
771         } else
772                 printk("aha1542_queuecommand: done can't be NULL\n");
773
774         return 0;
775 }
776
777 /* Initialize mailboxes */
778 static void setup_mailboxes(int bse, struct Scsi_Host *shpnt)
779 {
780         int i;
781         struct mailbox *mb;
782         struct ccb *ccb;
783
784         unchar cmd[5] = { CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0};
785
786         mb = HOSTDATA(shpnt)->mb;
787         ccb = HOSTDATA(shpnt)->ccb;
788
789         for (i = 0; i < AHA1542_MAILBOXES; i++) {
790                 mb[i].status = mb[AHA1542_MAILBOXES + i].status = 0;
791                 any2scsi(mb[i].ccbptr, SCSI_BUF_PA(&ccb[i]));
792         };
793         aha1542_intr_reset(bse);        /* reset interrupts, so they don't block */
794         any2scsi((cmd + 2), SCSI_BUF_PA(mb));
795         aha1542_out(bse, cmd, 5);
796         WAIT(INTRFLAGS(bse), INTRMASK, HACC, 0);
797         while (0) {
798 fail:
799                 printk(KERN_ERR "aha1542_detect: failed setting up mailboxes\n");
800         }
801         aha1542_intr_reset(bse);
802 }
803
804 static int __init aha1542_getconfig(int base_io, unsigned char *irq_level, unsigned char *dma_chan, unsigned char *scsi_id)
805 {
806         unchar inquiry_cmd[] = {CMD_RETCONF};
807         unchar inquiry_result[3];
808         int i;
809         i = inb(STATUS(base_io));
810         if (i & DF) {
811                 i = inb(DATA(base_io));
812         };
813         aha1542_out(base_io, inquiry_cmd, 1);
814         aha1542_in(base_io, inquiry_result, 3);
815         WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
816         while (0) {
817 fail:
818                 printk(KERN_ERR "aha1542_detect: query board settings\n");
819         }
820         aha1542_intr_reset(base_io);
821         switch (inquiry_result[0]) {
822         case 0x80:
823                 *dma_chan = 7;
824                 break;
825         case 0x40:
826                 *dma_chan = 6;
827                 break;
828         case 0x20:
829                 *dma_chan = 5;
830                 break;
831         case 0x01:
832                 *dma_chan = 0;
833                 break;
834         case 0:
835                 /* This means that the adapter, although Adaptec 1542 compatible, doesn't use a DMA channel.
836                    Currently only aware of the BusLogic BT-445S VL-Bus adapter which needs this. */
837                 *dma_chan = 0xFF;
838                 break;
839         default:
840                 printk(KERN_ERR "Unable to determine Adaptec DMA priority.  Disabling board\n");
841                 return -1;
842         };
843         switch (inquiry_result[1]) {
844         case 0x40:
845                 *irq_level = 15;
846                 break;
847         case 0x20:
848                 *irq_level = 14;
849                 break;
850         case 0x8:
851                 *irq_level = 12;
852                 break;
853         case 0x4:
854                 *irq_level = 11;
855                 break;
856         case 0x2:
857                 *irq_level = 10;
858                 break;
859         case 0x1:
860                 *irq_level = 9;
861                 break;
862         default:
863                 printk(KERN_ERR "Unable to determine Adaptec IRQ level.  Disabling board\n");
864                 return -1;
865         };
866         *scsi_id = inquiry_result[2] & 7;
867         return 0;
868 }
869
870 /* This function should only be called for 1542C boards - we can detect
871    the special firmware settings and unlock the board */
872
873 static int __init aha1542_mbenable(int base)
874 {
875         static unchar mbenable_cmd[3];
876         static unchar mbenable_result[2];
877         int retval;
878
879         retval = BIOS_TRANSLATION_6432;
880
881         mbenable_cmd[0] = CMD_EXTBIOS;
882         aha1542_out(base, mbenable_cmd, 1);
883         if (aha1542_in1(base, mbenable_result, 2))
884                 return retval;
885         WAITd(INTRFLAGS(base), INTRMASK, HACC, 0, 100);
886         aha1542_intr_reset(base);
887
888         if ((mbenable_result[0] & 0x08) || mbenable_result[1]) {
889                 mbenable_cmd[0] = CMD_MBENABLE;
890                 mbenable_cmd[1] = 0;
891                 mbenable_cmd[2] = mbenable_result[1];
892
893                 if ((mbenable_result[0] & 0x08) && (mbenable_result[1] & 0x03))
894                         retval = BIOS_TRANSLATION_25563;
895
896                 aha1542_out(base, mbenable_cmd, 3);
897                 WAIT(INTRFLAGS(base), INTRMASK, HACC, 0);
898         };
899         while (0) {
900 fail:
901                 printk(KERN_ERR "aha1542_mbenable: Mailbox init failed\n");
902         }
903         aha1542_intr_reset(base);
904         return retval;
905 }
906
907 /* Query the board to find out if it is a 1542 or a 1740, or whatever. */
908 static int __init aha1542_query(int base_io, int *transl)
909 {
910         unchar inquiry_cmd[] = {CMD_INQUIRY};
911         unchar inquiry_result[4];
912         int i;
913         i = inb(STATUS(base_io));
914         if (i & DF) {
915                 i = inb(DATA(base_io));
916         };
917         aha1542_out(base_io, inquiry_cmd, 1);
918         aha1542_in(base_io, inquiry_result, 4);
919         WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
920         while (0) {
921 fail:
922                 printk(KERN_ERR "aha1542_detect: query card type\n");
923         }
924         aha1542_intr_reset(base_io);
925
926         *transl = BIOS_TRANSLATION_6432;        /* Default case */
927
928         /* For an AHA1740 series board, we ignore the board since there is a
929            hardware bug which can lead to wrong blocks being returned if the board
930            is operating in the 1542 emulation mode.  Since there is an extended mode
931            driver, we simply ignore the board and let the 1740 driver pick it up.
932          */
933
934         if (inquiry_result[0] == 0x43) {
935                 printk(KERN_INFO "aha1542.c: Emulation mode not supported for AHA 174N hardware.\n");
936                 return 1;
937         };
938
939         /* Always call this - boards that do not support extended bios translation
940            will ignore the command, and we will set the proper default */
941
942         *transl = aha1542_mbenable(base_io);
943
944         return 0;
945 }
946
947 #ifndef MODULE
948 static char *setup_str[MAXBOARDS] __initdata;
949 static int setup_idx = 0;
950
951 static void __init aha1542_setup(char *str, int *ints)
952 {
953         const char *ahausage = "aha1542: usage: aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]\n";
954         int setup_portbase;
955
956         if (setup_idx >= MAXBOARDS) {
957                 printk(KERN_ERR "aha1542: aha1542_setup called too many times! Bad LILO params ?\n");
958                 printk(KERN_ERR "   Entryline 1: %s\n", setup_str[0]);
959                 printk(KERN_ERR "   Entryline 2: %s\n", setup_str[1]);
960                 printk(KERN_ERR "   This line:   %s\n", str);
961                 return;
962         }
963         if (ints[0] < 1 || ints[0] > 4) {
964                 printk(KERN_ERR "aha1542: %s\n", str);
965                 printk(ahausage);
966                 printk(KERN_ERR "aha1542: Wrong parameters may cause system malfunction.. We try anyway..\n");
967         }
968         setup_called[setup_idx] = ints[0];
969         setup_str[setup_idx] = str;
970
971         setup_portbase = ints[0] >= 1 ? ints[1] : 0;    /* Preserve the default value.. */
972         setup_buson[setup_idx] = ints[0] >= 2 ? ints[2] : 7;
973         setup_busoff[setup_idx] = ints[0] >= 3 ? ints[3] : 5;
974         if (ints[0] >= 4) 
975         {
976                 int atbt = -1;
977                 switch (ints[4]) {
978                 case 5:
979                         atbt = 0x00;
980                         break;
981                 case 6:
982                         atbt = 0x04;
983                         break;
984                 case 7:
985                         atbt = 0x01;
986                         break;
987                 case 8:
988                         atbt = 0x02;
989                         break;
990                 case 10:
991                         atbt = 0x03;
992                         break;
993                 default:
994                         printk(KERN_ERR "aha1542: %s\n", str);
995                         printk(ahausage);
996                         printk(KERN_ERR "aha1542: Valid values for DMASPEED are 5-8, 10 MB/s.  Using jumper defaults.\n");
997                         break;
998                 }
999                 setup_dmaspeed[setup_idx] = atbt;
1000         }
1001         if (setup_portbase != 0)
1002                 bases[setup_idx] = setup_portbase;
1003
1004         ++setup_idx;
1005 }
1006
1007 static int __init do_setup(char *str)
1008 {
1009         int ints[5];
1010
1011         int count=setup_idx;
1012
1013         get_options(str, ARRAY_SIZE(ints), ints);
1014         aha1542_setup(str,ints);
1015
1016         return count<setup_idx;
1017 }
1018
1019 __setup("aha1542=",do_setup);
1020 #endif
1021
1022 /* return non-zero on detection */
1023 static int __init aha1542_detect(struct scsi_host_template * tpnt)
1024 {
1025         unsigned char dma_chan;
1026         unsigned char irq_level;
1027         unsigned char scsi_id;
1028         unsigned long flags;
1029         unsigned int base_io;
1030         int trans;
1031         struct Scsi_Host *shpnt = NULL;
1032         int count = 0;
1033         int indx;
1034
1035         DEB(printk("aha1542_detect: \n"));
1036
1037         tpnt->proc_name = "aha1542";
1038
1039 #ifdef MODULE
1040         bases[0] = aha1542[0];
1041         setup_buson[0] = aha1542[1];
1042         setup_busoff[0] = aha1542[2];
1043         {
1044                 int atbt = -1;
1045                 switch (aha1542[3]) {
1046                 case 5:
1047                         atbt = 0x00;
1048                         break;
1049                 case 6:
1050                         atbt = 0x04;
1051                         break;
1052                 case 7:
1053                         atbt = 0x01;
1054                         break;
1055                 case 8:
1056                         atbt = 0x02;
1057                         break;
1058                 case 10:
1059                         atbt = 0x03;
1060                         break;
1061                 };
1062                 setup_dmaspeed[0] = atbt;
1063         }
1064 #endif
1065
1066         /*
1067          *      Find MicroChannel cards (AHA1640)
1068          */
1069 #ifdef CONFIG_MCA_LEGACY
1070         if(MCA_bus) {
1071                 int slot = 0;
1072                 int pos = 0;
1073
1074                 for (indx = 0; (slot != MCA_NOTFOUND) && (indx < ARRAY_SIZE(bases)); indx++) {
1075
1076                         if (bases[indx])
1077                                 continue;
1078
1079                         /* Detect only AHA-1640 cards -- MCA ID 0F1F */
1080                         slot = mca_find_unused_adapter(0x0f1f, slot);
1081                         if (slot == MCA_NOTFOUND)
1082                                 break;
1083
1084                         /* Found one */
1085                         pos = mca_read_stored_pos(slot, 3);
1086
1087                         /* Decode address */
1088                         if (pos & 0x80) {
1089                                 if (pos & 0x02) {
1090                                         if (pos & 0x01)
1091                                                 bases[indx] = 0x334;
1092                                         else
1093                                                 bases[indx] = 0x234;
1094                                 } else {
1095                                         if (pos & 0x01)
1096                                                 bases[indx] = 0x134;
1097                                 }
1098                         } else {
1099                                 if (pos & 0x02) {
1100                                         if (pos & 0x01)
1101                                                 bases[indx] = 0x330;
1102                                         else
1103                                                 bases[indx] = 0x230;
1104                                 } else {
1105                                         if (pos & 0x01)
1106                                                 bases[indx] = 0x130;
1107                                 }
1108                         }
1109
1110                         /* No need to decode IRQ and Arb level -- those are
1111                          * read off the card later.
1112                          */
1113                         printk(KERN_INFO "Found an AHA-1640 in MCA slot %d, I/O 0x%04x\n", slot, bases[indx]);
1114
1115                         mca_set_adapter_name(slot, "Adapter AHA-1640");
1116                         mca_set_adapter_procfn(slot, NULL, NULL);
1117                         mca_mark_as_used(slot);
1118
1119                         /* Go on */
1120                         slot++;
1121                 }
1122
1123         }
1124 #endif
1125
1126         /*
1127          *      Hunt for ISA Plug'n'Pray Adaptecs (AHA1535)
1128          */
1129
1130         if(isapnp)
1131         {
1132                 struct pnp_dev *pdev = NULL;
1133                 for(indx = 0; indx < ARRAY_SIZE(bases); indx++) {
1134                         if(bases[indx])
1135                                 continue;
1136                         pdev = pnp_find_dev(NULL, ISAPNP_VENDOR('A', 'D', 'P'), 
1137                                 ISAPNP_FUNCTION(0x1542), pdev);
1138                         if(pdev==NULL)
1139                                 break;
1140                         /*
1141                          *      Activate the PnP card
1142                          */
1143
1144                         if(pnp_device_attach(pdev)<0)
1145                                 continue;
1146
1147                         if(pnp_activate_dev(pdev)<0) {
1148                                 pnp_device_detach(pdev);
1149                                 continue;
1150                         }
1151
1152                         if(!pnp_port_valid(pdev, 0)) {
1153                                 pnp_device_detach(pdev);
1154                                 continue;
1155                         }
1156
1157                         bases[indx] = pnp_port_start(pdev, 0);
1158
1159                         /* The card can be queried for its DMA, we have 
1160                            the DMA set up that is enough */
1161
1162                         printk(KERN_INFO "ISAPnP found an AHA1535 at I/O 0x%03X\n", bases[indx]);
1163                 }
1164         }
1165         for (indx = 0; indx < ARRAY_SIZE(bases); indx++)
1166                 if (bases[indx] != 0 && request_region(bases[indx], 4, "aha1542")) {
1167                         shpnt = scsi_register(tpnt,
1168                                         sizeof(struct aha1542_hostdata));
1169
1170                         if(shpnt==NULL) {
1171                                 release_region(bases[indx], 4);
1172                                 continue;
1173                         }
1174                         /* For now we do this - until kmalloc is more intelligent
1175                            we are resigned to stupid hacks like this */
1176                         if (SCSI_BUF_PA(shpnt) >= ISA_DMA_THRESHOLD) {
1177                                 printk(KERN_ERR "Invalid address for shpnt with 1542.\n");
1178                                 goto unregister;
1179                         }
1180                         if (!aha1542_test_port(bases[indx], shpnt))
1181                                 goto unregister;
1182
1183
1184                         base_io = bases[indx];
1185
1186                         /* Set the Bus on/off-times as not to ruin floppy performance */
1187                         {
1188                                 unchar oncmd[] = {CMD_BUSON_TIME, 7};
1189                                 unchar offcmd[] = {CMD_BUSOFF_TIME, 5};
1190
1191                                 if (setup_called[indx]) {
1192                                         oncmd[1] = setup_buson[indx];
1193                                         offcmd[1] = setup_busoff[indx];
1194                                 }
1195                                 aha1542_intr_reset(base_io);
1196                                 aha1542_out(base_io, oncmd, 2);
1197                                 WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
1198                                 aha1542_intr_reset(base_io);
1199                                 aha1542_out(base_io, offcmd, 2);
1200                                 WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
1201                                 if (setup_dmaspeed[indx] >= 0) {
1202                                         unchar dmacmd[] = {CMD_DMASPEED, 0};
1203                                         dmacmd[1] = setup_dmaspeed[indx];
1204                                         aha1542_intr_reset(base_io);
1205                                         aha1542_out(base_io, dmacmd, 2);
1206                                         WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
1207                                 }
1208                                 while (0) {
1209 fail:
1210                                         printk(KERN_ERR "aha1542_detect: setting bus on/off-time failed\n");
1211                                 }
1212                                 aha1542_intr_reset(base_io);
1213                         }
1214                         if (aha1542_query(base_io, &trans))
1215                                 goto unregister;
1216
1217                         if (aha1542_getconfig(base_io, &irq_level, &dma_chan, &scsi_id) == -1)
1218                                 goto unregister;
1219
1220                         printk(KERN_INFO "Configuring Adaptec (SCSI-ID %d) at IO:%x, IRQ %d", scsi_id, base_io, irq_level);
1221                         if (dma_chan != 0xFF)
1222                                 printk(", DMA priority %d", dma_chan);
1223                         printk("\n");
1224
1225                         DEB(aha1542_stat());
1226                         setup_mailboxes(base_io, shpnt);
1227
1228                         DEB(aha1542_stat());
1229
1230                         DEB(printk("aha1542_detect: enable interrupt channel %d\n", irq_level));
1231                         spin_lock_irqsave(&aha1542_lock, flags);
1232                         if (request_irq(irq_level, do_aha1542_intr_handle, 0, "aha1542", NULL)) {
1233                                 printk(KERN_ERR "Unable to allocate IRQ for adaptec controller.\n");
1234                                 spin_unlock_irqrestore(&aha1542_lock, flags);
1235                                 goto unregister;
1236                         }
1237                         if (dma_chan != 0xFF) {
1238                                 if (request_dma(dma_chan, "aha1542")) {
1239                                         printk(KERN_ERR "Unable to allocate DMA channel for Adaptec.\n");
1240                                         free_irq(irq_level, NULL);
1241                                         spin_unlock_irqrestore(&aha1542_lock, flags);
1242                                         goto unregister;
1243                                 }
1244                                 if (dma_chan == 0 || dma_chan >= 5) {
1245                                         set_dma_mode(dma_chan, DMA_MODE_CASCADE);
1246                                         enable_dma(dma_chan);
1247                                 }
1248                         }
1249                         aha_host[irq_level - 9] = shpnt;
1250                         shpnt->this_id = scsi_id;
1251                         shpnt->unique_id = base_io;
1252                         shpnt->io_port = base_io;
1253                         shpnt->n_io_port = 4;   /* Number of bytes of I/O space used */
1254                         shpnt->dma_channel = dma_chan;
1255                         shpnt->irq = irq_level;
1256                         HOSTDATA(shpnt)->bios_translation = trans;
1257                         if (trans == BIOS_TRANSLATION_25563)
1258                                 printk(KERN_INFO "aha1542.c: Using extended bios translation\n");
1259                         HOSTDATA(shpnt)->aha1542_last_mbi_used = (2 * AHA1542_MAILBOXES - 1);
1260                         HOSTDATA(shpnt)->aha1542_last_mbo_used = (AHA1542_MAILBOXES - 1);
1261                         memset(HOSTDATA(shpnt)->SCint, 0, sizeof(HOSTDATA(shpnt)->SCint));
1262                         spin_unlock_irqrestore(&aha1542_lock, flags);
1263 #if 0
1264                         DEB(printk(" *** READ CAPACITY ***\n"));
1265
1266                         {
1267                                 unchar buf[8];
1268                                 static unchar cmd[] = { READ_CAPACITY, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1269                                 int i;
1270
1271                                 for (i = 0; i < sizeof(buf); ++i)
1272                                         buf[i] = 0x87;
1273                                 for (i = 0; i < 2; ++i)
1274                                         if (!aha1542_command(i, cmd, buf, sizeof(buf))) {
1275                                                 printk(KERN_DEBUG "aha_detect: LU %d sector_size %d device_size %d\n",
1276                                                        i, xscsi2int(buf + 4), xscsi2int(buf));
1277                                         }
1278                         }
1279
1280                         DEB(printk(" *** NOW RUNNING MY OWN TEST *** \n"));
1281
1282                         for (i = 0; i < 4; ++i) {
1283                                 unsigned char cmd[10];
1284                                 static buffer[512];
1285
1286                                 cmd[0] = READ_10;
1287                                 cmd[1] = 0;
1288                                 xany2scsi(cmd + 2, i);
1289                                 cmd[6] = 0;
1290                                 cmd[7] = 0;
1291                                 cmd[8] = 1;
1292                                 cmd[9] = 0;
1293                                 aha1542_command(0, cmd, buffer, 512);
1294                         }
1295 #endif
1296                         count++;
1297                         continue;
1298 unregister:
1299                         release_region(bases[indx], 4);
1300                         scsi_unregister(shpnt);
1301                         continue;
1302
1303                 };
1304
1305         return count;
1306 }
1307
1308 static int aha1542_release(struct Scsi_Host *shost)
1309 {
1310         if (shost->irq)
1311                 free_irq(shost->irq, NULL);
1312         if (shost->dma_channel != 0xff)
1313                 free_dma(shost->dma_channel);
1314         if (shost->io_port && shost->n_io_port)
1315                 release_region(shost->io_port, shost->n_io_port);
1316         scsi_unregister(shost);
1317         return 0;
1318 }
1319
1320 static int aha1542_restart(struct Scsi_Host *shost)
1321 {
1322         int i;
1323         int count = 0;
1324 #if 0
1325         unchar ahacmd = CMD_START_SCSI;
1326 #endif
1327
1328         for (i = 0; i < AHA1542_MAILBOXES; i++)
1329                 if (HOSTDATA(shost)->SCint[i] &&
1330                     !(HOSTDATA(shost)->SCint[i]->device->soft_reset)) {
1331 #if 0
1332                         HOSTDATA(shost)->mb[i].status = 1;      /* Indicate ready to restart... */
1333 #endif
1334                         count++;
1335                 }
1336         printk(KERN_DEBUG "Potential to restart %d stalled commands...\n", count);
1337 #if 0
1338         /* start scsi command */
1339         if (count)
1340                 aha1542_out(shost->io_port, &ahacmd, 1);
1341 #endif
1342         return 0;
1343 }
1344
1345 /*
1346  * This is a device reset.  This is handled by sending a special command
1347  * to the device.
1348  */
1349 static int aha1542_dev_reset(Scsi_Cmnd * SCpnt)
1350 {
1351         unsigned long flags;
1352         struct mailbox *mb;
1353         unchar target = SCpnt->device->id;
1354         unchar lun = SCpnt->device->lun;
1355         int mbo;
1356         struct ccb *ccb;
1357         unchar ahacmd = CMD_START_SCSI;
1358
1359         ccb = HOSTDATA(SCpnt->device->host)->ccb;
1360         mb = HOSTDATA(SCpnt->device->host)->mb;
1361
1362         spin_lock_irqsave(&aha1542_lock, flags);
1363         mbo = HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used + 1;
1364         if (mbo >= AHA1542_MAILBOXES)
1365                 mbo = 0;
1366
1367         do {
1368                 if (mb[mbo].status == 0 && HOSTDATA(SCpnt->device->host)->SCint[mbo] == NULL)
1369                         break;
1370                 mbo++;
1371                 if (mbo >= AHA1542_MAILBOXES)
1372                         mbo = 0;
1373         } while (mbo != HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used);
1374
1375         if (mb[mbo].status || HOSTDATA(SCpnt->device->host)->SCint[mbo])
1376                 panic("Unable to find empty mailbox for aha1542.\n");
1377
1378         HOSTDATA(SCpnt->device->host)->SCint[mbo] = SCpnt;      /* This will effectively
1379                                                            prevent someone else from
1380                                                            screwing with this cdb. */
1381
1382         HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used = mbo;
1383         spin_unlock_irqrestore(&aha1542_lock, flags);
1384
1385         any2scsi(mb[mbo].ccbptr, SCSI_BUF_PA(&ccb[mbo]));       /* This gets trashed for some reason */
1386
1387         memset(&ccb[mbo], 0, sizeof(struct ccb));
1388
1389         ccb[mbo].op = 0x81;     /* BUS DEVICE RESET */
1390
1391         ccb[mbo].idlun = (target & 7) << 5 | (lun & 7);         /*SCSI Target Id */
1392
1393         ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
1394         ccb[mbo].commlinkid = 0;
1395
1396         /* 
1397          * Now tell the 1542 to flush all pending commands for this 
1398          * target 
1399          */
1400         aha1542_out(SCpnt->device->host->io_port, &ahacmd, 1);
1401
1402         scmd_printk(KERN_WARNING, SCpnt,
1403                 "Trying device reset for target\n");
1404
1405         return SUCCESS;
1406
1407
1408 #ifdef ERIC_neverdef
1409         /* 
1410          * With the 1542 we apparently never get an interrupt to
1411          * acknowledge a device reset being sent.  Then again, Leonard
1412          * says we are doing this wrong in the first place...
1413          *
1414          * Take a wait and see attitude.  If we get spurious interrupts,
1415          * then the device reset is doing something sane and useful, and
1416          * we will wait for the interrupt to post completion.
1417          */
1418         printk(KERN_WARNING "Sent BUS DEVICE RESET to target %d\n", SCpnt->target);
1419
1420         /*
1421          * Free the command block for all commands running on this 
1422          * target... 
1423          */
1424         for (i = 0; i < AHA1542_MAILBOXES; i++) {
1425                 if (HOSTDATA(SCpnt->host)->SCint[i] &&
1426                     HOSTDATA(SCpnt->host)->SCint[i]->target == SCpnt->target) {
1427                         Scsi_Cmnd *SCtmp;
1428                         SCtmp = HOSTDATA(SCpnt->host)->SCint[i];
1429                         kfree(SCtmp->host_scribble);
1430                         SCtmp->host_scribble = NULL;
1431                         HOSTDATA(SCpnt->host)->SCint[i] = NULL;
1432                         HOSTDATA(SCpnt->host)->mb[i].status = 0;
1433                 }
1434         }
1435         return SUCCESS;
1436
1437         return FAILED;
1438 #endif                          /* ERIC_neverdef */
1439 }
1440
1441 static int aha1542_bus_reset(Scsi_Cmnd * SCpnt)
1442 {
1443         int i;
1444
1445         /* 
1446          * This does a scsi reset for all devices on the bus.
1447          * In principle, we could also reset the 1542 - should
1448          * we do this?  Try this first, and we can add that later
1449          * if it turns out to be useful.
1450          */
1451         outb(SCRST, CONTROL(SCpnt->device->host->io_port));
1452
1453         /*
1454          * Wait for the thing to settle down a bit.  Unfortunately
1455          * this is going to basically lock up the machine while we
1456          * wait for this to complete.  To be 100% correct, we need to
1457          * check for timeout, and if we are doing something like this
1458          * we are pretty desperate anyways.
1459          */
1460         ssleep(4);
1461
1462         spin_lock_irq(SCpnt->device->host->host_lock);
1463
1464         WAIT(STATUS(SCpnt->device->host->io_port),
1465              STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
1466
1467         /*
1468          * Now try to pick up the pieces.  For all pending commands,
1469          * free any internal data structures, and basically clear things
1470          * out.  We do not try and restart any commands or anything - 
1471          * the strategy handler takes care of that crap.
1472          */
1473         printk(KERN_WARNING "Sent BUS RESET to scsi host %d\n", SCpnt->device->host->host_no);
1474
1475         for (i = 0; i < AHA1542_MAILBOXES; i++) {
1476                 if (HOSTDATA(SCpnt->device->host)->SCint[i] != NULL) {
1477                         Scsi_Cmnd *SCtmp;
1478                         SCtmp = HOSTDATA(SCpnt->device->host)->SCint[i];
1479
1480
1481                         if (SCtmp->device->soft_reset) {
1482                                 /*
1483                                  * If this device implements the soft reset option,
1484                                  * then it is still holding onto the command, and
1485                                  * may yet complete it.  In this case, we don't
1486                                  * flush the data.
1487                                  */
1488                                 continue;
1489                         }
1490                         kfree(SCtmp->host_scribble);
1491                         SCtmp->host_scribble = NULL;
1492                         HOSTDATA(SCpnt->device->host)->SCint[i] = NULL;
1493                         HOSTDATA(SCpnt->device->host)->mb[i].status = 0;
1494                 }
1495         }
1496
1497         spin_unlock_irq(SCpnt->device->host->host_lock);
1498         return SUCCESS;
1499
1500 fail:
1501         spin_unlock_irq(SCpnt->device->host->host_lock);
1502         return FAILED;
1503 }
1504
1505 static int aha1542_host_reset(Scsi_Cmnd * SCpnt)
1506 {
1507         int i;
1508
1509         /* 
1510          * This does a scsi reset for all devices on the bus.
1511          * In principle, we could also reset the 1542 - should
1512          * we do this?  Try this first, and we can add that later
1513          * if it turns out to be useful.
1514          */
1515         outb(HRST | SCRST, CONTROL(SCpnt->device->host->io_port));
1516
1517         /*
1518          * Wait for the thing to settle down a bit.  Unfortunately
1519          * this is going to basically lock up the machine while we
1520          * wait for this to complete.  To be 100% correct, we need to
1521          * check for timeout, and if we are doing something like this
1522          * we are pretty desperate anyways.
1523          */
1524         ssleep(4);
1525         spin_lock_irq(SCpnt->device->host->host_lock);
1526
1527         WAIT(STATUS(SCpnt->device->host->io_port),
1528              STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
1529
1530         /*
1531          * We need to do this too before the 1542 can interact with
1532          * us again.
1533          */
1534         setup_mailboxes(SCpnt->device->host->io_port, SCpnt->device->host);
1535
1536         /*
1537          * Now try to pick up the pieces.  For all pending commands,
1538          * free any internal data structures, and basically clear things
1539          * out.  We do not try and restart any commands or anything - 
1540          * the strategy handler takes care of that crap.
1541          */
1542         printk(KERN_WARNING "Sent BUS RESET to scsi host %d\n", SCpnt->device->host->host_no);
1543
1544         for (i = 0; i < AHA1542_MAILBOXES; i++) {
1545                 if (HOSTDATA(SCpnt->device->host)->SCint[i] != NULL) {
1546                         Scsi_Cmnd *SCtmp;
1547                         SCtmp = HOSTDATA(SCpnt->device->host)->SCint[i];
1548
1549                         if (SCtmp->device->soft_reset) {
1550                                 /*
1551                                  * If this device implements the soft reset option,
1552                                  * then it is still holding onto the command, and
1553                                  * may yet complete it.  In this case, we don't
1554                                  * flush the data.
1555                                  */
1556                                 continue;
1557                         }
1558                         kfree(SCtmp->host_scribble);
1559                         SCtmp->host_scribble = NULL;
1560                         HOSTDATA(SCpnt->device->host)->SCint[i] = NULL;
1561                         HOSTDATA(SCpnt->device->host)->mb[i].status = 0;
1562                 }
1563         }
1564
1565         spin_unlock_irq(SCpnt->device->host->host_lock);
1566         return SUCCESS;
1567
1568 fail:
1569         spin_unlock_irq(SCpnt->device->host->host_lock);
1570         return FAILED;
1571 }
1572
1573 #if 0
1574 /*
1575  * These are the old error handling routines.  They are only temporarily
1576  * here while we play with the new error handling code.
1577  */
1578 static int aha1542_old_abort(Scsi_Cmnd * SCpnt)
1579 {
1580 #if 0
1581         unchar ahacmd = CMD_START_SCSI;
1582         unsigned long flags;
1583         struct mailbox *mb;
1584         int mbi, mbo, i;
1585
1586         printk(KERN_DEBUG "In aha1542_abort: %x %x\n",
1587                inb(STATUS(SCpnt->host->io_port)),
1588                inb(INTRFLAGS(SCpnt->host->io_port)));
1589
1590         spin_lock_irqsave(&aha1542_lock, flags);
1591         mb = HOSTDATA(SCpnt->host)->mb;
1592         mbi = HOSTDATA(SCpnt->host)->aha1542_last_mbi_used + 1;
1593         if (mbi >= 2 * AHA1542_MAILBOXES)
1594                 mbi = AHA1542_MAILBOXES;
1595
1596         do {
1597                 if (mb[mbi].status != 0)
1598                         break;
1599                 mbi++;
1600                 if (mbi >= 2 * AHA1542_MAILBOXES)
1601                         mbi = AHA1542_MAILBOXES;
1602         } while (mbi != HOSTDATA(SCpnt->host)->aha1542_last_mbi_used);
1603         spin_unlock_irqrestore(&aha1542_lock, flags);
1604
1605         if (mb[mbi].status) {
1606                 printk(KERN_ERR "Lost interrupt discovered on irq %d - attempting to recover\n",
1607                        SCpnt->host->irq);
1608                 aha1542_intr_handle(SCpnt->host, NULL);
1609                 return 0;
1610         }
1611         /* OK, no lost interrupt.  Try looking to see how many pending commands
1612            we think we have. */
1613
1614         for (i = 0; i < AHA1542_MAILBOXES; i++)
1615                 if (HOSTDATA(SCpnt->host)->SCint[i]) {
1616                         if (HOSTDATA(SCpnt->host)->SCint[i] == SCpnt) {
1617                                 printk(KERN_ERR "Timed out command pending for %s\n",
1618                                        SCpnt->request->rq_disk ?
1619                                        SCpnt->request->rq_disk->disk_name : "?"
1620                                        );
1621                                 if (HOSTDATA(SCpnt->host)->mb[i].status) {
1622                                         printk(KERN_ERR "OGMB still full - restarting\n");
1623                                         aha1542_out(SCpnt->host->io_port, &ahacmd, 1);
1624                                 };
1625                         } else
1626                                 printk(KERN_ERR "Other pending command %s\n",
1627                                        SCpnt->request->rq_disk ?
1628                                        SCpnt->request->rq_disk->disk_name : "?"
1629                                        );
1630                 }
1631 #endif
1632
1633         DEB(printk("aha1542_abort\n"));
1634 #if 0
1635         spin_lock_irqsave(&aha1542_lock, flags);
1636         for (mbo = 0; mbo < AHA1542_MAILBOXES; mbo++) {
1637                 if (SCpnt == HOSTDATA(SCpnt->host)->SCint[mbo]) {
1638                         mb[mbo].status = 2;     /* Abort command */
1639                         aha1542_out(SCpnt->host->io_port, &ahacmd, 1);  /* start scsi command */
1640                         spin_unlock_irqrestore(&aha1542_lock, flags);
1641                         break;
1642                 }
1643         }
1644         if (AHA1542_MAILBOXES == mbo)
1645                 spin_unlock_irqrestore(&aha1542_lock, flags);
1646 #endif
1647         return SCSI_ABORT_SNOOZE;
1648 }
1649
1650 /* We do not implement a reset function here, but the upper level code
1651    assumes that it will get some kind of response for the command in
1652    SCpnt.  We must oblige, or the command will hang the scsi system.
1653    For a first go, we assume that the 1542 notifies us with all of the
1654    pending commands (it does implement soft reset, after all). */
1655
1656 static int aha1542_old_reset(Scsi_Cmnd * SCpnt, unsigned int reset_flags)
1657 {
1658         unchar ahacmd = CMD_START_SCSI;
1659         int i;
1660
1661         /*
1662          * See if a bus reset was suggested.
1663          */
1664         if (reset_flags & SCSI_RESET_SUGGEST_BUS_RESET) {
1665                 /* 
1666                  * This does a scsi reset for all devices on the bus.
1667                  * In principle, we could also reset the 1542 - should
1668                  * we do this?  Try this first, and we can add that later
1669                  * if it turns out to be useful.
1670                  */
1671                 outb(HRST | SCRST, CONTROL(SCpnt->host->io_port));
1672
1673                 /*
1674                  * Wait for the thing to settle down a bit.  Unfortunately
1675                  * this is going to basically lock up the machine while we
1676                  * wait for this to complete.  To be 100% correct, we need to
1677                  * check for timeout, and if we are doing something like this
1678                  * we are pretty desperate anyways.
1679                  */
1680                 WAIT(STATUS(SCpnt->host->io_port),
1681                 STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
1682
1683                 /*
1684                  * We need to do this too before the 1542 can interact with
1685                  * us again.
1686                  */
1687                 setup_mailboxes(SCpnt->host->io_port, SCpnt->host);
1688
1689                 /*
1690                  * Now try to pick up the pieces.  Restart all commands
1691                  * that are currently active on the bus, and reset all of
1692                  * the datastructures.  We have some time to kill while
1693                  * things settle down, so print a nice message.
1694                  */
1695                 printk(KERN_WARNING "Sent BUS RESET to scsi host %d\n", SCpnt->host->host_no);
1696
1697                 for (i = 0; i < AHA1542_MAILBOXES; i++)
1698                         if (HOSTDATA(SCpnt->host)->SCint[i] != NULL) {
1699                                 Scsi_Cmnd *SCtmp;
1700                                 SCtmp = HOSTDATA(SCpnt->host)->SCint[i];
1701                                 SCtmp->result = DID_RESET << 16;
1702                                 kfree(SCtmp->host_scribble);
1703                                 SCtmp->host_scribble = NULL;
1704                                 printk(KERN_WARNING "Sending DID_RESET for target %d\n", SCpnt->target);
1705                                 SCtmp->scsi_done(SCpnt);
1706
1707                                 HOSTDATA(SCpnt->host)->SCint[i] = NULL;
1708                                 HOSTDATA(SCpnt->host)->mb[i].status = 0;
1709                         }
1710                 /*
1711                  * Now tell the mid-level code what we did here.  Since
1712                  * we have restarted all of the outstanding commands,
1713                  * then report SUCCESS.
1714                  */
1715                 return (SCSI_RESET_SUCCESS | SCSI_RESET_BUS_RESET);
1716 fail:
1717                 printk(KERN_CRIT "aha1542.c: Unable to perform hard reset.\n");
1718                 printk(KERN_CRIT "Power cycle machine to reset\n");
1719                 return (SCSI_RESET_ERROR | SCSI_RESET_BUS_RESET);
1720
1721
1722         } else {
1723                 /* This does a selective reset of just the one device */
1724                 /* First locate the ccb for this command */
1725                 for (i = 0; i < AHA1542_MAILBOXES; i++)
1726                         if (HOSTDATA(SCpnt->host)->SCint[i] == SCpnt) {
1727                                 HOSTDATA(SCpnt->host)->ccb[i].op = 0x81;        /* BUS DEVICE RESET */
1728                                 /* Now tell the 1542 to flush all pending commands for this target */
1729                                 aha1542_out(SCpnt->host->io_port, &ahacmd, 1);
1730
1731                                 /* Here is the tricky part.  What to do next.  Do we get an interrupt
1732                                    for the commands that we aborted with the specified target, or
1733                                    do we generate this on our own?  Try it without first and see
1734                                    what happens */
1735                                 printk(KERN_WARNING "Sent BUS DEVICE RESET to target %d\n", SCpnt->target);
1736
1737                                 /* If the first does not work, then try the second.  I think the
1738                                    first option is more likely to be correct. Free the command
1739                                    block for all commands running on this target... */
1740                                 for (i = 0; i < AHA1542_MAILBOXES; i++)
1741                                         if (HOSTDATA(SCpnt->host)->SCint[i] &&
1742                                             HOSTDATA(SCpnt->host)->SCint[i]->target == SCpnt->target) {
1743                                                 Scsi_Cmnd *SCtmp;
1744                                                 SCtmp = HOSTDATA(SCpnt->host)->SCint[i];
1745                                                 SCtmp->result = DID_RESET << 16;
1746                                                 kfree(SCtmp->host_scribble);
1747                                                 SCtmp->host_scribble = NULL;
1748                                                 printk(KERN_WARNING "Sending DID_RESET for target %d\n", SCpnt->target);
1749                                                 SCtmp->scsi_done(SCpnt);
1750
1751                                                 HOSTDATA(SCpnt->host)->SCint[i] = NULL;
1752                                                 HOSTDATA(SCpnt->host)->mb[i].status = 0;
1753                                         }
1754                                 return SCSI_RESET_SUCCESS;
1755                         }
1756         }
1757         /* No active command at this time, so this means that each time we got
1758            some kind of response the last time through.  Tell the mid-level code
1759            to request sense information in order to decide what to do next. */
1760         return SCSI_RESET_PUNT;
1761 }
1762 #endif    /* end of big comment block around old_abort + old_reset */
1763
1764 static int aha1542_biosparam(struct scsi_device *sdev,
1765                 struct block_device *bdev, sector_t capacity, int *ip)
1766 {
1767         int translation_algorithm;
1768         int size = capacity;
1769
1770         translation_algorithm = HOSTDATA(sdev->host)->bios_translation;
1771
1772         if ((size >> 11) > 1024 && translation_algorithm == BIOS_TRANSLATION_25563) {
1773                 /* Please verify that this is the same as what DOS returns */
1774                 ip[0] = 255;
1775                 ip[1] = 63;
1776                 ip[2] = size / 255 / 63;
1777         } else {
1778                 ip[0] = 64;
1779                 ip[1] = 32;
1780                 ip[2] = size >> 11;
1781         }
1782
1783         return 0;
1784 }
1785 MODULE_LICENSE("GPL");
1786
1787
1788 static struct scsi_host_template driver_template = {
1789         .proc_name              = "aha1542",
1790         .name                   = "Adaptec 1542",
1791         .detect                 = aha1542_detect,
1792         .release                = aha1542_release,
1793         .queuecommand           = aha1542_queuecommand,
1794         .eh_device_reset_handler= aha1542_dev_reset,
1795         .eh_bus_reset_handler   = aha1542_bus_reset,
1796         .eh_host_reset_handler  = aha1542_host_reset,
1797         .bios_param             = aha1542_biosparam,
1798         .can_queue              = AHA1542_MAILBOXES, 
1799         .this_id                = 7,
1800         .sg_tablesize           = AHA1542_SCATTER,
1801         .cmd_per_lun            = AHA1542_CMDLUN,
1802         .unchecked_isa_dma      = 1, 
1803         .use_clustering         = ENABLE_CLUSTERING,
1804 };
1805 #include "scsi_module.c"