]> git.ipfire.org Git - thirdparty/linux.git/blame - drivers/scsi/aha1542.c
treewide: Add SPDX license identifier for more missed files
[thirdparty/linux.git] / drivers / scsi / aha1542.c
CommitLineData
09c434b8 1// SPDX-License-Identifier: GPL-2.0-only
1d084d20
OZ
2/*
3 * Driver for Adaptec AHA-1542 SCSI host adapters
1da177e4
LT
4 *
5 * Copyright (C) 1992 Tommy Thorn
6 * Copyright (C) 1993, 1994, 1995 Eric Youngdale
1d084d20 7 * Copyright (C) 2015 Ondrej Zary
1da177e4
LT
8 */
9
1da177e4
LT
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>
1da177e4 15#include <linux/delay.h>
1da177e4
LT
16#include <linux/init.h>
17#include <linux/spinlock.h>
643a7c43
OZ
18#include <linux/isa.h>
19#include <linux/pnp.h>
5a0e3ad6 20#include <linux/slab.h>
954a9fd7 21#include <linux/io.h>
1da177e4 22#include <asm/dma.h>
954a9fd7
OZ
23#include <scsi/scsi_cmnd.h>
24#include <scsi/scsi_device.h>
1da177e4
LT
25#include <scsi/scsi_host.h>
26#include "aha1542.h"
1da177e4 27
f71429ab 28#define MAXBOARDS 4
1da177e4 29
f71429ab
OZ
30static bool isapnp = 1;
31module_param(isapnp, bool, 0);
32MODULE_PARM_DESC(isapnp, "enable PnP support (default=1)");
1da177e4 33
f71429ab 34static int io[MAXBOARDS] = { 0x330, 0x334, 0, 0 };
88f06b76 35module_param_hw_array(io, int, ioport, NULL, 0);
f71429ab 36MODULE_PARM_DESC(io, "base IO address of controller (0x130,0x134,0x230,0x234,0x330,0x334, default=0x330,0x334)");
1da177e4 37
f71429ab
OZ
38/* time AHA spends on the AT-bus during data transfer */
39static int bus_on[MAXBOARDS] = { -1, -1, -1, -1 }; /* power-on default: 11us */
40module_param_array(bus_on, int, NULL, 0);
41MODULE_PARM_DESC(bus_on, "bus on time [us] (2-15, default=-1 [HW default: 11])");
1da177e4 42
f71429ab
OZ
43/* time AHA spends off the bus (not to monopolize it) during data transfer */
44static int bus_off[MAXBOARDS] = { -1, -1, -1, -1 }; /* power-on default: 4us */
45module_param_array(bus_off, int, NULL, 0);
46MODULE_PARM_DESC(bus_off, "bus off time [us] (1-64, default=-1 [HW default: 4])");
1da177e4 47
f71429ab
OZ
48/* default is jumper selected (J1 on 1542A), factory default = 5 MB/s */
49static int dma_speed[MAXBOARDS] = { -1, -1, -1, -1 };
50module_param_array(dma_speed, int, NULL, 0);
51MODULE_PARM_DESC(dma_speed, "DMA speed [MB/s] (5,6,7,8,10, default=-1 [by jumper])");
1da177e4 52
1da177e4
LT
53#define BIOS_TRANSLATION_6432 1 /* Default case these days */
54#define BIOS_TRANSLATION_25563 2 /* Big disk case */
55
56struct 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;
55b28f9f 61 struct scsi_cmnd *int_cmds[AHA1542_MAILBOXES];
1794ef2b
CH
62 struct mailbox *mb;
63 dma_addr_t mb_handle;
64 struct ccb *ccb;
65 dma_addr_t ccb_handle;
66};
67
68struct aha1542_cmd {
69 struct chain *chain;
70 dma_addr_t chain_handle;
1da177e4
LT
71};
72
f1bbef63
OZ
73static inline void aha1542_intr_reset(u16 base)
74{
75 outb(IRST, CONTROL(base));
76}
1da177e4 77
2093bfa1
OZ
78static 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}
1da177e4 99
cad2fc72 100static int aha1542_outb(unsigned int base, u8 val)
1da177e4 101{
eef77801
OZ
102 if (!wait_mask(STATUS(base), CDF, 0, CDF, 0))
103 return 1;
104 outb(val, DATA(base));
105
106 return 0;
0c2b6481
OZ
107}
108
cad2fc72 109static int aha1542_out(unsigned int base, u8 *buf, int len)
0c2b6481 110{
0c2b6481 111 while (len--) {
1b0224b0 112 if (!wait_mask(STATUS(base), CDF, 0, CDF, 0))
0c2b6481 113 return 1;
cad2fc72 114 outb(*buf++, DATA(base));
0c2b6481 115 }
23e6940a
OZ
116 if (!wait_mask(INTRFLAGS(base), INTRMASK, HACC, 0, 0))
117 return 1;
0c2b6481 118
1da177e4 119 return 0;
1da177e4
LT
120}
121
122/* Only used at boot time, so we do not need to worry about latency as much
123 here */
124
cad2fc72 125static int aha1542_in(unsigned int base, u8 *buf, int len, int timeout)
1da177e4 126{
1da177e4 127 while (len--) {
1b0224b0 128 if (!wait_mask(STATUS(base), DF, DF, 0, timeout))
a13b3722 129 return 1;
cad2fc72 130 *buf++ = inb(DATA(base));
1da177e4 131 }
1da177e4 132 return 0;
1da177e4
LT
133}
134
135static 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. */
fde1fb8a
OZ
174#ifdef DEBUG
175 printk("Aha1542: %x %x\n", hosterr, scsierr);
176#endif
1da177e4
LT
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
68ea9de3 193static int aha1542_test_port(struct Scsi_Host *sh)
1da177e4 194{
cb5b570c 195 u8 inquiry_result[4];
cad2fc72 196 int i;
1da177e4
LT
197
198 /* Quick and dirty test for presence of the card. */
68ea9de3 199 if (inb(STATUS(sh->io_port)) == 0xff)
1da177e4
LT
200 return 0;
201
202 /* Reset the adapter. I ought to make a hard reset, but it's not really necessary */
203
1da177e4 204 /* In case some other card was probing here, reset interrupts */
68ea9de3 205 aha1542_intr_reset(sh->io_port); /* reset interrupts, so they don't block */
1da177e4 206
68ea9de3 207 outb(SRST | IRST /*|SCRST */ , CONTROL(sh->io_port));
1da177e4
LT
208
209 mdelay(20); /* Wait a little bit for things to settle down. */
210
1da177e4 211 /* Expect INIT and IDLE, any of the others are bad */
68ea9de3 212 if (!wait_mask(STATUS(sh->io_port), STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0))
a13b3722 213 return 0;
1da177e4 214
1da177e4 215 /* Shouldn't have generated any interrupts during reset */
68ea9de3 216 if (inb(INTRFLAGS(sh->io_port)) & INTRMASK)
a13b3722 217 return 0;
1da177e4 218
1da177e4
LT
219 /* Perform a host adapter inquiry instead so we do not need to set
220 up the mailboxes ahead of time */
221
68ea9de3 222 aha1542_outb(sh->io_port, CMD_INQUIRY);
1da177e4 223
cad2fc72 224 for (i = 0; i < 4; i++) {
68ea9de3 225 if (!wait_mask(STATUS(sh->io_port), DF, DF, 0, 0))
a13b3722 226 return 0;
68ea9de3 227 inquiry_result[i] = inb(DATA(sh->io_port));
1da177e4
LT
228 }
229
1da177e4 230 /* Reading port should reset DF */
68ea9de3 231 if (inb(STATUS(sh->io_port)) & DF)
a13b3722 232 return 0;
1da177e4 233
1da177e4 234 /* When HACC, command is completed, and we're though testing */
68ea9de3 235 if (!wait_mask(INTRFLAGS(sh->io_port), HACC, HACC, 0, 0))
a13b3722 236 return 0;
1da177e4 237
1da177e4 238 /* Clear interrupts */
68ea9de3 239 outb(IRST, CONTROL(sh->io_port));
1da177e4 240
bdebe224 241 return 1;
1da177e4
LT
242}
243
1794ef2b
CH
244static 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
1b0224b0 259static irqreturn_t aha1542_interrupt(int irq, void *dev_id)
1da177e4 260{
1b0224b0 261 struct Scsi_Host *sh = dev_id;
c2532f68 262 struct aha1542_hostdata *aha1542 = shost_priv(sh);
55b28f9f 263 void (*my_done)(struct scsi_cmnd *) = NULL;
1da177e4
LT
264 int errstatus, mbi, mbo, mbistatus;
265 int number_serviced;
266 unsigned long flags;
55b28f9f 267 struct scsi_cmnd *tmp_cmd;
1da177e4 268 int flag;
e98878f7
OZ
269 struct mailbox *mb = aha1542->mb;
270 struct ccb *ccb = aha1542->ccb;
1da177e4
LT
271
272#ifdef DEBUG
273 {
c2532f68 274 flag = inb(INTRFLAGS(sh->io_port));
2906b3ce 275 shost_printk(KERN_DEBUG, sh, "aha1542_intr_handle: ");
1da177e4
LT
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 ");
c2532f68 286 printk("status %02x\n", inb(STATUS(sh->io_port)));
1da177e4
LT
287 };
288#endif
289 number_serviced = 0;
1da177e4 290
1b0224b0
OZ
291 spin_lock_irqsave(sh->host_lock, flags);
292 while (1) {
c2532f68 293 flag = inb(INTRFLAGS(sh->io_port));
1da177e4
LT
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 ");
dfd7c991 304 if (flag & SCRD)
1da177e4 305 printk("SCRD ");
1da177e4 306 }
c2532f68 307 aha1542_intr_reset(sh->io_port);
1da177e4 308
e98878f7 309 mbi = aha1542->aha1542_last_mbi_used + 1;
1da177e4
LT
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;
e98878f7 319 } while (mbi != aha1542->aha1542_last_mbi_used);
1da177e4
LT
320
321 if (mb[mbi].status == 0) {
1b0224b0 322 spin_unlock_irqrestore(sh->host_lock, flags);
1da177e4 323 /* Hmm, no mail. Must have read it the last time around */
dfd7c991 324 if (!number_serviced)
2906b3ce 325 shost_printk(KERN_WARNING, sh, "interrupt received, but no mail.\n");
1b0224b0 326 return IRQ_HANDLED;
1da177e4
LT
327 };
328
492ca4da 329 mbo = (scsi2int(mb[mbi].ccbptr) - (unsigned long)aha1542->ccb_handle) / sizeof(struct ccb);
1da177e4
LT
330 mbistatus = mb[mbi].status;
331 mb[mbi].status = 0;
e98878f7 332 aha1542->aha1542_last_mbi_used = mbi;
1da177e4
LT
333
334#ifdef DEBUG
fde1fb8a
OZ
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);
1da177e4
LT
338#endif
339
340 if (mbistatus == 3)
341 continue; /* Aborted command not found */
342
343#ifdef DEBUG
2906b3ce 344 shost_printk(KERN_DEBUG, sh, "...done %d %d\n", mbo, mbi);
1da177e4
LT
345#endif
346
55b28f9f 347 tmp_cmd = aha1542->int_cmds[mbo];
1da177e4 348
55b28f9f 349 if (!tmp_cmd || !tmp_cmd->scsi_done) {
1b0224b0 350 spin_unlock_irqrestore(sh->host_lock, flags);
2906b3ce
OZ
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,
1da177e4 353 ccb[mbo].hastat, ccb[mbo].idlun, mbo);
1b0224b0 354 return IRQ_HANDLED;
1da177e4 355 }
55b28f9f 356 my_done = tmp_cmd->scsi_done;
1794ef2b 357 aha1542_free_cmd(tmp_cmd);
1da177e4
LT
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)
55b28f9f 362 memcpy(tmp_cmd->sense_buffer, &ccb[mbo].cdb[ccb[mbo].cdblen],
b80ca4f7 363 SCSI_SENSE_BUFFERSIZE);
1da177e4
LT
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)
2906b3ce 377 shost_printk(KERN_DEBUG, sh, "(aha1542 error:%x %x %x) ", errstatus,
1da177e4 378 ccb[mbo].hastat, ccb[mbo].tarstat);
6ddc8cf4
OZ
379 if (ccb[mbo].tarstat == 2)
380 print_hex_dump_bytes("sense: ", DUMP_PREFIX_NONE, &ccb[mbo].cdb[ccb[mbo].cdblen], 12);
fde1fb8a
OZ
381 if (errstatus)
382 printk("aha1542_intr_handle: returning %6x\n", errstatus);
383#endif
55b28f9f
OZ
384 tmp_cmd->result = errstatus;
385 aha1542->int_cmds[mbo] = NULL; /* This effectively frees up the mailbox slot, as
e98878f7 386 far as queuecommand is concerned */
55b28f9f 387 my_done(tmp_cmd);
1da177e4
LT
388 number_serviced++;
389 };
390}
391
1b0224b0 392static int aha1542_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *cmd)
09a44833 393{
1794ef2b 394 struct aha1542_cmd *acmd = scsi_cmd_priv(cmd);
2906b3ce 395 struct aha1542_hostdata *aha1542 = shost_priv(sh);
cb5b570c 396 u8 direction;
55b28f9f
OZ
397 u8 target = cmd->device->id;
398 u8 lun = cmd->device->lun;
1da177e4 399 unsigned long flags;
55b28f9f 400 int bufflen = scsi_bufflen(cmd);
8c08a621 401 int mbo, sg_count;
e98878f7
OZ
402 struct mailbox *mb = aha1542->mb;
403 struct ccb *ccb = aha1542->ccb;
1da177e4 404
55b28f9f 405 if (*cmd->cmnd == REQUEST_SENSE) {
1da177e4 406 /* Don't do the command - we have the sense data already */
55b28f9f 407 cmd->result = 0;
1b0224b0 408 cmd->scsi_done(cmd);
1da177e4
LT
409 return 0;
410 }
411#ifdef DEBUG
764a0c7e
OZ
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 }
1da177e4 422#endif
1794ef2b
CH
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;
8c08a621
OZ
434 }
435
1da177e4
LT
436 /* Use the outgoing mailboxes in a round-robin fashion, because this
437 is how the host adapter will scan for them */
438
1b0224b0 439 spin_lock_irqsave(sh->host_lock, flags);
e98878f7 440 mbo = aha1542->aha1542_last_mbo_used + 1;
1da177e4
LT
441 if (mbo >= AHA1542_MAILBOXES)
442 mbo = 0;
443
444 do {
55b28f9f 445 if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL)
1da177e4
LT
446 break;
447 mbo++;
448 if (mbo >= AHA1542_MAILBOXES)
449 mbo = 0;
e98878f7 450 } while (mbo != aha1542->aha1542_last_mbo_used);
1da177e4 451
55b28f9f 452 if (mb[mbo].status || aha1542->int_cmds[mbo])
1da177e4
LT
453 panic("Unable to find empty mailbox for aha1542.\n");
454
55b28f9f 455 aha1542->int_cmds[mbo] = cmd; /* This will effectively prevent someone else from
e98878f7 456 screwing with this cdb. */
1da177e4 457
e98878f7 458 aha1542->aha1542_last_mbo_used = mbo;
1da177e4
LT
459
460#ifdef DEBUG
1b0224b0 461 shost_printk(KERN_DEBUG, sh, "Sending command (%d %p)...", mbo, cmd->scsi_done);
1da177e4
LT
462#endif
463
1794ef2b
CH
464 /* This gets trashed for some reason */
465 any2scsi(mb[mbo].ccbptr, aha1542->ccb_handle + mbo * sizeof(*ccb));
1da177e4
LT
466
467 memset(&ccb[mbo], 0, sizeof(struct ccb));
468
55b28f9f 469 ccb[mbo].cdblen = cmd->cmd_len;
1da177e4
LT
470
471 direction = 0;
55b28f9f 472 if (*cmd->cmnd == READ_10 || *cmd->cmnd == READ_6)
1da177e4 473 direction = 8;
55b28f9f 474 else if (*cmd->cmnd == WRITE_10 || *cmd->cmnd == WRITE_6)
1da177e4
LT
475 direction = 16;
476
55b28f9f 477 memcpy(ccb[mbo].cdb, cmd->cmnd, ccb[mbo].cdblen);
1da177e4 478
fc3fdfcc 479 if (bufflen) {
51cf2249 480 struct scatterlist *sg;
8c08a621 481 int i;
6ddc8cf4 482
1da177e4 483 ccb[mbo].op = 2; /* SCSI Initiator Command w/scatter-gather */
55b28f9f 484 scsi_for_each_sg(cmd, sg, sg_count, i) {
1794ef2b
CH
485 any2scsi(acmd->chain[i].dataptr, sg_dma_address(sg));
486 any2scsi(acmd->chain[i].datalen, sg_dma_len(sg));
1da177e4 487 };
fc3fdfcc 488 any2scsi(ccb[mbo].datalen, sg_count * sizeof(struct chain));
1794ef2b 489 any2scsi(ccb[mbo].dataptr, acmd->chain_handle);
1da177e4 490#ifdef DEBUG
1794ef2b
CH
491 shost_printk(KERN_DEBUG, sh, "cptr %p: ", acmd->chain);
492 print_hex_dump_bytes("cptr: ", DUMP_PREFIX_NONE, acmd->chain, 18);
1da177e4
LT
493#endif
494 } else {
495 ccb[mbo].op = 0; /* SCSI Initiator Command */
fc3fdfcc
BH
496 any2scsi(ccb[mbo].datalen, 0);
497 any2scsi(ccb[mbo].dataptr, 0);
1da177e4
LT
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
6ddc8cf4 505 print_hex_dump_bytes("sending: ", DUMP_PREFIX_NONE, &ccb[mbo], sizeof(ccb[mbo]) - 10);
1b0224b0 506 printk("aha1542_queuecommand: now waiting for interrupt ");
1da177e4 507#endif
1b0224b0
OZ
508 mb[mbo].status = 1;
509 aha1542_outb(cmd->device->host->io_port, CMD_START_SCSI);
510 spin_unlock_irqrestore(sh->host_lock, flags);
1da177e4
LT
511
512 return 0;
1794ef2b
CH
513out_free_chain:
514 kfree(acmd->chain);
515 acmd->chain = NULL;
516out_unmap:
517 scsi_dma_unmap(cmd);
518 return SCSI_MLQUEUE_HOST_BUSY;
1da177e4
LT
519}
520
521/* Initialize mailboxes */
68ea9de3 522static void setup_mailboxes(struct Scsi_Host *sh)
1da177e4 523{
c2532f68 524 struct aha1542_hostdata *aha1542 = shost_priv(sh);
cad2fc72 525 u8 mb_cmd[5] = { CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0};
1794ef2b 526 int i;
1da177e4 527
1da177e4 528 for (i = 0; i < AHA1542_MAILBOXES; i++) {
1794ef2b
CH
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;
1da177e4 533 };
68ea9de3 534 aha1542_intr_reset(sh->io_port); /* reset interrupts, so they don't block */
1794ef2b 535 any2scsi(mb_cmd + 2, aha1542->mb_handle);
68ea9de3 536 if (aha1542_out(sh->io_port, mb_cmd, 5))
2906b3ce 537 shost_printk(KERN_ERR, sh, "failed setting up mailboxes\n");
68ea9de3 538 aha1542_intr_reset(sh->io_port);
1da177e4
LT
539}
540
68ea9de3 541static int aha1542_getconfig(struct Scsi_Host *sh)
1da177e4 542{
cb5b570c 543 u8 inquiry_result[3];
1da177e4 544 int i;
68ea9de3 545 i = inb(STATUS(sh->io_port));
1da177e4 546 if (i & DF) {
68ea9de3 547 i = inb(DATA(sh->io_port));
1da177e4 548 };
68ea9de3
OZ
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))
2906b3ce 552 shost_printk(KERN_ERR, sh, "error querying board settings\n");
68ea9de3 553 aha1542_intr_reset(sh->io_port);
1da177e4
LT
554 switch (inquiry_result[0]) {
555 case 0x80:
68ea9de3 556 sh->dma_channel = 7;
1da177e4
LT
557 break;
558 case 0x40:
68ea9de3 559 sh->dma_channel = 6;
1da177e4
LT
560 break;
561 case 0x20:
68ea9de3 562 sh->dma_channel = 5;
1da177e4
LT
563 break;
564 case 0x01:
68ea9de3 565 sh->dma_channel = 0;
1da177e4
LT
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. */
68ea9de3 570 sh->dma_channel = 0xFF;
1da177e4
LT
571 break;
572 default:
2906b3ce 573 shost_printk(KERN_ERR, sh, "Unable to determine DMA channel.\n");
1da177e4
LT
574 return -1;
575 };
576 switch (inquiry_result[1]) {
577 case 0x40:
68ea9de3 578 sh->irq = 15;
1da177e4
LT
579 break;
580 case 0x20:
68ea9de3 581 sh->irq = 14;
1da177e4
LT
582 break;
583 case 0x8:
68ea9de3 584 sh->irq = 12;
1da177e4
LT
585 break;
586 case 0x4:
68ea9de3 587 sh->irq = 11;
1da177e4
LT
588 break;
589 case 0x2:
68ea9de3 590 sh->irq = 10;
1da177e4
LT
591 break;
592 case 0x1:
68ea9de3 593 sh->irq = 9;
1da177e4
LT
594 break;
595 default:
2906b3ce 596 shost_printk(KERN_ERR, sh, "Unable to determine IRQ level.\n");
1da177e4
LT
597 return -1;
598 };
68ea9de3 599 sh->this_id = inquiry_result[2] & 7;
1da177e4
LT
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
68ea9de3 606static int aha1542_mbenable(struct Scsi_Host *sh)
1da177e4 607{
cb5b570c
OZ
608 static u8 mbenable_cmd[3];
609 static u8 mbenable_result[2];
1da177e4
LT
610 int retval;
611
612 retval = BIOS_TRANSLATION_6432;
613
68ea9de3
OZ
614 aha1542_outb(sh->io_port, CMD_EXTBIOS);
615 if (aha1542_in(sh->io_port, mbenable_result, 2, 100))
1da177e4 616 return retval;
68ea9de3 617 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 100))
2093bfa1 618 goto fail;
68ea9de3 619 aha1542_intr_reset(sh->io_port);
1da177e4
LT
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
68ea9de3 629 if (aha1542_out(sh->io_port, mbenable_cmd, 3))
2093bfa1 630 goto fail;
1da177e4
LT
631 };
632 while (0) {
633fail:
2906b3ce 634 shost_printk(KERN_ERR, sh, "Mailbox init failed\n");
1da177e4 635 }
68ea9de3 636 aha1542_intr_reset(sh->io_port);
1da177e4
LT
637 return retval;
638}
639
640/* Query the board to find out if it is a 1542 or a 1740, or whatever. */
68ea9de3 641static int aha1542_query(struct Scsi_Host *sh)
1da177e4 642{
68ea9de3 643 struct aha1542_hostdata *aha1542 = shost_priv(sh);
cb5b570c 644 u8 inquiry_result[4];
1da177e4 645 int i;
68ea9de3 646 i = inb(STATUS(sh->io_port));
1da177e4 647 if (i & DF) {
68ea9de3 648 i = inb(DATA(sh->io_port));
1da177e4 649 };
68ea9de3
OZ
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))
2906b3ce 653 shost_printk(KERN_ERR, sh, "error querying card type\n");
68ea9de3 654 aha1542_intr_reset(sh->io_port);
1da177e4 655
68ea9de3 656 aha1542->bios_translation = BIOS_TRANSLATION_6432; /* Default case */
1da177e4
LT
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) {
2906b3ce 665 shost_printk(KERN_INFO, sh, "Emulation mode not supported for AHA-1740 hardware, use aha1740 driver instead.\n");
1da177e4
LT
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
68ea9de3 672 aha1542->bios_translation = aha1542_mbenable(sh);
1da177e4
LT
673
674 return 0;
675}
676
f71429ab 677static u8 dma_speed_hw(int dma_speed)
1da177e4 678{
f71429ab
OZ
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;
1da177e4 690 }
1da177e4 691
f71429ab 692 return 0xff; /* invalid */
1da177e4
LT
693}
694
f71429ab 695/* Set the Bus on/off-times as not to ruin floppy performance */
37d607bd 696static void aha1542_set_bus_times(struct Scsi_Host *sh, int bus_on, int bus_off, int dma_speed)
1da177e4 697{
37d607bd
OZ
698 if (bus_on > 0) {
699 u8 oncmd[] = { CMD_BUSON_TIME, clamp(bus_on, 2, 15) };
1da177e4 700
37d607bd
OZ
701 aha1542_intr_reset(sh->io_port);
702 if (aha1542_out(sh->io_port, oncmd, 2))
f71429ab
OZ
703 goto fail;
704 }
1da177e4 705
37d607bd
OZ
706 if (bus_off > 0) {
707 u8 offcmd[] = { CMD_BUSOFF_TIME, clamp(bus_off, 1, 64) };
1da177e4 708
37d607bd
OZ
709 aha1542_intr_reset(sh->io_port);
710 if (aha1542_out(sh->io_port, offcmd, 2))
f71429ab
OZ
711 goto fail;
712 }
1da177e4 713
37d607bd
OZ
714 if (dma_speed_hw(dma_speed) != 0xff) {
715 u8 dmacmd[] = { CMD_DMASPEED, dma_speed_hw(dma_speed) };
b847fd0d 716
37d607bd
OZ
717 aha1542_intr_reset(sh->io_port);
718 if (aha1542_out(sh->io_port, dmacmd, 2))
b847fd0d
OZ
719 goto fail;
720 }
37d607bd 721 aha1542_intr_reset(sh->io_port);
b847fd0d
OZ
722 return;
723fail:
2906b3ce 724 shost_printk(KERN_ERR, sh, "setting bus on/off-time failed\n");
37d607bd 725 aha1542_intr_reset(sh->io_port);
b847fd0d
OZ
726}
727
1da177e4 728/* return non-zero on detection */
643a7c43 729static struct Scsi_Host *aha1542_hw_init(struct scsi_host_template *tpnt, struct device *pdev, int indx)
1da177e4 730{
f71429ab 731 unsigned int base_io = io[indx];
c2532f68 732 struct Scsi_Host *sh;
e98878f7 733 struct aha1542_hostdata *aha1542;
2906b3ce 734 char dma_info[] = "no DMA";
1da177e4 735
3a70c006
OZ
736 if (base_io == 0)
737 return NULL;
1da177e4 738
3a70c006
OZ
739 if (!request_region(base_io, AHA1542_REGION_SIZE, "aha1542"))
740 return NULL;
1da177e4 741
c2532f68
OZ
742 sh = scsi_host_alloc(tpnt, sizeof(struct aha1542_hostdata));
743 if (!sh)
3a70c006 744 goto release;
c2532f68 745 aha1542 = shost_priv(sh);
b847fd0d 746
68ea9de3
OZ
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))
3a70c006 754 goto unregister;
1da177e4 755
37d607bd 756 aha1542_set_bus_times(sh, bus_on[indx], bus_off[indx], dma_speed[indx]);
68ea9de3 757 if (aha1542_query(sh))
3a70c006 758 goto unregister;
68ea9de3 759 if (aha1542_getconfig(sh) == -1)
3a70c006 760 goto unregister;
1da177e4 761
c2532f68 762 if (sh->dma_channel != 0xFF)
2906b3ce
OZ
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);
3a70c006 766 if (aha1542->bios_translation == BIOS_TRANSLATION_25563)
2906b3ce 767 shost_printk(KERN_INFO, sh, "Using extended bios translation\n");
1da177e4 768
1794ef2b
CH
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
68ea9de3 784 setup_mailboxes(sh);
1da177e4 785
1b0224b0 786 if (request_irq(sh->irq, aha1542_interrupt, 0, "aha1542", sh)) {
2906b3ce 787 shost_printk(KERN_ERR, sh, "Unable to allocate IRQ.\n");
1794ef2b 788 goto free_ccb;
3a70c006 789 }
c2532f68
OZ
790 if (sh->dma_channel != 0xFF) {
791 if (request_dma(sh->dma_channel, "aha1542")) {
2906b3ce 792 shost_printk(KERN_ERR, sh, "Unable to allocate DMA channel.\n");
3a70c006
OZ
793 goto free_irq;
794 }
c2532f68
OZ
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);
3a70c006
OZ
798 }
799 }
1da177e4 800
c2532f68 801 if (scsi_add_host(sh, pdev))
3a70c006 802 goto free_dma;
1da177e4 803
c2532f68 804 scsi_scan_host(sh);
1da177e4 805
c2532f68 806 return sh;
1794ef2b 807
3a70c006 808free_dma:
c2532f68
OZ
809 if (sh->dma_channel != 0xff)
810 free_dma(sh->dma_channel);
3a70c006 811free_irq:
c2532f68 812 free_irq(sh->irq, sh);
1794ef2b
CH
813free_ccb:
814 dma_free_coherent(pdev, AHA1542_MAILBOXES * sizeof(struct ccb),
815 aha1542->ccb, aha1542->ccb_handle);
816free_mb:
817 dma_free_coherent(pdev, AHA1542_MAILBOXES * 2 * sizeof(struct mailbox),
818 aha1542->mb, aha1542->mb_handle);
3a70c006 819unregister:
c2532f68 820 scsi_host_put(sh);
3a70c006
OZ
821release:
822 release_region(base_io, AHA1542_REGION_SIZE);
1da177e4 823
643a7c43 824 return NULL;
1da177e4
LT
825}
826
c2532f68 827static int aha1542_release(struct Scsi_Host *sh)
1da177e4 828{
1794ef2b
CH
829 struct aha1542_hostdata *aha1542 = shost_priv(sh);
830 struct device *dev = sh->dma_dev;
831
c2532f68
OZ
832 scsi_remove_host(sh);
833 if (sh->dma_channel != 0xff)
834 free_dma(sh->dma_channel);
1794ef2b
CH
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);
c2532f68
OZ
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);
1da177e4
LT
844 return 0;
845}
846
1da177e4 847
1da177e4
LT
848/*
849 * This is a device reset. This is handled by sending a special command
850 * to the device.
851 */
55b28f9f 852static int aha1542_dev_reset(struct scsi_cmnd *cmd)
1da177e4 853{
1b0224b0
OZ
854 struct Scsi_Host *sh = cmd->device->host;
855 struct aha1542_hostdata *aha1542 = shost_priv(sh);
1da177e4 856 unsigned long flags;
e98878f7 857 struct mailbox *mb = aha1542->mb;
55b28f9f
OZ
858 u8 target = cmd->device->id;
859 u8 lun = cmd->device->lun;
1da177e4 860 int mbo;
e98878f7 861 struct ccb *ccb = aha1542->ccb;
1da177e4 862
1b0224b0 863 spin_lock_irqsave(sh->host_lock, flags);
e98878f7 864 mbo = aha1542->aha1542_last_mbo_used + 1;
1da177e4
LT
865 if (mbo >= AHA1542_MAILBOXES)
866 mbo = 0;
867
868 do {
55b28f9f 869 if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL)
1da177e4
LT
870 break;
871 mbo++;
872 if (mbo >= AHA1542_MAILBOXES)
873 mbo = 0;
e98878f7 874 } while (mbo != aha1542->aha1542_last_mbo_used);
1da177e4 875
55b28f9f 876 if (mb[mbo].status || aha1542->int_cmds[mbo])
1da177e4
LT
877 panic("Unable to find empty mailbox for aha1542.\n");
878
55b28f9f 879 aha1542->int_cmds[mbo] = cmd; /* This will effectively
e98878f7
OZ
880 prevent someone else from
881 screwing with this cdb. */
1da177e4 882
e98878f7 883 aha1542->aha1542_last_mbo_used = mbo;
1da177e4 884
1794ef2b
CH
885 /* This gets trashed for some reason */
886 any2scsi(mb[mbo].ccbptr, aha1542->ccb_handle + mbo * sizeof(*ccb));
1da177e4
LT
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 */
1b0224b0
OZ
901 aha1542_outb(sh->io_port, CMD_START_SCSI);
902 spin_unlock_irqrestore(sh->host_lock, flags);
1da177e4 903
55b28f9f 904 scmd_printk(KERN_WARNING, cmd,
017560fc 905 "Trying device reset for target\n");
1da177e4
LT
906
907 return SUCCESS;
1da177e4
LT
908}
909
55b28f9f 910static int aha1542_reset(struct scsi_cmnd *cmd, u8 reset_cmd)
1da177e4 911{
1b0224b0
OZ
912 struct Scsi_Host *sh = cmd->device->host;
913 struct aha1542_hostdata *aha1542 = shost_priv(sh);
914 unsigned long flags;
1da177e4
LT
915 int i;
916
1b0224b0 917 spin_lock_irqsave(sh->host_lock, flags);
1da177e4
LT
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 */
55b28f9f 924 outb(reset_cmd, CONTROL(cmd->device->host->io_port));
1da177e4 925
55b28f9f 926 if (!wait_mask(STATUS(cmd->device->host->io_port),
7061dec4 927 STATMASK, IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0)) {
1b0224b0 928 spin_unlock_irqrestore(sh->host_lock, flags);
a13b3722
OZ
929 return FAILED;
930 }
1b0224b0 931
8537cba8
OZ
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)
68ea9de3 937 setup_mailboxes(cmd->device->host);
1b0224b0 938
1da177e4
LT
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 */
2906b3ce 945 shost_printk(KERN_WARNING, cmd->device->host, "Sent BUS RESET to scsi host %d\n", cmd->device->host->host_no);
1da177e4
LT
946
947 for (i = 0; i < AHA1542_MAILBOXES; i++) {
55b28f9f
OZ
948 if (aha1542->int_cmds[i] != NULL) {
949 struct scsi_cmnd *tmp_cmd;
950 tmp_cmd = aha1542->int_cmds[i];
1da177e4 951
55b28f9f 952 if (tmp_cmd->device->soft_reset) {
1da177e4
LT
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 }
1794ef2b 961 aha1542_free_cmd(tmp_cmd);
55b28f9f 962 aha1542->int_cmds[i] = NULL;
e98878f7 963 aha1542->mb[i].status = 0;
1da177e4
LT
964 }
965 }
966
1b0224b0 967 spin_unlock_irqrestore(sh->host_lock, flags);
1da177e4 968 return SUCCESS;
1da177e4
LT
969}
970
55b28f9f 971static int aha1542_bus_reset(struct scsi_cmnd *cmd)
1da177e4 972{
55b28f9f 973 return aha1542_reset(cmd, SCRST);
8537cba8 974}
1da177e4 975
55b28f9f 976static int aha1542_host_reset(struct scsi_cmnd *cmd)
8537cba8 977{
55b28f9f 978 return aha1542_reset(cmd, HRST | SCRST);
1da177e4
LT
979}
980
1da177e4 981static int aha1542_biosparam(struct scsi_device *sdev,
17787a09 982 struct block_device *bdev, sector_t capacity, int geom[])
1da177e4 983{
e98878f7 984 struct aha1542_hostdata *aha1542 = shost_priv(sdev->host);
1da177e4 985
17787a09
OZ
986 if (capacity >= 0x200000 &&
987 aha1542->bios_translation == BIOS_TRANSLATION_25563) {
1da177e4 988 /* Please verify that this is the same as what DOS returns */
17787a09
OZ
989 geom[0] = 255; /* heads */
990 geom[1] = 63; /* sectors */
1da177e4 991 } else {
17787a09
OZ
992 geom[0] = 64; /* heads */
993 geom[1] = 32; /* sectors */
1da177e4 994 }
17787a09 995 geom[2] = sector_div(capacity, geom[0] * geom[1]); /* cylinders */
1da177e4
LT
996
997 return 0;
998}
999MODULE_LICENSE("GPL");
1000
d0be4a7d 1001static struct scsi_host_template driver_template = {
643a7c43 1002 .module = THIS_MODULE,
1da177e4
LT
1003 .proc_name = "aha1542",
1004 .name = "Adaptec 1542",
1794ef2b 1005 .cmd_size = sizeof(struct aha1542_cmd),
1da177e4 1006 .queuecommand = aha1542_queuecommand,
1da177e4
LT
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,
10be6250 1013 .sg_tablesize = 16,
1da177e4 1014 .unchecked_isa_dma = 1,
1da177e4 1015};
643a7c43
OZ
1016
1017static 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
1028static 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
1036static struct isa_driver aha1542_isa_driver = {
1037 .match = aha1542_isa_match,
1038 .remove = aha1542_isa_remove,
1039 .driver = {
1040 .name = "aha1542"
1041 },
1042};
1043static int isa_registered;
1044
1045#ifdef CONFIG_PNP
78453a31 1046static const struct pnp_device_id aha1542_pnp_ids[] = {
643a7c43
OZ
1047 { .id = "ADP1542" },
1048 { .id = "" }
1049};
1050MODULE_DEVICE_TABLE(pnp, aha1542_pnp_ids);
1051
1052static int aha1542_pnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *id)
1053{
1054 int indx;
1055 struct Scsi_Host *sh;
1056
f71429ab
OZ
1057 for (indx = 0; indx < ARRAY_SIZE(io); indx++) {
1058 if (io[indx])
643a7c43
OZ
1059 continue;
1060
1061 if (pnp_activate_dev(pdev) < 0)
1062 continue;
1063
f71429ab 1064 io[indx] = pnp_port_start(pdev, 0);
643a7c43
OZ
1065
1066 /* The card can be queried for its DMA, we have
1067 the DMA set up that is enough */
1068
2906b3ce 1069 dev_info(&pdev->dev, "ISAPnP found an AHA1535 at I/O 0x%03X", io[indx]);
643a7c43
OZ
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
1080static void aha1542_pnp_remove(struct pnp_dev *pdev)
1081{
1082 aha1542_release(pnp_get_drvdata(pdev));
1083 pnp_set_drvdata(pdev, NULL);
1084}
1085
1086static 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};
1092static int pnp_registered;
1093#endif /* CONFIG_PNP */
1094
1095static int __init aha1542_init(void)
1096{
1097 int ret = 0;
643a7c43
OZ
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
1120static 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
1130module_init(aha1542_init);
1131module_exit(aha1542_exit);