blob: cbbfbc9f3e0fad2f272ad2e3ffb2e0c8a0a9d283 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* $Id: aha1542.c,v 1.1 1992/07/24 06:27:38 root Exp root $
2 * linux/kernel/aha1542.c
3 *
4 * Copyright (C) 1992 Tommy Thorn
5 * Copyright (C) 1993, 1994, 1995 Eric Youngdale
6 *
7 * Modified by Eric Youngdale
8 * Use request_irq and request_dma to help prevent unexpected conflicts
9 * Set up on-board DMA controller, such that we do not have to
10 * have the bios enabled to use the aha1542.
11 * Modified by David Gentzel
12 * Don't call request_dma if dma mask is 0 (for BusLogic BT-445S VL-Bus
13 * controller).
14 * Modified by Matti Aarnio
15 * Accept parameters from LILO cmd-line. -- 1-Oct-94
16 * Modified by Mike McLagan <mike.mclagan@linux.org>
17 * Recognise extended mode on AHA1542CP, different bit than 1542CF
18 * 1-Jan-97
19 * Modified by Bjorn L. Thordarson and Einar Thor Einarsson
20 * Recognize that DMA0 is valid DMA channel -- 13-Jul-98
21 * Modified by Chris Faulhaber <jedgar@fxp.org>
22 * Added module command-line options
23 * 19-Jul-99
24 * Modified by Adam Fritzler <mid@auk.cx>
25 * Added proper detection of the AHA-1640 (MCA version of AHA-1540)
26 */
27
Linus Torvalds1da177e2005-04-16 15:20:36 -070028#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>
Linus Torvalds1da177e2005-04-16 15:20:36 -070038#include <linux/isapnp.h>
39#include <linux/blkdev.h>
40#include <linux/mca.h>
41#include <linux/mca-legacy.h>
42
43#include <asm/dma.h>
44#include <asm/system.h>
45#include <asm/io.h>
46
47#include "scsi.h"
48#include <scsi/scsi_host.h>
49#include "aha1542.h"
50
51#define SCSI_BUF_PA(address) isa_virt_to_bus(address)
52#define SCSI_SG_PA(sgent) (isa_page_to_bus((sgent)->page) + (sgent)->offset)
53
54static void BAD_DMA(void *address, unsigned int length)
55{
56 printk(KERN_CRIT "buf vaddress %p paddress 0x%lx length %d\n",
57 address,
58 SCSI_BUF_PA(address),
59 length);
60 panic("Buffer at physical address > 16Mb used for aha1542");
61}
62
63static void BAD_SG_DMA(Scsi_Cmnd * SCpnt,
64 struct scatterlist *sgpnt,
65 int nseg,
66 int badseg)
67{
68 printk(KERN_CRIT "sgpnt[%d:%d] page %p/0x%llx length %u\n",
69 badseg, nseg,
70 page_address(sgpnt[badseg].page) + sgpnt[badseg].offset,
71 (unsigned long long)SCSI_SG_PA(&sgpnt[badseg]),
72 sgpnt[badseg].length);
73
74 /*
75 * Not safe to continue.
76 */
77 panic("Buffer at physical address > 16Mb used for aha1542");
78}
79
80#include<linux/stat.h>
81
82#ifdef DEBUG
83#define DEB(x) x
84#else
85#define DEB(x)
86#endif
87
88/*
89 static const char RCSid[] = "$Header: /usr/src/linux/kernel/blk_drv/scsi/RCS/aha1542.c,v 1.1 1992/07/24 06:27:38 root Exp root $";
90 */
91
92/* The adaptec can be configured for quite a number of addresses, but
93 I generally do not want the card poking around at random. We allow
94 two addresses - this allows people to use the Adaptec with a Midi
95 card, which also used 0x330 -- can be overridden with LILO! */
96
97#define MAXBOARDS 4 /* Increase this and the sizes of the
98 arrays below, if you need more.. */
99
100/* Boards 3,4 slots are reserved for ISAPnP/MCA scans */
101
102static unsigned int bases[MAXBOARDS] __initdata = {0x330, 0x334, 0, 0};
103
104/* set by aha1542_setup according to the command line; they also may
105 be marked __initdata, but require zero initializers then */
106
107static int setup_called[MAXBOARDS];
108static int setup_buson[MAXBOARDS];
109static int setup_busoff[MAXBOARDS];
110static int setup_dmaspeed[MAXBOARDS] __initdata = { -1, -1, -1, -1 };
111
112/*
113 * LILO/Module params: aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]
114 *
115 * Where: <PORTBASE> is any of the valid AHA addresses:
116 * 0x130, 0x134, 0x230, 0x234, 0x330, 0x334
117 * <BUSON> is the time (in microsecs) that AHA spends on the AT-bus
118 * when transferring data. 1542A power-on default is 11us,
119 * valid values are in range: 2..15 (decimal)
120 * <BUSOFF> is the time that AHA spends OFF THE BUS after while
121 * it is transferring data (not to monopolize the bus).
122 * Power-on default is 4us, valid range: 1..64 microseconds.
123 * <DMASPEED> Default is jumper selected (1542A: on the J1),
124 * but experimenter can alter it with this.
125 * Valid values: 5, 6, 7, 8, 10 (MB/s)
126 * Factory default is 5 MB/s.
127 */
128
129#if defined(MODULE)
130static int isapnp = 0;
131static int aha1542[] = {0x330, 11, 4, -1};
132module_param_array(aha1542, int, NULL, 0);
133module_param(isapnp, bool, 0);
134
135static struct isapnp_device_id id_table[] __initdata = {
136 {
137 ISAPNP_ANY_ID, ISAPNP_ANY_ID,
138 ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1542),
139 0
140 },
141 {0}
142};
143
144MODULE_DEVICE_TABLE(isapnp, id_table);
145
146#else
147static int isapnp = 1;
148#endif
149
150#define BIOS_TRANSLATION_1632 0 /* Used by some old 1542A boards */
151#define BIOS_TRANSLATION_6432 1 /* Default case these days */
152#define BIOS_TRANSLATION_25563 2 /* Big disk case */
153
154struct aha1542_hostdata {
155 /* This will effectively start both of them at the first mailbox */
156 int bios_translation; /* Mapping bios uses - for compatibility */
157 int aha1542_last_mbi_used;
158 int aha1542_last_mbo_used;
159 Scsi_Cmnd *SCint[AHA1542_MAILBOXES];
160 struct mailbox mb[2 * AHA1542_MAILBOXES];
161 struct ccb ccb[AHA1542_MAILBOXES];
162};
163
164#define HOSTDATA(host) ((struct aha1542_hostdata *) &host->hostdata)
165
166static struct Scsi_Host *aha_host[7]; /* One for each IRQ level (9-15) */
167
168static DEFINE_SPINLOCK(aha1542_lock);
169
170
171
172#define WAITnexttimeout 3000000
173
174static void setup_mailboxes(int base_io, struct Scsi_Host *shpnt);
175static int aha1542_restart(struct Scsi_Host *shost);
David Howells7d12e782006-10-05 14:55:46 +0100176static void aha1542_intr_handle(struct Scsi_Host *shost, void *dev_id);
177static irqreturn_t do_aha1542_intr_handle(int irq, void *dev_id);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178
179#define aha1542_intr_reset(base) outb(IRST, CONTROL(base))
180
181#define WAIT(port, mask, allof, noneof) \
182 { register int WAITbits; \
183 register int WAITtimeout = WAITnexttimeout; \
184 while (1) { \
185 WAITbits = inb(port) & (mask); \
186 if ((WAITbits & (allof)) == (allof) && ((WAITbits & (noneof)) == 0)) \
187 break; \
188 if (--WAITtimeout == 0) goto fail; \
189 } \
190 }
191
192/* Similar to WAIT, except we use the udelay call to regulate the
193 amount of time we wait. */
194#define WAITd(port, mask, allof, noneof, timeout) \
195 { register int WAITbits; \
196 register int WAITtimeout = timeout; \
197 while (1) { \
198 WAITbits = inb(port) & (mask); \
199 if ((WAITbits & (allof)) == (allof) && ((WAITbits & (noneof)) == 0)) \
200 break; \
201 mdelay(1); \
202 if (--WAITtimeout == 0) goto fail; \
203 } \
204 }
205
206static void aha1542_stat(void)
207{
208/* int s = inb(STATUS), i = inb(INTRFLAGS);
209 printk("status=%x intrflags=%x\n", s, i, WAITnexttimeout-WAITtimeout); */
210}
211
212/* This is a bit complicated, but we need to make sure that an interrupt
213 routine does not send something out while we are in the middle of this.
214 Fortunately, it is only at boot time that multi-byte messages
215 are ever sent. */
216static int aha1542_out(unsigned int base, unchar * cmdp, int len)
217{
218 unsigned long flags = 0;
219 int got_lock;
220
221 if (len == 1) {
222 got_lock = 0;
223 while (1 == 1) {
224 WAIT(STATUS(base), CDF, 0, CDF);
225 spin_lock_irqsave(&aha1542_lock, flags);
226 if (inb(STATUS(base)) & CDF) {
227 spin_unlock_irqrestore(&aha1542_lock, flags);
228 continue;
229 }
230 outb(*cmdp, DATA(base));
231 spin_unlock_irqrestore(&aha1542_lock, flags);
232 return 0;
233 }
234 } else {
235 spin_lock_irqsave(&aha1542_lock, flags);
236 got_lock = 1;
237 while (len--) {
238 WAIT(STATUS(base), CDF, 0, CDF);
239 outb(*cmdp++, DATA(base));
240 }
241 spin_unlock_irqrestore(&aha1542_lock, flags);
242 }
243 return 0;
244fail:
245 if (got_lock)
246 spin_unlock_irqrestore(&aha1542_lock, flags);
247 printk(KERN_ERR "aha1542_out failed(%d): ", len + 1);
248 aha1542_stat();
249 return 1;
250}
251
252/* Only used at boot time, so we do not need to worry about latency as much
253 here */
254
255static int __init aha1542_in(unsigned int base, unchar * cmdp, int len)
256{
257 unsigned long flags;
258
259 spin_lock_irqsave(&aha1542_lock, flags);
260 while (len--) {
261 WAIT(STATUS(base), DF, DF, 0);
262 *cmdp++ = inb(DATA(base));
263 }
264 spin_unlock_irqrestore(&aha1542_lock, flags);
265 return 0;
266fail:
267 spin_unlock_irqrestore(&aha1542_lock, flags);
268 printk(KERN_ERR "aha1542_in failed(%d): ", len + 1);
269 aha1542_stat();
270 return 1;
271}
272
273/* Similar to aha1542_in, except that we wait a very short period of time.
274 We use this if we know the board is alive and awake, but we are not sure
275 if the board will respond to the command we are about to send or not */
276static int __init aha1542_in1(unsigned int base, unchar * cmdp, int len)
277{
278 unsigned long flags;
279
280 spin_lock_irqsave(&aha1542_lock, flags);
281 while (len--) {
282 WAITd(STATUS(base), DF, DF, 0, 100);
283 *cmdp++ = inb(DATA(base));
284 }
285 spin_unlock_irqrestore(&aha1542_lock, flags);
286 return 0;
287fail:
288 spin_unlock_irqrestore(&aha1542_lock, flags);
289 return 1;
290}
291
292static int makecode(unsigned hosterr, unsigned scsierr)
293{
294 switch (hosterr) {
295 case 0x0:
296 case 0xa: /* Linked command complete without error and linked normally */
297 case 0xb: /* Linked command complete without error, interrupt generated */
298 hosterr = 0;
299 break;
300
301 case 0x11: /* Selection time out-The initiator selection or target
302 reselection was not complete within the SCSI Time out period */
303 hosterr = DID_TIME_OUT;
304 break;
305
306 case 0x12: /* Data overrun/underrun-The target attempted to transfer more data
307 than was allocated by the Data Length field or the sum of the
308 Scatter / Gather Data Length fields. */
309
310 case 0x13: /* Unexpected bus free-The target dropped the SCSI BSY at an unexpected time. */
311
312 case 0x15: /* MBO command was not 00, 01 or 02-The first byte of the CB was
313 invalid. This usually indicates a software failure. */
314
315 case 0x16: /* Invalid CCB Operation Code-The first byte of the CCB was invalid.
316 This usually indicates a software failure. */
317
318 case 0x17: /* Linked CCB does not have the same LUN-A subsequent CCB of a set
319 of linked CCB's does not specify the same logical unit number as
320 the first. */
321 case 0x18: /* Invalid Target Direction received from Host-The direction of a
322 Target Mode CCB was invalid. */
323
324 case 0x19: /* Duplicate CCB Received in Target Mode-More than once CCB was
325 received to service data transfer between the same target LUN
326 and initiator SCSI ID in the same direction. */
327
328 case 0x1a: /* Invalid CCB or Segment List Parameter-A segment list with a zero
329 length segment or invalid segment list boundaries was received.
330 A CCB parameter was invalid. */
331 DEB(printk("Aha1542: %x %x\n", hosterr, scsierr));
332 hosterr = DID_ERROR; /* Couldn't find any better */
333 break;
334
335 case 0x14: /* Target bus phase sequence failure-An invalid bus phase or bus
336 phase sequence was requested by the target. The host adapter
337 will generate a SCSI Reset Condition, notifying the host with
338 a SCRD interrupt */
339 hosterr = DID_RESET;
340 break;
341 default:
342 printk(KERN_ERR "aha1542: makecode: unknown hoststatus %x\n", hosterr);
343 break;
344 }
345 return scsierr | (hosterr << 16);
346}
347
348static int __init aha1542_test_port(int bse, struct Scsi_Host *shpnt)
349{
350 unchar inquiry_cmd[] = {CMD_INQUIRY};
351 unchar inquiry_result[4];
352 unchar *cmdp;
353 int len;
354 volatile int debug = 0;
355
356 /* Quick and dirty test for presence of the card. */
357 if (inb(STATUS(bse)) == 0xff)
358 return 0;
359
360 /* Reset the adapter. I ought to make a hard reset, but it's not really necessary */
361
362 /* DEB(printk("aha1542_test_port called \n")); */
363
364 /* In case some other card was probing here, reset interrupts */
365 aha1542_intr_reset(bse); /* reset interrupts, so they don't block */
366
367 outb(SRST | IRST /*|SCRST */ , CONTROL(bse));
368
369 mdelay(20); /* Wait a little bit for things to settle down. */
370
371 debug = 1;
372 /* Expect INIT and IDLE, any of the others are bad */
373 WAIT(STATUS(bse), STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
374
375 debug = 2;
376 /* Shouldn't have generated any interrupts during reset */
377 if (inb(INTRFLAGS(bse)) & INTRMASK)
378 goto fail;
379
380
381 /* Perform a host adapter inquiry instead so we do not need to set
382 up the mailboxes ahead of time */
383
384 aha1542_out(bse, inquiry_cmd, 1);
385
386 debug = 3;
387 len = 4;
388 cmdp = &inquiry_result[0];
389
390 while (len--) {
391 WAIT(STATUS(bse), DF, DF, 0);
392 *cmdp++ = inb(DATA(bse));
393 }
394
395 debug = 8;
396 /* Reading port should reset DF */
397 if (inb(STATUS(bse)) & DF)
398 goto fail;
399
400 debug = 9;
401 /* When HACC, command is completed, and we're though testing */
402 WAIT(INTRFLAGS(bse), HACC, HACC, 0);
403 /* now initialize adapter */
404
405 debug = 10;
406 /* Clear interrupts */
407 outb(IRST, CONTROL(bse));
408
409 debug = 11;
410
411 return debug; /* 1 = ok */
412fail:
413 return 0; /* 0 = not ok */
414}
415
416/* A quick wrapper for do_aha1542_intr_handle to grab the spin lock */
David Howells7d12e782006-10-05 14:55:46 +0100417static irqreturn_t do_aha1542_intr_handle(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700418{
419 unsigned long flags;
420 struct Scsi_Host *shost;
421
422 shost = aha_host[irq - 9];
423 if (!shost)
424 panic("Splunge!");
425
426 spin_lock_irqsave(shost->host_lock, flags);
David Howells7d12e782006-10-05 14:55:46 +0100427 aha1542_intr_handle(shost, dev_id);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428 spin_unlock_irqrestore(shost->host_lock, flags);
429 return IRQ_HANDLED;
430}
431
432/* A "high" level interrupt handler */
David Howells7d12e782006-10-05 14:55:46 +0100433static void aha1542_intr_handle(struct Scsi_Host *shost, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700434{
435 void (*my_done) (Scsi_Cmnd *) = NULL;
436 int errstatus, mbi, mbo, mbistatus;
437 int number_serviced;
438 unsigned long flags;
439 Scsi_Cmnd *SCtmp;
440 int flag;
441 int needs_restart;
442 struct mailbox *mb;
443 struct ccb *ccb;
444
445 mb = HOSTDATA(shost)->mb;
446 ccb = HOSTDATA(shost)->ccb;
447
448#ifdef DEBUG
449 {
450 flag = inb(INTRFLAGS(shost->io_port));
451 printk(KERN_DEBUG "aha1542_intr_handle: ");
452 if (!(flag & ANYINTR))
453 printk("no interrupt?");
454 if (flag & MBIF)
455 printk("MBIF ");
456 if (flag & MBOA)
457 printk("MBOF ");
458 if (flag & HACC)
459 printk("HACC ");
460 if (flag & SCRD)
461 printk("SCRD ");
462 printk("status %02x\n", inb(STATUS(shost->io_port)));
463 };
464#endif
465 number_serviced = 0;
466 needs_restart = 0;
467
468 while (1 == 1) {
469 flag = inb(INTRFLAGS(shost->io_port));
470
471 /* Check for unusual interrupts. If any of these happen, we should
472 probably do something special, but for now just printing a message
473 is sufficient. A SCSI reset detected is something that we really
474 need to deal with in some way. */
475 if (flag & ~MBIF) {
476 if (flag & MBOA)
477 printk("MBOF ");
478 if (flag & HACC)
479 printk("HACC ");
480 if (flag & SCRD) {
481 needs_restart = 1;
482 printk("SCRD ");
483 }
484 }
485 aha1542_intr_reset(shost->io_port);
486
487 spin_lock_irqsave(&aha1542_lock, flags);
488 mbi = HOSTDATA(shost)->aha1542_last_mbi_used + 1;
489 if (mbi >= 2 * AHA1542_MAILBOXES)
490 mbi = AHA1542_MAILBOXES;
491
492 do {
493 if (mb[mbi].status != 0)
494 break;
495 mbi++;
496 if (mbi >= 2 * AHA1542_MAILBOXES)
497 mbi = AHA1542_MAILBOXES;
498 } while (mbi != HOSTDATA(shost)->aha1542_last_mbi_used);
499
500 if (mb[mbi].status == 0) {
501 spin_unlock_irqrestore(&aha1542_lock, flags);
502 /* Hmm, no mail. Must have read it the last time around */
503 if (!number_serviced && !needs_restart)
504 printk(KERN_WARNING "aha1542.c: interrupt received, but no mail.\n");
505 /* We detected a reset. Restart all pending commands for
506 devices that use the hard reset option */
507 if (needs_restart)
508 aha1542_restart(shost);
509 return;
510 };
511
512 mbo = (scsi2int(mb[mbi].ccbptr) - (SCSI_BUF_PA(&ccb[0]))) / sizeof(struct ccb);
513 mbistatus = mb[mbi].status;
514 mb[mbi].status = 0;
515 HOSTDATA(shost)->aha1542_last_mbi_used = mbi;
516 spin_unlock_irqrestore(&aha1542_lock, flags);
517
518#ifdef DEBUG
519 {
520 if (ccb[mbo].tarstat | ccb[mbo].hastat)
521 printk(KERN_DEBUG "aha1542_command: returning %x (status %d)\n",
522 ccb[mbo].tarstat + ((int) ccb[mbo].hastat << 16), mb[mbi].status);
523 };
524#endif
525
526 if (mbistatus == 3)
527 continue; /* Aborted command not found */
528
529#ifdef DEBUG
530 printk(KERN_DEBUG "...done %d %d\n", mbo, mbi);
531#endif
532
533 SCtmp = HOSTDATA(shost)->SCint[mbo];
534
535 if (!SCtmp || !SCtmp->scsi_done) {
536 printk(KERN_WARNING "aha1542_intr_handle: Unexpected interrupt\n");
537 printk(KERN_WARNING "tarstat=%x, hastat=%x idlun=%x ccb#=%d \n", ccb[mbo].tarstat,
538 ccb[mbo].hastat, ccb[mbo].idlun, mbo);
539 return;
540 }
541 my_done = SCtmp->scsi_done;
Jesper Juhlc9475cb2005-11-07 01:01:26 -0800542 kfree(SCtmp->host_scribble);
543 SCtmp->host_scribble = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700544 /* Fetch the sense data, and tuck it away, in the required slot. The
545 Adaptec automatically fetches it, and there is no guarantee that
546 we will still have it in the cdb when we come back */
547 if (ccb[mbo].tarstat == 2)
548 memcpy(SCtmp->sense_buffer, &ccb[mbo].cdb[ccb[mbo].cdblen],
549 sizeof(SCtmp->sense_buffer));
550
551
552 /* is there mail :-) */
553
554 /* more error checking left out here */
555 if (mbistatus != 1)
556 /* This is surely wrong, but I don't know what's right */
557 errstatus = makecode(ccb[mbo].hastat, ccb[mbo].tarstat);
558 else
559 errstatus = 0;
560
561#ifdef DEBUG
562 if (errstatus)
563 printk(KERN_DEBUG "(aha1542 error:%x %x %x) ", errstatus,
564 ccb[mbo].hastat, ccb[mbo].tarstat);
565#endif
566
567 if (ccb[mbo].tarstat == 2) {
568#ifdef DEBUG
569 int i;
570#endif
571 DEB(printk("aha1542_intr_handle: sense:"));
572#ifdef DEBUG
573 for (i = 0; i < 12; i++)
574 printk("%02x ", ccb[mbo].cdb[ccb[mbo].cdblen + i]);
575 printk("\n");
576#endif
577 /*
578 DEB(printk("aha1542_intr_handle: buf:"));
579 for (i = 0; i < bufflen; i++)
580 printk("%02x ", ((unchar *)buff)[i]);
581 printk("\n");
582 */
583 }
584 DEB(if (errstatus) printk("aha1542_intr_handle: returning %6x\n", errstatus));
585 SCtmp->result = errstatus;
586 HOSTDATA(shost)->SCint[mbo] = NULL; /* This effectively frees up the mailbox slot, as
587 far as queuecommand is concerned */
588 my_done(SCtmp);
589 number_serviced++;
590 };
591}
592
593static int aha1542_queuecommand(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *))
594{
595 unchar ahacmd = CMD_START_SCSI;
596 unchar direction;
597 unchar *cmd = (unchar *) SCpnt->cmnd;
598 unchar target = SCpnt->device->id;
599 unchar lun = SCpnt->device->lun;
600 unsigned long flags;
601 void *buff = SCpnt->request_buffer;
602 int bufflen = SCpnt->request_bufflen;
603 int mbo;
604 struct mailbox *mb;
605 struct ccb *ccb;
606
607 DEB(int i);
608
609 mb = HOSTDATA(SCpnt->device->host)->mb;
610 ccb = HOSTDATA(SCpnt->device->host)->ccb;
611
612 DEB(if (target > 1) {
613 SCpnt->result = DID_TIME_OUT << 16;
614 done(SCpnt); return 0;
615 }
616 );
617
618 if (*cmd == REQUEST_SENSE) {
619 /* Don't do the command - we have the sense data already */
620#if 0
621 /* scsi_request_sense() provides a buffer of size 256,
622 so there is no reason to expect equality */
623 if (bufflen != sizeof(SCpnt->sense_buffer))
624 printk(KERN_CRIT "aha1542: Wrong buffer length supplied "
625 "for request sense (%d)\n", bufflen);
626#endif
627 SCpnt->result = 0;
628 done(SCpnt);
629 return 0;
630 }
631#ifdef DEBUG
632 if (*cmd == READ_10 || *cmd == WRITE_10)
633 i = xscsi2int(cmd + 2);
634 else if (*cmd == READ_6 || *cmd == WRITE_6)
635 i = scsi2int(cmd + 2);
636 else
637 i = -1;
638 if (done)
639 printk(KERN_DEBUG "aha1542_queuecommand: dev %d cmd %02x pos %d len %d ", target, *cmd, i, bufflen);
640 else
641 printk(KERN_DEBUG "aha1542_command: dev %d cmd %02x pos %d len %d ", target, *cmd, i, bufflen);
642 aha1542_stat();
643 printk(KERN_DEBUG "aha1542_queuecommand: dumping scsi cmd:");
644 for (i = 0; i < SCpnt->cmd_len; i++)
645 printk("%02x ", cmd[i]);
646 printk("\n");
647 if (*cmd == WRITE_10 || *cmd == WRITE_6)
648 return 0; /* we are still testing, so *don't* write */
649#endif
650 /* Use the outgoing mailboxes in a round-robin fashion, because this
651 is how the host adapter will scan for them */
652
653 spin_lock_irqsave(&aha1542_lock, flags);
654 mbo = HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used + 1;
655 if (mbo >= AHA1542_MAILBOXES)
656 mbo = 0;
657
658 do {
659 if (mb[mbo].status == 0 && HOSTDATA(SCpnt->device->host)->SCint[mbo] == NULL)
660 break;
661 mbo++;
662 if (mbo >= AHA1542_MAILBOXES)
663 mbo = 0;
664 } while (mbo != HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used);
665
666 if (mb[mbo].status || HOSTDATA(SCpnt->device->host)->SCint[mbo])
667 panic("Unable to find empty mailbox for aha1542.\n");
668
669 HOSTDATA(SCpnt->device->host)->SCint[mbo] = SCpnt; /* This will effectively prevent someone else from
670 screwing with this cdb. */
671
672 HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used = mbo;
673 spin_unlock_irqrestore(&aha1542_lock, flags);
674
675#ifdef DEBUG
676 printk(KERN_DEBUG "Sending command (%d %x)...", mbo, done);
677#endif
678
679 any2scsi(mb[mbo].ccbptr, SCSI_BUF_PA(&ccb[mbo])); /* This gets trashed for some reason */
680
681 memset(&ccb[mbo], 0, sizeof(struct ccb));
682
683 ccb[mbo].cdblen = SCpnt->cmd_len;
684
685 direction = 0;
686 if (*cmd == READ_10 || *cmd == READ_6)
687 direction = 8;
688 else if (*cmd == WRITE_10 || *cmd == WRITE_6)
689 direction = 16;
690
691 memcpy(ccb[mbo].cdb, cmd, ccb[mbo].cdblen);
692
693 if (SCpnt->use_sg) {
694 struct scatterlist *sgpnt;
695 struct chain *cptr;
696#ifdef DEBUG
697 unsigned char *ptr;
698#endif
699 int i;
700 ccb[mbo].op = 2; /* SCSI Initiator Command w/scatter-gather */
Robert P. J. Day5cbded52006-12-13 00:35:56 -0800701 SCpnt->host_scribble = kmalloc(512, GFP_KERNEL | GFP_DMA);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702 sgpnt = (struct scatterlist *) SCpnt->request_buffer;
703 cptr = (struct chain *) SCpnt->host_scribble;
704 if (cptr == NULL) {
705 /* free the claimed mailbox slot */
706 HOSTDATA(SCpnt->device->host)->SCint[mbo] = NULL;
707 return SCSI_MLQUEUE_HOST_BUSY;
708 }
709 for (i = 0; i < SCpnt->use_sg; i++) {
710 if (sgpnt[i].length == 0 || SCpnt->use_sg > 16 ||
711 (((int) sgpnt[i].offset) & 1) || (sgpnt[i].length & 1)) {
712 unsigned char *ptr;
713 printk(KERN_CRIT "Bad segment list supplied to aha1542.c (%d, %d)\n", SCpnt->use_sg, i);
714 for (i = 0; i < SCpnt->use_sg; i++) {
715 printk(KERN_CRIT "%d: %p %d\n", i,
716 (page_address(sgpnt[i].page) +
717 sgpnt[i].offset),
718 sgpnt[i].length);
719 };
720 printk(KERN_CRIT "cptr %x: ", (unsigned int) cptr);
721 ptr = (unsigned char *) &cptr[i];
722 for (i = 0; i < 18; i++)
723 printk("%02x ", ptr[i]);
724 panic("Foooooooood fight!");
725 };
726 any2scsi(cptr[i].dataptr, SCSI_SG_PA(&sgpnt[i]));
727 if (SCSI_SG_PA(&sgpnt[i]) + sgpnt[i].length - 1 > ISA_DMA_THRESHOLD)
728 BAD_SG_DMA(SCpnt, sgpnt, SCpnt->use_sg, i);
729 any2scsi(cptr[i].datalen, sgpnt[i].length);
730 };
731 any2scsi(ccb[mbo].datalen, SCpnt->use_sg * sizeof(struct chain));
732 any2scsi(ccb[mbo].dataptr, SCSI_BUF_PA(cptr));
733#ifdef DEBUG
734 printk("cptr %x: ", cptr);
735 ptr = (unsigned char *) cptr;
736 for (i = 0; i < 18; i++)
737 printk("%02x ", ptr[i]);
738#endif
739 } else {
740 ccb[mbo].op = 0; /* SCSI Initiator Command */
741 SCpnt->host_scribble = NULL;
742 any2scsi(ccb[mbo].datalen, bufflen);
743 if (buff && SCSI_BUF_PA(buff + bufflen - 1) > ISA_DMA_THRESHOLD)
744 BAD_DMA(buff, bufflen);
745 any2scsi(ccb[mbo].dataptr, SCSI_BUF_PA(buff));
746 };
747 ccb[mbo].idlun = (target & 7) << 5 | direction | (lun & 7); /*SCSI Target Id */
748 ccb[mbo].rsalen = 16;
749 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
750 ccb[mbo].commlinkid = 0;
751
752#ifdef DEBUG
753 {
754 int i;
755 printk(KERN_DEBUG "aha1542_command: sending.. ");
756 for (i = 0; i < sizeof(ccb[mbo]) - 10; i++)
757 printk("%02x ", ((unchar *) & ccb[mbo])[i]);
758 };
759#endif
760
761 if (done) {
762 DEB(printk("aha1542_queuecommand: now waiting for interrupt ");
763 aha1542_stat());
764 SCpnt->scsi_done = done;
765 mb[mbo].status = 1;
766 aha1542_out(SCpnt->device->host->io_port, &ahacmd, 1); /* start scsi command */
767 DEB(aha1542_stat());
768 } else
769 printk("aha1542_queuecommand: done can't be NULL\n");
770
771 return 0;
772}
773
774/* Initialize mailboxes */
775static void setup_mailboxes(int bse, struct Scsi_Host *shpnt)
776{
777 int i;
778 struct mailbox *mb;
779 struct ccb *ccb;
780
781 unchar cmd[5] = { CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0};
782
783 mb = HOSTDATA(shpnt)->mb;
784 ccb = HOSTDATA(shpnt)->ccb;
785
786 for (i = 0; i < AHA1542_MAILBOXES; i++) {
787 mb[i].status = mb[AHA1542_MAILBOXES + i].status = 0;
788 any2scsi(mb[i].ccbptr, SCSI_BUF_PA(&ccb[i]));
789 };
790 aha1542_intr_reset(bse); /* reset interrupts, so they don't block */
791 any2scsi((cmd + 2), SCSI_BUF_PA(mb));
792 aha1542_out(bse, cmd, 5);
793 WAIT(INTRFLAGS(bse), INTRMASK, HACC, 0);
794 while (0) {
795fail:
796 printk(KERN_ERR "aha1542_detect: failed setting up mailboxes\n");
797 }
798 aha1542_intr_reset(bse);
799}
800
801static int __init aha1542_getconfig(int base_io, unsigned char *irq_level, unsigned char *dma_chan, unsigned char *scsi_id)
802{
803 unchar inquiry_cmd[] = {CMD_RETCONF};
804 unchar inquiry_result[3];
805 int i;
806 i = inb(STATUS(base_io));
807 if (i & DF) {
808 i = inb(DATA(base_io));
809 };
810 aha1542_out(base_io, inquiry_cmd, 1);
811 aha1542_in(base_io, inquiry_result, 3);
812 WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
813 while (0) {
814fail:
815 printk(KERN_ERR "aha1542_detect: query board settings\n");
816 }
817 aha1542_intr_reset(base_io);
818 switch (inquiry_result[0]) {
819 case 0x80:
820 *dma_chan = 7;
821 break;
822 case 0x40:
823 *dma_chan = 6;
824 break;
825 case 0x20:
826 *dma_chan = 5;
827 break;
828 case 0x01:
829 *dma_chan = 0;
830 break;
831 case 0:
832 /* This means that the adapter, although Adaptec 1542 compatible, doesn't use a DMA channel.
833 Currently only aware of the BusLogic BT-445S VL-Bus adapter which needs this. */
834 *dma_chan = 0xFF;
835 break;
836 default:
837 printk(KERN_ERR "Unable to determine Adaptec DMA priority. Disabling board\n");
838 return -1;
839 };
840 switch (inquiry_result[1]) {
841 case 0x40:
842 *irq_level = 15;
843 break;
844 case 0x20:
845 *irq_level = 14;
846 break;
847 case 0x8:
848 *irq_level = 12;
849 break;
850 case 0x4:
851 *irq_level = 11;
852 break;
853 case 0x2:
854 *irq_level = 10;
855 break;
856 case 0x1:
857 *irq_level = 9;
858 break;
859 default:
860 printk(KERN_ERR "Unable to determine Adaptec IRQ level. Disabling board\n");
861 return -1;
862 };
863 *scsi_id = inquiry_result[2] & 7;
864 return 0;
865}
866
867/* This function should only be called for 1542C boards - we can detect
868 the special firmware settings and unlock the board */
869
870static int __init aha1542_mbenable(int base)
871{
872 static unchar mbenable_cmd[3];
873 static unchar mbenable_result[2];
874 int retval;
875
876 retval = BIOS_TRANSLATION_6432;
877
878 mbenable_cmd[0] = CMD_EXTBIOS;
879 aha1542_out(base, mbenable_cmd, 1);
880 if (aha1542_in1(base, mbenable_result, 2))
881 return retval;
882 WAITd(INTRFLAGS(base), INTRMASK, HACC, 0, 100);
883 aha1542_intr_reset(base);
884
885 if ((mbenable_result[0] & 0x08) || mbenable_result[1]) {
886 mbenable_cmd[0] = CMD_MBENABLE;
887 mbenable_cmd[1] = 0;
888 mbenable_cmd[2] = mbenable_result[1];
889
890 if ((mbenable_result[0] & 0x08) && (mbenable_result[1] & 0x03))
891 retval = BIOS_TRANSLATION_25563;
892
893 aha1542_out(base, mbenable_cmd, 3);
894 WAIT(INTRFLAGS(base), INTRMASK, HACC, 0);
895 };
896 while (0) {
897fail:
898 printk(KERN_ERR "aha1542_mbenable: Mailbox init failed\n");
899 }
900 aha1542_intr_reset(base);
901 return retval;
902}
903
904/* Query the board to find out if it is a 1542 or a 1740, or whatever. */
905static int __init aha1542_query(int base_io, int *transl)
906{
907 unchar inquiry_cmd[] = {CMD_INQUIRY};
908 unchar inquiry_result[4];
909 int i;
910 i = inb(STATUS(base_io));
911 if (i & DF) {
912 i = inb(DATA(base_io));
913 };
914 aha1542_out(base_io, inquiry_cmd, 1);
915 aha1542_in(base_io, inquiry_result, 4);
916 WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
917 while (0) {
918fail:
919 printk(KERN_ERR "aha1542_detect: query card type\n");
920 }
921 aha1542_intr_reset(base_io);
922
923 *transl = BIOS_TRANSLATION_6432; /* Default case */
924
925 /* For an AHA1740 series board, we ignore the board since there is a
926 hardware bug which can lead to wrong blocks being returned if the board
927 is operating in the 1542 emulation mode. Since there is an extended mode
928 driver, we simply ignore the board and let the 1740 driver pick it up.
929 */
930
931 if (inquiry_result[0] == 0x43) {
932 printk(KERN_INFO "aha1542.c: Emulation mode not supported for AHA 174N hardware.\n");
933 return 1;
934 };
935
936 /* Always call this - boards that do not support extended bios translation
937 will ignore the command, and we will set the proper default */
938
939 *transl = aha1542_mbenable(base_io);
940
941 return 0;
942}
943
944#ifndef MODULE
945static char *setup_str[MAXBOARDS] __initdata;
946static int setup_idx = 0;
947
948static void __init aha1542_setup(char *str, int *ints)
949{
950 const char *ahausage = "aha1542: usage: aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]\n";
951 int setup_portbase;
952
953 if (setup_idx >= MAXBOARDS) {
954 printk(KERN_ERR "aha1542: aha1542_setup called too many times! Bad LILO params ?\n");
955 printk(KERN_ERR " Entryline 1: %s\n", setup_str[0]);
956 printk(KERN_ERR " Entryline 2: %s\n", setup_str[1]);
957 printk(KERN_ERR " This line: %s\n", str);
958 return;
959 }
960 if (ints[0] < 1 || ints[0] > 4) {
961 printk(KERN_ERR "aha1542: %s\n", str);
962 printk(ahausage);
963 printk(KERN_ERR "aha1542: Wrong parameters may cause system malfunction.. We try anyway..\n");
964 }
965 setup_called[setup_idx] = ints[0];
966 setup_str[setup_idx] = str;
967
968 setup_portbase = ints[0] >= 1 ? ints[1] : 0; /* Preserve the default value.. */
969 setup_buson[setup_idx] = ints[0] >= 2 ? ints[2] : 7;
970 setup_busoff[setup_idx] = ints[0] >= 3 ? ints[3] : 5;
971 if (ints[0] >= 4)
972 {
973 int atbt = -1;
974 switch (ints[4]) {
975 case 5:
976 atbt = 0x00;
977 break;
978 case 6:
979 atbt = 0x04;
980 break;
981 case 7:
982 atbt = 0x01;
983 break;
984 case 8:
985 atbt = 0x02;
986 break;
987 case 10:
988 atbt = 0x03;
989 break;
990 default:
991 printk(KERN_ERR "aha1542: %s\n", str);
992 printk(ahausage);
993 printk(KERN_ERR "aha1542: Valid values for DMASPEED are 5-8, 10 MB/s. Using jumper defaults.\n");
994 break;
995 }
996 setup_dmaspeed[setup_idx] = atbt;
997 }
998 if (setup_portbase != 0)
999 bases[setup_idx] = setup_portbase;
1000
1001 ++setup_idx;
1002}
1003
1004static int __init do_setup(char *str)
1005{
1006 int ints[5];
1007
1008 int count=setup_idx;
1009
Tobias Klauser6391a112006-06-08 22:23:48 -07001010 get_options(str, ARRAY_SIZE(ints), ints);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001011 aha1542_setup(str,ints);
1012
1013 return count<setup_idx;
1014}
1015
1016__setup("aha1542=",do_setup);
1017#endif
1018
1019/* return non-zero on detection */
Christoph Hellwigd0be4a7d2005-10-31 18:31:40 +01001020static int __init aha1542_detect(struct scsi_host_template * tpnt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001021{
1022 unsigned char dma_chan;
1023 unsigned char irq_level;
1024 unsigned char scsi_id;
1025 unsigned long flags;
1026 unsigned int base_io;
1027 int trans;
1028 struct Scsi_Host *shpnt = NULL;
1029 int count = 0;
1030 int indx;
1031
1032 DEB(printk("aha1542_detect: \n"));
1033
1034 tpnt->proc_name = "aha1542";
1035
1036#ifdef MODULE
1037 bases[0] = aha1542[0];
1038 setup_buson[0] = aha1542[1];
1039 setup_busoff[0] = aha1542[2];
1040 {
1041 int atbt = -1;
1042 switch (aha1542[3]) {
1043 case 5:
1044 atbt = 0x00;
1045 break;
1046 case 6:
1047 atbt = 0x04;
1048 break;
1049 case 7:
1050 atbt = 0x01;
1051 break;
1052 case 8:
1053 atbt = 0x02;
1054 break;
1055 case 10:
1056 atbt = 0x03;
1057 break;
1058 };
1059 setup_dmaspeed[0] = atbt;
1060 }
1061#endif
1062
1063 /*
1064 * Find MicroChannel cards (AHA1640)
1065 */
1066#ifdef CONFIG_MCA_LEGACY
1067 if(MCA_bus) {
1068 int slot = 0;
1069 int pos = 0;
1070
Tobias Klauser6391a112006-06-08 22:23:48 -07001071 for (indx = 0; (slot != MCA_NOTFOUND) && (indx < ARRAY_SIZE(bases)); indx++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001072
1073 if (bases[indx])
1074 continue;
1075
1076 /* Detect only AHA-1640 cards -- MCA ID 0F1F */
1077 slot = mca_find_unused_adapter(0x0f1f, slot);
1078 if (slot == MCA_NOTFOUND)
1079 break;
1080
Linus Torvalds1da177e2005-04-16 15:20:36 -07001081 /* Found one */
1082 pos = mca_read_stored_pos(slot, 3);
Tobias Klauser6391a112006-06-08 22:23:48 -07001083
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084 /* Decode address */
1085 if (pos & 0x80) {
1086 if (pos & 0x02) {
1087 if (pos & 0x01)
1088 bases[indx] = 0x334;
1089 else
1090 bases[indx] = 0x234;
1091 } else {
1092 if (pos & 0x01)
1093 bases[indx] = 0x134;
1094 }
1095 } else {
1096 if (pos & 0x02) {
1097 if (pos & 0x01)
1098 bases[indx] = 0x330;
1099 else
1100 bases[indx] = 0x230;
1101 } else {
1102 if (pos & 0x01)
1103 bases[indx] = 0x130;
1104 }
1105 }
1106
1107 /* No need to decode IRQ and Arb level -- those are
1108 * read off the card later.
1109 */
1110 printk(KERN_INFO "Found an AHA-1640 in MCA slot %d, I/O 0x%04x\n", slot, bases[indx]);
1111
1112 mca_set_adapter_name(slot, "Adapter AHA-1640");
1113 mca_set_adapter_procfn(slot, NULL, NULL);
1114 mca_mark_as_used(slot);
Tobias Klauser6391a112006-06-08 22:23:48 -07001115
Linus Torvalds1da177e2005-04-16 15:20:36 -07001116 /* Go on */
1117 slot++;
1118 }
Tobias Klauser6391a112006-06-08 22:23:48 -07001119
Linus Torvalds1da177e2005-04-16 15:20:36 -07001120 }
1121#endif
1122
1123 /*
1124 * Hunt for ISA Plug'n'Pray Adaptecs (AHA1535)
1125 */
Tobias Klauser6391a112006-06-08 22:23:48 -07001126
Linus Torvalds1da177e2005-04-16 15:20:36 -07001127 if(isapnp)
1128 {
1129 struct pnp_dev *pdev = NULL;
Tobias Klauser6391a112006-06-08 22:23:48 -07001130 for(indx = 0; indx < ARRAY_SIZE(bases); indx++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001131 if(bases[indx])
1132 continue;
1133 pdev = pnp_find_dev(NULL, ISAPNP_VENDOR('A', 'D', 'P'),
1134 ISAPNP_FUNCTION(0x1542), pdev);
1135 if(pdev==NULL)
1136 break;
1137 /*
1138 * Activate the PnP card
1139 */
Tobias Klauser6391a112006-06-08 22:23:48 -07001140
Linus Torvalds1da177e2005-04-16 15:20:36 -07001141 if(pnp_device_attach(pdev)<0)
1142 continue;
Tobias Klauser6391a112006-06-08 22:23:48 -07001143
Linus Torvalds1da177e2005-04-16 15:20:36 -07001144 if(pnp_activate_dev(pdev)<0) {
1145 pnp_device_detach(pdev);
1146 continue;
1147 }
Tobias Klauser6391a112006-06-08 22:23:48 -07001148
Linus Torvalds1da177e2005-04-16 15:20:36 -07001149 if(!pnp_port_valid(pdev, 0)) {
1150 pnp_device_detach(pdev);
1151 continue;
1152 }
Tobias Klauser6391a112006-06-08 22:23:48 -07001153
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154 bases[indx] = pnp_port_start(pdev, 0);
Tobias Klauser6391a112006-06-08 22:23:48 -07001155
Linus Torvalds1da177e2005-04-16 15:20:36 -07001156 /* The card can be queried for its DMA, we have
1157 the DMA set up that is enough */
Tobias Klauser6391a112006-06-08 22:23:48 -07001158
Linus Torvalds1da177e2005-04-16 15:20:36 -07001159 printk(KERN_INFO "ISAPnP found an AHA1535 at I/O 0x%03X\n", bases[indx]);
1160 }
1161 }
Tobias Klauser6391a112006-06-08 22:23:48 -07001162 for (indx = 0; indx < ARRAY_SIZE(bases); indx++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163 if (bases[indx] != 0 && request_region(bases[indx], 4, "aha1542")) {
1164 shpnt = scsi_register(tpnt,
1165 sizeof(struct aha1542_hostdata));
1166
1167 if(shpnt==NULL) {
1168 release_region(bases[indx], 4);
1169 continue;
1170 }
1171 /* For now we do this - until kmalloc is more intelligent
1172 we are resigned to stupid hacks like this */
1173 if (SCSI_BUF_PA(shpnt) >= ISA_DMA_THRESHOLD) {
1174 printk(KERN_ERR "Invalid address for shpnt with 1542.\n");
1175 goto unregister;
1176 }
1177 if (!aha1542_test_port(bases[indx], shpnt))
1178 goto unregister;
1179
1180
1181 base_io = bases[indx];
1182
1183 /* Set the Bus on/off-times as not to ruin floppy performance */
1184 {
1185 unchar oncmd[] = {CMD_BUSON_TIME, 7};
1186 unchar offcmd[] = {CMD_BUSOFF_TIME, 5};
1187
1188 if (setup_called[indx]) {
1189 oncmd[1] = setup_buson[indx];
1190 offcmd[1] = setup_busoff[indx];
1191 }
1192 aha1542_intr_reset(base_io);
1193 aha1542_out(base_io, oncmd, 2);
1194 WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
1195 aha1542_intr_reset(base_io);
1196 aha1542_out(base_io, offcmd, 2);
1197 WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
1198 if (setup_dmaspeed[indx] >= 0) {
1199 unchar dmacmd[] = {CMD_DMASPEED, 0};
1200 dmacmd[1] = setup_dmaspeed[indx];
1201 aha1542_intr_reset(base_io);
1202 aha1542_out(base_io, dmacmd, 2);
1203 WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
1204 }
1205 while (0) {
1206fail:
1207 printk(KERN_ERR "aha1542_detect: setting bus on/off-time failed\n");
1208 }
1209 aha1542_intr_reset(base_io);
1210 }
1211 if (aha1542_query(base_io, &trans))
1212 goto unregister;
1213
1214 if (aha1542_getconfig(base_io, &irq_level, &dma_chan, &scsi_id) == -1)
1215 goto unregister;
1216
1217 printk(KERN_INFO "Configuring Adaptec (SCSI-ID %d) at IO:%x, IRQ %d", scsi_id, base_io, irq_level);
1218 if (dma_chan != 0xFF)
1219 printk(", DMA priority %d", dma_chan);
1220 printk("\n");
1221
1222 DEB(aha1542_stat());
1223 setup_mailboxes(base_io, shpnt);
1224
1225 DEB(aha1542_stat());
1226
1227 DEB(printk("aha1542_detect: enable interrupt channel %d\n", irq_level));
1228 spin_lock_irqsave(&aha1542_lock, flags);
1229 if (request_irq(irq_level, do_aha1542_intr_handle, 0, "aha1542", NULL)) {
1230 printk(KERN_ERR "Unable to allocate IRQ for adaptec controller.\n");
1231 spin_unlock_irqrestore(&aha1542_lock, flags);
1232 goto unregister;
1233 }
1234 if (dma_chan != 0xFF) {
1235 if (request_dma(dma_chan, "aha1542")) {
1236 printk(KERN_ERR "Unable to allocate DMA channel for Adaptec.\n");
1237 free_irq(irq_level, NULL);
1238 spin_unlock_irqrestore(&aha1542_lock, flags);
1239 goto unregister;
1240 }
1241 if (dma_chan == 0 || dma_chan >= 5) {
1242 set_dma_mode(dma_chan, DMA_MODE_CASCADE);
1243 enable_dma(dma_chan);
1244 }
1245 }
1246 aha_host[irq_level - 9] = shpnt;
1247 shpnt->this_id = scsi_id;
1248 shpnt->unique_id = base_io;
1249 shpnt->io_port = base_io;
1250 shpnt->n_io_port = 4; /* Number of bytes of I/O space used */
1251 shpnt->dma_channel = dma_chan;
1252 shpnt->irq = irq_level;
1253 HOSTDATA(shpnt)->bios_translation = trans;
1254 if (trans == BIOS_TRANSLATION_25563)
1255 printk(KERN_INFO "aha1542.c: Using extended bios translation\n");
1256 HOSTDATA(shpnt)->aha1542_last_mbi_used = (2 * AHA1542_MAILBOXES - 1);
1257 HOSTDATA(shpnt)->aha1542_last_mbo_used = (AHA1542_MAILBOXES - 1);
1258 memset(HOSTDATA(shpnt)->SCint, 0, sizeof(HOSTDATA(shpnt)->SCint));
1259 spin_unlock_irqrestore(&aha1542_lock, flags);
1260#if 0
1261 DEB(printk(" *** READ CAPACITY ***\n"));
1262
1263 {
1264 unchar buf[8];
1265 static unchar cmd[] = { READ_CAPACITY, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1266 int i;
1267
1268 for (i = 0; i < sizeof(buf); ++i)
1269 buf[i] = 0x87;
1270 for (i = 0; i < 2; ++i)
1271 if (!aha1542_command(i, cmd, buf, sizeof(buf))) {
1272 printk(KERN_DEBUG "aha_detect: LU %d sector_size %d device_size %d\n",
1273 i, xscsi2int(buf + 4), xscsi2int(buf));
1274 }
1275 }
1276
1277 DEB(printk(" *** NOW RUNNING MY OWN TEST *** \n"));
1278
1279 for (i = 0; i < 4; ++i) {
1280 unsigned char cmd[10];
1281 static buffer[512];
1282
1283 cmd[0] = READ_10;
1284 cmd[1] = 0;
1285 xany2scsi(cmd + 2, i);
1286 cmd[6] = 0;
1287 cmd[7] = 0;
1288 cmd[8] = 1;
1289 cmd[9] = 0;
1290 aha1542_command(0, cmd, buffer, 512);
1291 }
1292#endif
1293 count++;
1294 continue;
1295unregister:
1296 release_region(bases[indx], 4);
1297 scsi_unregister(shpnt);
1298 continue;
1299
1300 };
1301
1302 return count;
1303}
1304
1305static int aha1542_release(struct Scsi_Host *shost)
1306{
1307 if (shost->irq)
1308 free_irq(shost->irq, NULL);
1309 if (shost->dma_channel != 0xff)
1310 free_dma(shost->dma_channel);
1311 if (shost->io_port && shost->n_io_port)
1312 release_region(shost->io_port, shost->n_io_port);
1313 scsi_unregister(shost);
1314 return 0;
1315}
1316
1317static int aha1542_restart(struct Scsi_Host *shost)
1318{
1319 int i;
1320 int count = 0;
1321#if 0
1322 unchar ahacmd = CMD_START_SCSI;
1323#endif
1324
1325 for (i = 0; i < AHA1542_MAILBOXES; i++)
1326 if (HOSTDATA(shost)->SCint[i] &&
1327 !(HOSTDATA(shost)->SCint[i]->device->soft_reset)) {
1328#if 0
1329 HOSTDATA(shost)->mb[i].status = 1; /* Indicate ready to restart... */
1330#endif
1331 count++;
1332 }
1333 printk(KERN_DEBUG "Potential to restart %d stalled commands...\n", count);
1334#if 0
1335 /* start scsi command */
1336 if (count)
1337 aha1542_out(shost->io_port, &ahacmd, 1);
1338#endif
1339 return 0;
1340}
1341
Linus Torvalds1da177e2005-04-16 15:20:36 -07001342/*
1343 * This is a device reset. This is handled by sending a special command
1344 * to the device.
1345 */
1346static int aha1542_dev_reset(Scsi_Cmnd * SCpnt)
1347{
1348 unsigned long flags;
1349 struct mailbox *mb;
1350 unchar target = SCpnt->device->id;
1351 unchar lun = SCpnt->device->lun;
1352 int mbo;
1353 struct ccb *ccb;
1354 unchar ahacmd = CMD_START_SCSI;
1355
1356 ccb = HOSTDATA(SCpnt->device->host)->ccb;
1357 mb = HOSTDATA(SCpnt->device->host)->mb;
1358
1359 spin_lock_irqsave(&aha1542_lock, flags);
1360 mbo = HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used + 1;
1361 if (mbo >= AHA1542_MAILBOXES)
1362 mbo = 0;
1363
1364 do {
1365 if (mb[mbo].status == 0 && HOSTDATA(SCpnt->device->host)->SCint[mbo] == NULL)
1366 break;
1367 mbo++;
1368 if (mbo >= AHA1542_MAILBOXES)
1369 mbo = 0;
1370 } while (mbo != HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used);
1371
1372 if (mb[mbo].status || HOSTDATA(SCpnt->device->host)->SCint[mbo])
1373 panic("Unable to find empty mailbox for aha1542.\n");
1374
1375 HOSTDATA(SCpnt->device->host)->SCint[mbo] = SCpnt; /* This will effectively
1376 prevent someone else from
1377 screwing with this cdb. */
1378
1379 HOSTDATA(SCpnt->device->host)->aha1542_last_mbo_used = mbo;
1380 spin_unlock_irqrestore(&aha1542_lock, flags);
1381
1382 any2scsi(mb[mbo].ccbptr, SCSI_BUF_PA(&ccb[mbo])); /* This gets trashed for some reason */
1383
1384 memset(&ccb[mbo], 0, sizeof(struct ccb));
1385
1386 ccb[mbo].op = 0x81; /* BUS DEVICE RESET */
1387
1388 ccb[mbo].idlun = (target & 7) << 5 | (lun & 7); /*SCSI Target Id */
1389
1390 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
1391 ccb[mbo].commlinkid = 0;
1392
1393 /*
1394 * Now tell the 1542 to flush all pending commands for this
1395 * target
1396 */
1397 aha1542_out(SCpnt->device->host->io_port, &ahacmd, 1);
1398
Jeff Garzik017560f2005-10-24 18:04:36 -04001399 scmd_printk(KERN_WARNING, SCpnt,
1400 "Trying device reset for target\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001401
1402 return SUCCESS;
1403
1404
1405#ifdef ERIC_neverdef
1406 /*
1407 * With the 1542 we apparently never get an interrupt to
1408 * acknowledge a device reset being sent. Then again, Leonard
1409 * says we are doing this wrong in the first place...
1410 *
1411 * Take a wait and see attitude. If we get spurious interrupts,
1412 * then the device reset is doing something sane and useful, and
1413 * we will wait for the interrupt to post completion.
1414 */
1415 printk(KERN_WARNING "Sent BUS DEVICE RESET to target %d\n", SCpnt->target);
1416
1417 /*
1418 * Free the command block for all commands running on this
1419 * target...
1420 */
1421 for (i = 0; i < AHA1542_MAILBOXES; i++) {
1422 if (HOSTDATA(SCpnt->host)->SCint[i] &&
1423 HOSTDATA(SCpnt->host)->SCint[i]->target == SCpnt->target) {
1424 Scsi_Cmnd *SCtmp;
1425 SCtmp = HOSTDATA(SCpnt->host)->SCint[i];
Jesper Juhlc9475cb2005-11-07 01:01:26 -08001426 kfree(SCtmp->host_scribble);
1427 SCtmp->host_scribble = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001428 HOSTDATA(SCpnt->host)->SCint[i] = NULL;
1429 HOSTDATA(SCpnt->host)->mb[i].status = 0;
1430 }
1431 }
1432 return SUCCESS;
1433
1434 return FAILED;
1435#endif /* ERIC_neverdef */
1436}
1437
1438static int aha1542_bus_reset(Scsi_Cmnd * SCpnt)
1439{
1440 int i;
1441
1442 /*
1443 * This does a scsi reset for all devices on the bus.
1444 * In principle, we could also reset the 1542 - should
1445 * we do this? Try this first, and we can add that later
1446 * if it turns out to be useful.
1447 */
1448 outb(SCRST, CONTROL(SCpnt->device->host->io_port));
1449
1450 /*
1451 * Wait for the thing to settle down a bit. Unfortunately
1452 * this is going to basically lock up the machine while we
1453 * wait for this to complete. To be 100% correct, we need to
1454 * check for timeout, and if we are doing something like this
1455 * we are pretty desperate anyways.
1456 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001457 ssleep(4);
Jeff Garzik 68b3aa72005-05-28 07:56:31 -04001458
Linus Torvalds1da177e2005-04-16 15:20:36 -07001459 spin_lock_irq(SCpnt->device->host->host_lock);
1460
1461 WAIT(STATUS(SCpnt->device->host->io_port),
1462 STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
1463
1464 /*
1465 * Now try to pick up the pieces. For all pending commands,
1466 * free any internal data structures, and basically clear things
1467 * out. We do not try and restart any commands or anything -
1468 * the strategy handler takes care of that crap.
1469 */
1470 printk(KERN_WARNING "Sent BUS RESET to scsi host %d\n", SCpnt->device->host->host_no);
1471
1472 for (i = 0; i < AHA1542_MAILBOXES; i++) {
1473 if (HOSTDATA(SCpnt->device->host)->SCint[i] != NULL) {
1474 Scsi_Cmnd *SCtmp;
1475 SCtmp = HOSTDATA(SCpnt->device->host)->SCint[i];
1476
1477
1478 if (SCtmp->device->soft_reset) {
1479 /*
1480 * If this device implements the soft reset option,
1481 * then it is still holding onto the command, and
1482 * may yet complete it. In this case, we don't
1483 * flush the data.
1484 */
1485 continue;
1486 }
Jesper Juhlc9475cb2005-11-07 01:01:26 -08001487 kfree(SCtmp->host_scribble);
1488 SCtmp->host_scribble = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001489 HOSTDATA(SCpnt->device->host)->SCint[i] = NULL;
1490 HOSTDATA(SCpnt->device->host)->mb[i].status = 0;
1491 }
1492 }
1493
Jeff Garzik 68b3aa72005-05-28 07:56:31 -04001494 spin_unlock_irq(SCpnt->device->host->host_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001495 return SUCCESS;
1496
1497fail:
Jeff Garzik 68b3aa72005-05-28 07:56:31 -04001498 spin_unlock_irq(SCpnt->device->host->host_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499 return FAILED;
1500}
1501
1502static int aha1542_host_reset(Scsi_Cmnd * SCpnt)
1503{
1504 int i;
1505
1506 /*
1507 * This does a scsi reset for all devices on the bus.
1508 * In principle, we could also reset the 1542 - should
1509 * we do this? Try this first, and we can add that later
1510 * if it turns out to be useful.
1511 */
1512 outb(HRST | SCRST, CONTROL(SCpnt->device->host->io_port));
1513
1514 /*
1515 * Wait for the thing to settle down a bit. Unfortunately
1516 * this is going to basically lock up the machine while we
1517 * wait for this to complete. To be 100% correct, we need to
1518 * check for timeout, and if we are doing something like this
1519 * we are pretty desperate anyways.
1520 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001521 ssleep(4);
1522 spin_lock_irq(SCpnt->device->host->host_lock);
1523
1524 WAIT(STATUS(SCpnt->device->host->io_port),
1525 STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
1526
1527 /*
1528 * We need to do this too before the 1542 can interact with
1529 * us again.
1530 */
1531 setup_mailboxes(SCpnt->device->host->io_port, SCpnt->device->host);
1532
1533 /*
1534 * Now try to pick up the pieces. For all pending commands,
1535 * free any internal data structures, and basically clear things
1536 * out. We do not try and restart any commands or anything -
1537 * the strategy handler takes care of that crap.
1538 */
1539 printk(KERN_WARNING "Sent BUS RESET to scsi host %d\n", SCpnt->device->host->host_no);
1540
1541 for (i = 0; i < AHA1542_MAILBOXES; i++) {
1542 if (HOSTDATA(SCpnt->device->host)->SCint[i] != NULL) {
1543 Scsi_Cmnd *SCtmp;
1544 SCtmp = HOSTDATA(SCpnt->device->host)->SCint[i];
1545
1546 if (SCtmp->device->soft_reset) {
1547 /*
1548 * If this device implements the soft reset option,
1549 * then it is still holding onto the command, and
1550 * may yet complete it. In this case, we don't
1551 * flush the data.
1552 */
1553 continue;
1554 }
Jesper Juhlc9475cb2005-11-07 01:01:26 -08001555 kfree(SCtmp->host_scribble);
1556 SCtmp->host_scribble = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001557 HOSTDATA(SCpnt->device->host)->SCint[i] = NULL;
1558 HOSTDATA(SCpnt->device->host)->mb[i].status = 0;
1559 }
1560 }
1561
Jeff Garzik df0ae242005-05-28 07:57:14 -04001562 spin_unlock_irq(SCpnt->device->host->host_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001563 return SUCCESS;
1564
1565fail:
Jeff Garzik df0ae242005-05-28 07:57:14 -04001566 spin_unlock_irq(SCpnt->device->host->host_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001567 return FAILED;
1568}
1569
1570#if 0
1571/*
1572 * These are the old error handling routines. They are only temporarily
1573 * here while we play with the new error handling code.
1574 */
1575static int aha1542_old_abort(Scsi_Cmnd * SCpnt)
1576{
1577#if 0
1578 unchar ahacmd = CMD_START_SCSI;
1579 unsigned long flags;
1580 struct mailbox *mb;
1581 int mbi, mbo, i;
1582
1583 printk(KERN_DEBUG "In aha1542_abort: %x %x\n",
1584 inb(STATUS(SCpnt->host->io_port)),
1585 inb(INTRFLAGS(SCpnt->host->io_port)));
1586
1587 spin_lock_irqsave(&aha1542_lock, flags);
1588 mb = HOSTDATA(SCpnt->host)->mb;
1589 mbi = HOSTDATA(SCpnt->host)->aha1542_last_mbi_used + 1;
1590 if (mbi >= 2 * AHA1542_MAILBOXES)
1591 mbi = AHA1542_MAILBOXES;
1592
1593 do {
1594 if (mb[mbi].status != 0)
1595 break;
1596 mbi++;
1597 if (mbi >= 2 * AHA1542_MAILBOXES)
1598 mbi = AHA1542_MAILBOXES;
1599 } while (mbi != HOSTDATA(SCpnt->host)->aha1542_last_mbi_used);
1600 spin_unlock_irqrestore(&aha1542_lock, flags);
1601
1602 if (mb[mbi].status) {
1603 printk(KERN_ERR "Lost interrupt discovered on irq %d - attempting to recover\n",
1604 SCpnt->host->irq);
1605 aha1542_intr_handle(SCpnt->host, NULL);
1606 return 0;
1607 }
1608 /* OK, no lost interrupt. Try looking to see how many pending commands
1609 we think we have. */
1610
1611 for (i = 0; i < AHA1542_MAILBOXES; i++)
1612 if (HOSTDATA(SCpnt->host)->SCint[i]) {
1613 if (HOSTDATA(SCpnt->host)->SCint[i] == SCpnt) {
1614 printk(KERN_ERR "Timed out command pending for %s\n",
1615 SCpnt->request->rq_disk ?
1616 SCpnt->request->rq_disk->disk_name : "?"
1617 );
1618 if (HOSTDATA(SCpnt->host)->mb[i].status) {
1619 printk(KERN_ERR "OGMB still full - restarting\n");
1620 aha1542_out(SCpnt->host->io_port, &ahacmd, 1);
1621 };
1622 } else
1623 printk(KERN_ERR "Other pending command %s\n",
1624 SCpnt->request->rq_disk ?
1625 SCpnt->request->rq_disk->disk_name : "?"
1626 );
1627 }
1628#endif
1629
1630 DEB(printk("aha1542_abort\n"));
1631#if 0
1632 spin_lock_irqsave(&aha1542_lock, flags);
1633 for (mbo = 0; mbo < AHA1542_MAILBOXES; mbo++) {
1634 if (SCpnt == HOSTDATA(SCpnt->host)->SCint[mbo]) {
1635 mb[mbo].status = 2; /* Abort command */
1636 aha1542_out(SCpnt->host->io_port, &ahacmd, 1); /* start scsi command */
1637 spin_unlock_irqrestore(&aha1542_lock, flags);
1638 break;
1639 }
1640 }
1641 if (AHA1542_MAILBOXES == mbo)
1642 spin_unlock_irqrestore(&aha1542_lock, flags);
1643#endif
1644 return SCSI_ABORT_SNOOZE;
1645}
1646
1647/* We do not implement a reset function here, but the upper level code
1648 assumes that it will get some kind of response for the command in
1649 SCpnt. We must oblige, or the command will hang the scsi system.
1650 For a first go, we assume that the 1542 notifies us with all of the
1651 pending commands (it does implement soft reset, after all). */
1652
1653static int aha1542_old_reset(Scsi_Cmnd * SCpnt, unsigned int reset_flags)
1654{
1655 unchar ahacmd = CMD_START_SCSI;
1656 int i;
1657
1658 /*
1659 * See if a bus reset was suggested.
1660 */
1661 if (reset_flags & SCSI_RESET_SUGGEST_BUS_RESET) {
1662 /*
1663 * This does a scsi reset for all devices on the bus.
1664 * In principle, we could also reset the 1542 - should
1665 * we do this? Try this first, and we can add that later
1666 * if it turns out to be useful.
1667 */
1668 outb(HRST | SCRST, CONTROL(SCpnt->host->io_port));
1669
1670 /*
1671 * Wait for the thing to settle down a bit. Unfortunately
1672 * this is going to basically lock up the machine while we
1673 * wait for this to complete. To be 100% correct, we need to
1674 * check for timeout, and if we are doing something like this
1675 * we are pretty desperate anyways.
1676 */
1677 WAIT(STATUS(SCpnt->host->io_port),
1678 STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
1679
1680 /*
1681 * We need to do this too before the 1542 can interact with
1682 * us again.
1683 */
1684 setup_mailboxes(SCpnt->host->io_port, SCpnt->host);
1685
1686 /*
1687 * Now try to pick up the pieces. Restart all commands
1688 * that are currently active on the bus, and reset all of
1689 * the datastructures. We have some time to kill while
1690 * things settle down, so print a nice message.
1691 */
1692 printk(KERN_WARNING "Sent BUS RESET to scsi host %d\n", SCpnt->host->host_no);
1693
1694 for (i = 0; i < AHA1542_MAILBOXES; i++)
1695 if (HOSTDATA(SCpnt->host)->SCint[i] != NULL) {
1696 Scsi_Cmnd *SCtmp;
1697 SCtmp = HOSTDATA(SCpnt->host)->SCint[i];
1698 SCtmp->result = DID_RESET << 16;
Jesper Juhlc9475cb2005-11-07 01:01:26 -08001699 kfree(SCtmp->host_scribble);
1700 SCtmp->host_scribble = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001701 printk(KERN_WARNING "Sending DID_RESET for target %d\n", SCpnt->target);
1702 SCtmp->scsi_done(SCpnt);
1703
1704 HOSTDATA(SCpnt->host)->SCint[i] = NULL;
1705 HOSTDATA(SCpnt->host)->mb[i].status = 0;
1706 }
1707 /*
1708 * Now tell the mid-level code what we did here. Since
1709 * we have restarted all of the outstanding commands,
1710 * then report SUCCESS.
1711 */
1712 return (SCSI_RESET_SUCCESS | SCSI_RESET_BUS_RESET);
1713fail:
1714 printk(KERN_CRIT "aha1542.c: Unable to perform hard reset.\n");
1715 printk(KERN_CRIT "Power cycle machine to reset\n");
1716 return (SCSI_RESET_ERROR | SCSI_RESET_BUS_RESET);
1717
1718
1719 } else {
1720 /* This does a selective reset of just the one device */
1721 /* First locate the ccb for this command */
1722 for (i = 0; i < AHA1542_MAILBOXES; i++)
1723 if (HOSTDATA(SCpnt->host)->SCint[i] == SCpnt) {
1724 HOSTDATA(SCpnt->host)->ccb[i].op = 0x81; /* BUS DEVICE RESET */
1725 /* Now tell the 1542 to flush all pending commands for this target */
1726 aha1542_out(SCpnt->host->io_port, &ahacmd, 1);
1727
1728 /* Here is the tricky part. What to do next. Do we get an interrupt
1729 for the commands that we aborted with the specified target, or
1730 do we generate this on our own? Try it without first and see
1731 what happens */
1732 printk(KERN_WARNING "Sent BUS DEVICE RESET to target %d\n", SCpnt->target);
1733
1734 /* If the first does not work, then try the second. I think the
1735 first option is more likely to be correct. Free the command
1736 block for all commands running on this target... */
1737 for (i = 0; i < AHA1542_MAILBOXES; i++)
1738 if (HOSTDATA(SCpnt->host)->SCint[i] &&
1739 HOSTDATA(SCpnt->host)->SCint[i]->target == SCpnt->target) {
1740 Scsi_Cmnd *SCtmp;
1741 SCtmp = HOSTDATA(SCpnt->host)->SCint[i];
1742 SCtmp->result = DID_RESET << 16;
Jesper Juhlc9475cb2005-11-07 01:01:26 -08001743 kfree(SCtmp->host_scribble);
1744 SCtmp->host_scribble = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745 printk(KERN_WARNING "Sending DID_RESET for target %d\n", SCpnt->target);
1746 SCtmp->scsi_done(SCpnt);
1747
1748 HOSTDATA(SCpnt->host)->SCint[i] = NULL;
1749 HOSTDATA(SCpnt->host)->mb[i].status = 0;
1750 }
1751 return SCSI_RESET_SUCCESS;
1752 }
1753 }
1754 /* No active command at this time, so this means that each time we got
1755 some kind of response the last time through. Tell the mid-level code
1756 to request sense information in order to decide what to do next. */
1757 return SCSI_RESET_PUNT;
1758}
1759#endif /* end of big comment block around old_abort + old_reset */
1760
1761static int aha1542_biosparam(struct scsi_device *sdev,
1762 struct block_device *bdev, sector_t capacity, int *ip)
1763{
1764 int translation_algorithm;
1765 int size = capacity;
1766
1767 translation_algorithm = HOSTDATA(sdev->host)->bios_translation;
1768
1769 if ((size >> 11) > 1024 && translation_algorithm == BIOS_TRANSLATION_25563) {
1770 /* Please verify that this is the same as what DOS returns */
1771 ip[0] = 255;
1772 ip[1] = 63;
1773 ip[2] = size / 255 / 63;
1774 } else {
1775 ip[0] = 64;
1776 ip[1] = 32;
1777 ip[2] = size >> 11;
1778 }
1779
1780 return 0;
1781}
1782MODULE_LICENSE("GPL");
1783
1784
Christoph Hellwigd0be4a7d2005-10-31 18:31:40 +01001785static struct scsi_host_template driver_template = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001786 .proc_name = "aha1542",
1787 .name = "Adaptec 1542",
1788 .detect = aha1542_detect,
1789 .release = aha1542_release,
1790 .queuecommand = aha1542_queuecommand,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001791 .eh_device_reset_handler= aha1542_dev_reset,
1792 .eh_bus_reset_handler = aha1542_bus_reset,
1793 .eh_host_reset_handler = aha1542_host_reset,
1794 .bios_param = aha1542_biosparam,
1795 .can_queue = AHA1542_MAILBOXES,
1796 .this_id = 7,
1797 .sg_tablesize = AHA1542_SCATTER,
1798 .cmd_per_lun = AHA1542_CMDLUN,
1799 .unchecked_isa_dma = 1,
1800 .use_clustering = ENABLE_CLUSTERING,
1801};
1802#include "scsi_module.c"