xref: /openbmc/linux/drivers/scsi/aha1542.c (revision 64c70b1c)
1 /* $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 
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 
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 
54 static 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 
63 static 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 
102 static 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 
107 static int setup_called[MAXBOARDS];
108 static int setup_buson[MAXBOARDS];
109 static int setup_busoff[MAXBOARDS];
110 static 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)
130 static int isapnp = 0;
131 static int aha1542[] = {0x330, 11, 4, -1};
132 module_param_array(aha1542, int, NULL, 0);
133 module_param(isapnp, bool, 0);
134 
135 static 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 
144 MODULE_DEVICE_TABLE(isapnp, id_table);
145 
146 #else
147 static 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 
154 struct 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 
166 static struct Scsi_Host *aha_host[7];	/* One for each IRQ level (9-15) */
167 
168 static DEFINE_SPINLOCK(aha1542_lock);
169 
170 
171 
172 #define WAITnexttimeout 3000000
173 
174 static void setup_mailboxes(int base_io, struct Scsi_Host *shpnt);
175 static int aha1542_restart(struct Scsi_Host *shost);
176 static void aha1542_intr_handle(struct Scsi_Host *shost, void *dev_id);
177 static irqreturn_t do_aha1542_intr_handle(int irq, void *dev_id);
178 
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 
206 static 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. */
216 static 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;
244 fail:
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 
255 static 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;
266 fail:
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 */
276 static 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;
287 fail:
288 	spin_unlock_irqrestore(&aha1542_lock, flags);
289 	return 1;
290 }
291 
292 static 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 
348 static 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 */
412 fail:
413 	return 0;		/* 0 = not ok */
414 }
415 
416 /* A quick wrapper for do_aha1542_intr_handle to grab the spin lock */
417 static irqreturn_t do_aha1542_intr_handle(int irq, void *dev_id)
418 {
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);
427 	aha1542_intr_handle(shost, dev_id);
428 	spin_unlock_irqrestore(shost->host_lock, flags);
429 	return IRQ_HANDLED;
430 }
431 
432 /* A "high" level interrupt handler */
433 static void aha1542_intr_handle(struct Scsi_Host *shost, void *dev_id)
434 {
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;
542 		kfree(SCtmp->host_scribble);
543 		SCtmp->host_scribble = NULL;
544 		/* 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 
593 static 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 */
701 		SCpnt->host_scribble = kmalloc(512, GFP_KERNEL | GFP_DMA);
702 		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 */
775 static 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) {
795 fail:
796 		printk(KERN_ERR "aha1542_detect: failed setting up mailboxes\n");
797 	}
798 	aha1542_intr_reset(bse);
799 }
800 
801 static 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) {
814 fail:
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 
870 static 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) {
897 fail:
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. */
905 static 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) {
918 fail:
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
945 static char *setup_str[MAXBOARDS] __initdata;
946 static int setup_idx = 0;
947 
948 static 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 
1004 static int __init do_setup(char *str)
1005 {
1006 	int ints[5];
1007 
1008 	int count=setup_idx;
1009 
1010 	get_options(str, ARRAY_SIZE(ints), ints);
1011 	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 */
1020 static int __init aha1542_detect(struct scsi_host_template * tpnt)
1021 {
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 
1071 		for (indx = 0; (slot != MCA_NOTFOUND) && (indx < ARRAY_SIZE(bases)); indx++) {
1072 
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 
1081 			/* Found one */
1082 			pos = mca_read_stored_pos(slot, 3);
1083 
1084 			/* 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);
1115 
1116 			/* Go on */
1117 			slot++;
1118 		}
1119 
1120 	}
1121 #endif
1122 
1123 	/*
1124 	 *	Hunt for ISA Plug'n'Pray Adaptecs (AHA1535)
1125 	 */
1126 
1127 	if(isapnp)
1128 	{
1129 		struct pnp_dev *pdev = NULL;
1130 		for(indx = 0; indx < ARRAY_SIZE(bases); indx++) {
1131 			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 			 */
1140 
1141 			if(pnp_device_attach(pdev)<0)
1142 				continue;
1143 
1144 			if(pnp_activate_dev(pdev)<0) {
1145 				pnp_device_detach(pdev);
1146 				continue;
1147 			}
1148 
1149 			if(!pnp_port_valid(pdev, 0)) {
1150 				pnp_device_detach(pdev);
1151 				continue;
1152 			}
1153 
1154 			bases[indx] = pnp_port_start(pdev, 0);
1155 
1156 			/* The card can be queried for its DMA, we have
1157 			   the DMA set up that is enough */
1158 
1159 			printk(KERN_INFO "ISAPnP found an AHA1535 at I/O 0x%03X\n", bases[indx]);
1160 		}
1161 	}
1162 	for (indx = 0; indx < ARRAY_SIZE(bases); indx++)
1163 		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) {
1206 fail:
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;
1295 unregister:
1296 			release_region(bases[indx], 4);
1297 			scsi_unregister(shpnt);
1298 			continue;
1299 
1300 		};
1301 
1302 	return count;
1303 }
1304 
1305 static 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 
1317 static 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 
1342 /*
1343  * This is a device reset.  This is handled by sending a special command
1344  * to the device.
1345  */
1346 static 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 
1399 	scmd_printk(KERN_WARNING, SCpnt,
1400 		"Trying device reset for target\n");
1401 
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];
1426 			kfree(SCtmp->host_scribble);
1427 			SCtmp->host_scribble = NULL;
1428 			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 
1438 static 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 	 */
1457 	ssleep(4);
1458 
1459 	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 			}
1487 			kfree(SCtmp->host_scribble);
1488 			SCtmp->host_scribble = NULL;
1489 			HOSTDATA(SCpnt->device->host)->SCint[i] = NULL;
1490 			HOSTDATA(SCpnt->device->host)->mb[i].status = 0;
1491 		}
1492 	}
1493 
1494 	spin_unlock_irq(SCpnt->device->host->host_lock);
1495 	return SUCCESS;
1496 
1497 fail:
1498 	spin_unlock_irq(SCpnt->device->host->host_lock);
1499 	return FAILED;
1500 }
1501 
1502 static 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 	 */
1521 	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 			}
1555 			kfree(SCtmp->host_scribble);
1556 			SCtmp->host_scribble = NULL;
1557 			HOSTDATA(SCpnt->device->host)->SCint[i] = NULL;
1558 			HOSTDATA(SCpnt->device->host)->mb[i].status = 0;
1559 		}
1560 	}
1561 
1562 	spin_unlock_irq(SCpnt->device->host->host_lock);
1563 	return SUCCESS;
1564 
1565 fail:
1566 	spin_unlock_irq(SCpnt->device->host->host_lock);
1567 	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  */
1575 static 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 
1653 static 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;
1699 				kfree(SCtmp->host_scribble);
1700 				SCtmp->host_scribble = NULL;
1701 				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);
1713 fail:
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;
1743 						kfree(SCtmp->host_scribble);
1744 						SCtmp->host_scribble = NULL;
1745 						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 
1761 static 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 }
1782 MODULE_LICENSE("GPL");
1783 
1784 
1785 static struct scsi_host_template driver_template = {
1786 	.proc_name		= "aha1542",
1787 	.name			= "Adaptec 1542",
1788 	.detect			= aha1542_detect,
1789 	.release		= aha1542_release,
1790 	.queuecommand		= aha1542_queuecommand,
1791 	.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"
1803