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