Merge tag 'ext4_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / scsi / aha1542.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  *  Driver for Adaptec AHA-1542 SCSI host adapters
4  *
5  *  Copyright (C) 1992  Tommy Thorn
6  *  Copyright (C) 1993, 1994, 1995 Eric Youngdale
7  *  Copyright (C) 2015 Ondrej Zary
8  */
9
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"
27
28 #define MAXBOARDS 4
29
30 static bool isapnp = 1;
31 module_param(isapnp, bool, 0);
32 MODULE_PARM_DESC(isapnp, "enable PnP support (default=1)");
33
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)");
37
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])");
42
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])");
47
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])");
52
53 #define BIOS_TRANSLATION_6432 1 /* Default case these days */
54 #define BIOS_TRANSLATION_25563 2        /* Big disk case */
55
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;
66 };
67
68 struct aha1542_cmd {
69         struct chain *chain;
70         dma_addr_t chain_handle;
71 };
72
73 static inline void aha1542_intr_reset(u16 base)
74 {
75         outb(IRST, CONTROL(base));
76 }
77
78 static inline bool wait_mask(u16 port, u8 mask, u8 allof, u8 noneof, int timeout)
79 {
80         bool delayed = true;
81
82         if (timeout == 0) {
83                 timeout = 3000000;
84                 delayed = false;
85         }
86
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;
95         }
96
97         return true;
98 }
99
100 static int aha1542_outb(unsigned int base, u8 val)
101 {
102         if (!wait_mask(STATUS(base), CDF, 0, CDF, 0))
103                 return 1;
104         outb(val, DATA(base));
105
106         return 0;
107 }
108
109 static int aha1542_out(unsigned int base, u8 *buf, int len)
110 {
111         while (len--) {
112                 if (!wait_mask(STATUS(base), CDF, 0, CDF, 0))
113                         return 1;
114                 outb(*buf++, DATA(base));
115         }
116         if (!wait_mask(INTRFLAGS(base), INTRMASK, HACC, 0, 0))
117                 return 1;
118
119         return 0;
120 }
121
122 /* Only used at boot time, so we do not need to worry about latency as much
123    here */
124
125 static int aha1542_in(unsigned int base, u8 *buf, int len, int timeout)
126 {
127         while (len--) {
128                 if (!wait_mask(STATUS(base), DF, DF, 0, timeout))
129                         return 1;
130                 *buf++ = inb(DATA(base));
131         }
132         return 0;
133 }
134
135 static int makecode(unsigned hosterr, unsigned scsierr)
136 {
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;
143
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;
148
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. */
152
153         case 0x13:              /* Unexpected bus free-The target dropped the SCSI BSY at an unexpected time. */
154
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. */
157
158         case 0x16:              /* Invalid CCB Operation Code-The first byte of the CCB was invalid.
159                                    This usually indicates a software failure. */
160
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. */
166
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. */
170
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;
179
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;
189         }
190         return scsierr | (hosterr << 16);
191 }
192
193 static int aha1542_test_port(struct Scsi_Host *sh)
194 {
195         u8 inquiry_result[4];
196         int i;
197
198         /* Quick and dirty test for presence of the card. */
199         if (inb(STATUS(sh->io_port)) == 0xff)
200                 return 0;
201
202         /* Reset the adapter. I ought to make a hard reset, but it's not really necessary */
203
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 */
206
207         outb(SRST | IRST /*|SCRST */ , CONTROL(sh->io_port));
208
209         mdelay(20);             /* Wait a little bit for things to settle down. */
210
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;
214
215         /* Shouldn't have generated any interrupts during reset */
216         if (inb(INTRFLAGS(sh->io_port)) & INTRMASK)
217                 return 0;
218
219         /* Perform a host adapter inquiry instead so we do not need to set
220            up the mailboxes ahead of time */
221
222         aha1542_outb(sh->io_port, CMD_INQUIRY);
223
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));
228         }
229
230         /* Reading port should reset DF */
231         if (inb(STATUS(sh->io_port)) & DF)
232                 return 0;
233
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;
237
238         /* Clear interrupts */
239         outb(IRST, CONTROL(sh->io_port));
240
241         return 1;
242 }
243
244 static void aha1542_free_cmd(struct scsi_cmnd *cmd)
245 {
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);
249
250         if (acmd->chain) {
251                 dma_unmap_single(dev, acmd->chain_handle, len, DMA_TO_DEVICE);
252                 kfree(acmd->chain);
253         }
254
255         acmd->chain = NULL;
256         scsi_dma_unmap(cmd);
257 }
258
259 static irqreturn_t aha1542_interrupt(int irq, void *dev_id)
260 {
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;
271
272 #ifdef DEBUG
273         {
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)));
287         };
288 #endif
289         number_serviced = 0;
290
291         spin_lock_irqsave(sh->host_lock, flags);
292         while (1) {
293                 flag = inb(INTRFLAGS(sh->io_port));
294
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 ");
306                 }
307                 aha1542_intr_reset(sh->io_port);
308
309                 mbi = aha1542->aha1542_last_mbi_used + 1;
310                 if (mbi >= 2 * AHA1542_MAILBOXES)
311                         mbi = AHA1542_MAILBOXES;
312
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);
320
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;
327                 };
328
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;
333
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
339
340                 if (mbistatus == 3)
341                         continue;       /* Aborted command not found */
342
343 #ifdef DEBUG
344                 shost_printk(KERN_DEBUG, sh, "...done %d %d\n", mbo, mbi);
345 #endif
346
347                 tmp_cmd = aha1542->int_cmds[mbo];
348
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;
355                 }
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);
364
365
366                 /* is there mail :-) */
367
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;
374
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++;
389         };
390 }
391
392 static int aha1542_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *cmd)
393 {
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;
404
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;
410         }
411 #ifdef DEBUG
412         {
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);
421         }
422 #endif
423         sg_count = scsi_dma_map(cmd);
424         if (sg_count) {
425                 size_t len = sg_count * sizeof(struct chain);
426
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;
434         }
435
436         /* Use the outgoing mailboxes in a round-robin fashion, because this
437            is how the host adapter will scan for them */
438
439         spin_lock_irqsave(sh->host_lock, flags);
440         mbo = aha1542->aha1542_last_mbo_used + 1;
441         if (mbo >= AHA1542_MAILBOXES)
442                 mbo = 0;
443
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);
451
452         if (mb[mbo].status || aha1542->int_cmds[mbo])
453                 panic("Unable to find empty mailbox for aha1542.\n");
454
455         aha1542->int_cmds[mbo] = cmd;   /* This will effectively prevent someone else from
456                                            screwing with this cdb. */
457
458         aha1542->aha1542_last_mbo_used = mbo;
459
460 #ifdef DEBUG
461         shost_printk(KERN_DEBUG, sh, "Sending command (%d %p)...", mbo, cmd->scsi_done);
462 #endif
463
464         /* This gets trashed for some reason */
465         any2scsi(mb[mbo].ccbptr, aha1542->ccb_handle + mbo * sizeof(*ccb));
466
467         memset(&ccb[mbo], 0, sizeof(struct ccb));
468
469         ccb[mbo].cdblen = cmd->cmd_len;
470
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;
476
477         memcpy(ccb[mbo].cdb, cmd->cmnd, ccb[mbo].cdblen);
478
479         if (bufflen) {
480                 struct scatterlist *sg;
481                 int i;
482
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));
487                 };
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);
498         };
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;
503
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);
511
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;
519 }
520
521 /* Initialize mailboxes */
522 static void setup_mailboxes(struct Scsi_Host *sh)
523 {
524         struct aha1542_hostdata *aha1542 = shost_priv(sh);
525         u8 mb_cmd[5] = { CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0};
526         int i;
527
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;
533         };
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);
539 }
540
541 static int aha1542_getconfig(struct Scsi_Host *sh)
542 {
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));
548         };
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;
575         };
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;
598         };
599         sh->this_id = inquiry_result[2] & 7;
600         return 0;
601 }
602
603 /* This function should only be called for 1542C boards - we can detect
604    the special firmware settings and unlock the board */
605
606 static int aha1542_mbenable(struct Scsi_Host *sh)
607 {
608         static u8 mbenable_cmd[3];
609         static u8 mbenable_result[2];
610         int retval;
611
612         retval = BIOS_TRANSLATION_6432;
613
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);
620
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];
625
626                 if ((mbenable_result[0] & 0x08) && (mbenable_result[1] & 0x03))
627                         retval = BIOS_TRANSLATION_25563;
628
629                 if (aha1542_out(sh->io_port, mbenable_cmd, 3))
630                         goto fail;
631         };
632         while (0) {
633 fail:
634                 shost_printk(KERN_ERR, sh, "Mailbox init failed\n");
635         }
636         aha1542_intr_reset(sh->io_port);
637         return retval;
638 }
639
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)
642 {
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));
649         };
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);
655
656         aha1542->bios_translation = BIOS_TRANSLATION_6432;      /* Default case */
657
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.
662          */
663
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;
667         };
668
669         /* Always call this - boards that do not support extended bios translation
670            will ignore the command, and we will set the proper default */
671
672         aha1542->bios_translation = aha1542_mbenable(sh);
673
674         return 0;
675 }
676
677 static u8 dma_speed_hw(int dma_speed)
678 {
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;
690         }
691
692         return 0xff;    /* invalid */
693 }
694
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)
697 {
698         if (bus_on > 0) {
699                 u8 oncmd[] = { CMD_BUSON_TIME, clamp(bus_on, 2, 15) };
700
701                 aha1542_intr_reset(sh->io_port);
702                 if (aha1542_out(sh->io_port, oncmd, 2))
703                         goto fail;
704         }
705
706         if (bus_off > 0) {
707                 u8 offcmd[] = { CMD_BUSOFF_TIME, clamp(bus_off, 1, 64) };
708
709                 aha1542_intr_reset(sh->io_port);
710                 if (aha1542_out(sh->io_port, offcmd, 2))
711                         goto fail;
712         }
713
714         if (dma_speed_hw(dma_speed) != 0xff) {
715                 u8 dmacmd[] = { CMD_DMASPEED, dma_speed_hw(dma_speed) };
716
717                 aha1542_intr_reset(sh->io_port);
718                 if (aha1542_out(sh->io_port, dmacmd, 2))
719                         goto fail;
720         }
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);
726 }
727
728 /* return non-zero on detection */
729 static struct Scsi_Host *aha1542_hw_init(struct scsi_host_template *tpnt, struct device *pdev, int indx)
730 {
731         unsigned int base_io = io[indx];
732         struct Scsi_Host *sh;
733         struct aha1542_hostdata *aha1542;
734         char dma_info[] = "no DMA";
735
736         if (base_io == 0)
737                 return NULL;
738
739         if (!request_region(base_io, AHA1542_REGION_SIZE, "aha1542"))
740                 return NULL;
741
742         sh = scsi_host_alloc(tpnt, sizeof(struct aha1542_hostdata));
743         if (!sh)
744                 goto release;
745         aha1542 = shost_priv(sh);
746
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;
752
753         if (!aha1542_test_port(sh))
754                 goto unregister;
755
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;
761
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");
768
769         if (dma_set_mask_and_coherent(pdev, DMA_BIT_MASK(24)) < 0)
770                 goto unregister;
771
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;
777
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;
783
784         setup_mailboxes(sh);
785
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;
789         }
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;
794                 }
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);
798                 }
799         }
800
801         if (scsi_add_host(sh, pdev))
802                 goto free_dma;
803
804         scsi_scan_host(sh);
805
806         return sh;
807
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);
823
824         return NULL;
825 }
826
827 static int aha1542_release(struct Scsi_Host *sh)
828 {
829         struct aha1542_hostdata *aha1542 = shost_priv(sh);
830         struct device *dev = sh->dma_dev;
831
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;
845 }
846
847
848 /*
849  * This is a device reset.  This is handled by sending a special command
850  * to the device.
851  */
852 static int aha1542_dev_reset(struct scsi_cmnd *cmd)
853 {
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;
862
863         spin_lock_irqsave(sh->host_lock, flags);
864         mbo = aha1542->aha1542_last_mbo_used + 1;
865         if (mbo >= AHA1542_MAILBOXES)
866                 mbo = 0;
867
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);
875
876         if (mb[mbo].status || aha1542->int_cmds[mbo])
877                 panic("Unable to find empty mailbox for aha1542.\n");
878
879         aha1542->int_cmds[mbo] = cmd;   /* This will effectively
880                                            prevent someone else from
881                                            screwing with this cdb. */
882
883         aha1542->aha1542_last_mbo_used = mbo;
884
885         /* This gets trashed for some reason */
886         any2scsi(mb[mbo].ccbptr, aha1542->ccb_handle + mbo * sizeof(*ccb));
887
888         memset(&ccb[mbo], 0, sizeof(struct ccb));
889
890         ccb[mbo].op = 0x81;     /* BUS DEVICE RESET */
891
892         ccb[mbo].idlun = (target & 7) << 5 | (lun & 7);         /*SCSI Target Id */
893
894         ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
895         ccb[mbo].commlinkid = 0;
896
897         /* 
898          * Now tell the 1542 to flush all pending commands for this 
899          * target 
900          */
901         aha1542_outb(sh->io_port, CMD_START_SCSI);
902         spin_unlock_irqrestore(sh->host_lock, flags);
903
904         scmd_printk(KERN_WARNING, cmd,
905                 "Trying device reset for target\n");
906
907         return SUCCESS;
908 }
909
910 static int aha1542_reset(struct scsi_cmnd *cmd, u8 reset_cmd)
911 {
912         struct Scsi_Host *sh = cmd->device->host;
913         struct aha1542_hostdata *aha1542 = shost_priv(sh);
914         unsigned long flags;
915         int i;
916
917         spin_lock_irqsave(sh->host_lock, flags);
918         /* 
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.
923          */
924         outb(reset_cmd, CONTROL(cmd->device->host->io_port));
925
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;
930         }
931
932         /*
933          * We need to do this too before the 1542 can interact with
934          * us again after host reset.
935          */
936         if (reset_cmd & HRST)
937                 setup_mailboxes(cmd->device->host);
938
939         /*
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.
944          */
945         shost_printk(KERN_WARNING, cmd->device->host, "Sent BUS RESET to scsi host %d\n", cmd->device->host->host_no);
946
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];
951
952                         if (tmp_cmd->device->soft_reset) {
953                                 /*
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.
958                                  */
959                                 continue;
960                         }
961                         aha1542_free_cmd(tmp_cmd);
962                         aha1542->int_cmds[i] = NULL;
963                         aha1542->mb[i].status = 0;
964                 }
965         }
966
967         spin_unlock_irqrestore(sh->host_lock, flags);
968         return SUCCESS;
969 }
970
971 static int aha1542_bus_reset(struct scsi_cmnd *cmd)
972 {
973         return aha1542_reset(cmd, SCRST);
974 }
975
976 static int aha1542_host_reset(struct scsi_cmnd *cmd)
977 {
978         return aha1542_reset(cmd, HRST | SCRST);
979 }
980
981 static int aha1542_biosparam(struct scsi_device *sdev,
982                 struct block_device *bdev, sector_t capacity, int geom[])
983 {
984         struct aha1542_hostdata *aha1542 = shost_priv(sdev->host);
985
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 */
994         }
995         geom[2] = sector_div(capacity, geom[0] * geom[1]);      /* cylinders */
996
997         return 0;
998 }
999 MODULE_LICENSE("GPL");
1000
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, 
1015 };
1016
1017 static int aha1542_isa_match(struct device *pdev, unsigned int ndev)
1018 {
1019         struct Scsi_Host *sh = aha1542_hw_init(&driver_template, pdev, ndev);
1020
1021         if (!sh)
1022                 return 0;
1023
1024         dev_set_drvdata(pdev, sh);
1025         return 1;
1026 }
1027
1028 static int aha1542_isa_remove(struct device *pdev,
1029                                     unsigned int ndev)
1030 {
1031         aha1542_release(dev_get_drvdata(pdev));
1032         dev_set_drvdata(pdev, NULL);
1033         return 0;
1034 }
1035
1036 static struct isa_driver aha1542_isa_driver = {
1037         .match          = aha1542_isa_match,
1038         .remove         = aha1542_isa_remove,
1039         .driver         = {
1040                 .name   = "aha1542"
1041         },
1042 };
1043 static int isa_registered;
1044
1045 #ifdef CONFIG_PNP
1046 static const struct pnp_device_id aha1542_pnp_ids[] = {
1047         { .id = "ADP1542" },
1048         { .id = "" }
1049 };
1050 MODULE_DEVICE_TABLE(pnp, aha1542_pnp_ids);
1051
1052 static int aha1542_pnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *id)
1053 {
1054         int indx;
1055         struct Scsi_Host *sh;
1056
1057         for (indx = 0; indx < ARRAY_SIZE(io); indx++) {
1058                 if (io[indx])
1059                         continue;
1060
1061                 if (pnp_activate_dev(pdev) < 0)
1062                         continue;
1063
1064                 io[indx] = pnp_port_start(pdev, 0);
1065
1066                 /* The card can be queried for its DMA, we have
1067                    the DMA set up that is enough */
1068
1069                 dev_info(&pdev->dev, "ISAPnP found an AHA1535 at I/O 0x%03X", io[indx]);
1070         }
1071
1072         sh = aha1542_hw_init(&driver_template, &pdev->dev, indx);
1073         if (!sh)
1074                 return -ENODEV;
1075
1076         pnp_set_drvdata(pdev, sh);
1077         return 0;
1078 }
1079
1080 static void aha1542_pnp_remove(struct pnp_dev *pdev)
1081 {
1082         aha1542_release(pnp_get_drvdata(pdev));
1083         pnp_set_drvdata(pdev, NULL);
1084 }
1085
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,
1091 };
1092 static int pnp_registered;
1093 #endif /* CONFIG_PNP */
1094
1095 static int __init aha1542_init(void)
1096 {
1097         int ret = 0;
1098
1099 #ifdef CONFIG_PNP
1100         if (isapnp) {
1101                 ret = pnp_register_driver(&aha1542_pnp_driver);
1102                 if (!ret)
1103                         pnp_registered = 1;
1104         }
1105 #endif
1106         ret = isa_register_driver(&aha1542_isa_driver, MAXBOARDS);
1107         if (!ret)
1108                 isa_registered = 1;
1109
1110 #ifdef CONFIG_PNP
1111         if (pnp_registered)
1112                 ret = 0;
1113 #endif
1114         if (isa_registered)
1115                 ret = 0;
1116
1117         return ret;
1118 }
1119
1120 static void __exit aha1542_exit(void)
1121 {
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);
1128 }
1129
1130 module_init(aha1542_init);
1131 module_exit(aha1542_exit);