]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - drivers/scsi/aha1542.c
treewide: kmalloc() -> kmalloc_array()
[mirror_ubuntu-jammy-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_hw_array(io, int, ioport, 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, sg_count;
379 struct mailbox *mb = aha1542->mb;
380 struct ccb *ccb = aha1542->ccb;
381 struct chain *cptr;
382
383 if (*cmd->cmnd == REQUEST_SENSE) {
384 /* Don't do the command - we have the sense data already */
385 cmd->result = 0;
386 cmd->scsi_done(cmd);
387 return 0;
388 }
389 #ifdef DEBUG
390 {
391 int i = -1;
392 if (*cmd->cmnd == READ_10 || *cmd->cmnd == WRITE_10)
393 i = xscsi2int(cmd->cmnd + 2);
394 else if (*cmd->cmnd == READ_6 || *cmd->cmnd == WRITE_6)
395 i = scsi2int(cmd->cmnd + 2);
396 shost_printk(KERN_DEBUG, sh, "aha1542_queuecommand: dev %d cmd %02x pos %d len %d",
397 target, *cmd->cmnd, i, bufflen);
398 print_hex_dump_bytes("command: ", DUMP_PREFIX_NONE, cmd->cmnd, cmd->cmd_len);
399 }
400 #endif
401 if (bufflen) { /* allocate memory before taking host_lock */
402 sg_count = scsi_sg_count(cmd);
403 cptr = kmalloc_array(sg_count, sizeof(*cptr),
404 GFP_KERNEL | GFP_DMA);
405 if (!cptr)
406 return SCSI_MLQUEUE_HOST_BUSY;
407 } else {
408 sg_count = 0;
409 cptr = NULL;
410 }
411
412 /* Use the outgoing mailboxes in a round-robin fashion, because this
413 is how the host adapter will scan for them */
414
415 spin_lock_irqsave(sh->host_lock, flags);
416 mbo = aha1542->aha1542_last_mbo_used + 1;
417 if (mbo >= AHA1542_MAILBOXES)
418 mbo = 0;
419
420 do {
421 if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL)
422 break;
423 mbo++;
424 if (mbo >= AHA1542_MAILBOXES)
425 mbo = 0;
426 } while (mbo != aha1542->aha1542_last_mbo_used);
427
428 if (mb[mbo].status || aha1542->int_cmds[mbo])
429 panic("Unable to find empty mailbox for aha1542.\n");
430
431 aha1542->int_cmds[mbo] = cmd; /* This will effectively prevent someone else from
432 screwing with this cdb. */
433
434 aha1542->aha1542_last_mbo_used = mbo;
435
436 #ifdef DEBUG
437 shost_printk(KERN_DEBUG, sh, "Sending command (%d %p)...", mbo, cmd->scsi_done);
438 #endif
439
440 any2scsi(mb[mbo].ccbptr, isa_virt_to_bus(&ccb[mbo])); /* This gets trashed for some reason */
441
442 memset(&ccb[mbo], 0, sizeof(struct ccb));
443
444 ccb[mbo].cdblen = cmd->cmd_len;
445
446 direction = 0;
447 if (*cmd->cmnd == READ_10 || *cmd->cmnd == READ_6)
448 direction = 8;
449 else if (*cmd->cmnd == WRITE_10 || *cmd->cmnd == WRITE_6)
450 direction = 16;
451
452 memcpy(ccb[mbo].cdb, cmd->cmnd, ccb[mbo].cdblen);
453
454 if (bufflen) {
455 struct scatterlist *sg;
456 int i;
457
458 ccb[mbo].op = 2; /* SCSI Initiator Command w/scatter-gather */
459 cmd->host_scribble = (void *)cptr;
460 scsi_for_each_sg(cmd, sg, sg_count, i) {
461 any2scsi(cptr[i].dataptr, isa_page_to_bus(sg_page(sg))
462 + sg->offset);
463 any2scsi(cptr[i].datalen, sg->length);
464 };
465 any2scsi(ccb[mbo].datalen, sg_count * sizeof(struct chain));
466 any2scsi(ccb[mbo].dataptr, isa_virt_to_bus(cptr));
467 #ifdef DEBUG
468 shost_printk(KERN_DEBUG, sh, "cptr %p: ", cptr);
469 print_hex_dump_bytes("cptr: ", DUMP_PREFIX_NONE, cptr, 18);
470 #endif
471 } else {
472 ccb[mbo].op = 0; /* SCSI Initiator Command */
473 cmd->host_scribble = NULL;
474 any2scsi(ccb[mbo].datalen, 0);
475 any2scsi(ccb[mbo].dataptr, 0);
476 };
477 ccb[mbo].idlun = (target & 7) << 5 | direction | (lun & 7); /*SCSI Target Id */
478 ccb[mbo].rsalen = 16;
479 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
480 ccb[mbo].commlinkid = 0;
481
482 #ifdef DEBUG
483 print_hex_dump_bytes("sending: ", DUMP_PREFIX_NONE, &ccb[mbo], sizeof(ccb[mbo]) - 10);
484 printk("aha1542_queuecommand: now waiting for interrupt ");
485 #endif
486 mb[mbo].status = 1;
487 aha1542_outb(cmd->device->host->io_port, CMD_START_SCSI);
488 spin_unlock_irqrestore(sh->host_lock, flags);
489
490 return 0;
491 }
492
493 /* Initialize mailboxes */
494 static void setup_mailboxes(struct Scsi_Host *sh)
495 {
496 struct aha1542_hostdata *aha1542 = shost_priv(sh);
497 int i;
498 struct mailbox *mb = aha1542->mb;
499 struct ccb *ccb = aha1542->ccb;
500
501 u8 mb_cmd[5] = { CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0};
502
503 for (i = 0; i < AHA1542_MAILBOXES; i++) {
504 mb[i].status = mb[AHA1542_MAILBOXES + i].status = 0;
505 any2scsi(mb[i].ccbptr, isa_virt_to_bus(&ccb[i]));
506 };
507 aha1542_intr_reset(sh->io_port); /* reset interrupts, so they don't block */
508 any2scsi((mb_cmd + 2), isa_virt_to_bus(mb));
509 if (aha1542_out(sh->io_port, mb_cmd, 5))
510 shost_printk(KERN_ERR, sh, "failed setting up mailboxes\n");
511 aha1542_intr_reset(sh->io_port);
512 }
513
514 static int aha1542_getconfig(struct Scsi_Host *sh)
515 {
516 u8 inquiry_result[3];
517 int i;
518 i = inb(STATUS(sh->io_port));
519 if (i & DF) {
520 i = inb(DATA(sh->io_port));
521 };
522 aha1542_outb(sh->io_port, CMD_RETCONF);
523 aha1542_in(sh->io_port, inquiry_result, 3, 0);
524 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0))
525 shost_printk(KERN_ERR, sh, "error querying board settings\n");
526 aha1542_intr_reset(sh->io_port);
527 switch (inquiry_result[0]) {
528 case 0x80:
529 sh->dma_channel = 7;
530 break;
531 case 0x40:
532 sh->dma_channel = 6;
533 break;
534 case 0x20:
535 sh->dma_channel = 5;
536 break;
537 case 0x01:
538 sh->dma_channel = 0;
539 break;
540 case 0:
541 /* This means that the adapter, although Adaptec 1542 compatible, doesn't use a DMA channel.
542 Currently only aware of the BusLogic BT-445S VL-Bus adapter which needs this. */
543 sh->dma_channel = 0xFF;
544 break;
545 default:
546 shost_printk(KERN_ERR, sh, "Unable to determine DMA channel.\n");
547 return -1;
548 };
549 switch (inquiry_result[1]) {
550 case 0x40:
551 sh->irq = 15;
552 break;
553 case 0x20:
554 sh->irq = 14;
555 break;
556 case 0x8:
557 sh->irq = 12;
558 break;
559 case 0x4:
560 sh->irq = 11;
561 break;
562 case 0x2:
563 sh->irq = 10;
564 break;
565 case 0x1:
566 sh->irq = 9;
567 break;
568 default:
569 shost_printk(KERN_ERR, sh, "Unable to determine IRQ level.\n");
570 return -1;
571 };
572 sh->this_id = inquiry_result[2] & 7;
573 return 0;
574 }
575
576 /* This function should only be called for 1542C boards - we can detect
577 the special firmware settings and unlock the board */
578
579 static int aha1542_mbenable(struct Scsi_Host *sh)
580 {
581 static u8 mbenable_cmd[3];
582 static u8 mbenable_result[2];
583 int retval;
584
585 retval = BIOS_TRANSLATION_6432;
586
587 aha1542_outb(sh->io_port, CMD_EXTBIOS);
588 if (aha1542_in(sh->io_port, mbenable_result, 2, 100))
589 return retval;
590 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 100))
591 goto fail;
592 aha1542_intr_reset(sh->io_port);
593
594 if ((mbenable_result[0] & 0x08) || mbenable_result[1]) {
595 mbenable_cmd[0] = CMD_MBENABLE;
596 mbenable_cmd[1] = 0;
597 mbenable_cmd[2] = mbenable_result[1];
598
599 if ((mbenable_result[0] & 0x08) && (mbenable_result[1] & 0x03))
600 retval = BIOS_TRANSLATION_25563;
601
602 if (aha1542_out(sh->io_port, mbenable_cmd, 3))
603 goto fail;
604 };
605 while (0) {
606 fail:
607 shost_printk(KERN_ERR, sh, "Mailbox init failed\n");
608 }
609 aha1542_intr_reset(sh->io_port);
610 return retval;
611 }
612
613 /* Query the board to find out if it is a 1542 or a 1740, or whatever. */
614 static int aha1542_query(struct Scsi_Host *sh)
615 {
616 struct aha1542_hostdata *aha1542 = shost_priv(sh);
617 u8 inquiry_result[4];
618 int i;
619 i = inb(STATUS(sh->io_port));
620 if (i & DF) {
621 i = inb(DATA(sh->io_port));
622 };
623 aha1542_outb(sh->io_port, CMD_INQUIRY);
624 aha1542_in(sh->io_port, inquiry_result, 4, 0);
625 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0))
626 shost_printk(KERN_ERR, sh, "error querying card type\n");
627 aha1542_intr_reset(sh->io_port);
628
629 aha1542->bios_translation = BIOS_TRANSLATION_6432; /* Default case */
630
631 /* For an AHA1740 series board, we ignore the board since there is a
632 hardware bug which can lead to wrong blocks being returned if the board
633 is operating in the 1542 emulation mode. Since there is an extended mode
634 driver, we simply ignore the board and let the 1740 driver pick it up.
635 */
636
637 if (inquiry_result[0] == 0x43) {
638 shost_printk(KERN_INFO, sh, "Emulation mode not supported for AHA-1740 hardware, use aha1740 driver instead.\n");
639 return 1;
640 };
641
642 /* Always call this - boards that do not support extended bios translation
643 will ignore the command, and we will set the proper default */
644
645 aha1542->bios_translation = aha1542_mbenable(sh);
646
647 return 0;
648 }
649
650 static u8 dma_speed_hw(int dma_speed)
651 {
652 switch (dma_speed) {
653 case 5:
654 return 0x00;
655 case 6:
656 return 0x04;
657 case 7:
658 return 0x01;
659 case 8:
660 return 0x02;
661 case 10:
662 return 0x03;
663 }
664
665 return 0xff; /* invalid */
666 }
667
668 /* Set the Bus on/off-times as not to ruin floppy performance */
669 static void aha1542_set_bus_times(struct Scsi_Host *sh, int bus_on, int bus_off, int dma_speed)
670 {
671 if (bus_on > 0) {
672 u8 oncmd[] = { CMD_BUSON_TIME, clamp(bus_on, 2, 15) };
673
674 aha1542_intr_reset(sh->io_port);
675 if (aha1542_out(sh->io_port, oncmd, 2))
676 goto fail;
677 }
678
679 if (bus_off > 0) {
680 u8 offcmd[] = { CMD_BUSOFF_TIME, clamp(bus_off, 1, 64) };
681
682 aha1542_intr_reset(sh->io_port);
683 if (aha1542_out(sh->io_port, offcmd, 2))
684 goto fail;
685 }
686
687 if (dma_speed_hw(dma_speed) != 0xff) {
688 u8 dmacmd[] = { CMD_DMASPEED, dma_speed_hw(dma_speed) };
689
690 aha1542_intr_reset(sh->io_port);
691 if (aha1542_out(sh->io_port, dmacmd, 2))
692 goto fail;
693 }
694 aha1542_intr_reset(sh->io_port);
695 return;
696 fail:
697 shost_printk(KERN_ERR, sh, "setting bus on/off-time failed\n");
698 aha1542_intr_reset(sh->io_port);
699 }
700
701 /* return non-zero on detection */
702 static struct Scsi_Host *aha1542_hw_init(struct scsi_host_template *tpnt, struct device *pdev, int indx)
703 {
704 unsigned int base_io = io[indx];
705 struct Scsi_Host *sh;
706 struct aha1542_hostdata *aha1542;
707 char dma_info[] = "no DMA";
708
709 if (base_io == 0)
710 return NULL;
711
712 if (!request_region(base_io, AHA1542_REGION_SIZE, "aha1542"))
713 return NULL;
714
715 sh = scsi_host_alloc(tpnt, sizeof(struct aha1542_hostdata));
716 if (!sh)
717 goto release;
718 aha1542 = shost_priv(sh);
719
720 sh->unique_id = base_io;
721 sh->io_port = base_io;
722 sh->n_io_port = AHA1542_REGION_SIZE;
723 aha1542->aha1542_last_mbi_used = 2 * AHA1542_MAILBOXES - 1;
724 aha1542->aha1542_last_mbo_used = AHA1542_MAILBOXES - 1;
725
726 if (!aha1542_test_port(sh))
727 goto unregister;
728
729 aha1542_set_bus_times(sh, bus_on[indx], bus_off[indx], dma_speed[indx]);
730 if (aha1542_query(sh))
731 goto unregister;
732 if (aha1542_getconfig(sh) == -1)
733 goto unregister;
734
735 if (sh->dma_channel != 0xFF)
736 snprintf(dma_info, sizeof(dma_info), "DMA %d", sh->dma_channel);
737 shost_printk(KERN_INFO, sh, "Adaptec AHA-1542 (SCSI-ID %d) at IO 0x%x, IRQ %d, %s\n",
738 sh->this_id, base_io, sh->irq, dma_info);
739 if (aha1542->bios_translation == BIOS_TRANSLATION_25563)
740 shost_printk(KERN_INFO, sh, "Using extended bios translation\n");
741
742 setup_mailboxes(sh);
743
744 if (request_irq(sh->irq, aha1542_interrupt, 0, "aha1542", sh)) {
745 shost_printk(KERN_ERR, sh, "Unable to allocate IRQ.\n");
746 goto unregister;
747 }
748 if (sh->dma_channel != 0xFF) {
749 if (request_dma(sh->dma_channel, "aha1542")) {
750 shost_printk(KERN_ERR, sh, "Unable to allocate DMA channel.\n");
751 goto free_irq;
752 }
753 if (sh->dma_channel == 0 || sh->dma_channel >= 5) {
754 set_dma_mode(sh->dma_channel, DMA_MODE_CASCADE);
755 enable_dma(sh->dma_channel);
756 }
757 }
758
759 if (scsi_add_host(sh, pdev))
760 goto free_dma;
761
762 scsi_scan_host(sh);
763
764 return sh;
765 free_dma:
766 if (sh->dma_channel != 0xff)
767 free_dma(sh->dma_channel);
768 free_irq:
769 free_irq(sh->irq, sh);
770 unregister:
771 scsi_host_put(sh);
772 release:
773 release_region(base_io, AHA1542_REGION_SIZE);
774
775 return NULL;
776 }
777
778 static int aha1542_release(struct Scsi_Host *sh)
779 {
780 scsi_remove_host(sh);
781 if (sh->dma_channel != 0xff)
782 free_dma(sh->dma_channel);
783 if (sh->irq)
784 free_irq(sh->irq, sh);
785 if (sh->io_port && sh->n_io_port)
786 release_region(sh->io_port, sh->n_io_port);
787 scsi_host_put(sh);
788 return 0;
789 }
790
791
792 /*
793 * This is a device reset. This is handled by sending a special command
794 * to the device.
795 */
796 static int aha1542_dev_reset(struct scsi_cmnd *cmd)
797 {
798 struct Scsi_Host *sh = cmd->device->host;
799 struct aha1542_hostdata *aha1542 = shost_priv(sh);
800 unsigned long flags;
801 struct mailbox *mb = aha1542->mb;
802 u8 target = cmd->device->id;
803 u8 lun = cmd->device->lun;
804 int mbo;
805 struct ccb *ccb = aha1542->ccb;
806
807 spin_lock_irqsave(sh->host_lock, flags);
808 mbo = aha1542->aha1542_last_mbo_used + 1;
809 if (mbo >= AHA1542_MAILBOXES)
810 mbo = 0;
811
812 do {
813 if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL)
814 break;
815 mbo++;
816 if (mbo >= AHA1542_MAILBOXES)
817 mbo = 0;
818 } while (mbo != aha1542->aha1542_last_mbo_used);
819
820 if (mb[mbo].status || aha1542->int_cmds[mbo])
821 panic("Unable to find empty mailbox for aha1542.\n");
822
823 aha1542->int_cmds[mbo] = cmd; /* This will effectively
824 prevent someone else from
825 screwing with this cdb. */
826
827 aha1542->aha1542_last_mbo_used = mbo;
828
829 any2scsi(mb[mbo].ccbptr, isa_virt_to_bus(&ccb[mbo])); /* This gets trashed for some reason */
830
831 memset(&ccb[mbo], 0, sizeof(struct ccb));
832
833 ccb[mbo].op = 0x81; /* BUS DEVICE RESET */
834
835 ccb[mbo].idlun = (target & 7) << 5 | (lun & 7); /*SCSI Target Id */
836
837 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
838 ccb[mbo].commlinkid = 0;
839
840 /*
841 * Now tell the 1542 to flush all pending commands for this
842 * target
843 */
844 aha1542_outb(sh->io_port, CMD_START_SCSI);
845 spin_unlock_irqrestore(sh->host_lock, flags);
846
847 scmd_printk(KERN_WARNING, cmd,
848 "Trying device reset for target\n");
849
850 return SUCCESS;
851 }
852
853 static int aha1542_reset(struct scsi_cmnd *cmd, u8 reset_cmd)
854 {
855 struct Scsi_Host *sh = cmd->device->host;
856 struct aha1542_hostdata *aha1542 = shost_priv(sh);
857 unsigned long flags;
858 int i;
859
860 spin_lock_irqsave(sh->host_lock, flags);
861 /*
862 * This does a scsi reset for all devices on the bus.
863 * In principle, we could also reset the 1542 - should
864 * we do this? Try this first, and we can add that later
865 * if it turns out to be useful.
866 */
867 outb(reset_cmd, CONTROL(cmd->device->host->io_port));
868
869 if (!wait_mask(STATUS(cmd->device->host->io_port),
870 STATMASK, IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0)) {
871 spin_unlock_irqrestore(sh->host_lock, flags);
872 return FAILED;
873 }
874
875 /*
876 * We need to do this too before the 1542 can interact with
877 * us again after host reset.
878 */
879 if (reset_cmd & HRST)
880 setup_mailboxes(cmd->device->host);
881
882 /*
883 * Now try to pick up the pieces. For all pending commands,
884 * free any internal data structures, and basically clear things
885 * out. We do not try and restart any commands or anything -
886 * the strategy handler takes care of that crap.
887 */
888 shost_printk(KERN_WARNING, cmd->device->host, "Sent BUS RESET to scsi host %d\n", cmd->device->host->host_no);
889
890 for (i = 0; i < AHA1542_MAILBOXES; i++) {
891 if (aha1542->int_cmds[i] != NULL) {
892 struct scsi_cmnd *tmp_cmd;
893 tmp_cmd = aha1542->int_cmds[i];
894
895 if (tmp_cmd->device->soft_reset) {
896 /*
897 * If this device implements the soft reset option,
898 * then it is still holding onto the command, and
899 * may yet complete it. In this case, we don't
900 * flush the data.
901 */
902 continue;
903 }
904 kfree(tmp_cmd->host_scribble);
905 tmp_cmd->host_scribble = NULL;
906 aha1542->int_cmds[i] = NULL;
907 aha1542->mb[i].status = 0;
908 }
909 }
910
911 spin_unlock_irqrestore(sh->host_lock, flags);
912 return SUCCESS;
913 }
914
915 static int aha1542_bus_reset(struct scsi_cmnd *cmd)
916 {
917 return aha1542_reset(cmd, SCRST);
918 }
919
920 static int aha1542_host_reset(struct scsi_cmnd *cmd)
921 {
922 return aha1542_reset(cmd, HRST | SCRST);
923 }
924
925 static int aha1542_biosparam(struct scsi_device *sdev,
926 struct block_device *bdev, sector_t capacity, int geom[])
927 {
928 struct aha1542_hostdata *aha1542 = shost_priv(sdev->host);
929
930 if (capacity >= 0x200000 &&
931 aha1542->bios_translation == BIOS_TRANSLATION_25563) {
932 /* Please verify that this is the same as what DOS returns */
933 geom[0] = 255; /* heads */
934 geom[1] = 63; /* sectors */
935 } else {
936 geom[0] = 64; /* heads */
937 geom[1] = 32; /* sectors */
938 }
939 geom[2] = sector_div(capacity, geom[0] * geom[1]); /* cylinders */
940
941 return 0;
942 }
943 MODULE_LICENSE("GPL");
944
945 static struct scsi_host_template driver_template = {
946 .module = THIS_MODULE,
947 .proc_name = "aha1542",
948 .name = "Adaptec 1542",
949 .queuecommand = aha1542_queuecommand,
950 .eh_device_reset_handler= aha1542_dev_reset,
951 .eh_bus_reset_handler = aha1542_bus_reset,
952 .eh_host_reset_handler = aha1542_host_reset,
953 .bios_param = aha1542_biosparam,
954 .can_queue = AHA1542_MAILBOXES,
955 .this_id = 7,
956 .sg_tablesize = 16,
957 .unchecked_isa_dma = 1,
958 .use_clustering = ENABLE_CLUSTERING,
959 };
960
961 static int aha1542_isa_match(struct device *pdev, unsigned int ndev)
962 {
963 struct Scsi_Host *sh = aha1542_hw_init(&driver_template, pdev, ndev);
964
965 if (!sh)
966 return 0;
967
968 dev_set_drvdata(pdev, sh);
969 return 1;
970 }
971
972 static int aha1542_isa_remove(struct device *pdev,
973 unsigned int ndev)
974 {
975 aha1542_release(dev_get_drvdata(pdev));
976 dev_set_drvdata(pdev, NULL);
977 return 0;
978 }
979
980 static struct isa_driver aha1542_isa_driver = {
981 .match = aha1542_isa_match,
982 .remove = aha1542_isa_remove,
983 .driver = {
984 .name = "aha1542"
985 },
986 };
987 static int isa_registered;
988
989 #ifdef CONFIG_PNP
990 static const struct pnp_device_id aha1542_pnp_ids[] = {
991 { .id = "ADP1542" },
992 { .id = "" }
993 };
994 MODULE_DEVICE_TABLE(pnp, aha1542_pnp_ids);
995
996 static int aha1542_pnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *id)
997 {
998 int indx;
999 struct Scsi_Host *sh;
1000
1001 for (indx = 0; indx < ARRAY_SIZE(io); indx++) {
1002 if (io[indx])
1003 continue;
1004
1005 if (pnp_activate_dev(pdev) < 0)
1006 continue;
1007
1008 io[indx] = pnp_port_start(pdev, 0);
1009
1010 /* The card can be queried for its DMA, we have
1011 the DMA set up that is enough */
1012
1013 dev_info(&pdev->dev, "ISAPnP found an AHA1535 at I/O 0x%03X", io[indx]);
1014 }
1015
1016 sh = aha1542_hw_init(&driver_template, &pdev->dev, indx);
1017 if (!sh)
1018 return -ENODEV;
1019
1020 pnp_set_drvdata(pdev, sh);
1021 return 0;
1022 }
1023
1024 static void aha1542_pnp_remove(struct pnp_dev *pdev)
1025 {
1026 aha1542_release(pnp_get_drvdata(pdev));
1027 pnp_set_drvdata(pdev, NULL);
1028 }
1029
1030 static struct pnp_driver aha1542_pnp_driver = {
1031 .name = "aha1542",
1032 .id_table = aha1542_pnp_ids,
1033 .probe = aha1542_pnp_probe,
1034 .remove = aha1542_pnp_remove,
1035 };
1036 static int pnp_registered;
1037 #endif /* CONFIG_PNP */
1038
1039 static int __init aha1542_init(void)
1040 {
1041 int ret = 0;
1042
1043 #ifdef CONFIG_PNP
1044 if (isapnp) {
1045 ret = pnp_register_driver(&aha1542_pnp_driver);
1046 if (!ret)
1047 pnp_registered = 1;
1048 }
1049 #endif
1050 ret = isa_register_driver(&aha1542_isa_driver, MAXBOARDS);
1051 if (!ret)
1052 isa_registered = 1;
1053
1054 #ifdef CONFIG_PNP
1055 if (pnp_registered)
1056 ret = 0;
1057 #endif
1058 if (isa_registered)
1059 ret = 0;
1060
1061 return ret;
1062 }
1063
1064 static void __exit aha1542_exit(void)
1065 {
1066 #ifdef CONFIG_PNP
1067 if (pnp_registered)
1068 pnp_unregister_driver(&aha1542_pnp_driver);
1069 #endif
1070 if (isa_registered)
1071 isa_unregister_driver(&aha1542_isa_driver);
1072 }
1073
1074 module_init(aha1542_init);
1075 module_exit(aha1542_exit);