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