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
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
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
24 * Modified by Adam Fritzler
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>
42 #include <linux/slab.h>
48 #include <scsi/scsi_host.h>
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)
54 #include<linux/stat.h>
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 $";
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! */
71 #define MAXBOARDS 4 /* Increase this and the sizes of the
72 arrays below, if you need more.. */
74 /* Boards 3,4 slots are reserved for ISAPnP/MCA scans */
76 static unsigned int bases[MAXBOARDS] __initdata = {0x330, 0x334, 0, 0};
78 /* set by aha1542_setup according to the command line; they also may
79 be marked __initdata, but require zero initializers then */
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 };
87 * LILO/Module params: aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]
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.
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);
109 static struct isapnp_device_id id_table[] __initdata = {
111 ISAPNP_ANY_ID, ISAPNP_ANY_ID,
112 ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1542),
118 MODULE_DEVICE_TABLE(isapnp, id_table);
121 static int isapnp = 1;
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 */
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];
138 #define HOSTDATA(host) ((struct aha1542_hostdata *) &host->hostdata)
140 static DEFINE_SPINLOCK(aha1542_lock);
144 #define WAITnexttimeout 3000000
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);
150 #define aha1542_intr_reset(base) outb(IRST, CONTROL(base))
152 #define WAIT(port, mask, allof, noneof) \
153 { register int WAITbits; \
154 register int WAITtimeout = WAITnexttimeout; \
156 WAITbits = inb(port) & (mask); \
157 if ((WAITbits & (allof)) == (allof) && ((WAITbits & (noneof)) == 0)) \
159 if (--WAITtimeout == 0) goto fail; \
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; \
169 WAITbits = inb(port) & (mask); \
170 if ((WAITbits & (allof)) == (allof) && ((WAITbits & (noneof)) == 0)) \
173 if (--WAITtimeout == 0) goto fail; \
177 static void aha1542_stat(void)
179 /* int s = inb(STATUS), i = inb(INTRFLAGS);
180 printk("status=%x intrflags=%x\n", s, i, WAITnexttimeout-WAITtimeout); */
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
187 static int aha1542_out(unsigned int base, unchar * cmdp, int len)
189 unsigned long flags = 0;
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);
201 outb(*cmdp, DATA(base));
202 spin_unlock_irqrestore(&aha1542_lock, flags);
206 spin_lock_irqsave(&aha1542_lock, flags);
209 WAIT(STATUS(base), CDF, 0, CDF);
210 outb(*cmdp++, DATA(base));
212 spin_unlock_irqrestore(&aha1542_lock, flags);
217 spin_unlock_irqrestore(&aha1542_lock, flags);
218 printk(KERN_ERR "aha1542_out failed(%d): ", len + 1);
223 /* Only used at boot time, so we do not need to worry about latency as much
226 static int __init aha1542_in(unsigned int base, unchar * cmdp, int len)
230 spin_lock_irqsave(&aha1542_lock, flags);
232 WAIT(STATUS(base), DF, DF, 0);
233 *cmdp++ = inb(DATA(base));
235 spin_unlock_irqrestore(&aha1542_lock, flags);
238 spin_unlock_irqrestore(&aha1542_lock, flags);
239 printk(KERN_ERR "aha1542_in failed(%d): ", len + 1);
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)
251 spin_lock_irqsave(&aha1542_lock, flags);
253 WAITd(STATUS(base), DF, DF, 0, 100);
254 *cmdp++ = inb(DATA(base));
256 spin_unlock_irqrestore(&aha1542_lock, flags);
259 spin_unlock_irqrestore(&aha1542_lock, flags);
263 static int makecode(unsigned hosterr, unsigned scsierr)
267 case 0xa: /* Linked command complete without error and linked normally */
268 case 0xb: /* Linked command complete without error, interrupt generated */
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;
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. */
281 case 0x13: /* Unexpected bus free-The target dropped the SCSI BSY at an unexpected time. */
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. */
286 case 0x16: /* Invalid CCB Operation Code-The first byte of the CCB was invalid.
287 This usually indicates a software failure. */
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
292 case 0x18: /* Invalid Target Direction received from Host-The direction of a
293 Target Mode CCB was invalid. */
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. */
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 */
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
313 printk(KERN_ERR "aha1542: makecode: unknown hoststatus %x\n", hosterr);
316 return scsierr | (hosterr << 16);
319 static int __init aha1542_test_port(int bse, struct Scsi_Host *shpnt)
321 unchar inquiry_cmd[] = {CMD_INQUIRY};
322 unchar inquiry_result[4];
325 volatile int debug = 0;
327 /* Quick and dirty test for presence of the card. */
328 if (inb(STATUS(bse)) == 0xff)
331 /* Reset the adapter. I ought to make a hard reset, but it's not really necessary */
333 /* DEB(printk("aha1542_test_port called \n")); */
335 /* In case some other card was probing here, reset interrupts */
336 aha1542_intr_reset(bse); /* reset interrupts, so they don't block */
338 outb(SRST | IRST /*|SCRST */ , CONTROL(bse));
340 mdelay(20); /* Wait a little bit for things to settle down. */
343 /* Expect INIT and IDLE, any of the others are bad */
344 WAIT(STATUS(bse), STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
347 /* Shouldn't have generated any interrupts during reset */
348 if (inb(INTRFLAGS(bse)) & INTRMASK)
352 /* Perform a host adapter inquiry instead so we do not need to set
353 up the mailboxes ahead of time */
355 aha1542_out(bse, inquiry_cmd, 1);
359 cmdp = &inquiry_result[0];
362 WAIT(STATUS(bse), DF, DF, 0);
363 *cmdp++ = inb(DATA(bse));
367 /* Reading port should reset DF */
368 if (inb(STATUS(bse)) & DF)
372 /* When HACC, command is completed, and we're though testing */
373 WAIT(INTRFLAGS(bse), HACC, HACC, 0);
374 /* now initialize adapter */
377 /* Clear interrupts */
378 outb(IRST, CONTROL(bse));
382 return debug; /* 1 = ok */
384 return 0; /* 0 = not ok */
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)
391 struct Scsi_Host *shost = dev_id;
393 spin_lock_irqsave(shost->host_lock, flags);
394 aha1542_intr_handle(shost);
395 spin_unlock_irqrestore(shost->host_lock, flags);
399 /* A "high" level interrupt handler */
400 static void aha1542_intr_handle(struct Scsi_Host *shost)
402 void (*my_done) (Scsi_Cmnd *) = NULL;
403 int errstatus, mbi, mbo, mbistatus;
412 mb = HOSTDATA(shost)->mb;
413 ccb = HOSTDATA(shost)->ccb;
417 flag = inb(INTRFLAGS(shost->io_port));
418 printk(KERN_DEBUG "aha1542_intr_handle: ");
419 if (!(flag & ANYINTR))
420 printk("no interrupt?");
429 printk("status %02x\n", inb(STATUS(shost->io_port)));
436 flag = inb(INTRFLAGS(shost->io_port));
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. */
452 aha1542_intr_reset(shost->io_port);
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;
460 if (mb[mbi].status != 0)
463 if (mbi >= 2 * AHA1542_MAILBOXES)
464 mbi = AHA1542_MAILBOXES;
465 } while (mbi != HOSTDATA(shost)->aha1542_last_mbi_used);
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 */
475 aha1542_restart(shost);
479 mbo = (scsi2int(mb[mbi].ccbptr) - (SCSI_BUF_PA(&ccb[0]))) / sizeof(struct ccb);
480 mbistatus = mb[mbi].status;
482 HOSTDATA(shost)->aha1542_last_mbi_used = mbi;
483 spin_unlock_irqrestore(&aha1542_lock, flags);
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);
494 continue; /* Aborted command not found */
497 printk(KERN_DEBUG "...done %d %d\n", mbo, mbi);
500 SCtmp = HOSTDATA(shost)->SCint[mbo];
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);
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);
519 /* is there mail :-) */
521 /* more error checking left out here */
523 /* This is surely wrong, but I don't know what's right */
524 errstatus = makecode(ccb[mbo].hastat, ccb[mbo].tarstat);
530 printk(KERN_DEBUG "(aha1542 error:%x %x %x) ", errstatus,
531 ccb[mbo].hastat, ccb[mbo].tarstat);
534 if (ccb[mbo].tarstat == 2) {
538 DEB(printk("aha1542_intr_handle: sense:"));
540 for (i = 0; i < 12; i++)
541 printk("%02x ", ccb[mbo].cdb[ccb[mbo].cdblen + i]);
545 DEB(printk("aha1542_intr_handle: buf:"));
546 for (i = 0; i < bufflen; i++)
547 printk("%02x ", ((unchar *)buff)[i]);
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 */
560 static int aha1542_queuecommand_lck(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *))
562 unchar ahacmd = CMD_START_SCSI;
564 unchar *cmd = (unchar *) SCpnt->cmnd;
565 unchar target = SCpnt->device->id;
566 unchar lun = SCpnt->device->lun;
568 int bufflen = scsi_bufflen(SCpnt);
575 mb = HOSTDATA(SCpnt->device->host)->mb;
576 ccb = HOSTDATA(SCpnt->device->host)->ccb;
578 DEB(if (target > 1) {
579 SCpnt->result = DID_TIME_OUT << 16;
580 done(SCpnt); return 0;
584 if (*cmd == REQUEST_SENSE) {
585 /* Don't do the command - we have the sense data already */
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);
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);
605 printk(KERN_DEBUG "aha1542_queuecommand: dev %d cmd %02x pos %d len %d ", target, *cmd, i, bufflen);
607 printk(KERN_DEBUG "aha1542_command: dev %d cmd %02x pos %d len %d ", target, *cmd, i, bufflen);
609 printk(KERN_DEBUG "aha1542_queuecommand: dumping scsi cmd:");
610 for (i = 0; i < SCpnt->cmd_len; i++)
611 printk("%02x ", cmd[i]);
613 if (*cmd == WRITE_10 || *cmd == WRITE_6)
614 return 0; /* we are still testing, so *don't* write */
616 /* Use the outgoing mailboxes in a round-robin fashion, because this
617 is how the host adapter will scan for them */
619 spin_lock_irqsave(&aha1542_lock, flags);
620 mbo = HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used + 1;
621 if (mbo >= AHA1542_MAILBOXES)
625 if (mb[mbo].status == 0 && HOSTDATA(SCpnt->device->host)->SCint[mbo] == NULL)
628 if (mbo >= AHA1542_MAILBOXES)
630 } while (mbo != HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used);
632 if (mb[mbo].status || HOSTDATA(SCpnt->device->host)->SCint[mbo])
633 panic("Unable to find empty mailbox for aha1542.\n");
635 HOSTDATA(SCpnt->device->host)->SCint[mbo] = SCpnt; /* This will effectively prevent someone else from
636 screwing with this cdb. */
638 HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used = mbo;
639 spin_unlock_irqrestore(&aha1542_lock, flags);
642 printk(KERN_DEBUG "Sending command (%d %x)...", mbo, done);
645 any2scsi(mb[mbo].ccbptr, SCSI_BUF_PA(&ccb[mbo])); /* This gets trashed for some reason */
647 memset(&ccb[mbo], 0, sizeof(struct ccb));
649 ccb[mbo].cdblen = SCpnt->cmd_len;
652 if (*cmd == READ_10 || *cmd == READ_6)
654 else if (*cmd == WRITE_10 || *cmd == WRITE_6)
657 memcpy(ccb[mbo].cdb, cmd, ccb[mbo].cdblen);
660 struct scatterlist *sg;
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;
671 /* free the claimed mailbox slot */
672 HOSTDATA(SCpnt->device->host)->SCint[mbo] = NULL;
673 return SCSI_MLQUEUE_HOST_BUSY;
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);
679 any2scsi(ccb[mbo].datalen, sg_count * sizeof(struct chain));
680 any2scsi(ccb[mbo].dataptr, SCSI_BUF_PA(cptr));
682 printk("cptr %x: ", cptr);
683 ptr = (unsigned char *) cptr;
684 for (i = 0; i < 18; i++)
685 printk("%02x ", ptr[i]);
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);
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;
701 printk(KERN_DEBUG "aha1542_command: sending.. ");
702 for (i = 0; i < sizeof(ccb[mbo]) - 10; i++)
703 printk("%02x ", ((unchar *) & ccb[mbo])[i]);
708 DEB(printk("aha1542_queuecommand: now waiting for interrupt ");
710 SCpnt->scsi_done = done;
712 aha1542_out(SCpnt->device->host->io_port, &ahacmd, 1); /* start scsi command */
715 printk("aha1542_queuecommand: done can't be NULL\n");
720 static DEF_SCSI_QCMD(aha1542_queuecommand)
722 /* Initialize mailboxes */
723 static void setup_mailboxes(int bse, struct Scsi_Host *shpnt)
729 unchar cmd[5] = { CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0};
731 mb = HOSTDATA(shpnt)->mb;
732 ccb = HOSTDATA(shpnt)->ccb;
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]));
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);
744 printk(KERN_ERR "aha1542_detect: failed setting up mailboxes\n");
746 aha1542_intr_reset(bse);
749 static int __init aha1542_getconfig(int base_io, unsigned char *irq_level, unsigned char *dma_chan, unsigned char *scsi_id)
751 unchar inquiry_cmd[] = {CMD_RETCONF};
752 unchar inquiry_result[3];
754 i = inb(STATUS(base_io));
756 i = inb(DATA(base_io));
758 aha1542_out(base_io, inquiry_cmd, 1);
759 aha1542_in(base_io, inquiry_result, 3);
760 WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
763 printk(KERN_ERR "aha1542_detect: query board settings\n");
765 aha1542_intr_reset(base_io);
766 switch (inquiry_result[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. */
785 printk(KERN_ERR "Unable to determine Adaptec DMA priority. Disabling board\n");
788 switch (inquiry_result[1]) {
808 printk(KERN_ERR "Unable to determine Adaptec IRQ level. Disabling board\n");
811 *scsi_id = inquiry_result[2] & 7;
815 /* This function should only be called for 1542C boards - we can detect
816 the special firmware settings and unlock the board */
818 static int __init aha1542_mbenable(int base)
820 static unchar mbenable_cmd[3];
821 static unchar mbenable_result[2];
824 retval = BIOS_TRANSLATION_6432;
826 mbenable_cmd[0] = CMD_EXTBIOS;
827 aha1542_out(base, mbenable_cmd, 1);
828 if (aha1542_in1(base, mbenable_result, 2))
830 WAITd(INTRFLAGS(base), INTRMASK, HACC, 0, 100);
831 aha1542_intr_reset(base);
833 if ((mbenable_result[0] & 0x08) || mbenable_result[1]) {
834 mbenable_cmd[0] = CMD_MBENABLE;
836 mbenable_cmd[2] = mbenable_result[1];
838 if ((mbenable_result[0] & 0x08) && (mbenable_result[1] & 0x03))
839 retval = BIOS_TRANSLATION_25563;
841 aha1542_out(base, mbenable_cmd, 3);
842 WAIT(INTRFLAGS(base), INTRMASK, HACC, 0);
846 printk(KERN_ERR "aha1542_mbenable: Mailbox init failed\n");
848 aha1542_intr_reset(base);
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)
855 unchar inquiry_cmd[] = {CMD_INQUIRY};
856 unchar inquiry_result[4];
858 i = inb(STATUS(base_io));
860 i = inb(DATA(base_io));
862 aha1542_out(base_io, inquiry_cmd, 1);
863 aha1542_in(base_io, inquiry_result, 4);
864 WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
867 printk(KERN_ERR "aha1542_detect: query card type\n");
869 aha1542_intr_reset(base_io);
871 *transl = BIOS_TRANSLATION_6432; /* Default case */
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.
879 if (inquiry_result[0] == 0x43) {
880 printk(KERN_INFO "aha1542.c: Emulation mode not supported for AHA 174N hardware.\n");
884 /* Always call this - boards that do not support extended bios translation
885 will ignore the command, and we will set the proper default */
887 *transl = aha1542_mbenable(base_io);
893 static char *setup_str[MAXBOARDS] __initdata;
894 static int setup_idx = 0;
896 static void __init aha1542_setup(char *str, int *ints)
898 const char *ahausage = "aha1542: usage: aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]\n";
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);
908 if (ints[0] < 1 || ints[0] > 4) {
909 printk(KERN_ERR "aha1542: %s\n", str);
911 printk(KERN_ERR "aha1542: Wrong parameters may cause system malfunction.. We try anyway..\n");
913 setup_called[setup_idx] = ints[0];
914 setup_str[setup_idx] = str;
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;
939 printk(KERN_ERR "aha1542: %s\n", str);
941 printk(KERN_ERR "aha1542: Valid values for DMASPEED are 5-8, 10 MB/s. Using jumper defaults.\n");
944 setup_dmaspeed[setup_idx] = atbt;
946 if (setup_portbase != 0)
947 bases[setup_idx] = setup_portbase;
952 static int __init do_setup(char *str)
958 get_options(str, ARRAY_SIZE(ints), ints);
959 aha1542_setup(str,ints);
961 return count<setup_idx;
964 __setup("aha1542=",do_setup);
967 /* return non-zero on detection */
968 static int __init aha1542_detect(struct scsi_host_template * tpnt)
970 unsigned char dma_chan;
971 unsigned char irq_level;
972 unsigned char scsi_id;
974 unsigned int base_io;
976 struct Scsi_Host *shpnt = NULL;
980 DEB(printk("aha1542_detect: \n"));
982 tpnt->proc_name = "aha1542";
985 bases[0] = aha1542[0];
986 setup_buson[0] = aha1542[1];
987 setup_busoff[0] = aha1542[2];
990 switch (aha1542[3]) {
1007 setup_dmaspeed[0] = atbt;
1012 * Find MicroChannel cards (AHA1640)
1014 #ifdef CONFIG_MCA_LEGACY
1019 for (indx = 0; (slot != MCA_NOTFOUND) && (indx < ARRAY_SIZE(bases)); indx++) {
1024 /* Detect only AHA-1640 cards -- MCA ID 0F1F */
1025 slot = mca_find_unused_adapter(0x0f1f, slot);
1026 if (slot == MCA_NOTFOUND)
1030 pos = mca_read_stored_pos(slot, 3);
1032 /* Decode address */
1036 bases[indx] = 0x334;
1038 bases[indx] = 0x234;
1041 bases[indx] = 0x134;
1046 bases[indx] = 0x330;
1048 bases[indx] = 0x230;
1051 bases[indx] = 0x130;
1055 /* No need to decode IRQ and Arb level -- those are
1056 * read off the card later.
1058 printk(KERN_INFO "Found an AHA-1640 in MCA slot %d, I/O 0x%04x\n", slot, bases[indx]);
1060 mca_set_adapter_name(slot, "Adapter AHA-1640");
1061 mca_set_adapter_procfn(slot, NULL, NULL);
1062 mca_mark_as_used(slot);
1072 * Hunt for ISA Plug'n'Pray Adaptecs (AHA1535)
1077 struct pnp_dev *pdev = NULL;
1078 for(indx = 0; indx < ARRAY_SIZE(bases); indx++) {
1081 pdev = pnp_find_dev(NULL, ISAPNP_VENDOR('A', 'D', 'P'),
1082 ISAPNP_FUNCTION(0x1542), pdev);
1086 * Activate the PnP card
1089 if(pnp_device_attach(pdev)<0)
1092 if(pnp_activate_dev(pdev)<0) {
1093 pnp_device_detach(pdev);
1097 if(!pnp_port_valid(pdev, 0)) {
1098 pnp_device_detach(pdev);
1102 bases[indx] = pnp_port_start(pdev, 0);
1104 /* The card can be queried for its DMA, we have
1105 the DMA set up that is enough */
1107 printk(KERN_INFO "ISAPnP found an AHA1535 at I/O 0x%03X\n", bases[indx]);
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));
1116 release_region(bases[indx], 4);
1119 if (!aha1542_test_port(bases[indx], shpnt))
1122 base_io = bases[indx];
1124 /* Set the Bus on/off-times as not to ruin floppy performance */
1126 unchar oncmd[] = {CMD_BUSON_TIME, 7};
1127 unchar offcmd[] = {CMD_BUSOFF_TIME, 5};
1129 if (setup_called[indx]) {
1130 oncmd[1] = setup_buson[indx];
1131 offcmd[1] = setup_busoff[indx];
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);
1148 printk(KERN_ERR "aha1542_detect: setting bus on/off-time failed\n");
1150 aha1542_intr_reset(base_io);
1152 if (aha1542_query(base_io, &trans))
1155 if (aha1542_getconfig(base_io, &irq_level, &dma_chan, &scsi_id) == -1)
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);
1163 DEB(aha1542_stat());
1164 setup_mailboxes(base_io, shpnt);
1166 DEB(aha1542_stat());
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);
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);
1183 if (dma_chan == 0 || dma_chan >= 5) {
1184 set_dma_mode(dma_chan, DMA_MODE_CASCADE);
1185 enable_dma(dma_chan);
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);
1203 DEB(printk(" *** READ CAPACITY ***\n"));
1207 static unchar cmd[] = { READ_CAPACITY, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1210 for (i = 0; i < sizeof(buf); ++i)
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));
1219 DEB(printk(" *** NOW RUNNING MY OWN TEST *** \n"));
1221 for (i = 0; i < 4; ++i) {
1222 unsigned char cmd[10];
1227 xany2scsi(cmd + 2, i);
1232 aha1542_command(0, cmd, buffer, 512);
1238 release_region(bases[indx], 4);
1239 scsi_unregister(shpnt);
1247 static int aha1542_release(struct Scsi_Host *shost)
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);
1259 static int aha1542_restart(struct Scsi_Host *shost)
1264 unchar ahacmd = CMD_START_SCSI;
1267 for (i = 0; i < AHA1542_MAILBOXES; i++)
1268 if (HOSTDATA(shost)->SCint[i] &&
1269 !(HOSTDATA(shost)->SCint[i]->device->soft_reset)) {
1271 HOSTDATA(shost)->mb[i].status = 1; /* Indicate ready to restart... */
1275 printk(KERN_DEBUG "Potential to restart %d stalled commands...\n", count);
1277 /* start scsi command */
1279 aha1542_out(shost->io_port, &ahacmd, 1);
1285 * This is a device reset. This is handled by sending a special command
1288 static int aha1542_dev_reset(Scsi_Cmnd * SCpnt)
1290 unsigned long flags;
1292 unchar target = SCpnt->device->id;
1293 unchar lun = SCpnt->device->lun;
1296 unchar ahacmd = CMD_START_SCSI;
1298 ccb = HOSTDATA(SCpnt->device->host)->ccb;
1299 mb = HOSTDATA(SCpnt->device->host)->mb;
1301 spin_lock_irqsave(&aha1542_lock, flags);
1302 mbo = HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used + 1;
1303 if (mbo >= AHA1542_MAILBOXES)
1307 if (mb[mbo].status == 0 && HOSTDATA(SCpnt->device->host)->SCint[mbo] == NULL)
1310 if (mbo >= AHA1542_MAILBOXES)
1312 } while (mbo != HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used);
1314 if (mb[mbo].status || HOSTDATA(SCpnt->device->host)->SCint[mbo])
1315 panic("Unable to find empty mailbox for aha1542.\n");
1317 HOSTDATA(SCpnt->device->host)->SCint[mbo] = SCpnt; /* This will effectively
1318 prevent someone else from
1319 screwing with this cdb. */
1321 HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used = mbo;
1322 spin_unlock_irqrestore(&aha1542_lock, flags);
1324 any2scsi(mb[mbo].ccbptr, SCSI_BUF_PA(&ccb[mbo])); /* This gets trashed for some reason */
1326 memset(&ccb[mbo], 0, sizeof(struct ccb));
1328 ccb[mbo].op = 0x81; /* BUS DEVICE RESET */
1330 ccb[mbo].idlun = (target & 7) << 5 | (lun & 7); /*SCSI Target Id */
1332 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
1333 ccb[mbo].commlinkid = 0;
1336 * Now tell the 1542 to flush all pending commands for this
1339 aha1542_out(SCpnt->device->host->io_port, &ahacmd, 1);
1341 scmd_printk(KERN_WARNING, SCpnt,
1342 "Trying device reset for target\n");
1347 #ifdef ERIC_neverdef
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...
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.
1357 printk(KERN_WARNING "Sent BUS DEVICE RESET to target %d\n", SCpnt->target);
1360 * Free the command block for all commands running on this
1363 for (i = 0; i < AHA1542_MAILBOXES; i++) {
1364 if (HOSTDATA(SCpnt->host)->SCint[i] &&
1365 HOSTDATA(SCpnt->host)->SCint[i]->target == SCpnt->target) {
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;
1377 #endif /* ERIC_neverdef */
1380 static int aha1542_bus_reset(Scsi_Cmnd * SCpnt)
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.
1390 outb(SCRST, CONTROL(SCpnt->device->host->io_port));
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.
1401 spin_lock_irq(SCpnt->device->host->host_lock);
1403 WAIT(STATUS(SCpnt->device->host->io_port),
1404 STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
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.
1412 printk(KERN_WARNING "Sent BUS RESET to scsi host %d\n", SCpnt->device->host->host_no);
1414 for (i = 0; i < AHA1542_MAILBOXES; i++) {
1415 if (HOSTDATA(SCpnt->device->host)->SCint[i] != NULL) {
1417 SCtmp = HOSTDATA(SCpnt->device->host)->SCint[i];
1420 if (SCtmp->device->soft_reset) {
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
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;
1436 spin_unlock_irq(SCpnt->device->host->host_lock);
1440 spin_unlock_irq(SCpnt->device->host->host_lock);
1444 static int aha1542_host_reset(Scsi_Cmnd * SCpnt)
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.
1454 outb(HRST | SCRST, CONTROL(SCpnt->device->host->io_port));
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.
1464 spin_lock_irq(SCpnt->device->host->host_lock);
1466 WAIT(STATUS(SCpnt->device->host->io_port),
1467 STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
1470 * We need to do this too before the 1542 can interact with
1473 setup_mailboxes(SCpnt->device->host->io_port, SCpnt->device->host);
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.
1481 printk(KERN_WARNING "Sent BUS RESET to scsi host %d\n", SCpnt->device->host->host_no);
1483 for (i = 0; i < AHA1542_MAILBOXES; i++) {
1484 if (HOSTDATA(SCpnt->device->host)->SCint[i] != NULL) {
1486 SCtmp = HOSTDATA(SCpnt->device->host)->SCint[i];
1488 if (SCtmp->device->soft_reset) {
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
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;
1504 spin_unlock_irq(SCpnt->device->host->host_lock);
1508 spin_unlock_irq(SCpnt->device->host->host_lock);
1514 * These are the old error handling routines. They are only temporarily
1515 * here while we play with the new error handling code.
1517 static int aha1542_old_abort(Scsi_Cmnd * SCpnt)
1520 unchar ahacmd = CMD_START_SCSI;
1521 unsigned long flags;
1525 printk(KERN_DEBUG "In aha1542_abort: %x %x\n",
1526 inb(STATUS(SCpnt->host->io_port)),
1527 inb(INTRFLAGS(SCpnt->host->io_port)));
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;
1536 if (mb[mbi].status != 0)
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);
1544 if (mb[mbi].status) {
1545 printk(KERN_ERR "Lost interrupt discovered on irq %d - attempting to recover\n",
1547 aha1542_intr_handle(SCpnt->host, NULL);
1550 /* OK, no lost interrupt. Try looking to see how many pending commands
1551 we think we have. */
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 : "?"
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);
1565 printk(KERN_ERR "Other pending command %s\n",
1566 SCpnt->request->rq_disk ?
1567 SCpnt->request->rq_disk->disk_name : "?"
1572 DEB(printk("aha1542_abort\n"));
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);
1583 if (AHA1542_MAILBOXES == mbo)
1584 spin_unlock_irqrestore(&aha1542_lock, flags);
1586 return SCSI_ABORT_SNOOZE;
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). */
1595 static int aha1542_old_reset(Scsi_Cmnd * SCpnt, unsigned int reset_flags)
1597 unchar ahacmd = CMD_START_SCSI;
1601 * See if a bus reset was suggested.
1603 if (reset_flags & SCSI_RESET_SUGGEST_BUS_RESET) {
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.
1610 outb(HRST | SCRST, CONTROL(SCpnt->host->io_port));
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.
1619 WAIT(STATUS(SCpnt->host->io_port),
1620 STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
1623 * We need to do this too before the 1542 can interact with
1626 setup_mailboxes(SCpnt->host->io_port, SCpnt->host);
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.
1634 printk(KERN_WARNING "Sent BUS RESET to scsi host %d\n", SCpnt->host->host_no);
1636 for (i = 0; i < AHA1542_MAILBOXES; i++)
1637 if (HOSTDATA(SCpnt->host)->SCint[i] != NULL) {
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);
1646 HOSTDATA(SCpnt->host)->SCint[i] = NULL;
1647 HOSTDATA(SCpnt->host)->mb[i].status = 0;
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.
1654 return (SCSI_RESET_SUCCESS | SCSI_RESET_BUS_RESET);
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);
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);
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
1674 printk(KERN_WARNING "Sent BUS DEVICE RESET to target %d\n", SCpnt->target);
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) {
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);
1690 HOSTDATA(SCpnt->host)->SCint[i] = NULL;
1691 HOSTDATA(SCpnt->host)->mb[i].status = 0;
1693 return SCSI_RESET_SUCCESS;
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;
1701 #endif /* end of big comment block around old_abort + old_reset */
1703 static int aha1542_biosparam(struct scsi_device *sdev,
1704 struct block_device *bdev, sector_t capacity, int *ip)
1706 int translation_algorithm;
1707 int size = capacity;
1709 translation_algorithm = HOSTDATA(sdev->host)->bios_translation;
1711 if ((size >> 11) > 1024 && translation_algorithm == BIOS_TRANSLATION_25563) {
1712 /* Please verify that this is the same as what DOS returns */
1715 ip[2] = size / 255 / 63;
1724 MODULE_LICENSE("GPL");
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,
1739 .sg_tablesize = AHA1542_SCATTER,
1740 .cmd_per_lun = AHA1542_CMDLUN,
1741 .unchecked_isa_dma = 1,
1742 .use_clustering = ENABLE_CLUSTERING,
1744 #include "scsi_module.c"