Annotation of Gnu-Mach/i386/i386at/gpl/linux/scsi/aic7xxx.c, revision 1.1.1.1

1.1       root        1: /*+M*************************************************************************
                      2:  * Adaptec AIC7xxx device driver for Linux.
                      3:  *
                      4:  * Copyright (c) 1994 John Aycock
                      5:  *   The University of Calgary Department of Computer Science.
                      6:  *
                      7:  * This program is free software; you can redistribute it and/or modify
                      8:  * it under the terms of the GNU General Public License as published by
                      9:  * the Free Software Foundation; either version 2, or (at your option)
                     10:  * any later version.
                     11:  *
                     12:  * This program is distributed in the hope that it will be useful,
                     13:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15:  * GNU General Public License for more details.
                     16:  *
                     17:  * You should have received a copy of the GNU General Public License
                     18:  * along with this program; see the file COPYING.  If not, write to
                     19:  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
                     20:  *
                     21:  * Sources include the Adaptec 1740 driver (aha1740.c), the Ultrastor 24F
                     22:  * driver (ultrastor.c), various Linux kernel source, the Adaptec EISA
                     23:  * config file (!adp7771.cfg), the Adaptec AHA-2740A Series User's Guide,
                     24:  * the Linux Kernel Hacker's Guide, Writing a SCSI Device Driver for Linux,
                     25:  * the Adaptec 1542 driver (aha1542.c), the Adaptec EISA overlay file
                     26:  * (adp7770.ovl), the Adaptec AHA-2740 Series Technical Reference Manual,
                     27:  * the Adaptec AIC-7770 Data Book, the ANSI SCSI specification, the
                     28:  * ANSI SCSI-2 specification (draft 10c), ...
                     29:  *
                     30:  * ----------------------------------------------------------------
                     31:  *  Modified to include support for wide and twin bus adapters,
                     32:  *  DMAing of SCBs, tagged queueing, IRQ sharing, bug fixes,
                     33:  *  and other rework of the code.
                     34:  *
                     35:  *  Parts of this driver are based on the FreeBSD driver by Justin
                     36:  *  T. Gibbs.
                     37:  *
                     38:  *  A Boot time option was also added for not resetting the scsi bus.
                     39:  *
                     40:  *    Form:  aic7xxx=extended,no_reset
                     41:  *
                     42:  *    -- Daniel M. Eischen, [email protected], 04/03/95
                     43:  *
                     44:  *  $Id: aic7xxx.c,v 1.1.1.1 1997/02/25 21:27:46 thomas Exp $
                     45:  *-M*************************************************************************/
                     46: 
                     47: #ifdef MODULE
                     48: #include <linux/module.h>
                     49: #endif
                     50: 
                     51: #include <stdarg.h>
                     52: #include <asm/io.h>
                     53: #include <linux/string.h>
                     54: #include <linux/errno.h>
                     55: #include <linux/kernel.h>
                     56: #include <linux/ioport.h>
                     57: #include <linux/bios32.h>
                     58: #include <linux/delay.h>
                     59: #include <linux/sched.h>
                     60: #include <linux/pci.h>
                     61: #include <linux/proc_fs.h>
                     62: #include <linux/blk.h>
                     63: #include "sd.h"
                     64: #include "scsi.h"
                     65: #include "hosts.h"
                     66: #include "aic7xxx.h"
                     67: #include "aic7xxx_reg.h"
                     68: #include <linux/stat.h>
                     69: 
                     70: #include <linux/config.h>      /* for CONFIG_PCI */
                     71: 
                     72: struct proc_dir_entry proc_scsi_aic7xxx = {
                     73:     PROC_SCSI_AIC7XXX, 7, "aic7xxx",
                     74:     S_IFDIR | S_IRUGO | S_IXUGO, 2
                     75: };
                     76: 
                     77: #define AIC7XXX_C_VERSION  "$Revision: 1.1.1.1 $"
                     78: 
                     79: #define NUMBER(arr)     (sizeof(arr) / sizeof(arr[0]))
                     80: #define MIN(a,b)        ((a < b) ? a : b)
                     81: #define ALL_TARGETS -1
                     82: #ifndef TRUE
                     83: #  define TRUE 1
                     84: #endif
                     85: #ifndef FALSE
                     86: #  define FALSE 0
                     87: #endif
                     88: 
                     89: /*
                     90:  * Defines for PCI bus support, testing twin bus support, DMAing of
                     91:  * SCBs, tagged queueing, commands (SCBs) per lun, and SCSI bus reset
                     92:  * delay time.
                     93:  *
                     94:  *   o PCI bus support - this has been implemented and working since
                     95:  *     the December 1, 1994 release of this driver. If you don't have
                     96:  *     a PCI bus, then you can configure your kernel without PCI
                     97:  *     support because all PCI dependent code is bracketed with
                     98:  *     "#ifdef CONFIG_PCI ... #endif CONFIG_PCI".
                     99:  *
                    100:  *   o Twin bus support - this has been tested and does work.
                    101:  *
                    102:  *   o DMAing of SCBs - thanks to Kai Makisara, this now works.
                    103:  *     This define is now taken out and DMAing of SCBs is always
                    104:  *     performed (8/12/95 - DE).
                    105:  *
                    106:  *   o Tagged queueing - this driver is capable of tagged queueing
                    107:  *     but I am unsure as to how well the higher level driver implements
                    108:  *     tagged queueing. Therefore, the maximum commands per lun is
                    109:  *     set to 2. If you want to implement tagged queueing, ensure
                    110:  *     this define is not commented out.
                    111:  *
                    112:  *   o Sharing IRQs - allowed for sharing of IRQs. This will allow
                    113:  *     for multiple aic7xxx host adapters sharing the same IRQ, but
                    114:  *     not for sharing IRQs with other devices. The higher level
                    115:  *     PCI code and interrupt handling needs to be modified to
                    116:  *     support this.
                    117:  *
                    118:  *   o Commands per lun - If tagged queueing is enabled, then you
                    119:  *     may want to try increasing AIC7XXX_CMDS_PER_LUN to more
                    120:  *     than 2.  By default, we limit the SCBs per lun to 2 with
                    121:  *     or without tagged queueing enabled.  If tagged queueing is
                    122:  *     disabled, the sequencer will keep the 2nd SCB in the input
                    123:  *     queue until the first one completes - so it is OK to to have
                    124:  *     more than 1 SCB queued.  If tagged queueing is enabled, then
                    125:  *     the sequencer will attempt to send the 2nd SCB to the device
                    126:  *     while the first SCB is executing and the device is disconnected.
                    127:  *     For adapters limited to 4 SCBs, you may want to actually
                    128:  *     decrease the commands per lun to 1, if you often have more
                    129:  *     than 2 devices active at the same time.  This will allocate
                    130:  *     1 SCB for each device and ensure that there will always be
                    131:  *     a free SCB for up to 4 devices active at the same time.
                    132:  *
                    133:  *   o 3985 support - The 3985 adapter is much like the 3940, but
                    134:  *     has three 7870 controllers as opposed to two for the 3940.
                    135:  *     It will get probed and recognized as three different adapters,
                    136:  *     but all three controllers share the same bank of 255 SCBs
                    137:  *     instead of each controller having their own bank (like the
                    138:  *     controllers on the 3940).  For this reason, it is important
                    139:  *     that all devices be resident on just one channel of the 3985.
                    140:  *     In the near future, we'll modify the driver to reserve 1/3
                    141:  *     of the SCBs for each controller.
                    142:  *
                    143:  *  Daniel M. Eischen, [email protected], 01/11/96
                    144:  */
                    145: 
                    146: /* Uncomment this for testing twin bus support. */
                    147: #define AIC7XXX_TWIN_SUPPORT
                    148: 
                    149: /* Uncomment this for tagged queueing. */
                    150: /* #define AIC7XXX_TAGGED_QUEUEING */
                    151: 
                    152: /* Uncomment this for allowing sharing of IRQs. */
                    153: #define AIC7XXX_SHARE_IRQS
                    154: 
                    155: /*
                    156:  * You can try raising me if tagged queueing is enabled, or lowering
                    157:  * me if you only have 4 SCBs.
                    158:  */
                    159: #define AIC7XXX_CMDS_PER_LUN 2
                    160: 
                    161: /* Set this to the delay in seconds after SCSI bus reset. */
                    162: #define AIC7XXX_RESET_DELAY 15
                    163: 
                    164: /*
                    165:  * Uncomment the following define for collection of SCSI transfer statistics
                    166:  * for the /proc filesystem.
                    167:  *
                    168:  * NOTE: This does affect performance since it has to maintain statistics.
                    169:  */
                    170: /* #define AIC7XXX_PROC_STATS */
                    171: 
                    172: /*
                    173:  * For debugging the abort/reset code.
                    174:  */
                    175: /* #define AIC7XXX_DEBUG_ABORT */
                    176: 
                    177: /*
                    178:  * For general debug messages
                    179:  */
                    180: #define AIC7XXX_DEBUG
                    181: 
                    182: /*
                    183:  * Controller type and options
                    184:  */
                    185: typedef enum {
                    186:   AIC_NONE,
                    187:   AIC_7770,    /* EISA aic7770 on motherboard */
                    188:   AIC_7771,    /* EISA aic7771 on 274x */
                    189:   AIC_284x,    /* VLB  aic7770 on 284x */
                    190:   AIC_7850,    /* PCI  aic7850 */
                    191:   AIC_7870,    /* PCI  aic7870 on motherboard */
                    192:   AIC_7871,    /* PCI  aic7871 on 294x */
                    193:   AIC_7872,    /* PCI  aic7872 on 3940 */
                    194:   AIC_7873,    /* PCI  aic7873 on 3985 */
                    195:   AIC_7874,    /* PCI  aic7874 on 294x Differential */
                    196:   AIC_7880,    /* PCI  aic7880 on motherboard */
                    197:   AIC_7881,    /* PCI  aic7881 on 294x Ultra */
                    198:   AIC_7882,    /* PCI  aic7882 on 3940 Ultra */
                    199:   AIC_7883,    /* PCI  aic7883 on 3985 Ultra */
                    200:   AIC_7884     /* PCI  aic7884 on 294x Ultra Differential */
                    201: } aha_type;
                    202: 
                    203: typedef enum {
                    204:   AIC_777x,    /* AIC-7770 based */
                    205:   AIC_785x,    /* AIC-7850 based */
                    206:   AIC_787x,    /* AIC-7870 based */
                    207:   AIC_788x     /* AIC-7880 based */
                    208: } aha_chip_type;
                    209: 
                    210: typedef enum {
                    211:   AIC_SINGLE,  /* Single Channel */
                    212:   AIC_TWIN,    /* Twin Channel */
                    213:   AIC_WIDE     /* Wide Channel */
                    214: } aha_bus_type;
                    215: 
                    216: typedef enum {
                    217:   AIC_UNKNOWN,
                    218:   AIC_ENABLED,
                    219:   AIC_DISABLED
                    220: } aha_status_type;
                    221: 
                    222: typedef enum {
                    223:   LIST_HEAD,
                    224:   LIST_SECOND
                    225: } insert_type;
                    226: 
                    227: typedef enum {
                    228:   ABORT_RESET_INACTIVE,
                    229:   ABORT_RESET_PENDING,
                    230:   ABORT_RESET_SUCCESS
                    231: } aha_abort_reset_type;
                    232: 
                    233: /*
                    234:  * Define an array of board names that can be indexed by aha_type.
                    235:  * Don't forget to change this when changing the types!
                    236:  */
                    237: static const char * board_names[] = {
                    238:   "<AIC-7xxx Unknown>",                /* AIC_NONE */
                    239:   "AIC-7770",                  /* AIC_7770 */
                    240:   "AHA-2740",                  /* AIC_7771 */
                    241:   "AHA-2840",                  /* AIC_284x */
                    242:   "AIC-7850",                  /* AIC_7850 */
                    243:   "AIC-7870",                  /* AIC_7870 */
                    244:   "AHA-2940",                  /* AIC_7871 */
                    245:   "AHA-3940",                  /* AIC_7872 */
                    246:   "AHA-3985",                  /* AIC_7873 */
                    247:   "AHA-2940 Differential",     /* AIC_7874 */
                    248:   "AIC-7880 Ultra",            /* AIC_7880 */
                    249:   "AHA-2940 Ultra",            /* AIC_7881 */
                    250:   "AHA-3940 Ultra",            /* AIC_7882 */
                    251:   "AHA-3985 Ultra",            /* AIC_7883 */
                    252:   "AHA-2940 Ultra Differential"        /* AIC_7884 */
                    253: };
                    254: 
                    255: /*
                    256:  * There should be a specific return value for this in scsi.h, but
                    257:  * it seems that most drivers ignore it.
                    258:  */
                    259: #define DID_UNDERFLOW   DID_ERROR
                    260: 
                    261: /*
                    262:  *  What we want to do is have the higher level scsi driver requeue
                    263:  *  the command to us. There is no specific driver status for this
                    264:  *  condition, but the higher level scsi driver will requeue the
                    265:  *  command on a DID_BUS_BUSY error.
                    266:  */
                    267: #define DID_RETRY_COMMAND DID_BUS_BUSY
                    268: 
                    269: /*
                    270:  * EISA/VL-bus stuff
                    271:  */
                    272: #define MINSLOT                1
                    273: #define MAXSLOT                15
                    274: #define SLOTBASE(x)    ((x) << 12)
                    275: #define MAXIRQ         15
                    276: 
                    277: /*
                    278:  * Standard EISA Host ID regs  (Offset from slot base)
                    279:  */
                    280: #define HID0           0x80   /* 0,1: msb of ID2, 2-7: ID1      */
                    281: #define HID1           0x81   /* 0-4: ID3, 5-7: LSB ID2         */
                    282: #define HID2           0x82   /* product                        */
                    283: #define HID3           0x83   /* firmware revision              */
                    284: 
                    285: /*
                    286:  * AIC-7770 I/O range to reserve for a card
                    287:  */
                    288: #define MINREG         0xC00
                    289: #define MAXREG         0xCBF
                    290: 
                    291: #define INTDEF         0x5C            /* Interrupt Definition Register */
                    292: 
                    293: /*
                    294:  * Some defines for the HCNTRL register.
                    295:  */
                    296: #define        REQ_PAUSE       IRQMS | INTEN | PAUSE
                    297: #define        UNPAUSE_274X    IRQMS | INTEN
                    298: #define        UNPAUSE_284X    INTEN
                    299: #define        UNPAUSE_294X    IRQMS | INTEN
                    300: 
                    301: /*
                    302:  * AIC-78X0 PCI registers
                    303:  */
                    304: #define        CLASS_PROGIF_REVID      0x08
                    305: #define                DEVREVID        0x000000FFul
                    306: #define                PROGINFC        0x0000FF00ul
                    307: #define                SUBCLASS        0x00FF0000ul
                    308: #define                BASECLASS       0xFF000000ul
                    309: 
                    310: #define        CSIZE_LATTIME           0x0C
                    311: #define                CACHESIZE       0x0000003Ful    /* only 5 bits */
                    312: #define                LATTIME         0x0000FF00ul
                    313: 
                    314: #define        DEVCONFIG               0x40
                    315: #define                MPORTMODE       0x00000400ul    /* aic7870 only */
                    316: #define                RAMPSM          0x00000200ul    /* aic7870 only */
                    317: #define                VOLSENSE        0x00000100ul
                    318: #define                SCBRAMSEL       0x00000080ul
                    319: #define                MRDCEN          0x00000040ul
                    320: #define                EXTSCBTIME      0x00000020ul    /* aic7870 only */
                    321: #define                EXTSCBPEN       0x00000010ul    /* aic7870 only */
                    322: #define                BERREN          0x00000008ul
                    323: #define                DACEN           0x00000004ul
                    324: #define                STPWLEVEL       0x00000002ul
                    325: #define                DIFACTNEGEN     0x00000001ul    /* aic7870 only */
                    326: 
                    327: /*
                    328:  *
                    329:  * Define the format of the SEEPROM registers (16 bits).
                    330:  *
                    331:  */
                    332: struct seeprom_config {
                    333: 
                    334: /*
                    335:  * SCSI ID Configuration Flags
                    336:  */
                    337: #define CFXFER         0x0007          /* synchronous transfer rate */
                    338: #define CFSYNCH                0x0008          /* enable synchronous transfer */
                    339: #define CFDISC         0x0010          /* enable disconnection */
                    340: #define CFWIDEB                0x0020          /* wide bus device (wide card) */
                    341: /* UNUSED              0x00C0 */
                    342: #define CFSTART                0x0100          /* send start unit SCSI command */
                    343: #define CFINCBIOS      0x0200          /* include in BIOS scan */
                    344: #define CFRNFOUND      0x0400          /* report even if not found */
                    345: /* UNUSED              0xF800 */
                    346:   unsigned short device_flags[16];     /* words 0-15 */
                    347: 
                    348: /*
                    349:  * BIOS Control Bits
                    350:  */
                    351: #define CFSUPREM       0x0001          /* support all removeable drives */
                    352: #define CFSUPREMB      0x0002          /* support removeable drives for boot only */
                    353: #define CFBIOSEN       0x0004          /* BIOS enabled */
                    354: /* UNUSED              0x0008 */
                    355: #define CFSM2DRV       0x0010          /* support more than two drives */
                    356: #define CF284XEXTEND   0x0020          /* extended translation (284x cards) */
                    357: /* UNUSED              0x0040 */
                    358: #define CFEXTEND       0x0080          /* extended translation enabled */
                    359: /* UNUSED              0xFF00 */
                    360:   unsigned short bios_control;         /* word 16 */
                    361: 
                    362: /*
                    363:  * Host Adapter Control Bits
                    364:  */
                    365: /* UNUSED               0x0001 */
                    366: #define CFULTRAEN       0x0002          /* Ultra SCSI speed enable (Ultra cards) */
                    367: #define CF284XSELTO     0x0003          /* Selection timeout (284x cards) */
                    368: #define CF284XFIFO      0x000C          /* FIFO Threshold (284x cards) */
                    369: #define CFSTERM         0x0004          /* SCSI low byte termination (non-wide cards) */
                    370: #define CFWSTERM        0x0008          /* SCSI high byte termination (wide card) */
                    371: #define CFSPARITY      0x0010          /* SCSI parity */
                    372: #define CF284XSTERM    0x0020          /* SCSI low byte termination (284x cards) */
                    373: #define CFRESETB       0x0040          /* reset SCSI bus at IC initialization */
                    374: /* UNUSED              0xFF80 */
                    375:   unsigned short adapter_control;      /* word 17 */
                    376: 
                    377: /*
                    378:  * Bus Release, Host Adapter ID
                    379:  */
                    380: #define CFSCSIID       0x000F          /* host adapter SCSI ID */
                    381: /* UNUSED              0x00F0 */
                    382: #define CFBRTIME       0xFF00          /* bus release time */
                    383:   unsigned short brtime_id;            /* word 18 */
                    384: 
                    385: /*
                    386:  * Maximum targets
                    387:  */
                    388: #define CFMAXTARG      0x00FF  /* maximum targets */
                    389: /* UNUSED              0xFF00 */
                    390:   unsigned short max_targets;          /* word 19 */
                    391: 
                    392:   unsigned short res_1[11];            /* words 20-30 */
                    393:   unsigned short checksum;             /* word 31 */
                    394: };
                    395: 
                    396: /*
                    397:  * Pause the sequencer and wait for it to actually stop - this
                    398:  * is important since the sequencer can disable pausing for critical
                    399:  * sections.
                    400:  */
                    401: #define PAUSE_SEQUENCER(p) \
                    402:   outb(p->pause, HCNTRL + p->base);                    \
                    403:   while ((inb(HCNTRL + p->base) & PAUSE) == 0)         \
                    404:     ;                                                  \
                    405: 
                    406: /*
                    407:  * Unpause the sequencer. Unremarkable, yet done often enough to
                    408:  * warrant an easy way to do it.
                    409:  */
                    410: #define UNPAUSE_SEQUENCER(p) \
                    411:   outb(p->unpause, HCNTRL + p->base)
                    412: 
                    413: /*
                    414:  * Restart the sequencer program from address zero
                    415:  */
                    416: #define RESTART_SEQUENCER(p) \
                    417:   do {                                                 \
                    418:     outb(SEQRESET | FASTMODE, SEQCTL + p->base);       \
                    419:   } while (inb(SEQADDR0 + p->base) != 0 &&             \
                    420:           inb(SEQADDR1 + p->base) != 0);               \
                    421:   UNPAUSE_SEQUENCER(p);
                    422: 
                    423: /*
                    424:  * If an error occurs during a data transfer phase, run the comand
                    425:  * to completion - it's easier that way - making a note of the error
                    426:  * condition in this location. This then will modify a DID_OK status
                    427:  * into an appropriate error for the higher-level SCSI code.
                    428:  */
                    429: #define aic7xxx_error(cmd)     ((cmd)->SCp.Status)
                    430: 
                    431: /*
                    432:  * Keep track of the targets returned status.
                    433:  */
                    434: #define aic7xxx_status(cmd)    ((cmd)->SCp.sent_command)
                    435: 
                    436: /*
                    437:  * The position of the SCSI commands scb within the scb array.
                    438:  */
                    439: #define aic7xxx_position(cmd)  ((cmd)->SCp.have_data_in)
                    440: 
                    441: /*
                    442:  * Since the sequencer code DMAs the scatter-gather structures
                    443:  * directly from memory, we use this macro to assert that the
                    444:  * kernel structure hasn't changed.
                    445:  */
                    446: #define SG_STRUCT_CHECK(sg) \
                    447:   ((char *) &(sg).address - (char *) &(sg) != 0 ||  \
                    448:    (char *) &(sg).length  - (char *) &(sg) != 8 ||  \
                    449:    sizeof((sg).address) != 4 ||                   \
                    450:    sizeof((sg).length)  != 4 ||                   \
                    451:    sizeof(sg)           != 12)
                    452: 
                    453: /*
                    454:  * "Static" structures. Note that these are NOT initialized
                    455:  * to zero inside the kernel - we have to initialize them all
                    456:  * explicitly.
                    457:  *
                    458:  * We support multiple adapter cards per interrupt, but keep a
                    459:  * linked list of Scsi_Host structures for each IRQ.  On an interrupt,
                    460:  * use the IRQ as an index into aic7xxx_boards[] to locate the card
                    461:  * information.
                    462:  */
                    463: static struct Scsi_Host *aic7xxx_boards[MAXIRQ + 1];
                    464: 
                    465: /*
                    466:  * When we detect and register the card, it is possible to
                    467:  * have the card raise a spurious interrupt.  Because we need
                    468:  * to support multiple cards, we cannot tell which card caused
                    469:  * the spurious interrupt.  And, we might not even have added
                    470:  * the card info to the linked list at the time the spurious
                    471:  * interrupt gets raised.  This variable is suppose to keep track
                    472:  * of when we are registering a card and how many spurious
                    473:  * interrupts we have encountered.
                    474:  *
                    475:  *   0 - do not allow spurious interrupts.
                    476:  *   1 - allow 1 spurious interrupt
                    477:  *   2 - have 1 spurious interrupt, do not allow any more.
                    478:  *
                    479:  * I've made it an integer instead of a boolean in case we
                    480:  * want to allow more than one spurious interrupt for debugging
                    481:  * purposes.  Otherwise, it could just go from true to false to
                    482:  * true (or something like that).
                    483:  *
                    484:  * When the driver detects the cards, we'll set the count to 1
                    485:  * for each card detection and registration.  After the registration
                    486:  * of a card completes, we'll set the count back to 0.  So far, it
                    487:  * seems to be enough to allow a spurious interrupt only during
                    488:  * card registration; if a spurious interrupt is going to occur,
                    489:  * this is where it happens.
                    490:  *
                    491:  * We should be able to find a way to avoid getting the spurious
                    492:  * interrupt.  But until we do, we have to keep this ugly code.
                    493:  */
                    494: static int aic7xxx_spurious_count;
                    495: 
                    496: /*
                    497:  * The driver keeps up to four scb structures per card in memory. Only the
                    498:  * first 25 bytes of the structure are valid for the hardware, the rest used
                    499:  * for driver level bookkeeping.
                    500:  */
                    501: 
                    502: struct aic7xxx_scb {
                    503: /* ------------    Begin hardware supported fields    ---------------- */
                    504: /* 0*/  unsigned char control;
                    505: /* 1*/  unsigned char target_channel_lun;       /* 4/1/3 bits */
                    506: /* 2*/  unsigned char target_status;
                    507: /* 3*/  unsigned char SG_segment_count;
                    508: /* 4*/  unsigned char SG_list_pointer[4] __attribute__ ((packed));
                    509: /* 8*/  unsigned char residual_SG_segment_count;
                    510: /* 9*/  unsigned char residual_data_count[3];
                    511: /*12*/  unsigned char data_pointer[4] __attribute__ ((packed));
                    512: /*16*/  unsigned long data_count;
                    513: /*20*/  unsigned char SCSI_cmd_pointer[4] __attribute__ ((packed));
                    514: /*24*/  unsigned char SCSI_cmd_length;
                    515: #define SCB_PIO_TRANSFER_SIZE   25      /*
                    516:                                          * amount we need to upload/download
                    517:                                          * via rep in/outsb to perform
                    518:                                          * a request sense.  The second
                    519:                                          * RESERVED byte is initialized to
                    520:                                          * 0 in getscb().
                    521:                                          */
                    522: /*25*/  u_char next_waiting;            /* Used to thread SCBs awaiting selection. */
                    523:        /*-----------------end of hardware supported fields----------------*/
                    524:        struct aic7xxx_scb *next;       /* next ptr when in free list */
                    525:        Scsi_Cmnd          *cmd;        /* Scsi_Cmnd for this scb */
                    526: #define SCB_FREE               0x00
                    527: #define SCB_ACTIVE             0x01
                    528: #define SCB_ABORTED            0x02
                    529: #define SCB_DEVICE_RESET       0x04
                    530: #define SCB_IMMED              0x08
                    531: #define SCB_SENSE              0x10
                    532:        int                 state;          /* current state of scb */
                    533:        unsigned int        position;       /* Position in scb array */
                    534:        struct scatterlist  sg;
                    535:        struct scatterlist  sense_sg;
                    536:        unsigned char       sense_cmd[6];   /* Allocate 6 characters for sense command */
                    537: };
                    538: 
                    539: static struct {
                    540:   unsigned char errno;
                    541:   const char *errmesg;
                    542: } hard_error[] = {
                    543:   { ILLHADDR,  "Illegal Host Access" },
                    544:   { ILLSADDR,  "Illegal Sequencer Address referrenced" },
                    545:   { ILLOPCODE, "Illegal Opcode in sequencer program" },
                    546:   { PARERR,    "Sequencer Ram Parity Error" }
                    547: };
                    548: 
                    549: static unsigned char
                    550: generic_sense[] = { REQUEST_SENSE, 0, 0, 0, 255, 0 };
                    551: 
                    552: /*
                    553:  * The maximum number of SCBs we could have for ANY type
                    554:  * of card. DON'T FORGET TO CHANGE THE SCB MASK IN THE
                    555:  * SEQUENCER CODE IF THIS IS MODIFIED!
                    556:  */
                    557: #define AIC7XXX_MAXSCB 255
                    558: 
                    559: /*
                    560:  * Define a structure used for each host adapter, only one per IRQ.
                    561:  */
                    562: struct aic7xxx_host {
                    563:   int                      base;             /* card base address */
                    564:   int                      maxscb;           /* hardware SCBs */
                    565:   int                      numscb;           /* current number of scbs */
                    566:   int                      extended;         /* extended xlate? */
                    567:   aha_type                 type;             /* card type */
                    568:   aha_chip_type            chip_type;        /* chip base type */
                    569:   int                      ultra_enabled;    /* Ultra SCSI speed enabled */
                    570:   int                      chan_num;         /* for 3940/3985, channel number */
                    571:   aha_bus_type             bus_type;         /* normal/twin/wide bus */
                    572:   unsigned char            a_scanned;        /* 0 not scanned, 1 scanned */
                    573:   unsigned char            b_scanned;        /* 0 not scanned, 1 scanned */
                    574:   unsigned int             isr_count;        /* Interrupt count */
                    575:   volatile unsigned char   unpause;          /* unpause value for HCNTRL */
                    576:   volatile unsigned char   pause;            /* pause value for HCNTRL */
                    577:   volatile unsigned short  needsdtr_copy;    /* default config */
                    578:   volatile unsigned short  needsdtr;
                    579:   volatile unsigned short  sdtr_pending;
                    580:   volatile unsigned short  needwdtr_copy;    /* default config */
                    581:   volatile unsigned short  needwdtr;
                    582:   volatile unsigned short  wdtr_pending;
                    583:   volatile unsigned short  discenable;       /* Targets allowed to disconnect */
                    584:   struct seeprom_config    seeprom;
                    585:   int                      have_seeprom;
                    586:   struct Scsi_Host        *next;             /* allow for multiple IRQs */
                    587:   struct aic7xxx_scb       scb_array[AIC7XXX_MAXSCB];  /* active commands */
                    588:   struct aic7xxx_scb      *free_scb;         /* list of free SCBs */
                    589: #ifdef AIC7XXX_PROC_STATS
                    590:   /*
                    591:    * Statistics Kept:
                    592:    *
                    593:    * Total Xfers (count for each command that has a data xfer),
                    594:    * broken down further by reads && writes.
                    595:    *
                    596:    * Binned sizes, writes && reads:
                    597:    *    < 512, 512, 1-2K, 2-4K, 4-8K, 8-16K, 16-32K, 32-64K, 64K-128K, > 128K
                    598:    *
                    599:    * Total amounts read/written above 512 bytes (amts under ignored)
                    600:    */
                    601:   struct aic7xxx_xferstats {
                    602:     long xfers;                              /* total xfer count */
                    603:     long w_total;                            /* total writes */
                    604:     long w_total512;                         /* 512 byte blocks written */
                    605:     long w_bins[10];                         /* binned write */
                    606:     long r_total;                            /* total reads */
                    607:     long r_total512;                         /* 512 byte blocks read */
                    608:     long r_bins[10];                         /* binned reads */
                    609:   } stats[2][16][8];                         /* channel, target, lun */
                    610: #endif /* AIC7XXX_PROC_STATS */
                    611: };
                    612: 
                    613: struct aic7xxx_host_config {
                    614:   int              irq;        /* IRQ number */
                    615:   int              base;       /* I/O base */
                    616:   int              maxscb;     /* hardware SCBs */
                    617:   int              unpause;    /* unpause value for HCNTRL */
                    618:   int              pause;      /* pause value for HCNTRL */
                    619:   int              scsi_id;    /* host SCSI ID */
                    620:   int              scsi_id_b;  /* host SCSI ID B channel for twin cards */
                    621:   int              extended;   /* extended xlate? */
                    622:   int              busrtime;   /* bus release time */
                    623:   int              walk_scbs;  /* external SCB RAM detected; walk the scb array */
                    624:   aha_type         type;       /* card type */
                    625:   aha_chip_type    chip_type;  /* chip base type */
                    626:   int              ultra_enabled;    /* Ultra SCSI speed enabled */
                    627:   int              chan_num;   /* for 3940/3985, channel number */
                    628:   aha_bus_type     bus_type;   /* normal/twin/wide bus */
                    629:   aha_status_type  parity;     /* bus parity enabled/disabled */
                    630:   aha_status_type  low_term;   /* bus termination low byte */
                    631:   aha_status_type  high_term;  /* bus termination high byte (wide cards only) */
                    632: };
                    633: 
                    634: /*
                    635:  * Valid SCSIRATE values. (p. 3-17)
                    636:  * Provides a mapping of tranfer periods in ns to the proper value to
                    637:  * stick in the scsiscfr reg to use that transfer rate.
                    638:  */
                    639: static struct {
                    640:   short period;
                    641:   /* Rates in Ultra mode have bit 8 of sxfr set */
                    642: #define                ULTRA_SXFR 0x100
                    643:   short rate;
                    644:   const char *english;
                    645: } aic7xxx_syncrates[] = {
                    646:   {  50,  0x100,  "20.0" },
                    647:   {  62,  0x110,  "16.0" },
                    648:   {  75,  0x120,  "13.4" },
                    649:   { 100,  0x140,  "10.0" },
                    650:   { 100,  0x000,  "10.0" },
                    651:   { 125,  0x010,  "8.0"  },
                    652:   { 150,  0x020,  "6.67" },
                    653:   { 175,  0x030,  "5.7"  },
                    654:   { 200,  0x040,  "5.0"  },
                    655:   { 225,  0x050,  "4.4"  },
                    656:   { 250,  0x060,  "4.0"  },
                    657:   { 275,  0x070,  "3.6"  }
                    658: };
                    659: 
                    660: static int num_aic7xxx_syncrates =
                    661:     sizeof(aic7xxx_syncrates) / sizeof(aic7xxx_syncrates[0]);
                    662: 
                    663: #ifdef CONFIG_PCI
                    664: static int number_of_39xxs = 0;
                    665: #endif CONFIG_PCI
                    666: 
                    667: #ifdef AIC7XXX_DEBUG
                    668: static void
                    669: debug(const char *fmt, ...)
                    670: {
                    671:   va_list ap;
                    672:   char buf[256];
                    673: 
                    674:   va_start(ap, fmt);
                    675:   vsprintf(buf, fmt, ap);
                    676:   printk(buf);
                    677:   va_end(ap);
                    678: }
                    679: 
                    680: static void
                    681: debug_config(struct aic7xxx_host_config *p)
                    682: {
                    683:   int host_conf, scsi_conf;
                    684:   unsigned char brelease;
                    685:   unsigned char dfthresh;
                    686: 
                    687:   static int DFT[] = { 0, 50, 75, 100 };
                    688:   static int SST[] = { 256, 128, 64, 32 };
                    689:   static const char *BUSW[] = { "", "-TWIN", "-WIDE" };
                    690: 
                    691:   host_conf = inb(HOSTCONF + p->base);
                    692:   scsi_conf = inb(SCSICONF + p->base);
                    693: 
                    694:   /*
                    695:    * The 7870 gets the bus release time and data FIFO threshold
                    696:    * from the serial EEPROM (stored in the config structure) and
                    697:    * scsi_conf register respectively.  The 7770 gets the bus
                    698:    * release time and data FIFO threshold from the scsi_conf and
                    699:    * host_conf registers respectively.
                    700:    */
                    701:   if (p->chip_type == AIC_777x)
                    702:   {
                    703:     dfthresh = (host_conf >> 6);
                    704:   }
                    705:   else
                    706:   {
                    707:     dfthresh = (scsi_conf >> 6);
                    708:   }
                    709: 
                    710:   brelease = p->busrtime;
                    711:   if (brelease == 0)
                    712:   {
                    713:     brelease = 2;
                    714:   }
                    715: 
                    716:   switch (p->type)
                    717:   {
                    718:     case AIC_7770:
                    719:     case AIC_7771:
                    720:       printk("%s%s AT EISA SLOT %d:\n", board_names[p->type], BUSW[p->bus_type],
                    721:              p->base >> 12);
                    722:       break;
                    723: 
                    724:     case AIC_284x:
                    725:       printk("%s%s AT VLB SLOT %d:\n", board_names[p->type], BUSW[p->bus_type],
                    726:              p->base >> 12);
                    727:       break;
                    728: 
                    729:     case AIC_7850:
                    730:     case AIC_7870:
                    731:     case AIC_7871:
                    732:     case AIC_7872:
                    733:     case AIC_7873:
                    734:     case AIC_7874:
                    735:     case AIC_7880:
                    736:     case AIC_7881:
                    737:     case AIC_7882:
                    738:     case AIC_7883:
                    739:     case AIC_7884:
                    740:       printk("%s%s (PCI-bus):\n", board_names[p->type], BUSW[p->bus_type]);
                    741:       break;
                    742: 
                    743:     default:
                    744:       panic("aic7xxx: (debug_config) internal error.\n");
                    745:   }
                    746: 
                    747:   printk("    irq %d\n"
                    748:         "    bus release time %d bclks\n"
                    749:         "    data fifo threshold %d%%\n",
                    750:         p->irq,
                    751:         brelease,
                    752:         DFT[dfthresh]);
                    753: 
                    754:   printk("    SCSI CHANNEL A:\n"
                    755:         "        scsi id %d\n"
                    756:         "        scsi selection timeout %d ms\n"
                    757:         "        scsi bus reset at power-on %sabled\n",
                    758:         scsi_conf & 0x07,
                    759:         SST[(scsi_conf >> 3) & 0x03],
                    760:         (scsi_conf & 0x40) ? "en" : "dis");
                    761: 
                    762:   if ((p->chip_type == AIC_777x) && (p->parity == AIC_UNKNOWN))
                    763:   {
                    764:     /*
                    765:      * Set the parity for 7770 based cards.
                    766:      */
                    767:     p->parity = (scsi_conf & 0x20) ? AIC_ENABLED : AIC_DISABLED;
                    768:   }
                    769:   if (p->parity != AIC_UNKNOWN)
                    770:   {
                    771:     printk("        scsi bus parity %sabled\n",
                    772:           (p->parity == AIC_ENABLED) ? "en" : "dis");
                    773:   }
                    774: 
                    775:   if ((p->type == AIC_7770) || (p->type == AIC_7771))
                    776:   {
                    777:     p->low_term = (scsi_conf & 0x80) ? AIC_ENABLED : AIC_DISABLED;
                    778:   }
                    779:   if (p->low_term != AIC_UNKNOWN)
                    780:   {
                    781:     printk("        scsi bus termination (low byte) %sabled\n",
                    782:          (p->low_term == AIC_ENABLED) ? "en" : "dis");
                    783:   }
                    784:   if ((p->bus_type == AIC_WIDE) && (p->high_term != AIC_UNKNOWN))
                    785:   {
                    786:     printk("        scsi bus termination (high byte) %sabled\n",
                    787:          (p->high_term == AIC_ENABLED) ? "en" : "dis");
                    788:   }
                    789: }
                    790: 
                    791: #if 0
                    792: static void
                    793: debug_scb(struct aic7xxx_scb *scb)
                    794: {
                    795:   printk("control 0x%x, tcl 0x%x, sg_count %d, sg_ptr 0x%x, cmdp 0x%x, cmdlen %d\n",
                    796:          scb->control, scb->target_channel_lun, scb->SG_segment_count,
                    797:          (scb->SG_list_pointer[3] << 24) | (scb->SG_list_pointer[2] << 16) |
                    798:          (scb->SG_list_pointer[1] << 8) | scb->SG_list_pointer[0],
                    799:          (scb->SCSI_cmd_pointer[3] << 24) | (scb->SCSI_cmd_pointer[2] << 16) |
                    800:          (scb->SCSI_cmd_pointer[1] << 8) | scb->SCSI_cmd_pointer[0],
                    801:          scb->SCSI_cmd_length);
                    802:   printk("reserved 0x%x, target status 0x%x, resid SG count %d, resid data count %d\n",
                    803:          (scb->RESERVED[1] << 8) | scb->RESERVED[0], scb->target_status,
                    804:          scb->residual_SG_segment_count, scb->residual_data_count);
                    805:   printk("data ptr 0x%x, data count %d, next waiting %d\n",
                    806:          (scb->data_pointer[3] << 24) | (scb->data_pointer[2] << 16) |
                    807:          (scb->data_pointer[1] << 8) | scb->data_pointer[0],
                    808:          scb->data_count, scb->next_waiting);
                    809:   printk("next ptr 0x%lx, Scsi Cmnd 0x%lx, state 0x%x, position %d\n",
                    810:          (unsigned long) scb->next, (unsigned long) scb->cmd, scb->state,
                    811:          scb->position);
                    812: }
                    813: #endif
                    814: 
                    815: #else
                    816: #  define debug(fmt, args...)
                    817: #  define debug_config(x)
                    818: #  define debug_scb(x)
                    819: #endif AIC7XXX_DEBUG
                    820: 
                    821: /*
                    822:  * XXX - these options apply unilaterally to _all_ 274x/284x/294x
                    823:  *       cards in the system. This should be fixed, but then,
                    824:  *       does anyone really have more than one in a machine?
                    825:  */
                    826: static unsigned int aic7xxx_extended = 0;    /* extended translation on? */
                    827: static unsigned int aic7xxx_no_reset = 0;    /* no resetting of SCSI bus */
                    828: 
                    829: /*+F*************************************************************************
                    830:  * Function:
                    831:  *   aic7xxx_setup
                    832:  *
                    833:  * Description:
                    834:  *   Handle Linux boot parameters. This routine allows for assigning a value
                    835:  *   to a parameter with a ':' between the parameter and the value.
                    836:  *   ie. aic7xxx=unpause:0x0A,extended
                    837:  *-F*************************************************************************/
                    838: void
                    839: aic7xxx_setup(char *s, int *dummy)
                    840: {
                    841:   int   i, n;
                    842:   char *p;
                    843: 
                    844:   static struct {
                    845:     const char *name;
                    846:     unsigned int *flag;
                    847:   } options[] = {
                    848:     { "extended",    &aic7xxx_extended },
                    849:     { "no_reset",    &aic7xxx_no_reset },
                    850:     { NULL,          NULL }
                    851:   };
                    852: 
                    853:   for (p = strtok(s, ","); p; p = strtok(NULL, ","))
                    854:   {
                    855:     for (i = 0; options[i].name; i++)
                    856:     {
                    857:       n = strlen(options[i].name);
                    858:       if (!strncmp(options[i].name, p, n))
                    859:       {
                    860:         if (p[n] == ':')
                    861:         {
                    862:           *(options[i].flag) = simple_strtoul(p + n + 1, NULL, 0);
                    863:         }
                    864:         else
                    865:         {
                    866:           *(options[i].flag) = !0;
                    867:         }
                    868:       }
                    869:     }
                    870:   }
                    871: }
                    872: 
                    873: /*+F*************************************************************************
                    874:  * Function:
                    875:  *   aic7xxx_loadseq
                    876:  *
                    877:  * Description:
                    878:  *   Load the sequencer code into the controller memory.
                    879:  *-F*************************************************************************/
                    880: static void
                    881: aic7xxx_loadseq(int base)
                    882: {
                    883:   static unsigned char seqprog[] = {
                    884:     /*
                    885:      * Each sequencer instruction is 29 bits
                    886:      * long (fill in the excess with zeroes)
                    887:      * and has to be loaded from least -> most
                    888:      * significant byte, so this table has the
                    889:      * byte ordering reversed.
                    890:      */
                    891: #   include "aic7xxx_seq.h"
                    892:   };
                    893: 
                    894:   /*
                    895:    * When the AIC-7770 is paused (as on chip reset), the
                    896:    * sequencer address can be altered and a sequencer
                    897:    * program can be loaded by writing it, byte by byte, to
                    898:    * the sequencer RAM port - the Adaptec documentation
                    899:    * recommends using REP OUTSB to do this, hence the inline
                    900:    * assembly. Since the address autoincrements as we load
                    901:    * the program, reset it back to zero afterward. Disable
                    902:    * sequencer RAM parity error detection while loading, and
                    903:    * make sure the LOADRAM bit is enabled for loading.
                    904:    */
                    905:   outb(PERRORDIS | SEQRESET | LOADRAM, SEQCTL + base);
                    906: 
                    907:   outsb(SEQRAM + base, seqprog, sizeof(seqprog));
                    908: 
                    909:   /*
                    910:    * WARNING!  This is a magic sequence!  After extensive
                    911:    * experimentation, it seems that you MUST turn off the
                    912:    * LOADRAM bit before you play with SEQADDR again, else
                    913:    * you will end up with parity errors being flagged on
                    914:    * your sequencer program. (You would also think that
                    915:    * turning off LOADRAM and setting SEQRESET to reset the
                    916:    * address to zero would work, but you need to do it twice
                    917:    * for it to take effect on the address. Timing problem?)
                    918:    */
                    919:   do {
                    920:     /*
                    921:      * Actually, reset it until
                    922:      * the address shows up as
                    923:      * zero just to be safe..
                    924:      */
                    925:     outb(SEQRESET | FASTMODE, SEQCTL + base);
                    926:   } while ((inb(SEQADDR0 + base) != 0) && (inb(SEQADDR1 + base) != 0));
                    927: }
                    928: 
                    929: /*+F*************************************************************************
                    930:  * Function:
                    931:  *   aic7xxx_delay
                    932:  *
                    933:  * Description:
                    934:  *   Delay for specified amount of time.
                    935:  *-F*************************************************************************/
                    936: static void
                    937: aic7xxx_delay(int seconds)
                    938: {
                    939:   unsigned long i;
                    940: 
                    941:   i = jiffies + (seconds * HZ);  /* compute time to stop */
                    942: 
                    943:   while (jiffies < i)
                    944:   {
                    945:     ;  /* Do nothing! */
                    946:   }
                    947: }
                    948: 
                    949: /*+F*************************************************************************
                    950:  * Function:
                    951:  *   rcs_version
                    952:  *
                    953:  * Description:
                    954:  *   Return a string containing just the RCS version number from either
                    955:  *   an Id or Revison RCS clause.
                    956:  *-F*************************************************************************/
                    957: const char *
                    958: rcs_version(const char *version_info)
                    959: {
                    960:   static char buf[10];
                    961:   char *bp, *ep;
                    962: 
                    963:   bp = NULL;
                    964:   strcpy(buf, "????");
                    965:   if (!strncmp(version_info, "$Id: ", 5))
                    966:   {
                    967:     if ((bp = strchr(version_info, ' ')) != NULL)
                    968:     {
                    969:       bp++;
                    970:       if ((bp = strchr(bp, ' ')) != NULL)
                    971:       {
                    972:        bp++;
                    973:       }
                    974:     }
                    975:   }
                    976:   else
                    977:   {
                    978:     if (!strncmp(version_info, "$Revision: ", 11))
                    979:     {
                    980:       if ((bp = strchr(version_info, ' ')) != NULL)
                    981:       {
                    982:        bp++;
                    983:       }
                    984:     }
                    985:   }
                    986: 
                    987:   if (bp != NULL)
                    988:   {
                    989:     if ((ep = strchr(bp, ' ')) != NULL)
                    990:     {
                    991:       register int len = ep - bp;
                    992: 
                    993:       strncpy(buf, bp, len);
                    994:       buf[len] = '\0';
                    995:     }
                    996:   }
                    997: 
                    998:   return buf;
                    999: }
                   1000: 
                   1001: /*+F*************************************************************************
                   1002:  * Function:
                   1003:  *   aic7xxx_info
                   1004:  *
                   1005:  * Description:
                   1006:  *   Return a string describing the driver.
                   1007:  *-F*************************************************************************/
                   1008: const char *
                   1009: aic7xxx_info(struct Scsi_Host *notused)
                   1010: {
                   1011:   static char buffer[128];
                   1012: 
                   1013:   strcpy(buffer, "Adaptec AHA274x/284x/294x (EISA/VLB/PCI-Fast SCSI) ");
                   1014:   strcat(buffer, rcs_version(AIC7XXX_C_VERSION));
                   1015:   strcat(buffer, "/");
                   1016:   strcat(buffer, rcs_version(AIC7XXX_H_VERSION));
                   1017:   strcat(buffer, "/");
                   1018:   strcat(buffer, rcs_version(AIC7XXX_SEQ_VER));
                   1019: 
                   1020:   return buffer;
                   1021: }
                   1022: 
                   1023: /*+F*************************************************************************
                   1024:  * Function:
                   1025:  *   aic7xxx_length
                   1026:  *
                   1027:  * Description:
                   1028:  *   How much data should be transferred for this SCSI command? Stop
                   1029:  *   at segment sg_last if it's a scatter-gather command so we can
                   1030:  *   compute underflow easily.
                   1031:  *-F*************************************************************************/
                   1032: static unsigned
                   1033: aic7xxx_length(Scsi_Cmnd *cmd, int sg_last)
                   1034: {
                   1035:   int i, segments;
                   1036:   unsigned length;
                   1037:   struct scatterlist *sg;
                   1038: 
                   1039:   segments = cmd->use_sg - sg_last;
                   1040:   sg = (struct scatterlist *) cmd->buffer;
                   1041: 
                   1042:   if (cmd->use_sg)
                   1043:   {
                   1044:     for (i = length = 0; (i < cmd->use_sg) && (i < segments); i++)
                   1045:     {
                   1046:       length += sg[i].length;
                   1047:     }
                   1048:   }
                   1049:   else
                   1050:   {
                   1051:     length = cmd->request_bufflen;
                   1052:   }
                   1053: 
                   1054:   return (length);
                   1055: }
                   1056: 
                   1057: /*+F*************************************************************************
                   1058:  * Function:
                   1059:  *   aic7xxx_scsirate
                   1060:  *
                   1061:  * Description:
                   1062:  *   Look up the valid period to SCSIRATE conversion in our table
                   1063:  *-F*************************************************************************/
                   1064: static void
                   1065: aic7xxx_scsirate(struct aic7xxx_host *p, unsigned char *scsirate,
                   1066:                  short period, unsigned char offset,
                   1067:                  int target, char channel)
                   1068: {
                   1069:   int i;
                   1070: 
                   1071:   for (i = 0; i < num_aic7xxx_syncrates; i++)
                   1072:   {
                   1073:     if ((aic7xxx_syncrates[i].period - period) >= 0)
                   1074:     {
                   1075:       /*
                   1076:        * Watch out for Ultra speeds when ultra is not enabled and
                   1077:        * vice-versa.
                   1078:        */
                   1079:       if (p->ultra_enabled)
                   1080:       {
                   1081:         if (!(aic7xxx_syncrates[i].rate & ULTRA_SXFR))
                   1082:         {
                   1083:           printk ("aic7xxx: Target %d, channel %c, requests %sMHz transfers, "
                   1084:                   "but adapter in Ultra mode can only sync at 10MHz or "
                   1085:                   "above.\n", target, channel, aic7xxx_syncrates[i].english);
                   1086:           break;  /* Use asynchronous transfers. */
                   1087:         }
                   1088:       }
                   1089:       else
                   1090:       {
                   1091:         /*
                   1092:          * Check for an Ultra device trying to negotiate an Ultra rate
                   1093:          * on an adapter with Ultra mode disabled.
                   1094:          */
                   1095:         if (aic7xxx_syncrates[i].rate & ULTRA_SXFR)
                   1096:         {
                   1097:           /*
                   1098:            * This should only happen if the driver is the first to negotiate
                   1099:            * and chooses a high rate.  We'll just move down the table until
                   1100:            * we hit a non Ultra speed.
                   1101:            */
                   1102:            continue;
                   1103:         }
                   1104:       }
                   1105:       *scsirate = (aic7xxx_syncrates[i].rate) | (offset & 0x0F);
                   1106:       printk("aic7xxx: Target %d, channel %c, now synchronous at %sMHz, "
                   1107:              "offset(0x%x).\n",
                   1108:             target, channel, aic7xxx_syncrates[i].english, offset);
                   1109:       return;
                   1110:     }
                   1111:   }
                   1112: 
                   1113:   /*
                   1114:    * Default to asynchronous transfer
                   1115:    */
                   1116:   *scsirate = 0;
                   1117:   printk("aic7xxx: Target %d, channel %c, using asynchronous transfers.\n",
                   1118:          target, channel);
                   1119: }
                   1120: 
                   1121: /*+F*************************************************************************
                   1122:  * Function:
                   1123:  *   aic7xxx_putscb
                   1124:  *
                   1125:  * Description:
                   1126:  *   Transfer a SCB to the controller.
                   1127:  *-F*************************************************************************/
                   1128: static inline void
                   1129: aic7xxx_putscb(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
                   1130: {
                   1131:   unsigned char curscb;
                   1132:   int base = p->base;
                   1133: 
                   1134:   curscb = inb(SCBPTR + base);
                   1135:   outb(scb->position, SCBPTR + base);
                   1136:   outb(SCBAUTO, SCBCNT + base);
                   1137: 
                   1138:   /*
                   1139:    * By turning on the SCB auto increment, any reference
                   1140:    * to the SCB I/O space postincrements the SCB address
                   1141:    * we're looking at. So turn this on and dump the relevant
                   1142:    * portion of the SCB to the card.
                   1143:    *
                   1144:    * We can do 16bit transfers on all but 284x.
                   1145:    */
                   1146:   if (p->type == AIC_284x)
                   1147:   {
                   1148:     outsb(SCBARRAY + base, scb, SCB_PIO_TRANSFER_SIZE);
                   1149:   }
                   1150:   else
                   1151:   {
                   1152:     outsl(SCBARRAY + base, scb, (SCB_PIO_TRANSFER_SIZE + 3) / 4);
                   1153:   }
                   1154: 
                   1155:   outb(0, SCBCNT + base);
                   1156:   outb(curscb, SCBPTR + base);
                   1157: }
                   1158: 
                   1159: /*+F*************************************************************************
                   1160:  * Function:
                   1161:  *   aic7xxx_getscb
                   1162:  *
                   1163:  * Description:
                   1164:  *   Get a SCB from the controller.
                   1165:  *-F*************************************************************************/
                   1166: static inline void
                   1167: aic7xxx_getscb(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
                   1168: {
                   1169:   int base = p->base;
                   1170: 
                   1171:   /*
                   1172:    * This is almost identical to aic7xxx_putscb().
                   1173:    */
                   1174:   outb(SCBAUTO, SCBCNT + base);
                   1175:   insb(SCBARRAY + base, scb, SCB_PIO_TRANSFER_SIZE);
                   1176:   outb(0, SCBCNT + base);
                   1177: }
                   1178: 
                   1179: /*+F*************************************************************************
                   1180:  * Function:
                   1181:  *   aic7xxx_match_scb
                   1182:  *
                   1183:  * Description:
                   1184:  *   Checks to see if an scb matches the target/channel as specified.
                   1185:  *   If target is ALL_TARGETS (-1), then we're looking for any device
                   1186:  *   on the specified channel; this happens when a channel is going
                   1187:  *   to be reset and all devices on that channel must be aborted.
                   1188:  *-F*************************************************************************/
                   1189: static int
                   1190: aic7xxx_match_scb(struct aic7xxx_scb *scb, int target, char channel)
                   1191: {
                   1192:   int targ = (scb->target_channel_lun >> 4) & 0x0F;
                   1193:   char chan = (scb->target_channel_lun & SELBUSB) ? 'B' : 'A';
                   1194: 
                   1195: #ifdef AIC7XXX_DEBUG_ABORT
                   1196:   printk ("aic7xxx: (match_scb) comparing target/channel %d/%c to scb %d/%c\n",
                   1197:           target, channel, targ, chan);
                   1198: #endif
                   1199:   if (target == ALL_TARGETS)
                   1200:   {
                   1201:     return (chan == channel);
                   1202:   }
                   1203:   else
                   1204:   {
                   1205:     return ((chan == channel) && (targ == target));
                   1206:   }
                   1207: }
                   1208: 
                   1209: /*+F*************************************************************************
                   1210:  * Function:
                   1211:  *   aic7xxx_busy_target
                   1212:  *
                   1213:  * Description:
                   1214:  *   Set the specified target active.
                   1215:  *-F*************************************************************************/
                   1216: static void
                   1217: aic7xxx_busy_target(unsigned char target, char channel, int base)
                   1218: {
                   1219:   unsigned char active;
                   1220:   unsigned long active_port = ACTIVE_A + base;
                   1221: 
                   1222:   if ((target > 0x07) || (channel == 'B'))
                   1223:   {
                   1224:     /*
                   1225:      * targets on the Second channel or above id 7 store info in byte two
                   1226:      * of ACTIVE
                   1227:      */
                   1228:     active_port++;
                   1229:   }
                   1230:   active = inb(active_port);
                   1231:   active |= (0x01 << (target & 0x07));
                   1232:   outb(active, active_port);
                   1233: }
                   1234: 
                   1235: /*+F*************************************************************************
                   1236:  * Function:
                   1237:  *   aic7xxx_unbusy_target
                   1238:  *
                   1239:  * Description:
                   1240:  *   Set the specified target inactive.
                   1241:  *-F*************************************************************************/
                   1242: static void
                   1243: aic7xxx_unbusy_target(unsigned char target, char channel, int base)
                   1244: {
                   1245:   unsigned char active;
                   1246:   unsigned long active_port = ACTIVE_A + base;
                   1247: 
                   1248: #ifdef 0
                   1249:   printk ("aic7xxx: (unbusy_target) target/channel %d/%c\n",
                   1250:           target, channel);
                   1251: #endif
                   1252:   if ((target > 0x07) || (channel == 'B'))
                   1253:   {
                   1254:     /*
                   1255:      * targets on the Second channel or above id 7 store info in byte two
                   1256:      * of ACTIVE
                   1257:      */
                   1258:     active_port++;
                   1259:   }
                   1260:   active = inb(active_port);
                   1261:   active &= ~(0x01 << (target & 0x07));
                   1262:   outb(active, active_port);
                   1263: }
                   1264: 
                   1265: /*+F*************************************************************************
                   1266:  * Function:
                   1267:  *   aic7xxx_done
                   1268:  *
                   1269:  * Description:
                   1270:  *   Calls the higher level scsi done function and frees the scb.
                   1271:  *-F*************************************************************************/
                   1272: static void
                   1273: aic7xxx_done(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
                   1274: {
                   1275:   long flags;
                   1276:   Scsi_Cmnd *cmd = scb->cmd;
                   1277: 
                   1278: #ifdef 0
                   1279:   printk ("aic7xxx: (done) target/channel %d/%d\n",
                   1280:           cmd->target, cmd->channel);
                   1281: #endif
                   1282:   /*
                   1283:    * This is a critical section, since we don't want the
                   1284:    * queue routine mucking with the host data.
                   1285:    */
                   1286:   save_flags(flags);
                   1287:   cli();
                   1288: 
                   1289:   /*
                   1290:    * Process the command after marking the scb as free
                   1291:    * and adding it to the free list.
                   1292:    */
                   1293:   scb->state = SCB_FREE;
                   1294:   scb->next = p->free_scb;
                   1295:   p->free_scb = scb;
                   1296:   scb->cmd = NULL;
                   1297: 
                   1298:   restore_flags(flags);
                   1299: 
                   1300:   cmd->scsi_done(cmd);
                   1301: }
                   1302: 
                   1303: /*+F*************************************************************************
                   1304:  * Function:
                   1305:  *   aic7xxx_add_waiting_scb
                   1306:  *
                   1307:  * Description:
                   1308:  *   Add this SCB to the "waiting for selection" list.
                   1309:  *-F*************************************************************************/
                   1310: static void
                   1311: aic7xxx_add_waiting_scb(u_long              base,
                   1312:                         struct aic7xxx_scb *scb,
                   1313:                         insert_type         where)
                   1314: {
                   1315:   unsigned char head;
                   1316:   unsigned char curscb;
                   1317: 
                   1318:   curscb = inb(SCBPTR + base);
                   1319:   head = inb(WAITING_SCBH + base);
                   1320:   if (head == SCB_LIST_NULL)
                   1321:   {
                   1322:     /*
                   1323:      * List was empty
                   1324:      */
                   1325:     head = scb->position;
                   1326:   }
                   1327:   else
                   1328:   {
                   1329:     if (where == LIST_HEAD)
                   1330:     {
                   1331:       outb(scb->position, SCBPTR + base);
                   1332:       outb(head, SCB_NEXT_WAITING + base);
                   1333:       head = scb->position;
                   1334:     }
                   1335:     else
                   1336:     {
                   1337:       /* where == LIST_SECOND */
                   1338:       unsigned char third_scb;
                   1339: 
                   1340:       outb(head, SCBPTR + base);
                   1341:       third_scb = inb(SCB_NEXT_WAITING + base);
                   1342:       outb(scb->position, SCB_NEXT_WAITING + base);
                   1343:       outb(scb->position, SCBPTR + base);
                   1344:       outb(third_scb, SCB_NEXT_WAITING + base);
                   1345:     }
                   1346:   }
                   1347:   outb(head, WAITING_SCBH + base);
                   1348:   outb(curscb, SCBPTR + base);
                   1349: }
                   1350: 
                   1351: /*+F*************************************************************************
                   1352:  * Function:
                   1353:  *   aic7xxx_abort_waiting_scb
                   1354:  *
                   1355:  * Description:
                   1356:  *   Manipulate the waiting for selection list and return the
                   1357:  *   scb that follows the one that we remove.
                   1358:  *-F*************************************************************************/
                   1359: static unsigned char
                   1360: aic7xxx_abort_waiting_scb(struct aic7xxx_host *p, struct aic7xxx_scb *scb,
                   1361:                           unsigned char prev, unsigned char timedout_scb)
                   1362: {
                   1363:   unsigned char curscb, next;
                   1364:   int target = (scb->target_channel_lun >> 4) & 0x0F;
                   1365:   char channel = (scb->target_channel_lun & SELBUSB) ? 'B' : 'A';
                   1366:   int base = p->base;
                   1367: 
                   1368:   /*
                   1369:    * Select the SCB we want to abort and
                   1370:    * pull the next pointer out of it.
                   1371:    */
                   1372:   curscb = inb(SCBPTR + base);
                   1373:   outb(scb->position, SCBPTR + base);
                   1374:   next = inb(SCB_NEXT_WAITING + base);
                   1375: 
                   1376:   /*
                   1377:    * Clear the necessary fields
                   1378:    */
                   1379:   outb(0, SCBARRAY + base);
                   1380:   outb(SCB_LIST_NULL, SCB_NEXT_WAITING + base);
                   1381:   aic7xxx_unbusy_target(target, channel, base);
                   1382: 
                   1383:   /*
                   1384:    * Update the waiting list
                   1385:    */
                   1386:   if (prev == SCB_LIST_NULL)
                   1387:   {
                   1388:     /*
                   1389:      * First in the list
                   1390:      */
                   1391:     outb(next, WAITING_SCBH + base);
                   1392:   }
                   1393:   else
                   1394:   {
                   1395:     /*
                   1396:      * Select the scb that pointed to us and update its next pointer.
                   1397:      */
                   1398:     outb(prev, SCBPTR + base);
                   1399:     outb(next, SCB_NEXT_WAITING + base);
                   1400:   }
                   1401:   /*
                   1402:    * Update the tail pointer
                   1403:    */
                   1404:   if (inb(WAITING_SCBT + base) == scb->position)
                   1405:   {
                   1406:     outb(prev, WAITING_SCBT + base);
                   1407:   }
                   1408: 
                   1409:   /*
                   1410:    * Point us back at the original scb position
                   1411:    * and inform the SCSI system that the command
                   1412:    * has been aborted.
                   1413:    */
                   1414:   outb(curscb, SCBPTR + base);
                   1415:   scb->state |= SCB_ABORTED;
                   1416:   scb->cmd->result = (DID_RESET << 16);
                   1417:   aic7xxx_done(p, scb);
                   1418: 
                   1419: #ifdef AIC7XXX_DEBUG_ABORT
                   1420:   printk ("aic7xxx: (abort_waiting_scb) target/channel %d/%c, prev %d, "
                   1421:           "to_scb %d, next %d\n", target, channel, prev, timedout_scb, next);
                   1422: #endif
                   1423:   return (next);
                   1424: }
                   1425: 
                   1426: /*+F*************************************************************************
                   1427:  * Function:
                   1428:  *   aic7xxx_reset_device
                   1429:  *
                   1430:  * Description:
                   1431:  *   The device at the given target/channel has been reset.  Abort
                   1432:  *   all active and queued scbs for that target/channel.
                   1433:  *-F*************************************************************************/
                   1434: static int
                   1435: aic7xxx_reset_device(struct aic7xxx_host *p, int target, char channel,
                   1436:                      unsigned char timedout_scb)
                   1437: {
                   1438:   int base = p->base;
                   1439:   struct aic7xxx_scb *scb;
                   1440:   unsigned char active_scb;
                   1441:   int i = 0;
                   1442:   int found = 0;
                   1443: 
                   1444:   /*
                   1445:    * Restore this when we're done
                   1446:    */
                   1447:   active_scb = inb(SCBPTR + base);
                   1448: 
                   1449: #ifdef AIC7XXX_DEBUG_ABORT
                   1450:   printk ("aic7xxx: (reset_device) target/channel %d/%c, to_scb %d, "
                   1451:           "active_scb %d\n", target, channel, timedout_scb, active_scb);
                   1452: #endif
                   1453:   /*
                   1454:    * Search the QINFIFO.
                   1455:    */
                   1456:   {
                   1457:     int saved_queue[AIC7XXX_MAXSCB];
                   1458:     int queued = inb(QINCNT + base);
                   1459: 
                   1460:     for (i = 0; i < (queued - found); i++)
                   1461:     {
                   1462:       saved_queue[i] = inb(QINFIFO + base);
                   1463:       scb = &(p->scb_array[saved_queue[i]]);
                   1464:       if (aic7xxx_match_scb(scb, target, channel))
                   1465:       {
                   1466:         /*
                   1467:          * We found an scb that needs to be aborted.
                   1468:          */
                   1469:         scb->state |= SCB_ABORTED;
                   1470:         scb->cmd->result = (DID_RESET << 16);
                   1471:         aic7xxx_done(p, scb);
                   1472:         outb(scb->position, SCBPTR + base);
                   1473:         outb(0, SCBARRAY + base);
                   1474:         i--;
                   1475:         found++;
                   1476:       }
                   1477:     }
                   1478:     /*
                   1479:      * Now put the saved scbs back.
                   1480:      */
                   1481:     for (queued = 0; queued < i; queued++)
                   1482:     {
                   1483:       outb(saved_queue[queued], QINFIFO + base);
                   1484:     }
                   1485:   }
                   1486: 
                   1487:   /*
                   1488:    * Search waiting for selection list.
                   1489:    */
                   1490:   {
                   1491:     unsigned char next, prev;
                   1492: 
                   1493:     next = inb(WAITING_SCBH + base);  /* Start at head of list. */
                   1494:     prev = SCB_LIST_NULL;
                   1495: 
                   1496:     while (next != SCB_LIST_NULL)
                   1497:     {
                   1498:       scb = &(p->scb_array[next]);
                   1499:       /*
                   1500:        * Select the SCB.
                   1501:        */
                   1502:       if (aic7xxx_match_scb(scb, target, channel))
                   1503:       {
                   1504:         next = aic7xxx_abort_waiting_scb(p, scb, prev, timedout_scb);
                   1505:         found++;
                   1506:       }
                   1507:       else
                   1508:       {
                   1509:         outb(scb->position, SCBPTR + base);
                   1510:         prev = next;
                   1511:         next = inb(SCB_NEXT_WAITING + base);
                   1512:       }
                   1513:     }
                   1514:   }
                   1515: 
                   1516:   /*
                   1517:    * Go through the entire SCB array now and look for
                   1518:    * commands for this target that are active.  These
                   1519:    * are other (most likely tagged) commands that
                   1520:    * were disconnected when the reset occured.
                   1521:    */
                   1522:   for (i = 0; i < p->numscb; i++)
                   1523:   {
                   1524:     scb = &(p->scb_array[i]);
                   1525:     if ((scb->state & SCB_ACTIVE) && aic7xxx_match_scb(scb, target, channel))
                   1526:     {
                   1527:       /*
                   1528:        * Ensure the target is "free"
                   1529:        */
                   1530:       aic7xxx_unbusy_target(target, channel, base);
                   1531:       outb(scb->position, SCBPTR + base);
                   1532:       outb(0, SCBARRAY + base);
                   1533:       scb->state |= SCB_ABORTED;
                   1534:       scb->cmd->result = (DID_RESET << 16);
                   1535:       aic7xxx_done(p, scb);
                   1536:       found++;
                   1537:     }
                   1538:   }
                   1539: 
                   1540:   outb(active_scb, SCBPTR + base);
                   1541:   return (found);
                   1542: }
                   1543: 
                   1544: /*+F*************************************************************************
                   1545:  * Function:
                   1546:  *   aic7xxx_reset_current_bus
                   1547:  *
                   1548:  * Description:
                   1549:  *   Reset the current SCSI bus.
                   1550:  *-F*************************************************************************/
                   1551: static void
                   1552: aic7xxx_reset_current_bus(int base)
                   1553: {
                   1554: #ifdef AIC7XXX_DEBUG_ABORT
                   1555:     printk ("aic7xxx: (reset_current_bus)\n");
                   1556: #endif
                   1557:   outb(SCSIRSTO, SCSISEQ + base);
                   1558:   udelay(1000);
                   1559:   outb(0, SCSISEQ + base);
                   1560: }
                   1561: 
                   1562: /*+F*************************************************************************
                   1563:  * Function:
                   1564:  *   aic7xxx_reset_channel
                   1565:  *
                   1566:  * Description:
                   1567:  *   Reset the channel.
                   1568:  *-F*************************************************************************/
                   1569: static int
                   1570: aic7xxx_reset_channel(struct aic7xxx_host *p, char channel,
                   1571:                      unsigned char timedout_scb)
                   1572: {
                   1573:   int base = p->base;
                   1574:   unsigned char sblkctl;
                   1575:   char cur_channel;
                   1576:   unsigned long offset, offset_max;
                   1577:   int found;
                   1578: 
                   1579: #ifdef AIC7XXX_DEBUG_ABORT
                   1580:   printk ("aic7xxx: (reset_channel) channel %c, to_scb %d\n",
                   1581:           channel, timedout_scb);
                   1582: #endif
                   1583:   /*
                   1584:    * Clean up all the state information for the
                   1585:    * pending transactions on this bus.
                   1586:    */
                   1587:   found = aic7xxx_reset_device(p, ALL_TARGETS, channel, timedout_scb);
                   1588: 
                   1589:   if (channel == 'B')
                   1590:   {
                   1591:     p->needsdtr |= (p->needsdtr_copy & 0xFF00);
                   1592:     p->sdtr_pending &= 0x00FF;
                   1593:     outb(0, ACTIVE_B + base);
                   1594:     offset = TARG_SCRATCH + base + 8;
                   1595:     offset_max = TARG_SCRATCH + base + 16;
                   1596:   }
                   1597:   else
                   1598:   {
                   1599:     if (p->bus_type == AIC_WIDE)
                   1600:     {
                   1601:       p->needsdtr = p->needsdtr_copy;
                   1602:       p->needwdtr = p->needwdtr_copy;
                   1603:       p->sdtr_pending = 0x0;
                   1604:       p->wdtr_pending = 0x0;
                   1605:       outb(0, ACTIVE_A + base);
                   1606:       outb(0, ACTIVE_B + base);
                   1607:       offset = TARG_SCRATCH + base;
                   1608:       offset_max = TARG_SCRATCH + base + 16;
                   1609:     }
                   1610:     else
                   1611:     {
                   1612:       p->needsdtr |= (p->needsdtr_copy & 0x00FF);
                   1613:       p->sdtr_pending &= 0xFF00;
                   1614:       outb(0, ACTIVE_A + base);
                   1615:       offset = TARG_SCRATCH + base;
                   1616:       offset_max = TARG_SCRATCH + base + 8;
                   1617:     }
                   1618:   }
                   1619:   while (offset < offset_max)
                   1620:   {
                   1621:     /*
                   1622:      * Revert to async/narrow transfers
                   1623:      * until we renegotiate.
                   1624:      */
                   1625:     u_char targ_scratch;
                   1626:     targ_scratch = inb(offset);
                   1627:     targ_scratch &= SXFR;
                   1628:     outb(targ_scratch, offset);
                   1629:     offset++;
                   1630:   }
                   1631: 
                   1632:   /*
                   1633:    * Reset the bus and unpause/restart the controller
                   1634:    */
                   1635: 
                   1636:   /*
                   1637:    * Case 1: Command for another bus is active
                   1638:    */
                   1639:   sblkctl = inb(SBLKCTL + base);
                   1640:   cur_channel = (sblkctl & SELBUSB) ? 'B' : 'A';
                   1641:   if (cur_channel != channel)
                   1642:   {
                   1643: #ifdef AIC7XXX_DEBUG_ABORT
                   1644:     printk ("aic7xxx: (reset_channel) Stealthily resetting channel %c\n",
                   1645:             channel);
                   1646: #endif
                   1647:     /*
                   1648:      * Stealthily reset the other bus without upsetting the current bus
                   1649:      */
                   1650:     outb(sblkctl ^ SELBUSB, SBLKCTL + base);
                   1651:     aic7xxx_reset_current_bus(base);
                   1652:     outb(sblkctl, SBLKCTL + base);
                   1653: 
                   1654:     UNPAUSE_SEQUENCER(p);
                   1655:   }
                   1656:   /*
                   1657:    * Case 2: A command from this bus is active or we're idle
                   1658:    */
                   1659:   else
                   1660:   {
                   1661: #ifdef AIC7XXX_DEBUG_ABORT
                   1662:     printk ("aic7xxx: (reset_channel) Resetting current channel %c\n",
                   1663:             channel);
                   1664: #endif
                   1665:     aic7xxx_reset_current_bus(base);
                   1666:     RESTART_SEQUENCER(p);
                   1667:   }
                   1668: 
                   1669:   return found;
                   1670: }
                   1671: 
                   1672: /*+F*************************************************************************
                   1673:  * Function:
                   1674:  *   aic7xxx_isr
                   1675:  *
                   1676:  * Description:
                   1677:  *   SCSI controller interrupt handler.
                   1678:  *
                   1679:  *   NOTE: Since we declared this using SA_INTERRUPT, interrupts should
                   1680:  *         be disabled all through this function unless we say otherwise.
                   1681:  *-F*************************************************************************/
                   1682: static void
                   1683: aic7xxx_isr(int irq, struct pt_regs * regs)
                   1684: {
                   1685:   int base, intstat;
                   1686:   struct aic7xxx_host *p;
                   1687:   struct aic7xxx_scb *scb;
                   1688:   unsigned char ha_flags;
                   1689:   short         transfer;
                   1690:   unsigned char scsi_id, bus_width;
                   1691:   unsigned char offset, rate, scratch, scratch_offset;
                   1692:   unsigned char max_offset, rej_byte;
                   1693:   unsigned short target_mask;
                   1694:   char channel;
                   1695:   void *addr;
                   1696:   int actual;
                   1697:   int scb_index;
                   1698:   Scsi_Cmnd *cmd;
                   1699: 
                   1700:   p = (struct aic7xxx_host *) aic7xxx_boards[irq]->hostdata;
                   1701: 
                   1702:   /*
                   1703:    * Search for the host with a pending interrupt.  If we can't find
                   1704:    * one, then we've encountered a spurious interrupt.
                   1705:    */
                   1706:   while ((p != NULL) && !(inb(INTSTAT + p->base) & INT_PEND))
                   1707:   {
                   1708:     if (p->next == NULL)
                   1709:     {
                   1710:       p = NULL;
                   1711:     }
                   1712:     else
                   1713:     {
                   1714:       p = (struct aic7xxx_host *) p->next->hostdata;
                   1715:     }
                   1716:   }
                   1717: 
                   1718:   if (p == NULL)
                   1719:   {
                   1720:     if (aic7xxx_spurious_count == 1)
                   1721:     {
                   1722:       aic7xxx_spurious_count = 2;
                   1723:       printk("aic7xxx: (aic7xxx_isr) Encountered spurious interrupt.\n");
                   1724:       return;
                   1725:     }
                   1726:     else
                   1727:     {
                   1728:       /*
                   1729:        * The best we can do is to set p back to head of list and process
                   1730:        * the erroneous interrupt - most likely a BRKADRINT.
                   1731:        */
                   1732:       p = (struct aic7xxx_host *) aic7xxx_boards[irq]->hostdata;
                   1733:     }
                   1734:   }
                   1735: 
                   1736:   /*
                   1737:    * Keep track of interrupts for /proc/scsi
                   1738:    */
                   1739:   p->isr_count++;
                   1740: 
                   1741:   if (!p->a_scanned && (p->isr_count == 1))
                   1742:   {
                   1743:     /*
                   1744:      * We must only have one card at this IRQ and it must have been
                   1745:      * added to the board data before the spurious interrupt occurred.
                   1746:      * It is sufficient that we check isr_count and not the spurious
                   1747:      * interrupt count.
                   1748:      */
                   1749:     printk("aic7xxx: (aic7xxx_isr) Encountered spurious interrupt.\n");
                   1750:     return;
                   1751:   }
                   1752: 
                   1753:   base = p->base;
                   1754:   /*
                   1755:    * Handle all the interrupt sources - especially for SCSI
                   1756:    * interrupts, we won't get a second chance at them.
                   1757:    */
                   1758:   intstat = inb(INTSTAT + base);
                   1759: 
                   1760:   if (intstat & BRKADRINT)
                   1761:   {
                   1762:     int i;
                   1763:     unsigned char errno = inb(ERROR + base);
                   1764: 
                   1765:     printk("aic7xxx: (aic7xxx_isr) BRKADRINT error(0x%x):\n", errno);
                   1766:     for (i = 0; i < NUMBER(hard_error); i++)
                   1767:     {
                   1768:       if (errno & hard_error[i].errno)
                   1769:       {
                   1770:        printk("  %s\n", hard_error[i].errmesg);
                   1771:       }
                   1772:     }
                   1773: 
                   1774:     panic("aic7xxx: (aic7xxx_isr) BRKADRINT, error(0x%x) seqaddr(0x%x).\n",
                   1775:          inb(ERROR + base), (inb(SEQADDR1 + base) << 8) | inb(SEQADDR0 + base));
                   1776:   }
                   1777: 
                   1778:   if (intstat & SEQINT)
                   1779:   {
                   1780:     /*
                   1781:      * Although the sequencer is paused immediately on
                   1782:      * a SEQINT, an interrupt for a SCSIINT condition will
                   1783:      * unpaused the sequencer before this point.
                   1784:      */
                   1785:     PAUSE_SEQUENCER(p);
                   1786: 
                   1787:     scsi_id = (inb(SCSIID + base) >> 4) & 0x0F;
                   1788:     scratch_offset = scsi_id;
                   1789:     channel = 'A';
                   1790:     if (inb(SBLKCTL + base) & SELBUSB)
                   1791:     {
                   1792:       channel = 'B';
                   1793:       scratch_offset += 8;
                   1794:     }
                   1795:     target_mask = (0x01 << scratch_offset);
                   1796: 
                   1797:     switch (intstat & SEQINT_MASK)
                   1798:     {
                   1799:       case BAD_PHASE:
                   1800:        panic("aic7xxx: (aic7xxx_isr) Unknown scsi bus phase.\n");
                   1801:        break;
                   1802: 
                   1803:       case SEND_REJECT:
                   1804:         rej_byte = inb(REJBYTE + base);
                   1805:         if ((rej_byte & 0xF0) == 0x20)
                   1806:         {
                   1807:           scb_index = inb(SCBPTR + base);
                   1808:           scb = &(p->scb_array[scb_index]);
                   1809:           printk("aic7xxx: Warning - Tagged message received without identify."
                   1810:                  "Disabling tagged commands for target %d channel %c.\n",
                   1811:                   scsi_id, channel);
                   1812:           scb->cmd->device->tagged_supported = 0;
                   1813:           scb->cmd->device->tagged_queue = 0;
                   1814:         }
                   1815:         else
                   1816:         {
                   1817:           debug("aic7xxx: Warning - Rejecting unknown message (0x%x) received "
                   1818:                 "from target %d channel %c.\n", rej_byte, scsi_id, channel);
                   1819:         }
                   1820:        break;
                   1821: 
                   1822:       case NO_IDENT:
                   1823:        panic("aic7xxx: Target %d, channel %c, did not send an IDENTIFY "
                   1824:              "message. SAVED_TCL(0x%x).\n",
                   1825:               scsi_id, channel, inb(SAVED_TCL + base));
                   1826:        break;
                   1827: 
                   1828:       case NO_MATCH:
                   1829:        printk("aic7xxx: No active SCB for reconnecting target %d, "
                   1830:              "channel %c - Issuing ABORT. SAVED_TCL(0x%x).\n",
                   1831:               scsi_id, channel, inb(SAVED_TCL + base));
                   1832:         aic7xxx_unbusy_target(scsi_id, channel, base);
                   1833:         outb(0, SCBARRAY + base);
                   1834:        outb(CLRSELTIMEO, CLRSINT1 + base);
                   1835:        RESTART_SEQUENCER(p);
                   1836:        break;
                   1837: 
                   1838:       case SDTR_MSG:
                   1839:        /*
                   1840:         * Help the sequencer to translate the negotiated
                   1841:         * transfer rate. Transfer is 1/4 the period
                   1842:         * in ns as is returned by the sync negotiation
                   1843:         * message. So, we must multiply by four.
                   1844:         */
                   1845:        transfer = (inb(ARG_1 + base) << 2);
                   1846:        offset = inb(ACCUM + base);
                   1847:        scratch = inb(TARG_SCRATCH + base + scratch_offset);
                   1848:        /*
                   1849:         * The maximum offset for a wide device is 0x08; for a
                   1850:         * 8-bit bus device the maximum offset is 0x0F.
                   1851:         */
                   1852:        if (scratch & WIDEXFER)
                   1853:        {
                   1854:          max_offset = 0x08;
                   1855:        }
                   1856:        else
                   1857:        {
                   1858:          max_offset = 0x0F;
                   1859:        }
                   1860:        aic7xxx_scsirate(p, &rate, transfer, MIN(offset, max_offset),
                   1861:                          scsi_id, channel);
                   1862:        /*
                   1863:         * Preserve the wide transfer flag.
                   1864:         */
                   1865:        scratch = rate | (scratch & WIDEXFER);
                   1866:        outb(scratch, TARG_SCRATCH + base + scratch_offset);
                   1867:        outb(scratch, SCSIRATE + base);
                   1868:        if ((scratch & 0x0F) == 0)
                   1869:        { /*
                   1870:           * The requested rate was so low that asynchronous transfers
                   1871:           * are faster (not to mention the controller won't support
                   1872:           * them), so we issue a reject to ensure we go to asynchronous
                   1873:           * transfers.
                   1874:           */
                   1875:           outb(SEND_REJ, RETURN_1 + base);
                   1876:        }
                   1877:        else
                   1878:        {
                   1879:          /*
                   1880:           * See if we initiated Sync Negotiation
                   1881:           */
                   1882:          if (p->sdtr_pending & target_mask)
                   1883:          {
                   1884:            /*
                   1885:             * Don't send an SDTR back to the target.
                   1886:             */
                   1887:            outb(0, RETURN_1 + base);
                   1888:          }
                   1889:          else
                   1890:          {
                   1891:            /*
                   1892:             * Send our own SDTR in reply.
                   1893:             */
                   1894:            printk("aic7xxx: Sending SDTR!!\n");
                   1895:            outb(SEND_SDTR, RETURN_1 + base);
                   1896:          }
                   1897:        }
                   1898:        /*
                   1899:         * Clear the flags.
                   1900:         */
                   1901:        p->needsdtr &= ~target_mask;
                   1902:        p->sdtr_pending &= ~target_mask;
                   1903:        break;
                   1904: 
                   1905:       case WDTR_MSG:
                   1906:       {
                   1907:        bus_width = inb(ARG_1 + base);
                   1908:        printk("aic7xxx: Received MSG_WDTR, Target %d, channel %c "
                   1909:               "needwdtr(0x%x).\n", scsi_id, channel, p->needwdtr);
                   1910:        scratch = inb(TARG_SCRATCH + base + scratch_offset);
                   1911: 
                   1912:        if (p->wdtr_pending & target_mask)
                   1913:        {
                   1914:          /*
                   1915:           * Don't send an WDTR back to the target, since we asked first.
                   1916:           */
                   1917:          outb(0, RETURN_1 + base);
                   1918:          switch (bus_width)
                   1919:          {
                   1920:            case BUS_8_BIT:
                   1921:              scratch &= 0x7F;
                   1922:              break;
                   1923: 
                   1924:            case BUS_16_BIT:
                   1925:              printk("aic7xxx: Target %d, channel %c, using 16 bit "
                   1926:                      "transfers.\n", scsi_id, channel);
                   1927:              scratch |= 0x80;
                   1928:              break;
                   1929: 
                   1930:            case BUS_32_BIT:
                   1931:              outb(SEND_REJ, RETURN_1 + base);
                   1932:              printk("aic7xxx: Target %d, channel %c, requesting 32 bit "
                   1933:                      "transfers, rejecting...\n", scsi_id, channel);
                   1934:              break;
                   1935:          }
                   1936:        }
                   1937:        else
                   1938:        {
                   1939:          /*
                   1940:           * Send our own WDTR in reply.
                   1941:           */
                   1942:          printk("aic7xxx: Will send WDTR!!\n");
                   1943:          switch (bus_width)
                   1944:          {
                   1945:            case BUS_8_BIT:
                   1946:              scratch &= 0x7F;
                   1947:              break;
                   1948: 
                   1949:            case BUS_32_BIT:
                   1950:              /*
                   1951:                * Negotiate 16 bits.
                   1952:                */
                   1953:              bus_width = BUS_16_BIT;
                   1954:              /* Yes, we mean to fall thru here. */
                   1955: 
                   1956:            case BUS_16_BIT:
                   1957:              printk("aic7xxx: Target %d, channel %c, using 16 bit "
                   1958:                      "transfers.\n", scsi_id, channel);
                   1959:              scratch |= 0x80;
                   1960:              break;
                   1961:          }
                   1962:          outb(bus_width | SEND_WDTR, RETURN_1 + base);
                   1963:        }
                   1964:        p->needwdtr &= ~target_mask;
                   1965:        p->wdtr_pending &= ~target_mask;
                   1966:        outb(scratch, TARG_SCRATCH + base + scratch_offset);
                   1967:        outb(scratch, SCSIRATE + base);
                   1968:        break;
                   1969:       }
                   1970: 
                   1971:       case REJECT_MSG:
                   1972:       {
                   1973:        /*
                   1974:         * What we care about here is if we had an
                   1975:         * outstanding SDTR or WDTR message for this
                   1976:         * target. If we did, this is a signal that
                   1977:         * the target is refusing negotiation.
                   1978:         */
                   1979: 
                   1980:        scratch = inb(TARG_SCRATCH + base + scratch_offset);
                   1981: 
                   1982:        if (p->wdtr_pending & target_mask)
                   1983:        {
                   1984:          /*
                   1985:           * note 8bit xfers and clear flag
                   1986:           */
                   1987:          scratch &= 0x7F;
                   1988:          p->needwdtr &= ~target_mask;
                   1989:          p->wdtr_pending &= ~target_mask;
                   1990:          printk("aic7xxx: Target %d, channel %c, refusing WIDE negotiation. "
                   1991:                  "Using 8 bit transfers.\n", scsi_id, channel);
                   1992:        }
                   1993:        else
                   1994:        {
                   1995:          if (p->sdtr_pending & target_mask)
                   1996:          {
                   1997:            /*
                   1998:             * note asynch xfers and clear flag
                   1999:             */
                   2000:            scratch &= 0xF0;
                   2001:            p->needsdtr &= ~target_mask;
                   2002:            p->sdtr_pending &= ~target_mask;
                   2003:            printk("aic7xxx: Target %d, channel %c, refusing synchronous "
                   2004:                    "negotiation. Using asynchronous transfers.\n",
                   2005:                    scsi_id, channel);
                   2006:          }
                   2007:          /*
                   2008:           * Otherwise, we ignore it.
                   2009:           */
                   2010:        }
                   2011:        outb(scratch, TARG_SCRATCH + base + scratch_offset);
                   2012:        outb(scratch, SCSIRATE + base);
                   2013:        break;
                   2014:       }
                   2015: 
                   2016:       case BAD_STATUS:
                   2017:        scb_index = inb(SCBPTR + base);
                   2018:        scb = &(p->scb_array[scb_index]);
                   2019:        outb(0, RETURN_1 + base);   /* CHECK_CONDITION may change this */
                   2020:        if (!(scb->state & SCB_ACTIVE) || (scb->cmd == NULL))
                   2021:        {
                   2022:          printk("aic7xxx: Referenced SCB not valid during SEQINT(0x%x) "
                   2023:                 "scb(%d) state(0x%x) cmd(0x%x).\n",
                   2024:                 intstat, scb_index, scb->state, (unsigned int) scb->cmd);
                   2025:        }
                   2026:        else
                   2027:        {
                   2028:          cmd = scb->cmd;
                   2029:          aic7xxx_getscb(p, scb);
                   2030:          aic7xxx_status(cmd) = scb->target_status;
                   2031: 
                   2032:          cmd->result |= scb->target_status;
                   2033: 
                   2034:          switch (status_byte(scb->target_status))
                   2035:          {
                   2036:            case GOOD:
                   2037:               printk("aic7xxx: Interrupted for status of GOOD???\n");
                   2038:              break;
                   2039: 
                   2040:            case CHECK_CONDITION:
                   2041:              if ((aic7xxx_error(cmd) == 0) && !(cmd->flags & WAS_SENSE))
                   2042:              {
                   2043:                 unsigned char tcl;
                   2044:                 unsigned char control;
                   2045:                void         *req_buf;
                   2046: 
                   2047:                 tcl = scb->target_channel_lun;
                   2048: 
                   2049:                /*
                   2050:                  * Send a sense command to the requesting target.
                   2051:                  */
                   2052:                cmd->flags |= WAS_SENSE;
                   2053:                memcpy((void *) scb->sense_cmd, (void *) generic_sense,
                   2054:                       sizeof(generic_sense));
                   2055: 
                   2056:                scb->sense_cmd[1] = (cmd->lun << 5);
                   2057:                scb->sense_cmd[4] = sizeof(cmd->sense_buffer);
                   2058: 
                   2059:                scb->sense_sg.address = (char *) &cmd->sense_buffer;
                   2060:                scb->sense_sg.length = sizeof(cmd->sense_buffer);
                   2061:                req_buf = &scb->sense_sg;
                   2062:                cmd->cmd_len = COMMAND_SIZE(cmd->cmnd[0]);
                   2063:                 control = scb->control;
                   2064: 
                   2065:                memset(scb, 0, SCB_PIO_TRANSFER_SIZE);
                   2066:                 scb->control = control & DISCENB;
                   2067:                scb->target_channel_lun = tcl;
                   2068:                addr = scb->sense_cmd;
                   2069:                scb->SCSI_cmd_length = COMMAND_SIZE(scb->sense_cmd[0]);
                   2070:                memcpy(scb->SCSI_cmd_pointer, &addr,
                   2071:                       sizeof(scb->SCSI_cmd_pointer));
                   2072:                scb->SG_segment_count = 1;
                   2073:                memcpy(scb->SG_list_pointer, &req_buf,
                   2074:                        sizeof(scb->SG_list_pointer));
                   2075:                 scb->data_count = scb->sense_sg.length;
                   2076:                memcpy(scb->data_pointer, &(scb->sense_sg.address), 4);
                   2077: 
                   2078:                 aic7xxx_putscb(p, scb);
                   2079:                outb(SCB_LIST_NULL, SCB_NEXT_WAITING + base);
                   2080:                 /*
                   2081:                  * Ensure that the target is "BUSY" so we don't get overlapping
                   2082:                  * commands if we happen to be doing tagged I/O.
                   2083:                  */
                   2084:                aic7xxx_busy_target(scsi_id, channel, base);
                   2085: 
                   2086:                 aic7xxx_add_waiting_scb(base, scb, LIST_HEAD);
                   2087:                outb(SEND_SENSE, RETURN_1 + base);
                   2088:              }  /* first time sense, no errors */
                   2089: 
                   2090:               cmd->flags &= ~ASKED_FOR_SENSE;
                   2091:              if (aic7xxx_error(cmd) == 0)
                   2092:               {
                   2093:                aic7xxx_error(cmd) = DID_RETRY_COMMAND;
                   2094:               }
                   2095:              break;
                   2096: 
                   2097:            case BUSY:
                   2098:              printk("aic7xxx: Target busy.\n");
                   2099:              if (!aic7xxx_error(cmd))
                   2100:              {
                   2101:                aic7xxx_error(cmd) = DID_BUS_BUSY;
                   2102:              }
                   2103:              break;
                   2104: 
                   2105:            case QUEUE_FULL:
                   2106:              printk("aic7xxx: Queue full.\n");
                   2107:              if (!aic7xxx_error(cmd))
                   2108:              {
                   2109:                aic7xxx_error(cmd) = DID_RETRY_COMMAND;
                   2110:              }
                   2111:              break;
                   2112: 
                   2113:            default:
                   2114:              printk("aic7xxx: Unexpected target status(0x%x).\n",
                   2115:                     scb->target_status);
                   2116:              if (!aic7xxx_error(cmd))
                   2117:              {
                   2118:                aic7xxx_error(cmd) = DID_RETRY_COMMAND;
                   2119:              }
                   2120:              break;
                   2121:          }  /* end switch */
                   2122:        }  /* end else of */
                   2123:        break;
                   2124: 
                   2125:       case RESIDUAL:
                   2126:        scb_index = inb(SCBPTR + base);
                   2127:        scb = &(p->scb_array[scb_index]);
                   2128:        if (!(scb->state & SCB_ACTIVE) || (scb->cmd == NULL))
                   2129:        {
                   2130:          printk("aic7xxx: Referenced SCB not valid during SEQINT(0x%x) "
                   2131:                 "scb(%d) state(0x%x) cmd(0x%x).\n",
                   2132:                 intstat, scb_index, scb->state, (unsigned int) scb->cmd);
                   2133:        }
                   2134:        else
                   2135:        {
                   2136:          cmd = scb->cmd;
                   2137:          /*
                   2138:           *  Don't destroy valid residual information with
                   2139:           *  residual coming from a check sense operation.
                   2140:           */
                   2141:          if (!(cmd->flags & WAS_SENSE))
                   2142:          {
                   2143:            /*
                   2144:             *  We had an underflow. At this time, there's only
                   2145:             *  one other driver that bothers to check for this,
                   2146:             *  and cmd->underflow seems to be set rather half-
                   2147:             *  heartedly in the higher-level SCSI code.
                   2148:             */
                   2149:            actual = aic7xxx_length(cmd, scb->residual_SG_segment_count);
                   2150: 
                   2151:            actual -= (inb(SCB_RESID_DCNT2 + base) << 16) |
                   2152:                      (inb(SCB_RESID_DCNT1 + base) <<  8) |
                   2153:                      inb(SCB_RESID_DCNT0 + base);
                   2154: 
                   2155:            if (actual < cmd->underflow)
                   2156:            {
                   2157:              printk("aic7xxx: Target %d underflow - "
                   2158:                     "Wanted (at least) (%u) got(%u) count(%d).\n",
                   2159:                     cmd->target, cmd->underflow, actual,
                   2160:                      inb(SCB_RESID_SGCNT + base));
                   2161:              aic7xxx_error(cmd) = DID_RETRY_COMMAND;
                   2162:              aic7xxx_status(cmd) = scb->target_status;
                   2163:            }
                   2164:          }
                   2165:        }
                   2166:        break;
                   2167: 
                   2168:       case ABORT_TAG:
                   2169:        scb_index = inb(SCBPTR + base);
                   2170:        scb = &(p->scb_array[scb_index]);
                   2171:        if (!(scb->state & SCB_ACTIVE) || (scb->cmd == NULL))
                   2172:        {
                   2173:          printk("aic7xxx: Referenced SCB not valid during SEQINT(0x%x) "
                   2174:                 "scb(%d) state(0x%x) cmd(0x%x)\n",
                   2175:                 intstat, scb_index, scb->state, (unsigned int) scb->cmd);
                   2176:        }
                   2177:        else
                   2178:        {
                   2179:          cmd = scb->cmd;
                   2180:          /*
                   2181:           * We didn't receive a valid tag back from the target
                   2182:           * on a reconnect.
                   2183:           */
                   2184:          printk("aic7xxx: Invalid tag received on target %d, channel %c, "
                   2185:                  "lun %d - Sending ABORT_TAG.\n",
                   2186:                  scsi_id, channel, cmd->lun & 0x07);
                   2187: 
                   2188:          cmd->result = (DID_RETRY_COMMAND << 16);
                   2189:           aic7xxx_done(p, scb);
                   2190:        }
                   2191:        break;
                   2192: 
                   2193:       case AWAITING_MSG:
                   2194:        scb_index = inb(SCBPTR + base);
                   2195:        scb = &(p->scb_array[scb_index]);
                   2196:        if (!(scb->state & SCB_ACTIVE) || (scb->cmd == NULL))
                   2197:        {
                   2198:          printk("aic7xxx: Referenced SCB not valid during SEQINT(0x%x) "
                   2199:                 "scb(%d) state(0x%x) cmd(0x%x).\n",
                   2200:                 intstat, scb_index, scb->state, (unsigned int) scb->cmd);
                   2201:        }
                   2202:        else
                   2203:        {
                   2204:          /*
                   2205:           * This SCB had a zero length command, informing the sequencer
                   2206:           * that we wanted to send a special message to this target.
                   2207:           * We only do this for BUS_DEVICE_RESET messages currently.
                   2208:           */
                   2209:           if (scb->state & SCB_DEVICE_RESET)
                   2210:           {
                   2211: #ifdef AIC7XXX_DEBUG_ABORT
                   2212:   printk ("aic7xxx: (isr) sending bus device reset to target %d\n",
                   2213:           scsi_id);
                   2214: #endif
                   2215:             outb(MSG_BUS_DEVICE_RESET, MSG0 + base);
                   2216:             outb(1, MSG_LEN + base);
                   2217:           }
                   2218:           else
                   2219:           {
                   2220:             panic("aic7xxx: AWAITING_SCB for an SCB that does "
                   2221:                   "not have a waiting message.\n");
                   2222:           }
                   2223:        }
                   2224:        break;
                   2225: 
                   2226:       case IMMEDDONE:
                   2227:         scb_index = inb(SCBPTR + base);
                   2228:        scb = &(p->scb_array[scb_index]);
                   2229: #ifdef AIC7XXX_DEBUG_ABORT
                   2230:   printk ("aic7xxx: (isr) received IMMEDDONE for target %d, scb %d, state %d\n",
                   2231:           scsi_id, scb_index, scb->state);
                   2232: #endif
                   2233:         if (scb->state & SCB_DEVICE_RESET)
                   2234:         {
                   2235:           int found;
                   2236: 
                   2237:           /*
                   2238:            * Go back to async/narrow transfers and renogiate.
                   2239:            */
                   2240:           aic7xxx_unbusy_target(scsi_id, channel, base);
                   2241:           p->needsdtr |= (p->needsdtr_copy & target_mask);
                   2242:           p->needwdtr |= (p->needwdtr_copy & target_mask);
                   2243:           p->sdtr_pending &= ~target_mask;
                   2244:           p->wdtr_pending &= ~target_mask;
                   2245:           scratch = inb(TARG_SCRATCH + base + scratch_offset);
                   2246:           scratch &= SXFR;
                   2247:           outb(scratch, TARG_SCRATCH + base + scratch_offset);
                   2248:           found = aic7xxx_reset_device(p, (int) scsi_id, channel, SCB_LIST_NULL);
                   2249:         }
                   2250:         else
                   2251:         {
                   2252:           panic("aic7xxx: Immediate complete for unknown operation.\n");
                   2253:         }
                   2254:         break;
                   2255: 
                   2256: #if AIC7XXX_NOT_YET
                   2257:      /* XXX Fill these in later */
                   2258:      case MESG_BUFFER_BUSY:
                   2259:        break;
                   2260:      case MSGIN_PHASEMIS:
                   2261:        break;
                   2262: #endif
                   2263: 
                   2264:       case PARITY_ERROR:
                   2265:       {
                   2266:        scb_index = inb(SCBPTR + base);
                   2267:        scb = &(p->scb_array[scb_index]);
                   2268:        if (!(scb->state & SCB_ACTIVE) || (scb->cmd == NULL))
                   2269:        {
                   2270:          printk("aic7xxx: Referenced SCB not valid during SEQINT(0x%x) "
                   2271:                 "scb(%d) state(0x%x) cmd(0x%x).\n",
                   2272:                 intstat, scb_index, scb->state, (unsigned int) scb->cmd);
                   2273:        }
                   2274:        else
                   2275:        {
                   2276:           char  *phase;
                   2277:           unsigned char mesg_out = MSG_NOP;
                   2278:           unsigned char lastphase = inb(LASTPHASE + base);
                   2279: 
                   2280:          cmd = scb->cmd;
                   2281:           switch (lastphase)
                   2282:           {
                   2283:             case P_DATAOUT:
                   2284:               phase = "Data-Out";
                   2285:               break;
                   2286:             case P_DATAIN:
                   2287:               phase = "Data-In";
                   2288:               mesg_out = MSG_INITIATOR_DET_ERROR;
                   2289:               break;
                   2290:             case P_COMMAND:
                   2291:               phase = "Command";
                   2292:               break;
                   2293:             case P_MESGOUT:
                   2294:               phase = "Message-Out";
                   2295:               break;
                   2296:             case P_STATUS:
                   2297:               phase = "Status";
                   2298:               mesg_out = MSG_INITIATOR_DET_ERROR;
                   2299:               break;
                   2300:             case P_MESGIN:
                   2301:               phase = "Message-In";
                   2302:               mesg_out = MSG_MSG_PARITY_ERROR;
                   2303:               break;
                   2304:             default:
                   2305:               phase = "unknown";
                   2306:               break;
                   2307:           }
                   2308: 
                   2309:           /*
                   2310:            * A parity error has occurred during a data
                   2311:            * transfer phase. Flag it and continue.
                   2312:            */
                   2313:           printk("aic7xxx: Parity error during phase %s on target %d, "
                   2314:                  "channel %d, lun %d.\n", phase,
                   2315:                  cmd->target, cmd->channel & 0x01, cmd->lun & 0x07);
                   2316: 
                   2317:           /*
                   2318:            * We've set the hardware to assert ATN if we get a parity
                   2319:            * error on "in" phases, so all we need to do is stuff the
                   2320:            * message buffer with the appropriate message. In phases
                   2321:            * have set mesg_out to something other than MSG_NOP.
                   2322:            */
                   2323:           if (mesg_out != MSG_NOP)
                   2324:           {
                   2325:              outb(mesg_out, MSG0 + base);
                   2326:              outb(1, MSG_LEN + base);
                   2327:              aic7xxx_error(cmd) = DID_PARITY;
                   2328:           }
                   2329:           else
                   2330:           {
                   2331:              /*
                   2332:               * Should we allow the target to make this decision for us?
                   2333:               */
                   2334:              aic7xxx_error(cmd) = DID_RETRY_COMMAND;
                   2335:           }
                   2336:         }
                   2337:         break;
                   2338:       }
                   2339:       default:               /* unknown */
                   2340:        debug("aic7xxx: SEQINT, INTSTAT(0x%x) SCSISIGI(0x%x).\n",
                   2341:              intstat, inb(SCSISIGI + base));
                   2342:        break;
                   2343:     }
                   2344: 
                   2345:     outb(CLRSEQINT, CLRINT + base);
                   2346:     UNPAUSE_SEQUENCER(p);
                   2347:   }
                   2348: 
                   2349:   if (intstat & SCSIINT)
                   2350:   {
                   2351:     int status = inb(SSTAT1 + base);
                   2352:     scsi_id = (inb(SCSIID + base) >> 4) & 0x0F;
                   2353:     channel = 'A';
                   2354:     if (inb(SBLKCTL + base) & SELBUSB)
                   2355:     {
                   2356:       channel = 'B';
                   2357:     }
                   2358: 
                   2359:     scb_index = inb(SCBPTR + base);
                   2360:     scb = &(p->scb_array[scb_index]);
                   2361:     if (!(scb->state & SCB_ACTIVE) || (scb->cmd == NULL))
                   2362:     {
                   2363:       printk("aic7xxx: No command for SCB (SCSIINT).\n");
                   2364:       /*
                   2365:        * Turn off the interrupt and set status
                   2366:        * to zero, so that it falls through the
                   2367:        * reset of the SCSIINT code.
                   2368:        */
                   2369:       outb(status, CLRSINT1 + base);
                   2370:       UNPAUSE_SEQUENCER(p);
                   2371:       outb(CLRSCSIINT, CLRINT + base);
                   2372:       scb = NULL;
                   2373:     }
                   2374:     else
                   2375:     {
                   2376:       cmd = scb->cmd;
                   2377: 
                   2378:       /*
                   2379:        * Only the SCSI Status 1 register has information
                   2380:        * about exceptional conditions that we'd have a
                   2381:        * SCSIINT about; anything in SSTAT0 will be handled
                   2382:        * by the sequencer. Note that there can be multiple
                   2383:        * bits set.
                   2384:        */
                   2385:       if (status & SELTO)
                   2386:       {
                   2387:        unsigned char waiting;
                   2388: 
                   2389:        /*
                   2390:         * Hardware selection timer has expired. Turn
                   2391:         * off SCSI selection sequence.
                   2392:         */
                   2393:        outb(ENRSELI, SCSISEQ + base);
                   2394:        cmd->result = (DID_TIME_OUT << 16);
                   2395:        /*
                   2396:         * Clear an pending messages for the timed out
                   2397:         * target and mark the target as free.
                   2398:         */
                   2399:        ha_flags = inb(FLAGS + base);
                   2400:        outb(0, MSG_LEN + base);
                   2401:         aic7xxx_unbusy_target(scsi_id, channel, base);
                   2402: 
                   2403:        outb(0, SCBARRAY + base);
                   2404: 
                   2405:        /*
                   2406:         * Shut off the offending interrupt sources, reset
                   2407:         * the sequencer address to zero and unpause it,
                   2408:         * then call the high-level SCSI completion routine.
                   2409:         *
                   2410:         * WARNING!  This is a magic sequence!  After many
                   2411:         * hours of guesswork, turning off the SCSI interrupts
                   2412:         * in CLRSINT? does NOT clear the SCSIINT bit in
                   2413:         * INTSTAT. By writing to the (undocumented, unused
                   2414:         * according to the AIC-7770 manual) third bit of
                   2415:         * CLRINT, you can clear INTSTAT. But, if you do it
                   2416:         * while the sequencer is paused, you get a BRKADRINT
                   2417:         * with an Illegal Host Address status, so the
                   2418:         * sequencer has to be restarted first.
                   2419:         */
                   2420:        outb(CLRSELTIMEO, CLRSINT1 + base);
                   2421: 
                   2422:        outb(CLRSCSIINT, CLRINT + base);
                   2423: 
                   2424:        /*
                   2425:          * Shift the waiting for selection queue forward
                   2426:          */
                   2427:        waiting = inb(WAITING_SCBH + base);
                   2428:        outb(waiting, SCBPTR + base);
                   2429:        waiting = inb(SCB_NEXT_WAITING + base);
                   2430:        outb(waiting, WAITING_SCBH + base);
                   2431: 
                   2432:        RESTART_SEQUENCER(p);
                   2433:         aic7xxx_done(p, scb);
                   2434: #if 0
                   2435:   printk("aic7xxx: SELTO SCB(%d) state(0x%x) cmd(0x%x).\n",
                   2436:         scb->position, scb->state, (unsigned int) scb->cmd);
                   2437: #endif
                   2438:       }
                   2439:       else
                   2440:       {
                   2441:         if (!(status & BUSFREE))
                   2442:         {
                   2443:            /*
                   2444:             * We don't know what's going on. Turn off the
                   2445:             * interrupt source and try to continue.
                   2446:             */
                   2447:            printk("aic7xxx: SSTAT1(0x%x).\n", status);
                   2448:            outb(status, CLRSINT1 + base);
                   2449:            UNPAUSE_SEQUENCER(p);
                   2450:            outb(CLRSCSIINT, CLRINT + base);
                   2451:         }
                   2452:       }
                   2453:     }  /* else */
                   2454:   }
                   2455: 
                   2456:   if (intstat & CMDCMPLT)
                   2457:   {
                   2458:     int complete;
                   2459: 
                   2460:     /*
                   2461:      * The sequencer will continue running when it
                   2462:      * issues this interrupt. There may be >1 commands
                   2463:      * finished, so loop until we've processed them all.
                   2464:      */
                   2465:     do {
                   2466:       complete = inb(QOUTFIFO + base);
                   2467: 
                   2468:       scb = &(p->scb_array[complete]);
                   2469:       if (!(scb->state & SCB_ACTIVE) || (scb->cmd == NULL))
                   2470:       {
                   2471:        printk("aic7xxx: Warning - No command for SCB %d (CMDCMPLT).\n"
                   2472:               "         QOUTCNT(%d) SCB state(0x%x) cmd(0x%x) pos(%d).\n",
                   2473:               complete, inb(QOUTFIFO + base),
                   2474:               scb->state, (unsigned int) scb->cmd, scb->position);
                   2475:        outb(CLRCMDINT, CLRINT + base);
                   2476:        continue;
                   2477:       }
                   2478:       cmd = scb->cmd;
                   2479: 
                   2480:       if ((cmd->flags & WAS_SENSE) && !(cmd->flags & ASKED_FOR_SENSE))
                   2481:       {
                   2482:         /*
                   2483:          * Got sense information.
                   2484:          */
                   2485:        cmd->flags &= ASKED_FOR_SENSE;
                   2486:       }
                   2487: #if 0
                   2488:       printk("aic7xxx: (complete) State(%d) cmd(0x%x) free(0x%x).\n",
                   2489:             scb->state, (unsigned int) scb->cmd, (unsigned int) p->free_scb);
                   2490: #endif
                   2491: 
                   2492:       /*
                   2493:        * Clear interrupt status before checking
                   2494:        * the output queue again. This eliminates
                   2495:        * a race condition whereby a command could
                   2496:        * complete between the queue poll and the
                   2497:        * interrupt clearing, so notification of the
                   2498:        * command being complete never made it back
                   2499:        * up to the kernel.
                   2500:        */
                   2501:       outb(CLRCMDINT, CLRINT + base);
                   2502:       aic7xxx_done(p, scb);
                   2503: #if 0
                   2504:   if (scb != &p->scb_array[scb->position])
                   2505:   {
                   2506:     printk("aic7xxx: (complete) Address mismatch, pos(%d).\n", scb->position);
                   2507:   }
                   2508:   printk("aic7xxx: (complete) State(%d) cmd(0x%x) free(0x%x).\n",
                   2509:         scb->state, (unsigned int) scb->cmd, (unsigned int) p->free_scb);
                   2510: #endif
                   2511: 
                   2512: #ifdef AIC7XXX_PROC_STATS
                   2513:       /*
                   2514:        * XXX: we should actually know how much actually transferred
                   2515:        * XXX: for each command, but apparently that's too difficult.
                   2516:        */
                   2517:       actual = aic7xxx_length(cmd, 0);
                   2518:       if (!(cmd->flags & WAS_SENSE) && (actual > 0))
                   2519:       {
                   2520:         struct aic7xxx_xferstats *sp;
                   2521:         long *ptr;
                   2522:         int x;
                   2523: 
                   2524:         sp = &p->stats[cmd->channel & 0x01][cmd->target & 0x0F][cmd->lun & 0x07];
                   2525:         sp->xfers++;
                   2526: 
                   2527:         if (cmd->request.cmd == WRITE)
                   2528:         {
                   2529:           sp->w_total++;
                   2530:           sp->w_total512 += (actual >> 9);
                   2531:           ptr = sp->w_bins;
                   2532:         }
                   2533:         else
                   2534:         {
                   2535:           sp->r_total++;
                   2536:           sp->r_total512 += (actual >> 9);
                   2537:           ptr = sp->r_bins;
                   2538:         }
                   2539:         for (x = 9; x <= 17; x++)
                   2540:         {
                   2541:           if (actual < (1 << x))
                   2542:           {
                   2543:             ptr[x - 9]++;
                   2544:             break;
                   2545:           }
                   2546:         }
                   2547:         if (x > 17)
                   2548:         {
                   2549:           ptr[x - 9]++;
                   2550:         }
                   2551:       }
                   2552: #endif /* AIC7XXX_PROC_STATS */
                   2553: 
                   2554:     } while (inb(QOUTCNT + base));
                   2555:   }
                   2556: }
                   2557: 
                   2558: /*+F*************************************************************************
                   2559:  * Function:
                   2560:  *   aic7xxx_probe
                   2561:  *
                   2562:  * Description:
                   2563:  *   Probing for EISA boards: it looks like the first two bytes
                   2564:  *   are a manufacturer code - three characters, five bits each:
                   2565:  *
                   2566:  *               BYTE 0   BYTE 1   BYTE 2   BYTE 3
                   2567:  *              ?1111122 22233333 PPPPPPPP RRRRRRRR
                   2568:  *
                   2569:  *   The characters are baselined off ASCII '@', so add that value
                   2570:  *   to each to get the real ASCII code for it. The next two bytes
                   2571:  *   appear to be a product and revision number, probably vendor-
                   2572:  *   specific. This is what is being searched for at each port,
                   2573:  *   and what should probably correspond to the ID= field in the
                   2574:  *   ECU's .cfg file for the card - if your card is not detected,
                   2575:  *   make sure your signature is listed in the array.
                   2576:  *
                   2577:  *   The fourth byte's lowest bit seems to be an enabled/disabled
                   2578:  *   flag (rest of the bits are reserved?).
                   2579:  *-F*************************************************************************/
                   2580: static aha_type
                   2581: aic7xxx_probe(int slot, int base)
                   2582: {
                   2583:   int i;
                   2584:   unsigned char buf[4];
                   2585: 
                   2586:   static struct {
                   2587:     int n;
                   2588:     unsigned char signature[sizeof(buf)];
                   2589:     aha_type type;
                   2590:   } AIC7xxx[] = {
                   2591:     { 4, { 0x04, 0x90, 0x77, 0x71 }, AIC_7771 },  /* host adapter 274x */
                   2592:     { 4, { 0x04, 0x90, 0x77, 0x70 }, AIC_7770 },  /* motherboard 7770  */
                   2593:     { 4, { 0x04, 0x90, 0x77, 0x56 }, AIC_284x },  /* 284x, BIOS enabled */
                   2594:     { 4, { 0x04, 0x90, 0x77, 0x57 }, AIC_284x }   /* 284x, BIOS disabled */
                   2595:   };
                   2596: 
                   2597:   /*
                   2598:    * The VL-bus cards need to be primed by
                   2599:    * writing before a signature check.
                   2600:    */
                   2601:   for (i = 0; i < sizeof(buf); i++)
                   2602:   {
                   2603:     outb(0x80 + i, base);
                   2604:     buf[i] = inb(base + i);
                   2605:   }
                   2606: 
                   2607:   for (i = 0; i < NUMBER(AIC7xxx); i++)
                   2608:   {
                   2609:     /*
                   2610:      * Signature match on enabled card?
                   2611:      */
                   2612:     if (!memcmp(buf, AIC7xxx[i].signature, AIC7xxx[i].n))
                   2613:     {
                   2614:       if (inb(base + 4) & 1)
                   2615:       {
                   2616:        return (AIC7xxx[i].type);
                   2617:       }
                   2618: 
                   2619:       printk("aic7xxx: Disabled at slot %d, ignored.\n", slot);
                   2620:     }
                   2621:   }
                   2622: 
                   2623:   return (AIC_NONE);
                   2624: }
                   2625: 
                   2626: /*+F*************************************************************************
                   2627:  * Function:
                   2628:  *   read_2840_seeprom
                   2629:  *
                   2630:  * Description:
                   2631:  *   Reads the 2840 serial EEPROM and returns 1 if successful and 0 if
                   2632:  *   not successful.
                   2633:  *
                   2634:  *   See read_seeprom (for the 2940) for the instruction set of the 93C46
                   2635:  *   chip.
                   2636:  *
                   2637:  *   The 2840 interface to the 93C46 serial EEPROM is through the
                   2638:  *   STATUS_2840 and SEECTL_2840 registers.  The CS_2840, CK_2840, and
                   2639:  *   DO_2840 bits of the SEECTL_2840 register are connected to the chip
                   2640:  *   select, clock, and data out lines respectively of the serial EEPROM.
                   2641:  *   The DI_2840 bit of the STATUS_2840 is connected to the data in line
                   2642:  *   of the serial EEPROM.  The EEPROM_TF bit of STATUS_2840 register is
                   2643:  *   useful in that it gives us an 800 nsec timer.  After a read from the
                   2644:  *   SEECTL_2840 register the timing flag is cleard and goes high 800 nsec
                   2645:  *   later.
                   2646:  *
                   2647:  *-F*************************************************************************/
                   2648: static int
                   2649: read_2840_seeprom(int base, struct seeprom_config *sc)
                   2650: {
                   2651:   int i = 0, k = 0;
                   2652:   unsigned char temp;
                   2653:   unsigned short checksum = 0;
                   2654:   unsigned short *seeprom = (unsigned short *) sc;
                   2655:   struct seeprom_cmd {
                   2656:     unsigned char len;
                   2657:     unsigned char bits[3];
                   2658:   };
                   2659:   struct seeprom_cmd seeprom_read = {3, {1, 1, 0}};
                   2660: 
                   2661: #define CLOCK_PULSE(p) \
                   2662:   while ((inb(STATUS_2840 + base) & EEPROM_TF) == 0)   \
                   2663:   {                                            \
                   2664:     ;  /* Do nothing */                                \
                   2665:   }                                            \
                   2666:   (void) inb(SEECTL_2840 + base);
                   2667: 
                   2668:   /*
                   2669:    * Read the first 32 registers of the seeprom.  For the 2840,
                   2670:    * the 93C46 SEEPROM is a 1024-bit device with 64 16-bit registers
                   2671:    * but only the first 32 are used by Adaptec BIOS.  The loop
                   2672:    * will range from 0 to 31.
                   2673:    */
                   2674:   for (k = 0; k < (sizeof(*sc) / 2); k++)
                   2675:   {
                   2676:     /*
                   2677:      * Send chip select for one clock cycle.
                   2678:      */
                   2679:     outb(CK_2840 | CS_2840, SEECTL_2840 + base);
                   2680:     CLOCK_PULSE(base);
                   2681: 
                   2682:     /*
                   2683:      * Now we're ready to send the read command followed by the
                   2684:      * address of the 16-bit register we want to read.
                   2685:      */
                   2686:     for (i = 0; i < seeprom_read.len; i++)
                   2687:     {
                   2688:       temp = CS_2840 | seeprom_read.bits[i];
                   2689:       outb(temp, SEECTL_2840 + base);
                   2690:       CLOCK_PULSE(base);
                   2691:       temp = temp ^ CK_2840;
                   2692:       outb(temp, SEECTL_2840 + base);
                   2693:       CLOCK_PULSE(base);
                   2694:     }
                   2695:     /*
                   2696:      * Send the 6 bit address (MSB first, LSB last).
                   2697:      */
                   2698:     for (i = 5; i >= 0; i--)
                   2699:     {
                   2700:       temp = k;
                   2701:       temp = (temp >> i) & 1;  /* Mask out all but lower bit. */
                   2702:       temp = CS_2840 | temp;
                   2703:       outb(temp, SEECTL_2840 + base);
                   2704:       CLOCK_PULSE(base);
                   2705:       temp = temp ^ CK_2840;
                   2706:       outb(temp, SEECTL_2840 + base);
                   2707:       CLOCK_PULSE(base);
                   2708:     }
                   2709: 
                   2710:     /*
                   2711:      * Now read the 16 bit register.  An initial 0 precedes the
                   2712:      * register contents which begins with bit 15 (MSB) and ends
                   2713:      * with bit 0 (LSB).  The initial 0 will be shifted off the
                   2714:      * top of our word as we let the loop run from 0 to 16.
                   2715:      */
                   2716:     for (i = 0; i <= 16; i++)
                   2717:     {
                   2718:       temp = CS_2840;
                   2719:       outb(temp, SEECTL_2840 + base);
                   2720:       CLOCK_PULSE(base);
                   2721:       temp = temp ^ CK_2840;
                   2722:       seeprom[k] = (seeprom[k] << 1) | (inb(STATUS_2840 + base) & DI_2840);
                   2723:       outb(temp, SEECTL_2840 + base);
                   2724:       CLOCK_PULSE(base);
                   2725:     }
                   2726:     /*
                   2727:      * The serial EEPROM has a checksum in the last word.  Keep a
                   2728:      * running checksum for all words read except for the last
                   2729:      * word.  We'll verify the checksum after all words have been
                   2730:      * read.
                   2731:      */
                   2732:     if (k < (sizeof(*sc) / 2) - 1)
                   2733:     {
                   2734:       checksum = checksum + seeprom[k];
                   2735:     }
                   2736: 
                   2737:     /*
                   2738:      * Reset the chip select for the next command cycle.
                   2739:      */
                   2740:     outb(0, SEECTL_2840 + base);
                   2741:     CLOCK_PULSE(base);
                   2742:     outb(CK_2840, SEECTL_2840 + base);
                   2743:     CLOCK_PULSE(base);
                   2744:     outb(0, SEECTL_2840 + base);
                   2745:     CLOCK_PULSE(base);
                   2746:   }
                   2747: 
                   2748: #if 0
                   2749:   printk("Computed checksum 0x%x, checksum read 0x%x\n", checksum, sc->checksum);
                   2750:   printk("Serial EEPROM:");
                   2751:   for (k = 0; k < (sizeof(*sc) / 2); k++)
                   2752:   {
                   2753:     if (((k % 8) == 0) && (k != 0))
                   2754:     {
                   2755:       printk("\n              ");
                   2756:     }
                   2757:     printk(" 0x%x", seeprom[k]);
                   2758:   }
                   2759:   printk("\n");
                   2760: #endif
                   2761: 
                   2762:   if (checksum != sc->checksum)
                   2763:   {
                   2764:     printk("aic7xxx: SEEPROM checksum error, ignoring SEEPROM settings.\n");
                   2765:     return (0);
                   2766:   }
                   2767: 
                   2768:   return (1);
                   2769: #undef CLOCK_PULSE
                   2770: }
                   2771: 
                   2772: /*+F*************************************************************************
                   2773:  * Function:
                   2774:  *   read_seeprom
                   2775:  *
                   2776:  * Description:
                   2777:  *   Reads the serial EEPROM and returns 1 if successful and 0 if
                   2778:  *   not successful.
                   2779:  *
                   2780:  *   The instruction set of the 93C46 chip is as follows:
                   2781:  *
                   2782:  *               Start  OP
                   2783:  *     Function   Bit  Code  Address    Data     Description
                   2784:  *     -------------------------------------------------------------------
                   2785:  *     READ        1    10   A5 - A0             Reads data stored in memory,
                   2786:  *                                               starting at specified address
                   2787:  *     EWEN        1    00   11XXXX              Write enable must preceed
                   2788:  *                                               all programming modes
                   2789:  *     ERASE       1    11   A5 - A0             Erase register A5A4A3A2A1A0
                   2790:  *     WRITE       1    01   A5 - A0   D15 - D0  Writes register
                   2791:  *     ERAL        1    00   10XXXX              Erase all registers
                   2792:  *     WRAL        1    00   01XXXX    D15 - D0  Writes to all registers
                   2793:  *     EWDS        1    00   00XXXX              Disables all programming
                   2794:  *                                               instructions
                   2795:  *     *Note: A value of X for address is a don't care condition.
                   2796:  *
                   2797:  *   The 93C46 has a four wire interface: clock, chip select, data in, and
                   2798:  *   data out.  In order to perform one of the above functions, you need
                   2799:  *   to enable the chip select for a clock period (typically a minimum of
                   2800:  *   1 usec, with the clock high and low a minimum of 750 and 250 nsec
                   2801:  *   respectively.  While the chip select remains high, you can clock in
                   2802:  *   the instructions (above) starting with the start bit, followed by the
                   2803:  *   OP code, Address, and Data (if needed).  For the READ instruction, the
                   2804:  *   requested 16-bit register contents is read from the data out line but
                   2805:  *   is preceded by an initial zero (leading 0, followed by 16-bits, MSB
                   2806:  *   first).  The clock cycling from low to high initiates the next data
                   2807:  *   bit to be sent from the chip.
                   2808:  *
                   2809:  *   The 7870 interface to the 93C46 serial EEPROM is through the SEECTL
                   2810:  *   register.  After successful arbitration for the memory port, the
                   2811:  *   SEECS bit of the SEECTL register is connected to the chip select.
                   2812:  *   The SEECK, SEEDO, and SEEDI are connected to the clock, data out,
                   2813:  *   and data in lines respectively.  The SEERDY bit of SEECTL is useful
                   2814:  *   in that it gives us an 800 nsec timer.  After a write to the SEECTL
                   2815:  *   register, the SEERDY goes high 800 nsec later.  The one exception
                   2816:  *   to this is when we first request access to the memory port.  The
                   2817:  *   SEERDY goes high to signify that access has been granted and, for
                   2818:  *   this case, has no implied timing.
                   2819:  *
                   2820:  *-F*************************************************************************/
                   2821: static int
                   2822: read_seeprom(int base, int offset, struct seeprom_config *sc)
                   2823: {
                   2824:   int i = 0, k;
                   2825:   unsigned long timeout;
                   2826:   unsigned char temp;
                   2827:   unsigned short checksum = 0;
                   2828:   unsigned short *seeprom = (unsigned short *) sc;
                   2829:   struct seeprom_cmd {
                   2830:     unsigned char len;
                   2831:     unsigned char bits[3];
                   2832:   };
                   2833:   struct seeprom_cmd seeprom_read = {3, {1, 1, 0}};
                   2834: 
                   2835: #define CLOCK_PULSE(p) \
                   2836:   while ((inb(SEECTL + base) & SEERDY) == 0)   \
                   2837:   {                                            \
                   2838:     ;  /* Do nothing */                                \
                   2839:   }
                   2840: 
                   2841:   /*
                   2842:    * Request access of the memory port.  When access is
                   2843:    * granted, SEERDY will go high.  We use a 1 second
                   2844:    * timeout which should be near 1 second more than
                   2845:    * is needed.  Reason: after the 7870 chip reset, there
                   2846:    * should be no contention.
                   2847:    */
                   2848:   outb(SEEMS, SEECTL + base);
                   2849:   timeout = jiffies + 100;  /* 1 second timeout */
                   2850:   while ((jiffies < timeout) && ((inb(SEECTL + base) & SEERDY) == 0))
                   2851:   {
                   2852:     ; /* Do nothing!  Wait for access to be granted.  */
                   2853:   }
                   2854:   if ((inb(SEECTL + base) & SEERDY) == 0)
                   2855:   {
                   2856:     outb(0, SEECTL + base);
                   2857:     return (0);
                   2858:   }
                   2859: 
                   2860:   /*
                   2861:    * Read the first 32 registers of the seeprom.  For the 7870,
                   2862:    * the 93C46 SEEPROM is a 1024-bit device with 64 16-bit registers
                   2863:    * but only the first 32 are used by Adaptec BIOS.  The loop
                   2864:    * will range from 0 to 31.
                   2865:    */
                   2866:   for (k = 0; k < (sizeof(*sc) / 2); k++)
                   2867:   {
                   2868:     /*
                   2869:      * Send chip select for one clock cycle.
                   2870:      */
                   2871:     outb(SEEMS | SEECK | SEECS, SEECTL + base);
                   2872:     CLOCK_PULSE(base);
                   2873: 
                   2874:     /*
                   2875:      * Now we're ready to send the read command followed by the
                   2876:      * address of the 16-bit register we want to read.
                   2877:      */
                   2878:     for (i = 0; i < seeprom_read.len; i++)
                   2879:     {
                   2880:       temp = SEEMS | SEECS | (seeprom_read.bits[i] << 1);
                   2881:       outb(temp, SEECTL + base);
                   2882:       CLOCK_PULSE(base);
                   2883:       temp = temp ^ SEECK;
                   2884:       outb(temp, SEECTL + base);
                   2885:       CLOCK_PULSE(base);
                   2886:     }
                   2887:     /*
                   2888:      * Send the 6 bit address (MSB first, LSB last).
                   2889:      */
                   2890:     for (i = 5; i >= 0; i--)
                   2891:     {
                   2892:       temp = k + offset;
                   2893:       temp = (temp >> i) & 1;  /* Mask out all but lower bit. */
                   2894:       temp = SEEMS | SEECS | (temp << 1);
                   2895:       outb(temp, SEECTL + base);
                   2896:       CLOCK_PULSE(base);
                   2897:       temp = temp ^ SEECK;
                   2898:       outb(temp, SEECTL + base);
                   2899:       CLOCK_PULSE(base);
                   2900:     }
                   2901: 
                   2902:     /*
                   2903:      * Now read the 16 bit register.  An initial 0 precedes the
                   2904:      * register contents which begins with bit 15 (MSB) and ends
                   2905:      * with bit 0 (LSB).  The initial 0 will be shifted off the
                   2906:      * top of our word as we let the loop run from 0 to 16.
                   2907:      */
                   2908:     for (i = 0; i <= 16; i++)
                   2909:     {
                   2910:       temp = SEEMS | SEECS;
                   2911:       outb(temp, SEECTL + base);
                   2912:       CLOCK_PULSE(base);
                   2913:       temp = temp ^ SEECK;
                   2914:       seeprom[k] = (seeprom[k] << 1) | (inb(SEECTL + base) & SEEDI);
                   2915:       outb(temp, SEECTL + base);
                   2916:       CLOCK_PULSE(base);
                   2917:     }
                   2918: 
                   2919:     /*
                   2920:      * The serial EEPROM has a checksum in the last word.  Keep a
                   2921:      * running checksum for all words read except for the last
                   2922:      * word.  We'll verify the checksum after all words have been
                   2923:      * read.
                   2924:      */
                   2925:     if (k < (sizeof(*sc) / 2) - 1)
                   2926:     {
                   2927:       checksum = checksum + seeprom[k];
                   2928:     }
                   2929: 
                   2930:     /*
                   2931:      * Reset the chip select for the next command cycle.
                   2932:      */
                   2933:     outb(SEEMS, SEECTL + base);
                   2934:     CLOCK_PULSE(base);
                   2935:     outb(SEEMS | SEECK, SEECTL + base);
                   2936:     CLOCK_PULSE(base);
                   2937:     outb(SEEMS, SEECTL + base);
                   2938:     CLOCK_PULSE(base);
                   2939:   }
                   2940: 
                   2941:   /*
                   2942:    * Release access to the memory port and the serial EEPROM.
                   2943:    */
                   2944:   outb(0, SEECTL + base);
                   2945: 
                   2946: #if 0
                   2947:   printk("Computed checksum 0x%x, checksum read 0x%x\n", checksum, sc->checksum);
                   2948:   printk("Serial EEPROM:");
                   2949:   for (k = 0; k < (sizeof(*sc) / 2); k++)
                   2950:   {
                   2951:     if (((k % 8) == 0) && (k != 0))
                   2952:     {
                   2953:       printk("\n              ");
                   2954:     }
                   2955:     printk(" 0x%x", seeprom[k]);
                   2956:   }
                   2957:   printk("\n");
                   2958: #endif
                   2959: 
                   2960:   if (checksum != sc->checksum)
                   2961:   {
                   2962:     printk("aic7xxx: SEEPROM checksum error, ignoring SEEPROM settings.\n");
                   2963:     return (0);
                   2964:   }
                   2965: 
                   2966:   return (1);
                   2967: #undef CLOCK_PULSE
                   2968: }
                   2969: 
                   2970: /*+F*************************************************************************
                   2971:  * Function:
                   2972:  *   detect_maxscb
                   2973:  *
                   2974:  * Description:
                   2975:  *   Return the maximum number of SCB's allowed for a given controller.
                   2976:  *-F*************************************************************************/
                   2977: static int
                   2978: detect_maxscb(aha_type type, int base, int walk_scbs)
                   2979: {
                   2980:   unsigned char sblkctl_reg, scb_byte;
                   2981:   int maxscb = 0, i;
                   2982: 
                   2983:   switch (type)
                   2984:   {
                   2985:     case AIC_7770:
                   2986:     case AIC_7771:
                   2987:     case AIC_284x:
                   2988:       /*
                   2989:        * Check for Rev C or E boards. Rev E boards can supposedly have
                   2990:        * more than 4 SCBs, while the Rev C boards are limited to 4 SCBs.
                   2991:        * Until we know how to access more than 4 SCBs for the Rev E chips,
                   2992:        * we limit them, along with the Rev C chips, to 4 SCBs.
                   2993:        *
                   2994:        * The Rev E boards have a read/write autoflush bit in the
                   2995:        * SBLKCTL register, while in the Rev C boards it is read only.
                   2996:        */
                   2997:       sblkctl_reg = inb(SBLKCTL + base) ^ AUTOFLUSHDIS;
                   2998:       outb(sblkctl_reg, SBLKCTL + base);
                   2999:       if (inb(SBLKCTL + base) == sblkctl_reg)
                   3000:       {
                   3001:         /*
                   3002:          * We detected a Rev E board.
                   3003:          */
                   3004:         printk("aic7xxx: %s Rev E and subsequent.\n", board_names[type]);
                   3005:        outb(sblkctl_reg ^ AUTOFLUSHDIS, SBLKCTL + base);
                   3006:        maxscb = 4;
                   3007:       }
                   3008:       else
                   3009:       {
                   3010:         printk("aic7xxx: %s Rev C and previous.\n", board_names[type]);
                   3011:        maxscb = 4;
                   3012:       }
                   3013:       break;
                   3014: 
                   3015:     case AIC_7850:
                   3016:       maxscb = 3;
                   3017:       break;
                   3018: 
                   3019:     case AIC_7870:
                   3020:     case AIC_7871:
                   3021:     case AIC_7874:
                   3022:     case AIC_7880:
                   3023:     case AIC_7881:
                   3024:     case AIC_7884:
                   3025:       maxscb = 16;
                   3026:       break;
                   3027: 
                   3028:     case AIC_7872:
                   3029:     case AIC_7873:
                   3030:     case AIC_7882:
                   3031:     case AIC_7883:
                   3032:       /*
                   3033:        * Is suppose to have 255 SCBs, but we'll walk the SCBs
                   3034:        * looking for more if external RAM is detected.
                   3035:        */
                   3036:       maxscb = 16;
                   3037:       break;
                   3038: 
                   3039:     case AIC_NONE:
                   3040:       /*
                   3041:        * This should never happen... But just in case.
                   3042:        */
                   3043:       break;
                   3044:   }
                   3045: 
                   3046:   if (walk_scbs)
                   3047:   {
                   3048:     /*
                   3049:      * This adapter has external SCB memory.
                   3050:      * Walk the SCBs to determine how many there are.
                   3051:      */
                   3052:     i = 0;
                   3053:     while (i < AIC7XXX_MAXSCB)
                   3054:     {
                   3055:       outb(i, SCBPTR + base);
                   3056:       scb_byte = ~(inb(SCBARRAY + base));  /* complement the byte */
                   3057:       outb(scb_byte, SCBARRAY + base);     /* write it back out */
                   3058:       if (inb(SCBARRAY + base) != scb_byte)
                   3059:       {
                   3060:         break;
                   3061:       }
                   3062:       i++;
                   3063:     }
                   3064:     maxscb = i;
                   3065: 
                   3066:     printk("aic7xxx: Using %d SCB's after checking for SCB memory.\n", maxscb);
                   3067:   }
                   3068:   else
                   3069:   {
                   3070:     printk("aic7xxx: Using %d SCB's; No SCB memory check.\n", maxscb);
                   3071:   }
                   3072: 
                   3073:   return (maxscb);
                   3074: }
                   3075: 
                   3076: /*+F*************************************************************************
                   3077:  * Function:
                   3078:  *   aic7xxx_register
                   3079:  *
                   3080:  * Description:
                   3081:  *   Register a Adaptec aic7xxx chip SCSI controller with the kernel.
                   3082:  *-F*************************************************************************/
                   3083: static int
                   3084: aic7xxx_register(Scsi_Host_Template *template,
                   3085:                  struct aic7xxx_host_config *config)
                   3086: {
                   3087:   int i;
                   3088:   unsigned char sblkctl;
                   3089:   int max_targets;
                   3090:   int found = 1, base;
                   3091:   int bios_disabled = FALSE;
                   3092:   unsigned char target_settings;
                   3093:   unsigned char scsi_conf, host_conf;
                   3094:   int have_seeprom = FALSE;
                   3095:   struct Scsi_Host *host;
                   3096:   struct aic7xxx_host *p;
                   3097:   struct seeprom_config sc;
                   3098: 
                   3099:   base = config->base;
                   3100: 
                   3101:   /*
                   3102:    * Lock out other contenders for our i/o space.
                   3103:    */
                   3104:   request_region(MINREG + base, MAXREG - MINREG, "aic7xxx");
                   3105: 
                   3106:   switch (config->type)
                   3107:   {
                   3108:     case AIC_7770:
                   3109:     case AIC_7771:
                   3110:       /*
                   3111:        * For some 274x boards, we must clear the CHIPRST bit
                   3112:        * and pause the sequencer. For some reason, this makes
                   3113:        * the driver work. For 284x boards, we give it a
                   3114:        * CHIPRST just like the 294x boards.
                   3115:        *
                   3116:        * Use the BIOS settings to determine the interrupt
                   3117:        * trigger type (level or edge) and use this value
                   3118:        * for pausing and unpausing the sequencer.
                   3119:        */
                   3120:       config->unpause = (inb(HCNTRL + base) & IRQMS) | INTEN;
                   3121:       config->pause = config->unpause | PAUSE;
                   3122:       config->extended = aic7xxx_extended;
                   3123: 
                   3124:       outb(config->pause | CHIPRST, HCNTRL + base);
                   3125:       aic7xxx_delay(1);
                   3126:       if (inb(HCNTRL + base) & CHIPRST)
                   3127:       {
                   3128:        printk("aic7xxx: Chip reset not cleared; clearing manually.\n");
                   3129:       }
                   3130:       outb(config->pause, HCNTRL + base);
                   3131: 
                   3132:       /*
                   3133:        * Just to be on the safe side with the 274x, we will re-read the irq
                   3134:        * since there was some issue about resetting the board.
                   3135:        */
                   3136:       config->irq = inb(INTDEF + base) & 0x0F;
                   3137:       if ((inb(HA_274_BIOSCTRL + base) & BIOSMODE) == BIOSDISABLED)
                   3138:       {
                   3139:         bios_disabled = TRUE;
                   3140:       }
                   3141:       host_conf = inb(HOSTCONF + base);
                   3142:       config->busrtime = host_conf & 0x3C;
                   3143:       /* XXX Is this valid for motherboard based controllers? */
                   3144:       /* Setup the FIFO threshold and the bus off time */
                   3145:       outb(host_conf & DFTHRSH, BUSSPD + base);
                   3146:       outb((host_conf << 2) & BOFF, BUSTIME + base);
                   3147: 
                   3148:       /*
                   3149:        * A reminder until this can be detected automatically.
                   3150:        */
                   3151:       printk("aic7xxx: Extended translation %sabled.\n",
                   3152:             config->extended ? "en" : "dis");
                   3153:       break;
                   3154: 
                   3155:     case AIC_284x:
                   3156:       outb(CHIPRST, HCNTRL + base);
                   3157:       config->unpause = UNPAUSE_284X;
                   3158:       config->pause = REQ_PAUSE; /* DWG would like to be like the rest */
                   3159:       aic7xxx_delay(1);
                   3160:       outb(config->pause, HCNTRL + base);
                   3161: 
                   3162:       config->extended = aic7xxx_extended;
                   3163:       config->irq = inb(INTDEF + base) & 0x0F;
                   3164:       if ((inb(HA_274_BIOSCTRL + base) & BIOSMODE) == BIOSDISABLED)
                   3165:       {
                   3166:         bios_disabled = TRUE;
                   3167:       }
                   3168:       host_conf = inb(HOSTCONF + base);
                   3169: 
                   3170:       printk("aic7xxx: Reading SEEPROM...");
                   3171:       have_seeprom = read_2840_seeprom(base, &sc);
                   3172:       if (!have_seeprom)
                   3173:       {
                   3174:        printk("aic7xxx: Unable to read SEEPROM.\n");
                   3175:         config->busrtime = host_conf & 0x3C;
                   3176:       }
                   3177:       else
                   3178:       {
                   3179:        printk("done.\n");
                   3180:        config->extended = ((sc.bios_control & CF284XEXTEND) >> 5);
                   3181:        config->scsi_id = (sc.brtime_id & CFSCSIID);
                   3182:        config->parity = (sc.adapter_control & CFSPARITY) ?
                   3183:                         AIC_ENABLED : AIC_DISABLED;
                   3184:        config->low_term = (sc.adapter_control & CF284XSTERM) ?
                   3185:                              AIC_ENABLED : AIC_DISABLED;
                   3186:        /*
                   3187:         * XXX - Adaptec *does* make 284x wide controllers, but the
                   3188:         *       documents do not say where the high byte termination
                   3189:         *       enable bit is located.  For now, we'll just assume
                   3190:         *       that it's in the same place as for the 2940 card.
                   3191:         */
                   3192:        config->high_term = (sc.adapter_control & CFWSTERM) ?
                   3193:                              AIC_ENABLED : AIC_DISABLED;
                   3194:        config->busrtime = ((sc.brtime_id & CFBRTIME) >> 8);
                   3195:       }
                   3196:       /* XXX Is this valid for motherboard based controllers? */
                   3197:       /* Setup the FIFO threshold and the bus off time */
                   3198:       outb(host_conf & DFTHRSH, BUSSPD + base);
                   3199:       outb((host_conf << 2) & BOFF, BUSTIME + base);
                   3200: 
                   3201:       printk("aic7xxx: Extended translation %sabled.\n",
                   3202:             config->extended ? "en" : "dis");
                   3203:       break;
                   3204: 
                   3205:     case AIC_7850:
                   3206:     case AIC_7870:
                   3207:     case AIC_7871:
                   3208:     case AIC_7872:
                   3209:     case AIC_7873:
                   3210:     case AIC_7874:
                   3211:     case AIC_7880:
                   3212:     case AIC_7881:
                   3213:     case AIC_7882:
                   3214:     case AIC_7883:
                   3215:     case AIC_7884:
                   3216:       outb(CHIPRST, HCNTRL + base);
                   3217:       config->unpause = UNPAUSE_294X;
                   3218:       config->pause = config->unpause | PAUSE;
                   3219:       aic7xxx_delay(1);
                   3220:       outb(config->pause, HCNTRL + base);
                   3221: 
                   3222:       config->extended = aic7xxx_extended;
                   3223:       config->scsi_id = 7;
                   3224: 
                   3225:       printk("aic7xxx: Reading SEEPROM...");
                   3226:       have_seeprom = read_seeprom(base, config->chan_num * (sizeof(sc) / 2), &sc);
                   3227:       if (!have_seeprom)
                   3228:       {
                   3229:        printk("aic7xxx: Unable to read SEEPROM.\n");
                   3230:       }
                   3231:       else
                   3232:       {
                   3233:        printk("done.\n");
                   3234:        config->extended = ((sc.bios_control & CFEXTEND) >> 7);
                   3235:        config->scsi_id = (sc.brtime_id & CFSCSIID);
                   3236:        config->parity = (sc.adapter_control & CFSPARITY) ?
                   3237:                         AIC_ENABLED : AIC_DISABLED;
                   3238:        config->low_term = (sc.adapter_control & CFSTERM) ?
                   3239:                              AIC_ENABLED : AIC_DISABLED;
                   3240:        config->high_term = (sc.adapter_control & CFWSTERM) ?
                   3241:                              AIC_ENABLED : AIC_DISABLED;
                   3242:        config->busrtime = ((sc.brtime_id & CFBRTIME) >> 8);
                   3243:         if (((config->type == AIC_7880) || (config->type == AIC_7882) ||
                   3244:              (config->type == AIC_7883) || (config->type == AIC_7884)) &&
                   3245:             (sc.adapter_control & CFULTRAEN))
                   3246:         {
                   3247:           printk ("aic7xxx: Enabling support for Ultra SCSI speed.\n");
                   3248:           config->ultra_enabled = TRUE;
                   3249:         }
                   3250:       }
                   3251: 
                   3252:       /*
                   3253:        * XXX - force data fifo threshold to 100%. Why does this
                   3254:        *       need to be done?
                   3255:        *
                   3256:        * We don't know where this is set in the SEEPROM or by the BIOS,
                   3257:        * so we default it to 100%.
                   3258:        */
                   3259:       outb(config->scsi_id | DFTHRSH_100, SCSICONF + base);
                   3260:       outb(DFTHRSH_100, DSPCISTATUS + base);
                   3261: 
                   3262:       /*
                   3263:        * In case we are a wide card, place scsi ID in second conf byte.
                   3264:        */
                   3265:       outb(config->scsi_id, (SCSICONF + base + 1));
                   3266: 
                   3267:       printk("aic7xxx: Extended translation %sabled.\n",
                   3268:             config->extended ? "en" : "dis");
                   3269:       break;
                   3270: 
                   3271:     default:
                   3272:       panic("aic7xxx: (aic7xxx_register) Internal error.\n");
                   3273:   }
                   3274: 
                   3275:   config->maxscb = detect_maxscb(config->type, base, config->walk_scbs);
                   3276: 
                   3277:   if (config->chip_type == AIC_777x)
                   3278:   {
                   3279:     if (config->pause & IRQMS)
                   3280:     {
                   3281:       printk("aic7xxx: Using level sensitive interrupts.\n");
                   3282:     }
                   3283:     else
                   3284:     {
                   3285:       printk("aic7xxx: Using edge triggered interrupts.\n");
                   3286:     }
                   3287:   }
                   3288: 
                   3289:   /*
                   3290:    * Read the bus type from the SBLKCTL register. Set the FLAGS
                   3291:    * register in the sequencer for twin and wide bus cards.
                   3292:    */
                   3293:   sblkctl = inb(SBLKCTL + base);
                   3294:   switch (sblkctl & SELBUS_MASK)
                   3295:   {
                   3296:     case SELNARROW:     /* narrow/normal bus */
                   3297:       config->scsi_id = inb(SCSICONF + base) & 0x07;
                   3298:       config->bus_type = AIC_SINGLE;
                   3299:       outb(SINGLE_BUS, FLAGS + base);
                   3300:       break;
                   3301: 
                   3302:     case SELWIDE:     /* Wide bus */
                   3303:       config->scsi_id = inb(SCSICONF + base + 1) & 0x0F;
                   3304:       config->bus_type = AIC_WIDE;
                   3305:       printk("aic7xxx: Enabling wide channel of %s-Wide.\n",
                   3306:             board_names[config->type]);
                   3307:       outb(WIDE_BUS, FLAGS + base);
                   3308:       break;
                   3309: 
                   3310:     case SELBUSB:     /* Twin bus */
                   3311:       config->scsi_id = inb(SCSICONF + base) & 0x07;
                   3312: #ifdef AIC7XXX_TWIN_SUPPORT
                   3313:       config->scsi_id_b = inb(SCSICONF + base + 1) & 0x07;
                   3314:       config->bus_type = AIC_TWIN;
                   3315:       printk("aic7xxx: Enabled channel B of %s-Twin.\n",
                   3316:             board_names[config->type]);
                   3317:       outb(TWIN_BUS, FLAGS + base);
                   3318: #else
                   3319:       config->bus_type = AIC_SINGLE;
                   3320:       printk("aic7xxx: Channel B of %s-Twin will be ignored.\n",
                   3321:             board_names[config->type]);
                   3322:       outb(0, FLAGS + base);
                   3323: #endif
                   3324:       break;
                   3325: 
                   3326:     default:
                   3327:       printk("aic7xxx: Unsupported type 0x%x, please "
                   3328:             "mail [email protected]\n", inb(SBLKCTL + base));
                   3329:       outb(0, FLAGS + base);
                   3330:       return (0);
                   3331:   }
                   3332: 
                   3333:   /*
                   3334:    * For the 294x cards, clearing DIAGLEDEN and DIAGLEDON, will
                   3335:    * take the card out of diagnostic mode and make the host adatper
                   3336:    * LED follow bus activity (will not always be on).
                   3337:    */
                   3338:   outb(sblkctl & ~(DIAGLEDEN | DIAGLEDON), SBLKCTL + base);
                   3339: 
                   3340:   /*
                   3341:    * The IRQ level in i/o port 4 maps directly onto the real
                   3342:    * IRQ number. If it's ok, register it with the kernel.
                   3343:    *
                   3344:    * NB. the Adaptec documentation says the IRQ number is only
                   3345:    *     in the lower four bits; the ECU information shows the
                   3346:    *     high bit being used as well. Which is correct?
                   3347:    *
                   3348:    * The PCI cards get their interrupt from PCI BIOS.
                   3349:    */
                   3350:   if ((config->chip_type == AIC_777x) && ((config->irq < 9) || (config->irq > 15)))
                   3351:   {
                   3352:     printk("aic7xxx: Host adapter uses unsupported IRQ level, ignoring.\n");
                   3353:     return (0);
                   3354:   }
                   3355: 
                   3356:   /*
                   3357:    * Check the IRQ to see if it is shared by another aic7xxx
                   3358:    * controller. If it is and sharing of IRQs is not defined,
                   3359:    * then return 0 hosts found. If sharing of IRQs is allowed
                   3360:    * or the IRQ is not shared by another host adapter, then
                   3361:    * proceed.
                   3362:    */
                   3363: #ifndef AIC7XXX_SHARE_IRQS
                   3364:    if (aic7xxx_boards[config->irq] != NULL)
                   3365:    {
                   3366:      printk("aic7xxx: Sharing of IRQ's is not configured.\n");
                   3367:      return (0);
                   3368:    }
                   3369: #endif
                   3370: 
                   3371:   /*
                   3372:    * Print out debugging information before re-enabling
                   3373:    * the card - a lot of registers on it can't be read
                   3374:    * when the sequencer is active.
                   3375:    */
                   3376:   debug_config(config);
                   3377: 
                   3378:   /*
                   3379:    * Before registry, make sure that the offsets of the
                   3380:    * struct scatterlist are what the sequencer will expect,
                   3381:    * otherwise disable scatter-gather altogether until someone
                   3382:    * can fix it. This is important since the sequencer will
                   3383:    * DMA elements of the SG array in while executing commands.
                   3384:    */
                   3385:   if (template->sg_tablesize != SG_NONE)
                   3386:   {
                   3387:     struct scatterlist sg;
                   3388: 
                   3389:     if (SG_STRUCT_CHECK(sg))
                   3390:     {
                   3391:       printk("aic7xxx: Warning - Kernel scatter-gather structures changed, "
                   3392:              "disabling it.\n");
                   3393:       template->sg_tablesize = SG_NONE;
                   3394:     }
                   3395:   }
                   3396: 
                   3397:   /*
                   3398:    * Register each "host" and fill in the returned Scsi_Host
                   3399:    * structure as best we can. Some of the parameters aren't
                   3400:    * really relevant for bus types beyond ISA, and none of the
                   3401:    * high-level SCSI code looks at it anyway. Why are the fields
                   3402:    * there? Also save the pointer so that we can find the
                   3403:    * information when an IRQ is triggered.
                   3404:    */
                   3405:   host = scsi_register(template, sizeof(struct aic7xxx_host));
                   3406:   host->can_queue = config->maxscb;
                   3407:   host->cmd_per_lun = AIC7XXX_CMDS_PER_LUN;
                   3408:   host->this_id = config->scsi_id;
                   3409:   host->irq = config->irq;
                   3410:   if (config->bus_type == AIC_WIDE)
                   3411:   {
                   3412:     host->max_id = 16;
                   3413:   }
                   3414:   if (config->bus_type == AIC_TWIN)
                   3415:   {
                   3416:     host->max_channel = 1;
                   3417:   }
                   3418: 
                   3419:   p = (struct aic7xxx_host *) host->hostdata;
                   3420: 
                   3421:   /*
                   3422:    * Initialize the scb array by setting the state to free.
                   3423:    */
                   3424:   for (i = 0; i < AIC7XXX_MAXSCB; i++)
                   3425:   {
                   3426:     p->scb_array[i].state = SCB_FREE;
                   3427:     p->scb_array[i].next = NULL;
                   3428:     p->scb_array[i].cmd = NULL;
                   3429:   }
                   3430: 
                   3431:   p->isr_count = 0;
                   3432:   p->a_scanned = FALSE;
                   3433:   p->b_scanned = FALSE;
                   3434:   p->base = base;
                   3435:   p->maxscb = config->maxscb;
                   3436:   p->numscb = 0;
                   3437:   p->extended = config->extended;
                   3438:   p->type = config->type;
                   3439:   p->chip_type = config->chip_type;
                   3440:   p->ultra_enabled = config->ultra_enabled;
                   3441:   p->chan_num = config->chan_num;
                   3442:   p->bus_type = config->bus_type;
                   3443:   p->have_seeprom = have_seeprom;
                   3444:   p->seeprom = sc;
                   3445:   p->free_scb = NULL;
                   3446:   p->next = NULL;
                   3447: 
                   3448:   p->unpause = config->unpause;
                   3449:   p->pause = config->pause;
                   3450: 
                   3451:   if (aic7xxx_boards[config->irq] == NULL)
                   3452:   {
                   3453:     /*
                   3454:      * Warning! This must be done before requesting the irq.  It is
                   3455:      * possible for some boards to raise an interrupt as soon as
                   3456:      * they are enabled.  So when we request the irq from the Linux
                   3457:      * kernel, an interrupt is triggered immediately.  Therefore, we
                   3458:      * must ensure the board data is correctly set before the request.
                   3459:      */
                   3460:     aic7xxx_boards[config->irq] = host;
                   3461: 
                   3462:     /*
                   3463:      * Register IRQ with the kernel.
                   3464:      */
                   3465:     if (request_irq(config->irq, aic7xxx_isr, SA_INTERRUPT, "aic7xxx"))
                   3466:     {
                   3467:       printk("aic7xxx: Couldn't register IRQ %d, ignoring.\n", config->irq);
                   3468:       aic7xxx_boards[config->irq] = NULL;
                   3469:       return (0);
                   3470:     }
                   3471:   }
                   3472:   else
                   3473:   {
                   3474:     /*
                   3475:      * We have found a host adapter sharing an IRQ of a previously
                   3476:      * registered host adapter. Add this host adapter's Scsi_Host
                   3477:      * to the beginning of the linked list of hosts at the same IRQ.
                   3478:      */
                   3479:     p->next = aic7xxx_boards[config->irq];
                   3480:     aic7xxx_boards[config->irq] = host;
                   3481:   }
                   3482: 
                   3483:   /*
                   3484:    * Load the sequencer program, then re-enable the board -
                   3485:    * resetting the AIC-7770 disables it, leaving the lights
                   3486:    * on with nobody home. On the PCI bus you *may* be home,
                   3487:    * but then your mailing address is dynamically assigned
                   3488:    * so no one can find you anyway :-)
                   3489:    */
                   3490:   printk("aic7xxx: Downloading sequencer code...");
                   3491:   aic7xxx_loadseq(base);
                   3492: 
                   3493:   /*
                   3494:    * Set Fast Mode and Enable the board
                   3495:    */
                   3496:   outb(FASTMODE, SEQCTL + base);
                   3497: 
                   3498:   if (p->chip_type == AIC_777x)
                   3499:   {
                   3500:     outb(ENABLE, BCTL + base);
                   3501:   }
                   3502: 
                   3503:   printk("done.\n");
                   3504: 
                   3505:   /*
                   3506:    * Set the SCSI Id, SXFRCTL0, SXFRCTL1, and SIMODE1, for both channels
                   3507:    */
                   3508:   if (p->bus_type == AIC_TWIN)
                   3509:   {
                   3510:     /*
                   3511:      * Select Channel B.
                   3512:      */
                   3513:     outb((sblkctl & ~SELBUS_MASK) | SELBUSB, SBLKCTL + base);
                   3514: 
                   3515:     outb(config->scsi_id_b, SCSIID + base);
                   3516:     scsi_conf = inb(SCSICONF + base + 1) & (ENSPCHK | STIMESEL);
                   3517:     outb(scsi_conf | ENSTIMER | ACTNEGEN | STPWEN, SXFRCTL1 + base);
                   3518:     outb(ENSELTIMO , SIMODE1 + base);
                   3519:     if (p->ultra_enabled)
                   3520:     {
                   3521:       outb(DFON | SPIOEN | ULTRAEN, SXFRCTL0 + base);
                   3522:     }
                   3523:     else
                   3524:     {
                   3525:       outb(DFON | SPIOEN, SXFRCTL0 + base);
                   3526:     }
                   3527: 
                   3528:     /*
                   3529:      * Select Channel A
                   3530:      */
                   3531:     outb((sblkctl & ~SELBUS_MASK) | SELNARROW, SBLKCTL + base);
                   3532:   }
                   3533:   outb(config->scsi_id, SCSIID + base);
                   3534:   scsi_conf = inb(SCSICONF + base) & (ENSPCHK | STIMESEL);
                   3535:   outb(scsi_conf | ENSTIMER | ACTNEGEN | STPWEN, SXFRCTL1 + base);
                   3536:   outb(ENSELTIMO , SIMODE1 + base);
                   3537:   if (p->ultra_enabled)
                   3538:   {
                   3539:     outb(DFON | SPIOEN | ULTRAEN, SXFRCTL0 + base);
                   3540:   }
                   3541:   else
                   3542:   {
                   3543:     outb(DFON | SPIOEN, SXFRCTL0 + base);
                   3544:   }
                   3545: 
                   3546:   /*
                   3547:    * Look at the information that board initialization or the board
                   3548:    * BIOS has left us. In the lower four bits of each target's
                   3549:    * scratch space any value other than 0 indicates that we should
                   3550:    * initiate synchronous transfers. If it's zero, the user or the
                   3551:    * BIOS has decided to disable synchronous negotiation to that
                   3552:    * target so we don't activate the needsdtr flag.
                   3553:    */
                   3554:   p->needsdtr_copy = 0x0;
                   3555:   p->sdtr_pending = 0x0;
                   3556:   p->needwdtr_copy = 0x0;
                   3557:   p->wdtr_pending = 0x0;
                   3558:   if (p->bus_type == AIC_SINGLE)
                   3559:   {
                   3560:     max_targets = 8;
                   3561:   }
                   3562:   else
                   3563:   {
                   3564:     max_targets = 16;
                   3565:   }
                   3566: 
                   3567:   /*
                   3568:    * Grab the disconnection disable table and invert it for our needs
                   3569:    */
                   3570:   if (have_seeprom)
                   3571:   {
                   3572:     p->discenable = 0x0;
                   3573:   }
                   3574:   else
                   3575:   {
                   3576:     if (bios_disabled)
                   3577:     {
                   3578:       printk("aic7xxx : Host adapter BIOS disabled. Using default SCSI "
                   3579:              "device parameters.\n");
                   3580:       p->discenable = 0xFFFF;
                   3581:     }
                   3582:     else
                   3583:     {
                   3584:       p->discenable = ~((inb(DISC_DSB + base + 1) << 8) |
                   3585:           inb(DISC_DSB + base));
                   3586:     }
                   3587:   }
                   3588: 
                   3589:   for (i = 0; i < max_targets; i++)
                   3590:   {
                   3591:     if (have_seeprom)
                   3592:     {
                   3593:       target_settings = ((sc.device_flags[i] & CFXFER) << 4);
                   3594:       if (sc.device_flags[i] & CFSYNCH)
                   3595:       {
                   3596:        p->needsdtr_copy |= (0x01 << i);
                   3597:       }
                   3598:       if (sc.device_flags[i] & CFWIDEB)
                   3599:       {
                   3600:        p->needwdtr_copy |= (0x01 << i);
                   3601:       }
                   3602:       if (sc.device_flags[i] & CFDISC)
                   3603:       {
                   3604:         p->discenable |= (0x01 << i);
                   3605:       }
                   3606:     }
                   3607:     else
                   3608:     {
                   3609:       if (bios_disabled)
                   3610:       {
                   3611:         target_settings = 0;  /* 10 MHz */
                   3612:         p->needsdtr_copy |= (0x01 << i);
                   3613:         p->needwdtr_copy |= (0x01 << i);
                   3614:       }
                   3615:       else
                   3616:       {
                   3617:         target_settings = inb(TARG_SCRATCH + base + i);
                   3618:         if (target_settings & 0x0F)
                   3619:         {
                   3620:           p->needsdtr_copy |= (0x01 << i);
                   3621:           /*
                   3622:            * Default to asynchronous transfers (0 offset)
                   3623:            */
                   3624:           target_settings &= 0xF0;
                   3625:         }
                   3626:         if (target_settings & 0x80)
                   3627:         {
                   3628:           p->needwdtr_copy |= (0x01 << i);
                   3629:           target_settings &= 0x7F;
                   3630:         }
                   3631:       }
                   3632:     }
                   3633:     outb(target_settings, (TARG_SCRATCH + base + i));
                   3634:   }
                   3635: 
                   3636:   /*
                   3637:    * If we are not wide, forget WDTR. This makes the driver
                   3638:    * work on some cards that don't leave these fields cleared
                   3639:    * when BIOS is not installed.
                   3640:    */
                   3641:   if (p->bus_type != AIC_WIDE)
                   3642:   {
                   3643:     p->needwdtr = 0;
                   3644:   }
                   3645:   p->needsdtr = p->needsdtr_copy;
                   3646:   p->needwdtr = p->needwdtr_copy;
                   3647: #if 0
                   3648:   printk("NeedSdtr = 0x%x, 0x%x\n", p->needsdtr_copy, p->needsdtr);
                   3649:   printk("NeedWdtr = 0x%x, 0x%x\n", p->needwdtr_copy, p->needwdtr);
                   3650: #endif
                   3651: 
                   3652:   /*
                   3653:    * Clear the control byte for every SCB so that the sequencer
                   3654:    * doesn't get confused and think that one of them is valid
                   3655:    */
                   3656:   for (i = 0; i < config->maxscb; i++)
                   3657:   {
                   3658:     outb(i, SCBPTR + base);
                   3659:     outb(0, SCBARRAY + base);
                   3660:   }
                   3661: 
                   3662:   /*
                   3663:    * For reconnecting targets, the sequencer code needs to
                   3664:    * know how many SCBs it has to search through.
                   3665:    */
                   3666:   outb(config->maxscb, SCBCOUNT + base);
                   3667: 
                   3668:   /*
                   3669:    * 2s compliment of SCBCOUNT
                   3670:    */
                   3671:   i = p->maxscb;
                   3672:   outb(-i & 0xff, COMP_SCBCOUNT + base);
                   3673: 
                   3674:   /*
                   3675:    * Clear the active flags - no targets are busy.
                   3676:    */
                   3677:   outb(0, ACTIVE_A + base);
                   3678:   outb(0, ACTIVE_B + base);
                   3679: 
                   3680:   /*
                   3681:    * We don't have any waiting selections
                   3682:    */
                   3683:   outb(SCB_LIST_NULL, WAITING_SCBH + base);
                   3684:   outb(SCB_LIST_NULL, WAITING_SCBT + base);
                   3685: 
                   3686:   /*
                   3687:    * Reset the SCSI bus. Is this necessary?
                   3688:    *   There may be problems for a warm boot without resetting
                   3689:    *   the SCSI bus. Either BIOS settings in scratch RAM
                   3690:    *   will not get reinitialized, or devices may stay at
                   3691:    *   previous negotiated settings (SDTR and WDTR) while
                   3692:    *   the driver will think that no negotiations have been
                   3693:    *   performed.
                   3694:    *
                   3695:    * Some devices need a long time to "settle" after a SCSI
                   3696:    * bus reset.
                   3697:    */
                   3698: 
                   3699:   if (!aic7xxx_no_reset)
                   3700:   {
                   3701:     printk("aic7xxx: Resetting the SCSI bus...");
                   3702:     if (p->bus_type == AIC_TWIN)
                   3703:     {
                   3704:       /*
                   3705:        * Select Channel B.
                   3706:        */
                   3707:       outb((sblkctl & ~SELBUS_MASK) | SELBUSB, SBLKCTL + base);
                   3708: 
                   3709:       outb(SCSIRSTO, SCSISEQ + base);
                   3710:       udelay(1000);
                   3711:       outb(0, SCSISEQ + base);
                   3712: 
                   3713:       /*
                   3714:        * Select Channel A.
                   3715:        */
                   3716:       outb((sblkctl & ~SELBUS_MASK) | SELNARROW, SBLKCTL + base);
                   3717:     }
                   3718: 
                   3719:     outb(SCSIRSTO, SCSISEQ + base);
                   3720:     udelay(1000);
                   3721:     outb(0, SCSISEQ + base);
                   3722: 
                   3723:     aic7xxx_delay(AIC7XXX_RESET_DELAY);
                   3724: 
                   3725:     printk("done.\n");
                   3726:   }
                   3727: 
                   3728:   /*
                   3729:    * Unpause the sequencer before returning and enable
                   3730:    * interrupts - we shouldn't get any until the first
                   3731:    * command is sent to us by the high-level SCSI code.
                   3732:    */
                   3733:   UNPAUSE_SEQUENCER(p);
                   3734:   return (found);
                   3735: }
                   3736: 
                   3737: /*+F*************************************************************************
                   3738:  * Function:
                   3739:  *   aic7xxx_detect
                   3740:  *
                   3741:  * Description:
                   3742:  *   Try to detect and register an Adaptec 7770 or 7870 SCSI controller.
                   3743:  *-F*************************************************************************/
                   3744: int
                   3745: aic7xxx_detect(Scsi_Host_Template *template)
                   3746: {
                   3747:   int found = 0, slot, base;
                   3748:   unsigned char irq = 0;
                   3749:   int i;
                   3750:   struct aic7xxx_host_config config;
                   3751: 
                   3752:   template->proc_dir = &proc_scsi_aic7xxx;
                   3753:   config.chan_num = 0;
                   3754: 
                   3755:   /*
                   3756:    * Since we may allow sharing of IRQs, it is imperative
                   3757:    * that we "null-out" the aic7xxx_boards array. It is
                   3758:    * not guaranteed to be initialized to 0 (NULL). We use
                   3759:    * a NULL entry to indicate that no prior hosts have
                   3760:    * been found/registered for that IRQ.
                   3761:    */
                   3762:   for (i = 0; i <= MAXIRQ; i++)
                   3763:   {
                   3764:     aic7xxx_boards[i] = NULL;
                   3765:   }
                   3766: 
                   3767:   /*
                   3768:    * Initialize the spurious count to 0.
                   3769:    */
                   3770:   aic7xxx_spurious_count = 0;
                   3771: 
                   3772:   /*
                   3773:    * EISA/VL-bus card signature probe.
                   3774:    */
                   3775:   for (slot = MINSLOT; slot <= MAXSLOT; slot++)
                   3776:   {
                   3777:     base = SLOTBASE(slot) + MINREG;
                   3778: 
                   3779:     if (check_region(MINREG + base, MAXREG - MINREG))
                   3780:     {
                   3781:       /*
                   3782:        * Some other driver has staked a
                   3783:        * claim to this i/o region already.
                   3784:        */
                   3785:       continue;
                   3786:     }
                   3787: 
                   3788:     config.type = aic7xxx_probe(slot, HID0 + base);
                   3789:     if (config.type != AIC_NONE)
                   3790:     {
                   3791:       /*
                   3792:        * We found a card, allow 1 spurious interrupt.
                   3793:        */
                   3794:       aic7xxx_spurious_count = 1;
                   3795: 
                   3796:       /*
                   3797:        * We "find" a AIC-7770 if we locate the card
                   3798:        * signature and we can set it up and register
                   3799:        * it with the kernel without incident.
                   3800:        */
                   3801:       config.chip_type = AIC_777x;
                   3802:       config.base = base;
                   3803:       config.irq = irq;
                   3804:       config.parity = AIC_UNKNOWN;
                   3805:       config.low_term = AIC_UNKNOWN;
                   3806:       config.high_term = AIC_UNKNOWN;
                   3807:       config.busrtime = 0;
                   3808:       config.walk_scbs = FALSE;
                   3809:       config.ultra_enabled = FALSE;
                   3810:       found += aic7xxx_register(template, &config);
                   3811: 
                   3812:       /*
                   3813:        * Disallow spurious interrupts.
                   3814:        */
                   3815:       aic7xxx_spurious_count = 0;
                   3816:     }
                   3817:   }
                   3818: 
                   3819: #ifdef CONFIG_PCI
                   3820:   /*
                   3821:    * PCI-bus probe.
                   3822:    */
                   3823:   if (pcibios_present())
                   3824:   {
                   3825:     struct
                   3826:     {
                   3827:       unsigned short vendor_id;
                   3828:       unsigned short device_id;
                   3829:       aha_type       card_type;
                   3830:       aha_chip_type  chip_type;
                   3831:     } const aic7xxx_pci_devices[] = {
                   3832:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7850, AIC_7850, AIC_785x},
                   3833:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7870, AIC_7870, AIC_787x},
                   3834:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7871, AIC_7871, AIC_787x},
                   3835:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7872, AIC_7872, AIC_787x},
                   3836:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7873, AIC_7873, AIC_787x},
                   3837:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7874, AIC_7874, AIC_787x},
                   3838:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7880, AIC_7880, AIC_788x},
                   3839:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7881, AIC_7881, AIC_788x},
                   3840:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7882, AIC_7882, AIC_788x},
                   3841:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7883, AIC_7883, AIC_788x},
                   3842:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7884, AIC_7884, AIC_788x}
                   3843:     };
                   3844: 
                   3845:     int error;
                   3846:     int done = 0;
                   3847:     unsigned int io_port;
                   3848:     unsigned short index = 0;
                   3849:     unsigned char pci_bus, pci_device_fn;
                   3850:     unsigned int  csize_lattime;
                   3851:     unsigned int  class_revid;
                   3852:     unsigned int  devconfig;
                   3853:     char rev_id[] = {'B', 'C', 'D'};
                   3854: 
                   3855:     for (i = 0; i < NUMBER(aic7xxx_pci_devices); i++)
                   3856:     {
                   3857:       done = FALSE;
                   3858:       while (!done)
                   3859:       {
                   3860:         if (pcibios_find_device(aic7xxx_pci_devices[i].vendor_id,
                   3861:                                 aic7xxx_pci_devices[i].device_id,
                   3862:                                 index, &pci_bus, &pci_device_fn))
                   3863:         {
                   3864:           done = TRUE;
                   3865:         }
                   3866:         else  /* Found an Adaptec PCI device. */
                   3867:         {
                   3868:           config.type = aic7xxx_pci_devices[i].card_type;
                   3869:           config.chip_type = aic7xxx_pci_devices[i].chip_type;
                   3870:           config.chan_num = 0;
                   3871:           config.walk_scbs = FALSE;
                   3872:           switch (config.type)
                   3873:           {
                   3874:             case AIC_7872:  /* 3940 */
                   3875:             case AIC_7882:  /* 3940-Ultra */
                   3876:               config.walk_scbs = TRUE;
                   3877:               config.chan_num = number_of_39xxs & 0x1;  /* Has 2 controllers */
                   3878:               number_of_39xxs++;
                   3879:               if (number_of_39xxs == 2)
                   3880:               {
                   3881:                 number_of_39xxs = 0;  /* To be consistent with 3985. */
                   3882:               }
                   3883:               break;
                   3884: 
                   3885:             case AIC_7873:  /* 3985 */
                   3886:             case AIC_7883:  /* 3985-Ultra */
                   3887:               config.chan_num = number_of_39xxs & 0x3;  /* Has 3 controllers */
                   3888:               number_of_39xxs++;
                   3889:               if (number_of_39xxs == 3)
                   3890:               {
                   3891:                 number_of_39xxs = 0;
                   3892:               }
                   3893:               break;
                   3894: 
                   3895:             default:
                   3896:               break;
                   3897:           }
                   3898: 
                   3899:           /*
                   3900:            * Read esundry information from PCI BIOS.
                   3901:            */
                   3902:           error = pcibios_read_config_dword(pci_bus, pci_device_fn,
                   3903:                                             PCI_BASE_ADDRESS_0, &io_port);
                   3904:           error += pcibios_read_config_byte(pci_bus, pci_device_fn,
                   3905:                                             PCI_INTERRUPT_LINE, &irq);
                   3906: 
                   3907:           /*
                   3908:            * Ensure that we are using good values for the PCI burst size
                   3909:            * and latency timer.
                   3910:            */
                   3911:           error += pcibios_read_config_dword(pci_bus, pci_device_fn,
                   3912:                                              CSIZE_LATTIME, &csize_lattime);
                   3913:           if ((csize_lattime & CACHESIZE) == 0)
                   3914:           {
                   3915:             /* Default to 8DWDs - what's the PCI define for this? */
                   3916:             csize_lattime |= 8;
                   3917:           }
                   3918:           if((csize_lattime & LATTIME) == 0)
                   3919:           {
                   3920:             /* Default to 64 PCLKS (is this a good value?) */
                   3921:             /* This may also be availble in the SEEPROM?? */
                   3922:             csize_lattime |= (64 << 8);
                   3923:           }
                   3924:           pcibios_write_config_dword(pci_bus, pci_device_fn,
                   3925:                                      CSIZE_LATTIME, csize_lattime);
                   3926:           printk("aic7xxx: BurstLen = %d DWDs, Latency Timer = %d PCLKS\n",
                   3927:                   (int) (csize_lattime & CACHESIZE),
                   3928:                   (csize_lattime >> 8) & 0x000000ff);
                   3929: 
                   3930:           error += pcibios_read_config_dword(pci_bus, pci_device_fn,
                   3931:                                              CLASS_PROGIF_REVID, &class_revid);
                   3932:           if ((class_revid & DEVREVID) < 3)
                   3933:           {
                   3934:             printk("aic7xxx: %s Rev %c.\n", board_names[config.type],
                   3935:                    rev_id[class_revid & DEVREVID]);
                   3936:           }
                   3937: 
                   3938:           error += pcibios_read_config_dword(pci_bus, pci_device_fn,
                   3939:                                              DEVCONFIG, &devconfig);
                   3940:           if (error)
                   3941:           {
                   3942:             panic("aic7xxx: (aic7xxx_detect) Error %d reading PCI registers.\n",
                   3943:                   error);
                   3944:           }
                   3945: 
                   3946:           printk("aic7xxx: devconfig = 0x%x.\n", devconfig);
                   3947: 
                   3948:           /*
                   3949:            * The first bit of PCI_BASE_ADDRESS_0 is always set, so
                   3950:            * we mask it off.
                   3951:            */
                   3952:           base = io_port & 0xfffffffe;
                   3953: 
                   3954:           /*
                   3955:            * I don't think we need to bother with allowing
                   3956:            * spurious interrupts for the 787x/7850, but what
                   3957:            * the hey.
                   3958:            */
                   3959:           aic7xxx_spurious_count = 1;
                   3960: 
                   3961:           config.base = base;
                   3962:           config.irq = irq;
                   3963:           config.parity = AIC_UNKNOWN;
                   3964:           config.low_term = AIC_UNKNOWN;
                   3965:           config.high_term = AIC_UNKNOWN;
                   3966:           config.busrtime = 0;
                   3967:           config.ultra_enabled = FALSE;
                   3968:           if (devconfig & RAMPSM)
                   3969:           {
                   3970:             /*
                   3971:              * External SRAM present.  Have the probe walk the SCBs to see
                   3972:              * how much SRAM we have and set the number of SCBs accordingly.
                   3973:              * We have to turn off SCBRAMSEL to access the external SCB
                   3974:              * SRAM.
                   3975:              *
                   3976:              * It seems that early versions of the aic7870 didn't use these
                   3977:              * bits, hence the hack for the 3940 above.  I would guess that
                   3978:              * recent 3940s using later aic7870 or aic7880 chips do actually
                   3979:              * set RAMPSM.
                   3980:              *
                   3981:              * The documentation isn't clear, but it sounds like the value
                   3982:              * written to devconfig must not have RAMPSM set.  The second
                   3983:              * sixteen bits of the register are R/O anyway, so it shouldn't
                   3984:              * affect RAMPSM either way.
                   3985:              */
                   3986:             printk ("aic7xxx: External RAM detected. Enabling RAM access.\n");
                   3987:             devconfig &= ~(RAMPSM | SCBRAMSEL);
                   3988:             pcibios_write_config_dword(pci_bus, pci_device_fn,
                   3989:                                        DEVCONFIG, devconfig);
                   3990:             config.walk_scbs = TRUE;
                   3991:           }
                   3992:           found += aic7xxx_register(template, &config);
                   3993: 
                   3994:           /*
                   3995:            * Disable spurious interrupts.
                   3996:            */
                   3997:           aic7xxx_spurious_count = 0;
                   3998: 
                   3999:           index++;
                   4000:         }  /* Found an Adaptec PCI device. */
                   4001:       }
                   4002:     }
                   4003:   }
                   4004: #endif CONFIG_PCI
                   4005: 
                   4006:   template->name = aic7xxx_info(NULL);
                   4007:   return (found);
                   4008: }
                   4009: 
                   4010: 
                   4011: /*+F*************************************************************************
                   4012:  * Function:
                   4013:  *   aic7xxx_buildscb
                   4014:  *
                   4015:  * Description:
                   4016:  *   Build a SCB.
                   4017:  *-F*************************************************************************/
                   4018: static void
                   4019: aic7xxx_buildscb(struct aic7xxx_host *p,
                   4020:                 Scsi_Cmnd *cmd,
                   4021:                 struct aic7xxx_scb *scb)
                   4022: {
                   4023:   void *addr;
                   4024:   unsigned short mask;
                   4025:   struct scatterlist *sg;
                   4026: 
                   4027:   /*
                   4028:    * Setup the control byte if we need negotiation and have not
                   4029:    * already requested it.
                   4030:    */
                   4031: #ifdef AIC7XXX_TAGGED_QUEUEING
                   4032:   if (cmd->device->tagged_supported)
                   4033:   {
                   4034:     if (cmd->device->tagged_queue == 0)
                   4035:     {
                   4036:       printk("aic7xxx: Enabling tagged queuing for target %d, "
                   4037:             "channel %d.\n", cmd->target, cmd->channel);
                   4038:       cmd->device->tagged_queue = 1;
                   4039:       cmd->device->current_tag = 1;  /* enable tagging */
                   4040:     }
                   4041:     cmd->tag = cmd->device->current_tag;
                   4042:     cmd->device->current_tag++;
                   4043:     scb->control |= TAG_ENB;
                   4044:   }
                   4045: #endif
                   4046:   mask = (0x01 << (cmd->target | (cmd->channel << 3)));
                   4047:   if (p->discenable & mask)
                   4048:   {
                   4049:     scb->control |= DISCENB;
                   4050:   }
                   4051:   if ((p->needwdtr & mask) && !(p->wdtr_pending & mask))
                   4052:   {
                   4053:     p->wdtr_pending |= mask;
                   4054:     scb->control |= NEEDWDTR;
                   4055: #if 0
                   4056:     printk("aic7xxx: Sending WDTR request to target %d.\n", cmd->target);
                   4057: #endif
                   4058:   }
                   4059:   else
                   4060:   {
                   4061:     if ((p->needsdtr & mask) && !(p->sdtr_pending & mask))
                   4062:     {
                   4063:       p->sdtr_pending |= mask;
                   4064:       scb->control |= NEEDSDTR;
                   4065: #if 0
                   4066:       printk("aic7xxx: Sending SDTR request to target %d.\n", cmd->target);
                   4067: #endif
                   4068:     }
                   4069:   }
                   4070: 
                   4071: #if 0
                   4072:   printk("aic7xxx: (build_scb) Target %d, cmd(0x%x) size(%u) wdtr(0x%x) "
                   4073:          "mask(0x%x).\n",
                   4074:         cmd->target, cmd->cmnd[0], cmd->cmd_len, p->needwdtr, mask);
                   4075: #endif
                   4076:   scb->target_channel_lun = ((cmd->target << 4) & 0xF0) |
                   4077:        ((cmd->channel & 0x01) << 3) | (cmd->lun & 0x07);
                   4078: 
                   4079:   /*
                   4080:    * The interpretation of request_buffer and request_bufflen
                   4081:    * changes depending on whether or not use_sg is zero; a
                   4082:    * non-zero use_sg indicates the number of elements in the
                   4083:    * scatter-gather array.
                   4084:    */
                   4085: 
                   4086:   /*
                   4087:    * XXX - this relies on the host data being stored in a
                   4088:    *       little-endian format.
                   4089:    */
                   4090:   addr = cmd->cmnd;
                   4091:   scb->SCSI_cmd_length = cmd->cmd_len;
                   4092:   memcpy(scb->SCSI_cmd_pointer, &addr, sizeof(scb->SCSI_cmd_pointer));
                   4093: 
                   4094:   if (cmd->use_sg)
                   4095:   {
                   4096:     scb->SG_segment_count = cmd->use_sg;
                   4097:     memcpy(scb->SG_list_pointer, &cmd->request_buffer,
                   4098:           sizeof(scb->SG_list_pointer));
                   4099:     memcpy(&sg, &cmd->request_buffer, sizeof(sg));
                   4100:     memcpy(scb->data_pointer, &(sg[0].address), sizeof(scb->data_pointer));
                   4101:     scb->data_count = sg[0].length;
                   4102: #if 0
                   4103:     debug("aic7xxx: (build_scb) SG segs(%d), length(%u), sg[0].length(%d).\n",
                   4104:            cmd->use_sg, aic7xxx_length(cmd, 0), scb->data_count);
                   4105: #endif
                   4106:   }
                   4107:   else
                   4108:   {
                   4109: #if 0
                   4110:   debug("aic7xxx: (build_scb) Creating scatterlist, addr(0x%lx) length(%d).\n",
                   4111:        (unsigned long) cmd->request_buffer, cmd->request_bufflen);
                   4112: #endif
                   4113:     if (cmd->request_bufflen == 0)
                   4114:     {
                   4115:       /*
                   4116:        * In case the higher level SCSI code ever tries to send a zero
                   4117:        * length command, ensure the SCB indicates no data.  The driver
                   4118:        * will interpret a zero length command as a Bus Device Reset.
                   4119:        */
                   4120:       scb->SG_segment_count = 0;
                   4121:       memset(scb->SG_list_pointer, 0, sizeof(scb->SG_list_pointer));
                   4122:       memset(scb->data_pointer, 0, sizeof(scb->data_pointer));
                   4123:       scb->data_count = 0;
                   4124:     }
                   4125:     else
                   4126:     {
                   4127:       scb->SG_segment_count = 1;
                   4128:       scb->sg.address = (char *) cmd->request_buffer;
                   4129:       scb->sg.length = cmd->request_bufflen;
                   4130:       addr = &scb->sg;
                   4131:       memcpy(scb->SG_list_pointer, &addr, sizeof(scb->SG_list_pointer));
                   4132:       scb->data_count = scb->sg.length;
                   4133:       memcpy(scb->data_pointer, &cmd->request_buffer, sizeof(scb->data_pointer));
                   4134:     }
                   4135:   }
                   4136: }
                   4137: 
                   4138: /*+F*************************************************************************
                   4139:  * Function:
                   4140:  *   aic7xxx_queue
                   4141:  *
                   4142:  * Description:
                   4143:  *   Queue a SCB to the controller.
                   4144:  *-F*************************************************************************/
                   4145: int
                   4146: aic7xxx_queue(Scsi_Cmnd *cmd, void (*fn)(Scsi_Cmnd *))
                   4147: {
                   4148:   long flags;
                   4149:   struct aic7xxx_host *p;
                   4150:   struct aic7xxx_scb *scb;
                   4151: 
                   4152:   p = (struct aic7xxx_host *) cmd->host->hostdata;
                   4153: 
                   4154:   /*
                   4155:    * Check to see if channel was scanned.
                   4156:    */
                   4157:   if (!p->a_scanned && (cmd->channel == 0))
                   4158:   {
                   4159:     printk("aic7xxx: Scanning channel A for devices.\n");
                   4160:     p->a_scanned = TRUE;
                   4161:   }
                   4162:   else
                   4163:   {
                   4164:     if (!p->b_scanned && (cmd->channel == 1))
                   4165:     {
                   4166:       printk("aic7xxx: Scanning channel B for devices.\n");
                   4167:       p->b_scanned = TRUE;
                   4168:     }
                   4169:   }
                   4170: 
                   4171: #if 0
                   4172:   debug("aic7xxx: (queue) cmd(0x%x) size(%u), target %d, channel %d, lun %d.\n",
                   4173:        cmd->cmnd[0], cmd->cmd_len, cmd->target, cmd->channel,
                   4174:        cmd->lun & 0x07);
                   4175: #endif
                   4176: 
                   4177:   /*
                   4178:    * This is a critical section, since we don't want the
                   4179:    * interrupt routine mucking with the host data or the
                   4180:    * card. Since the kernel documentation is vague on
                   4181:    * whether or not we are in a cli/sti pair already, save
                   4182:    * the flags to be on the safe side.
                   4183:    */
                   4184:   save_flags(flags);
                   4185:   cli();
                   4186: 
                   4187:   /*
                   4188:    * Find a free slot in the SCB array to load this command
                   4189:    * into. Since can_queue is set to the maximum number of
                   4190:    * SCBs for the card, we should always find one.
                   4191:    *
                   4192:    * First try to find an scb in the free list. If there are
                   4193:    * none in the free list, then check the current number of
                   4194:    * of scbs and take an unused one from the scb array.
                   4195:    */
                   4196:   scb = p->free_scb;
                   4197:   if (scb != NULL)
                   4198:   { /* found one in the free list */
                   4199:     p->free_scb = scb->next;   /* remove and update head of list */
                   4200:     /*
                   4201:      * Warning! For some unknown reason, the scb at the head
                   4202:      * of the free list is not the same address that it should
                   4203:      * be. That's why we set the scb pointer taken by the
                   4204:      * position in the array. The scb at the head of the list
                   4205:      * should match this address, but it doesn't.
                   4206:      */
                   4207:     scb = &(p->scb_array[scb->position]);
                   4208:     scb->control = 0;
                   4209:     scb->state = SCB_ACTIVE;
                   4210:   }
                   4211:   else
                   4212:   {
                   4213:     if (p->numscb >= p->maxscb)
                   4214:     {
                   4215:       panic("aic7xxx: (aic7xxx_queue) Couldn't find a free SCB.\n");
                   4216:     }
                   4217:     else
                   4218:     {
                   4219:       /*
                   4220:        * Initialize the scb within the scb array. The
                   4221:        * position within the array is the position on
                   4222:        * the board that it will be loaded.
                   4223:        */
                   4224:       scb = &(p->scb_array[p->numscb]);
                   4225:       memset(scb, 0, sizeof(*scb));
                   4226: 
                   4227:       scb->position = p->numscb;
                   4228:       p->numscb++;
                   4229:       scb->state = SCB_ACTIVE;
                   4230:     }
                   4231:   }
                   4232: 
                   4233:   scb->cmd = cmd;
                   4234:   aic7xxx_position(cmd) = scb->position;
                   4235: #if 0
                   4236:   debug_scb(scb);
                   4237: #endif;
                   4238: 
                   4239:   /*
                   4240:    * Construct the SCB beforehand, so the sequencer is
                   4241:    * paused a minimal amount of time.
                   4242:    */
                   4243:   aic7xxx_buildscb(p, cmd, scb);
                   4244: 
                   4245: #if 0
                   4246:   if (scb != &p->scb_array[scb->position])
                   4247:   {
                   4248:     printk("aic7xxx: (queue) Address of SCB by position does not match SCB "
                   4249:            "address.\n");
                   4250:   }
                   4251:   printk("aic7xxx: (queue) SCB pos(%d) cmdptr(0x%x) state(%d) freescb(0x%x)\n",
                   4252:         scb->position, (unsigned int) scb->cmd,
                   4253:         scb->state, (unsigned int) p->free_scb);
                   4254: #endif
                   4255:   /*
                   4256:    * Pause the sequencer so we can play with its registers -
                   4257:    * wait for it to acknowledge the pause.
                   4258:    *
                   4259:    * XXX - should the interrupts be left on while doing this?
                   4260:    */
                   4261:   PAUSE_SEQUENCER(p);
                   4262: 
                   4263:   /*
                   4264:    * Save the SCB pointer and put our own pointer in - this
                   4265:    * selects one of the four banks of SCB registers. Load
                   4266:    * the SCB, then write its pointer into the queue in FIFO
                   4267:    * and restore the saved SCB pointer.
                   4268:    */
                   4269:   aic7xxx_putscb(p, scb);
                   4270:   outb(scb->position, QINFIFO + p->base);
                   4271: 
                   4272:   /*
                   4273:    * Make sure the Scsi_Cmnd pointer is saved, the struct it
                   4274:    * points to is set up properly, and the parity error flag
                   4275:    * is reset, then unpause the sequencer and watch the fun
                   4276:    * begin.
                   4277:    */
                   4278:   cmd->scsi_done = fn;
                   4279:   aic7xxx_error(cmd) = DID_OK;
                   4280:   aic7xxx_status(cmd) = 0;
                   4281:   cmd->result = 0;
                   4282:   memset(&cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
                   4283: 
                   4284:   UNPAUSE_SEQUENCER(p);
                   4285: #if 0
                   4286:   printk("aic7xxx: (queue) After - cmd(0x%lx) scb->cmd(0x%lx) pos(%d).\n",
                   4287:          (long) cmd, (long) scb->cmd, scb->position);
                   4288: #endif;
                   4289:   restore_flags(flags);
                   4290:   return (0);
                   4291: }
                   4292: 
                   4293: /*+F*************************************************************************
                   4294:  * Function:
                   4295:  *   aic7xxx_abort_scb
                   4296:  *
                   4297:  * Description:
                   4298:  *   Abort an scb.  If the scb has not previously been aborted, then
                   4299:  *   we attempt to send a BUS_DEVICE_RESET message to the target.  If
                   4300:  *   the scb has previously been unsuccessfully aborted, then we will
                   4301:  *   reset the channel and have all devices renegotiate.  Returns an
                   4302:  *   enumerated type that indicates the status of the operation.
                   4303:  *-F*************************************************************************/
                   4304: static aha_abort_reset_type
                   4305: aic7xxx_abort_scb(struct aic7xxx_host *p, struct aic7xxx_scb *scb,
                   4306:                   unsigned char errcode)
                   4307: {
                   4308:   int base = p->base;
                   4309:   int found = FALSE;
                   4310:   aha_abort_reset_type scb_status = ABORT_RESET_SUCCESS;
                   4311:   char channel = scb->target_channel_lun & SELBUSB ? 'B': 'A';
                   4312: 
                   4313:   /*
                   4314:    * Ensure that the card doesn't do anything
                   4315:    * behind our back.
                   4316:    */
                   4317:   PAUSE_SEQUENCER(p);
                   4318: 
                   4319: #ifdef AIC7XXX_DEBUG_ABORT
                   4320:   printk ("aic7xxx: (abort_scb) scb %d, scb_aborted 0x%x\n",
                   4321:           scb->position, (scb->state & SCB_ABORTED));
                   4322: #endif
                   4323:   /*
                   4324:    * First, determine if we want to do a bus reset or simply a bus device
                   4325:    * reset.  If this is the first time that a transaction has timed out,
                   4326:    * just schedule a bus device reset.  Otherwise, we reset the bus and
                   4327:    * abort all pending I/Os on that bus.
                   4328:    */
                   4329:   if (scb->state & SCB_ABORTED)
                   4330:   {
                   4331:     /*
                   4332:      * Been down this road before.  Do a full bus reset.
                   4333:      */
                   4334:     found = aic7xxx_reset_channel(p, channel, scb->position);
                   4335:   }
                   4336:   else
                   4337:   {
                   4338:     unsigned char active_scb, control;
                   4339:     struct aic7xxx_scb *active_scbp;
                   4340: 
                   4341:     /*
                   4342:      * Send a Bus Device Reset Message:
                   4343:      * The target we select to send the message to may be entirely
                   4344:      * different than the target pointed to by the scb that timed
                   4345:      * out.  If the command is in the QINFIFO or the waiting for
                   4346:      * selection list, its not tying up the bus and isn't responsible
                   4347:      * for the delay so we pick off the active command which should
                   4348:      * be the SCB selected by SCBPTR.  If its disconnected or active,
                   4349:      * we device reset the target scbp points to.  Although it may
                   4350:      * be that this target is not responsible for the delay, it may
                   4351:      * may also be that we're timing out on a command that just takes
                   4352:      * too much time, so we try the bus device reset there first.
                   4353:      */
                   4354:     active_scb = inb(SCBPTR + base);
                   4355:     active_scbp = &(p->scb_array[active_scb]);
                   4356:     control = inb(SCBARRAY + base);
                   4357: 
                   4358:     /*
                   4359:      * Test to see if scbp is disconnected
                   4360:      */
                   4361:     outb(scb->position, SCBPTR + base);
                   4362:     if (inb(SCBARRAY + base) & DISCONNECTED)
                   4363:     {
                   4364: #ifdef AIC7XXX_DEBUG_ABORT
                   4365:   printk ("aic7xxx: (abort_scb) scb %d is disconnected.\n", scb->position);
                   4366: #endif
                   4367:       scb->state |= (SCB_DEVICE_RESET | SCB_ABORTED);
                   4368:       scb->SG_segment_count = 0;
                   4369:       memset(scb->SG_list_pointer, 0, sizeof(scb->SG_list_pointer));
                   4370:       memset(scb->data_pointer, 0, sizeof(scb->data_pointer));
                   4371:       scb->data_count = 0;
                   4372:       aic7xxx_putscb(p, scb);
                   4373:       aic7xxx_error(scb->cmd) = errcode;
                   4374:       scb_status = ABORT_RESET_PENDING;
                   4375:       aic7xxx_add_waiting_scb(base, scb, LIST_SECOND);
                   4376:       UNPAUSE_SEQUENCER(p);
                   4377:     }
                   4378:     else
                   4379:     {
                   4380:       /*
                   4381:        * Is the active SCB really active?
                   4382:        */
                   4383:       if (active_scbp->state & SCB_ACTIVE)
                   4384:       {
                   4385:         unsigned char msg_len = inb(MSG_LEN + base);
                   4386:         if (msg_len != 0)
                   4387:         {
                   4388: #ifdef AIC7XXX_DEBUG_ABORT
                   4389:           printk ("aic7xxx: (abort_scb) scb is active, needs DMA, "
                   4390:                   "msg_len is non-zero.\n");
                   4391: #endif
                   4392:           /*
                   4393:            * If we're in a message phase, tacking on another message
                   4394:            * may confuse the target totally. The bus is probably wedged,
                   4395:            * so reset the channel.
                   4396:            */
                   4397:           channel = (active_scbp->target_channel_lun & SELBUSB) ? 'B': 'A';
                   4398:           aic7xxx_reset_channel(p, channel, scb->position);
                   4399:         }
                   4400:         else
                   4401:         {
                   4402: #ifdef AIC7XXX_DEBUG_ABORT
                   4403:           printk ("aic7xxx: (abort_scb) scb is active, needs DMA, "
                   4404:                   "msg_len is zero.\n");
                   4405: #endif
                   4406:           /*
                   4407:            * Load the message buffer and assert attention.
                   4408:            */
                   4409:           active_scbp->state |= (SCB_DEVICE_RESET | SCB_ABORTED);
                   4410:           outb(1, MSG_LEN + base);
                   4411:           outb(MSG_BUS_DEVICE_RESET, MSG0 + base);
                   4412:           if (active_scbp->target_channel_lun != scb->target_channel_lun)
                   4413:           {
                   4414:             /*
                   4415:              * XXX - We would like to increment the timeout on scb, but
                   4416:              *       access to that routine is denied because it is hidden
                   4417:              *       in scsi.c.  If we were able to do this, it would give
                   4418:              *       scb a new lease on life.
                   4419:              */
                   4420:             ;
                   4421:           }
                   4422:           aic7xxx_error(scb->cmd) = errcode;
                   4423:           scb_status = ABORT_RESET_PENDING;
                   4424:           UNPAUSE_SEQUENCER(p);
                   4425:         }
                   4426:       }
                   4427:       else
                   4428:       {
                   4429: #ifdef AIC7XXX_DEBUG_ABORT
                   4430:           printk ("aic7xxx: (abort_scb) no active command.\n");
                   4431: #endif
                   4432:         /*
                   4433:          * No active command to single out, so reset
                   4434:          * the bus for the timed out target.
                   4435:          */
                   4436:         aic7xxx_reset_channel(p, channel, scb->position);
                   4437:       }
                   4438:     }
                   4439:   }
                   4440:   return (scb_status);
                   4441: }
                   4442: 
                   4443: /*+F*************************************************************************
                   4444:  * Function:
                   4445:  *   aic7xxx_abort_reset
                   4446:  *
                   4447:  * Description:
                   4448:  *   Abort or reset the current SCSI command(s).  Returns an enumerated
                   4449:  *   type that indicates the status of the operation.
                   4450:  *-F*************************************************************************/
                   4451: static aha_abort_reset_type
                   4452: aic7xxx_abort_reset(Scsi_Cmnd *cmd, unsigned char errcode)
                   4453: {
                   4454:   struct aic7xxx_scb  *scb;
                   4455:   struct aic7xxx_host *p;
                   4456:   long flags;
                   4457:   aha_abort_reset_type scb_status = ABORT_RESET_SUCCESS;
                   4458: 
                   4459:   p = (struct aic7xxx_host *) cmd->host->hostdata;
                   4460:   scb = &(p->scb_array[aic7xxx_position(cmd)]);
                   4461: 
                   4462:   save_flags(flags);
                   4463:   cli();
                   4464: 
                   4465: #ifdef AIC7XXX_DEBUG_ABORT
                   4466:   printk ("aic7xxx: (abort_reset) scb state 0x%x\n", scb->state);
                   4467: #endif
                   4468: 
                   4469:   if (scb->state & SCB_ACTIVE)
                   4470:   {
                   4471:     if (scb->state & SCB_IMMED)
                   4472:     {
                   4473:       /*
                   4474:        * Don't know how set the number of retries to 0.
                   4475:        */
                   4476:       /* cmd->retries = 0; */
                   4477:       aic7xxx_error(cmd) = errcode;
                   4478:       aic7xxx_done(p, scb);
                   4479:     }
                   4480:     else
                   4481:     {
                   4482:       /*
                   4483:        * Abort the operation.
                   4484:        */
                   4485:       scb_status = aic7xxx_abort_scb(p, scb, errcode);
                   4486:     }
                   4487:   }
                   4488:   else
                   4489:   {
                   4490:     /*
                   4491:      * The scb is not active and must have completed after the timeout
                   4492:      * check in scsi.c and before we check the scb state above.  For
                   4493:      * this case we return SCSI_ABORT_NOT_RUNNING (if abort was called)
                   4494:      * or SCSI_RESET_SUCCESS (if reset was called).
                   4495:      */
                   4496: #ifdef AIC7XXX_DEBUG_ABORT
                   4497:     printk ("aic7xxx: (abort_reset) called with no active scb, errcode 0x%x\n",
                   4498:             errcode);
                   4499: #endif
                   4500:     scb_status = ABORT_RESET_INACTIVE;
                   4501:     /*
                   4502:      * According to the comments in scsi.h and Michael Neuffer, if we do not
                   4503:      * have an active command for abort or reset, we should not call the
                   4504:      * command done function.  Unfortunately, this hangs the system for me
                   4505:      * unless we *do* call the done function.
                   4506:      *
                   4507:      * XXX - Revisit this sometime!
                   4508:      */
                   4509:     cmd->result = errcode << 16;
                   4510:     cmd->scsi_done(cmd);
                   4511:   }
                   4512:   restore_flags(flags);
                   4513:   return (scb_status);
                   4514: }
                   4515: 
                   4516: 
                   4517: /*+F*************************************************************************
                   4518:  * Function:
                   4519:  *   aic7xxx_abort
                   4520:  *
                   4521:  * Description:
                   4522:  *   Abort the current SCSI command(s).
                   4523:  *-F*************************************************************************/
                   4524: int
                   4525: aic7xxx_abort(Scsi_Cmnd *cmd)
                   4526: {
                   4527: #ifdef AIC7XXX_DEBUG_ABORT
                   4528:   printk ("aic7xxx: (abort) target/channel %d/%d\n", cmd->target, cmd->channel);
                   4529: #endif
                   4530: 
                   4531:   switch (aic7xxx_abort_reset(cmd, DID_ABORT))
                   4532:   {
                   4533:     case ABORT_RESET_INACTIVE:
                   4534:       return (SCSI_ABORT_NOT_RUNNING);
                   4535:       break;
                   4536:     case ABORT_RESET_PENDING:
                   4537:       return (SCSI_ABORT_PENDING);
                   4538:       break;
                   4539:     case ABORT_RESET_SUCCESS:
                   4540:     default:
                   4541:       return (SCSI_ABORT_SUCCESS);
                   4542:       break;
                   4543:   }
                   4544: }
                   4545: 
                   4546: /*+F*************************************************************************
                   4547:  * Function:
                   4548:  *   aic7xxx_reset
                   4549:  *
                   4550:  * Description:
                   4551:  *   Resetting the bus always succeeds - is has to, otherwise the
                   4552:  *   kernel will panic! Try a surgical technique - sending a BUS
                   4553:  *   DEVICE RESET message - on the offending target before pulling
                   4554:  *   the SCSI bus reset line.
                   4555:  *-F*************************************************************************/
                   4556: int
                   4557: aic7xxx_reset(Scsi_Cmnd *cmd)
                   4558: {
                   4559: #ifdef AIC7XXX_DEBUG_ABORT
                   4560:   printk ("aic7xxx: (reset) target/channel %d/%d\n", cmd->target, cmd->channel);
                   4561: #endif
                   4562: 
                   4563:   switch (aic7xxx_abort_reset(cmd, DID_RESET))
                   4564:   {
                   4565:     case ABORT_RESET_PENDING:
                   4566:       return (SCSI_RESET_PENDING);
                   4567:       break;
                   4568:     case ABORT_RESET_INACTIVE:
                   4569:     case ABORT_RESET_SUCCESS:
                   4570:     default:
                   4571:       return (SCSI_RESET_SUCCESS);
                   4572:       break;
                   4573:   }
                   4574: }
                   4575: 
                   4576: /*+F*************************************************************************
                   4577:  * Function:
                   4578:  *   aic7xxx_biosparam
                   4579:  *
                   4580:  * Description:
                   4581:  *   Return the disk geometry for the given SCSI device.
                   4582:  *-F*************************************************************************/
                   4583: int
                   4584: aic7xxx_biosparam(Disk *disk, kdev_t dev, int geom[])
                   4585: {
                   4586:   int heads, sectors, cylinders;
                   4587:   struct aic7xxx_host *p;
                   4588: 
                   4589:   p = (struct aic7xxx_host *) disk->device->host->hostdata;
                   4590: 
                   4591:   /*
                   4592:    * XXX - if I could portably find the card's configuration
                   4593:    *       information, then this could be autodetected instead
                   4594:    *       of left to a boot-time switch.
                   4595:    */
                   4596:   heads = 64;
                   4597:   sectors = 32;
                   4598:   cylinders = disk->capacity / (heads * sectors);
                   4599: 
                   4600:   if (p->extended && cylinders > 1024)
                   4601:   {
                   4602:     heads = 255;
                   4603:     sectors = 63;
                   4604:     cylinders = disk->capacity / (255 * 63);
                   4605:   }
                   4606: 
                   4607:   geom[0] = heads;
                   4608:   geom[1] = sectors;
                   4609:   geom[2] = cylinders;
                   4610: 
                   4611:   return (0);
                   4612: }
                   4613: 
                   4614: #ifdef MACH
                   4615: #include "aic7xxx_proc.src"
                   4616: #else
                   4617: #include "aic7xxx_proc.c"
                   4618: #endif
                   4619: 
                   4620: #ifdef MODULE
                   4621: /* Eventually this will go into an include file, but this will be later */
                   4622: Scsi_Host_Template driver_template = AIC7XXX;
                   4623: 
                   4624: #include "scsi_module.c"
                   4625: #endif
                   4626: 
                   4627: /*
                   4628:  * Overrides for Emacs so that we almost follow Linus's tabbing style.
                   4629:  * Emacs will notice this stuff at the end of the file and automatically
                   4630:  * adjust the settings for this buffer only.  This must remain at the end
                   4631:  * of the file.
                   4632:  * ---------------------------------------------------------------------------
                   4633:  * Local variables:
                   4634:  * c-indent-level: 2
                   4635:  * c-brace-imaginary-offset: 0
                   4636:  * c-brace-offset: -2
                   4637:  * c-argdecl-indent: 2
                   4638:  * c-label-offset: -2
                   4639:  * c-continued-statement-offset: 2
                   4640:  * c-continued-brace-offset: 0
                   4641:  * indent-tabs-mode: nil
                   4642:  * tab-width: 8
                   4643:  * End:
                   4644:  */
                   4645: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.