linux/drivers/scsi/aha1542.c
<<
>>
Prefs
   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 bool 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"
1746
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.