aha1542: Use shost_printk instead of printk
[deliverable/linux.git] / drivers / scsi / aha1542.c
CommitLineData
1d084d20
OZ
1/*
2 * Driver for Adaptec AHA-1542 SCSI host adapters
1da177e4
LT
3 *
4 * Copyright (C) 1992 Tommy Thorn
5 * Copyright (C) 1993, 1994, 1995 Eric Youngdale
1d084d20 6 * Copyright (C) 2015 Ondrej Zary
1da177e4
LT
7 */
8
1da177e4
LT
9#include <linux/module.h>
10#include <linux/interrupt.h>
11#include <linux/kernel.h>
12#include <linux/types.h>
13#include <linux/string.h>
1da177e4 14#include <linux/delay.h>
1da177e4
LT
15#include <linux/init.h>
16#include <linux/spinlock.h>
643a7c43
OZ
17#include <linux/isa.h>
18#include <linux/pnp.h>
5a0e3ad6 19#include <linux/slab.h>
954a9fd7 20#include <linux/io.h>
1da177e4 21#include <asm/dma.h>
954a9fd7
OZ
22#include <scsi/scsi_cmnd.h>
23#include <scsi/scsi_device.h>
1da177e4
LT
24#include <scsi/scsi_host.h>
25#include "aha1542.h"
1da177e4
LT
26
27#ifdef DEBUG
28#define DEB(x) x
29#else
30#define DEB(x)
31#endif
f71429ab 32#define MAXBOARDS 4
1da177e4 33
f71429ab
OZ
34static bool isapnp = 1;
35module_param(isapnp, bool, 0);
36MODULE_PARM_DESC(isapnp, "enable PnP support (default=1)");
1da177e4 37
f71429ab
OZ
38static int io[MAXBOARDS] = { 0x330, 0x334, 0, 0 };
39module_param_array(io, int, NULL, 0);
40MODULE_PARM_DESC(io, "base IO address of controller (0x130,0x134,0x230,0x234,0x330,0x334, default=0x330,0x334)");
1da177e4 41
f71429ab
OZ
42/* time AHA spends on the AT-bus during data transfer */
43static int bus_on[MAXBOARDS] = { -1, -1, -1, -1 }; /* power-on default: 11us */
44module_param_array(bus_on, int, NULL, 0);
45MODULE_PARM_DESC(bus_on, "bus on time [us] (2-15, default=-1 [HW default: 11])");
1da177e4 46
f71429ab
OZ
47/* time AHA spends off the bus (not to monopolize it) during data transfer */
48static int bus_off[MAXBOARDS] = { -1, -1, -1, -1 }; /* power-on default: 4us */
49module_param_array(bus_off, int, NULL, 0);
50MODULE_PARM_DESC(bus_off, "bus off time [us] (1-64, default=-1 [HW default: 4])");
1da177e4 51
f71429ab
OZ
52/* default is jumper selected (J1 on 1542A), factory default = 5 MB/s */
53static int dma_speed[MAXBOARDS] = { -1, -1, -1, -1 };
54module_param_array(dma_speed, int, NULL, 0);
55MODULE_PARM_DESC(dma_speed, "DMA speed [MB/s] (5,6,7,8,10, default=-1 [by jumper])");
1da177e4 56
1da177e4
LT
57#define BIOS_TRANSLATION_6432 1 /* Default case these days */
58#define BIOS_TRANSLATION_25563 2 /* Big disk case */
59
60struct aha1542_hostdata {
61 /* This will effectively start both of them at the first mailbox */
62 int bios_translation; /* Mapping bios uses - for compatibility */
63 int aha1542_last_mbi_used;
64 int aha1542_last_mbo_used;
55b28f9f 65 struct scsi_cmnd *int_cmds[AHA1542_MAILBOXES];
1da177e4
LT
66 struct mailbox mb[2 * AHA1542_MAILBOXES];
67 struct ccb ccb[AHA1542_MAILBOXES];
68};
69
1da177e4
LT
70static DEFINE_SPINLOCK(aha1542_lock);
71
f1bbef63
OZ
72static inline void aha1542_intr_reset(u16 base)
73{
74 outb(IRST, CONTROL(base));
75}
1da177e4 76
2093bfa1
OZ
77static inline bool wait_mask(u16 port, u8 mask, u8 allof, u8 noneof, int timeout)
78{
79 bool delayed = true;
80
81 if (timeout == 0) {
82 timeout = 3000000;
83 delayed = false;
84 }
85
86 while (1) {
87 u8 bits = inb(port) & mask;
88 if ((bits & allof) == allof && ((bits & noneof) == 0))
89 break;
90 if (delayed)
91 mdelay(1);
92 if (--timeout == 0)
93 return false;
94 }
95
96 return true;
97}
1da177e4 98
1da177e4
LT
99/* This is a bit complicated, but we need to make sure that an interrupt
100 routine does not send something out while we are in the middle of this.
101 Fortunately, it is only at boot time that multi-byte messages
102 are ever sent. */
cad2fc72 103static int aha1542_outb(unsigned int base, u8 val)
1da177e4 104{
0c2b6481
OZ
105 unsigned long flags;
106
107 while (1) {
2906b3ce 108 if (!wait_mask(STATUS(base), CDF, 0, CDF, 0))
0c2b6481 109 return 1;
1da177e4 110 spin_lock_irqsave(&aha1542_lock, flags);
0c2b6481
OZ
111 if (inb(STATUS(base)) & CDF) {
112 spin_unlock_irqrestore(&aha1542_lock, flags);
113 continue;
1da177e4 114 }
cad2fc72 115 outb(val, DATA(base));
1da177e4 116 spin_unlock_irqrestore(&aha1542_lock, flags);
0c2b6481 117 return 0;
1da177e4 118 }
0c2b6481
OZ
119}
120
cad2fc72 121static int aha1542_out(unsigned int base, u8 *buf, int len)
0c2b6481
OZ
122{
123 unsigned long flags;
124
125 spin_lock_irqsave(&aha1542_lock, flags);
126 while (len--) {
127 if (!wait_mask(STATUS(base), CDF, 0, CDF, 0)) {
128 spin_unlock_irqrestore(&aha1542_lock, flags);
0c2b6481
OZ
129 return 1;
130 }
cad2fc72 131 outb(*buf++, DATA(base));
0c2b6481
OZ
132 }
133 spin_unlock_irqrestore(&aha1542_lock, flags);
23e6940a
OZ
134 if (!wait_mask(INTRFLAGS(base), INTRMASK, HACC, 0, 0))
135 return 1;
0c2b6481 136
1da177e4 137 return 0;
1da177e4
LT
138}
139
140/* Only used at boot time, so we do not need to worry about latency as much
141 here */
142
cad2fc72 143static int aha1542_in(unsigned int base, u8 *buf, int len, int timeout)
1da177e4
LT
144{
145 unsigned long flags;
146
147 spin_lock_irqsave(&aha1542_lock, flags);
148 while (len--) {
a13b3722
OZ
149 if (!wait_mask(STATUS(base), DF, DF, 0, timeout)) {
150 spin_unlock_irqrestore(&aha1542_lock, flags);
a13b3722
OZ
151 return 1;
152 }
cad2fc72 153 *buf++ = inb(DATA(base));
1da177e4
LT
154 }
155 spin_unlock_irqrestore(&aha1542_lock, flags);
156 return 0;
1da177e4
LT
157}
158
159static int makecode(unsigned hosterr, unsigned scsierr)
160{
161 switch (hosterr) {
162 case 0x0:
163 case 0xa: /* Linked command complete without error and linked normally */
164 case 0xb: /* Linked command complete without error, interrupt generated */
165 hosterr = 0;
166 break;
167
168 case 0x11: /* Selection time out-The initiator selection or target
169 reselection was not complete within the SCSI Time out period */
170 hosterr = DID_TIME_OUT;
171 break;
172
173 case 0x12: /* Data overrun/underrun-The target attempted to transfer more data
174 than was allocated by the Data Length field or the sum of the
175 Scatter / Gather Data Length fields. */
176
177 case 0x13: /* Unexpected bus free-The target dropped the SCSI BSY at an unexpected time. */
178
179 case 0x15: /* MBO command was not 00, 01 or 02-The first byte of the CB was
180 invalid. This usually indicates a software failure. */
181
182 case 0x16: /* Invalid CCB Operation Code-The first byte of the CCB was invalid.
183 This usually indicates a software failure. */
184
185 case 0x17: /* Linked CCB does not have the same LUN-A subsequent CCB of a set
186 of linked CCB's does not specify the same logical unit number as
187 the first. */
188 case 0x18: /* Invalid Target Direction received from Host-The direction of a
189 Target Mode CCB was invalid. */
190
191 case 0x19: /* Duplicate CCB Received in Target Mode-More than once CCB was
192 received to service data transfer between the same target LUN
193 and initiator SCSI ID in the same direction. */
194
195 case 0x1a: /* Invalid CCB or Segment List Parameter-A segment list with a zero
196 length segment or invalid segment list boundaries was received.
197 A CCB parameter was invalid. */
198 DEB(printk("Aha1542: %x %x\n", hosterr, scsierr));
199 hosterr = DID_ERROR; /* Couldn't find any better */
200 break;
201
202 case 0x14: /* Target bus phase sequence failure-An invalid bus phase or bus
203 phase sequence was requested by the target. The host adapter
204 will generate a SCSI Reset Condition, notifying the host with
205 a SCRD interrupt */
206 hosterr = DID_RESET;
207 break;
208 default:
209 printk(KERN_ERR "aha1542: makecode: unknown hoststatus %x\n", hosterr);
210 break;
211 }
212 return scsierr | (hosterr << 16);
213}
214
68ea9de3 215static int aha1542_test_port(struct Scsi_Host *sh)
1da177e4 216{
cb5b570c 217 u8 inquiry_result[4];
cad2fc72 218 int i;
1da177e4
LT
219
220 /* Quick and dirty test for presence of the card. */
68ea9de3 221 if (inb(STATUS(sh->io_port)) == 0xff)
1da177e4
LT
222 return 0;
223
224 /* Reset the adapter. I ought to make a hard reset, but it's not really necessary */
225
1da177e4 226 /* In case some other card was probing here, reset interrupts */
68ea9de3 227 aha1542_intr_reset(sh->io_port); /* reset interrupts, so they don't block */
1da177e4 228
68ea9de3 229 outb(SRST | IRST /*|SCRST */ , CONTROL(sh->io_port));
1da177e4
LT
230
231 mdelay(20); /* Wait a little bit for things to settle down. */
232
1da177e4 233 /* Expect INIT and IDLE, any of the others are bad */
68ea9de3 234 if (!wait_mask(STATUS(sh->io_port), STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0))
a13b3722 235 return 0;
1da177e4 236
1da177e4 237 /* Shouldn't have generated any interrupts during reset */
68ea9de3 238 if (inb(INTRFLAGS(sh->io_port)) & INTRMASK)
a13b3722 239 return 0;
1da177e4 240
1da177e4
LT
241 /* Perform a host adapter inquiry instead so we do not need to set
242 up the mailboxes ahead of time */
243
68ea9de3 244 aha1542_outb(sh->io_port, CMD_INQUIRY);
1da177e4 245
cad2fc72 246 for (i = 0; i < 4; i++) {
68ea9de3 247 if (!wait_mask(STATUS(sh->io_port), DF, DF, 0, 0))
a13b3722 248 return 0;
68ea9de3 249 inquiry_result[i] = inb(DATA(sh->io_port));
1da177e4
LT
250 }
251
1da177e4 252 /* Reading port should reset DF */
68ea9de3 253 if (inb(STATUS(sh->io_port)) & DF)
a13b3722 254 return 0;
1da177e4 255
1da177e4 256 /* When HACC, command is completed, and we're though testing */
68ea9de3 257 if (!wait_mask(INTRFLAGS(sh->io_port), HACC, HACC, 0, 0))
a13b3722 258 return 0;
1da177e4 259
1da177e4 260 /* Clear interrupts */
68ea9de3 261 outb(IRST, CONTROL(sh->io_port));
1da177e4 262
bdebe224 263 return 1;
1da177e4
LT
264}
265
1da177e4 266/* A "high" level interrupt handler */
c2532f68 267static void aha1542_intr_handle(struct Scsi_Host *sh)
1da177e4 268{
c2532f68 269 struct aha1542_hostdata *aha1542 = shost_priv(sh);
55b28f9f 270 void (*my_done)(struct scsi_cmnd *) = NULL;
1da177e4
LT
271 int errstatus, mbi, mbo, mbistatus;
272 int number_serviced;
273 unsigned long flags;
55b28f9f 274 struct scsi_cmnd *tmp_cmd;
1da177e4 275 int flag;
e98878f7
OZ
276 struct mailbox *mb = aha1542->mb;
277 struct ccb *ccb = aha1542->ccb;
1da177e4
LT
278
279#ifdef DEBUG
280 {
c2532f68 281 flag = inb(INTRFLAGS(sh->io_port));
2906b3ce 282 shost_printk(KERN_DEBUG, sh, "aha1542_intr_handle: ");
1da177e4
LT
283 if (!(flag & ANYINTR))
284 printk("no interrupt?");
285 if (flag & MBIF)
286 printk("MBIF ");
287 if (flag & MBOA)
288 printk("MBOF ");
289 if (flag & HACC)
290 printk("HACC ");
291 if (flag & SCRD)
292 printk("SCRD ");
c2532f68 293 printk("status %02x\n", inb(STATUS(sh->io_port)));
1da177e4
LT
294 };
295#endif
296 number_serviced = 0;
1da177e4
LT
297
298 while (1 == 1) {
c2532f68 299 flag = inb(INTRFLAGS(sh->io_port));
1da177e4
LT
300
301 /* Check for unusual interrupts. If any of these happen, we should
302 probably do something special, but for now just printing a message
303 is sufficient. A SCSI reset detected is something that we really
304 need to deal with in some way. */
305 if (flag & ~MBIF) {
306 if (flag & MBOA)
307 printk("MBOF ");
308 if (flag & HACC)
309 printk("HACC ");
dfd7c991 310 if (flag & SCRD)
1da177e4 311 printk("SCRD ");
1da177e4 312 }
c2532f68 313 aha1542_intr_reset(sh->io_port);
1da177e4
LT
314
315 spin_lock_irqsave(&aha1542_lock, flags);
e98878f7 316 mbi = aha1542->aha1542_last_mbi_used + 1;
1da177e4
LT
317 if (mbi >= 2 * AHA1542_MAILBOXES)
318 mbi = AHA1542_MAILBOXES;
319
320 do {
321 if (mb[mbi].status != 0)
322 break;
323 mbi++;
324 if (mbi >= 2 * AHA1542_MAILBOXES)
325 mbi = AHA1542_MAILBOXES;
e98878f7 326 } while (mbi != aha1542->aha1542_last_mbi_used);
1da177e4
LT
327
328 if (mb[mbi].status == 0) {
329 spin_unlock_irqrestore(&aha1542_lock, flags);
330 /* Hmm, no mail. Must have read it the last time around */
dfd7c991 331 if (!number_serviced)
2906b3ce 332 shost_printk(KERN_WARNING, sh, "interrupt received, but no mail.\n");
1da177e4
LT
333 return;
334 };
335
10be6250 336 mbo = (scsi2int(mb[mbi].ccbptr) - (isa_virt_to_bus(&ccb[0]))) / sizeof(struct ccb);
1da177e4
LT
337 mbistatus = mb[mbi].status;
338 mb[mbi].status = 0;
e98878f7 339 aha1542->aha1542_last_mbi_used = mbi;
1da177e4
LT
340 spin_unlock_irqrestore(&aha1542_lock, flags);
341
342#ifdef DEBUG
343 {
344 if (ccb[mbo].tarstat | ccb[mbo].hastat)
2906b3ce 345 shost_printk(KERN_DEBUG, sh, "aha1542_command: returning %x (status %d)\n",
1da177e4
LT
346 ccb[mbo].tarstat + ((int) ccb[mbo].hastat << 16), mb[mbi].status);
347 };
348#endif
349
350 if (mbistatus == 3)
351 continue; /* Aborted command not found */
352
353#ifdef DEBUG
2906b3ce 354 shost_printk(KERN_DEBUG, sh, "...done %d %d\n", mbo, mbi);
1da177e4
LT
355#endif
356
55b28f9f 357 tmp_cmd = aha1542->int_cmds[mbo];
1da177e4 358
55b28f9f 359 if (!tmp_cmd || !tmp_cmd->scsi_done) {
2906b3ce
OZ
360 shost_printk(KERN_WARNING, sh, "Unexpected interrupt\n");
361 shost_printk(KERN_WARNING, sh, "tarstat=%x, hastat=%x idlun=%x ccb#=%d\n", ccb[mbo].tarstat,
1da177e4
LT
362 ccb[mbo].hastat, ccb[mbo].idlun, mbo);
363 return;
364 }
55b28f9f
OZ
365 my_done = tmp_cmd->scsi_done;
366 kfree(tmp_cmd->host_scribble);
367 tmp_cmd->host_scribble = NULL;
1da177e4
LT
368 /* Fetch the sense data, and tuck it away, in the required slot. The
369 Adaptec automatically fetches it, and there is no guarantee that
370 we will still have it in the cdb when we come back */
371 if (ccb[mbo].tarstat == 2)
55b28f9f 372 memcpy(tmp_cmd->sense_buffer, &ccb[mbo].cdb[ccb[mbo].cdblen],
b80ca4f7 373 SCSI_SENSE_BUFFERSIZE);
1da177e4
LT
374
375
376 /* is there mail :-) */
377
378 /* more error checking left out here */
379 if (mbistatus != 1)
380 /* This is surely wrong, but I don't know what's right */
381 errstatus = makecode(ccb[mbo].hastat, ccb[mbo].tarstat);
382 else
383 errstatus = 0;
384
385#ifdef DEBUG
386 if (errstatus)
2906b3ce 387 shost_printk(KERN_DEBUG, sh, "(aha1542 error:%x %x %x) ", errstatus,
1da177e4
LT
388 ccb[mbo].hastat, ccb[mbo].tarstat);
389#endif
390
391 if (ccb[mbo].tarstat == 2) {
392#ifdef DEBUG
393 int i;
394#endif
395 DEB(printk("aha1542_intr_handle: sense:"));
396#ifdef DEBUG
397 for (i = 0; i < 12; i++)
398 printk("%02x ", ccb[mbo].cdb[ccb[mbo].cdblen + i]);
399 printk("\n");
400#endif
401 /*
402 DEB(printk("aha1542_intr_handle: buf:"));
403 for (i = 0; i < bufflen; i++)
404 printk("%02x ", ((unchar *)buff)[i]);
405 printk("\n");
406 */
407 }
408 DEB(if (errstatus) printk("aha1542_intr_handle: returning %6x\n", errstatus));
55b28f9f
OZ
409 tmp_cmd->result = errstatus;
410 aha1542->int_cmds[mbo] = NULL; /* This effectively frees up the mailbox slot, as
e98878f7 411 far as queuecommand is concerned */
55b28f9f 412 my_done(tmp_cmd);
1da177e4
LT
413 number_serviced++;
414 };
415}
416
09a44833
OZ
417/* A quick wrapper for do_aha1542_intr_handle to grab the spin lock */
418static irqreturn_t do_aha1542_intr_handle(int dummy, void *dev_id)
419{
420 unsigned long flags;
c2532f68 421 struct Scsi_Host *sh = dev_id;
09a44833 422
c2532f68
OZ
423 spin_lock_irqsave(sh->host_lock, flags);
424 aha1542_intr_handle(sh);
425 spin_unlock_irqrestore(sh->host_lock, flags);
09a44833
OZ
426 return IRQ_HANDLED;
427}
428
55b28f9f 429static int aha1542_queuecommand_lck(struct scsi_cmnd *cmd, void (*done) (struct scsi_cmnd *))
1da177e4 430{
2906b3ce
OZ
431 struct Scsi_Host *sh = cmd->device->host;
432 struct aha1542_hostdata *aha1542 = shost_priv(sh);
cb5b570c 433 u8 direction;
55b28f9f
OZ
434 u8 target = cmd->device->id;
435 u8 lun = cmd->device->lun;
1da177e4 436 unsigned long flags;
55b28f9f 437 int bufflen = scsi_bufflen(cmd);
1da177e4 438 int mbo;
e98878f7
OZ
439 struct mailbox *mb = aha1542->mb;
440 struct ccb *ccb = aha1542->ccb;
1da177e4
LT
441
442 DEB(int i);
443
1da177e4 444 DEB(if (target > 1) {
55b28f9f
OZ
445 cmd->result = DID_TIME_OUT << 16;
446 done(cmd); return 0;
1da177e4
LT
447 }
448 );
449
55b28f9f 450 if (*cmd->cmnd == REQUEST_SENSE) {
1da177e4 451 /* Don't do the command - we have the sense data already */
55b28f9f
OZ
452 cmd->result = 0;
453 done(cmd);
1da177e4
LT
454 return 0;
455 }
456#ifdef DEBUG
55b28f9f
OZ
457 if (*cmd->cmnd == READ_10 || *cmd->cmnd == WRITE_10)
458 i = xscsi2int(cmd->cmnd + 2);
459 else if (*cmd->cmnd == READ_6 || *cmd->cmnd == WRITE_6)
460 i = scsi2int(cmd->cmnd + 2);
1da177e4
LT
461 else
462 i = -1;
463 if (done)
2906b3ce 464 shost_printk(KERN_DEBUG, sh, "aha1542_queuecommand: dev %d cmd %02x pos %d len %d ", target, *cmd->cmnd, i, bufflen);
1da177e4 465 else
2906b3ce
OZ
466 shost_printk(KERN_DEBUG, sh, "aha1542_command: dev %d cmd %02x pos %d len %d ", target, *cmd->cmnd, i, bufflen);
467 shost_printk(KERN_DEBUG, sh, "aha1542_queuecommand: dumping scsi cmd:");
55b28f9f
OZ
468 for (i = 0; i < cmd->cmd_len; i++)
469 printk("%02x ", cmd->cmnd[i]);
1da177e4 470 printk("\n");
55b28f9f 471 if (*cmd->cmnd == WRITE_10 || *cmd->cmnd == WRITE_6)
1da177e4
LT
472 return 0; /* we are still testing, so *don't* write */
473#endif
474 /* Use the outgoing mailboxes in a round-robin fashion, because this
475 is how the host adapter will scan for them */
476
477 spin_lock_irqsave(&aha1542_lock, flags);
e98878f7 478 mbo = aha1542->aha1542_last_mbo_used + 1;
1da177e4
LT
479 if (mbo >= AHA1542_MAILBOXES)
480 mbo = 0;
481
482 do {
55b28f9f 483 if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL)
1da177e4
LT
484 break;
485 mbo++;
486 if (mbo >= AHA1542_MAILBOXES)
487 mbo = 0;
e98878f7 488 } while (mbo != aha1542->aha1542_last_mbo_used);
1da177e4 489
55b28f9f 490 if (mb[mbo].status || aha1542->int_cmds[mbo])
1da177e4
LT
491 panic("Unable to find empty mailbox for aha1542.\n");
492
55b28f9f 493 aha1542->int_cmds[mbo] = cmd; /* This will effectively prevent someone else from
e98878f7 494 screwing with this cdb. */
1da177e4 495
e98878f7 496 aha1542->aha1542_last_mbo_used = mbo;
1da177e4
LT
497 spin_unlock_irqrestore(&aha1542_lock, flags);
498
499#ifdef DEBUG
2906b3ce 500 shost_printk(KERN_DEBUG, sh, "Sending command (%d %x)...", mbo, done);
1da177e4
LT
501#endif
502
10be6250 503 any2scsi(mb[mbo].ccbptr, isa_virt_to_bus(&ccb[mbo])); /* This gets trashed for some reason */
1da177e4
LT
504
505 memset(&ccb[mbo], 0, sizeof(struct ccb));
506
55b28f9f 507 ccb[mbo].cdblen = cmd->cmd_len;
1da177e4
LT
508
509 direction = 0;
55b28f9f 510 if (*cmd->cmnd == READ_10 || *cmd->cmnd == READ_6)
1da177e4 511 direction = 8;
55b28f9f 512 else if (*cmd->cmnd == WRITE_10 || *cmd->cmnd == WRITE_6)
1da177e4
LT
513 direction = 16;
514
55b28f9f 515 memcpy(ccb[mbo].cdb, cmd->cmnd, ccb[mbo].cdblen);
1da177e4 516
fc3fdfcc 517 if (bufflen) {
51cf2249 518 struct scatterlist *sg;
1da177e4
LT
519 struct chain *cptr;
520#ifdef DEBUG
521 unsigned char *ptr;
522#endif
55b28f9f 523 int i, sg_count = scsi_sg_count(cmd);
1da177e4 524 ccb[mbo].op = 2; /* SCSI Initiator Command w/scatter-gather */
55b28f9f 525 cmd->host_scribble = kmalloc(sizeof(*cptr)*sg_count,
fc3fdfcc 526 GFP_KERNEL | GFP_DMA);
55b28f9f 527 cptr = (struct chain *) cmd->host_scribble;
1da177e4
LT
528 if (cptr == NULL) {
529 /* free the claimed mailbox slot */
55b28f9f 530 aha1542->int_cmds[mbo] = NULL;
1da177e4
LT
531 return SCSI_MLQUEUE_HOST_BUSY;
532 }
55b28f9f 533 scsi_for_each_sg(cmd, sg, sg_count, i) {
10be6250
OZ
534 any2scsi(cptr[i].dataptr, isa_page_to_bus(sg_page(sg))
535 + sg->offset);
51cf2249 536 any2scsi(cptr[i].datalen, sg->length);
1da177e4 537 };
fc3fdfcc 538 any2scsi(ccb[mbo].datalen, sg_count * sizeof(struct chain));
10be6250 539 any2scsi(ccb[mbo].dataptr, isa_virt_to_bus(cptr));
1da177e4
LT
540#ifdef DEBUG
541 printk("cptr %x: ", cptr);
542 ptr = (unsigned char *) cptr;
543 for (i = 0; i < 18; i++)
544 printk("%02x ", ptr[i]);
545#endif
546 } else {
547 ccb[mbo].op = 0; /* SCSI Initiator Command */
55b28f9f 548 cmd->host_scribble = NULL;
fc3fdfcc
BH
549 any2scsi(ccb[mbo].datalen, 0);
550 any2scsi(ccb[mbo].dataptr, 0);
1da177e4
LT
551 };
552 ccb[mbo].idlun = (target & 7) << 5 | direction | (lun & 7); /*SCSI Target Id */
553 ccb[mbo].rsalen = 16;
554 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
555 ccb[mbo].commlinkid = 0;
556
557#ifdef DEBUG
558 {
559 int i;
2906b3ce 560 shost_printk(KERN_DEBUG, sh, "aha1542_command: sending.. ");
1da177e4 561 for (i = 0; i < sizeof(ccb[mbo]) - 10; i++)
cb5b570c 562 printk("%02x ", ((u8 *) &ccb[mbo])[i]);
1da177e4
LT
563 };
564#endif
565
566 if (done) {
f232d538 567 DEB(printk("aha1542_queuecommand: now waiting for interrupt "));
55b28f9f 568 cmd->scsi_done = done;
1da177e4 569 mb[mbo].status = 1;
55b28f9f 570 aha1542_outb(cmd->device->host->io_port, CMD_START_SCSI);
1da177e4
LT
571 } else
572 printk("aha1542_queuecommand: done can't be NULL\n");
573
574 return 0;
575}
576
f281233d
JG
577static DEF_SCSI_QCMD(aha1542_queuecommand)
578
1da177e4 579/* Initialize mailboxes */
68ea9de3 580static void setup_mailboxes(struct Scsi_Host *sh)
1da177e4 581{
c2532f68 582 struct aha1542_hostdata *aha1542 = shost_priv(sh);
1da177e4 583 int i;
e98878f7
OZ
584 struct mailbox *mb = aha1542->mb;
585 struct ccb *ccb = aha1542->ccb;
1da177e4 586
cad2fc72 587 u8 mb_cmd[5] = { CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0};
1da177e4 588
1da177e4
LT
589 for (i = 0; i < AHA1542_MAILBOXES; i++) {
590 mb[i].status = mb[AHA1542_MAILBOXES + i].status = 0;
10be6250 591 any2scsi(mb[i].ccbptr, isa_virt_to_bus(&ccb[i]));
1da177e4 592 };
68ea9de3 593 aha1542_intr_reset(sh->io_port); /* reset interrupts, so they don't block */
cad2fc72 594 any2scsi((mb_cmd + 2), isa_virt_to_bus(mb));
68ea9de3 595 if (aha1542_out(sh->io_port, mb_cmd, 5))
2906b3ce 596 shost_printk(KERN_ERR, sh, "failed setting up mailboxes\n");
68ea9de3 597 aha1542_intr_reset(sh->io_port);
1da177e4
LT
598}
599
68ea9de3 600static int aha1542_getconfig(struct Scsi_Host *sh)
1da177e4 601{
cb5b570c 602 u8 inquiry_result[3];
1da177e4 603 int i;
68ea9de3 604 i = inb(STATUS(sh->io_port));
1da177e4 605 if (i & DF) {
68ea9de3 606 i = inb(DATA(sh->io_port));
1da177e4 607 };
68ea9de3
OZ
608 aha1542_outb(sh->io_port, CMD_RETCONF);
609 aha1542_in(sh->io_port, inquiry_result, 3, 0);
610 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0))
2906b3ce 611 shost_printk(KERN_ERR, sh, "error querying board settings\n");
68ea9de3 612 aha1542_intr_reset(sh->io_port);
1da177e4
LT
613 switch (inquiry_result[0]) {
614 case 0x80:
68ea9de3 615 sh->dma_channel = 7;
1da177e4
LT
616 break;
617 case 0x40:
68ea9de3 618 sh->dma_channel = 6;
1da177e4
LT
619 break;
620 case 0x20:
68ea9de3 621 sh->dma_channel = 5;
1da177e4
LT
622 break;
623 case 0x01:
68ea9de3 624 sh->dma_channel = 0;
1da177e4
LT
625 break;
626 case 0:
627 /* This means that the adapter, although Adaptec 1542 compatible, doesn't use a DMA channel.
628 Currently only aware of the BusLogic BT-445S VL-Bus adapter which needs this. */
68ea9de3 629 sh->dma_channel = 0xFF;
1da177e4
LT
630 break;
631 default:
2906b3ce 632 shost_printk(KERN_ERR, sh, "Unable to determine DMA channel.\n");
1da177e4
LT
633 return -1;
634 };
635 switch (inquiry_result[1]) {
636 case 0x40:
68ea9de3 637 sh->irq = 15;
1da177e4
LT
638 break;
639 case 0x20:
68ea9de3 640 sh->irq = 14;
1da177e4
LT
641 break;
642 case 0x8:
68ea9de3 643 sh->irq = 12;
1da177e4
LT
644 break;
645 case 0x4:
68ea9de3 646 sh->irq = 11;
1da177e4
LT
647 break;
648 case 0x2:
68ea9de3 649 sh->irq = 10;
1da177e4
LT
650 break;
651 case 0x1:
68ea9de3 652 sh->irq = 9;
1da177e4
LT
653 break;
654 default:
2906b3ce 655 shost_printk(KERN_ERR, sh, "Unable to determine IRQ level.\n");
1da177e4
LT
656 return -1;
657 };
68ea9de3 658 sh->this_id = inquiry_result[2] & 7;
1da177e4
LT
659 return 0;
660}
661
662/* This function should only be called for 1542C boards - we can detect
663 the special firmware settings and unlock the board */
664
68ea9de3 665static int aha1542_mbenable(struct Scsi_Host *sh)
1da177e4 666{
cb5b570c
OZ
667 static u8 mbenable_cmd[3];
668 static u8 mbenable_result[2];
1da177e4
LT
669 int retval;
670
671 retval = BIOS_TRANSLATION_6432;
672
68ea9de3
OZ
673 aha1542_outb(sh->io_port, CMD_EXTBIOS);
674 if (aha1542_in(sh->io_port, mbenable_result, 2, 100))
1da177e4 675 return retval;
68ea9de3 676 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 100))
2093bfa1 677 goto fail;
68ea9de3 678 aha1542_intr_reset(sh->io_port);
1da177e4
LT
679
680 if ((mbenable_result[0] & 0x08) || mbenable_result[1]) {
681 mbenable_cmd[0] = CMD_MBENABLE;
682 mbenable_cmd[1] = 0;
683 mbenable_cmd[2] = mbenable_result[1];
684
685 if ((mbenable_result[0] & 0x08) && (mbenable_result[1] & 0x03))
686 retval = BIOS_TRANSLATION_25563;
687
68ea9de3 688 if (aha1542_out(sh->io_port, mbenable_cmd, 3))
2093bfa1 689 goto fail;
1da177e4
LT
690 };
691 while (0) {
692fail:
2906b3ce 693 shost_printk(KERN_ERR, sh, "Mailbox init failed\n");
1da177e4 694 }
68ea9de3 695 aha1542_intr_reset(sh->io_port);
1da177e4
LT
696 return retval;
697}
698
699/* Query the board to find out if it is a 1542 or a 1740, or whatever. */
68ea9de3 700static int aha1542_query(struct Scsi_Host *sh)
1da177e4 701{
68ea9de3 702 struct aha1542_hostdata *aha1542 = shost_priv(sh);
cb5b570c 703 u8 inquiry_result[4];
1da177e4 704 int i;
68ea9de3 705 i = inb(STATUS(sh->io_port));
1da177e4 706 if (i & DF) {
68ea9de3 707 i = inb(DATA(sh->io_port));
1da177e4 708 };
68ea9de3
OZ
709 aha1542_outb(sh->io_port, CMD_INQUIRY);
710 aha1542_in(sh->io_port, inquiry_result, 4, 0);
711 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0))
2906b3ce 712 shost_printk(KERN_ERR, sh, "error querying card type\n");
68ea9de3 713 aha1542_intr_reset(sh->io_port);
1da177e4 714
68ea9de3 715 aha1542->bios_translation = BIOS_TRANSLATION_6432; /* Default case */
1da177e4
LT
716
717 /* For an AHA1740 series board, we ignore the board since there is a
718 hardware bug which can lead to wrong blocks being returned if the board
719 is operating in the 1542 emulation mode. Since there is an extended mode
720 driver, we simply ignore the board and let the 1740 driver pick it up.
721 */
722
723 if (inquiry_result[0] == 0x43) {
2906b3ce 724 shost_printk(KERN_INFO, sh, "Emulation mode not supported for AHA-1740 hardware, use aha1740 driver instead.\n");
1da177e4
LT
725 return 1;
726 };
727
728 /* Always call this - boards that do not support extended bios translation
729 will ignore the command, and we will set the proper default */
730
68ea9de3 731 aha1542->bios_translation = aha1542_mbenable(sh);
1da177e4
LT
732
733 return 0;
734}
735
f71429ab 736static u8 dma_speed_hw(int dma_speed)
1da177e4 737{
f71429ab
OZ
738 switch (dma_speed) {
739 case 5:
740 return 0x00;
741 case 6:
742 return 0x04;
743 case 7:
744 return 0x01;
745 case 8:
746 return 0x02;
747 case 10:
748 return 0x03;
1da177e4 749 }
1da177e4 750
f71429ab 751 return 0xff; /* invalid */
1da177e4
LT
752}
753
f71429ab 754/* Set the Bus on/off-times as not to ruin floppy performance */
37d607bd 755static void aha1542_set_bus_times(struct Scsi_Host *sh, int bus_on, int bus_off, int dma_speed)
1da177e4 756{
37d607bd
OZ
757 if (bus_on > 0) {
758 u8 oncmd[] = { CMD_BUSON_TIME, clamp(bus_on, 2, 15) };
1da177e4 759
37d607bd
OZ
760 aha1542_intr_reset(sh->io_port);
761 if (aha1542_out(sh->io_port, oncmd, 2))
f71429ab
OZ
762 goto fail;
763 }
1da177e4 764
37d607bd
OZ
765 if (bus_off > 0) {
766 u8 offcmd[] = { CMD_BUSOFF_TIME, clamp(bus_off, 1, 64) };
1da177e4 767
37d607bd
OZ
768 aha1542_intr_reset(sh->io_port);
769 if (aha1542_out(sh->io_port, offcmd, 2))
f71429ab
OZ
770 goto fail;
771 }
1da177e4 772
37d607bd
OZ
773 if (dma_speed_hw(dma_speed) != 0xff) {
774 u8 dmacmd[] = { CMD_DMASPEED, dma_speed_hw(dma_speed) };
b847fd0d 775
37d607bd
OZ
776 aha1542_intr_reset(sh->io_port);
777 if (aha1542_out(sh->io_port, dmacmd, 2))
b847fd0d
OZ
778 goto fail;
779 }
37d607bd 780 aha1542_intr_reset(sh->io_port);
b847fd0d
OZ
781 return;
782fail:
2906b3ce 783 shost_printk(KERN_ERR, sh, "setting bus on/off-time failed\n");
37d607bd 784 aha1542_intr_reset(sh->io_port);
b847fd0d
OZ
785}
786
1da177e4 787/* return non-zero on detection */
643a7c43 788static struct Scsi_Host *aha1542_hw_init(struct scsi_host_template *tpnt, struct device *pdev, int indx)
1da177e4 789{
f71429ab 790 unsigned int base_io = io[indx];
c2532f68 791 struct Scsi_Host *sh;
e98878f7 792 struct aha1542_hostdata *aha1542;
2906b3ce 793 char dma_info[] = "no DMA";
1da177e4 794
3a70c006
OZ
795 if (base_io == 0)
796 return NULL;
1da177e4 797
3a70c006
OZ
798 if (!request_region(base_io, AHA1542_REGION_SIZE, "aha1542"))
799 return NULL;
1da177e4 800
c2532f68
OZ
801 sh = scsi_host_alloc(tpnt, sizeof(struct aha1542_hostdata));
802 if (!sh)
3a70c006 803 goto release;
c2532f68 804 aha1542 = shost_priv(sh);
b847fd0d 805
68ea9de3
OZ
806 sh->unique_id = base_io;
807 sh->io_port = base_io;
808 sh->n_io_port = AHA1542_REGION_SIZE;
809 aha1542->aha1542_last_mbi_used = 2 * AHA1542_MAILBOXES - 1;
810 aha1542->aha1542_last_mbo_used = AHA1542_MAILBOXES - 1;
811
812 if (!aha1542_test_port(sh))
3a70c006 813 goto unregister;
1da177e4 814
37d607bd 815 aha1542_set_bus_times(sh, bus_on[indx], bus_off[indx], dma_speed[indx]);
68ea9de3 816 if (aha1542_query(sh))
3a70c006 817 goto unregister;
68ea9de3 818 if (aha1542_getconfig(sh) == -1)
3a70c006 819 goto unregister;
1da177e4 820
c2532f68 821 if (sh->dma_channel != 0xFF)
2906b3ce
OZ
822 snprintf(dma_info, sizeof(dma_info), "DMA %d", sh->dma_channel);
823 shost_printk(KERN_INFO, sh, "Adaptec AHA-1542 (SCSI-ID %d) at IO 0x%x, IRQ %d, %s\n",
824 sh->this_id, base_io, sh->irq, dma_info);
3a70c006 825 if (aha1542->bios_translation == BIOS_TRANSLATION_25563)
2906b3ce 826 shost_printk(KERN_INFO, sh, "Using extended bios translation\n");
1da177e4 827
68ea9de3 828 setup_mailboxes(sh);
1da177e4 829
c2532f68
OZ
830 if (request_irq(sh->irq, do_aha1542_intr_handle, 0,
831 "aha1542", sh)) {
2906b3ce 832 shost_printk(KERN_ERR, sh, "Unable to allocate IRQ.\n");
3a70c006
OZ
833 goto unregister;
834 }
c2532f68
OZ
835 if (sh->dma_channel != 0xFF) {
836 if (request_dma(sh->dma_channel, "aha1542")) {
2906b3ce 837 shost_printk(KERN_ERR, sh, "Unable to allocate DMA channel.\n");
3a70c006
OZ
838 goto free_irq;
839 }
c2532f68
OZ
840 if (sh->dma_channel == 0 || sh->dma_channel >= 5) {
841 set_dma_mode(sh->dma_channel, DMA_MODE_CASCADE);
842 enable_dma(sh->dma_channel);
3a70c006
OZ
843 }
844 }
1da177e4 845
c2532f68 846 if (scsi_add_host(sh, pdev))
3a70c006 847 goto free_dma;
1da177e4 848
c2532f68 849 scsi_scan_host(sh);
1da177e4 850
c2532f68 851 return sh;
3a70c006 852free_dma:
c2532f68
OZ
853 if (sh->dma_channel != 0xff)
854 free_dma(sh->dma_channel);
3a70c006 855free_irq:
c2532f68 856 free_irq(sh->irq, sh);
3a70c006 857unregister:
c2532f68 858 scsi_host_put(sh);
3a70c006
OZ
859release:
860 release_region(base_io, AHA1542_REGION_SIZE);
1da177e4 861
643a7c43 862 return NULL;
1da177e4
LT
863}
864
c2532f68 865static int aha1542_release(struct Scsi_Host *sh)
1da177e4 866{
c2532f68
OZ
867 scsi_remove_host(sh);
868 if (sh->dma_channel != 0xff)
869 free_dma(sh->dma_channel);
870 if (sh->irq)
871 free_irq(sh->irq, sh);
872 if (sh->io_port && sh->n_io_port)
873 release_region(sh->io_port, sh->n_io_port);
874 scsi_host_put(sh);
1da177e4
LT
875 return 0;
876}
877
1da177e4 878
1da177e4
LT
879/*
880 * This is a device reset. This is handled by sending a special command
881 * to the device.
882 */
55b28f9f 883static int aha1542_dev_reset(struct scsi_cmnd *cmd)
1da177e4 884{
55b28f9f 885 struct aha1542_hostdata *aha1542 = shost_priv(cmd->device->host);
1da177e4 886 unsigned long flags;
e98878f7 887 struct mailbox *mb = aha1542->mb;
55b28f9f
OZ
888 u8 target = cmd->device->id;
889 u8 lun = cmd->device->lun;
1da177e4 890 int mbo;
e98878f7 891 struct ccb *ccb = aha1542->ccb;
1da177e4 892
1da177e4 893 spin_lock_irqsave(&aha1542_lock, flags);
e98878f7 894 mbo = aha1542->aha1542_last_mbo_used + 1;
1da177e4
LT
895 if (mbo >= AHA1542_MAILBOXES)
896 mbo = 0;
897
898 do {
55b28f9f 899 if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL)
1da177e4
LT
900 break;
901 mbo++;
902 if (mbo >= AHA1542_MAILBOXES)
903 mbo = 0;
e98878f7 904 } while (mbo != aha1542->aha1542_last_mbo_used);
1da177e4 905
55b28f9f 906 if (mb[mbo].status || aha1542->int_cmds[mbo])
1da177e4
LT
907 panic("Unable to find empty mailbox for aha1542.\n");
908
55b28f9f 909 aha1542->int_cmds[mbo] = cmd; /* This will effectively
e98878f7
OZ
910 prevent someone else from
911 screwing with this cdb. */
1da177e4 912
e98878f7 913 aha1542->aha1542_last_mbo_used = mbo;
1da177e4
LT
914 spin_unlock_irqrestore(&aha1542_lock, flags);
915
10be6250 916 any2scsi(mb[mbo].ccbptr, isa_virt_to_bus(&ccb[mbo])); /* This gets trashed for some reason */
1da177e4
LT
917
918 memset(&ccb[mbo], 0, sizeof(struct ccb));
919
920 ccb[mbo].op = 0x81; /* BUS DEVICE RESET */
921
922 ccb[mbo].idlun = (target & 7) << 5 | (lun & 7); /*SCSI Target Id */
923
924 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
925 ccb[mbo].commlinkid = 0;
926
927 /*
928 * Now tell the 1542 to flush all pending commands for this
929 * target
930 */
55b28f9f 931 aha1542_outb(cmd->device->host->io_port, CMD_START_SCSI);
1da177e4 932
55b28f9f 933 scmd_printk(KERN_WARNING, cmd,
017560fc 934 "Trying device reset for target\n");
1da177e4
LT
935
936 return SUCCESS;
1da177e4
LT
937}
938
55b28f9f 939static int aha1542_reset(struct scsi_cmnd *cmd, u8 reset_cmd)
1da177e4 940{
55b28f9f 941 struct aha1542_hostdata *aha1542 = shost_priv(cmd->device->host);
1da177e4
LT
942 int i;
943
944 /*
945 * This does a scsi reset for all devices on the bus.
946 * In principle, we could also reset the 1542 - should
947 * we do this? Try this first, and we can add that later
948 * if it turns out to be useful.
949 */
55b28f9f 950 outb(reset_cmd, CONTROL(cmd->device->host->io_port));
1da177e4
LT
951
952 /*
953 * Wait for the thing to settle down a bit. Unfortunately
954 * this is going to basically lock up the machine while we
955 * wait for this to complete. To be 100% correct, we need to
956 * check for timeout, and if we are doing something like this
957 * we are pretty desperate anyways.
958 */
1da177e4 959 ssleep(4);
55b28f9f 960 spin_lock_irq(cmd->device->host->host_lock);
1da177e4 961
55b28f9f 962 if (!wait_mask(STATUS(cmd->device->host->io_port),
a13b3722 963 STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0)) {
55b28f9f 964 spin_unlock_irq(cmd->device->host->host_lock);
a13b3722
OZ
965 return FAILED;
966 }
8537cba8
OZ
967 /*
968 * We need to do this too before the 1542 can interact with
969 * us again after host reset.
970 */
971 if (reset_cmd & HRST)
68ea9de3 972 setup_mailboxes(cmd->device->host);
1da177e4
LT
973 /*
974 * Now try to pick up the pieces. For all pending commands,
975 * free any internal data structures, and basically clear things
976 * out. We do not try and restart any commands or anything -
977 * the strategy handler takes care of that crap.
978 */
2906b3ce 979 shost_printk(KERN_WARNING, cmd->device->host, "Sent BUS RESET to scsi host %d\n", cmd->device->host->host_no);
1da177e4
LT
980
981 for (i = 0; i < AHA1542_MAILBOXES; i++) {
55b28f9f
OZ
982 if (aha1542->int_cmds[i] != NULL) {
983 struct scsi_cmnd *tmp_cmd;
984 tmp_cmd = aha1542->int_cmds[i];
1da177e4 985
55b28f9f 986 if (tmp_cmd->device->soft_reset) {
1da177e4
LT
987 /*
988 * If this device implements the soft reset option,
989 * then it is still holding onto the command, and
990 * may yet complete it. In this case, we don't
991 * flush the data.
992 */
993 continue;
994 }
55b28f9f
OZ
995 kfree(tmp_cmd->host_scribble);
996 tmp_cmd->host_scribble = NULL;
997 aha1542->int_cmds[i] = NULL;
e98878f7 998 aha1542->mb[i].status = 0;
1da177e4
LT
999 }
1000 }
1001
55b28f9f 1002 spin_unlock_irq(cmd->device->host->host_lock);
1da177e4 1003 return SUCCESS;
1da177e4
LT
1004}
1005
55b28f9f 1006static int aha1542_bus_reset(struct scsi_cmnd *cmd)
1da177e4 1007{
55b28f9f 1008 return aha1542_reset(cmd, SCRST);
8537cba8 1009}
1da177e4 1010
55b28f9f 1011static int aha1542_host_reset(struct scsi_cmnd *cmd)
8537cba8 1012{
55b28f9f 1013 return aha1542_reset(cmd, HRST | SCRST);
1da177e4
LT
1014}
1015
1da177e4 1016static int aha1542_biosparam(struct scsi_device *sdev,
17787a09 1017 struct block_device *bdev, sector_t capacity, int geom[])
1da177e4 1018{
e98878f7 1019 struct aha1542_hostdata *aha1542 = shost_priv(sdev->host);
1da177e4 1020
17787a09
OZ
1021 if (capacity >= 0x200000 &&
1022 aha1542->bios_translation == BIOS_TRANSLATION_25563) {
1da177e4 1023 /* Please verify that this is the same as what DOS returns */
17787a09
OZ
1024 geom[0] = 255; /* heads */
1025 geom[1] = 63; /* sectors */
1da177e4 1026 } else {
17787a09
OZ
1027 geom[0] = 64; /* heads */
1028 geom[1] = 32; /* sectors */
1da177e4 1029 }
17787a09 1030 geom[2] = sector_div(capacity, geom[0] * geom[1]); /* cylinders */
1da177e4
LT
1031
1032 return 0;
1033}
1034MODULE_LICENSE("GPL");
1035
d0be4a7d 1036static struct scsi_host_template driver_template = {
643a7c43 1037 .module = THIS_MODULE,
1da177e4
LT
1038 .proc_name = "aha1542",
1039 .name = "Adaptec 1542",
1da177e4 1040 .queuecommand = aha1542_queuecommand,
1da177e4
LT
1041 .eh_device_reset_handler= aha1542_dev_reset,
1042 .eh_bus_reset_handler = aha1542_bus_reset,
1043 .eh_host_reset_handler = aha1542_host_reset,
1044 .bios_param = aha1542_biosparam,
1045 .can_queue = AHA1542_MAILBOXES,
1046 .this_id = 7,
10be6250
OZ
1047 .sg_tablesize = 16,
1048 .cmd_per_lun = 1,
1da177e4
LT
1049 .unchecked_isa_dma = 1,
1050 .use_clustering = ENABLE_CLUSTERING,
1051};
643a7c43
OZ
1052
1053static int aha1542_isa_match(struct device *pdev, unsigned int ndev)
1054{
1055 struct Scsi_Host *sh = aha1542_hw_init(&driver_template, pdev, ndev);
1056
1057 if (!sh)
1058 return 0;
1059
1060 dev_set_drvdata(pdev, sh);
1061 return 1;
1062}
1063
1064static int aha1542_isa_remove(struct device *pdev,
1065 unsigned int ndev)
1066{
1067 aha1542_release(dev_get_drvdata(pdev));
1068 dev_set_drvdata(pdev, NULL);
1069 return 0;
1070}
1071
1072static struct isa_driver aha1542_isa_driver = {
1073 .match = aha1542_isa_match,
1074 .remove = aha1542_isa_remove,
1075 .driver = {
1076 .name = "aha1542"
1077 },
1078};
1079static int isa_registered;
1080
1081#ifdef CONFIG_PNP
1082static struct pnp_device_id aha1542_pnp_ids[] = {
1083 { .id = "ADP1542" },
1084 { .id = "" }
1085};
1086MODULE_DEVICE_TABLE(pnp, aha1542_pnp_ids);
1087
1088static int aha1542_pnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *id)
1089{
1090 int indx;
1091 struct Scsi_Host *sh;
1092
f71429ab
OZ
1093 for (indx = 0; indx < ARRAY_SIZE(io); indx++) {
1094 if (io[indx])
643a7c43
OZ
1095 continue;
1096
1097 if (pnp_activate_dev(pdev) < 0)
1098 continue;
1099
f71429ab 1100 io[indx] = pnp_port_start(pdev, 0);
643a7c43
OZ
1101
1102 /* The card can be queried for its DMA, we have
1103 the DMA set up that is enough */
1104
2906b3ce 1105 dev_info(&pdev->dev, "ISAPnP found an AHA1535 at I/O 0x%03X", io[indx]);
643a7c43
OZ
1106 }
1107
1108 sh = aha1542_hw_init(&driver_template, &pdev->dev, indx);
1109 if (!sh)
1110 return -ENODEV;
1111
1112 pnp_set_drvdata(pdev, sh);
1113 return 0;
1114}
1115
1116static void aha1542_pnp_remove(struct pnp_dev *pdev)
1117{
1118 aha1542_release(pnp_get_drvdata(pdev));
1119 pnp_set_drvdata(pdev, NULL);
1120}
1121
1122static struct pnp_driver aha1542_pnp_driver = {
1123 .name = "aha1542",
1124 .id_table = aha1542_pnp_ids,
1125 .probe = aha1542_pnp_probe,
1126 .remove = aha1542_pnp_remove,
1127};
1128static int pnp_registered;
1129#endif /* CONFIG_PNP */
1130
1131static int __init aha1542_init(void)
1132{
1133 int ret = 0;
643a7c43
OZ
1134
1135#ifdef CONFIG_PNP
1136 if (isapnp) {
1137 ret = pnp_register_driver(&aha1542_pnp_driver);
1138 if (!ret)
1139 pnp_registered = 1;
1140 }
1141#endif
1142 ret = isa_register_driver(&aha1542_isa_driver, MAXBOARDS);
1143 if (!ret)
1144 isa_registered = 1;
1145
1146#ifdef CONFIG_PNP
1147 if (pnp_registered)
1148 ret = 0;
1149#endif
1150 if (isa_registered)
1151 ret = 0;
1152
1153 return ret;
1154}
1155
1156static void __exit aha1542_exit(void)
1157{
1158#ifdef CONFIG_PNP
1159 if (pnp_registered)
1160 pnp_unregister_driver(&aha1542_pnp_driver);
1161#endif
1162 if (isa_registered)
1163 isa_unregister_driver(&aha1542_isa_driver);
1164}
1165
1166module_init(aha1542_init);
1167module_exit(aha1542_exit);
This page took 0.981416 seconds and 5 git commands to generate.