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