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