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