Linux Audio

Check our new training course

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