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