1 // SPDX-License-Identifier: GPL-2.0-only
3 * Driver for Adaptec AHA-1542 SCSI host adapters
5 * Copyright (C) 1992 Tommy Thorn
6 * Copyright (C) 1993, 1994, 1995 Eric Youngdale
7 * Copyright (C) 2015 Ondrej Zary
10 #include <linux/module.h>
11 #include <linux/interrupt.h>
12 #include <linux/kernel.h>
13 #include <linux/types.h>
14 #include <linux/string.h>
15 #include <linux/delay.h>
16 #include <linux/init.h>
17 #include <linux/spinlock.h>
18 #include <linux/isa.h>
19 #include <linux/pnp.h>
20 #include <linux/slab.h>
23 #include <scsi/scsi_cmnd.h>
24 #include <scsi/scsi_device.h>
25 #include <scsi/scsi_host.h>
30 static bool isapnp
= 1;
31 module_param(isapnp
, bool, 0);
32 MODULE_PARM_DESC(isapnp
, "enable PnP support (default=1)");
34 static int io
[MAXBOARDS
] = { 0x330, 0x334, 0, 0 };
35 module_param_hw_array(io
, int, ioport
, NULL
, 0);
36 MODULE_PARM_DESC(io
, "base IO address of controller (0x130,0x134,0x230,0x234,0x330,0x334, default=0x330,0x334)");
38 /* time AHA spends on the AT-bus during data transfer */
39 static int bus_on
[MAXBOARDS
] = { -1, -1, -1, -1 }; /* power-on default: 11us */
40 module_param_array(bus_on
, int, NULL
, 0);
41 MODULE_PARM_DESC(bus_on
, "bus on time [us] (2-15, default=-1 [HW default: 11])");
43 /* time AHA spends off the bus (not to monopolize it) during data transfer */
44 static int bus_off
[MAXBOARDS
] = { -1, -1, -1, -1 }; /* power-on default: 4us */
45 module_param_array(bus_off
, int, NULL
, 0);
46 MODULE_PARM_DESC(bus_off
, "bus off time [us] (1-64, default=-1 [HW default: 4])");
48 /* default is jumper selected (J1 on 1542A), factory default = 5 MB/s */
49 static int dma_speed
[MAXBOARDS
] = { -1, -1, -1, -1 };
50 module_param_array(dma_speed
, int, NULL
, 0);
51 MODULE_PARM_DESC(dma_speed
, "DMA speed [MB/s] (5,6,7,8,10, default=-1 [by jumper])");
53 #define BIOS_TRANSLATION_6432 1 /* Default case these days */
54 #define BIOS_TRANSLATION_25563 2 /* Big disk case */
56 struct aha1542_hostdata
{
57 /* This will effectively start both of them at the first mailbox */
58 int bios_translation
; /* Mapping bios uses - for compatibility */
59 int aha1542_last_mbi_used
;
60 int aha1542_last_mbo_used
;
61 struct scsi_cmnd
*int_cmds
[AHA1542_MAILBOXES
];
65 dma_addr_t ccb_handle
;
68 #define AHA1542_MAX_SECTORS 16
73 dma_addr_t data_buffer_handle
;
76 static inline void aha1542_intr_reset(u16 base
)
78 outb(IRST
, CONTROL(base
));
81 static inline bool wait_mask(u16 port
, u8 mask
, u8 allof
, u8 noneof
, int timeout
)
91 u8 bits
= inb(port
) & mask
;
92 if ((bits
& allof
) == allof
&& ((bits
& noneof
) == 0))
103 static int aha1542_outb(unsigned int base
, u8 val
)
105 if (!wait_mask(STATUS(base
), CDF
, 0, CDF
, 0))
107 outb(val
, DATA(base
));
112 static int aha1542_out(unsigned int base
, u8
*buf
, int len
)
115 if (!wait_mask(STATUS(base
), CDF
, 0, CDF
, 0))
117 outb(*buf
++, DATA(base
));
119 if (!wait_mask(INTRFLAGS(base
), INTRMASK
, HACC
, 0, 0))
126 * Only used at boot time, so we do not need to worry about latency as much
130 static int aha1542_in(unsigned int base
, u8
*buf
, int len
, int timeout
)
133 if (!wait_mask(STATUS(base
), DF
, DF
, 0, timeout
))
135 *buf
++ = inb(DATA(base
));
140 static int makecode(unsigned hosterr
, unsigned scsierr
)
144 case 0xa: /* Linked command complete without error and linked normally */
145 case 0xb: /* Linked command complete without error, interrupt generated */
149 case 0x11: /* Selection time out-The initiator selection or target
150 * reselection was not complete within the SCSI Time out period
152 hosterr
= DID_TIME_OUT
;
155 case 0x12: /* Data overrun/underrun-The target attempted to transfer more data
156 * than was allocated by the Data Length field or the sum of the
157 * Scatter / Gather Data Length fields.
160 case 0x13: /* Unexpected bus free-The target dropped the SCSI BSY at an unexpected time. */
162 case 0x15: /* MBO command was not 00, 01 or 02-The first byte of the CB was
163 * invalid. This usually indicates a software failure.
166 case 0x16: /* Invalid CCB Operation Code-The first byte of the CCB was invalid.
167 * This usually indicates a software failure.
170 case 0x17: /* Linked CCB does not have the same LUN-A subsequent CCB of a set
171 * of linked CCB's does not specify the same logical unit number as
174 case 0x18: /* Invalid Target Direction received from Host-The direction of a
175 * Target Mode CCB was invalid.
178 case 0x19: /* Duplicate CCB Received in Target Mode-More than once CCB was
179 * received to service data transfer between the same target LUN
180 * and initiator SCSI ID in the same direction.
183 case 0x1a: /* Invalid CCB or Segment List Parameter-A segment list with a zero
184 * length segment or invalid segment list boundaries was received.
185 * A CCB parameter was invalid.
188 printk("Aha1542: %x %x\n", hosterr
, scsierr
);
190 hosterr
= DID_ERROR
; /* Couldn't find any better */
193 case 0x14: /* Target bus phase sequence failure-An invalid bus phase or bus
194 * phase sequence was requested by the target. The host adapter
195 * will generate a SCSI Reset Condition, notifying the host with
201 printk(KERN_ERR
"aha1542: makecode: unknown hoststatus %x\n", hosterr
);
204 return scsierr
| (hosterr
<< 16);
207 static int aha1542_test_port(struct Scsi_Host
*sh
)
211 /* Quick and dirty test for presence of the card. */
212 if (inb(STATUS(sh
->io_port
)) == 0xff)
215 /* Reset the adapter. I ought to make a hard reset, but it's not really necessary */
217 /* In case some other card was probing here, reset interrupts */
218 aha1542_intr_reset(sh
->io_port
); /* reset interrupts, so they don't block */
220 outb(SRST
| IRST
/*|SCRST */ , CONTROL(sh
->io_port
));
222 mdelay(20); /* Wait a little bit for things to settle down. */
224 /* Expect INIT and IDLE, any of the others are bad */
225 if (!wait_mask(STATUS(sh
->io_port
), STATMASK
, INIT
| IDLE
, STST
| DIAGF
| INVDCMD
| DF
| CDF
, 0))
228 /* Shouldn't have generated any interrupts during reset */
229 if (inb(INTRFLAGS(sh
->io_port
)) & INTRMASK
)
233 * Perform a host adapter inquiry instead so we do not need to set
234 * up the mailboxes ahead of time
237 aha1542_outb(sh
->io_port
, CMD_INQUIRY
);
239 for (i
= 0; i
< 4; i
++) {
240 if (!wait_mask(STATUS(sh
->io_port
), DF
, DF
, 0, 0))
242 (void)inb(DATA(sh
->io_port
));
245 /* Reading port should reset DF */
246 if (inb(STATUS(sh
->io_port
)) & DF
)
249 /* When HACC, command is completed, and we're though testing */
250 if (!wait_mask(INTRFLAGS(sh
->io_port
), HACC
, HACC
, 0, 0))
253 /* Clear interrupts */
254 outb(IRST
, CONTROL(sh
->io_port
));
259 static void aha1542_free_cmd(struct scsi_cmnd
*cmd
)
261 struct aha1542_cmd
*acmd
= scsi_cmd_priv(cmd
);
263 if (cmd
->sc_data_direction
== DMA_FROM_DEVICE
) {
264 struct request
*rq
= scsi_cmd_to_rq(cmd
);
265 void *buf
= acmd
->data_buffer
;
266 struct req_iterator iter
;
269 rq_for_each_segment(bv
, rq
, iter
) {
270 memcpy_to_bvec(&bv
, buf
);
278 static irqreturn_t
aha1542_interrupt(int irq
, void *dev_id
)
280 struct Scsi_Host
*sh
= dev_id
;
281 struct aha1542_hostdata
*aha1542
= shost_priv(sh
);
282 int errstatus
, mbi
, mbo
, mbistatus
;
285 struct scsi_cmnd
*tmp_cmd
;
287 struct mailbox
*mb
= aha1542
->mb
;
288 struct ccb
*ccb
= aha1542
->ccb
;
292 flag
= inb(INTRFLAGS(sh
->io_port
));
293 shost_printk(KERN_DEBUG
, sh
, "aha1542_intr_handle: ");
294 if (!(flag
& ANYINTR
))
295 printk("no interrupt?");
304 printk("status %02x\n", inb(STATUS(sh
->io_port
)));
309 spin_lock_irqsave(sh
->host_lock
, flags
);
311 flag
= inb(INTRFLAGS(sh
->io_port
));
314 * Check for unusual interrupts. If any of these happen, we should
315 * probably do something special, but for now just printing a message
316 * is sufficient. A SCSI reset detected is something that we really
317 * need to deal with in some way.
327 aha1542_intr_reset(sh
->io_port
);
329 mbi
= aha1542
->aha1542_last_mbi_used
+ 1;
330 if (mbi
>= 2 * AHA1542_MAILBOXES
)
331 mbi
= AHA1542_MAILBOXES
;
334 if (mb
[mbi
].status
!= 0)
337 if (mbi
>= 2 * AHA1542_MAILBOXES
)
338 mbi
= AHA1542_MAILBOXES
;
339 } while (mbi
!= aha1542
->aha1542_last_mbi_used
);
341 if (mb
[mbi
].status
== 0) {
342 spin_unlock_irqrestore(sh
->host_lock
, flags
);
343 /* Hmm, no mail. Must have read it the last time around */
344 if (!number_serviced
)
345 shost_printk(KERN_WARNING
, sh
, "interrupt received, but no mail.\n");
349 mbo
= (scsi2int(mb
[mbi
].ccbptr
) - (unsigned long)aha1542
->ccb_handle
) / sizeof(struct ccb
);
350 mbistatus
= mb
[mbi
].status
;
352 aha1542
->aha1542_last_mbi_used
= mbi
;
355 if (ccb
[mbo
].tarstat
| ccb
[mbo
].hastat
)
356 shost_printk(KERN_DEBUG
, sh
, "aha1542_command: returning %x (status %d)\n",
357 ccb
[mbo
].tarstat
+ ((int) ccb
[mbo
].hastat
<< 16), mb
[mbi
].status
);
361 continue; /* Aborted command not found */
364 shost_printk(KERN_DEBUG
, sh
, "...done %d %d\n", mbo
, mbi
);
367 tmp_cmd
= aha1542
->int_cmds
[mbo
];
370 spin_unlock_irqrestore(sh
->host_lock
, flags
);
371 shost_printk(KERN_WARNING
, sh
, "Unexpected interrupt\n");
372 shost_printk(KERN_WARNING
, sh
, "tarstat=%x, hastat=%x idlun=%x ccb#=%d\n", ccb
[mbo
].tarstat
,
373 ccb
[mbo
].hastat
, ccb
[mbo
].idlun
, mbo
);
376 aha1542_free_cmd(tmp_cmd
);
378 * Fetch the sense data, and tuck it away, in the required slot. The
379 * Adaptec automatically fetches it, and there is no guarantee that
380 * we will still have it in the cdb when we come back
382 if (ccb
[mbo
].tarstat
== 2)
383 memcpy(tmp_cmd
->sense_buffer
, &ccb
[mbo
].cdb
[ccb
[mbo
].cdblen
],
384 SCSI_SENSE_BUFFERSIZE
);
387 /* is there mail :-) */
389 /* more error checking left out here */
391 /* This is surely wrong, but I don't know what's right */
392 errstatus
= makecode(ccb
[mbo
].hastat
, ccb
[mbo
].tarstat
);
398 shost_printk(KERN_DEBUG
, sh
, "(aha1542 error:%x %x %x) ", errstatus
,
399 ccb
[mbo
].hastat
, ccb
[mbo
].tarstat
);
400 if (ccb
[mbo
].tarstat
== 2)
401 print_hex_dump_bytes("sense: ", DUMP_PREFIX_NONE
, &ccb
[mbo
].cdb
[ccb
[mbo
].cdblen
], 12);
403 printk("aha1542_intr_handle: returning %6x\n", errstatus
);
405 tmp_cmd
->result
= errstatus
;
406 aha1542
->int_cmds
[mbo
] = NULL
; /* This effectively frees up the mailbox slot, as
407 * far as queuecommand is concerned
414 static int aha1542_queuecommand(struct Scsi_Host
*sh
, struct scsi_cmnd
*cmd
)
416 struct aha1542_cmd
*acmd
= scsi_cmd_priv(cmd
);
417 struct aha1542_hostdata
*aha1542
= shost_priv(sh
);
419 u8 target
= cmd
->device
->id
;
420 u8 lun
= cmd
->device
->lun
;
422 int bufflen
= scsi_bufflen(cmd
);
424 struct mailbox
*mb
= aha1542
->mb
;
425 struct ccb
*ccb
= aha1542
->ccb
;
427 if (*cmd
->cmnd
== REQUEST_SENSE
) {
428 /* Don't do the command - we have the sense data already */
436 if (*cmd
->cmnd
== READ_10
|| *cmd
->cmnd
== WRITE_10
)
437 i
= xscsi2int(cmd
->cmnd
+ 2);
438 else if (*cmd
->cmnd
== READ_6
|| *cmd
->cmnd
== WRITE_6
)
439 i
= scsi2int(cmd
->cmnd
+ 2);
440 shost_printk(KERN_DEBUG
, sh
, "aha1542_queuecommand: dev %d cmd %02x pos %d len %d",
441 target
, *cmd
->cmnd
, i
, bufflen
);
442 print_hex_dump_bytes("command: ", DUMP_PREFIX_NONE
, cmd
->cmnd
, cmd
->cmd_len
);
446 if (cmd
->sc_data_direction
== DMA_TO_DEVICE
) {
447 struct request
*rq
= scsi_cmd_to_rq(cmd
);
448 void *buf
= acmd
->data_buffer
;
449 struct req_iterator iter
;
452 rq_for_each_segment(bv
, rq
, iter
) {
453 memcpy_from_bvec(buf
, &bv
);
459 * Use the outgoing mailboxes in a round-robin fashion, because this
460 * is how the host adapter will scan for them
463 spin_lock_irqsave(sh
->host_lock
, flags
);
464 mbo
= aha1542
->aha1542_last_mbo_used
+ 1;
465 if (mbo
>= AHA1542_MAILBOXES
)
469 if (mb
[mbo
].status
== 0 && aha1542
->int_cmds
[mbo
] == NULL
)
472 if (mbo
>= AHA1542_MAILBOXES
)
474 } while (mbo
!= aha1542
->aha1542_last_mbo_used
);
476 if (mb
[mbo
].status
|| aha1542
->int_cmds
[mbo
])
477 panic("Unable to find empty mailbox for aha1542.\n");
479 aha1542
->int_cmds
[mbo
] = cmd
; /* This will effectively prevent someone else from
480 * screwing with this cdb.
483 aha1542
->aha1542_last_mbo_used
= mbo
;
486 shost_printk(KERN_DEBUG
, sh
, "Sending command (%d)...", mbo
);
489 /* This gets trashed for some reason */
490 any2scsi(mb
[mbo
].ccbptr
, aha1542
->ccb_handle
+ mbo
* sizeof(*ccb
));
492 memset(&ccb
[mbo
], 0, sizeof(struct ccb
));
494 ccb
[mbo
].cdblen
= cmd
->cmd_len
;
497 if (*cmd
->cmnd
== READ_10
|| *cmd
->cmnd
== READ_6
)
499 else if (*cmd
->cmnd
== WRITE_10
|| *cmd
->cmnd
== WRITE_6
)
502 memcpy(ccb
[mbo
].cdb
, cmd
->cmnd
, ccb
[mbo
].cdblen
);
503 ccb
[mbo
].op
= 0; /* SCSI Initiator Command */
504 any2scsi(ccb
[mbo
].datalen
, bufflen
);
506 any2scsi(ccb
[mbo
].dataptr
, acmd
->data_buffer_handle
);
508 any2scsi(ccb
[mbo
].dataptr
, 0);
509 ccb
[mbo
].idlun
= (target
& 7) << 5 | direction
| (lun
& 7); /*SCSI Target Id */
510 ccb
[mbo
].rsalen
= 16;
511 ccb
[mbo
].linkptr
[0] = ccb
[mbo
].linkptr
[1] = ccb
[mbo
].linkptr
[2] = 0;
512 ccb
[mbo
].commlinkid
= 0;
515 print_hex_dump_bytes("sending: ", DUMP_PREFIX_NONE
, &ccb
[mbo
], sizeof(ccb
[mbo
]) - 10);
516 printk("aha1542_queuecommand: now waiting for interrupt ");
519 aha1542_outb(cmd
->device
->host
->io_port
, CMD_START_SCSI
);
520 spin_unlock_irqrestore(sh
->host_lock
, flags
);
525 /* Initialize mailboxes */
526 static void setup_mailboxes(struct Scsi_Host
*sh
)
528 struct aha1542_hostdata
*aha1542
= shost_priv(sh
);
529 u8 mb_cmd
[5] = { CMD_MBINIT
, AHA1542_MAILBOXES
, 0, 0, 0};
532 for (i
= 0; i
< AHA1542_MAILBOXES
; i
++) {
533 aha1542
->mb
[i
].status
= 0;
534 any2scsi(aha1542
->mb
[i
].ccbptr
,
535 aha1542
->ccb_handle
+ i
* sizeof(struct ccb
));
536 aha1542
->mb
[AHA1542_MAILBOXES
+ i
].status
= 0;
538 aha1542_intr_reset(sh
->io_port
); /* reset interrupts, so they don't block */
539 any2scsi(mb_cmd
+ 2, aha1542
->mb_handle
);
540 if (aha1542_out(sh
->io_port
, mb_cmd
, 5))
541 shost_printk(KERN_ERR
, sh
, "failed setting up mailboxes\n");
542 aha1542_intr_reset(sh
->io_port
);
545 static int aha1542_getconfig(struct Scsi_Host
*sh
)
547 u8 inquiry_result
[3];
549 i
= inb(STATUS(sh
->io_port
));
551 i
= inb(DATA(sh
->io_port
));
553 aha1542_outb(sh
->io_port
, CMD_RETCONF
);
554 aha1542_in(sh
->io_port
, inquiry_result
, 3, 0);
555 if (!wait_mask(INTRFLAGS(sh
->io_port
), INTRMASK
, HACC
, 0, 0))
556 shost_printk(KERN_ERR
, sh
, "error querying board settings\n");
557 aha1542_intr_reset(sh
->io_port
);
558 switch (inquiry_result
[0]) {
573 * This means that the adapter, although Adaptec 1542 compatible, doesn't use a DMA channel.
574 * Currently only aware of the BusLogic BT-445S VL-Bus adapter which needs this.
576 sh
->dma_channel
= 0xFF;
579 shost_printk(KERN_ERR
, sh
, "Unable to determine DMA channel.\n");
582 switch (inquiry_result
[1]) {
602 shost_printk(KERN_ERR
, sh
, "Unable to determine IRQ level.\n");
605 sh
->this_id
= inquiry_result
[2] & 7;
610 * This function should only be called for 1542C boards - we can detect
611 * the special firmware settings and unlock the board
614 static int aha1542_mbenable(struct Scsi_Host
*sh
)
616 static u8 mbenable_cmd
[3];
617 static u8 mbenable_result
[2];
620 retval
= BIOS_TRANSLATION_6432
;
622 aha1542_outb(sh
->io_port
, CMD_EXTBIOS
);
623 if (aha1542_in(sh
->io_port
, mbenable_result
, 2, 100))
625 if (!wait_mask(INTRFLAGS(sh
->io_port
), INTRMASK
, HACC
, 0, 100))
627 aha1542_intr_reset(sh
->io_port
);
629 if ((mbenable_result
[0] & 0x08) || mbenable_result
[1]) {
630 mbenable_cmd
[0] = CMD_MBENABLE
;
632 mbenable_cmd
[2] = mbenable_result
[1];
634 if ((mbenable_result
[0] & 0x08) && (mbenable_result
[1] & 0x03))
635 retval
= BIOS_TRANSLATION_25563
;
637 if (aha1542_out(sh
->io_port
, mbenable_cmd
, 3))
642 shost_printk(KERN_ERR
, sh
, "Mailbox init failed\n");
644 aha1542_intr_reset(sh
->io_port
);
648 /* Query the board to find out if it is a 1542 or a 1740, or whatever. */
649 static int aha1542_query(struct Scsi_Host
*sh
)
651 struct aha1542_hostdata
*aha1542
= shost_priv(sh
);
652 u8 inquiry_result
[4];
654 i
= inb(STATUS(sh
->io_port
));
656 i
= inb(DATA(sh
->io_port
));
658 aha1542_outb(sh
->io_port
, CMD_INQUIRY
);
659 aha1542_in(sh
->io_port
, inquiry_result
, 4, 0);
660 if (!wait_mask(INTRFLAGS(sh
->io_port
), INTRMASK
, HACC
, 0, 0))
661 shost_printk(KERN_ERR
, sh
, "error querying card type\n");
662 aha1542_intr_reset(sh
->io_port
);
664 aha1542
->bios_translation
= BIOS_TRANSLATION_6432
; /* Default case */
667 * For an AHA1740 series board, we ignore the board since there is a
668 * hardware bug which can lead to wrong blocks being returned if the board
669 * is operating in the 1542 emulation mode. Since there is an extended mode
670 * driver, we simply ignore the board and let the 1740 driver pick it up.
673 if (inquiry_result
[0] == 0x43) {
674 shost_printk(KERN_INFO
, sh
, "Emulation mode not supported for AHA-1740 hardware, use aha1740 driver instead.\n");
679 * Always call this - boards that do not support extended bios translation
680 * will ignore the command, and we will set the proper default
683 aha1542
->bios_translation
= aha1542_mbenable(sh
);
688 static u8
dma_speed_hw(int dma_speed
)
703 return 0xff; /* invalid */
706 /* Set the Bus on/off-times as not to ruin floppy performance */
707 static void aha1542_set_bus_times(struct Scsi_Host
*sh
, int bus_on
, int bus_off
, int dma_speed
)
710 u8 oncmd
[] = { CMD_BUSON_TIME
, clamp(bus_on
, 2, 15) };
712 aha1542_intr_reset(sh
->io_port
);
713 if (aha1542_out(sh
->io_port
, oncmd
, 2))
718 u8 offcmd
[] = { CMD_BUSOFF_TIME
, clamp(bus_off
, 1, 64) };
720 aha1542_intr_reset(sh
->io_port
);
721 if (aha1542_out(sh
->io_port
, offcmd
, 2))
725 if (dma_speed_hw(dma_speed
) != 0xff) {
726 u8 dmacmd
[] = { CMD_DMASPEED
, dma_speed_hw(dma_speed
) };
728 aha1542_intr_reset(sh
->io_port
);
729 if (aha1542_out(sh
->io_port
, dmacmd
, 2))
732 aha1542_intr_reset(sh
->io_port
);
735 shost_printk(KERN_ERR
, sh
, "setting bus on/off-time failed\n");
736 aha1542_intr_reset(sh
->io_port
);
739 /* return non-zero on detection */
740 static struct Scsi_Host
*aha1542_hw_init(const struct scsi_host_template
*tpnt
,
741 struct device
*pdev
, int indx
)
743 unsigned int base_io
= io
[indx
];
744 struct Scsi_Host
*sh
;
745 struct aha1542_hostdata
*aha1542
;
746 char dma_info
[] = "no DMA";
751 if (!request_region(base_io
, AHA1542_REGION_SIZE
, "aha1542"))
754 sh
= scsi_host_alloc(tpnt
, sizeof(struct aha1542_hostdata
));
757 aha1542
= shost_priv(sh
);
759 sh
->unique_id
= base_io
;
760 sh
->io_port
= base_io
;
761 sh
->n_io_port
= AHA1542_REGION_SIZE
;
762 aha1542
->aha1542_last_mbi_used
= 2 * AHA1542_MAILBOXES
- 1;
763 aha1542
->aha1542_last_mbo_used
= AHA1542_MAILBOXES
- 1;
765 if (!aha1542_test_port(sh
))
768 aha1542_set_bus_times(sh
, bus_on
[indx
], bus_off
[indx
], dma_speed
[indx
]);
769 if (aha1542_query(sh
))
771 if (aha1542_getconfig(sh
) == -1)
774 if (sh
->dma_channel
!= 0xFF)
775 snprintf(dma_info
, sizeof(dma_info
), "DMA %d", sh
->dma_channel
);
776 shost_printk(KERN_INFO
, sh
, "Adaptec AHA-1542 (SCSI-ID %d) at IO 0x%x, IRQ %d, %s\n",
777 sh
->this_id
, base_io
, sh
->irq
, dma_info
);
778 if (aha1542
->bios_translation
== BIOS_TRANSLATION_25563
)
779 shost_printk(KERN_INFO
, sh
, "Using extended bios translation\n");
781 if (dma_set_mask_and_coherent(pdev
, DMA_BIT_MASK(24)) < 0)
784 aha1542
->mb
= dma_alloc_coherent(pdev
,
785 AHA1542_MAILBOXES
* 2 * sizeof(struct mailbox
),
786 &aha1542
->mb_handle
, GFP_KERNEL
);
790 aha1542
->ccb
= dma_alloc_coherent(pdev
,
791 AHA1542_MAILBOXES
* sizeof(struct ccb
),
792 &aha1542
->ccb_handle
, GFP_KERNEL
);
798 if (request_irq(sh
->irq
, aha1542_interrupt
, 0, "aha1542", sh
)) {
799 shost_printk(KERN_ERR
, sh
, "Unable to allocate IRQ.\n");
802 if (sh
->dma_channel
!= 0xFF) {
803 if (request_dma(sh
->dma_channel
, "aha1542")) {
804 shost_printk(KERN_ERR
, sh
, "Unable to allocate DMA channel.\n");
807 if (sh
->dma_channel
== 0 || sh
->dma_channel
>= 5) {
808 set_dma_mode(sh
->dma_channel
, DMA_MODE_CASCADE
);
809 enable_dma(sh
->dma_channel
);
813 if (scsi_add_host(sh
, pdev
))
821 if (sh
->dma_channel
!= 0xff)
822 free_dma(sh
->dma_channel
);
824 free_irq(sh
->irq
, sh
);
826 dma_free_coherent(pdev
, AHA1542_MAILBOXES
* sizeof(struct ccb
),
827 aha1542
->ccb
, aha1542
->ccb_handle
);
829 dma_free_coherent(pdev
, AHA1542_MAILBOXES
* 2 * sizeof(struct mailbox
),
830 aha1542
->mb
, aha1542
->mb_handle
);
834 release_region(base_io
, AHA1542_REGION_SIZE
);
839 static int aha1542_release(struct Scsi_Host
*sh
)
841 struct aha1542_hostdata
*aha1542
= shost_priv(sh
);
842 struct device
*dev
= sh
->dma_dev
;
844 scsi_remove_host(sh
);
845 if (sh
->dma_channel
!= 0xff)
846 free_dma(sh
->dma_channel
);
847 dma_free_coherent(dev
, AHA1542_MAILBOXES
* sizeof(struct ccb
),
848 aha1542
->ccb
, aha1542
->ccb_handle
);
849 dma_free_coherent(dev
, AHA1542_MAILBOXES
* 2 * sizeof(struct mailbox
),
850 aha1542
->mb
, aha1542
->mb_handle
);
852 free_irq(sh
->irq
, sh
);
853 if (sh
->io_port
&& sh
->n_io_port
)
854 release_region(sh
->io_port
, sh
->n_io_port
);
861 * This is a device reset. This is handled by sending a special command
864 static int aha1542_dev_reset(struct scsi_cmnd
*cmd
)
866 struct Scsi_Host
*sh
= cmd
->device
->host
;
867 struct aha1542_hostdata
*aha1542
= shost_priv(sh
);
869 struct mailbox
*mb
= aha1542
->mb
;
870 u8 target
= cmd
->device
->id
;
871 u8 lun
= cmd
->device
->lun
;
873 struct ccb
*ccb
= aha1542
->ccb
;
875 spin_lock_irqsave(sh
->host_lock
, flags
);
876 mbo
= aha1542
->aha1542_last_mbo_used
+ 1;
877 if (mbo
>= AHA1542_MAILBOXES
)
881 if (mb
[mbo
].status
== 0 && aha1542
->int_cmds
[mbo
] == NULL
)
884 if (mbo
>= AHA1542_MAILBOXES
)
886 } while (mbo
!= aha1542
->aha1542_last_mbo_used
);
888 if (mb
[mbo
].status
|| aha1542
->int_cmds
[mbo
])
889 panic("Unable to find empty mailbox for aha1542.\n");
891 aha1542
->int_cmds
[mbo
] = cmd
; /* This will effectively
892 * prevent someone else from
893 * screwing with this cdb.
896 aha1542
->aha1542_last_mbo_used
= mbo
;
898 /* This gets trashed for some reason */
899 any2scsi(mb
[mbo
].ccbptr
, aha1542
->ccb_handle
+ mbo
* sizeof(*ccb
));
901 memset(&ccb
[mbo
], 0, sizeof(struct ccb
));
903 ccb
[mbo
].op
= 0x81; /* BUS DEVICE RESET */
905 ccb
[mbo
].idlun
= (target
& 7) << 5 | (lun
& 7); /*SCSI Target Id */
907 ccb
[mbo
].linkptr
[0] = ccb
[mbo
].linkptr
[1] = ccb
[mbo
].linkptr
[2] = 0;
908 ccb
[mbo
].commlinkid
= 0;
911 * Now tell the 1542 to flush all pending commands for this
914 aha1542_outb(sh
->io_port
, CMD_START_SCSI
);
915 spin_unlock_irqrestore(sh
->host_lock
, flags
);
917 scmd_printk(KERN_WARNING
, cmd
,
918 "Trying device reset for target\n");
923 static int aha1542_reset(struct scsi_cmnd
*cmd
, u8 reset_cmd
)
925 struct Scsi_Host
*sh
= cmd
->device
->host
;
926 struct aha1542_hostdata
*aha1542
= shost_priv(sh
);
930 spin_lock_irqsave(sh
->host_lock
, flags
);
932 * This does a scsi reset for all devices on the bus.
933 * In principle, we could also reset the 1542 - should
934 * we do this? Try this first, and we can add that later
935 * if it turns out to be useful.
937 outb(reset_cmd
, CONTROL(cmd
->device
->host
->io_port
));
939 if (!wait_mask(STATUS(cmd
->device
->host
->io_port
),
940 STATMASK
, IDLE
, STST
| DIAGF
| INVDCMD
| DF
| CDF
, 0)) {
941 spin_unlock_irqrestore(sh
->host_lock
, flags
);
946 * We need to do this too before the 1542 can interact with
947 * us again after host reset.
949 if (reset_cmd
& HRST
)
950 setup_mailboxes(cmd
->device
->host
);
953 * Now try to pick up the pieces. For all pending commands,
954 * free any internal data structures, and basically clear things
955 * out. We do not try and restart any commands or anything -
956 * the strategy handler takes care of that crap.
958 shost_printk(KERN_WARNING
, cmd
->device
->host
, "Sent BUS RESET to scsi host %d\n", cmd
->device
->host
->host_no
);
960 for (i
= 0; i
< AHA1542_MAILBOXES
; i
++) {
961 if (aha1542
->int_cmds
[i
] != NULL
) {
962 struct scsi_cmnd
*tmp_cmd
;
963 tmp_cmd
= aha1542
->int_cmds
[i
];
965 if (tmp_cmd
->device
->soft_reset
) {
967 * If this device implements the soft reset option,
968 * then it is still holding onto the command, and
969 * may yet complete it. In this case, we don't
974 aha1542_free_cmd(tmp_cmd
);
975 aha1542
->int_cmds
[i
] = NULL
;
976 aha1542
->mb
[i
].status
= 0;
980 spin_unlock_irqrestore(sh
->host_lock
, flags
);
984 static int aha1542_bus_reset(struct scsi_cmnd
*cmd
)
986 return aha1542_reset(cmd
, SCRST
);
989 static int aha1542_host_reset(struct scsi_cmnd
*cmd
)
991 return aha1542_reset(cmd
, HRST
| SCRST
);
994 static int aha1542_biosparam(struct scsi_device
*sdev
,
995 struct block_device
*bdev
, sector_t capacity
, int geom
[])
997 struct aha1542_hostdata
*aha1542
= shost_priv(sdev
->host
);
999 if (capacity
>= 0x200000 &&
1000 aha1542
->bios_translation
== BIOS_TRANSLATION_25563
) {
1001 /* Please verify that this is the same as what DOS returns */
1002 geom
[0] = 255; /* heads */
1003 geom
[1] = 63; /* sectors */
1005 geom
[0] = 64; /* heads */
1006 geom
[1] = 32; /* sectors */
1008 geom
[2] = sector_div(capacity
, geom
[0] * geom
[1]); /* cylinders */
1013 MODULE_DESCRIPTION("Adaptec AHA-1542 SCSI host adapter driver");
1014 MODULE_LICENSE("GPL");
1016 static int aha1542_init_cmd_priv(struct Scsi_Host
*shost
, struct scsi_cmnd
*cmd
)
1018 struct aha1542_cmd
*acmd
= scsi_cmd_priv(cmd
);
1020 acmd
->data_buffer
= dma_alloc_coherent(shost
->dma_dev
,
1021 SECTOR_SIZE
* AHA1542_MAX_SECTORS
,
1022 &acmd
->data_buffer_handle
, GFP_KERNEL
);
1023 if (!acmd
->data_buffer
)
1028 static int aha1542_exit_cmd_priv(struct Scsi_Host
*shost
, struct scsi_cmnd
*cmd
)
1030 struct aha1542_cmd
*acmd
= scsi_cmd_priv(cmd
);
1032 dma_free_coherent(shost
->dma_dev
, SECTOR_SIZE
* AHA1542_MAX_SECTORS
,
1033 acmd
->data_buffer
, acmd
->data_buffer_handle
);
1037 static const struct scsi_host_template driver_template
= {
1038 .module
= THIS_MODULE
,
1039 .proc_name
= "aha1542",
1040 .name
= "Adaptec 1542",
1041 .cmd_size
= sizeof(struct aha1542_cmd
),
1042 .queuecommand
= aha1542_queuecommand
,
1043 .eh_device_reset_handler
= aha1542_dev_reset
,
1044 .eh_bus_reset_handler
= aha1542_bus_reset
,
1045 .eh_host_reset_handler
= aha1542_host_reset
,
1046 .bios_param
= aha1542_biosparam
,
1047 .init_cmd_priv
= aha1542_init_cmd_priv
,
1048 .exit_cmd_priv
= aha1542_exit_cmd_priv
,
1049 .can_queue
= AHA1542_MAILBOXES
,
1051 .max_sectors
= AHA1542_MAX_SECTORS
,
1052 .sg_tablesize
= SG_ALL
,
1055 static int aha1542_isa_match(struct device
*pdev
, unsigned int ndev
)
1057 struct Scsi_Host
*sh
= aha1542_hw_init(&driver_template
, pdev
, ndev
);
1062 dev_set_drvdata(pdev
, sh
);
1066 static void aha1542_isa_remove(struct device
*pdev
,
1069 aha1542_release(dev_get_drvdata(pdev
));
1070 dev_set_drvdata(pdev
, NULL
);
1073 static struct isa_driver aha1542_isa_driver
= {
1074 .match
= aha1542_isa_match
,
1075 .remove
= aha1542_isa_remove
,
1080 static int isa_registered
;
1083 static const struct pnp_device_id aha1542_pnp_ids
[] = {
1084 { .id
= "ADP1542" },
1087 MODULE_DEVICE_TABLE(pnp
, aha1542_pnp_ids
);
1089 static int aha1542_pnp_probe(struct pnp_dev
*pdev
, const struct pnp_device_id
*id
)
1092 struct Scsi_Host
*sh
;
1094 for (indx
= 0; indx
< ARRAY_SIZE(io
); indx
++) {
1098 if (pnp_activate_dev(pdev
) < 0)
1101 io
[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
1108 dev_info(&pdev
->dev
, "ISAPnP found an AHA1535 at I/O 0x%03X", io
[indx
]);
1111 sh
= aha1542_hw_init(&driver_template
, &pdev
->dev
, indx
);
1115 pnp_set_drvdata(pdev
, sh
);
1119 static void aha1542_pnp_remove(struct pnp_dev
*pdev
)
1121 aha1542_release(pnp_get_drvdata(pdev
));
1122 pnp_set_drvdata(pdev
, NULL
);
1125 static struct pnp_driver aha1542_pnp_driver
= {
1127 .id_table
= aha1542_pnp_ids
,
1128 .probe
= aha1542_pnp_probe
,
1129 .remove
= aha1542_pnp_remove
,
1131 static int pnp_registered
;
1132 #endif /* CONFIG_PNP */
1134 static int __init
aha1542_init(void)
1140 ret
= pnp_register_driver(&aha1542_pnp_driver
);
1145 ret
= isa_register_driver(&aha1542_isa_driver
, MAXBOARDS
);
1159 static void __exit
aha1542_exit(void)
1163 pnp_unregister_driver(&aha1542_pnp_driver
);
1166 isa_unregister_driver(&aha1542_isa_driver
);
1169 module_init(aha1542_init
);
1170 module_exit(aha1542_exit
);