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);
188 if (!wait_mask(INTRFLAGS(base), INTRMASK, HACC, 0, 0))
194 /* Only used at boot time, so we do not need to worry about latency as much
197 static int aha1542_in(unsigned int base, u8 *cmdp, int len, int timeout)
201 spin_lock_irqsave(&aha1542_lock, flags);
203 if (!wait_mask(STATUS(base), DF, DF, 0, timeout)) {
204 spin_unlock_irqrestore(&aha1542_lock, flags);
206 printk(KERN_ERR "aha1542_in failed(%d): ", len + 1);
209 *cmdp++ = inb(DATA(base));
211 spin_unlock_irqrestore(&aha1542_lock, flags);
215 static int makecode(unsigned hosterr, unsigned scsierr)
219 case 0xa: /* Linked command complete without error and linked normally */
220 case 0xb: /* Linked command complete without error, interrupt generated */
224 case 0x11: /* Selection time out-The initiator selection or target
225 reselection was not complete within the SCSI Time out period */
226 hosterr = DID_TIME_OUT;
229 case 0x12: /* Data overrun/underrun-The target attempted to transfer more data
230 than was allocated by the Data Length field or the sum of the
231 Scatter / Gather Data Length fields. */
233 case 0x13: /* Unexpected bus free-The target dropped the SCSI BSY at an unexpected time. */
235 case 0x15: /* MBO command was not 00, 01 or 02-The first byte of the CB was
236 invalid. This usually indicates a software failure. */
238 case 0x16: /* Invalid CCB Operation Code-The first byte of the CCB was invalid.
239 This usually indicates a software failure. */
241 case 0x17: /* Linked CCB does not have the same LUN-A subsequent CCB of a set
242 of linked CCB's does not specify the same logical unit number as
244 case 0x18: /* Invalid Target Direction received from Host-The direction of a
245 Target Mode CCB was invalid. */
247 case 0x19: /* Duplicate CCB Received in Target Mode-More than once CCB was
248 received to service data transfer between the same target LUN
249 and initiator SCSI ID in the same direction. */
251 case 0x1a: /* Invalid CCB or Segment List Parameter-A segment list with a zero
252 length segment or invalid segment list boundaries was received.
253 A CCB parameter was invalid. */
254 DEB(printk("Aha1542: %x %x\n", hosterr, scsierr));
255 hosterr = DID_ERROR; /* Couldn't find any better */
258 case 0x14: /* Target bus phase sequence failure-An invalid bus phase or bus
259 phase sequence was requested by the target. The host adapter
260 will generate a SCSI Reset Condition, notifying the host with
265 printk(KERN_ERR "aha1542: makecode: unknown hoststatus %x\n", hosterr);
268 return scsierr | (hosterr << 16);
271 static int aha1542_test_port(int bse, struct Scsi_Host *shpnt)
273 u8 inquiry_result[4];
277 /* Quick and dirty test for presence of the card. */
278 if (inb(STATUS(bse)) == 0xff)
281 /* Reset the adapter. I ought to make a hard reset, but it's not really necessary */
283 /* In case some other card was probing here, reset interrupts */
284 aha1542_intr_reset(bse); /* reset interrupts, so they don't block */
286 outb(SRST | IRST /*|SCRST */ , CONTROL(bse));
288 mdelay(20); /* Wait a little bit for things to settle down. */
290 /* Expect INIT and IDLE, any of the others are bad */
291 if (!wait_mask(STATUS(bse), STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0))
294 /* Shouldn't have generated any interrupts during reset */
295 if (inb(INTRFLAGS(bse)) & INTRMASK)
298 /* Perform a host adapter inquiry instead so we do not need to set
299 up the mailboxes ahead of time */
301 aha1542_outb(bse, CMD_INQUIRY);
304 cmdp = &inquiry_result[0];
307 if (!wait_mask(STATUS(bse), DF, DF, 0, 0))
309 *cmdp++ = inb(DATA(bse));
312 /* Reading port should reset DF */
313 if (inb(STATUS(bse)) & DF)
316 /* When HACC, command is completed, and we're though testing */
317 if (!wait_mask(INTRFLAGS(bse), HACC, HACC, 0, 0))
320 /* Clear interrupts */
321 outb(IRST, CONTROL(bse));
326 /* A "high" level interrupt handler */
327 static void aha1542_intr_handle(struct Scsi_Host *shost)
329 struct aha1542_hostdata *aha1542 = shost_priv(shost);
330 void (*my_done) (Scsi_Cmnd *) = NULL;
331 int errstatus, mbi, mbo, mbistatus;
336 struct mailbox *mb = aha1542->mb;
337 struct ccb *ccb = aha1542->ccb;
341 flag = inb(INTRFLAGS(shost->io_port));
342 printk(KERN_DEBUG "aha1542_intr_handle: ");
343 if (!(flag & ANYINTR))
344 printk("no interrupt?");
353 printk("status %02x\n", inb(STATUS(shost->io_port)));
359 flag = inb(INTRFLAGS(shost->io_port));
361 /* Check for unusual interrupts. If any of these happen, we should
362 probably do something special, but for now just printing a message
363 is sufficient. A SCSI reset detected is something that we really
364 need to deal with in some way. */
373 aha1542_intr_reset(shost->io_port);
375 spin_lock_irqsave(&aha1542_lock, flags);
376 mbi = aha1542->aha1542_last_mbi_used + 1;
377 if (mbi >= 2 * AHA1542_MAILBOXES)
378 mbi = AHA1542_MAILBOXES;
381 if (mb[mbi].status != 0)
384 if (mbi >= 2 * AHA1542_MAILBOXES)
385 mbi = AHA1542_MAILBOXES;
386 } while (mbi != aha1542->aha1542_last_mbi_used);
388 if (mb[mbi].status == 0) {
389 spin_unlock_irqrestore(&aha1542_lock, flags);
390 /* Hmm, no mail. Must have read it the last time around */
391 if (!number_serviced)
392 printk(KERN_WARNING "aha1542.c: interrupt received, but no mail.\n");
396 mbo = (scsi2int(mb[mbi].ccbptr) - (isa_virt_to_bus(&ccb[0]))) / sizeof(struct ccb);
397 mbistatus = mb[mbi].status;
399 aha1542->aha1542_last_mbi_used = mbi;
400 spin_unlock_irqrestore(&aha1542_lock, flags);
404 if (ccb[mbo].tarstat | ccb[mbo].hastat)
405 printk(KERN_DEBUG "aha1542_command: returning %x (status %d)\n",
406 ccb[mbo].tarstat + ((int) ccb[mbo].hastat << 16), mb[mbi].status);
411 continue; /* Aborted command not found */
414 printk(KERN_DEBUG "...done %d %d\n", mbo, mbi);
417 SCtmp = aha1542->SCint[mbo];
419 if (!SCtmp || !SCtmp->scsi_done) {
420 printk(KERN_WARNING "aha1542_intr_handle: Unexpected interrupt\n");
421 printk(KERN_WARNING "tarstat=%x, hastat=%x idlun=%x ccb#=%d \n", ccb[mbo].tarstat,
422 ccb[mbo].hastat, ccb[mbo].idlun, mbo);
425 my_done = SCtmp->scsi_done;
426 kfree(SCtmp->host_scribble);
427 SCtmp->host_scribble = NULL;
428 /* Fetch the sense data, and tuck it away, in the required slot. The
429 Adaptec automatically fetches it, and there is no guarantee that
430 we will still have it in the cdb when we come back */
431 if (ccb[mbo].tarstat == 2)
432 memcpy(SCtmp->sense_buffer, &ccb[mbo].cdb[ccb[mbo].cdblen],
433 SCSI_SENSE_BUFFERSIZE);
436 /* is there mail :-) */
438 /* more error checking left out here */
440 /* This is surely wrong, but I don't know what's right */
441 errstatus = makecode(ccb[mbo].hastat, ccb[mbo].tarstat);
447 printk(KERN_DEBUG "(aha1542 error:%x %x %x) ", errstatus,
448 ccb[mbo].hastat, ccb[mbo].tarstat);
451 if (ccb[mbo].tarstat == 2) {
455 DEB(printk("aha1542_intr_handle: sense:"));
457 for (i = 0; i < 12; i++)
458 printk("%02x ", ccb[mbo].cdb[ccb[mbo].cdblen + i]);
462 DEB(printk("aha1542_intr_handle: buf:"));
463 for (i = 0; i < bufflen; i++)
464 printk("%02x ", ((unchar *)buff)[i]);
468 DEB(if (errstatus) printk("aha1542_intr_handle: returning %6x\n", errstatus));
469 SCtmp->result = errstatus;
470 aha1542->SCint[mbo] = NULL; /* This effectively frees up the mailbox slot, as
471 far as queuecommand is concerned */
477 /* A quick wrapper for do_aha1542_intr_handle to grab the spin lock */
478 static irqreturn_t do_aha1542_intr_handle(int dummy, void *dev_id)
481 struct Scsi_Host *shost = dev_id;
483 spin_lock_irqsave(shost->host_lock, flags);
484 aha1542_intr_handle(shost);
485 spin_unlock_irqrestore(shost->host_lock, flags);
489 static int aha1542_queuecommand_lck(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *))
491 struct aha1542_hostdata *aha1542 = shost_priv(SCpnt->device->host);
493 u8 *cmd = (u8 *) SCpnt->cmnd;
494 u8 target = SCpnt->device->id;
495 u8 lun = SCpnt->device->lun;
497 int bufflen = scsi_bufflen(SCpnt);
499 struct mailbox *mb = aha1542->mb;
500 struct ccb *ccb = aha1542->ccb;
504 DEB(if (target > 1) {
505 SCpnt->result = DID_TIME_OUT << 16;
506 done(SCpnt); return 0;
510 if (*cmd == REQUEST_SENSE) {
511 /* Don't do the command - we have the sense data already */
517 if (*cmd == READ_10 || *cmd == WRITE_10)
518 i = xscsi2int(cmd + 2);
519 else if (*cmd == READ_6 || *cmd == WRITE_6)
520 i = scsi2int(cmd + 2);
524 printk(KERN_DEBUG "aha1542_queuecommand: dev %d cmd %02x pos %d len %d ", target, *cmd, i, bufflen);
526 printk(KERN_DEBUG "aha1542_command: dev %d cmd %02x pos %d len %d ", target, *cmd, i, bufflen);
527 printk(KERN_DEBUG "aha1542_queuecommand: dumping scsi cmd:");
528 for (i = 0; i < SCpnt->cmd_len; i++)
529 printk("%02x ", cmd[i]);
531 if (*cmd == WRITE_10 || *cmd == WRITE_6)
532 return 0; /* we are still testing, so *don't* write */
534 /* Use the outgoing mailboxes in a round-robin fashion, because this
535 is how the host adapter will scan for them */
537 spin_lock_irqsave(&aha1542_lock, flags);
538 mbo = aha1542->aha1542_last_mbo_used + 1;
539 if (mbo >= AHA1542_MAILBOXES)
543 if (mb[mbo].status == 0 && aha1542->SCint[mbo] == NULL)
546 if (mbo >= AHA1542_MAILBOXES)
548 } while (mbo != aha1542->aha1542_last_mbo_used);
550 if (mb[mbo].status || aha1542->SCint[mbo])
551 panic("Unable to find empty mailbox for aha1542.\n");
553 aha1542->SCint[mbo] = SCpnt; /* This will effectively prevent someone else from
554 screwing with this cdb. */
556 aha1542->aha1542_last_mbo_used = mbo;
557 spin_unlock_irqrestore(&aha1542_lock, flags);
560 printk(KERN_DEBUG "Sending command (%d %x)...", mbo, done);
563 any2scsi(mb[mbo].ccbptr, isa_virt_to_bus(&ccb[mbo])); /* This gets trashed for some reason */
565 memset(&ccb[mbo], 0, sizeof(struct ccb));
567 ccb[mbo].cdblen = SCpnt->cmd_len;
570 if (*cmd == READ_10 || *cmd == READ_6)
572 else if (*cmd == WRITE_10 || *cmd == WRITE_6)
575 memcpy(ccb[mbo].cdb, cmd, ccb[mbo].cdblen);
578 struct scatterlist *sg;
583 int i, sg_count = scsi_sg_count(SCpnt);
584 ccb[mbo].op = 2; /* SCSI Initiator Command w/scatter-gather */
585 SCpnt->host_scribble = kmalloc(sizeof(*cptr)*sg_count,
586 GFP_KERNEL | GFP_DMA);
587 cptr = (struct chain *) SCpnt->host_scribble;
589 /* free the claimed mailbox slot */
590 aha1542->SCint[mbo] = NULL;
591 return SCSI_MLQUEUE_HOST_BUSY;
593 scsi_for_each_sg(SCpnt, sg, sg_count, i) {
594 any2scsi(cptr[i].dataptr, isa_page_to_bus(sg_page(sg))
596 any2scsi(cptr[i].datalen, sg->length);
598 any2scsi(ccb[mbo].datalen, sg_count * sizeof(struct chain));
599 any2scsi(ccb[mbo].dataptr, isa_virt_to_bus(cptr));
601 printk("cptr %x: ", cptr);
602 ptr = (unsigned char *) cptr;
603 for (i = 0; i < 18; i++)
604 printk("%02x ", ptr[i]);
607 ccb[mbo].op = 0; /* SCSI Initiator Command */
608 SCpnt->host_scribble = NULL;
609 any2scsi(ccb[mbo].datalen, 0);
610 any2scsi(ccb[mbo].dataptr, 0);
612 ccb[mbo].idlun = (target & 7) << 5 | direction | (lun & 7); /*SCSI Target Id */
613 ccb[mbo].rsalen = 16;
614 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
615 ccb[mbo].commlinkid = 0;
620 printk(KERN_DEBUG "aha1542_command: sending.. ");
621 for (i = 0; i < sizeof(ccb[mbo]) - 10; i++)
622 printk("%02x ", ((u8 *) &ccb[mbo])[i]);
627 DEB(printk("aha1542_queuecommand: now waiting for interrupt "));
628 SCpnt->scsi_done = done;
630 aha1542_outb(SCpnt->device->host->io_port, CMD_START_SCSI);
632 printk("aha1542_queuecommand: done can't be NULL\n");
637 static DEF_SCSI_QCMD(aha1542_queuecommand)
639 /* Initialize mailboxes */
640 static void setup_mailboxes(int bse, struct Scsi_Host *shpnt)
642 struct aha1542_hostdata *aha1542 = shost_priv(shpnt);
644 struct mailbox *mb = aha1542->mb;
645 struct ccb *ccb = aha1542->ccb;
647 u8 cmd[5] = { CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0};
649 for (i = 0; i < AHA1542_MAILBOXES; i++) {
650 mb[i].status = mb[AHA1542_MAILBOXES + i].status = 0;
651 any2scsi(mb[i].ccbptr, isa_virt_to_bus(&ccb[i]));
653 aha1542_intr_reset(bse); /* reset interrupts, so they don't block */
654 any2scsi((cmd + 2), isa_virt_to_bus(mb));
655 if (aha1542_out(bse, cmd, 5))
656 printk(KERN_ERR "aha1542_detect: failed setting up mailboxes\n");
657 aha1542_intr_reset(bse);
660 static int aha1542_getconfig(int base_io, unsigned char *irq_level, unsigned char *dma_chan, unsigned char *scsi_id)
662 u8 inquiry_result[3];
664 i = inb(STATUS(base_io));
666 i = inb(DATA(base_io));
668 aha1542_outb(base_io, CMD_RETCONF);
669 aha1542_in(base_io, inquiry_result, 3, 0);
670 if (!wait_mask(INTRFLAGS(base_io), INTRMASK, HACC, 0, 0))
671 printk(KERN_ERR "aha1542_detect: query board settings\n");
672 aha1542_intr_reset(base_io);
673 switch (inquiry_result[0]) {
687 /* This means that the adapter, although Adaptec 1542 compatible, doesn't use a DMA channel.
688 Currently only aware of the BusLogic BT-445S VL-Bus adapter which needs this. */
692 printk(KERN_ERR "Unable to determine Adaptec DMA priority. Disabling board\n");
695 switch (inquiry_result[1]) {
715 printk(KERN_ERR "Unable to determine Adaptec IRQ level. Disabling board\n");
718 *scsi_id = inquiry_result[2] & 7;
722 /* This function should only be called for 1542C boards - we can detect
723 the special firmware settings and unlock the board */
725 static int aha1542_mbenable(int base)
727 static u8 mbenable_cmd[3];
728 static u8 mbenable_result[2];
731 retval = BIOS_TRANSLATION_6432;
733 aha1542_outb(base, CMD_EXTBIOS);
734 if (aha1542_in(base, mbenable_result, 2, 100))
736 if (!wait_mask(INTRFLAGS(base), INTRMASK, HACC, 0, 100))
738 aha1542_intr_reset(base);
740 if ((mbenable_result[0] & 0x08) || mbenable_result[1]) {
741 mbenable_cmd[0] = CMD_MBENABLE;
743 mbenable_cmd[2] = mbenable_result[1];
745 if ((mbenable_result[0] & 0x08) && (mbenable_result[1] & 0x03))
746 retval = BIOS_TRANSLATION_25563;
748 if (aha1542_out(base, mbenable_cmd, 3))
753 printk(KERN_ERR "aha1542_mbenable: Mailbox init failed\n");
755 aha1542_intr_reset(base);
759 /* Query the board to find out if it is a 1542 or a 1740, or whatever. */
760 static int aha1542_query(int base_io, int *transl)
762 u8 inquiry_result[4];
764 i = inb(STATUS(base_io));
766 i = inb(DATA(base_io));
768 aha1542_outb(base_io, CMD_INQUIRY);
769 aha1542_in(base_io, inquiry_result, 4, 0);
770 if (!wait_mask(INTRFLAGS(base_io), INTRMASK, HACC, 0, 0))
771 printk(KERN_ERR "aha1542_detect: query card type\n");
772 aha1542_intr_reset(base_io);
774 *transl = BIOS_TRANSLATION_6432; /* Default case */
776 /* For an AHA1740 series board, we ignore the board since there is a
777 hardware bug which can lead to wrong blocks being returned if the board
778 is operating in the 1542 emulation mode. Since there is an extended mode
779 driver, we simply ignore the board and let the 1740 driver pick it up.
782 if (inquiry_result[0] == 0x43) {
783 printk(KERN_INFO "aha1542.c: Emulation mode not supported for AHA 174N hardware.\n");
787 /* Always call this - boards that do not support extended bios translation
788 will ignore the command, and we will set the proper default */
790 *transl = aha1542_mbenable(base_io);
796 static char *setup_str[MAXBOARDS] __initdata;
797 static int setup_idx = 0;
799 static void __init aha1542_setup(char *str, int *ints)
801 const char *ahausage = "aha1542: usage: aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]\n";
804 if (setup_idx >= MAXBOARDS) {
805 printk(KERN_ERR "aha1542: aha1542_setup called too many times! Bad LILO params ?\n");
806 printk(KERN_ERR " Entryline 1: %s\n", setup_str[0]);
807 printk(KERN_ERR " Entryline 2: %s\n", setup_str[1]);
808 printk(KERN_ERR " This line: %s\n", str);
811 if (ints[0] < 1 || ints[0] > 4) {
812 printk(KERN_ERR "aha1542: %s\n", str);
814 printk(KERN_ERR "aha1542: Wrong parameters may cause system malfunction.. We try anyway..\n");
816 setup_called[setup_idx] = ints[0];
817 setup_str[setup_idx] = str;
819 setup_portbase = ints[0] >= 1 ? ints[1] : 0; /* Preserve the default value.. */
820 setup_buson[setup_idx] = ints[0] >= 2 ? ints[2] : 7;
821 setup_busoff[setup_idx] = ints[0] >= 3 ? ints[3] : 5;
842 printk(KERN_ERR "aha1542: %s\n", str);
844 printk(KERN_ERR "aha1542: Valid values for DMASPEED are 5-8, 10 MB/s. Using jumper defaults.\n");
847 setup_dmaspeed[setup_idx] = atbt;
849 if (setup_portbase != 0)
850 bases[setup_idx] = setup_portbase;
855 static int __init do_setup(char *str)
861 get_options(str, ARRAY_SIZE(ints), ints);
862 aha1542_setup(str,ints);
864 return count<setup_idx;
867 __setup("aha1542=",do_setup);
870 /* Set the Bus on/off-times as not to ruin floppy performance */
871 static void aha1542_set_bus_times(int indx)
873 unsigned int base_io = bases[indx];
874 u8 oncmd[] = {CMD_BUSON_TIME, 7};
875 u8 offcmd[] = {CMD_BUSOFF_TIME, 5};
877 if (setup_called[indx]) {
878 oncmd[1] = setup_buson[indx];
879 offcmd[1] = setup_busoff[indx];
881 aha1542_intr_reset(base_io);
882 if (aha1542_out(base_io, oncmd, 2))
884 aha1542_intr_reset(base_io);
885 if (aha1542_out(base_io, offcmd, 2))
887 if (setup_dmaspeed[indx] >= 0) {
888 u8 dmacmd[] = {CMD_DMASPEED, 0};
889 dmacmd[1] = setup_dmaspeed[indx];
890 aha1542_intr_reset(base_io);
891 if (aha1542_out(base_io, dmacmd, 2))
894 aha1542_intr_reset(base_io);
897 printk(KERN_ERR "setting bus on/off-time failed\n");
898 aha1542_intr_reset(base_io);
901 /* return non-zero on detection */
902 static struct Scsi_Host *aha1542_hw_init(struct scsi_host_template *tpnt, struct device *pdev, int indx)
904 unsigned char dma_chan;
905 unsigned char irq_level;
906 unsigned char scsi_id;
908 unsigned int base_io;
910 struct Scsi_Host *shpnt = NULL;
911 struct aha1542_hostdata *aha1542;
913 DEB(printk("aha1542_detect: \n"));
915 tpnt->proc_name = "aha1542";
917 if (bases[indx] != 0 && request_region(bases[indx], 4, "aha1542")) {
918 shpnt = scsi_host_alloc(tpnt,
919 sizeof(struct aha1542_hostdata));
922 release_region(bases[indx], 4);
925 aha1542 = shost_priv(shpnt);
926 if (!aha1542_test_port(bases[indx], shpnt))
929 base_io = bases[indx];
931 aha1542_set_bus_times(indx);
933 if (aha1542_query(base_io, &trans))
936 if (aha1542_getconfig(base_io, &irq_level, &dma_chan, &scsi_id) == -1)
939 printk(KERN_INFO "Configuring Adaptec (SCSI-ID %d) at IO:%x, IRQ %d", scsi_id, base_io, irq_level);
940 if (dma_chan != 0xFF)
941 printk(", DMA priority %d", dma_chan);
944 setup_mailboxes(base_io, shpnt);
946 DEB(printk("aha1542_detect: enable interrupt channel %d\n", irq_level));
947 spin_lock_irqsave(&aha1542_lock, flags);
948 if (request_irq(irq_level, do_aha1542_intr_handle, 0,
950 printk(KERN_ERR "Unable to allocate IRQ for adaptec controller.\n");
951 spin_unlock_irqrestore(&aha1542_lock, flags);
954 if (dma_chan != 0xFF) {
955 if (request_dma(dma_chan, "aha1542")) {
956 printk(KERN_ERR "Unable to allocate DMA channel for Adaptec.\n");
957 free_irq(irq_level, shpnt);
958 spin_unlock_irqrestore(&aha1542_lock, flags);
961 if (dma_chan == 0 || dma_chan >= 5) {
962 set_dma_mode(dma_chan, DMA_MODE_CASCADE);
963 enable_dma(dma_chan);
967 shpnt->this_id = scsi_id;
968 shpnt->unique_id = base_io;
969 shpnt->io_port = base_io;
970 shpnt->n_io_port = 4; /* Number of bytes of I/O space used */
971 shpnt->dma_channel = dma_chan;
972 shpnt->irq = irq_level;
973 aha1542->bios_translation = trans;
974 if (trans == BIOS_TRANSLATION_25563)
975 printk(KERN_INFO "aha1542.c: Using extended bios translation\n");
976 aha1542->aha1542_last_mbi_used = (2 * AHA1542_MAILBOXES - 1);
977 aha1542->aha1542_last_mbo_used = (AHA1542_MAILBOXES - 1);
978 memset(aha1542->SCint, 0, sizeof(aha1542->SCint));
979 spin_unlock_irqrestore(&aha1542_lock, flags);
981 if (scsi_add_host(shpnt, pdev)) {
982 if (shpnt->dma_channel != 0xff)
983 free_dma(shpnt->dma_channel);
984 free_irq(irq_level, shpnt);
988 scsi_scan_host(shpnt);
992 release_region(bases[indx], 4);
993 scsi_host_put(shpnt);
1001 static int aha1542_release(struct Scsi_Host *shost)
1003 scsi_remove_host(shost);
1005 free_irq(shost->irq, shost);
1006 if (shost->dma_channel != 0xff)
1007 free_dma(shost->dma_channel);
1008 if (shost->io_port && shost->n_io_port)
1009 release_region(shost->io_port, shost->n_io_port);
1010 scsi_host_put(shost);
1016 * This is a device reset. This is handled by sending a special command
1019 static int aha1542_dev_reset(Scsi_Cmnd * SCpnt)
1021 struct aha1542_hostdata *aha1542 = shost_priv(SCpnt->device->host);
1022 unsigned long flags;
1023 struct mailbox *mb = aha1542->mb;
1024 u8 target = SCpnt->device->id;
1025 u8 lun = SCpnt->device->lun;
1027 struct ccb *ccb = aha1542->ccb;
1029 spin_lock_irqsave(&aha1542_lock, flags);
1030 mbo = aha1542->aha1542_last_mbo_used + 1;
1031 if (mbo >= AHA1542_MAILBOXES)
1035 if (mb[mbo].status == 0 && aha1542->SCint[mbo] == NULL)
1038 if (mbo >= AHA1542_MAILBOXES)
1040 } while (mbo != aha1542->aha1542_last_mbo_used);
1042 if (mb[mbo].status || aha1542->SCint[mbo])
1043 panic("Unable to find empty mailbox for aha1542.\n");
1045 aha1542->SCint[mbo] = SCpnt; /* This will effectively
1046 prevent someone else from
1047 screwing with this cdb. */
1049 aha1542->aha1542_last_mbo_used = mbo;
1050 spin_unlock_irqrestore(&aha1542_lock, flags);
1052 any2scsi(mb[mbo].ccbptr, isa_virt_to_bus(&ccb[mbo])); /* This gets trashed for some reason */
1054 memset(&ccb[mbo], 0, sizeof(struct ccb));
1056 ccb[mbo].op = 0x81; /* BUS DEVICE RESET */
1058 ccb[mbo].idlun = (target & 7) << 5 | (lun & 7); /*SCSI Target Id */
1060 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
1061 ccb[mbo].commlinkid = 0;
1064 * Now tell the 1542 to flush all pending commands for this
1067 aha1542_outb(SCpnt->device->host->io_port, CMD_START_SCSI);
1069 scmd_printk(KERN_WARNING, SCpnt,
1070 "Trying device reset for target\n");
1075 static int aha1542_reset(Scsi_Cmnd *SCpnt, u8 reset_cmd)
1077 struct aha1542_hostdata *aha1542 = shost_priv(SCpnt->device->host);
1081 * This does a scsi reset for all devices on the bus.
1082 * In principle, we could also reset the 1542 - should
1083 * we do this? Try this first, and we can add that later
1084 * if it turns out to be useful.
1086 outb(reset_cmd, CONTROL(SCpnt->device->host->io_port));
1089 * Wait for the thing to settle down a bit. Unfortunately
1090 * this is going to basically lock up the machine while we
1091 * wait for this to complete. To be 100% correct, we need to
1092 * check for timeout, and if we are doing something like this
1093 * we are pretty desperate anyways.
1096 spin_lock_irq(SCpnt->device->host->host_lock);
1098 if (!wait_mask(STATUS(SCpnt->device->host->io_port),
1099 STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0)) {
1100 spin_unlock_irq(SCpnt->device->host->host_lock);
1104 * We need to do this too before the 1542 can interact with
1105 * us again after host reset.
1107 if (reset_cmd & HRST)
1108 setup_mailboxes(SCpnt->device->host->io_port, SCpnt->device->host);
1110 * Now try to pick up the pieces. For all pending commands,
1111 * free any internal data structures, and basically clear things
1112 * out. We do not try and restart any commands or anything -
1113 * the strategy handler takes care of that crap.
1115 printk(KERN_WARNING "Sent BUS RESET to scsi host %d\n", SCpnt->device->host->host_no);
1117 for (i = 0; i < AHA1542_MAILBOXES; i++) {
1118 if (aha1542->SCint[i] != NULL) {
1120 SCtmp = aha1542->SCint[i];
1122 if (SCtmp->device->soft_reset) {
1124 * If this device implements the soft reset option,
1125 * then it is still holding onto the command, and
1126 * may yet complete it. In this case, we don't
1131 kfree(SCtmp->host_scribble);
1132 SCtmp->host_scribble = NULL;
1133 aha1542->SCint[i] = NULL;
1134 aha1542->mb[i].status = 0;
1138 spin_unlock_irq(SCpnt->device->host->host_lock);
1142 static int aha1542_bus_reset(Scsi_Cmnd *SCpnt)
1144 return aha1542_reset(SCpnt, SCRST);
1147 static int aha1542_host_reset(Scsi_Cmnd *SCpnt)
1149 return aha1542_reset(SCpnt, HRST | SCRST);
1152 static int aha1542_biosparam(struct scsi_device *sdev,
1153 struct block_device *bdev, sector_t capacity, int *ip)
1155 struct aha1542_hostdata *aha1542 = shost_priv(sdev->host);
1156 int translation_algorithm;
1157 int size = capacity;
1159 translation_algorithm = aha1542->bios_translation;
1161 if ((size >> 11) > 1024 && translation_algorithm == BIOS_TRANSLATION_25563) {
1162 /* Please verify that this is the same as what DOS returns */
1165 ip[2] = size / 255 / 63;
1174 MODULE_LICENSE("GPL");
1176 static struct scsi_host_template driver_template = {
1177 .module = THIS_MODULE,
1178 .proc_name = "aha1542",
1179 .name = "Adaptec 1542",
1180 .queuecommand = aha1542_queuecommand,
1181 .eh_device_reset_handler= aha1542_dev_reset,
1182 .eh_bus_reset_handler = aha1542_bus_reset,
1183 .eh_host_reset_handler = aha1542_host_reset,
1184 .bios_param = aha1542_biosparam,
1185 .can_queue = AHA1542_MAILBOXES,
1189 .unchecked_isa_dma = 1,
1190 .use_clustering = ENABLE_CLUSTERING,
1193 static int aha1542_isa_match(struct device *pdev, unsigned int ndev)
1195 struct Scsi_Host *sh = aha1542_hw_init(&driver_template, pdev, ndev);
1200 dev_set_drvdata(pdev, sh);
1204 static int aha1542_isa_remove(struct device *pdev,
1207 aha1542_release(dev_get_drvdata(pdev));
1208 dev_set_drvdata(pdev, NULL);
1212 static struct isa_driver aha1542_isa_driver = {
1213 .match = aha1542_isa_match,
1214 .remove = aha1542_isa_remove,
1219 static int isa_registered;
1222 static struct pnp_device_id aha1542_pnp_ids[] = {
1223 { .id = "ADP1542" },
1226 MODULE_DEVICE_TABLE(pnp, aha1542_pnp_ids);
1228 static int aha1542_pnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *id)
1231 struct Scsi_Host *sh;
1233 for (indx = 0; indx < ARRAY_SIZE(bases); indx++) {
1237 if (pnp_activate_dev(pdev) < 0)
1240 bases[indx] = pnp_port_start(pdev, 0);
1242 /* The card can be queried for its DMA, we have
1243 the DMA set up that is enough */
1245 printk(KERN_INFO "ISAPnP found an AHA1535 at I/O 0x%03X\n", bases[indx]);
1248 sh = aha1542_hw_init(&driver_template, &pdev->dev, indx);
1252 pnp_set_drvdata(pdev, sh);
1256 static void aha1542_pnp_remove(struct pnp_dev *pdev)
1258 aha1542_release(pnp_get_drvdata(pdev));
1259 pnp_set_drvdata(pdev, NULL);
1262 static struct pnp_driver aha1542_pnp_driver = {
1264 .id_table = aha1542_pnp_ids,
1265 .probe = aha1542_pnp_probe,
1266 .remove = aha1542_pnp_remove,
1268 static int pnp_registered;
1269 #endif /* CONFIG_PNP */
1271 static int __init aha1542_init(void)
1277 bases[0] = aha1542[0];
1278 setup_buson[0] = aha1542[1];
1279 setup_busoff[0] = aha1542[2];
1281 switch (aha1542[3]) {
1298 setup_dmaspeed[0] = atbt;
1303 ret = pnp_register_driver(&aha1542_pnp_driver);
1308 ret = isa_register_driver(&aha1542_isa_driver, MAXBOARDS);
1322 static void __exit aha1542_exit(void)
1326 pnp_unregister_driver(&aha1542_pnp_driver);
1329 isa_unregister_driver(&aha1542_isa_driver);
1332 module_init(aha1542_init);
1333 module_exit(aha1542_exit);