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, now deleted)
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/isa.h>
39 #include <linux/pnp.h>
40 #include <linux/blkdev.h>
41 #include <linux/slab.h>
47 #include <scsi/scsi_host.h>
49 #include <linux/stat.h>
58 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 $";
61 /* The adaptec can be configured for quite a number of addresses, but
62 I generally do not want the card poking around at random. We allow
63 two addresses - this allows people to use the Adaptec with a Midi
64 card, which also used 0x330 -- can be overridden with LILO! */
66 #define MAXBOARDS 4 /* Increase this and the sizes of the
67 arrays below, if you need more.. */
69 /* Boards 3,4 slots are reserved for ISAPnP scans */
71 static unsigned int bases[MAXBOARDS] = {0x330, 0x334, 0, 0};
73 /* set by aha1542_setup according to the command line; they also may
74 be marked __initdata, but require zero initializers then */
76 static int setup_called[MAXBOARDS];
77 static int setup_buson[MAXBOARDS];
78 static int setup_busoff[MAXBOARDS];
79 static int setup_dmaspeed[MAXBOARDS] = { -1, -1, -1, -1 };
82 * LILO/Module params: aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]
84 * Where: <PORTBASE> is any of the valid AHA addresses:
85 * 0x130, 0x134, 0x230, 0x234, 0x330, 0x334
86 * <BUSON> is the time (in microsecs) that AHA spends on the AT-bus
87 * when transferring data. 1542A power-on default is 11us,
88 * valid values are in range: 2..15 (decimal)
89 * <BUSOFF> is the time that AHA spends OFF THE BUS after while
90 * it is transferring data (not to monopolize the bus).
91 * Power-on default is 4us, valid range: 1..64 microseconds.
92 * <DMASPEED> Default is jumper selected (1542A: on the J1),
93 * but experimenter can alter it with this.
94 * Valid values: 5, 6, 7, 8, 10 (MB/s)
95 * Factory default is 5 MB/s.
99 static bool isapnp = 0;
100 static int aha1542[] = {0x330, 11, 4, -1};
101 module_param_array(aha1542, int, NULL, 0);
102 module_param(isapnp, bool, 0);
104 static int isapnp = 1;
107 #define BIOS_TRANSLATION_1632 0 /* Used by some old 1542A boards */
108 #define BIOS_TRANSLATION_6432 1 /* Default case these days */
109 #define BIOS_TRANSLATION_25563 2 /* Big disk case */
111 struct aha1542_hostdata {
112 /* This will effectively start both of them at the first mailbox */
113 int bios_translation; /* Mapping bios uses - for compatibility */
114 int aha1542_last_mbi_used;
115 int aha1542_last_mbo_used;
116 Scsi_Cmnd *SCint[AHA1542_MAILBOXES];
117 struct mailbox mb[2 * AHA1542_MAILBOXES];
118 struct ccb ccb[AHA1542_MAILBOXES];
121 static DEFINE_SPINLOCK(aha1542_lock);
123 static inline void aha1542_intr_reset(u16 base)
125 outb(IRST, CONTROL(base));
128 static inline bool wait_mask(u16 port, u8 mask, u8 allof, u8 noneof, int timeout)
138 u8 bits = inb(port) & mask;
139 if ((bits & allof) == allof && ((bits & noneof) == 0))
150 /* This is a bit complicated, but we need to make sure that an interrupt
151 routine does not send something out while we are in the middle of this.
152 Fortunately, it is only at boot time that multi-byte messages
154 static int aha1542_outb(unsigned int base, u8 cmd)
159 if (!wait_mask(STATUS(base), CDF, 0, CDF, 0)) {
160 printk(KERN_ERR "aha1542_outb failed");
163 spin_lock_irqsave(&aha1542_lock, flags);
164 if (inb(STATUS(base)) & CDF) {
165 spin_unlock_irqrestore(&aha1542_lock, flags);
168 outb(cmd, DATA(base));
169 spin_unlock_irqrestore(&aha1542_lock, flags);
174 static int aha1542_out(unsigned int base, u8 *cmdp, int len)
178 spin_lock_irqsave(&aha1542_lock, flags);
180 if (!wait_mask(STATUS(base), CDF, 0, CDF, 0)) {
181 spin_unlock_irqrestore(&aha1542_lock, flags);
182 printk(KERN_ERR "aha1542_out failed(%d): ", len + 1);
185 outb(*cmdp++, DATA(base));
187 spin_unlock_irqrestore(&aha1542_lock, flags);
192 /* Only used at boot time, so we do not need to worry about latency as much
195 static int aha1542_in(unsigned int base, u8 *cmdp, int len, int timeout)
199 spin_lock_irqsave(&aha1542_lock, flags);
201 if (!wait_mask(STATUS(base), DF, DF, 0, timeout)) {
202 spin_unlock_irqrestore(&aha1542_lock, flags);
204 printk(KERN_ERR "aha1542_in failed(%d): ", len + 1);
207 *cmdp++ = inb(DATA(base));
209 spin_unlock_irqrestore(&aha1542_lock, flags);
213 static int makecode(unsigned hosterr, unsigned scsierr)
217 case 0xa: /* Linked command complete without error and linked normally */
218 case 0xb: /* Linked command complete without error, interrupt generated */
222 case 0x11: /* Selection time out-The initiator selection or target
223 reselection was not complete within the SCSI Time out period */
224 hosterr = DID_TIME_OUT;
227 case 0x12: /* Data overrun/underrun-The target attempted to transfer more data
228 than was allocated by the Data Length field or the sum of the
229 Scatter / Gather Data Length fields. */
231 case 0x13: /* Unexpected bus free-The target dropped the SCSI BSY at an unexpected time. */
233 case 0x15: /* MBO command was not 00, 01 or 02-The first byte of the CB was
234 invalid. This usually indicates a software failure. */
236 case 0x16: /* Invalid CCB Operation Code-The first byte of the CCB was invalid.
237 This usually indicates a software failure. */
239 case 0x17: /* Linked CCB does not have the same LUN-A subsequent CCB of a set
240 of linked CCB's does not specify the same logical unit number as
242 case 0x18: /* Invalid Target Direction received from Host-The direction of a
243 Target Mode CCB was invalid. */
245 case 0x19: /* Duplicate CCB Received in Target Mode-More than once CCB was
246 received to service data transfer between the same target LUN
247 and initiator SCSI ID in the same direction. */
249 case 0x1a: /* Invalid CCB or Segment List Parameter-A segment list with a zero
250 length segment or invalid segment list boundaries was received.
251 A CCB parameter was invalid. */
252 DEB(printk("Aha1542: %x %x\n", hosterr, scsierr));
253 hosterr = DID_ERROR; /* Couldn't find any better */
256 case 0x14: /* Target bus phase sequence failure-An invalid bus phase or bus
257 phase sequence was requested by the target. The host adapter
258 will generate a SCSI Reset Condition, notifying the host with
263 printk(KERN_ERR "aha1542: makecode: unknown hoststatus %x\n", hosterr);
266 return scsierr | (hosterr << 16);
269 static int aha1542_test_port(int bse, struct Scsi_Host *shpnt)
271 u8 inquiry_result[4];
275 /* Quick and dirty test for presence of the card. */
276 if (inb(STATUS(bse)) == 0xff)
279 /* Reset the adapter. I ought to make a hard reset, but it's not really necessary */
281 /* In case some other card was probing here, reset interrupts */
282 aha1542_intr_reset(bse); /* reset interrupts, so they don't block */
284 outb(SRST | IRST /*|SCRST */ , CONTROL(bse));
286 mdelay(20); /* Wait a little bit for things to settle down. */
288 /* Expect INIT and IDLE, any of the others are bad */
289 if (!wait_mask(STATUS(bse), STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0))
292 /* Shouldn't have generated any interrupts during reset */
293 if (inb(INTRFLAGS(bse)) & INTRMASK)
296 /* Perform a host adapter inquiry instead so we do not need to set
297 up the mailboxes ahead of time */
299 aha1542_outb(bse, CMD_INQUIRY);
302 cmdp = &inquiry_result[0];
305 if (!wait_mask(STATUS(bse), DF, DF, 0, 0))
307 *cmdp++ = inb(DATA(bse));
310 /* Reading port should reset DF */
311 if (inb(STATUS(bse)) & DF)
314 /* When HACC, command is completed, and we're though testing */
315 if (!wait_mask(INTRFLAGS(bse), HACC, HACC, 0, 0))
318 /* Clear interrupts */
319 outb(IRST, CONTROL(bse));
324 static int aha1542_restart(struct Scsi_Host *shost)
326 struct aha1542_hostdata *aha1542 = shost_priv(shost);
330 for (i = 0; i < AHA1542_MAILBOXES; i++)
331 if (aha1542->SCint[i] &&
332 !(aha1542->SCint[i]->device->soft_reset)) {
335 printk(KERN_DEBUG "Potential to restart %d stalled commands...\n", count);
340 /* A "high" level interrupt handler */
341 static void aha1542_intr_handle(struct Scsi_Host *shost)
343 struct aha1542_hostdata *aha1542 = shost_priv(shost);
344 void (*my_done) (Scsi_Cmnd *) = NULL;
345 int errstatus, mbi, mbo, mbistatus;
351 struct mailbox *mb = aha1542->mb;
352 struct ccb *ccb = aha1542->ccb;
356 flag = inb(INTRFLAGS(shost->io_port));
357 printk(KERN_DEBUG "aha1542_intr_handle: ");
358 if (!(flag & ANYINTR))
359 printk("no interrupt?");
368 printk("status %02x\n", inb(STATUS(shost->io_port)));
375 flag = inb(INTRFLAGS(shost->io_port));
377 /* Check for unusual interrupts. If any of these happen, we should
378 probably do something special, but for now just printing a message
379 is sufficient. A SCSI reset detected is something that we really
380 need to deal with in some way. */
391 aha1542_intr_reset(shost->io_port);
393 spin_lock_irqsave(&aha1542_lock, flags);
394 mbi = aha1542->aha1542_last_mbi_used + 1;
395 if (mbi >= 2 * AHA1542_MAILBOXES)
396 mbi = AHA1542_MAILBOXES;
399 if (mb[mbi].status != 0)
402 if (mbi >= 2 * AHA1542_MAILBOXES)
403 mbi = AHA1542_MAILBOXES;
404 } while (mbi != aha1542->aha1542_last_mbi_used);
406 if (mb[mbi].status == 0) {
407 spin_unlock_irqrestore(&aha1542_lock, flags);
408 /* Hmm, no mail. Must have read it the last time around */
409 if (!number_serviced && !needs_restart)
410 printk(KERN_WARNING "aha1542.c: interrupt received, but no mail.\n");
411 /* We detected a reset. Restart all pending commands for
412 devices that use the hard reset option */
414 aha1542_restart(shost);
418 mbo = (scsi2int(mb[mbi].ccbptr) - (isa_virt_to_bus(&ccb[0]))) / sizeof(struct ccb);
419 mbistatus = mb[mbi].status;
421 aha1542->aha1542_last_mbi_used = mbi;
422 spin_unlock_irqrestore(&aha1542_lock, flags);
426 if (ccb[mbo].tarstat | ccb[mbo].hastat)
427 printk(KERN_DEBUG "aha1542_command: returning %x (status %d)\n",
428 ccb[mbo].tarstat + ((int) ccb[mbo].hastat << 16), mb[mbi].status);
433 continue; /* Aborted command not found */
436 printk(KERN_DEBUG "...done %d %d\n", mbo, mbi);
439 SCtmp = aha1542->SCint[mbo];
441 if (!SCtmp || !SCtmp->scsi_done) {
442 printk(KERN_WARNING "aha1542_intr_handle: Unexpected interrupt\n");
443 printk(KERN_WARNING "tarstat=%x, hastat=%x idlun=%x ccb#=%d \n", ccb[mbo].tarstat,
444 ccb[mbo].hastat, ccb[mbo].idlun, mbo);
447 my_done = SCtmp->scsi_done;
448 kfree(SCtmp->host_scribble);
449 SCtmp->host_scribble = NULL;
450 /* Fetch the sense data, and tuck it away, in the required slot. The
451 Adaptec automatically fetches it, and there is no guarantee that
452 we will still have it in the cdb when we come back */
453 if (ccb[mbo].tarstat == 2)
454 memcpy(SCtmp->sense_buffer, &ccb[mbo].cdb[ccb[mbo].cdblen],
455 SCSI_SENSE_BUFFERSIZE);
458 /* is there mail :-) */
460 /* more error checking left out here */
462 /* This is surely wrong, but I don't know what's right */
463 errstatus = makecode(ccb[mbo].hastat, ccb[mbo].tarstat);
469 printk(KERN_DEBUG "(aha1542 error:%x %x %x) ", errstatus,
470 ccb[mbo].hastat, ccb[mbo].tarstat);
473 if (ccb[mbo].tarstat == 2) {
477 DEB(printk("aha1542_intr_handle: sense:"));
479 for (i = 0; i < 12; i++)
480 printk("%02x ", ccb[mbo].cdb[ccb[mbo].cdblen + i]);
484 DEB(printk("aha1542_intr_handle: buf:"));
485 for (i = 0; i < bufflen; i++)
486 printk("%02x ", ((unchar *)buff)[i]);
490 DEB(if (errstatus) printk("aha1542_intr_handle: returning %6x\n", errstatus));
491 SCtmp->result = errstatus;
492 aha1542->SCint[mbo] = NULL; /* This effectively frees up the mailbox slot, as
493 far as queuecommand is concerned */
499 /* A quick wrapper for do_aha1542_intr_handle to grab the spin lock */
500 static irqreturn_t do_aha1542_intr_handle(int dummy, void *dev_id)
503 struct Scsi_Host *shost = dev_id;
505 spin_lock_irqsave(shost->host_lock, flags);
506 aha1542_intr_handle(shost);
507 spin_unlock_irqrestore(shost->host_lock, flags);
511 static int aha1542_queuecommand_lck(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *))
513 struct aha1542_hostdata *aha1542 = shost_priv(SCpnt->device->host);
515 u8 *cmd = (u8 *) SCpnt->cmnd;
516 u8 target = SCpnt->device->id;
517 u8 lun = SCpnt->device->lun;
519 int bufflen = scsi_bufflen(SCpnt);
521 struct mailbox *mb = aha1542->mb;
522 struct ccb *ccb = aha1542->ccb;
526 DEB(if (target > 1) {
527 SCpnt->result = DID_TIME_OUT << 16;
528 done(SCpnt); return 0;
532 if (*cmd == REQUEST_SENSE) {
533 /* Don't do the command - we have the sense data already */
539 if (*cmd == READ_10 || *cmd == WRITE_10)
540 i = xscsi2int(cmd + 2);
541 else if (*cmd == READ_6 || *cmd == WRITE_6)
542 i = scsi2int(cmd + 2);
546 printk(KERN_DEBUG "aha1542_queuecommand: dev %d cmd %02x pos %d len %d ", target, *cmd, i, bufflen);
548 printk(KERN_DEBUG "aha1542_command: dev %d cmd %02x pos %d len %d ", target, *cmd, i, bufflen);
549 printk(KERN_DEBUG "aha1542_queuecommand: dumping scsi cmd:");
550 for (i = 0; i < SCpnt->cmd_len; i++)
551 printk("%02x ", cmd[i]);
553 if (*cmd == WRITE_10 || *cmd == WRITE_6)
554 return 0; /* we are still testing, so *don't* write */
556 /* Use the outgoing mailboxes in a round-robin fashion, because this
557 is how the host adapter will scan for them */
559 spin_lock_irqsave(&aha1542_lock, flags);
560 mbo = aha1542->aha1542_last_mbo_used + 1;
561 if (mbo >= AHA1542_MAILBOXES)
565 if (mb[mbo].status == 0 && aha1542->SCint[mbo] == NULL)
568 if (mbo >= AHA1542_MAILBOXES)
570 } while (mbo != aha1542->aha1542_last_mbo_used);
572 if (mb[mbo].status || aha1542->SCint[mbo])
573 panic("Unable to find empty mailbox for aha1542.\n");
575 aha1542->SCint[mbo] = SCpnt; /* This will effectively prevent someone else from
576 screwing with this cdb. */
578 aha1542->aha1542_last_mbo_used = mbo;
579 spin_unlock_irqrestore(&aha1542_lock, flags);
582 printk(KERN_DEBUG "Sending command (%d %x)...", mbo, done);
585 any2scsi(mb[mbo].ccbptr, isa_virt_to_bus(&ccb[mbo])); /* This gets trashed for some reason */
587 memset(&ccb[mbo], 0, sizeof(struct ccb));
589 ccb[mbo].cdblen = SCpnt->cmd_len;
592 if (*cmd == READ_10 || *cmd == READ_6)
594 else if (*cmd == WRITE_10 || *cmd == WRITE_6)
597 memcpy(ccb[mbo].cdb, cmd, ccb[mbo].cdblen);
600 struct scatterlist *sg;
605 int i, sg_count = scsi_sg_count(SCpnt);
606 ccb[mbo].op = 2; /* SCSI Initiator Command w/scatter-gather */
607 SCpnt->host_scribble = kmalloc(sizeof(*cptr)*sg_count,
608 GFP_KERNEL | GFP_DMA);
609 cptr = (struct chain *) SCpnt->host_scribble;
611 /* free the claimed mailbox slot */
612 aha1542->SCint[mbo] = NULL;
613 return SCSI_MLQUEUE_HOST_BUSY;
615 scsi_for_each_sg(SCpnt, sg, sg_count, i) {
616 any2scsi(cptr[i].dataptr, isa_page_to_bus(sg_page(sg))
618 any2scsi(cptr[i].datalen, sg->length);
620 any2scsi(ccb[mbo].datalen, sg_count * sizeof(struct chain));
621 any2scsi(ccb[mbo].dataptr, isa_virt_to_bus(cptr));
623 printk("cptr %x: ", cptr);
624 ptr = (unsigned char *) cptr;
625 for (i = 0; i < 18; i++)
626 printk("%02x ", ptr[i]);
629 ccb[mbo].op = 0; /* SCSI Initiator Command */
630 SCpnt->host_scribble = NULL;
631 any2scsi(ccb[mbo].datalen, 0);
632 any2scsi(ccb[mbo].dataptr, 0);
634 ccb[mbo].idlun = (target & 7) << 5 | direction | (lun & 7); /*SCSI Target Id */
635 ccb[mbo].rsalen = 16;
636 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
637 ccb[mbo].commlinkid = 0;
642 printk(KERN_DEBUG "aha1542_command: sending.. ");
643 for (i = 0; i < sizeof(ccb[mbo]) - 10; i++)
644 printk("%02x ", ((u8 *) &ccb[mbo])[i]);
649 DEB(printk("aha1542_queuecommand: now waiting for interrupt "));
650 SCpnt->scsi_done = done;
652 aha1542_outb(SCpnt->device->host->io_port, CMD_START_SCSI);
654 printk("aha1542_queuecommand: done can't be NULL\n");
659 static DEF_SCSI_QCMD(aha1542_queuecommand)
661 /* Initialize mailboxes */
662 static void setup_mailboxes(int bse, struct Scsi_Host *shpnt)
664 struct aha1542_hostdata *aha1542 = shost_priv(shpnt);
666 struct mailbox *mb = aha1542->mb;
667 struct ccb *ccb = aha1542->ccb;
669 u8 cmd[5] = { CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0};
671 for (i = 0; i < AHA1542_MAILBOXES; i++) {
672 mb[i].status = mb[AHA1542_MAILBOXES + i].status = 0;
673 any2scsi(mb[i].ccbptr, isa_virt_to_bus(&ccb[i]));
675 aha1542_intr_reset(bse); /* reset interrupts, so they don't block */
676 any2scsi((cmd + 2), isa_virt_to_bus(mb));
677 aha1542_out(bse, cmd, 5);
678 if (!wait_mask(INTRFLAGS(bse), INTRMASK, HACC, 0, 0))
679 printk(KERN_ERR "aha1542_detect: failed setting up mailboxes\n");
680 aha1542_intr_reset(bse);
683 static int aha1542_getconfig(int base_io, unsigned char *irq_level, unsigned char *dma_chan, unsigned char *scsi_id)
685 u8 inquiry_result[3];
687 i = inb(STATUS(base_io));
689 i = inb(DATA(base_io));
691 aha1542_outb(base_io, CMD_RETCONF);
692 aha1542_in(base_io, inquiry_result, 3, 0);
693 if (!wait_mask(INTRFLAGS(base_io), INTRMASK, HACC, 0, 0))
694 printk(KERN_ERR "aha1542_detect: query board settings\n");
695 aha1542_intr_reset(base_io);
696 switch (inquiry_result[0]) {
710 /* This means that the adapter, although Adaptec 1542 compatible, doesn't use a DMA channel.
711 Currently only aware of the BusLogic BT-445S VL-Bus adapter which needs this. */
715 printk(KERN_ERR "Unable to determine Adaptec DMA priority. Disabling board\n");
718 switch (inquiry_result[1]) {
738 printk(KERN_ERR "Unable to determine Adaptec IRQ level. Disabling board\n");
741 *scsi_id = inquiry_result[2] & 7;
745 /* This function should only be called for 1542C boards - we can detect
746 the special firmware settings and unlock the board */
748 static int aha1542_mbenable(int base)
750 static u8 mbenable_cmd[3];
751 static u8 mbenable_result[2];
754 retval = BIOS_TRANSLATION_6432;
756 aha1542_outb(base, CMD_EXTBIOS);
757 if (aha1542_in(base, mbenable_result, 2, 100))
759 if (!wait_mask(INTRFLAGS(base), INTRMASK, HACC, 0, 100))
761 aha1542_intr_reset(base);
763 if ((mbenable_result[0] & 0x08) || mbenable_result[1]) {
764 mbenable_cmd[0] = CMD_MBENABLE;
766 mbenable_cmd[2] = mbenable_result[1];
768 if ((mbenable_result[0] & 0x08) && (mbenable_result[1] & 0x03))
769 retval = BIOS_TRANSLATION_25563;
771 aha1542_out(base, mbenable_cmd, 3);
772 if (!wait_mask(INTRFLAGS(base), INTRMASK, HACC, 0, 0))
777 printk(KERN_ERR "aha1542_mbenable: Mailbox init failed\n");
779 aha1542_intr_reset(base);
783 /* Query the board to find out if it is a 1542 or a 1740, or whatever. */
784 static int aha1542_query(int base_io, int *transl)
786 u8 inquiry_result[4];
788 i = inb(STATUS(base_io));
790 i = inb(DATA(base_io));
792 aha1542_outb(base_io, CMD_INQUIRY);
793 aha1542_in(base_io, inquiry_result, 4, 0);
794 if (!wait_mask(INTRFLAGS(base_io), INTRMASK, HACC, 0, 0))
795 printk(KERN_ERR "aha1542_detect: query card type\n");
796 aha1542_intr_reset(base_io);
798 *transl = BIOS_TRANSLATION_6432; /* Default case */
800 /* For an AHA1740 series board, we ignore the board since there is a
801 hardware bug which can lead to wrong blocks being returned if the board
802 is operating in the 1542 emulation mode. Since there is an extended mode
803 driver, we simply ignore the board and let the 1740 driver pick it up.
806 if (inquiry_result[0] == 0x43) {
807 printk(KERN_INFO "aha1542.c: Emulation mode not supported for AHA 174N hardware.\n");
811 /* Always call this - boards that do not support extended bios translation
812 will ignore the command, and we will set the proper default */
814 *transl = aha1542_mbenable(base_io);
820 static char *setup_str[MAXBOARDS] __initdata;
821 static int setup_idx = 0;
823 static void __init aha1542_setup(char *str, int *ints)
825 const char *ahausage = "aha1542: usage: aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]\n";
828 if (setup_idx >= MAXBOARDS) {
829 printk(KERN_ERR "aha1542: aha1542_setup called too many times! Bad LILO params ?\n");
830 printk(KERN_ERR " Entryline 1: %s\n", setup_str[0]);
831 printk(KERN_ERR " Entryline 2: %s\n", setup_str[1]);
832 printk(KERN_ERR " This line: %s\n", str);
835 if (ints[0] < 1 || ints[0] > 4) {
836 printk(KERN_ERR "aha1542: %s\n", str);
838 printk(KERN_ERR "aha1542: Wrong parameters may cause system malfunction.. We try anyway..\n");
840 setup_called[setup_idx] = ints[0];
841 setup_str[setup_idx] = str;
843 setup_portbase = ints[0] >= 1 ? ints[1] : 0; /* Preserve the default value.. */
844 setup_buson[setup_idx] = ints[0] >= 2 ? ints[2] : 7;
845 setup_busoff[setup_idx] = ints[0] >= 3 ? ints[3] : 5;
866 printk(KERN_ERR "aha1542: %s\n", str);
868 printk(KERN_ERR "aha1542: Valid values for DMASPEED are 5-8, 10 MB/s. Using jumper defaults.\n");
871 setup_dmaspeed[setup_idx] = atbt;
873 if (setup_portbase != 0)
874 bases[setup_idx] = setup_portbase;
879 static int __init do_setup(char *str)
885 get_options(str, ARRAY_SIZE(ints), ints);
886 aha1542_setup(str,ints);
888 return count<setup_idx;
891 __setup("aha1542=",do_setup);
894 /* return non-zero on detection */
895 static struct Scsi_Host *aha1542_hw_init(struct scsi_host_template *tpnt, struct device *pdev, int indx)
897 unsigned char dma_chan;
898 unsigned char irq_level;
899 unsigned char scsi_id;
901 unsigned int base_io;
903 struct Scsi_Host *shpnt = NULL;
904 struct aha1542_hostdata *aha1542;
906 DEB(printk("aha1542_detect: \n"));
908 tpnt->proc_name = "aha1542";
910 if (bases[indx] != 0 && request_region(bases[indx], 4, "aha1542")) {
911 shpnt = scsi_host_alloc(tpnt,
912 sizeof(struct aha1542_hostdata));
915 release_region(bases[indx], 4);
918 aha1542 = shost_priv(shpnt);
919 if (!aha1542_test_port(bases[indx], shpnt))
922 base_io = bases[indx];
924 /* Set the Bus on/off-times as not to ruin floppy performance */
926 u8 oncmd[] = {CMD_BUSON_TIME, 7};
927 u8 offcmd[] = {CMD_BUSOFF_TIME, 5};
929 if (setup_called[indx]) {
930 oncmd[1] = setup_buson[indx];
931 offcmd[1] = setup_busoff[indx];
933 aha1542_intr_reset(base_io);
934 aha1542_out(base_io, oncmd, 2);
935 if (!wait_mask(INTRFLAGS(base_io), INTRMASK, HACC, 0, 0))
937 aha1542_intr_reset(base_io);
938 aha1542_out(base_io, offcmd, 2);
939 if (!wait_mask(INTRFLAGS(base_io), INTRMASK, HACC, 0, 0))
941 if (setup_dmaspeed[indx] >= 0) {
942 u8 dmacmd[] = {CMD_DMASPEED, 0};
943 dmacmd[1] = setup_dmaspeed[indx];
944 aha1542_intr_reset(base_io);
945 aha1542_out(base_io, dmacmd, 2);
946 if (!wait_mask(INTRFLAGS(base_io), INTRMASK, HACC, 0, 0))
951 printk(KERN_ERR "aha1542_detect: setting bus on/off-time failed\n");
953 aha1542_intr_reset(base_io);
955 if (aha1542_query(base_io, &trans))
958 if (aha1542_getconfig(base_io, &irq_level, &dma_chan, &scsi_id) == -1)
961 printk(KERN_INFO "Configuring Adaptec (SCSI-ID %d) at IO:%x, IRQ %d", scsi_id, base_io, irq_level);
962 if (dma_chan != 0xFF)
963 printk(", DMA priority %d", dma_chan);
966 setup_mailboxes(base_io, shpnt);
968 DEB(printk("aha1542_detect: enable interrupt channel %d\n", irq_level));
969 spin_lock_irqsave(&aha1542_lock, flags);
970 if (request_irq(irq_level, do_aha1542_intr_handle, 0,
972 printk(KERN_ERR "Unable to allocate IRQ for adaptec controller.\n");
973 spin_unlock_irqrestore(&aha1542_lock, flags);
976 if (dma_chan != 0xFF) {
977 if (request_dma(dma_chan, "aha1542")) {
978 printk(KERN_ERR "Unable to allocate DMA channel for Adaptec.\n");
979 free_irq(irq_level, shpnt);
980 spin_unlock_irqrestore(&aha1542_lock, flags);
983 if (dma_chan == 0 || dma_chan >= 5) {
984 set_dma_mode(dma_chan, DMA_MODE_CASCADE);
985 enable_dma(dma_chan);
989 shpnt->this_id = scsi_id;
990 shpnt->unique_id = base_io;
991 shpnt->io_port = base_io;
992 shpnt->n_io_port = 4; /* Number of bytes of I/O space used */
993 shpnt->dma_channel = dma_chan;
994 shpnt->irq = irq_level;
995 aha1542->bios_translation = trans;
996 if (trans == BIOS_TRANSLATION_25563)
997 printk(KERN_INFO "aha1542.c: Using extended bios translation\n");
998 aha1542->aha1542_last_mbi_used = (2 * AHA1542_MAILBOXES - 1);
999 aha1542->aha1542_last_mbo_used = (AHA1542_MAILBOXES - 1);
1000 memset(aha1542->SCint, 0, sizeof(aha1542->SCint));
1001 spin_unlock_irqrestore(&aha1542_lock, flags);
1003 if (scsi_add_host(shpnt, pdev)) {
1004 if (shpnt->dma_channel != 0xff)
1005 free_dma(shpnt->dma_channel);
1006 free_irq(irq_level, shpnt);
1010 scsi_scan_host(shpnt);
1014 release_region(bases[indx], 4);
1015 scsi_host_put(shpnt);
1023 static int aha1542_release(struct Scsi_Host *shost)
1025 scsi_remove_host(shost);
1027 free_irq(shost->irq, shost);
1028 if (shost->dma_channel != 0xff)
1029 free_dma(shost->dma_channel);
1030 if (shost->io_port && shost->n_io_port)
1031 release_region(shost->io_port, shost->n_io_port);
1032 scsi_host_put(shost);
1038 * This is a device reset. This is handled by sending a special command
1041 static int aha1542_dev_reset(Scsi_Cmnd * SCpnt)
1043 struct aha1542_hostdata *aha1542 = shost_priv(SCpnt->device->host);
1044 unsigned long flags;
1045 struct mailbox *mb = aha1542->mb;
1046 u8 target = SCpnt->device->id;
1047 u8 lun = SCpnt->device->lun;
1049 struct ccb *ccb = aha1542->ccb;
1051 spin_lock_irqsave(&aha1542_lock, flags);
1052 mbo = aha1542->aha1542_last_mbo_used + 1;
1053 if (mbo >= AHA1542_MAILBOXES)
1057 if (mb[mbo].status == 0 && aha1542->SCint[mbo] == NULL)
1060 if (mbo >= AHA1542_MAILBOXES)
1062 } while (mbo != aha1542->aha1542_last_mbo_used);
1064 if (mb[mbo].status || aha1542->SCint[mbo])
1065 panic("Unable to find empty mailbox for aha1542.\n");
1067 aha1542->SCint[mbo] = SCpnt; /* This will effectively
1068 prevent someone else from
1069 screwing with this cdb. */
1071 aha1542->aha1542_last_mbo_used = mbo;
1072 spin_unlock_irqrestore(&aha1542_lock, flags);
1074 any2scsi(mb[mbo].ccbptr, isa_virt_to_bus(&ccb[mbo])); /* This gets trashed for some reason */
1076 memset(&ccb[mbo], 0, sizeof(struct ccb));
1078 ccb[mbo].op = 0x81; /* BUS DEVICE RESET */
1080 ccb[mbo].idlun = (target & 7) << 5 | (lun & 7); /*SCSI Target Id */
1082 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
1083 ccb[mbo].commlinkid = 0;
1086 * Now tell the 1542 to flush all pending commands for this
1089 aha1542_outb(SCpnt->device->host->io_port, CMD_START_SCSI);
1091 scmd_printk(KERN_WARNING, SCpnt,
1092 "Trying device reset for target\n");
1097 static int aha1542_bus_reset(Scsi_Cmnd * SCpnt)
1099 struct aha1542_hostdata *aha1542 = shost_priv(SCpnt->device->host);
1103 * This does a scsi reset for all devices on the bus.
1104 * In principle, we could also reset the 1542 - should
1105 * we do this? Try this first, and we can add that later
1106 * if it turns out to be useful.
1108 outb(SCRST, CONTROL(SCpnt->device->host->io_port));
1111 * Wait for the thing to settle down a bit. Unfortunately
1112 * this is going to basically lock up the machine while we
1113 * wait for this to complete. To be 100% correct, we need to
1114 * check for timeout, and if we are doing something like this
1115 * we are pretty desperate anyways.
1119 spin_lock_irq(SCpnt->device->host->host_lock);
1121 if (!wait_mask(STATUS(SCpnt->device->host->io_port),
1122 STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0)) {
1123 spin_unlock_irq(SCpnt->device->host->host_lock);
1128 * Now try to pick up the pieces. For all pending commands,
1129 * free any internal data structures, and basically clear things
1130 * out. We do not try and restart any commands or anything -
1131 * the strategy handler takes care of that crap.
1133 printk(KERN_WARNING "Sent BUS RESET to scsi host %d\n", SCpnt->device->host->host_no);
1135 for (i = 0; i < AHA1542_MAILBOXES; i++) {
1136 if (aha1542->SCint[i] != NULL) {
1138 SCtmp = aha1542->SCint[i];
1141 if (SCtmp->device->soft_reset) {
1143 * If this device implements the soft reset option,
1144 * then it is still holding onto the command, and
1145 * may yet complete it. In this case, we don't
1150 kfree(SCtmp->host_scribble);
1151 SCtmp->host_scribble = NULL;
1152 aha1542->SCint[i] = NULL;
1153 aha1542->mb[i].status = 0;
1157 spin_unlock_irq(SCpnt->device->host->host_lock);
1161 static int aha1542_host_reset(Scsi_Cmnd * SCpnt)
1163 struct aha1542_hostdata *aha1542 = shost_priv(SCpnt->device->host);
1167 * This does a scsi reset for all devices on the bus.
1168 * In principle, we could also reset the 1542 - should
1169 * we do this? Try this first, and we can add that later
1170 * if it turns out to be useful.
1172 outb(HRST | SCRST, CONTROL(SCpnt->device->host->io_port));
1175 * Wait for the thing to settle down a bit. Unfortunately
1176 * this is going to basically lock up the machine while we
1177 * wait for this to complete. To be 100% correct, we need to
1178 * check for timeout, and if we are doing something like this
1179 * we are pretty desperate anyways.
1182 spin_lock_irq(SCpnt->device->host->host_lock);
1184 if (!wait_mask(STATUS(SCpnt->device->host->io_port),
1185 STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0)) {
1186 spin_unlock_irq(SCpnt->device->host->host_lock);
1190 * We need to do this too before the 1542 can interact with
1193 setup_mailboxes(SCpnt->device->host->io_port, SCpnt->device->host);
1196 * Now try to pick up the pieces. For all pending commands,
1197 * free any internal data structures, and basically clear things
1198 * out. We do not try and restart any commands or anything -
1199 * the strategy handler takes care of that crap.
1201 printk(KERN_WARNING "Sent BUS RESET to scsi host %d\n", SCpnt->device->host->host_no);
1203 for (i = 0; i < AHA1542_MAILBOXES; i++) {
1204 if (aha1542->SCint[i] != NULL) {
1206 SCtmp = aha1542->SCint[i];
1208 if (SCtmp->device->soft_reset) {
1210 * If this device implements the soft reset option,
1211 * then it is still holding onto the command, and
1212 * may yet complete it. In this case, we don't
1217 kfree(SCtmp->host_scribble);
1218 SCtmp->host_scribble = NULL;
1219 aha1542->SCint[i] = NULL;
1220 aha1542->mb[i].status = 0;
1224 spin_unlock_irq(SCpnt->device->host->host_lock);
1228 static int aha1542_biosparam(struct scsi_device *sdev,
1229 struct block_device *bdev, sector_t capacity, int *ip)
1231 struct aha1542_hostdata *aha1542 = shost_priv(sdev->host);
1232 int translation_algorithm;
1233 int size = capacity;
1235 translation_algorithm = aha1542->bios_translation;
1237 if ((size >> 11) > 1024 && translation_algorithm == BIOS_TRANSLATION_25563) {
1238 /* Please verify that this is the same as what DOS returns */
1241 ip[2] = size / 255 / 63;
1250 MODULE_LICENSE("GPL");
1252 static struct scsi_host_template driver_template = {
1253 .module = THIS_MODULE,
1254 .proc_name = "aha1542",
1255 .name = "Adaptec 1542",
1256 .queuecommand = aha1542_queuecommand,
1257 .eh_device_reset_handler= aha1542_dev_reset,
1258 .eh_bus_reset_handler = aha1542_bus_reset,
1259 .eh_host_reset_handler = aha1542_host_reset,
1260 .bios_param = aha1542_biosparam,
1261 .can_queue = AHA1542_MAILBOXES,
1265 .unchecked_isa_dma = 1,
1266 .use_clustering = ENABLE_CLUSTERING,
1269 static int aha1542_isa_match(struct device *pdev, unsigned int ndev)
1271 struct Scsi_Host *sh = aha1542_hw_init(&driver_template, pdev, ndev);
1276 dev_set_drvdata(pdev, sh);
1280 static int aha1542_isa_remove(struct device *pdev,
1283 aha1542_release(dev_get_drvdata(pdev));
1284 dev_set_drvdata(pdev, NULL);
1288 static struct isa_driver aha1542_isa_driver = {
1289 .match = aha1542_isa_match,
1290 .remove = aha1542_isa_remove,
1295 static int isa_registered;
1298 static struct pnp_device_id aha1542_pnp_ids[] = {
1299 { .id = "ADP1542" },
1302 MODULE_DEVICE_TABLE(pnp, aha1542_pnp_ids);
1304 static int aha1542_pnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *id)
1307 struct Scsi_Host *sh;
1309 for (indx = 0; indx < ARRAY_SIZE(bases); indx++) {
1313 if (pnp_activate_dev(pdev) < 0)
1316 bases[indx] = pnp_port_start(pdev, 0);
1318 /* The card can be queried for its DMA, we have
1319 the DMA set up that is enough */
1321 printk(KERN_INFO "ISAPnP found an AHA1535 at I/O 0x%03X\n", bases[indx]);
1324 sh = aha1542_hw_init(&driver_template, &pdev->dev, indx);
1328 pnp_set_drvdata(pdev, sh);
1332 static void aha1542_pnp_remove(struct pnp_dev *pdev)
1334 aha1542_release(pnp_get_drvdata(pdev));
1335 pnp_set_drvdata(pdev, NULL);
1338 static struct pnp_driver aha1542_pnp_driver = {
1340 .id_table = aha1542_pnp_ids,
1341 .probe = aha1542_pnp_probe,
1342 .remove = aha1542_pnp_remove,
1344 static int pnp_registered;
1345 #endif /* CONFIG_PNP */
1347 static int __init aha1542_init(void)
1353 bases[0] = aha1542[0];
1354 setup_buson[0] = aha1542[1];
1355 setup_busoff[0] = aha1542[2];
1357 switch (aha1542[3]) {
1374 setup_dmaspeed[0] = atbt;
1379 ret = pnp_register_driver(&aha1542_pnp_driver);
1384 ret = isa_register_driver(&aha1542_isa_driver, MAXBOARDS);
1398 static void __exit aha1542_exit(void)
1402 pnp_unregister_driver(&aha1542_pnp_driver);
1405 isa_unregister_driver(&aha1542_isa_driver);
1408 module_init(aha1542_init);
1409 module_exit(aha1542_exit);