1
2
3
4
5
6
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
29static bool isapnp = 1;
30module_param(isapnp, bool, 0);
31MODULE_PARM_DESC(isapnp, "enable PnP support (default=1)");
32
33static int io[MAXBOARDS] = { 0x330, 0x334, 0, 0 };
34module_param_hw_array(io, int, ioport, NULL, 0);
35MODULE_PARM_DESC(io, "base IO address of controller (0x130,0x134,0x230,0x234,0x330,0x334, default=0x330,0x334)");
36
37
38static int bus_on[MAXBOARDS] = { -1, -1, -1, -1 };
39module_param_array(bus_on, int, NULL, 0);
40MODULE_PARM_DESC(bus_on, "bus on time [us] (2-15, default=-1 [HW default: 11])");
41
42
43static int bus_off[MAXBOARDS] = { -1, -1, -1, -1 };
44module_param_array(bus_off, int, NULL, 0);
45MODULE_PARM_DESC(bus_off, "bus off time [us] (1-64, default=-1 [HW default: 4])");
46
47
48static int dma_speed[MAXBOARDS] = { -1, -1, -1, -1 };
49module_param_array(dma_speed, int, NULL, 0);
50MODULE_PARM_DESC(dma_speed, "DMA speed [MB/s] (5,6,7,8,10, default=-1 [by jumper])");
51
52#define BIOS_TRANSLATION_6432 1
53#define BIOS_TRANSLATION_25563 2
54
55struct aha1542_hostdata {
56
57 int bios_translation;
58 int aha1542_last_mbi_used;
59 int aha1542_last_mbo_used;
60 struct scsi_cmnd *int_cmds[AHA1542_MAILBOXES];
61 struct mailbox *mb;
62 dma_addr_t mb_handle;
63 struct ccb *ccb;
64 dma_addr_t ccb_handle;
65};
66
67struct aha1542_cmd {
68 struct chain *chain;
69 dma_addr_t chain_handle;
70};
71
72static inline void aha1542_intr_reset(u16 base)
73{
74 outb(IRST, CONTROL(base));
75}
76
77static inline bool wait_mask(u16 port, u8 mask, u8 allof, u8 noneof, int timeout)
78{
79 bool delayed = true;
80
81 if (timeout == 0) {
82 timeout = 3000000;
83 delayed = false;
84 }
85
86 while (1) {
87 u8 bits = inb(port) & mask;
88 if ((bits & allof) == allof && ((bits & noneof) == 0))
89 break;
90 if (delayed)
91 mdelay(1);
92 if (--timeout == 0)
93 return false;
94 }
95
96 return true;
97}
98
99static int aha1542_outb(unsigned int base, u8 val)
100{
101 if (!wait_mask(STATUS(base), CDF, 0, CDF, 0))
102 return 1;
103 outb(val, DATA(base));
104
105 return 0;
106}
107
108static int aha1542_out(unsigned int base, u8 *buf, int len)
109{
110 while (len--) {
111 if (!wait_mask(STATUS(base), CDF, 0, CDF, 0))
112 return 1;
113 outb(*buf++, DATA(base));
114 }
115 if (!wait_mask(INTRFLAGS(base), INTRMASK, HACC, 0, 0))
116 return 1;
117
118 return 0;
119}
120
121
122
123
124static int aha1542_in(unsigned int base, u8 *buf, int len, int timeout)
125{
126 while (len--) {
127 if (!wait_mask(STATUS(base), DF, DF, 0, timeout))
128 return 1;
129 *buf++ = inb(DATA(base));
130 }
131 return 0;
132}
133
134static int makecode(unsigned hosterr, unsigned scsierr)
135{
136 switch (hosterr) {
137 case 0x0:
138 case 0xa:
139 case 0xb:
140 hosterr = 0;
141 break;
142
143 case 0x11:
144
145 hosterr = DID_TIME_OUT;
146 break;
147
148 case 0x12:
149
150
151
152 case 0x13:
153
154 case 0x15:
155
156
157 case 0x16:
158
159
160 case 0x17:
161
162
163 case 0x18:
164
165
166 case 0x19:
167
168
169
170 case 0x1a:
171
172
173#ifdef DEBUG
174 printk("Aha1542: %x %x\n", hosterr, scsierr);
175#endif
176 hosterr = DID_ERROR;
177 break;
178
179 case 0x14:
180
181
182
183 hosterr = DID_RESET;
184 break;
185 default:
186 printk(KERN_ERR "aha1542: makecode: unknown hoststatus %x\n", hosterr);
187 break;
188 }
189 return scsierr | (hosterr << 16);
190}
191
192static int aha1542_test_port(struct Scsi_Host *sh)
193{
194 u8 inquiry_result[4];
195 int i;
196
197
198 if (inb(STATUS(sh->io_port)) == 0xff)
199 return 0;
200
201
202
203
204 aha1542_intr_reset(sh->io_port);
205
206 outb(SRST | IRST , CONTROL(sh->io_port));
207
208 mdelay(20);
209
210
211 if (!wait_mask(STATUS(sh->io_port), STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0))
212 return 0;
213
214
215 if (inb(INTRFLAGS(sh->io_port)) & INTRMASK)
216 return 0;
217
218
219
220
221 aha1542_outb(sh->io_port, CMD_INQUIRY);
222
223 for (i = 0; i < 4; i++) {
224 if (!wait_mask(STATUS(sh->io_port), DF, DF, 0, 0))
225 return 0;
226 inquiry_result[i] = inb(DATA(sh->io_port));
227 }
228
229
230 if (inb(STATUS(sh->io_port)) & DF)
231 return 0;
232
233
234 if (!wait_mask(INTRFLAGS(sh->io_port), HACC, HACC, 0, 0))
235 return 0;
236
237
238 outb(IRST, CONTROL(sh->io_port));
239
240 return 1;
241}
242
243static void aha1542_free_cmd(struct scsi_cmnd *cmd)
244{
245 struct aha1542_cmd *acmd = scsi_cmd_priv(cmd);
246 struct device *dev = cmd->device->host->dma_dev;
247 size_t len = scsi_sg_count(cmd) * sizeof(struct chain);
248
249 if (acmd->chain) {
250 dma_unmap_single(dev, acmd->chain_handle, len, DMA_TO_DEVICE);
251 kfree(acmd->chain);
252 }
253
254 acmd->chain = NULL;
255 scsi_dma_unmap(cmd);
256}
257
258static irqreturn_t aha1542_interrupt(int irq, void *dev_id)
259{
260 struct Scsi_Host *sh = dev_id;
261 struct aha1542_hostdata *aha1542 = shost_priv(sh);
262 void (*my_done)(struct scsi_cmnd *) = NULL;
263 int errstatus, mbi, mbo, mbistatus;
264 int number_serviced;
265 unsigned long flags;
266 struct scsi_cmnd *tmp_cmd;
267 int flag;
268 struct mailbox *mb = aha1542->mb;
269 struct ccb *ccb = aha1542->ccb;
270
271#ifdef DEBUG
272 {
273 flag = inb(INTRFLAGS(sh->io_port));
274 shost_printk(KERN_DEBUG, sh, "aha1542_intr_handle: ");
275 if (!(flag & ANYINTR))
276 printk("no interrupt?");
277 if (flag & MBIF)
278 printk("MBIF ");
279 if (flag & MBOA)
280 printk("MBOF ");
281 if (flag & HACC)
282 printk("HACC ");
283 if (flag & SCRD)
284 printk("SCRD ");
285 printk("status %02x\n", inb(STATUS(sh->io_port)));
286 };
287#endif
288 number_serviced = 0;
289
290 spin_lock_irqsave(sh->host_lock, flags);
291 while (1) {
292 flag = inb(INTRFLAGS(sh->io_port));
293
294
295
296
297
298 if (flag & ~MBIF) {
299 if (flag & MBOA)
300 printk("MBOF ");
301 if (flag & HACC)
302 printk("HACC ");
303 if (flag & SCRD)
304 printk("SCRD ");
305 }
306 aha1542_intr_reset(sh->io_port);
307
308 mbi = aha1542->aha1542_last_mbi_used + 1;
309 if (mbi >= 2 * AHA1542_MAILBOXES)
310 mbi = AHA1542_MAILBOXES;
311
312 do {
313 if (mb[mbi].status != 0)
314 break;
315 mbi++;
316 if (mbi >= 2 * AHA1542_MAILBOXES)
317 mbi = AHA1542_MAILBOXES;
318 } while (mbi != aha1542->aha1542_last_mbi_used);
319
320 if (mb[mbi].status == 0) {
321 spin_unlock_irqrestore(sh->host_lock, flags);
322
323 if (!number_serviced)
324 shost_printk(KERN_WARNING, sh, "interrupt received, but no mail.\n");
325 return IRQ_HANDLED;
326 };
327
328 mbo = (scsi2int(mb[mbi].ccbptr) - (unsigned long)aha1542->ccb_handle) / sizeof(struct ccb);
329 mbistatus = mb[mbi].status;
330 mb[mbi].status = 0;
331 aha1542->aha1542_last_mbi_used = mbi;
332
333#ifdef DEBUG
334 if (ccb[mbo].tarstat | ccb[mbo].hastat)
335 shost_printk(KERN_DEBUG, sh, "aha1542_command: returning %x (status %d)\n",
336 ccb[mbo].tarstat + ((int) ccb[mbo].hastat << 16), mb[mbi].status);
337#endif
338
339 if (mbistatus == 3)
340 continue;
341
342#ifdef DEBUG
343 shost_printk(KERN_DEBUG, sh, "...done %d %d\n", mbo, mbi);
344#endif
345
346 tmp_cmd = aha1542->int_cmds[mbo];
347
348 if (!tmp_cmd || !tmp_cmd->scsi_done) {
349 spin_unlock_irqrestore(sh->host_lock, flags);
350 shost_printk(KERN_WARNING, sh, "Unexpected interrupt\n");
351 shost_printk(KERN_WARNING, sh, "tarstat=%x, hastat=%x idlun=%x ccb#=%d\n", ccb[mbo].tarstat,
352 ccb[mbo].hastat, ccb[mbo].idlun, mbo);
353 return IRQ_HANDLED;
354 }
355 my_done = tmp_cmd->scsi_done;
356 aha1542_free_cmd(tmp_cmd);
357
358
359
360 if (ccb[mbo].tarstat == 2)
361 memcpy(tmp_cmd->sense_buffer, &ccb[mbo].cdb[ccb[mbo].cdblen],
362 SCSI_SENSE_BUFFERSIZE);
363
364
365
366
367
368 if (mbistatus != 1)
369
370 errstatus = makecode(ccb[mbo].hastat, ccb[mbo].tarstat);
371 else
372 errstatus = 0;
373
374#ifdef DEBUG
375 if (errstatus)
376 shost_printk(KERN_DEBUG, sh, "(aha1542 error:%x %x %x) ", errstatus,
377 ccb[mbo].hastat, ccb[mbo].tarstat);
378 if (ccb[mbo].tarstat == 2)
379 print_hex_dump_bytes("sense: ", DUMP_PREFIX_NONE, &ccb[mbo].cdb[ccb[mbo].cdblen], 12);
380 if (errstatus)
381 printk("aha1542_intr_handle: returning %6x\n", errstatus);
382#endif
383 tmp_cmd->result = errstatus;
384 aha1542->int_cmds[mbo] = NULL;
385
386 my_done(tmp_cmd);
387 number_serviced++;
388 };
389}
390
391static int aha1542_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *cmd)
392{
393 struct aha1542_cmd *acmd = scsi_cmd_priv(cmd);
394 struct aha1542_hostdata *aha1542 = shost_priv(sh);
395 u8 direction;
396 u8 target = cmd->device->id;
397 u8 lun = cmd->device->lun;
398 unsigned long flags;
399 int bufflen = scsi_bufflen(cmd);
400 int mbo, sg_count;
401 struct mailbox *mb = aha1542->mb;
402 struct ccb *ccb = aha1542->ccb;
403
404 if (*cmd->cmnd == REQUEST_SENSE) {
405
406 cmd->result = 0;
407 cmd->scsi_done(cmd);
408 return 0;
409 }
410#ifdef DEBUG
411 {
412 int i = -1;
413 if (*cmd->cmnd == READ_10 || *cmd->cmnd == WRITE_10)
414 i = xscsi2int(cmd->cmnd + 2);
415 else if (*cmd->cmnd == READ_6 || *cmd->cmnd == WRITE_6)
416 i = scsi2int(cmd->cmnd + 2);
417 shost_printk(KERN_DEBUG, sh, "aha1542_queuecommand: dev %d cmd %02x pos %d len %d",
418 target, *cmd->cmnd, i, bufflen);
419 print_hex_dump_bytes("command: ", DUMP_PREFIX_NONE, cmd->cmnd, cmd->cmd_len);
420 }
421#endif
422 sg_count = scsi_dma_map(cmd);
423 if (sg_count) {
424 size_t len = sg_count * sizeof(struct chain);
425
426 acmd->chain = kmalloc(len, GFP_DMA);
427 if (!acmd->chain)
428 goto out_unmap;
429 acmd->chain_handle = dma_map_single(sh->dma_dev, acmd->chain,
430 len, DMA_TO_DEVICE);
431 if (dma_mapping_error(sh->dma_dev, acmd->chain_handle))
432 goto out_free_chain;
433 }
434
435
436
437
438 spin_lock_irqsave(sh->host_lock, flags);
439 mbo = aha1542->aha1542_last_mbo_used + 1;
440 if (mbo >= AHA1542_MAILBOXES)
441 mbo = 0;
442
443 do {
444 if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL)
445 break;
446 mbo++;
447 if (mbo >= AHA1542_MAILBOXES)
448 mbo = 0;
449 } while (mbo != aha1542->aha1542_last_mbo_used);
450
451 if (mb[mbo].status || aha1542->int_cmds[mbo])
452 panic("Unable to find empty mailbox for aha1542.\n");
453
454 aha1542->int_cmds[mbo] = cmd;
455
456
457 aha1542->aha1542_last_mbo_used = mbo;
458
459#ifdef DEBUG
460 shost_printk(KERN_DEBUG, sh, "Sending command (%d %p)...", mbo, cmd->scsi_done);
461#endif
462
463
464 any2scsi(mb[mbo].ccbptr, aha1542->ccb_handle + mbo * sizeof(*ccb));
465
466 memset(&ccb[mbo], 0, sizeof(struct ccb));
467
468 ccb[mbo].cdblen = cmd->cmd_len;
469
470 direction = 0;
471 if (*cmd->cmnd == READ_10 || *cmd->cmnd == READ_6)
472 direction = 8;
473 else if (*cmd->cmnd == WRITE_10 || *cmd->cmnd == WRITE_6)
474 direction = 16;
475
476 memcpy(ccb[mbo].cdb, cmd->cmnd, ccb[mbo].cdblen);
477
478 if (bufflen) {
479 struct scatterlist *sg;
480 int i;
481
482 ccb[mbo].op = 2;
483 scsi_for_each_sg(cmd, sg, sg_count, i) {
484 any2scsi(acmd->chain[i].dataptr, sg_dma_address(sg));
485 any2scsi(acmd->chain[i].datalen, sg_dma_len(sg));
486 };
487 any2scsi(ccb[mbo].datalen, sg_count * sizeof(struct chain));
488 any2scsi(ccb[mbo].dataptr, acmd->chain_handle);
489#ifdef DEBUG
490 shost_printk(KERN_DEBUG, sh, "cptr %p: ", acmd->chain);
491 print_hex_dump_bytes("cptr: ", DUMP_PREFIX_NONE, acmd->chain, 18);
492#endif
493 } else {
494 ccb[mbo].op = 0;
495 any2scsi(ccb[mbo].datalen, 0);
496 any2scsi(ccb[mbo].dataptr, 0);
497 };
498 ccb[mbo].idlun = (target & 7) << 5 | direction | (lun & 7);
499 ccb[mbo].rsalen = 16;
500 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
501 ccb[mbo].commlinkid = 0;
502
503#ifdef DEBUG
504 print_hex_dump_bytes("sending: ", DUMP_PREFIX_NONE, &ccb[mbo], sizeof(ccb[mbo]) - 10);
505 printk("aha1542_queuecommand: now waiting for interrupt ");
506#endif
507 mb[mbo].status = 1;
508 aha1542_outb(cmd->device->host->io_port, CMD_START_SCSI);
509 spin_unlock_irqrestore(sh->host_lock, flags);
510
511 return 0;
512out_free_chain:
513 kfree(acmd->chain);
514 acmd->chain = NULL;
515out_unmap:
516 scsi_dma_unmap(cmd);
517 return SCSI_MLQUEUE_HOST_BUSY;
518}
519
520
521static void setup_mailboxes(struct Scsi_Host *sh)
522{
523 struct aha1542_hostdata *aha1542 = shost_priv(sh);
524 u8 mb_cmd[5] = { CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0};
525 int i;
526
527 for (i = 0; i < AHA1542_MAILBOXES; i++) {
528 aha1542->mb[i].status = 0;
529 any2scsi(aha1542->mb[i].ccbptr,
530 aha1542->ccb_handle + i * sizeof(struct ccb));
531 aha1542->mb[AHA1542_MAILBOXES + i].status = 0;
532 };
533 aha1542_intr_reset(sh->io_port);
534 any2scsi(mb_cmd + 2, aha1542->mb_handle);
535 if (aha1542_out(sh->io_port, mb_cmd, 5))
536 shost_printk(KERN_ERR, sh, "failed setting up mailboxes\n");
537 aha1542_intr_reset(sh->io_port);
538}
539
540static int aha1542_getconfig(struct Scsi_Host *sh)
541{
542 u8 inquiry_result[3];
543 int i;
544 i = inb(STATUS(sh->io_port));
545 if (i & DF) {
546 i = inb(DATA(sh->io_port));
547 };
548 aha1542_outb(sh->io_port, CMD_RETCONF);
549 aha1542_in(sh->io_port, inquiry_result, 3, 0);
550 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0))
551 shost_printk(KERN_ERR, sh, "error querying board settings\n");
552 aha1542_intr_reset(sh->io_port);
553 switch (inquiry_result[0]) {
554 case 0x80:
555 sh->dma_channel = 7;
556 break;
557 case 0x40:
558 sh->dma_channel = 6;
559 break;
560 case 0x20:
561 sh->dma_channel = 5;
562 break;
563 case 0x01:
564 sh->dma_channel = 0;
565 break;
566 case 0:
567
568
569 sh->dma_channel = 0xFF;
570 break;
571 default:
572 shost_printk(KERN_ERR, sh, "Unable to determine DMA channel.\n");
573 return -1;
574 };
575 switch (inquiry_result[1]) {
576 case 0x40:
577 sh->irq = 15;
578 break;
579 case 0x20:
580 sh->irq = 14;
581 break;
582 case 0x8:
583 sh->irq = 12;
584 break;
585 case 0x4:
586 sh->irq = 11;
587 break;
588 case 0x2:
589 sh->irq = 10;
590 break;
591 case 0x1:
592 sh->irq = 9;
593 break;
594 default:
595 shost_printk(KERN_ERR, sh, "Unable to determine IRQ level.\n");
596 return -1;
597 };
598 sh->this_id = inquiry_result[2] & 7;
599 return 0;
600}
601
602
603
604
605static int aha1542_mbenable(struct Scsi_Host *sh)
606{
607 static u8 mbenable_cmd[3];
608 static u8 mbenable_result[2];
609 int retval;
610
611 retval = BIOS_TRANSLATION_6432;
612
613 aha1542_outb(sh->io_port, CMD_EXTBIOS);
614 if (aha1542_in(sh->io_port, mbenable_result, 2, 100))
615 return retval;
616 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 100))
617 goto fail;
618 aha1542_intr_reset(sh->io_port);
619
620 if ((mbenable_result[0] & 0x08) || mbenable_result[1]) {
621 mbenable_cmd[0] = CMD_MBENABLE;
622 mbenable_cmd[1] = 0;
623 mbenable_cmd[2] = mbenable_result[1];
624
625 if ((mbenable_result[0] & 0x08) && (mbenable_result[1] & 0x03))
626 retval = BIOS_TRANSLATION_25563;
627
628 if (aha1542_out(sh->io_port, mbenable_cmd, 3))
629 goto fail;
630 };
631 while (0) {
632fail:
633 shost_printk(KERN_ERR, sh, "Mailbox init failed\n");
634 }
635 aha1542_intr_reset(sh->io_port);
636 return retval;
637}
638
639
640static int aha1542_query(struct Scsi_Host *sh)
641{
642 struct aha1542_hostdata *aha1542 = shost_priv(sh);
643 u8 inquiry_result[4];
644 int i;
645 i = inb(STATUS(sh->io_port));
646 if (i & DF) {
647 i = inb(DATA(sh->io_port));
648 };
649 aha1542_outb(sh->io_port, CMD_INQUIRY);
650 aha1542_in(sh->io_port, inquiry_result, 4, 0);
651 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0))
652 shost_printk(KERN_ERR, sh, "error querying card type\n");
653 aha1542_intr_reset(sh->io_port);
654
655 aha1542->bios_translation = BIOS_TRANSLATION_6432;
656
657
658
659
660
661
662
663 if (inquiry_result[0] == 0x43) {
664 shost_printk(KERN_INFO, sh, "Emulation mode not supported for AHA-1740 hardware, use aha1740 driver instead.\n");
665 return 1;
666 };
667
668
669
670
671 aha1542->bios_translation = aha1542_mbenable(sh);
672
673 return 0;
674}
675
676static u8 dma_speed_hw(int dma_speed)
677{
678 switch (dma_speed) {
679 case 5:
680 return 0x00;
681 case 6:
682 return 0x04;
683 case 7:
684 return 0x01;
685 case 8:
686 return 0x02;
687 case 10:
688 return 0x03;
689 }
690
691 return 0xff;
692}
693
694
695static void aha1542_set_bus_times(struct Scsi_Host *sh, int bus_on, int bus_off, int dma_speed)
696{
697 if (bus_on > 0) {
698 u8 oncmd[] = { CMD_BUSON_TIME, clamp(bus_on, 2, 15) };
699
700 aha1542_intr_reset(sh->io_port);
701 if (aha1542_out(sh->io_port, oncmd, 2))
702 goto fail;
703 }
704
705 if (bus_off > 0) {
706 u8 offcmd[] = { CMD_BUSOFF_TIME, clamp(bus_off, 1, 64) };
707
708 aha1542_intr_reset(sh->io_port);
709 if (aha1542_out(sh->io_port, offcmd, 2))
710 goto fail;
711 }
712
713 if (dma_speed_hw(dma_speed) != 0xff) {
714 u8 dmacmd[] = { CMD_DMASPEED, dma_speed_hw(dma_speed) };
715
716 aha1542_intr_reset(sh->io_port);
717 if (aha1542_out(sh->io_port, dmacmd, 2))
718 goto fail;
719 }
720 aha1542_intr_reset(sh->io_port);
721 return;
722fail:
723 shost_printk(KERN_ERR, sh, "setting bus on/off-time failed\n");
724 aha1542_intr_reset(sh->io_port);
725}
726
727
728static struct Scsi_Host *aha1542_hw_init(struct scsi_host_template *tpnt, struct device *pdev, int indx)
729{
730 unsigned int base_io = io[indx];
731 struct Scsi_Host *sh;
732 struct aha1542_hostdata *aha1542;
733 char dma_info[] = "no DMA";
734
735 if (base_io == 0)
736 return NULL;
737
738 if (!request_region(base_io, AHA1542_REGION_SIZE, "aha1542"))
739 return NULL;
740
741 sh = scsi_host_alloc(tpnt, sizeof(struct aha1542_hostdata));
742 if (!sh)
743 goto release;
744 aha1542 = shost_priv(sh);
745
746 sh->unique_id = base_io;
747 sh->io_port = base_io;
748 sh->n_io_port = AHA1542_REGION_SIZE;
749 aha1542->aha1542_last_mbi_used = 2 * AHA1542_MAILBOXES - 1;
750 aha1542->aha1542_last_mbo_used = AHA1542_MAILBOXES - 1;
751
752 if (!aha1542_test_port(sh))
753 goto unregister;
754
755 aha1542_set_bus_times(sh, bus_on[indx], bus_off[indx], dma_speed[indx]);
756 if (aha1542_query(sh))
757 goto unregister;
758 if (aha1542_getconfig(sh) == -1)
759 goto unregister;
760
761 if (sh->dma_channel != 0xFF)
762 snprintf(dma_info, sizeof(dma_info), "DMA %d", sh->dma_channel);
763 shost_printk(KERN_INFO, sh, "Adaptec AHA-1542 (SCSI-ID %d) at IO 0x%x, IRQ %d, %s\n",
764 sh->this_id, base_io, sh->irq, dma_info);
765 if (aha1542->bios_translation == BIOS_TRANSLATION_25563)
766 shost_printk(KERN_INFO, sh, "Using extended bios translation\n");
767
768 if (dma_set_mask_and_coherent(pdev, DMA_BIT_MASK(24)) < 0)
769 goto unregister;
770
771 aha1542->mb = dma_alloc_coherent(pdev,
772 AHA1542_MAILBOXES * 2 * sizeof(struct mailbox),
773 &aha1542->mb_handle, GFP_KERNEL);
774 if (!aha1542->mb)
775 goto unregister;
776
777 aha1542->ccb = dma_alloc_coherent(pdev,
778 AHA1542_MAILBOXES * sizeof(struct ccb),
779 &aha1542->ccb_handle, GFP_KERNEL);
780 if (!aha1542->ccb)
781 goto free_mb;
782
783 setup_mailboxes(sh);
784
785 if (request_irq(sh->irq, aha1542_interrupt, 0, "aha1542", sh)) {
786 shost_printk(KERN_ERR, sh, "Unable to allocate IRQ.\n");
787 goto free_ccb;
788 }
789 if (sh->dma_channel != 0xFF) {
790 if (request_dma(sh->dma_channel, "aha1542")) {
791 shost_printk(KERN_ERR, sh, "Unable to allocate DMA channel.\n");
792 goto free_irq;
793 }
794 if (sh->dma_channel == 0 || sh->dma_channel >= 5) {
795 set_dma_mode(sh->dma_channel, DMA_MODE_CASCADE);
796 enable_dma(sh->dma_channel);
797 }
798 }
799
800 if (scsi_add_host(sh, pdev))
801 goto free_dma;
802
803 scsi_scan_host(sh);
804
805 return sh;
806
807free_dma:
808 if (sh->dma_channel != 0xff)
809 free_dma(sh->dma_channel);
810free_irq:
811 free_irq(sh->irq, sh);
812free_ccb:
813 dma_free_coherent(pdev, AHA1542_MAILBOXES * sizeof(struct ccb),
814 aha1542->ccb, aha1542->ccb_handle);
815free_mb:
816 dma_free_coherent(pdev, AHA1542_MAILBOXES * 2 * sizeof(struct mailbox),
817 aha1542->mb, aha1542->mb_handle);
818unregister:
819 scsi_host_put(sh);
820release:
821 release_region(base_io, AHA1542_REGION_SIZE);
822
823 return NULL;
824}
825
826static int aha1542_release(struct Scsi_Host *sh)
827{
828 struct aha1542_hostdata *aha1542 = shost_priv(sh);
829 struct device *dev = sh->dma_dev;
830
831 scsi_remove_host(sh);
832 if (sh->dma_channel != 0xff)
833 free_dma(sh->dma_channel);
834 dma_free_coherent(dev, AHA1542_MAILBOXES * sizeof(struct ccb),
835 aha1542->ccb, aha1542->ccb_handle);
836 dma_free_coherent(dev, AHA1542_MAILBOXES * 2 * sizeof(struct mailbox),
837 aha1542->mb, aha1542->mb_handle);
838 if (sh->irq)
839 free_irq(sh->irq, sh);
840 if (sh->io_port && sh->n_io_port)
841 release_region(sh->io_port, sh->n_io_port);
842 scsi_host_put(sh);
843 return 0;
844}
845
846
847
848
849
850
851static int aha1542_dev_reset(struct scsi_cmnd *cmd)
852{
853 struct Scsi_Host *sh = cmd->device->host;
854 struct aha1542_hostdata *aha1542 = shost_priv(sh);
855 unsigned long flags;
856 struct mailbox *mb = aha1542->mb;
857 u8 target = cmd->device->id;
858 u8 lun = cmd->device->lun;
859 int mbo;
860 struct ccb *ccb = aha1542->ccb;
861
862 spin_lock_irqsave(sh->host_lock, flags);
863 mbo = aha1542->aha1542_last_mbo_used + 1;
864 if (mbo >= AHA1542_MAILBOXES)
865 mbo = 0;
866
867 do {
868 if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL)
869 break;
870 mbo++;
871 if (mbo >= AHA1542_MAILBOXES)
872 mbo = 0;
873 } while (mbo != aha1542->aha1542_last_mbo_used);
874
875 if (mb[mbo].status || aha1542->int_cmds[mbo])
876 panic("Unable to find empty mailbox for aha1542.\n");
877
878 aha1542->int_cmds[mbo] = cmd;
879
880
881
882 aha1542->aha1542_last_mbo_used = mbo;
883
884
885 any2scsi(mb[mbo].ccbptr, aha1542->ccb_handle + mbo * sizeof(*ccb));
886
887 memset(&ccb[mbo], 0, sizeof(struct ccb));
888
889 ccb[mbo].op = 0x81;
890
891 ccb[mbo].idlun = (target & 7) << 5 | (lun & 7);
892
893 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
894 ccb[mbo].commlinkid = 0;
895
896
897
898
899
900 aha1542_outb(sh->io_port, CMD_START_SCSI);
901 spin_unlock_irqrestore(sh->host_lock, flags);
902
903 scmd_printk(KERN_WARNING, cmd,
904 "Trying device reset for target\n");
905
906 return SUCCESS;
907}
908
909static int aha1542_reset(struct scsi_cmnd *cmd, u8 reset_cmd)
910{
911 struct Scsi_Host *sh = cmd->device->host;
912 struct aha1542_hostdata *aha1542 = shost_priv(sh);
913 unsigned long flags;
914 int i;
915
916 spin_lock_irqsave(sh->host_lock, flags);
917
918
919
920
921
922
923 outb(reset_cmd, CONTROL(cmd->device->host->io_port));
924
925 if (!wait_mask(STATUS(cmd->device->host->io_port),
926 STATMASK, IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0)) {
927 spin_unlock_irqrestore(sh->host_lock, flags);
928 return FAILED;
929 }
930
931
932
933
934
935 if (reset_cmd & HRST)
936 setup_mailboxes(cmd->device->host);
937
938
939
940
941
942
943
944 shost_printk(KERN_WARNING, cmd->device->host, "Sent BUS RESET to scsi host %d\n", cmd->device->host->host_no);
945
946 for (i = 0; i < AHA1542_MAILBOXES; i++) {
947 if (aha1542->int_cmds[i] != NULL) {
948 struct scsi_cmnd *tmp_cmd;
949 tmp_cmd = aha1542->int_cmds[i];
950
951 if (tmp_cmd->device->soft_reset) {
952
953
954
955
956
957
958 continue;
959 }
960 aha1542_free_cmd(tmp_cmd);
961 aha1542->int_cmds[i] = NULL;
962 aha1542->mb[i].status = 0;
963 }
964 }
965
966 spin_unlock_irqrestore(sh->host_lock, flags);
967 return SUCCESS;
968}
969
970static int aha1542_bus_reset(struct scsi_cmnd *cmd)
971{
972 return aha1542_reset(cmd, SCRST);
973}
974
975static int aha1542_host_reset(struct scsi_cmnd *cmd)
976{
977 return aha1542_reset(cmd, HRST | SCRST);
978}
979
980static int aha1542_biosparam(struct scsi_device *sdev,
981 struct block_device *bdev, sector_t capacity, int geom[])
982{
983 struct aha1542_hostdata *aha1542 = shost_priv(sdev->host);
984
985 if (capacity >= 0x200000 &&
986 aha1542->bios_translation == BIOS_TRANSLATION_25563) {
987
988 geom[0] = 255;
989 geom[1] = 63;
990 } else {
991 geom[0] = 64;
992 geom[1] = 32;
993 }
994 geom[2] = sector_div(capacity, geom[0] * geom[1]);
995
996 return 0;
997}
998MODULE_LICENSE("GPL");
999
1000static struct scsi_host_template driver_template = {
1001 .module = THIS_MODULE,
1002 .proc_name = "aha1542",
1003 .name = "Adaptec 1542",
1004 .cmd_size = sizeof(struct aha1542_cmd),
1005 .queuecommand = aha1542_queuecommand,
1006 .eh_device_reset_handler= aha1542_dev_reset,
1007 .eh_bus_reset_handler = aha1542_bus_reset,
1008 .eh_host_reset_handler = aha1542_host_reset,
1009 .bios_param = aha1542_biosparam,
1010 .can_queue = AHA1542_MAILBOXES,
1011 .this_id = 7,
1012 .sg_tablesize = 16,
1013 .unchecked_isa_dma = 1,
1014};
1015
1016static int aha1542_isa_match(struct device *pdev, unsigned int ndev)
1017{
1018 struct Scsi_Host *sh = aha1542_hw_init(&driver_template, pdev, ndev);
1019
1020 if (!sh)
1021 return 0;
1022
1023 dev_set_drvdata(pdev, sh);
1024 return 1;
1025}
1026
1027static int aha1542_isa_remove(struct device *pdev,
1028 unsigned int ndev)
1029{
1030 aha1542_release(dev_get_drvdata(pdev));
1031 dev_set_drvdata(pdev, NULL);
1032 return 0;
1033}
1034
1035static struct isa_driver aha1542_isa_driver = {
1036 .match = aha1542_isa_match,
1037 .remove = aha1542_isa_remove,
1038 .driver = {
1039 .name = "aha1542"
1040 },
1041};
1042static int isa_registered;
1043
1044#ifdef CONFIG_PNP
1045static const struct pnp_device_id aha1542_pnp_ids[] = {
1046 { .id = "ADP1542" },
1047 { .id = "" }
1048};
1049MODULE_DEVICE_TABLE(pnp, aha1542_pnp_ids);
1050
1051static int aha1542_pnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *id)
1052{
1053 int indx;
1054 struct Scsi_Host *sh;
1055
1056 for (indx = 0; indx < ARRAY_SIZE(io); indx++) {
1057 if (io[indx])
1058 continue;
1059
1060 if (pnp_activate_dev(pdev) < 0)
1061 continue;
1062
1063 io[indx] = pnp_port_start(pdev, 0);
1064
1065
1066
1067
1068 dev_info(&pdev->dev, "ISAPnP found an AHA1535 at I/O 0x%03X", io[indx]);
1069 }
1070
1071 sh = aha1542_hw_init(&driver_template, &pdev->dev, indx);
1072 if (!sh)
1073 return -ENODEV;
1074
1075 pnp_set_drvdata(pdev, sh);
1076 return 0;
1077}
1078
1079static void aha1542_pnp_remove(struct pnp_dev *pdev)
1080{
1081 aha1542_release(pnp_get_drvdata(pdev));
1082 pnp_set_drvdata(pdev, NULL);
1083}
1084
1085static struct pnp_driver aha1542_pnp_driver = {
1086 .name = "aha1542",
1087 .id_table = aha1542_pnp_ids,
1088 .probe = aha1542_pnp_probe,
1089 .remove = aha1542_pnp_remove,
1090};
1091static int pnp_registered;
1092#endif
1093
1094static int __init aha1542_init(void)
1095{
1096 int ret = 0;
1097
1098#ifdef CONFIG_PNP
1099 if (isapnp) {
1100 ret = pnp_register_driver(&aha1542_pnp_driver);
1101 if (!ret)
1102 pnp_registered = 1;
1103 }
1104#endif
1105 ret = isa_register_driver(&aha1542_isa_driver, MAXBOARDS);
1106 if (!ret)
1107 isa_registered = 1;
1108
1109#ifdef CONFIG_PNP
1110 if (pnp_registered)
1111 ret = 0;
1112#endif
1113 if (isa_registered)
1114 ret = 0;
1115
1116 return ret;
1117}
1118
1119static void __exit aha1542_exit(void)
1120{
1121#ifdef CONFIG_PNP
1122 if (pnp_registered)
1123 pnp_unregister_driver(&aha1542_pnp_driver);
1124#endif
1125 if (isa_registered)
1126 isa_unregister_driver(&aha1542_isa_driver);
1127}
1128
1129module_init(aha1542_init);
1130module_exit(aha1542_exit);
1131