1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include <linux/module.h>
29#include <linux/interrupt.h>
30#include <linux/kernel.h>
31#include <linux/types.h>
32#include <linux/string.h>
33#include <linux/ioport.h>
34#include <linux/delay.h>
35#include <linux/proc_fs.h>
36#include <linux/init.h>
37#include <linux/spinlock.h>
38#include <linux/isapnp.h>
39#include <linux/blkdev.h>
40#include <linux/mca.h>
41#include <linux/mca-legacy.h>
42#include <linux/slab.h>
43
44#include <asm/dma.h>
45#include <asm/system.h>
46#include <asm/io.h>
47
48#include "scsi.h"
49#include <scsi/scsi_host.h>
50#include "aha1542.h"
51
52#define SCSI_BUF_PA(address) isa_virt_to_bus(address)
53#define SCSI_SG_PA(sgent) (isa_page_to_bus(sg_page((sgent))) + (sgent)->offset)
54
55#include<linux/stat.h>
56
57#ifdef DEBUG
58#define DEB(x) x
59#else
60#define DEB(x)
61#endif
62
63
64
65
66
67
68
69
70
71
72#define MAXBOARDS 4
73
74
75
76
77static unsigned int bases[MAXBOARDS] __initdata = {0x330, 0x334, 0, 0};
78
79
80
81
82static int setup_called[MAXBOARDS];
83static int setup_buson[MAXBOARDS];
84static int setup_busoff[MAXBOARDS];
85static int setup_dmaspeed[MAXBOARDS] __initdata = { -1, -1, -1, -1 };
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104#if defined(MODULE)
105static bool isapnp = 0;
106static int aha1542[] = {0x330, 11, 4, -1};
107module_param_array(aha1542, int, NULL, 0);
108module_param(isapnp, bool, 0);
109
110static struct isapnp_device_id id_table[] __initdata = {
111 {
112 ISAPNP_ANY_ID, ISAPNP_ANY_ID,
113 ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1542),
114 0
115 },
116 {0}
117};
118
119MODULE_DEVICE_TABLE(isapnp, id_table);
120
121#else
122static int isapnp = 1;
123#endif
124
125#define BIOS_TRANSLATION_1632 0
126#define BIOS_TRANSLATION_6432 1
127#define BIOS_TRANSLATION_25563 2
128
129struct aha1542_hostdata {
130
131 int bios_translation;
132 int aha1542_last_mbi_used;
133 int aha1542_last_mbo_used;
134 Scsi_Cmnd *SCint[AHA1542_MAILBOXES];
135 struct mailbox mb[2 * AHA1542_MAILBOXES];
136 struct ccb ccb[AHA1542_MAILBOXES];
137};
138
139#define HOSTDATA(host) ((struct aha1542_hostdata *) &host->hostdata)
140
141static DEFINE_SPINLOCK(aha1542_lock);
142
143
144
145#define WAITnexttimeout 3000000
146
147static void setup_mailboxes(int base_io, struct Scsi_Host *shpnt);
148static int aha1542_restart(struct Scsi_Host *shost);
149static void aha1542_intr_handle(struct Scsi_Host *shost);
150
151#define aha1542_intr_reset(base) outb(IRST, CONTROL(base))
152
153#define WAIT(port, mask, allof, noneof) \
154 { register int WAITbits; \
155 register int WAITtimeout = WAITnexttimeout; \
156 while (1) { \
157 WAITbits = inb(port) & (mask); \
158 if ((WAITbits & (allof)) == (allof) && ((WAITbits & (noneof)) == 0)) \
159 break; \
160 if (--WAITtimeout == 0) goto fail; \
161 } \
162 }
163
164
165
166#define WAITd(port, mask, allof, noneof, timeout) \
167 { register int WAITbits; \
168 register int WAITtimeout = timeout; \
169 while (1) { \
170 WAITbits = inb(port) & (mask); \
171 if ((WAITbits & (allof)) == (allof) && ((WAITbits & (noneof)) == 0)) \
172 break; \
173 mdelay(1); \
174 if (--WAITtimeout == 0) goto fail; \
175 } \
176 }
177
178static void aha1542_stat(void)
179{
180
181
182}
183
184
185
186
187
188static int aha1542_out(unsigned int base, unchar * cmdp, int len)
189{
190 unsigned long flags = 0;
191 int got_lock;
192
193 if (len == 1) {
194 got_lock = 0;
195 while (1 == 1) {
196 WAIT(STATUS(base), CDF, 0, CDF);
197 spin_lock_irqsave(&aha1542_lock, flags);
198 if (inb(STATUS(base)) & CDF) {
199 spin_unlock_irqrestore(&aha1542_lock, flags);
200 continue;
201 }
202 outb(*cmdp, DATA(base));
203 spin_unlock_irqrestore(&aha1542_lock, flags);
204 return 0;
205 }
206 } else {
207 spin_lock_irqsave(&aha1542_lock, flags);
208 got_lock = 1;
209 while (len--) {
210 WAIT(STATUS(base), CDF, 0, CDF);
211 outb(*cmdp++, DATA(base));
212 }
213 spin_unlock_irqrestore(&aha1542_lock, flags);
214 }
215 return 0;
216fail:
217 if (got_lock)
218 spin_unlock_irqrestore(&aha1542_lock, flags);
219 printk(KERN_ERR "aha1542_out failed(%d): ", len + 1);
220 aha1542_stat();
221 return 1;
222}
223
224
225
226
227static int __init aha1542_in(unsigned int base, unchar * cmdp, int len)
228{
229 unsigned long flags;
230
231 spin_lock_irqsave(&aha1542_lock, flags);
232 while (len--) {
233 WAIT(STATUS(base), DF, DF, 0);
234 *cmdp++ = inb(DATA(base));
235 }
236 spin_unlock_irqrestore(&aha1542_lock, flags);
237 return 0;
238fail:
239 spin_unlock_irqrestore(&aha1542_lock, flags);
240 printk(KERN_ERR "aha1542_in failed(%d): ", len + 1);
241 aha1542_stat();
242 return 1;
243}
244
245
246
247
248static int __init aha1542_in1(unsigned int base, unchar * cmdp, int len)
249{
250 unsigned long flags;
251
252 spin_lock_irqsave(&aha1542_lock, flags);
253 while (len--) {
254 WAITd(STATUS(base), DF, DF, 0, 100);
255 *cmdp++ = inb(DATA(base));
256 }
257 spin_unlock_irqrestore(&aha1542_lock, flags);
258 return 0;
259fail:
260 spin_unlock_irqrestore(&aha1542_lock, flags);
261 return 1;
262}
263
264static int makecode(unsigned hosterr, unsigned scsierr)
265{
266 switch (hosterr) {
267 case 0x0:
268 case 0xa:
269 case 0xb:
270 hosterr = 0;
271 break;
272
273 case 0x11:
274
275 hosterr = DID_TIME_OUT;
276 break;
277
278 case 0x12:
279
280
281
282 case 0x13:
283
284 case 0x15:
285
286
287 case 0x16:
288
289
290 case 0x17:
291
292
293 case 0x18:
294
295
296 case 0x19:
297
298
299
300 case 0x1a:
301
302
303 DEB(printk("Aha1542: %x %x\n", hosterr, scsierr));
304 hosterr = DID_ERROR;
305 break;
306
307 case 0x14:
308
309
310
311 hosterr = DID_RESET;
312 break;
313 default:
314 printk(KERN_ERR "aha1542: makecode: unknown hoststatus %x\n", hosterr);
315 break;
316 }
317 return scsierr | (hosterr << 16);
318}
319
320static int __init aha1542_test_port(int bse, struct Scsi_Host *shpnt)
321{
322 unchar inquiry_cmd[] = {CMD_INQUIRY};
323 unchar inquiry_result[4];
324 unchar *cmdp;
325 int len;
326 volatile int debug = 0;
327
328
329 if (inb(STATUS(bse)) == 0xff)
330 return 0;
331
332
333
334
335
336
337 aha1542_intr_reset(bse);
338
339 outb(SRST | IRST , CONTROL(bse));
340
341 mdelay(20);
342
343 debug = 1;
344
345 WAIT(STATUS(bse), STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
346
347 debug = 2;
348
349 if (inb(INTRFLAGS(bse)) & INTRMASK)
350 goto fail;
351
352
353
354
355
356 aha1542_out(bse, inquiry_cmd, 1);
357
358 debug = 3;
359 len = 4;
360 cmdp = &inquiry_result[0];
361
362 while (len--) {
363 WAIT(STATUS(bse), DF, DF, 0);
364 *cmdp++ = inb(DATA(bse));
365 }
366
367 debug = 8;
368
369 if (inb(STATUS(bse)) & DF)
370 goto fail;
371
372 debug = 9;
373
374 WAIT(INTRFLAGS(bse), HACC, HACC, 0);
375
376
377 debug = 10;
378
379 outb(IRST, CONTROL(bse));
380
381 debug = 11;
382
383 return debug;
384fail:
385 return 0;
386}
387
388
389static irqreturn_t do_aha1542_intr_handle(int dummy, void *dev_id)
390{
391 unsigned long flags;
392 struct Scsi_Host *shost = dev_id;
393
394 spin_lock_irqsave(shost->host_lock, flags);
395 aha1542_intr_handle(shost);
396 spin_unlock_irqrestore(shost->host_lock, flags);
397 return IRQ_HANDLED;
398}
399
400
401static void aha1542_intr_handle(struct Scsi_Host *shost)
402{
403 void (*my_done) (Scsi_Cmnd *) = NULL;
404 int errstatus, mbi, mbo, mbistatus;
405 int number_serviced;
406 unsigned long flags;
407 Scsi_Cmnd *SCtmp;
408 int flag;
409 int needs_restart;
410 struct mailbox *mb;
411 struct ccb *ccb;
412
413 mb = HOSTDATA(shost)->mb;
414 ccb = HOSTDATA(shost)->ccb;
415
416#ifdef DEBUG
417 {
418 flag = inb(INTRFLAGS(shost->io_port));
419 printk(KERN_DEBUG "aha1542_intr_handle: ");
420 if (!(flag & ANYINTR))
421 printk("no interrupt?");
422 if (flag & MBIF)
423 printk("MBIF ");
424 if (flag & MBOA)
425 printk("MBOF ");
426 if (flag & HACC)
427 printk("HACC ");
428 if (flag & SCRD)
429 printk("SCRD ");
430 printk("status %02x\n", inb(STATUS(shost->io_port)));
431 };
432#endif
433 number_serviced = 0;
434 needs_restart = 0;
435
436 while (1 == 1) {
437 flag = inb(INTRFLAGS(shost->io_port));
438
439
440
441
442
443 if (flag & ~MBIF) {
444 if (flag & MBOA)
445 printk("MBOF ");
446 if (flag & HACC)
447 printk("HACC ");
448 if (flag & SCRD) {
449 needs_restart = 1;
450 printk("SCRD ");
451 }
452 }
453 aha1542_intr_reset(shost->io_port);
454
455 spin_lock_irqsave(&aha1542_lock, flags);
456 mbi = HOSTDATA(shost)->aha1542_last_mbi_used + 1;
457 if (mbi >= 2 * AHA1542_MAILBOXES)
458 mbi = AHA1542_MAILBOXES;
459
460 do {
461 if (mb[mbi].status != 0)
462 break;
463 mbi++;
464 if (mbi >= 2 * AHA1542_MAILBOXES)
465 mbi = AHA1542_MAILBOXES;
466 } while (mbi != HOSTDATA(shost)->aha1542_last_mbi_used);
467
468 if (mb[mbi].status == 0) {
469 spin_unlock_irqrestore(&aha1542_lock, flags);
470
471 if (!number_serviced && !needs_restart)
472 printk(KERN_WARNING "aha1542.c: interrupt received, but no mail.\n");
473
474
475 if (needs_restart)
476 aha1542_restart(shost);
477 return;
478 };
479
480 mbo = (scsi2int(mb[mbi].ccbptr) - (SCSI_BUF_PA(&ccb[0]))) / sizeof(struct ccb);
481 mbistatus = mb[mbi].status;
482 mb[mbi].status = 0;
483 HOSTDATA(shost)->aha1542_last_mbi_used = mbi;
484 spin_unlock_irqrestore(&aha1542_lock, flags);
485
486#ifdef DEBUG
487 {
488 if (ccb[mbo].tarstat | ccb[mbo].hastat)
489 printk(KERN_DEBUG "aha1542_command: returning %x (status %d)\n",
490 ccb[mbo].tarstat + ((int) ccb[mbo].hastat << 16), mb[mbi].status);
491 };
492#endif
493
494 if (mbistatus == 3)
495 continue;
496
497#ifdef DEBUG
498 printk(KERN_DEBUG "...done %d %d\n", mbo, mbi);
499#endif
500
501 SCtmp = HOSTDATA(shost)->SCint[mbo];
502
503 if (!SCtmp || !SCtmp->scsi_done) {
504 printk(KERN_WARNING "aha1542_intr_handle: Unexpected interrupt\n");
505 printk(KERN_WARNING "tarstat=%x, hastat=%x idlun=%x ccb#=%d \n", ccb[mbo].tarstat,
506 ccb[mbo].hastat, ccb[mbo].idlun, mbo);
507 return;
508 }
509 my_done = SCtmp->scsi_done;
510 kfree(SCtmp->host_scribble);
511 SCtmp->host_scribble = NULL;
512
513
514
515 if (ccb[mbo].tarstat == 2)
516 memcpy(SCtmp->sense_buffer, &ccb[mbo].cdb[ccb[mbo].cdblen],
517 SCSI_SENSE_BUFFERSIZE);
518
519
520
521
522
523 if (mbistatus != 1)
524
525 errstatus = makecode(ccb[mbo].hastat, ccb[mbo].tarstat);
526 else
527 errstatus = 0;
528
529#ifdef DEBUG
530 if (errstatus)
531 printk(KERN_DEBUG "(aha1542 error:%x %x %x) ", errstatus,
532 ccb[mbo].hastat, ccb[mbo].tarstat);
533#endif
534
535 if (ccb[mbo].tarstat == 2) {
536#ifdef DEBUG
537 int i;
538#endif
539 DEB(printk("aha1542_intr_handle: sense:"));
540#ifdef DEBUG
541 for (i = 0; i < 12; i++)
542 printk("%02x ", ccb[mbo].cdb[ccb[mbo].cdblen + i]);
543 printk("\n");
544#endif
545
546
547
548
549
550
551 }
552 DEB(if (errstatus) printk("aha1542_intr_handle: returning %6x\n", errstatus));
553 SCtmp->result = errstatus;
554 HOSTDATA(shost)->SCint[mbo] = NULL;
555
556 my_done(SCtmp);
557 number_serviced++;
558 };
559}
560
561static int aha1542_queuecommand_lck(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *))
562{
563 unchar ahacmd = CMD_START_SCSI;
564 unchar direction;
565 unchar *cmd = (unchar *) SCpnt->cmnd;
566 unchar target = SCpnt->device->id;
567 unchar lun = SCpnt->device->lun;
568 unsigned long flags;
569 int bufflen = scsi_bufflen(SCpnt);
570 int mbo;
571 struct mailbox *mb;
572 struct ccb *ccb;
573
574 DEB(int i);
575
576 mb = HOSTDATA(SCpnt->device->host)->mb;
577 ccb = HOSTDATA(SCpnt->device->host)->ccb;
578
579 DEB(if (target > 1) {
580 SCpnt->result = DID_TIME_OUT << 16;
581 done(SCpnt); return 0;
582 }
583 );
584
585 if (*cmd == REQUEST_SENSE) {
586
587#if 0
588
589
590 if (bufflen != SCSI_SENSE_BUFFERSIZE)
591 printk(KERN_CRIT "aha1542: Wrong buffer length supplied "
592 "for request sense (%d)\n", bufflen);
593#endif
594 SCpnt->result = 0;
595 done(SCpnt);
596 return 0;
597 }
598#ifdef DEBUG
599 if (*cmd == READ_10 || *cmd == WRITE_10)
600 i = xscsi2int(cmd + 2);
601 else if (*cmd == READ_6 || *cmd == WRITE_6)
602 i = scsi2int(cmd + 2);
603 else
604 i = -1;
605 if (done)
606 printk(KERN_DEBUG "aha1542_queuecommand: dev %d cmd %02x pos %d len %d ", target, *cmd, i, bufflen);
607 else
608 printk(KERN_DEBUG "aha1542_command: dev %d cmd %02x pos %d len %d ", target, *cmd, i, bufflen);
609 aha1542_stat();
610 printk(KERN_DEBUG "aha1542_queuecommand: dumping scsi cmd:");
611 for (i = 0; i < SCpnt->cmd_len; i++)
612 printk("%02x ", cmd[i]);
613 printk("\n");
614 if (*cmd == WRITE_10 || *cmd == WRITE_6)
615 return 0;
616#endif
617
618
619
620 spin_lock_irqsave(&aha1542_lock, flags);
621 mbo = HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used + 1;
622 if (mbo >= AHA1542_MAILBOXES)
623 mbo = 0;
624
625 do {
626 if (mb[mbo].status == 0 && HOSTDATA(SCpnt->device->host)->SCint[mbo] == NULL)
627 break;
628 mbo++;
629 if (mbo >= AHA1542_MAILBOXES)
630 mbo = 0;
631 } while (mbo != HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used);
632
633 if (mb[mbo].status || HOSTDATA(SCpnt->device->host)->SCint[mbo])
634 panic("Unable to find empty mailbox for aha1542.\n");
635
636 HOSTDATA(SCpnt->device->host)->SCint[mbo] = SCpnt;
637
638
639 HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used = mbo;
640 spin_unlock_irqrestore(&aha1542_lock, flags);
641
642#ifdef DEBUG
643 printk(KERN_DEBUG "Sending command (%d %x)...", mbo, done);
644#endif
645
646 any2scsi(mb[mbo].ccbptr, SCSI_BUF_PA(&ccb[mbo]));
647
648 memset(&ccb[mbo], 0, sizeof(struct ccb));
649
650 ccb[mbo].cdblen = SCpnt->cmd_len;
651
652 direction = 0;
653 if (*cmd == READ_10 || *cmd == READ_6)
654 direction = 8;
655 else if (*cmd == WRITE_10 || *cmd == WRITE_6)
656 direction = 16;
657
658 memcpy(ccb[mbo].cdb, cmd, ccb[mbo].cdblen);
659
660 if (bufflen) {
661 struct scatterlist *sg;
662 struct chain *cptr;
663#ifdef DEBUG
664 unsigned char *ptr;
665#endif
666 int i, sg_count = scsi_sg_count(SCpnt);
667 ccb[mbo].op = 2;
668 SCpnt->host_scribble = kmalloc(sizeof(*cptr)*sg_count,
669 GFP_KERNEL | GFP_DMA);
670 cptr = (struct chain *) SCpnt->host_scribble;
671 if (cptr == NULL) {
672
673 HOSTDATA(SCpnt->device->host)->SCint[mbo] = NULL;
674 return SCSI_MLQUEUE_HOST_BUSY;
675 }
676 scsi_for_each_sg(SCpnt, sg, sg_count, i) {
677 any2scsi(cptr[i].dataptr, SCSI_SG_PA(sg));
678 any2scsi(cptr[i].datalen, sg->length);
679 };
680 any2scsi(ccb[mbo].datalen, sg_count * sizeof(struct chain));
681 any2scsi(ccb[mbo].dataptr, SCSI_BUF_PA(cptr));
682#ifdef DEBUG
683 printk("cptr %x: ", cptr);
684 ptr = (unsigned char *) cptr;
685 for (i = 0; i < 18; i++)
686 printk("%02x ", ptr[i]);
687#endif
688 } else {
689 ccb[mbo].op = 0;
690 SCpnt->host_scribble = NULL;
691 any2scsi(ccb[mbo].datalen, 0);
692 any2scsi(ccb[mbo].dataptr, 0);
693 };
694 ccb[mbo].idlun = (target & 7) << 5 | direction | (lun & 7);
695 ccb[mbo].rsalen = 16;
696 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
697 ccb[mbo].commlinkid = 0;
698
699#ifdef DEBUG
700 {
701 int i;
702 printk(KERN_DEBUG "aha1542_command: sending.. ");
703 for (i = 0; i < sizeof(ccb[mbo]) - 10; i++)
704 printk("%02x ", ((unchar *) & ccb[mbo])[i]);
705 };
706#endif
707
708 if (done) {
709 DEB(printk("aha1542_queuecommand: now waiting for interrupt ");
710 aha1542_stat());
711 SCpnt->scsi_done = done;
712 mb[mbo].status = 1;
713 aha1542_out(SCpnt->device->host->io_port, &ahacmd, 1);
714 DEB(aha1542_stat());
715 } else
716 printk("aha1542_queuecommand: done can't be NULL\n");
717
718 return 0;
719}
720
721static DEF_SCSI_QCMD(aha1542_queuecommand)
722
723
724static void setup_mailboxes(int bse, struct Scsi_Host *shpnt)
725{
726 int i;
727 struct mailbox *mb;
728 struct ccb *ccb;
729
730 unchar cmd[5] = { CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0};
731
732 mb = HOSTDATA(shpnt)->mb;
733 ccb = HOSTDATA(shpnt)->ccb;
734
735 for (i = 0; i < AHA1542_MAILBOXES; i++) {
736 mb[i].status = mb[AHA1542_MAILBOXES + i].status = 0;
737 any2scsi(mb[i].ccbptr, SCSI_BUF_PA(&ccb[i]));
738 };
739 aha1542_intr_reset(bse);
740 any2scsi((cmd + 2), SCSI_BUF_PA(mb));
741 aha1542_out(bse, cmd, 5);
742 WAIT(INTRFLAGS(bse), INTRMASK, HACC, 0);
743 while (0) {
744fail:
745 printk(KERN_ERR "aha1542_detect: failed setting up mailboxes\n");
746 }
747 aha1542_intr_reset(bse);
748}
749
750static int __init aha1542_getconfig(int base_io, unsigned char *irq_level, unsigned char *dma_chan, unsigned char *scsi_id)
751{
752 unchar inquiry_cmd[] = {CMD_RETCONF};
753 unchar inquiry_result[3];
754 int i;
755 i = inb(STATUS(base_io));
756 if (i & DF) {
757 i = inb(DATA(base_io));
758 };
759 aha1542_out(base_io, inquiry_cmd, 1);
760 aha1542_in(base_io, inquiry_result, 3);
761 WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
762 while (0) {
763fail:
764 printk(KERN_ERR "aha1542_detect: query board settings\n");
765 }
766 aha1542_intr_reset(base_io);
767 switch (inquiry_result[0]) {
768 case 0x80:
769 *dma_chan = 7;
770 break;
771 case 0x40:
772 *dma_chan = 6;
773 break;
774 case 0x20:
775 *dma_chan = 5;
776 break;
777 case 0x01:
778 *dma_chan = 0;
779 break;
780 case 0:
781
782
783 *dma_chan = 0xFF;
784 break;
785 default:
786 printk(KERN_ERR "Unable to determine Adaptec DMA priority. Disabling board\n");
787 return -1;
788 };
789 switch (inquiry_result[1]) {
790 case 0x40:
791 *irq_level = 15;
792 break;
793 case 0x20:
794 *irq_level = 14;
795 break;
796 case 0x8:
797 *irq_level = 12;
798 break;
799 case 0x4:
800 *irq_level = 11;
801 break;
802 case 0x2:
803 *irq_level = 10;
804 break;
805 case 0x1:
806 *irq_level = 9;
807 break;
808 default:
809 printk(KERN_ERR "Unable to determine Adaptec IRQ level. Disabling board\n");
810 return -1;
811 };
812 *scsi_id = inquiry_result[2] & 7;
813 return 0;
814}
815
816
817
818
819static int __init aha1542_mbenable(int base)
820{
821 static unchar mbenable_cmd[3];
822 static unchar mbenable_result[2];
823 int retval;
824
825 retval = BIOS_TRANSLATION_6432;
826
827 mbenable_cmd[0] = CMD_EXTBIOS;
828 aha1542_out(base, mbenable_cmd, 1);
829 if (aha1542_in1(base, mbenable_result, 2))
830 return retval;
831 WAITd(INTRFLAGS(base), INTRMASK, HACC, 0, 100);
832 aha1542_intr_reset(base);
833
834 if ((mbenable_result[0] & 0x08) || mbenable_result[1]) {
835 mbenable_cmd[0] = CMD_MBENABLE;
836 mbenable_cmd[1] = 0;
837 mbenable_cmd[2] = mbenable_result[1];
838
839 if ((mbenable_result[0] & 0x08) && (mbenable_result[1] & 0x03))
840 retval = BIOS_TRANSLATION_25563;
841
842 aha1542_out(base, mbenable_cmd, 3);
843 WAIT(INTRFLAGS(base), INTRMASK, HACC, 0);
844 };
845 while (0) {
846fail:
847 printk(KERN_ERR "aha1542_mbenable: Mailbox init failed\n");
848 }
849 aha1542_intr_reset(base);
850 return retval;
851}
852
853
854static int __init aha1542_query(int base_io, int *transl)
855{
856 unchar inquiry_cmd[] = {CMD_INQUIRY};
857 unchar inquiry_result[4];
858 int i;
859 i = inb(STATUS(base_io));
860 if (i & DF) {
861 i = inb(DATA(base_io));
862 };
863 aha1542_out(base_io, inquiry_cmd, 1);
864 aha1542_in(base_io, inquiry_result, 4);
865 WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
866 while (0) {
867fail:
868 printk(KERN_ERR "aha1542_detect: query card type\n");
869 }
870 aha1542_intr_reset(base_io);
871
872 *transl = BIOS_TRANSLATION_6432;
873
874
875
876
877
878
879
880 if (inquiry_result[0] == 0x43) {
881 printk(KERN_INFO "aha1542.c: Emulation mode not supported for AHA 174N hardware.\n");
882 return 1;
883 };
884
885
886
887
888 *transl = aha1542_mbenable(base_io);
889
890 return 0;
891}
892
893#ifndef MODULE
894static char *setup_str[MAXBOARDS] __initdata;
895static int setup_idx = 0;
896
897static void __init aha1542_setup(char *str, int *ints)
898{
899 const char *ahausage = "aha1542: usage: aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]\n";
900 int setup_portbase;
901
902 if (setup_idx >= MAXBOARDS) {
903 printk(KERN_ERR "aha1542: aha1542_setup called too many times! Bad LILO params ?\n");
904 printk(KERN_ERR " Entryline 1: %s\n", setup_str[0]);
905 printk(KERN_ERR " Entryline 2: %s\n", setup_str[1]);
906 printk(KERN_ERR " This line: %s\n", str);
907 return;
908 }
909 if (ints[0] < 1 || ints[0] > 4) {
910 printk(KERN_ERR "aha1542: %s\n", str);
911 printk(ahausage);
912 printk(KERN_ERR "aha1542: Wrong parameters may cause system malfunction.. We try anyway..\n");
913 }
914 setup_called[setup_idx] = ints[0];
915 setup_str[setup_idx] = str;
916
917 setup_portbase = ints[0] >= 1 ? ints[1] : 0;
918 setup_buson[setup_idx] = ints[0] >= 2 ? ints[2] : 7;
919 setup_busoff[setup_idx] = ints[0] >= 3 ? ints[3] : 5;
920 if (ints[0] >= 4)
921 {
922 int atbt = -1;
923 switch (ints[4]) {
924 case 5:
925 atbt = 0x00;
926 break;
927 case 6:
928 atbt = 0x04;
929 break;
930 case 7:
931 atbt = 0x01;
932 break;
933 case 8:
934 atbt = 0x02;
935 break;
936 case 10:
937 atbt = 0x03;
938 break;
939 default:
940 printk(KERN_ERR "aha1542: %s\n", str);
941 printk(ahausage);
942 printk(KERN_ERR "aha1542: Valid values for DMASPEED are 5-8, 10 MB/s. Using jumper defaults.\n");
943 break;
944 }
945 setup_dmaspeed[setup_idx] = atbt;
946 }
947 if (setup_portbase != 0)
948 bases[setup_idx] = setup_portbase;
949
950 ++setup_idx;
951}
952
953static int __init do_setup(char *str)
954{
955 int ints[5];
956
957 int count=setup_idx;
958
959 get_options(str, ARRAY_SIZE(ints), ints);
960 aha1542_setup(str,ints);
961
962 return count<setup_idx;
963}
964
965__setup("aha1542=",do_setup);
966#endif
967
968
969static int __init aha1542_detect(struct scsi_host_template * tpnt)
970{
971 unsigned char dma_chan;
972 unsigned char irq_level;
973 unsigned char scsi_id;
974 unsigned long flags;
975 unsigned int base_io;
976 int trans;
977 struct Scsi_Host *shpnt = NULL;
978 int count = 0;
979 int indx;
980
981 DEB(printk("aha1542_detect: \n"));
982
983 tpnt->proc_name = "aha1542";
984
985#ifdef MODULE
986 bases[0] = aha1542[0];
987 setup_buson[0] = aha1542[1];
988 setup_busoff[0] = aha1542[2];
989 {
990 int atbt = -1;
991 switch (aha1542[3]) {
992 case 5:
993 atbt = 0x00;
994 break;
995 case 6:
996 atbt = 0x04;
997 break;
998 case 7:
999 atbt = 0x01;
1000 break;
1001 case 8:
1002 atbt = 0x02;
1003 break;
1004 case 10:
1005 atbt = 0x03;
1006 break;
1007 };
1008 setup_dmaspeed[0] = atbt;
1009 }
1010#endif
1011
1012
1013
1014
1015#ifdef CONFIG_MCA_LEGACY
1016 if(MCA_bus) {
1017 int slot = 0;
1018 int pos = 0;
1019
1020 for (indx = 0; (slot != MCA_NOTFOUND) && (indx < ARRAY_SIZE(bases)); indx++) {
1021
1022 if (bases[indx])
1023 continue;
1024
1025
1026 slot = mca_find_unused_adapter(0x0f1f, slot);
1027 if (slot == MCA_NOTFOUND)
1028 break;
1029
1030
1031 pos = mca_read_stored_pos(slot, 3);
1032
1033
1034 if (pos & 0x80) {
1035 if (pos & 0x02) {
1036 if (pos & 0x01)
1037 bases[indx] = 0x334;
1038 else
1039 bases[indx] = 0x234;
1040 } else {
1041 if (pos & 0x01)
1042 bases[indx] = 0x134;
1043 }
1044 } else {
1045 if (pos & 0x02) {
1046 if (pos & 0x01)
1047 bases[indx] = 0x330;
1048 else
1049 bases[indx] = 0x230;
1050 } else {
1051 if (pos & 0x01)
1052 bases[indx] = 0x130;
1053 }
1054 }
1055
1056
1057
1058
1059 printk(KERN_INFO "Found an AHA-1640 in MCA slot %d, I/O 0x%04x\n", slot, bases[indx]);
1060
1061 mca_set_adapter_name(slot, "Adapter AHA-1640");
1062 mca_set_adapter_procfn(slot, NULL, NULL);
1063 mca_mark_as_used(slot);
1064
1065
1066 slot++;
1067 }
1068
1069 }
1070#endif
1071
1072
1073
1074
1075
1076 if(isapnp)
1077 {
1078 struct pnp_dev *pdev = NULL;
1079 for(indx = 0; indx < ARRAY_SIZE(bases); indx++) {
1080 if(bases[indx])
1081 continue;
1082 pdev = pnp_find_dev(NULL, ISAPNP_VENDOR('A', 'D', 'P'),
1083 ISAPNP_FUNCTION(0x1542), pdev);
1084 if(pdev==NULL)
1085 break;
1086
1087
1088
1089
1090 if(pnp_device_attach(pdev)<0)
1091 continue;
1092
1093 if(pnp_activate_dev(pdev)<0) {
1094 pnp_device_detach(pdev);
1095 continue;
1096 }
1097
1098 if(!pnp_port_valid(pdev, 0)) {
1099 pnp_device_detach(pdev);
1100 continue;
1101 }
1102
1103 bases[indx] = pnp_port_start(pdev, 0);
1104
1105
1106
1107
1108 printk(KERN_INFO "ISAPnP found an AHA1535 at I/O 0x%03X\n", bases[indx]);
1109 }
1110 }
1111 for (indx = 0; indx < ARRAY_SIZE(bases); indx++)
1112 if (bases[indx] != 0 && request_region(bases[indx], 4, "aha1542")) {
1113 shpnt = scsi_register(tpnt,
1114 sizeof(struct aha1542_hostdata));
1115
1116 if(shpnt==NULL) {
1117 release_region(bases[indx], 4);
1118 continue;
1119 }
1120 if (!aha1542_test_port(bases[indx], shpnt))
1121 goto unregister;
1122
1123 base_io = bases[indx];
1124
1125
1126 {
1127 unchar oncmd[] = {CMD_BUSON_TIME, 7};
1128 unchar offcmd[] = {CMD_BUSOFF_TIME, 5};
1129
1130 if (setup_called[indx]) {
1131 oncmd[1] = setup_buson[indx];
1132 offcmd[1] = setup_busoff[indx];
1133 }
1134 aha1542_intr_reset(base_io);
1135 aha1542_out(base_io, oncmd, 2);
1136 WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
1137 aha1542_intr_reset(base_io);
1138 aha1542_out(base_io, offcmd, 2);
1139 WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
1140 if (setup_dmaspeed[indx] >= 0) {
1141 unchar dmacmd[] = {CMD_DMASPEED, 0};
1142 dmacmd[1] = setup_dmaspeed[indx];
1143 aha1542_intr_reset(base_io);
1144 aha1542_out(base_io, dmacmd, 2);
1145 WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
1146 }
1147 while (0) {
1148fail:
1149 printk(KERN_ERR "aha1542_detect: setting bus on/off-time failed\n");
1150 }
1151 aha1542_intr_reset(base_io);
1152 }
1153 if (aha1542_query(base_io, &trans))
1154 goto unregister;
1155
1156 if (aha1542_getconfig(base_io, &irq_level, &dma_chan, &scsi_id) == -1)
1157 goto unregister;
1158
1159 printk(KERN_INFO "Configuring Adaptec (SCSI-ID %d) at IO:%x, IRQ %d", scsi_id, base_io, irq_level);
1160 if (dma_chan != 0xFF)
1161 printk(", DMA priority %d", dma_chan);
1162 printk("\n");
1163
1164 DEB(aha1542_stat());
1165 setup_mailboxes(base_io, shpnt);
1166
1167 DEB(aha1542_stat());
1168
1169 DEB(printk("aha1542_detect: enable interrupt channel %d\n", irq_level));
1170 spin_lock_irqsave(&aha1542_lock, flags);
1171 if (request_irq(irq_level, do_aha1542_intr_handle, 0,
1172 "aha1542", shpnt)) {
1173 printk(KERN_ERR "Unable to allocate IRQ for adaptec controller.\n");
1174 spin_unlock_irqrestore(&aha1542_lock, flags);
1175 goto unregister;
1176 }
1177 if (dma_chan != 0xFF) {
1178 if (request_dma(dma_chan, "aha1542")) {
1179 printk(KERN_ERR "Unable to allocate DMA channel for Adaptec.\n");
1180 free_irq(irq_level, shpnt);
1181 spin_unlock_irqrestore(&aha1542_lock, flags);
1182 goto unregister;
1183 }
1184 if (dma_chan == 0 || dma_chan >= 5) {
1185 set_dma_mode(dma_chan, DMA_MODE_CASCADE);
1186 enable_dma(dma_chan);
1187 }
1188 }
1189
1190 shpnt->this_id = scsi_id;
1191 shpnt->unique_id = base_io;
1192 shpnt->io_port = base_io;
1193 shpnt->n_io_port = 4;
1194 shpnt->dma_channel = dma_chan;
1195 shpnt->irq = irq_level;
1196 HOSTDATA(shpnt)->bios_translation = trans;
1197 if (trans == BIOS_TRANSLATION_25563)
1198 printk(KERN_INFO "aha1542.c: Using extended bios translation\n");
1199 HOSTDATA(shpnt)->aha1542_last_mbi_used = (2 * AHA1542_MAILBOXES - 1);
1200 HOSTDATA(shpnt)->aha1542_last_mbo_used = (AHA1542_MAILBOXES - 1);
1201 memset(HOSTDATA(shpnt)->SCint, 0, sizeof(HOSTDATA(shpnt)->SCint));
1202 spin_unlock_irqrestore(&aha1542_lock, flags);
1203#if 0
1204 DEB(printk(" *** READ CAPACITY ***\n"));
1205
1206 {
1207 unchar buf[8];
1208 static unchar cmd[] = { READ_CAPACITY, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1209 int i;
1210
1211 for (i = 0; i < sizeof(buf); ++i)
1212 buf[i] = 0x87;
1213 for (i = 0; i < 2; ++i)
1214 if (!aha1542_command(i, cmd, buf, sizeof(buf))) {
1215 printk(KERN_DEBUG "aha_detect: LU %d sector_size %d device_size %d\n",
1216 i, xscsi2int(buf + 4), xscsi2int(buf));
1217 }
1218 }
1219
1220 DEB(printk(" *** NOW RUNNING MY OWN TEST *** \n"));
1221
1222 for (i = 0; i < 4; ++i) {
1223 unsigned char cmd[10];
1224 static buffer[512];
1225
1226 cmd[0] = READ_10;
1227 cmd[1] = 0;
1228 xany2scsi(cmd + 2, i);
1229 cmd[6] = 0;
1230 cmd[7] = 0;
1231 cmd[8] = 1;
1232 cmd[9] = 0;
1233 aha1542_command(0, cmd, buffer, 512);
1234 }
1235#endif
1236 count++;
1237 continue;
1238unregister:
1239 release_region(bases[indx], 4);
1240 scsi_unregister(shpnt);
1241 continue;
1242
1243 };
1244
1245 return count;
1246}
1247
1248static int aha1542_release(struct Scsi_Host *shost)
1249{
1250 if (shost->irq)
1251 free_irq(shost->irq, shost);
1252 if (shost->dma_channel != 0xff)
1253 free_dma(shost->dma_channel);
1254 if (shost->io_port && shost->n_io_port)
1255 release_region(shost->io_port, shost->n_io_port);
1256 scsi_unregister(shost);
1257 return 0;
1258}
1259
1260static int aha1542_restart(struct Scsi_Host *shost)
1261{
1262 int i;
1263 int count = 0;
1264#if 0
1265 unchar ahacmd = CMD_START_SCSI;
1266#endif
1267
1268 for (i = 0; i < AHA1542_MAILBOXES; i++)
1269 if (HOSTDATA(shost)->SCint[i] &&
1270 !(HOSTDATA(shost)->SCint[i]->device->soft_reset)) {
1271#if 0
1272 HOSTDATA(shost)->mb[i].status = 1;
1273#endif
1274 count++;
1275 }
1276 printk(KERN_DEBUG "Potential to restart %d stalled commands...\n", count);
1277#if 0
1278
1279 if (count)
1280 aha1542_out(shost->io_port, &ahacmd, 1);
1281#endif
1282 return 0;
1283}
1284
1285
1286
1287
1288
1289static int aha1542_dev_reset(Scsi_Cmnd * SCpnt)
1290{
1291 unsigned long flags;
1292 struct mailbox *mb;
1293 unchar target = SCpnt->device->id;
1294 unchar lun = SCpnt->device->lun;
1295 int mbo;
1296 struct ccb *ccb;
1297 unchar ahacmd = CMD_START_SCSI;
1298
1299 ccb = HOSTDATA(SCpnt->device->host)->ccb;
1300 mb = HOSTDATA(SCpnt->device->host)->mb;
1301
1302 spin_lock_irqsave(&aha1542_lock, flags);
1303 mbo = HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used + 1;
1304 if (mbo >= AHA1542_MAILBOXES)
1305 mbo = 0;
1306
1307 do {
1308 if (mb[mbo].status == 0 && HOSTDATA(SCpnt->device->host)->SCint[mbo] == NULL)
1309 break;
1310 mbo++;
1311 if (mbo >= AHA1542_MAILBOXES)
1312 mbo = 0;
1313 } while (mbo != HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used);
1314
1315 if (mb[mbo].status || HOSTDATA(SCpnt->device->host)->SCint[mbo])
1316 panic("Unable to find empty mailbox for aha1542.\n");
1317
1318 HOSTDATA(SCpnt->device->host)->SCint[mbo] = SCpnt;
1319
1320
1321
1322 HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used = mbo;
1323 spin_unlock_irqrestore(&aha1542_lock, flags);
1324
1325 any2scsi(mb[mbo].ccbptr, SCSI_BUF_PA(&ccb[mbo]));
1326
1327 memset(&ccb[mbo], 0, sizeof(struct ccb));
1328
1329 ccb[mbo].op = 0x81;
1330
1331 ccb[mbo].idlun = (target & 7) << 5 | (lun & 7);
1332
1333 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
1334 ccb[mbo].commlinkid = 0;
1335
1336
1337
1338
1339
1340 aha1542_out(SCpnt->device->host->io_port, &ahacmd, 1);
1341
1342 scmd_printk(KERN_WARNING, SCpnt,
1343 "Trying device reset for target\n");
1344
1345 return SUCCESS;
1346
1347
1348#ifdef ERIC_neverdef
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358 printk(KERN_WARNING "Sent BUS DEVICE RESET to target %d\n", SCpnt->target);
1359
1360
1361
1362
1363
1364 for (i = 0; i < AHA1542_MAILBOXES; i++) {
1365 if (HOSTDATA(SCpnt->host)->SCint[i] &&
1366 HOSTDATA(SCpnt->host)->SCint[i]->target == SCpnt->target) {
1367 Scsi_Cmnd *SCtmp;
1368 SCtmp = HOSTDATA(SCpnt->host)->SCint[i];
1369 kfree(SCtmp->host_scribble);
1370 SCtmp->host_scribble = NULL;
1371 HOSTDATA(SCpnt->host)->SCint[i] = NULL;
1372 HOSTDATA(SCpnt->host)->mb[i].status = 0;
1373 }
1374 }
1375 return SUCCESS;
1376
1377 return FAILED;
1378#endif
1379}
1380
1381static int aha1542_bus_reset(Scsi_Cmnd * SCpnt)
1382{
1383 int i;
1384
1385
1386
1387
1388
1389
1390
1391 outb(SCRST, CONTROL(SCpnt->device->host->io_port));
1392
1393
1394
1395
1396
1397
1398
1399
1400 ssleep(4);
1401
1402 spin_lock_irq(SCpnt->device->host->host_lock);
1403
1404 WAIT(STATUS(SCpnt->device->host->io_port),
1405 STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
1406
1407
1408
1409
1410
1411
1412
1413 printk(KERN_WARNING "Sent BUS RESET to scsi host %d\n", SCpnt->device->host->host_no);
1414
1415 for (i = 0; i < AHA1542_MAILBOXES; i++) {
1416 if (HOSTDATA(SCpnt->device->host)->SCint[i] != NULL) {
1417 Scsi_Cmnd *SCtmp;
1418 SCtmp = HOSTDATA(SCpnt->device->host)->SCint[i];
1419
1420
1421 if (SCtmp->device->soft_reset) {
1422
1423
1424
1425
1426
1427
1428 continue;
1429 }
1430 kfree(SCtmp->host_scribble);
1431 SCtmp->host_scribble = NULL;
1432 HOSTDATA(SCpnt->device->host)->SCint[i] = NULL;
1433 HOSTDATA(SCpnt->device->host)->mb[i].status = 0;
1434 }
1435 }
1436
1437 spin_unlock_irq(SCpnt->device->host->host_lock);
1438 return SUCCESS;
1439
1440fail:
1441 spin_unlock_irq(SCpnt->device->host->host_lock);
1442 return FAILED;
1443}
1444
1445static int aha1542_host_reset(Scsi_Cmnd * SCpnt)
1446{
1447 int i;
1448
1449
1450
1451
1452
1453
1454
1455 outb(HRST | SCRST, CONTROL(SCpnt->device->host->io_port));
1456
1457
1458
1459
1460
1461
1462
1463
1464 ssleep(4);
1465 spin_lock_irq(SCpnt->device->host->host_lock);
1466
1467 WAIT(STATUS(SCpnt->device->host->io_port),
1468 STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
1469
1470
1471
1472
1473
1474 setup_mailboxes(SCpnt->device->host->io_port, SCpnt->device->host);
1475
1476
1477
1478
1479
1480
1481
1482 printk(KERN_WARNING "Sent BUS RESET to scsi host %d\n", SCpnt->device->host->host_no);
1483
1484 for (i = 0; i < AHA1542_MAILBOXES; i++) {
1485 if (HOSTDATA(SCpnt->device->host)->SCint[i] != NULL) {
1486 Scsi_Cmnd *SCtmp;
1487 SCtmp = HOSTDATA(SCpnt->device->host)->SCint[i];
1488
1489 if (SCtmp->device->soft_reset) {
1490
1491
1492
1493
1494
1495
1496 continue;
1497 }
1498 kfree(SCtmp->host_scribble);
1499 SCtmp->host_scribble = NULL;
1500 HOSTDATA(SCpnt->device->host)->SCint[i] = NULL;
1501 HOSTDATA(SCpnt->device->host)->mb[i].status = 0;
1502 }
1503 }
1504
1505 spin_unlock_irq(SCpnt->device->host->host_lock);
1506 return SUCCESS;
1507
1508fail:
1509 spin_unlock_irq(SCpnt->device->host->host_lock);
1510 return FAILED;
1511}
1512
1513#if 0
1514
1515
1516
1517
1518static int aha1542_old_abort(Scsi_Cmnd * SCpnt)
1519{
1520#if 0
1521 unchar ahacmd = CMD_START_SCSI;
1522 unsigned long flags;
1523 struct mailbox *mb;
1524 int mbi, mbo, i;
1525
1526 printk(KERN_DEBUG "In aha1542_abort: %x %x\n",
1527 inb(STATUS(SCpnt->host->io_port)),
1528 inb(INTRFLAGS(SCpnt->host->io_port)));
1529
1530 spin_lock_irqsave(&aha1542_lock, flags);
1531 mb = HOSTDATA(SCpnt->host)->mb;
1532 mbi = HOSTDATA(SCpnt->host)->aha1542_last_mbi_used + 1;
1533 if (mbi >= 2 * AHA1542_MAILBOXES)
1534 mbi = AHA1542_MAILBOXES;
1535
1536 do {
1537 if (mb[mbi].status != 0)
1538 break;
1539 mbi++;
1540 if (mbi >= 2 * AHA1542_MAILBOXES)
1541 mbi = AHA1542_MAILBOXES;
1542 } while (mbi != HOSTDATA(SCpnt->host)->aha1542_last_mbi_used);
1543 spin_unlock_irqrestore(&aha1542_lock, flags);
1544
1545 if (mb[mbi].status) {
1546 printk(KERN_ERR "Lost interrupt discovered on irq %d - attempting to recover\n",
1547 SCpnt->host->irq);
1548 aha1542_intr_handle(SCpnt->host, NULL);
1549 return 0;
1550 }
1551
1552
1553
1554 for (i = 0; i < AHA1542_MAILBOXES; i++)
1555 if (HOSTDATA(SCpnt->host)->SCint[i]) {
1556 if (HOSTDATA(SCpnt->host)->SCint[i] == SCpnt) {
1557 printk(KERN_ERR "Timed out command pending for %s\n",
1558 SCpnt->request->rq_disk ?
1559 SCpnt->request->rq_disk->disk_name : "?"
1560 );
1561 if (HOSTDATA(SCpnt->host)->mb[i].status) {
1562 printk(KERN_ERR "OGMB still full - restarting\n");
1563 aha1542_out(SCpnt->host->io_port, &ahacmd, 1);
1564 };
1565 } else
1566 printk(KERN_ERR "Other pending command %s\n",
1567 SCpnt->request->rq_disk ?
1568 SCpnt->request->rq_disk->disk_name : "?"
1569 );
1570 }
1571#endif
1572
1573 DEB(printk("aha1542_abort\n"));
1574#if 0
1575 spin_lock_irqsave(&aha1542_lock, flags);
1576 for (mbo = 0; mbo < AHA1542_MAILBOXES; mbo++) {
1577 if (SCpnt == HOSTDATA(SCpnt->host)->SCint[mbo]) {
1578 mb[mbo].status = 2;
1579 aha1542_out(SCpnt->host->io_port, &ahacmd, 1);
1580 spin_unlock_irqrestore(&aha1542_lock, flags);
1581 break;
1582 }
1583 }
1584 if (AHA1542_MAILBOXES == mbo)
1585 spin_unlock_irqrestore(&aha1542_lock, flags);
1586#endif
1587 return SCSI_ABORT_SNOOZE;
1588}
1589
1590
1591
1592
1593
1594
1595
1596static int aha1542_old_reset(Scsi_Cmnd * SCpnt, unsigned int reset_flags)
1597{
1598 unchar ahacmd = CMD_START_SCSI;
1599 int i;
1600
1601
1602
1603
1604 if (reset_flags & SCSI_RESET_SUGGEST_BUS_RESET) {
1605
1606
1607
1608
1609
1610
1611 outb(HRST | SCRST, CONTROL(SCpnt->host->io_port));
1612
1613
1614
1615
1616
1617
1618
1619
1620 WAIT(STATUS(SCpnt->host->io_port),
1621 STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
1622
1623
1624
1625
1626
1627 setup_mailboxes(SCpnt->host->io_port, SCpnt->host);
1628
1629
1630
1631
1632
1633
1634
1635 printk(KERN_WARNING "Sent BUS RESET to scsi host %d\n", SCpnt->host->host_no);
1636
1637 for (i = 0; i < AHA1542_MAILBOXES; i++)
1638 if (HOSTDATA(SCpnt->host)->SCint[i] != NULL) {
1639 Scsi_Cmnd *SCtmp;
1640 SCtmp = HOSTDATA(SCpnt->host)->SCint[i];
1641 SCtmp->result = DID_RESET << 16;
1642 kfree(SCtmp->host_scribble);
1643 SCtmp->host_scribble = NULL;
1644 printk(KERN_WARNING "Sending DID_RESET for target %d\n", SCpnt->target);
1645 SCtmp->scsi_done(SCpnt);
1646
1647 HOSTDATA(SCpnt->host)->SCint[i] = NULL;
1648 HOSTDATA(SCpnt->host)->mb[i].status = 0;
1649 }
1650
1651
1652
1653
1654
1655 return (SCSI_RESET_SUCCESS | SCSI_RESET_BUS_RESET);
1656fail:
1657 printk(KERN_CRIT "aha1542.c: Unable to perform hard reset.\n");
1658 printk(KERN_CRIT "Power cycle machine to reset\n");
1659 return (SCSI_RESET_ERROR | SCSI_RESET_BUS_RESET);
1660
1661
1662 } else {
1663
1664
1665 for (i = 0; i < AHA1542_MAILBOXES; i++)
1666 if (HOSTDATA(SCpnt->host)->SCint[i] == SCpnt) {
1667 HOSTDATA(SCpnt->host)->ccb[i].op = 0x81;
1668
1669 aha1542_out(SCpnt->host->io_port, &ahacmd, 1);
1670
1671
1672
1673
1674
1675 printk(KERN_WARNING "Sent BUS DEVICE RESET to target %d\n", SCpnt->target);
1676
1677
1678
1679
1680 for (i = 0; i < AHA1542_MAILBOXES; i++)
1681 if (HOSTDATA(SCpnt->host)->SCint[i] &&
1682 HOSTDATA(SCpnt->host)->SCint[i]->target == SCpnt->target) {
1683 Scsi_Cmnd *SCtmp;
1684 SCtmp = HOSTDATA(SCpnt->host)->SCint[i];
1685 SCtmp->result = DID_RESET << 16;
1686 kfree(SCtmp->host_scribble);
1687 SCtmp->host_scribble = NULL;
1688 printk(KERN_WARNING "Sending DID_RESET for target %d\n", SCpnt->target);
1689 SCtmp->scsi_done(SCpnt);
1690
1691 HOSTDATA(SCpnt->host)->SCint[i] = NULL;
1692 HOSTDATA(SCpnt->host)->mb[i].status = 0;
1693 }
1694 return SCSI_RESET_SUCCESS;
1695 }
1696 }
1697
1698
1699
1700 return SCSI_RESET_PUNT;
1701}
1702#endif
1703
1704static int aha1542_biosparam(struct scsi_device *sdev,
1705 struct block_device *bdev, sector_t capacity, int *ip)
1706{
1707 int translation_algorithm;
1708 int size = capacity;
1709
1710 translation_algorithm = HOSTDATA(sdev->host)->bios_translation;
1711
1712 if ((size >> 11) > 1024 && translation_algorithm == BIOS_TRANSLATION_25563) {
1713
1714 ip[0] = 255;
1715 ip[1] = 63;
1716 ip[2] = size / 255 / 63;
1717 } else {
1718 ip[0] = 64;
1719 ip[1] = 32;
1720 ip[2] = size >> 11;
1721 }
1722
1723 return 0;
1724}
1725MODULE_LICENSE("GPL");
1726
1727
1728static struct scsi_host_template driver_template = {
1729 .proc_name = "aha1542",
1730 .name = "Adaptec 1542",
1731 .detect = aha1542_detect,
1732 .release = aha1542_release,
1733 .queuecommand = aha1542_queuecommand,
1734 .eh_device_reset_handler= aha1542_dev_reset,
1735 .eh_bus_reset_handler = aha1542_bus_reset,
1736 .eh_host_reset_handler = aha1542_host_reset,
1737 .bios_param = aha1542_biosparam,
1738 .can_queue = AHA1542_MAILBOXES,
1739 .this_id = 7,
1740 .sg_tablesize = AHA1542_SCATTER,
1741 .cmd_per_lun = AHA1542_CMDLUN,
1742 .unchecked_isa_dma = 1,
1743 .use_clustering = ENABLE_CLUSTERING,
1744};
1745#include "scsi_module.c"
1746