WIP FPC-III support
[linux/fpc-iii.git] / drivers / scsi / aha1542.c
blobdc5667afeb271677184af001a88aabfe593b8cb5
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
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
8 */
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>
21 #include <linux/io.h>
22 #include <asm/dma.h>
23 #include <scsi/scsi_cmnd.h>
24 #include <scsi/scsi_device.h>
25 #include <scsi/scsi_host.h>
26 #include "aha1542.h"
28 #define MAXBOARDS 4
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];
62 struct mailbox *mb;
63 dma_addr_t mb_handle;
64 struct ccb *ccb;
65 dma_addr_t ccb_handle;
68 struct aha1542_cmd {
69 struct chain *chain;
70 dma_addr_t chain_handle;
73 static inline void aha1542_intr_reset(u16 base)
75 outb(IRST, CONTROL(base));
78 static inline bool wait_mask(u16 port, u8 mask, u8 allof, u8 noneof, int timeout)
80 bool delayed = true;
82 if (timeout == 0) {
83 timeout = 3000000;
84 delayed = false;
87 while (1) {
88 u8 bits = inb(port) & mask;
89 if ((bits & allof) == allof && ((bits & noneof) == 0))
90 break;
91 if (delayed)
92 mdelay(1);
93 if (--timeout == 0)
94 return false;
97 return true;
100 static int aha1542_outb(unsigned int base, u8 val)
102 if (!wait_mask(STATUS(base), CDF, 0, CDF, 0))
103 return 1;
104 outb(val, DATA(base));
106 return 0;
109 static int aha1542_out(unsigned int base, u8 *buf, int len)
111 while (len--) {
112 if (!wait_mask(STATUS(base), CDF, 0, CDF, 0))
113 return 1;
114 outb(*buf++, DATA(base));
116 if (!wait_mask(INTRFLAGS(base), INTRMASK, HACC, 0, 0))
117 return 1;
119 return 0;
122 /* Only used at boot time, so we do not need to worry about latency as much
123 here */
125 static int aha1542_in(unsigned int base, u8 *buf, int len, int timeout)
127 while (len--) {
128 if (!wait_mask(STATUS(base), DF, DF, 0, timeout))
129 return 1;
130 *buf++ = inb(DATA(base));
132 return 0;
135 static int makecode(unsigned hosterr, unsigned scsierr)
137 switch (hosterr) {
138 case 0x0:
139 case 0xa: /* Linked command complete without error and linked normally */
140 case 0xb: /* Linked command complete without error, interrupt generated */
141 hosterr = 0;
142 break;
144 case 0x11: /* Selection time out-The initiator selection or target
145 reselection was not complete within the SCSI Time out period */
146 hosterr = DID_TIME_OUT;
147 break;
149 case 0x12: /* Data overrun/underrun-The target attempted to transfer more data
150 than was allocated by the Data Length field or the sum of the
151 Scatter / Gather Data Length fields. */
153 case 0x13: /* Unexpected bus free-The target dropped the SCSI BSY at an unexpected time. */
155 case 0x15: /* MBO command was not 00, 01 or 02-The first byte of the CB was
156 invalid. This usually indicates a software failure. */
158 case 0x16: /* Invalid CCB Operation Code-The first byte of the CCB was invalid.
159 This usually indicates a software failure. */
161 case 0x17: /* Linked CCB does not have the same LUN-A subsequent CCB of a set
162 of linked CCB's does not specify the same logical unit number as
163 the first. */
164 case 0x18: /* Invalid Target Direction received from Host-The direction of a
165 Target Mode CCB was invalid. */
167 case 0x19: /* Duplicate CCB Received in Target Mode-More than once CCB was
168 received to service data transfer between the same target LUN
169 and initiator SCSI ID in the same direction. */
171 case 0x1a: /* Invalid CCB or Segment List Parameter-A segment list with a zero
172 length segment or invalid segment list boundaries was received.
173 A CCB parameter was invalid. */
174 #ifdef DEBUG
175 printk("Aha1542: %x %x\n", hosterr, scsierr);
176 #endif
177 hosterr = DID_ERROR; /* Couldn't find any better */
178 break;
180 case 0x14: /* Target bus phase sequence failure-An invalid bus phase or bus
181 phase sequence was requested by the target. The host adapter
182 will generate a SCSI Reset Condition, notifying the host with
183 a SCRD interrupt */
184 hosterr = DID_RESET;
185 break;
186 default:
187 printk(KERN_ERR "aha1542: makecode: unknown hoststatus %x\n", hosterr);
188 break;
190 return scsierr | (hosterr << 16);
193 static int aha1542_test_port(struct Scsi_Host *sh)
195 u8 inquiry_result[4];
196 int i;
198 /* Quick and dirty test for presence of the card. */
199 if (inb(STATUS(sh->io_port)) == 0xff)
200 return 0;
202 /* Reset the adapter. I ought to make a hard reset, but it's not really necessary */
204 /* In case some other card was probing here, reset interrupts */
205 aha1542_intr_reset(sh->io_port); /* reset interrupts, so they don't block */
207 outb(SRST | IRST /*|SCRST */ , CONTROL(sh->io_port));
209 mdelay(20); /* Wait a little bit for things to settle down. */
211 /* Expect INIT and IDLE, any of the others are bad */
212 if (!wait_mask(STATUS(sh->io_port), STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0))
213 return 0;
215 /* Shouldn't have generated any interrupts during reset */
216 if (inb(INTRFLAGS(sh->io_port)) & INTRMASK)
217 return 0;
219 /* Perform a host adapter inquiry instead so we do not need to set
220 up the mailboxes ahead of time */
222 aha1542_outb(sh->io_port, CMD_INQUIRY);
224 for (i = 0; i < 4; i++) {
225 if (!wait_mask(STATUS(sh->io_port), DF, DF, 0, 0))
226 return 0;
227 inquiry_result[i] = inb(DATA(sh->io_port));
230 /* Reading port should reset DF */
231 if (inb(STATUS(sh->io_port)) & DF)
232 return 0;
234 /* When HACC, command is completed, and we're though testing */
235 if (!wait_mask(INTRFLAGS(sh->io_port), HACC, HACC, 0, 0))
236 return 0;
238 /* Clear interrupts */
239 outb(IRST, CONTROL(sh->io_port));
241 return 1;
244 static void aha1542_free_cmd(struct scsi_cmnd *cmd)
246 struct aha1542_cmd *acmd = scsi_cmd_priv(cmd);
247 struct device *dev = cmd->device->host->dma_dev;
248 size_t len = scsi_sg_count(cmd) * sizeof(struct chain);
250 if (acmd->chain) {
251 dma_unmap_single(dev, acmd->chain_handle, len, DMA_TO_DEVICE);
252 kfree(acmd->chain);
255 acmd->chain = NULL;
256 scsi_dma_unmap(cmd);
259 static irqreturn_t aha1542_interrupt(int irq, void *dev_id)
261 struct Scsi_Host *sh = dev_id;
262 struct aha1542_hostdata *aha1542 = shost_priv(sh);
263 void (*my_done)(struct scsi_cmnd *) = NULL;
264 int errstatus, mbi, mbo, mbistatus;
265 int number_serviced;
266 unsigned long flags;
267 struct scsi_cmnd *tmp_cmd;
268 int flag;
269 struct mailbox *mb = aha1542->mb;
270 struct ccb *ccb = aha1542->ccb;
272 #ifdef DEBUG
274 flag = inb(INTRFLAGS(sh->io_port));
275 shost_printk(KERN_DEBUG, sh, "aha1542_intr_handle: ");
276 if (!(flag & ANYINTR))
277 printk("no interrupt?");
278 if (flag & MBIF)
279 printk("MBIF ");
280 if (flag & MBOA)
281 printk("MBOF ");
282 if (flag & HACC)
283 printk("HACC ");
284 if (flag & SCRD)
285 printk("SCRD ");
286 printk("status %02x\n", inb(STATUS(sh->io_port)));
288 #endif
289 number_serviced = 0;
291 spin_lock_irqsave(sh->host_lock, flags);
292 while (1) {
293 flag = inb(INTRFLAGS(sh->io_port));
295 /* Check for unusual interrupts. If any of these happen, we should
296 probably do something special, but for now just printing a message
297 is sufficient. A SCSI reset detected is something that we really
298 need to deal with in some way. */
299 if (flag & ~MBIF) {
300 if (flag & MBOA)
301 printk("MBOF ");
302 if (flag & HACC)
303 printk("HACC ");
304 if (flag & SCRD)
305 printk("SCRD ");
307 aha1542_intr_reset(sh->io_port);
309 mbi = aha1542->aha1542_last_mbi_used + 1;
310 if (mbi >= 2 * AHA1542_MAILBOXES)
311 mbi = AHA1542_MAILBOXES;
313 do {
314 if (mb[mbi].status != 0)
315 break;
316 mbi++;
317 if (mbi >= 2 * AHA1542_MAILBOXES)
318 mbi = AHA1542_MAILBOXES;
319 } while (mbi != aha1542->aha1542_last_mbi_used);
321 if (mb[mbi].status == 0) {
322 spin_unlock_irqrestore(sh->host_lock, flags);
323 /* Hmm, no mail. Must have read it the last time around */
324 if (!number_serviced)
325 shost_printk(KERN_WARNING, sh, "interrupt received, but no mail.\n");
326 return IRQ_HANDLED;
329 mbo = (scsi2int(mb[mbi].ccbptr) - (unsigned long)aha1542->ccb_handle) / sizeof(struct ccb);
330 mbistatus = mb[mbi].status;
331 mb[mbi].status = 0;
332 aha1542->aha1542_last_mbi_used = mbi;
334 #ifdef DEBUG
335 if (ccb[mbo].tarstat | ccb[mbo].hastat)
336 shost_printk(KERN_DEBUG, sh, "aha1542_command: returning %x (status %d)\n",
337 ccb[mbo].tarstat + ((int) ccb[mbo].hastat << 16), mb[mbi].status);
338 #endif
340 if (mbistatus == 3)
341 continue; /* Aborted command not found */
343 #ifdef DEBUG
344 shost_printk(KERN_DEBUG, sh, "...done %d %d\n", mbo, mbi);
345 #endif
347 tmp_cmd = aha1542->int_cmds[mbo];
349 if (!tmp_cmd || !tmp_cmd->scsi_done) {
350 spin_unlock_irqrestore(sh->host_lock, flags);
351 shost_printk(KERN_WARNING, sh, "Unexpected interrupt\n");
352 shost_printk(KERN_WARNING, sh, "tarstat=%x, hastat=%x idlun=%x ccb#=%d\n", ccb[mbo].tarstat,
353 ccb[mbo].hastat, ccb[mbo].idlun, mbo);
354 return IRQ_HANDLED;
356 my_done = tmp_cmd->scsi_done;
357 aha1542_free_cmd(tmp_cmd);
358 /* Fetch the sense data, and tuck it away, in the required slot. The
359 Adaptec automatically fetches it, and there is no guarantee that
360 we will still have it in the cdb when we come back */
361 if (ccb[mbo].tarstat == 2)
362 memcpy(tmp_cmd->sense_buffer, &ccb[mbo].cdb[ccb[mbo].cdblen],
363 SCSI_SENSE_BUFFERSIZE);
366 /* is there mail :-) */
368 /* more error checking left out here */
369 if (mbistatus != 1)
370 /* This is surely wrong, but I don't know what's right */
371 errstatus = makecode(ccb[mbo].hastat, ccb[mbo].tarstat);
372 else
373 errstatus = 0;
375 #ifdef DEBUG
376 if (errstatus)
377 shost_printk(KERN_DEBUG, sh, "(aha1542 error:%x %x %x) ", errstatus,
378 ccb[mbo].hastat, ccb[mbo].tarstat);
379 if (ccb[mbo].tarstat == 2)
380 print_hex_dump_bytes("sense: ", DUMP_PREFIX_NONE, &ccb[mbo].cdb[ccb[mbo].cdblen], 12);
381 if (errstatus)
382 printk("aha1542_intr_handle: returning %6x\n", errstatus);
383 #endif
384 tmp_cmd->result = errstatus;
385 aha1542->int_cmds[mbo] = NULL; /* This effectively frees up the mailbox slot, as
386 far as queuecommand is concerned */
387 my_done(tmp_cmd);
388 number_serviced++;
392 static int aha1542_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *cmd)
394 struct aha1542_cmd *acmd = scsi_cmd_priv(cmd);
395 struct aha1542_hostdata *aha1542 = shost_priv(sh);
396 u8 direction;
397 u8 target = cmd->device->id;
398 u8 lun = cmd->device->lun;
399 unsigned long flags;
400 int bufflen = scsi_bufflen(cmd);
401 int mbo, sg_count;
402 struct mailbox *mb = aha1542->mb;
403 struct ccb *ccb = aha1542->ccb;
405 if (*cmd->cmnd == REQUEST_SENSE) {
406 /* Don't do the command - we have the sense data already */
407 cmd->result = 0;
408 cmd->scsi_done(cmd);
409 return 0;
411 #ifdef DEBUG
413 int i = -1;
414 if (*cmd->cmnd == READ_10 || *cmd->cmnd == WRITE_10)
415 i = xscsi2int(cmd->cmnd + 2);
416 else if (*cmd->cmnd == READ_6 || *cmd->cmnd == WRITE_6)
417 i = scsi2int(cmd->cmnd + 2);
418 shost_printk(KERN_DEBUG, sh, "aha1542_queuecommand: dev %d cmd %02x pos %d len %d",
419 target, *cmd->cmnd, i, bufflen);
420 print_hex_dump_bytes("command: ", DUMP_PREFIX_NONE, cmd->cmnd, cmd->cmd_len);
422 #endif
423 sg_count = scsi_dma_map(cmd);
424 if (sg_count) {
425 size_t len = sg_count * sizeof(struct chain);
427 acmd->chain = kmalloc(len, GFP_DMA);
428 if (!acmd->chain)
429 goto out_unmap;
430 acmd->chain_handle = dma_map_single(sh->dma_dev, acmd->chain,
431 len, DMA_TO_DEVICE);
432 if (dma_mapping_error(sh->dma_dev, acmd->chain_handle))
433 goto out_free_chain;
436 /* Use the outgoing mailboxes in a round-robin fashion, because this
437 is how the host adapter will scan for them */
439 spin_lock_irqsave(sh->host_lock, flags);
440 mbo = aha1542->aha1542_last_mbo_used + 1;
441 if (mbo >= AHA1542_MAILBOXES)
442 mbo = 0;
444 do {
445 if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL)
446 break;
447 mbo++;
448 if (mbo >= AHA1542_MAILBOXES)
449 mbo = 0;
450 } while (mbo != aha1542->aha1542_last_mbo_used);
452 if (mb[mbo].status || aha1542->int_cmds[mbo])
453 panic("Unable to find empty mailbox for aha1542.\n");
455 aha1542->int_cmds[mbo] = cmd; /* This will effectively prevent someone else from
456 screwing with this cdb. */
458 aha1542->aha1542_last_mbo_used = mbo;
460 #ifdef DEBUG
461 shost_printk(KERN_DEBUG, sh, "Sending command (%d %p)...", mbo, cmd->scsi_done);
462 #endif
464 /* This gets trashed for some reason */
465 any2scsi(mb[mbo].ccbptr, aha1542->ccb_handle + mbo * sizeof(*ccb));
467 memset(&ccb[mbo], 0, sizeof(struct ccb));
469 ccb[mbo].cdblen = cmd->cmd_len;
471 direction = 0;
472 if (*cmd->cmnd == READ_10 || *cmd->cmnd == READ_6)
473 direction = 8;
474 else if (*cmd->cmnd == WRITE_10 || *cmd->cmnd == WRITE_6)
475 direction = 16;
477 memcpy(ccb[mbo].cdb, cmd->cmnd, ccb[mbo].cdblen);
479 if (bufflen) {
480 struct scatterlist *sg;
481 int i;
483 ccb[mbo].op = 2; /* SCSI Initiator Command w/scatter-gather */
484 scsi_for_each_sg(cmd, sg, sg_count, i) {
485 any2scsi(acmd->chain[i].dataptr, sg_dma_address(sg));
486 any2scsi(acmd->chain[i].datalen, sg_dma_len(sg));
488 any2scsi(ccb[mbo].datalen, sg_count * sizeof(struct chain));
489 any2scsi(ccb[mbo].dataptr, acmd->chain_handle);
490 #ifdef DEBUG
491 shost_printk(KERN_DEBUG, sh, "cptr %p: ", acmd->chain);
492 print_hex_dump_bytes("cptr: ", DUMP_PREFIX_NONE, acmd->chain, 18);
493 #endif
494 } else {
495 ccb[mbo].op = 0; /* SCSI Initiator Command */
496 any2scsi(ccb[mbo].datalen, 0);
497 any2scsi(ccb[mbo].dataptr, 0);
499 ccb[mbo].idlun = (target & 7) << 5 | direction | (lun & 7); /*SCSI Target Id */
500 ccb[mbo].rsalen = 16;
501 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
502 ccb[mbo].commlinkid = 0;
504 #ifdef DEBUG
505 print_hex_dump_bytes("sending: ", DUMP_PREFIX_NONE, &ccb[mbo], sizeof(ccb[mbo]) - 10);
506 printk("aha1542_queuecommand: now waiting for interrupt ");
507 #endif
508 mb[mbo].status = 1;
509 aha1542_outb(cmd->device->host->io_port, CMD_START_SCSI);
510 spin_unlock_irqrestore(sh->host_lock, flags);
512 return 0;
513 out_free_chain:
514 kfree(acmd->chain);
515 acmd->chain = NULL;
516 out_unmap:
517 scsi_dma_unmap(cmd);
518 return SCSI_MLQUEUE_HOST_BUSY;
521 /* Initialize mailboxes */
522 static void setup_mailboxes(struct Scsi_Host *sh)
524 struct aha1542_hostdata *aha1542 = shost_priv(sh);
525 u8 mb_cmd[5] = { CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0};
526 int i;
528 for (i = 0; i < AHA1542_MAILBOXES; i++) {
529 aha1542->mb[i].status = 0;
530 any2scsi(aha1542->mb[i].ccbptr,
531 aha1542->ccb_handle + i * sizeof(struct ccb));
532 aha1542->mb[AHA1542_MAILBOXES + i].status = 0;
534 aha1542_intr_reset(sh->io_port); /* reset interrupts, so they don't block */
535 any2scsi(mb_cmd + 2, aha1542->mb_handle);
536 if (aha1542_out(sh->io_port, mb_cmd, 5))
537 shost_printk(KERN_ERR, sh, "failed setting up mailboxes\n");
538 aha1542_intr_reset(sh->io_port);
541 static int aha1542_getconfig(struct Scsi_Host *sh)
543 u8 inquiry_result[3];
544 int i;
545 i = inb(STATUS(sh->io_port));
546 if (i & DF) {
547 i = inb(DATA(sh->io_port));
549 aha1542_outb(sh->io_port, CMD_RETCONF);
550 aha1542_in(sh->io_port, inquiry_result, 3, 0);
551 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0))
552 shost_printk(KERN_ERR, sh, "error querying board settings\n");
553 aha1542_intr_reset(sh->io_port);
554 switch (inquiry_result[0]) {
555 case 0x80:
556 sh->dma_channel = 7;
557 break;
558 case 0x40:
559 sh->dma_channel = 6;
560 break;
561 case 0x20:
562 sh->dma_channel = 5;
563 break;
564 case 0x01:
565 sh->dma_channel = 0;
566 break;
567 case 0:
568 /* This means that the adapter, although Adaptec 1542 compatible, doesn't use a DMA channel.
569 Currently only aware of the BusLogic BT-445S VL-Bus adapter which needs this. */
570 sh->dma_channel = 0xFF;
571 break;
572 default:
573 shost_printk(KERN_ERR, sh, "Unable to determine DMA channel.\n");
574 return -1;
576 switch (inquiry_result[1]) {
577 case 0x40:
578 sh->irq = 15;
579 break;
580 case 0x20:
581 sh->irq = 14;
582 break;
583 case 0x8:
584 sh->irq = 12;
585 break;
586 case 0x4:
587 sh->irq = 11;
588 break;
589 case 0x2:
590 sh->irq = 10;
591 break;
592 case 0x1:
593 sh->irq = 9;
594 break;
595 default:
596 shost_printk(KERN_ERR, sh, "Unable to determine IRQ level.\n");
597 return -1;
599 sh->this_id = inquiry_result[2] & 7;
600 return 0;
603 /* This function should only be called for 1542C boards - we can detect
604 the special firmware settings and unlock the board */
606 static int aha1542_mbenable(struct Scsi_Host *sh)
608 static u8 mbenable_cmd[3];
609 static u8 mbenable_result[2];
610 int retval;
612 retval = BIOS_TRANSLATION_6432;
614 aha1542_outb(sh->io_port, CMD_EXTBIOS);
615 if (aha1542_in(sh->io_port, mbenable_result, 2, 100))
616 return retval;
617 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 100))
618 goto fail;
619 aha1542_intr_reset(sh->io_port);
621 if ((mbenable_result[0] & 0x08) || mbenable_result[1]) {
622 mbenable_cmd[0] = CMD_MBENABLE;
623 mbenable_cmd[1] = 0;
624 mbenable_cmd[2] = mbenable_result[1];
626 if ((mbenable_result[0] & 0x08) && (mbenable_result[1] & 0x03))
627 retval = BIOS_TRANSLATION_25563;
629 if (aha1542_out(sh->io_port, mbenable_cmd, 3))
630 goto fail;
632 while (0) {
633 fail:
634 shost_printk(KERN_ERR, sh, "Mailbox init failed\n");
636 aha1542_intr_reset(sh->io_port);
637 return retval;
640 /* Query the board to find out if it is a 1542 or a 1740, or whatever. */
641 static int aha1542_query(struct Scsi_Host *sh)
643 struct aha1542_hostdata *aha1542 = shost_priv(sh);
644 u8 inquiry_result[4];
645 int i;
646 i = inb(STATUS(sh->io_port));
647 if (i & DF) {
648 i = inb(DATA(sh->io_port));
650 aha1542_outb(sh->io_port, CMD_INQUIRY);
651 aha1542_in(sh->io_port, inquiry_result, 4, 0);
652 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0))
653 shost_printk(KERN_ERR, sh, "error querying card type\n");
654 aha1542_intr_reset(sh->io_port);
656 aha1542->bios_translation = BIOS_TRANSLATION_6432; /* Default case */
658 /* For an AHA1740 series board, we ignore the board since there is a
659 hardware bug which can lead to wrong blocks being returned if the board
660 is operating in the 1542 emulation mode. Since there is an extended mode
661 driver, we simply ignore the board and let the 1740 driver pick it up.
664 if (inquiry_result[0] == 0x43) {
665 shost_printk(KERN_INFO, sh, "Emulation mode not supported for AHA-1740 hardware, use aha1740 driver instead.\n");
666 return 1;
669 /* Always call this - boards that do not support extended bios translation
670 will ignore the command, and we will set the proper default */
672 aha1542->bios_translation = aha1542_mbenable(sh);
674 return 0;
677 static u8 dma_speed_hw(int dma_speed)
679 switch (dma_speed) {
680 case 5:
681 return 0x00;
682 case 6:
683 return 0x04;
684 case 7:
685 return 0x01;
686 case 8:
687 return 0x02;
688 case 10:
689 return 0x03;
692 return 0xff; /* invalid */
695 /* Set the Bus on/off-times as not to ruin floppy performance */
696 static void aha1542_set_bus_times(struct Scsi_Host *sh, int bus_on, int bus_off, int dma_speed)
698 if (bus_on > 0) {
699 u8 oncmd[] = { CMD_BUSON_TIME, clamp(bus_on, 2, 15) };
701 aha1542_intr_reset(sh->io_port);
702 if (aha1542_out(sh->io_port, oncmd, 2))
703 goto fail;
706 if (bus_off > 0) {
707 u8 offcmd[] = { CMD_BUSOFF_TIME, clamp(bus_off, 1, 64) };
709 aha1542_intr_reset(sh->io_port);
710 if (aha1542_out(sh->io_port, offcmd, 2))
711 goto fail;
714 if (dma_speed_hw(dma_speed) != 0xff) {
715 u8 dmacmd[] = { CMD_DMASPEED, dma_speed_hw(dma_speed) };
717 aha1542_intr_reset(sh->io_port);
718 if (aha1542_out(sh->io_port, dmacmd, 2))
719 goto fail;
721 aha1542_intr_reset(sh->io_port);
722 return;
723 fail:
724 shost_printk(KERN_ERR, sh, "setting bus on/off-time failed\n");
725 aha1542_intr_reset(sh->io_port);
728 /* return non-zero on detection */
729 static struct Scsi_Host *aha1542_hw_init(struct scsi_host_template *tpnt, struct device *pdev, int indx)
731 unsigned int base_io = io[indx];
732 struct Scsi_Host *sh;
733 struct aha1542_hostdata *aha1542;
734 char dma_info[] = "no DMA";
736 if (base_io == 0)
737 return NULL;
739 if (!request_region(base_io, AHA1542_REGION_SIZE, "aha1542"))
740 return NULL;
742 sh = scsi_host_alloc(tpnt, sizeof(struct aha1542_hostdata));
743 if (!sh)
744 goto release;
745 aha1542 = shost_priv(sh);
747 sh->unique_id = base_io;
748 sh->io_port = base_io;
749 sh->n_io_port = AHA1542_REGION_SIZE;
750 aha1542->aha1542_last_mbi_used = 2 * AHA1542_MAILBOXES - 1;
751 aha1542->aha1542_last_mbo_used = AHA1542_MAILBOXES - 1;
753 if (!aha1542_test_port(sh))
754 goto unregister;
756 aha1542_set_bus_times(sh, bus_on[indx], bus_off[indx], dma_speed[indx]);
757 if (aha1542_query(sh))
758 goto unregister;
759 if (aha1542_getconfig(sh) == -1)
760 goto unregister;
762 if (sh->dma_channel != 0xFF)
763 snprintf(dma_info, sizeof(dma_info), "DMA %d", sh->dma_channel);
764 shost_printk(KERN_INFO, sh, "Adaptec AHA-1542 (SCSI-ID %d) at IO 0x%x, IRQ %d, %s\n",
765 sh->this_id, base_io, sh->irq, dma_info);
766 if (aha1542->bios_translation == BIOS_TRANSLATION_25563)
767 shost_printk(KERN_INFO, sh, "Using extended bios translation\n");
769 if (dma_set_mask_and_coherent(pdev, DMA_BIT_MASK(24)) < 0)
770 goto unregister;
772 aha1542->mb = dma_alloc_coherent(pdev,
773 AHA1542_MAILBOXES * 2 * sizeof(struct mailbox),
774 &aha1542->mb_handle, GFP_KERNEL);
775 if (!aha1542->mb)
776 goto unregister;
778 aha1542->ccb = dma_alloc_coherent(pdev,
779 AHA1542_MAILBOXES * sizeof(struct ccb),
780 &aha1542->ccb_handle, GFP_KERNEL);
781 if (!aha1542->ccb)
782 goto free_mb;
784 setup_mailboxes(sh);
786 if (request_irq(sh->irq, aha1542_interrupt, 0, "aha1542", sh)) {
787 shost_printk(KERN_ERR, sh, "Unable to allocate IRQ.\n");
788 goto free_ccb;
790 if (sh->dma_channel != 0xFF) {
791 if (request_dma(sh->dma_channel, "aha1542")) {
792 shost_printk(KERN_ERR, sh, "Unable to allocate DMA channel.\n");
793 goto free_irq;
795 if (sh->dma_channel == 0 || sh->dma_channel >= 5) {
796 set_dma_mode(sh->dma_channel, DMA_MODE_CASCADE);
797 enable_dma(sh->dma_channel);
801 if (scsi_add_host(sh, pdev))
802 goto free_dma;
804 scsi_scan_host(sh);
806 return sh;
808 free_dma:
809 if (sh->dma_channel != 0xff)
810 free_dma(sh->dma_channel);
811 free_irq:
812 free_irq(sh->irq, sh);
813 free_ccb:
814 dma_free_coherent(pdev, AHA1542_MAILBOXES * sizeof(struct ccb),
815 aha1542->ccb, aha1542->ccb_handle);
816 free_mb:
817 dma_free_coherent(pdev, AHA1542_MAILBOXES * 2 * sizeof(struct mailbox),
818 aha1542->mb, aha1542->mb_handle);
819 unregister:
820 scsi_host_put(sh);
821 release:
822 release_region(base_io, AHA1542_REGION_SIZE);
824 return NULL;
827 static int aha1542_release(struct Scsi_Host *sh)
829 struct aha1542_hostdata *aha1542 = shost_priv(sh);
830 struct device *dev = sh->dma_dev;
832 scsi_remove_host(sh);
833 if (sh->dma_channel != 0xff)
834 free_dma(sh->dma_channel);
835 dma_free_coherent(dev, AHA1542_MAILBOXES * sizeof(struct ccb),
836 aha1542->ccb, aha1542->ccb_handle);
837 dma_free_coherent(dev, AHA1542_MAILBOXES * 2 * sizeof(struct mailbox),
838 aha1542->mb, aha1542->mb_handle);
839 if (sh->irq)
840 free_irq(sh->irq, sh);
841 if (sh->io_port && sh->n_io_port)
842 release_region(sh->io_port, sh->n_io_port);
843 scsi_host_put(sh);
844 return 0;
849 * This is a device reset. This is handled by sending a special command
850 * to the device.
852 static int aha1542_dev_reset(struct scsi_cmnd *cmd)
854 struct Scsi_Host *sh = cmd->device->host;
855 struct aha1542_hostdata *aha1542 = shost_priv(sh);
856 unsigned long flags;
857 struct mailbox *mb = aha1542->mb;
858 u8 target = cmd->device->id;
859 u8 lun = cmd->device->lun;
860 int mbo;
861 struct ccb *ccb = aha1542->ccb;
863 spin_lock_irqsave(sh->host_lock, flags);
864 mbo = aha1542->aha1542_last_mbo_used + 1;
865 if (mbo >= AHA1542_MAILBOXES)
866 mbo = 0;
868 do {
869 if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL)
870 break;
871 mbo++;
872 if (mbo >= AHA1542_MAILBOXES)
873 mbo = 0;
874 } while (mbo != aha1542->aha1542_last_mbo_used);
876 if (mb[mbo].status || aha1542->int_cmds[mbo])
877 panic("Unable to find empty mailbox for aha1542.\n");
879 aha1542->int_cmds[mbo] = cmd; /* This will effectively
880 prevent someone else from
881 screwing with this cdb. */
883 aha1542->aha1542_last_mbo_used = mbo;
885 /* This gets trashed for some reason */
886 any2scsi(mb[mbo].ccbptr, aha1542->ccb_handle + mbo * sizeof(*ccb));
888 memset(&ccb[mbo], 0, sizeof(struct ccb));
890 ccb[mbo].op = 0x81; /* BUS DEVICE RESET */
892 ccb[mbo].idlun = (target & 7) << 5 | (lun & 7); /*SCSI Target Id */
894 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
895 ccb[mbo].commlinkid = 0;
898 * Now tell the 1542 to flush all pending commands for this
899 * target
901 aha1542_outb(sh->io_port, CMD_START_SCSI);
902 spin_unlock_irqrestore(sh->host_lock, flags);
904 scmd_printk(KERN_WARNING, cmd,
905 "Trying device reset for target\n");
907 return SUCCESS;
910 static int aha1542_reset(struct scsi_cmnd *cmd, u8 reset_cmd)
912 struct Scsi_Host *sh = cmd->device->host;
913 struct aha1542_hostdata *aha1542 = shost_priv(sh);
914 unsigned long flags;
915 int i;
917 spin_lock_irqsave(sh->host_lock, flags);
919 * This does a scsi reset for all devices on the bus.
920 * In principle, we could also reset the 1542 - should
921 * we do this? Try this first, and we can add that later
922 * if it turns out to be useful.
924 outb(reset_cmd, CONTROL(cmd->device->host->io_port));
926 if (!wait_mask(STATUS(cmd->device->host->io_port),
927 STATMASK, IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0)) {
928 spin_unlock_irqrestore(sh->host_lock, flags);
929 return FAILED;
933 * We need to do this too before the 1542 can interact with
934 * us again after host reset.
936 if (reset_cmd & HRST)
937 setup_mailboxes(cmd->device->host);
940 * Now try to pick up the pieces. For all pending commands,
941 * free any internal data structures, and basically clear things
942 * out. We do not try and restart any commands or anything -
943 * the strategy handler takes care of that crap.
945 shost_printk(KERN_WARNING, cmd->device->host, "Sent BUS RESET to scsi host %d\n", cmd->device->host->host_no);
947 for (i = 0; i < AHA1542_MAILBOXES; i++) {
948 if (aha1542->int_cmds[i] != NULL) {
949 struct scsi_cmnd *tmp_cmd;
950 tmp_cmd = aha1542->int_cmds[i];
952 if (tmp_cmd->device->soft_reset) {
954 * If this device implements the soft reset option,
955 * then it is still holding onto the command, and
956 * may yet complete it. In this case, we don't
957 * flush the data.
959 continue;
961 aha1542_free_cmd(tmp_cmd);
962 aha1542->int_cmds[i] = NULL;
963 aha1542->mb[i].status = 0;
967 spin_unlock_irqrestore(sh->host_lock, flags);
968 return SUCCESS;
971 static int aha1542_bus_reset(struct scsi_cmnd *cmd)
973 return aha1542_reset(cmd, SCRST);
976 static int aha1542_host_reset(struct scsi_cmnd *cmd)
978 return aha1542_reset(cmd, HRST | SCRST);
981 static int aha1542_biosparam(struct scsi_device *sdev,
982 struct block_device *bdev, sector_t capacity, int geom[])
984 struct aha1542_hostdata *aha1542 = shost_priv(sdev->host);
986 if (capacity >= 0x200000 &&
987 aha1542->bios_translation == BIOS_TRANSLATION_25563) {
988 /* Please verify that this is the same as what DOS returns */
989 geom[0] = 255; /* heads */
990 geom[1] = 63; /* sectors */
991 } else {
992 geom[0] = 64; /* heads */
993 geom[1] = 32; /* sectors */
995 geom[2] = sector_div(capacity, geom[0] * geom[1]); /* cylinders */
997 return 0;
999 MODULE_LICENSE("GPL");
1001 static struct scsi_host_template driver_template = {
1002 .module = THIS_MODULE,
1003 .proc_name = "aha1542",
1004 .name = "Adaptec 1542",
1005 .cmd_size = sizeof(struct aha1542_cmd),
1006 .queuecommand = aha1542_queuecommand,
1007 .eh_device_reset_handler= aha1542_dev_reset,
1008 .eh_bus_reset_handler = aha1542_bus_reset,
1009 .eh_host_reset_handler = aha1542_host_reset,
1010 .bios_param = aha1542_biosparam,
1011 .can_queue = AHA1542_MAILBOXES,
1012 .this_id = 7,
1013 .sg_tablesize = 16,
1014 .unchecked_isa_dma = 1,
1017 static int aha1542_isa_match(struct device *pdev, unsigned int ndev)
1019 struct Scsi_Host *sh = aha1542_hw_init(&driver_template, pdev, ndev);
1021 if (!sh)
1022 return 0;
1024 dev_set_drvdata(pdev, sh);
1025 return 1;
1028 static int aha1542_isa_remove(struct device *pdev,
1029 unsigned int ndev)
1031 aha1542_release(dev_get_drvdata(pdev));
1032 dev_set_drvdata(pdev, NULL);
1033 return 0;
1036 static struct isa_driver aha1542_isa_driver = {
1037 .match = aha1542_isa_match,
1038 .remove = aha1542_isa_remove,
1039 .driver = {
1040 .name = "aha1542"
1043 static int isa_registered;
1045 #ifdef CONFIG_PNP
1046 static const struct pnp_device_id aha1542_pnp_ids[] = {
1047 { .id = "ADP1542" },
1048 { .id = "" }
1050 MODULE_DEVICE_TABLE(pnp, aha1542_pnp_ids);
1052 static int aha1542_pnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *id)
1054 int indx;
1055 struct Scsi_Host *sh;
1057 for (indx = 0; indx < ARRAY_SIZE(io); indx++) {
1058 if (io[indx])
1059 continue;
1061 if (pnp_activate_dev(pdev) < 0)
1062 continue;
1064 io[indx] = pnp_port_start(pdev, 0);
1066 /* The card can be queried for its DMA, we have
1067 the DMA set up that is enough */
1069 dev_info(&pdev->dev, "ISAPnP found an AHA1535 at I/O 0x%03X", io[indx]);
1072 sh = aha1542_hw_init(&driver_template, &pdev->dev, indx);
1073 if (!sh)
1074 return -ENODEV;
1076 pnp_set_drvdata(pdev, sh);
1077 return 0;
1080 static void aha1542_pnp_remove(struct pnp_dev *pdev)
1082 aha1542_release(pnp_get_drvdata(pdev));
1083 pnp_set_drvdata(pdev, NULL);
1086 static struct pnp_driver aha1542_pnp_driver = {
1087 .name = "aha1542",
1088 .id_table = aha1542_pnp_ids,
1089 .probe = aha1542_pnp_probe,
1090 .remove = aha1542_pnp_remove,
1092 static int pnp_registered;
1093 #endif /* CONFIG_PNP */
1095 static int __init aha1542_init(void)
1097 int ret = 0;
1099 #ifdef CONFIG_PNP
1100 if (isapnp) {
1101 ret = pnp_register_driver(&aha1542_pnp_driver);
1102 if (!ret)
1103 pnp_registered = 1;
1105 #endif
1106 ret = isa_register_driver(&aha1542_isa_driver, MAXBOARDS);
1107 if (!ret)
1108 isa_registered = 1;
1110 #ifdef CONFIG_PNP
1111 if (pnp_registered)
1112 ret = 0;
1113 #endif
1114 if (isa_registered)
1115 ret = 0;
1117 return ret;
1120 static void __exit aha1542_exit(void)
1122 #ifdef CONFIG_PNP
1123 if (pnp_registered)
1124 pnp_unregister_driver(&aha1542_pnp_driver);
1125 #endif
1126 if (isa_registered)
1127 isa_unregister_driver(&aha1542_isa_driver);
1130 module_init(aha1542_init);
1131 module_exit(aha1542_exit);