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