Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / scsi / aic7xxx / aic7xxx.reg
diff --git a/kernel/drivers/scsi/aic7xxx/aic7xxx.reg b/kernel/drivers/scsi/aic7xxx/aic7xxx.reg
new file mode 100644 (file)
index 0000000..ba0b411
--- /dev/null
@@ -0,0 +1,1761 @@
+/*
+ * Aic7xxx register and scratch ram definitions.
+ *
+ * Copyright (c) 1994-2001 Justin T. Gibbs.
+ * Copyright (c) 2000-2001 Adaptec Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    substantially similar to the "NO WARRANTY" disclaimer below
+ *    ("Disclaimer") and any redistribution must be conditioned upon
+ *    including a substantially similar Disclaimer requirement for further
+ *    binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ *    of any contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * $FreeBSD$
+ */
+VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#40 $"
+
+/*
+ * This file is processed by the aic7xxx_asm utility for use in assembling
+ * firmware for the aic7xxx family of SCSI host adapters as well as to generate
+ * a C header file for use in the kernel portion of the Aic7xxx driver.
+ *
+ * All page numbers refer to the Adaptec AIC-7770 Data Book available from
+ * Adaptec's Technical Documents Department 1-800-934-2766
+ */
+
+/*
+ * Registers marked "dont_generate_debug_code" are not (yet) referenced
+ * from the driver code, and this keyword inhibit generation
+ * of debug code for them.
+ *
+ * REG_PRETTY_PRINT config will complain if dont_generate_debug_code
+ * is added to the register which is referenced in the driver.
+ * Unreferenced register with no dont_generate_debug_code will result
+ * in dead code. No warning is issued.
+ */
+
+/*
+ * SCSI Sequence Control (p. 3-11).
+ * Each bit, when set starts a specific SCSI sequence on the bus
+ */
+register SCSISEQ {
+       address                 0x000
+       access_mode RW
+       field   TEMODE          0x80
+       field   ENSELO          0x40
+       field   ENSELI          0x20
+       field   ENRSELI         0x10
+       field   ENAUTOATNO      0x08
+       field   ENAUTOATNI      0x04
+       field   ENAUTOATNP      0x02
+       field   SCSIRSTO        0x01
+}
+
+/*
+ * SCSI Transfer Control 0 Register (pp. 3-13).
+ * Controls the SCSI module data path.
+ */
+register SXFRCTL0 {
+       address                 0x001
+       access_mode RW
+       field   DFON            0x80
+       field   DFPEXP          0x40
+       field   FAST20          0x20
+       field   CLRSTCNT        0x10
+       field   SPIOEN          0x08
+       field   SCAMEN          0x04
+       field   CLRCHN          0x02
+}
+
+/*
+ * SCSI Transfer Control 1 Register (pp. 3-14,15).
+ * Controls the SCSI module data path.
+ */
+register SXFRCTL1 {
+       address                 0x002
+       access_mode RW
+       field   BITBUCKET       0x80
+       field   SWRAPEN         0x40
+       field   ENSPCHK         0x20
+       mask    STIMESEL        0x18
+       field   ENSTIMER        0x04
+       field   ACTNEGEN        0x02
+       field   STPWEN          0x01    /* Powered Termination */
+       dont_generate_debug_code
+}
+
+/*
+ * SCSI Control Signal Read Register (p. 3-15).
+ * Reads the actual state of the SCSI bus pins
+ */
+register SCSISIGI {
+       address                 0x003
+       access_mode RO
+       field   CDI             0x80
+       field   IOI             0x40
+       field   MSGI            0x20
+       field   ATNI            0x10
+       field   SELI            0x08
+       field   BSYI            0x04
+       field   REQI            0x02
+       field   ACKI            0x01
+/*
+ * Possible phases in SCSISIGI
+ */
+       mask    PHASE_MASK      CDI|IOI|MSGI
+       mask    P_DATAOUT       0x00
+       mask    P_DATAIN        IOI
+       mask    P_DATAOUT_DT    P_DATAOUT|MSGI
+       mask    P_DATAIN_DT     P_DATAIN|MSGI
+       mask    P_COMMAND       CDI
+       mask    P_MESGOUT       CDI|MSGI
+       mask    P_STATUS        CDI|IOI
+       mask    P_MESGIN        CDI|IOI|MSGI
+}
+
+/*
+ * SCSI Control Signal Write Register (p. 3-16).
+ * Writing to this register modifies the control signals on the bus.  Only
+ * those signals that are allowed in the current mode (Initiator/Target) are
+ * asserted.
+ */
+register SCSISIGO {
+       address                 0x003
+       access_mode WO
+       field   CDO             0x80
+       field   IOO             0x40
+       field   MSGO            0x20
+       field   ATNO            0x10
+       field   SELO            0x08
+       field   BSYO            0x04
+       field   REQO            0x02
+       field   ACKO            0x01
+/*
+ * Possible phases to write into SCSISIG0
+ */
+       mask    PHASE_MASK      CDI|IOI|MSGI
+       mask    P_DATAOUT       0x00
+       mask    P_DATAIN        IOI
+       mask    P_COMMAND       CDI
+       mask    P_MESGOUT       CDI|MSGI
+       mask    P_STATUS        CDI|IOI
+       mask    P_MESGIN        CDI|IOI|MSGI
+       dont_generate_debug_code
+}
+
+/* 
+ * SCSI Rate Control (p. 3-17).
+ * Contents of this register determine the Synchronous SCSI data transfer
+ * rate and the maximum synchronous Req/Ack offset.  An offset of 0 in the
+ * SOFS (3:0) bits disables synchronous data transfers.  Any offset value
+ * greater than 0 enables synchronous transfers.
+ */
+register SCSIRATE {
+       address                 0x004
+       access_mode RW
+       field   WIDEXFER        0x80            /* Wide transfer control */
+       field   ENABLE_CRC      0x40            /* CRC for D-Phases */
+       field   SINGLE_EDGE     0x10            /* Disable DT Transfers */
+       mask    SXFR            0x70            /* Sync transfer rate */
+       mask    SXFR_ULTRA2     0x0f            /* Sync transfer rate */
+       mask    SOFS            0x0f            /* Sync offset */
+}
+
+/*
+ * SCSI ID (p. 3-18).
+ * Contains the ID of the board and the current target on the
+ * selected channel.
+ */
+register SCSIID        {
+       address                 0x005
+       access_mode RW
+       mask    TID             0xf0            /* Target ID mask */
+       mask    TWIN_TID        0x70
+       field   TWIN_CHNLB      0x80
+       mask    OID             0x0f            /* Our ID mask */
+       /*
+        * SCSI Maximum Offset (p. 4-61 aic7890/91 Data Book)
+        * The aic7890/91 allow an offset of up to 127 transfers in both wide
+        * and narrow mode.
+        */
+       alias   SCSIOFFSET
+       mask    SOFS_ULTRA2     0x7f            /* Sync offset U2 chips */
+       dont_generate_debug_code
+}
+
+/*
+ * SCSI Latched Data (p. 3-19).
+ * Read/Write latches used to transfer data on the SCSI bus during
+ * Automatic or Manual PIO mode.  SCSIDATH can be used for the
+ * upper byte of a 16bit wide asynchronouse data phase transfer.
+ */
+register SCSIDATL {
+       address                 0x006
+       access_mode RW
+       dont_generate_debug_code
+}
+
+register SCSIDATH {
+       address                 0x007
+       access_mode RW
+}
+
+/*
+ * SCSI Transfer Count (pp. 3-19,20)
+ * These registers count down the number of bytes transferred
+ * across the SCSI bus.  The counter is decremented only once
+ * the data has been safely transferred.  SDONE in SSTAT0 is
+ * set when STCNT goes to 0
+ */ 
+register STCNT {
+       address                 0x008
+       size    3
+       access_mode RW
+       dont_generate_debug_code
+}
+
+/* ALT_MODE registers (Ultra2 and Ultra160 chips) */
+register SXFRCTL2 {
+       address                 0x013
+       access_mode RW
+       field   AUTORSTDIS      0x10
+       field   CMDDMAEN        0x08
+       mask    ASYNC_SETUP     0x07
+}
+
+/* ALT_MODE register on Ultra160 chips */
+register OPTIONMODE {
+       address                 0x008
+       access_mode RW
+       count           2
+       field   AUTORATEEN              0x80
+       field   AUTOACKEN               0x40
+       field   ATNMGMNTEN              0x20
+       field   BUSFREEREV              0x10
+       field   EXPPHASEDIS             0x08
+       field   SCSIDATL_IMGEN          0x04
+       field   AUTO_MSGOUT_DE          0x02
+       field   DIS_MSGIN_DUALEDGE      0x01
+       mask    OPTIONMODE_DEFAULTS     AUTO_MSGOUT_DE|DIS_MSGIN_DUALEDGE
+       dont_generate_debug_code
+}
+
+/* ALT_MODE register on Ultra160 chips */
+register TARGCRCCNT {
+       address                 0x00a
+       size    2
+       access_mode RW
+       count           2
+       dont_generate_debug_code
+}
+
+/*
+ * Clear SCSI Interrupt 0 (p. 3-20)
+ * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT0.
+ */
+register CLRSINT0 {
+       address                 0x00b
+       access_mode WO
+       field   CLRSELDO        0x40
+       field   CLRSELDI        0x20
+       field   CLRSELINGO      0x10
+       field   CLRSWRAP        0x08
+       field   CLRIOERR        0x08    /* Ultra2 Only */
+       field   CLRSPIORDY      0x02
+       dont_generate_debug_code
+}
+
+/*
+ * SCSI Status 0 (p. 3-21)
+ * Contains one set of SCSI Interrupt codes
+ * These are most likely of interest to the sequencer
+ */
+register SSTAT0        {
+       address                 0x00b
+       access_mode RO
+       field   TARGET          0x80    /* Board acting as target */
+       field   SELDO           0x40    /* Selection Done */
+       field   SELDI           0x20    /* Board has been selected */
+       field   SELINGO         0x10    /* Selection In Progress */
+       field   SWRAP           0x08    /* 24bit counter wrap */
+       field   IOERR           0x08    /* LVD Tranceiver mode changed */
+       field   SDONE           0x04    /* STCNT = 0x000000 */
+       field   SPIORDY         0x02    /* SCSI PIO Ready */
+       field   DMADONE         0x01    /* DMA transfer completed */
+}
+
+/*
+ * Clear SCSI Interrupt 1 (p. 3-23)
+ * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT1.
+ */
+register CLRSINT1 {
+       address                 0x00c
+       access_mode WO
+       field   CLRSELTIMEO     0x80
+       field   CLRATNO         0x40
+       field   CLRSCSIRSTI     0x20
+       field   CLRBUSFREE      0x08
+       field   CLRSCSIPERR     0x04
+       field   CLRPHASECHG     0x02
+       field   CLRREQINIT      0x01
+       dont_generate_debug_code
+}
+
+/*
+ * SCSI Status 1 (p. 3-24)
+ */
+register SSTAT1        {
+       address                 0x00c
+       access_mode RO
+       field   SELTO           0x80
+       field   ATNTARG         0x40
+       field   SCSIRSTI        0x20
+       field   PHASEMIS        0x10
+       field   BUSFREE         0x08
+       field   SCSIPERR        0x04
+       field   PHASECHG        0x02
+       field   REQINIT         0x01
+}
+
+/*
+ * SCSI Status 2 (pp. 3-25,26)
+ */
+register SSTAT2 {
+       address                 0x00d
+       access_mode RO
+       field   OVERRUN         0x80
+       field   SHVALID         0x40    /* Shadow Layer non-zero */
+       field   EXP_ACTIVE      0x10    /* SCSI Expander Active */
+       field   CRCVALERR       0x08    /* CRC doesn't match (U3 only) */
+       field   CRCENDERR       0x04    /* No terminal CRC packet (U3 only) */
+       field   CRCREQERR       0x02    /* Illegal CRC packet req (U3 only) */
+       field   DUAL_EDGE_ERR   0x01    /* Incorrect data phase (U3 only) */
+       mask    SFCNT           0x1f
+}
+
+/*
+ * SCSI Status 3 (p. 3-26)
+ */
+register SSTAT3 {
+       address                 0x00e
+       access_mode RO
+       count           2
+       mask    SCSICNT         0xf0
+       mask    OFFCNT          0x0f
+       mask    U2OFFCNT        0x7f
+}
+
+/*
+ * SCSI ID for the aic7890/91 chips
+ */
+register SCSIID_ULTRA2 {
+       address                 0x00f
+       access_mode RW
+       mask    TID             0xf0            /* Target ID mask */
+       mask    OID             0x0f            /* Our ID mask */
+       dont_generate_debug_code
+}
+
+/*
+ * SCSI Interrupt Mode 1 (p. 3-28)
+ * Setting any bit will enable the corresponding function
+ * in SIMODE0 to interrupt via the IRQ pin.
+ */
+register SIMODE0 {
+       address                 0x010
+       access_mode RW
+       count           2
+       field   ENSELDO         0x40
+       field   ENSELDI         0x20
+       field   ENSELINGO       0x10
+       field   ENSWRAP         0x08
+       field   ENIOERR         0x08    /* LVD Tranceiver mode changes */
+       field   ENSDONE         0x04
+       field   ENSPIORDY       0x02
+       field   ENDMADONE       0x01
+}
+
+/*
+ * SCSI Interrupt Mode 1 (pp. 3-28,29)
+ * Setting any bit will enable the corresponding function
+ * in SIMODE1 to interrupt via the IRQ pin.
+ */
+register SIMODE1 {
+       address                 0x011
+       access_mode RW
+       field   ENSELTIMO       0x80
+       field   ENATNTARG       0x40
+       field   ENSCSIRST       0x20
+       field   ENPHASEMIS      0x10
+       field   ENBUSFREE       0x08
+       field   ENSCSIPERR      0x04
+       field   ENPHASECHG      0x02
+       field   ENREQINIT       0x01
+}
+
+/*
+ * SCSI Data Bus (High) (p. 3-29)
+ * This register reads data on the SCSI Data bus directly.
+ */
+register SCSIBUSL {
+       address                 0x012
+       access_mode RW
+}
+
+register SCSIBUSH {
+       address                 0x013
+       access_mode RW
+}
+
+/*
+ * SCSI/Host Address (p. 3-30)
+ * These registers hold the host address for the byte about to be
+ * transferred on the SCSI bus.  They are counted up in the same
+ * manner as STCNT is counted down.  SHADDR should always be used
+ * to determine the address of the last byte transferred since HADDR
+ * can be skewed by write ahead.
+ */
+register SHADDR {
+       address                 0x014
+       size    4
+       access_mode RO
+       dont_generate_debug_code
+}
+
+/*
+ * Selection Timeout Timer (p. 3-30)
+ */
+register SELTIMER {
+       address                 0x018
+       access_mode RW
+       count           1
+       field   STAGE6          0x20
+       field   STAGE5          0x10
+       field   STAGE4          0x08
+       field   STAGE3          0x04
+       field   STAGE2          0x02
+       field   STAGE1          0x01
+       alias   TARGIDIN
+       dont_generate_debug_code
+}
+
+/*
+ * Selection/Reselection ID (p. 3-31)
+ * Upper four bits are the device id.  The ONEBIT is set when the re/selecting
+ * device did not set its own ID.
+ */
+register SELID {
+       address                 0x019
+       access_mode RW
+       mask    SELID_MASK      0xf0
+       field   ONEBIT          0x08
+       dont_generate_debug_code
+}
+
+register SCAMCTL {
+       address                 0x01a
+       access_mode RW
+       field   ENSCAMSELO      0x80
+       field   CLRSCAMSELID    0x40
+       field   ALTSTIM         0x20
+       field   DFLTTID         0x10
+       mask    SCAMLVL         0x03
+}
+
+/*
+ * Target Mode Selecting in ID bitmask (aic7890/91/96/97)
+ */
+register TARGID {
+       address                 0x01b
+       size                    2
+       access_mode RW
+       count           14
+       dont_generate_debug_code
+}
+
+/*
+ * Serial Port I/O Cabability register (p. 4-95 aic7860 Data Book)
+ * Indicates if external logic has been attached to the chip to
+ * perform the tasks of accessing a serial eeprom, testing termination
+ * strength, and performing cable detection.  On the aic7860, most of
+ * these features are handled on chip, but on the aic7855 an attached
+ * aic3800 does the grunt work.
+ */
+register SPIOCAP {
+       address                 0x01b
+       access_mode RW
+       count           10
+       field   SOFT1           0x80
+       field   SOFT0           0x40
+       field   SOFTCMDEN       0x20    
+       field   EXT_BRDCTL      0x10    /* External Board control */
+       field   SEEPROM         0x08    /* External serial eeprom logic */
+       field   EEPROM          0x04    /* Writable external BIOS ROM */
+       field   ROM             0x02    /* Logic for accessing external ROM */
+       field   SSPIOCPS        0x01    /* Termination and cable detection */
+       dont_generate_debug_code
+}
+
+register BRDCTL        {
+       address                 0x01d
+       count           11
+       field   BRDDAT7         0x80
+       field   BRDDAT6         0x40
+       field   BRDDAT5         0x20
+       field   BRDSTB          0x10
+       field   BRDCS           0x08
+       field   BRDRW           0x04
+       field   BRDCTL1         0x02
+       field   BRDCTL0         0x01
+       /* 7890 Definitions */
+       field   BRDDAT4         0x10
+       field   BRDDAT3         0x08
+       field   BRDDAT2         0x04
+       field   BRDRW_ULTRA2    0x02
+       field   BRDSTB_ULTRA2   0x01
+       dont_generate_debug_code
+}
+
+/*
+ * Serial EEPROM Control (p. 4-92 in 7870 Databook)
+ * Controls the reading and writing of an external serial 1-bit
+ * EEPROM Device.  In order to access the serial EEPROM, you must
+ * first set the SEEMS bit that generates a request to the memory
+ * port for access to the serial EEPROM device.  When the memory
+ * port is not busy servicing another request, it reconfigures
+ * to allow access to the serial EEPROM.  When this happens, SEERDY
+ * gets set high to verify that the memory port access has been
+ * granted.  
+ *
+ * After successful arbitration for the memory port, the SEECS bit of 
+ * the SEECTL register is connected to the chip select.  The SEECK, 
+ * SEEDO, and SEEDI are connected to the clock, data out, and data in 
+ * lines respectively.  The SEERDY bit of SEECTL is useful in that it 
+ * gives us an 800 nsec timer.  After a write to the SEECTL register, 
+ * the SEERDY goes high 800 nsec later.  The one exception to this is 
+ * when we first request access to the memory port.  The SEERDY goes 
+ * high to signify that access has been granted and, for this case, has 
+ * no implied timing.
+ *
+ * See 93cx6.c for detailed information on the protocol necessary to 
+ * read the serial EEPROM.
+ */
+register SEECTL {
+       address                 0x01e
+       count           11
+       field   EXTARBACK       0x80
+       field   EXTARBREQ       0x40
+       field   SEEMS           0x20
+       field   SEERDY          0x10
+       field   SEECS           0x08
+       field   SEECK           0x04
+       field   SEEDO           0x02
+       field   SEEDI           0x01
+       dont_generate_debug_code
+}
+/*
+ * SCSI Block Control (p. 3-32)
+ * Controls Bus type and channel selection.  In a twin channel configuration
+ * addresses 0x00-0x1e are gated to the appropriate channel based on this
+ * register.  SELWIDE allows for the coexistence of 8bit and 16bit devices
+ * on a wide bus.
+ */
+register SBLKCTL {
+       address                 0x01f
+       access_mode RW
+       field   DIAGLEDEN       0x80    /* Aic78X0 only */
+       field   DIAGLEDON       0x40    /* Aic78X0 only */
+       field   AUTOFLUSHDIS    0x20
+       field   SELBUSB         0x08
+       field   ENAB40          0x08    /* LVD transceiver active */
+       field   ENAB20          0x04    /* SE/HVD transceiver active */
+       field   SELWIDE         0x02
+       field   XCVR            0x01    /* External transceiver active */
+}
+
+/*
+ * Sequencer Control (p. 3-33)
+ * Error detection mode and speed configuration
+ */
+register SEQCTL {
+       address                 0x060
+       access_mode RW
+       count           15
+       field   PERRORDIS       0x80
+       field   PAUSEDIS        0x40
+       field   FAILDIS         0x20
+       field   FASTMODE        0x10
+       field   BRKADRINTEN     0x08
+       field   STEP            0x04
+       field   SEQRESET        0x02
+       field   LOADRAM         0x01
+}
+
+/*
+ * Sequencer RAM Data (p. 3-34)
+ * Single byte window into the Scratch Ram area starting at the address
+ * specified by SEQADDR0 and SEQADDR1.  To write a full word, simply write
+ * four bytes in succession.  The SEQADDRs will increment after the most
+ * significant byte is written
+ */
+register SEQRAM {
+       address                 0x061
+       access_mode RW
+       count           2
+       dont_generate_debug_code
+}
+
+/*
+ * Sequencer Address Registers (p. 3-35)
+ * Only the first bit of SEQADDR1 holds addressing information
+ */
+register SEQADDR0 {
+       address                 0x062
+       access_mode RW
+       dont_generate_debug_code
+}
+
+register SEQADDR1 {
+       address                 0x063
+       access_mode RW
+       count           8
+       mask    SEQADDR1_MASK   0x01
+       dont_generate_debug_code
+}
+
+/*
+ * Accumulator
+ * We cheat by passing arguments in the Accumulator up to the kernel driver
+ */
+register ACCUM {
+       address                 0x064
+       access_mode RW
+       accumulator
+       dont_generate_debug_code
+}
+
+register SINDEX        {
+       address                 0x065
+       access_mode RW
+       sindex
+       dont_generate_debug_code
+}
+
+register DINDEX {
+       address                 0x066
+       access_mode RW
+       dont_generate_debug_code
+}
+
+register ALLONES {
+       address                 0x069
+       access_mode RO
+       allones
+       dont_generate_debug_code
+}
+
+register ALLZEROS {
+       address                 0x06a
+       access_mode RO
+       allzeros
+       dont_generate_debug_code
+}
+
+register NONE {
+       address                 0x06a
+       access_mode WO
+       none
+       dont_generate_debug_code
+}
+
+register FLAGS {
+       address                 0x06b
+       access_mode RO
+       count           18
+       field   ZERO            0x02
+       field   CARRY           0x01
+       dont_generate_debug_code
+}
+
+register SINDIR        {
+       address                 0x06c
+       access_mode RO
+       dont_generate_debug_code
+}
+
+register DINDIR         {
+       address                 0x06d
+       access_mode WO
+       dont_generate_debug_code
+}
+
+register FUNCTION1 {
+       address                 0x06e
+       access_mode RW
+}
+
+register STACK {
+       address                 0x06f
+       access_mode RO
+       count           5
+       dont_generate_debug_code
+}
+
+const  STACK_SIZE      4
+
+/*
+ * Board Control (p. 3-43)
+ */
+register BCTL {
+       address                 0x084
+       access_mode RW
+       field   ACE             0x08
+       field   ENABLE          0x01
+}
+
+/*
+ * On the aic78X0 chips, Board Control is replaced by the DSCommand
+ * register (p. 4-64)
+ */
+register DSCOMMAND0 {
+       address                 0x084
+       access_mode RW
+       count           7
+       field   CACHETHEN       0x80    /* Cache Threshold enable */
+       field   DPARCKEN        0x40    /* Data Parity Check Enable */
+       field   MPARCKEN        0x20    /* Memory Parity Check Enable */
+       field   EXTREQLCK       0x10    /* External Request Lock */
+       /* aic7890/91/96/97 only */
+       field   INTSCBRAMSEL    0x08    /* Internal SCB RAM Select */
+       field   RAMPS           0x04    /* External SCB RAM Present */
+       field   USCBSIZE32      0x02    /* Use 32byte SCB Page Size */
+       field   CIOPARCKEN      0x01    /* Internal bus parity error enable */
+       dont_generate_debug_code
+}
+
+register DSCOMMAND1 {
+       address                 0x085
+       access_mode RW
+       mask    DSLATT          0xfc    /* PCI latency timer (non-ultra2) */
+       field   HADDLDSEL1      0x02    /* Host Address Load Select Bits */
+       field   HADDLDSEL0      0x01
+       dont_generate_debug_code
+}
+
+/*
+ * Bus On/Off Time (p. 3-44) aic7770 only
+ */
+register BUSTIME {
+       address                 0x085
+       access_mode RW
+       count           2
+       mask    BOFF            0xf0
+       mask    BON             0x0f
+       dont_generate_debug_code
+}
+
+/*
+ * Bus Speed (p. 3-45) aic7770 only
+ */
+register BUSSPD {
+       address                 0x086
+       access_mode RW
+       count           2
+       mask    DFTHRSH         0xc0
+       mask    STBOFF          0x38
+       mask    STBON           0x07
+       mask    DFTHRSH_100     0xc0
+       mask    DFTHRSH_75      0x80
+       dont_generate_debug_code
+}
+
+/* aic7850/55/60/70/80/95 only */
+register DSPCISTATUS {
+       address                 0x086
+       count           4
+       mask    DFTHRSH_100     0xc0
+       dont_generate_debug_code
+}
+
+/* aic7890/91/96/97 only */
+register HS_MAILBOX {
+       address                 0x086
+       mask    HOST_MAILBOX    0xF0
+       mask    SEQ_MAILBOX     0x0F
+       mask    HOST_TQINPOS    0x80    /* Boundary at either 0 or 128 */
+       dont_generate_debug_code
+}
+
+const  HOST_MAILBOX_SHIFT      4
+const  SEQ_MAILBOX_SHIFT       0
+
+/*
+ * Host Control (p. 3-47) R/W
+ * Overall host control of the device.
+ */
+register HCNTRL {
+       address                 0x087
+       access_mode RW
+       count           14
+       field   POWRDN          0x40
+       field   SWINT           0x10
+       field   IRQMS           0x08
+       field   PAUSE           0x04
+       field   INTEN           0x02
+       field   CHIPRST         0x01
+       field   CHIPRSTACK      0x01
+       dont_generate_debug_code
+}
+
+/*
+ * Host Address (p. 3-48)
+ * This register contains the address of the byte about
+ * to be transferred across the host bus.
+ */
+register HADDR {
+       address                 0x088
+       size    4
+       access_mode RW
+       dont_generate_debug_code
+}
+
+register HCNT {
+       address                 0x08c
+       size    3
+       access_mode RW
+       dont_generate_debug_code
+}
+
+/*
+ * SCB Pointer (p. 3-49)
+ * Gate one of the SCBs into the SCBARRAY window.
+ */
+register SCBPTR {
+       address                 0x090
+       access_mode RW
+       dont_generate_debug_code
+}
+
+/*
+ * Interrupt Status (p. 3-50)
+ * Status for system interrupts
+ */
+register INTSTAT {
+       address                 0x091
+       access_mode RW
+       field   BRKADRINT 0x08
+       field   SCSIINT   0x04
+       field   CMDCMPLT  0x02
+       field   SEQINT    0x01
+       mask    BAD_PHASE       SEQINT          /* unknown scsi bus phase */
+       mask    SEND_REJECT     0x10|SEQINT     /* sending a message reject */
+       mask    PROTO_VIOLATION 0x20|SEQINT     /* SCSI protocol violation */ 
+       mask    NO_MATCH        0x30|SEQINT     /* no cmd match for reconnect */
+       mask    IGN_WIDE_RES    0x40|SEQINT     /* Complex IGN Wide Res Msg */
+       mask    PDATA_REINIT    0x50|SEQINT     /*
+                                                * Returned to data phase
+                                                * that requires data
+                                                * transfer pointers to be
+                                                * recalculated from the
+                                                * transfer residual.
+                                                */
+       mask    HOST_MSG_LOOP   0x60|SEQINT     /*
+                                                * The bus is ready for the
+                                                * host to perform another
+                                                * message transaction.  This
+                                                * mechanism is used for things
+                                                * like sync/wide negotiation
+                                                * that require a kernel based
+                                                * message state engine.
+                                                */
+       mask    BAD_STATUS      0x70|SEQINT     /* Bad status from target */
+       mask    PERR_DETECTED   0x80|SEQINT     /*
+                                                * Either the phase_lock
+                                                * or inb_next routine has
+                                                * noticed a parity error.
+                                                */
+       mask    DATA_OVERRUN    0x90|SEQINT     /*
+                                                * Target attempted to write
+                                                * beyond the bounds of its
+                                                * command.
+                                                */
+       mask    MKMSG_FAILED    0xa0|SEQINT     /*
+                                                * Target completed command
+                                                * without honoring our ATN
+                                                * request to issue a message. 
+                                                */
+       mask    MISSED_BUSFREE  0xb0|SEQINT     /*
+                                                * The sequencer never saw
+                                                * the bus go free after
+                                                * either a command complete
+                                                * or disconnect message.
+                                                */
+       mask    SCB_MISMATCH    0xc0|SEQINT     /*
+                                                * Downloaded SCB's tag does
+                                                * not match the entry we
+                                                * intended to download.
+                                                */
+       mask    NO_FREE_SCB     0xd0|SEQINT     /*
+                                                * get_free_or_disc_scb failed.
+                                                */
+       mask    OUT_OF_RANGE    0xe0|SEQINT
+
+       mask    SEQINT_MASK     0xf0|SEQINT     /* SEQINT Status Codes */
+       mask    INT_PEND  (BRKADRINT|SEQINT|SCSIINT|CMDCMPLT)
+       dont_generate_debug_code
+}
+
+/*
+ * Hard Error (p. 3-53)
+ * Reporting of catastrophic errors.  You usually cannot recover from
+ * these without a full board reset.
+ */
+register ERROR {
+       address                 0x092
+       access_mode RO
+       count           26
+       field   CIOPARERR       0x80    /* Ultra2 only */
+       field   PCIERRSTAT      0x40    /* PCI only */
+       field   MPARERR         0x20    /* PCI only */
+       field   DPARERR         0x10    /* PCI only */
+       field   SQPARERR        0x08
+       field   ILLOPCODE       0x04
+       field   ILLSADDR        0x02
+       field   ILLHADDR        0x01
+}
+
+/*
+ * Clear Interrupt Status (p. 3-52)
+ */
+register CLRINT {
+       address                 0x092
+       access_mode WO
+       count           24
+       field   CLRPARERR       0x10    /* PCI only */
+       field   CLRBRKADRINT    0x08
+       field   CLRSCSIINT      0x04
+       field   CLRCMDINT       0x02
+       field   CLRSEQINT       0x01
+       dont_generate_debug_code
+}
+
+register DFCNTRL {
+       address                 0x093
+       access_mode RW
+       field   PRELOADEN       0x80    /* aic7890 only */
+       field   WIDEODD         0x40
+       field   SCSIEN          0x20
+       field   SDMAEN          0x10
+       field   SDMAENACK       0x10
+       field   HDMAEN          0x08
+       field   HDMAENACK       0x08
+       field   DIRECTION       0x04
+       field   FIFOFLUSH       0x02
+       field   FIFORESET       0x01
+}
+
+register DFSTATUS {
+       address                 0x094
+       access_mode RO
+       field   PRELOAD_AVAIL   0x80
+       field   DFCACHETH       0x40
+       field   FIFOQWDEMP      0x20
+       field   MREQPEND        0x10
+       field   HDONE           0x08
+       field   DFTHRESH        0x04
+       field   FIFOFULL        0x02
+       field   FIFOEMP         0x01
+}
+
+register DFWADDR {
+       address                 0x95
+       access_mode RW
+       dont_generate_debug_code
+}
+
+register DFRADDR {
+       address                 0x97
+       access_mode RW
+}
+
+register DFDAT {
+       address                 0x099
+       access_mode RW
+       dont_generate_debug_code
+}
+
+/*
+ * SCB Auto Increment (p. 3-59)
+ * Byte offset into the SCB Array and an optional bit to allow auto
+ * incrementing of the address during download and upload operations
+ */
+register SCBCNT {
+       address                 0x09a
+       access_mode RW
+       count           1
+       field   SCBAUTO         0x80
+       mask    SCBCNT_MASK     0x1f
+       dont_generate_debug_code
+}
+
+/*
+ * Queue In FIFO (p. 3-60)
+ * Input queue for queued SCBs (commands that the seqencer has yet to start)
+ */
+register QINFIFO {
+       address                 0x09b
+       access_mode RW
+       count           12
+       dont_generate_debug_code
+}
+
+/*
+ * Queue In Count (p. 3-60)
+ * Number of queued SCBs
+ */
+register QINCNT        {
+       address                 0x09c
+       access_mode RO
+}
+
+/*
+ * Queue Out FIFO (p. 3-61)
+ * Queue of SCBs that have completed and await the host
+ */
+register QOUTFIFO {
+       address                 0x09d
+       access_mode WO
+       count           7
+       dont_generate_debug_code
+}
+
+register CRCCONTROL1 {
+       address                 0x09d
+       access_mode RW
+       count           3
+       field   CRCONSEEN               0x80
+       field   CRCVALCHKEN             0x40
+       field   CRCENDCHKEN             0x20
+       field   CRCREQCHKEN             0x10
+       field   TARGCRCENDEN            0x08
+       field   TARGCRCCNTEN            0x04
+       dont_generate_debug_code
+}
+
+
+/*
+ * Queue Out Count (p. 3-61)
+ * Number of queued SCBs in the Out FIFO
+ */
+register QOUTCNT {
+       address                 0x09e
+       access_mode RO
+}
+
+register SCSIPHASE {
+       address                 0x09e
+       access_mode RO
+       field   STATUS_PHASE    0x20
+       field   COMMAND_PHASE   0x10
+       field   MSG_IN_PHASE    0x08
+       field   MSG_OUT_PHASE   0x04
+       field   DATA_IN_PHASE   0x02
+       field   DATA_OUT_PHASE  0x01
+       mask    DATA_PHASE_MASK 0x03
+}
+
+/*
+ * Special Function
+ */
+register SFUNCT {
+       address                 0x09f
+       access_mode RW
+       count       4
+       field   ALT_MODE        0x80
+       dont_generate_debug_code
+}
+
+/*
+ * SCB Definition (p. 5-4)
+ */
+scb {
+       address         0x0a0
+       size            64
+
+       SCB_CDB_PTR {
+               size    4
+               alias   SCB_RESIDUAL_DATACNT
+               alias   SCB_CDB_STORE
+               dont_generate_debug_code
+       }
+       SCB_RESIDUAL_SGPTR {
+               size    4
+               dont_generate_debug_code
+       }
+       SCB_SCSI_STATUS {
+               size    1
+               dont_generate_debug_code
+       }
+       SCB_TARGET_PHASES {
+               size    1
+               dont_generate_debug_code
+       }
+       SCB_TARGET_DATA_DIR {
+               size    1
+               dont_generate_debug_code
+       }
+       SCB_TARGET_ITAG {
+               size    1
+               dont_generate_debug_code
+       }
+       SCB_DATAPTR {
+               size    4
+               dont_generate_debug_code
+       }
+       SCB_DATACNT {
+               /*
+                * The last byte is really the high address bits for
+                * the data address.
+                */
+               size    4
+               field   SG_LAST_SEG             0x80    /* In the fourth byte */
+               mask    SG_HIGH_ADDR_BITS       0x7F    /* In the fourth byte */
+               dont_generate_debug_code
+       }
+       SCB_SGPTR {
+               size    4
+               field   SG_RESID_VALID  0x04    /* In the first byte */
+               field   SG_FULL_RESID   0x02    /* In the first byte */
+               field   SG_LIST_NULL    0x01    /* In the first byte */
+               dont_generate_debug_code
+       }
+       SCB_CONTROL {
+               size    1
+               field   TARGET_SCB                      0x80
+               field   STATUS_RCVD                     0x80
+               field   DISCENB                         0x40
+               field   TAG_ENB                         0x20
+               field   MK_MESSAGE                      0x10
+               field   ULTRAENB                        0x08
+               field   DISCONNECTED                    0x04
+               mask    SCB_TAG_TYPE                    0x03
+       }
+       SCB_SCSIID {
+               size    1
+               field   TWIN_CHNLB                      0x80
+               mask    TWIN_TID                        0x70
+               mask    TID                             0xf0
+               mask    OID                             0x0f
+       }
+       SCB_LUN {
+               field   SCB_XFERLEN_ODD                 0x80
+               mask    LID                             0x3f
+               size    1
+       }
+       SCB_TAG {
+               size    1
+       }
+       SCB_CDB_LEN {
+               size    1
+               dont_generate_debug_code
+       }
+       SCB_SCSIRATE {
+               size    1
+               dont_generate_debug_code
+       }
+       SCB_SCSIOFFSET {
+               size    1
+               count   1
+               dont_generate_debug_code
+       }
+       SCB_NEXT {
+               size    1
+               dont_generate_debug_code
+       }
+       SCB_64_SPARE {
+               size    16
+       }
+       SCB_64_BTT {
+               size    16
+               dont_generate_debug_code
+       }
+}
+
+const  SCB_UPLOAD_SIZE         32
+const  SCB_DOWNLOAD_SIZE       32
+const  SCB_DOWNLOAD_SIZE_64    48
+
+const  SG_SIZEOF       0x08            /* sizeof(struct ahc_dma) */
+
+/* --------------------- AHA-2840-only definitions -------------------- */
+
+register SEECTL_2840 {
+       address                 0x0c0
+       access_mode RW
+       count           2
+       field   CS_2840         0x04
+       field   CK_2840         0x02
+       field   DO_2840         0x01
+       dont_generate_debug_code
+}
+
+register STATUS_2840 {
+       address                 0x0c1
+       access_mode RW
+       count           4
+       field   EEPROM_TF       0x80
+       mask    BIOS_SEL        0x60
+       mask    ADSEL           0x1e
+       field   DI_2840         0x01
+       dont_generate_debug_code
+}
+
+/* --------------------- AIC-7870-only definitions -------------------- */
+
+register CCHADDR {
+       address                 0x0E0
+       size 8
+       dont_generate_debug_code
+}
+
+register CCHCNT {
+       address                 0x0E8
+       dont_generate_debug_code
+}
+
+register CCSGRAM {
+       address                 0x0E9
+       dont_generate_debug_code
+}
+
+register CCSGADDR {
+       address                 0x0EA
+       dont_generate_debug_code
+}
+
+register CCSGCTL {
+       address                 0x0EB
+       field   CCSGDONE        0x80
+       field   CCSGEN          0x08
+       field   SG_FETCH_NEEDED 0x02    /* Bit used for software state */
+       field   CCSGRESET       0x01
+       dont_generate_debug_code
+}
+
+register CCSCBCNT {
+       address                 0xEF
+       count           1
+       dont_generate_debug_code
+}
+
+register CCSCBCTL {
+       address                 0x0EE
+       field   CCSCBDONE       0x80
+       field   ARRDONE         0x40    /* SCB Array prefetch done */
+       field   CCARREN         0x10
+       field   CCSCBEN         0x08
+       field   CCSCBDIR        0x04
+       field   CCSCBRESET      0x01
+       dont_generate_debug_code
+}
+
+register CCSCBADDR {
+       address                 0x0ED
+       dont_generate_debug_code
+}
+
+register CCSCBRAM {
+       address                 0xEC
+       dont_generate_debug_code
+}
+
+/*
+ * SCB bank address (7895/7896/97 only)
+ */
+register SCBBADDR {
+       address                 0x0F0
+       access_mode RW
+       count           3
+       dont_generate_debug_code
+}
+
+register CCSCBPTR {
+       address                 0x0F1
+       dont_generate_debug_code
+}
+
+register HNSCB_QOFF {
+       address                 0x0F4
+       count           4
+       dont_generate_debug_code
+}
+
+register SNSCB_QOFF {
+       address                 0x0F6
+       dont_generate_debug_code
+}
+
+register SDSCB_QOFF {
+       address                 0x0F8
+       dont_generate_debug_code
+}
+
+register QOFF_CTLSTA {
+       address                 0x0FA
+       field   SCB_AVAIL       0x40
+       field   SNSCB_ROLLOVER  0x20
+       field   SDSCB_ROLLOVER  0x10
+       mask    SCB_QSIZE       0x07
+       mask    SCB_QSIZE_256   0x06
+       dont_generate_debug_code
+}
+
+register DFF_THRSH {
+       address                 0x0FB
+       mask    WR_DFTHRSH      0x70
+       mask    RD_DFTHRSH      0x07
+       mask    RD_DFTHRSH_MIN  0x00
+       mask    RD_DFTHRSH_25   0x01
+       mask    RD_DFTHRSH_50   0x02
+       mask    RD_DFTHRSH_63   0x03
+       mask    RD_DFTHRSH_75   0x04
+       mask    RD_DFTHRSH_85   0x05
+       mask    RD_DFTHRSH_90   0x06
+       mask    RD_DFTHRSH_MAX  0x07
+       mask    WR_DFTHRSH_MIN  0x00
+       mask    WR_DFTHRSH_25   0x10
+       mask    WR_DFTHRSH_50   0x20
+       mask    WR_DFTHRSH_63   0x30
+       mask    WR_DFTHRSH_75   0x40
+       mask    WR_DFTHRSH_85   0x50
+       mask    WR_DFTHRSH_90   0x60
+       mask    WR_DFTHRSH_MAX  0x70
+       count   4
+       dont_generate_debug_code
+}
+
+register SG_CACHE_PRE {
+       access_mode WO
+       address                 0x0fc
+       mask    SG_ADDR_MASK    0xf8
+       field   LAST_SEG        0x02
+       field   LAST_SEG_DONE   0x01
+       dont_generate_debug_code
+}
+
+register SG_CACHE_SHADOW {
+       access_mode RO
+       address                 0x0fc
+       mask    SG_ADDR_MASK    0xf8
+       field   LAST_SEG        0x02
+       field   LAST_SEG_DONE   0x01
+       dont_generate_debug_code
+}
+/* ---------------------- Scratch RAM Offsets ------------------------- */
+/* These offsets are either to values that are initialized by the board's
+ * BIOS or are specified by the sequencer code.
+ *
+ * The host adapter card (at least the BIOS) uses 20-2f for SCSI
+ * device information, 32-33 and 5a-5f as well. As it turns out, the
+ * BIOS trashes 20-2f, writing the synchronous negotiation results
+ * on top of the BIOS values, so we re-use those for our per-target
+ * scratchspace (actually a value that can be copied directly into
+ * SCSIRATE).  The kernel driver will enable synchronous negotiation
+ * for all targets that have a value other than 0 in the lower four
+ * bits of the target scratch space.  This should work regardless of
+ * whether the bios has been installed.
+ */
+
+scratch_ram {
+       address         0x020
+       size            58
+
+       /*
+        * 1 byte per target starting at this address for configuration values
+        */
+       BUSY_TARGETS {
+               alias           TARG_SCSIRATE
+               size            16
+               dont_generate_debug_code
+       }
+       /*
+        * Bit vector of targets that have ULTRA enabled as set by
+        * the BIOS.  The Sequencer relies on a per-SCB field to
+        * control whether to enable Ultra transfers or not.  During
+        * initialization, we read this field and reuse it for 2
+        * entries in the busy target table.
+        */
+       ULTRA_ENB {
+               alias           CMDSIZE_TABLE
+               size            2
+               count           2
+               dont_generate_debug_code
+       }
+       /*
+        * Bit vector of targets that have disconnection disabled as set by
+        * the BIOS.  The Sequencer relies in a per-SCB field to control the
+        * disconnect priveldge.  During initialization, we read this field
+        * and reuse it for 2 entries in the busy target table.
+        */
+       DISC_DSB {
+               size            2
+               count           6
+               dont_generate_debug_code
+       }
+       CMDSIZE_TABLE_TAIL {
+               size            4
+       }
+       /*
+        * Partial transfer past cacheline end to be
+        * transferred using an extra S/G.
+        */
+       MWI_RESIDUAL {
+               size            1
+               dont_generate_debug_code
+       }
+       /*
+        * SCBID of the next SCB to be started by the controller.
+        */
+       NEXT_QUEUED_SCB {
+               size            1
+               dont_generate_debug_code
+       }
+       /*
+        * Single byte buffer used to designate the type or message
+        * to send to a target.
+        */
+       MSG_OUT {
+               size            1
+               dont_generate_debug_code
+       }
+       /* Parameters for DMA Logic */
+       DMAPARAMS {
+               size            1
+               count           12
+               field   PRELOADEN       0x80
+               field   WIDEODD         0x40
+               field   SCSIEN          0x20
+               field   SDMAEN          0x10
+               field   SDMAENACK       0x10
+               field   HDMAEN          0x08
+               field   HDMAENACK       0x08
+               field   DIRECTION       0x04    /* Set indicates PCI->SCSI */
+               field   FIFOFLUSH       0x02
+               field   FIFORESET       0x01
+               dont_generate_debug_code
+       }
+       SEQ_FLAGS {
+               size            1
+               field   NOT_IDENTIFIED          0x80
+               field   NO_CDB_SENT             0x40
+               field   TARGET_CMD_IS_TAGGED    0x40
+               field   DPHASE                  0x20
+               /* Target flags */
+               field   TARG_CMD_PENDING        0x10
+               field   CMDPHASE_PENDING        0x08
+               field   DPHASE_PENDING          0x04
+               field   SPHASE_PENDING          0x02
+               field   NO_DISCONNECT           0x01
+       }
+       /*
+        * Temporary storage for the
+        * target/channel/lun of a
+        * reconnecting target
+        */
+       SAVED_SCSIID {
+               size            1
+               dont_generate_debug_code
+       }
+       SAVED_LUN {
+               size            1
+               dont_generate_debug_code
+       }
+       /*
+        * The last bus phase as seen by the sequencer. 
+        */
+       LASTPHASE {
+               size            1
+               field   CDI             0x80
+               field   IOI             0x40
+               field   MSGI            0x20
+               mask    PHASE_MASK      CDI|IOI|MSGI
+               mask    P_DATAOUT       0x00
+               mask    P_DATAIN        IOI
+               mask    P_COMMAND       CDI
+               mask    P_MESGOUT       CDI|MSGI
+               mask    P_STATUS        CDI|IOI
+               mask    P_MESGIN        CDI|IOI|MSGI
+               mask    P_BUSFREE       0x01
+       }
+       /*
+        * head of list of SCBs awaiting
+        * selection
+        */
+       WAITING_SCBH {
+               size            1
+               dont_generate_debug_code
+       }
+       /*
+        * head of list of SCBs that are
+        * disconnected.  Used for SCB
+        * paging.
+        */
+       DISCONNECTED_SCBH {
+               size            1
+               dont_generate_debug_code
+       }
+       /*
+        * head of list of SCBs that are
+        * not in use.  Used for SCB paging.
+        */
+       FREE_SCBH {
+               size            1
+               dont_generate_debug_code
+       }
+       /*
+        * head of list of SCBs that have
+        * completed but have not been
+        * put into the qoutfifo.
+        */
+       COMPLETE_SCBH {
+               size            1
+       }
+       /*
+        * Address of the hardware scb array in the host.
+        */
+       HSCB_ADDR {
+               size            4
+               dont_generate_debug_code
+       }
+       /*
+        * Base address of our shared data with the kernel driver in host
+        * memory.  This includes the qoutfifo and target mode
+        * incoming command queue.
+        */
+       SHARED_DATA_ADDR {
+               size            4
+               dont_generate_debug_code
+       }
+       KERNEL_QINPOS {
+               size            1
+               dont_generate_debug_code
+       }
+       QINPOS {
+               size            1
+               dont_generate_debug_code
+       }
+       QOUTPOS {
+               size            1
+               dont_generate_debug_code
+       }
+       /*
+        * Kernel and sequencer offsets into the queue of
+        * incoming target mode command descriptors.  The
+        * queue is full when the KERNEL_TQINPOS == TQINPOS.
+        */
+       KERNEL_TQINPOS {
+               size            1
+               dont_generate_debug_code
+       }
+       TQINPOS {
+               size            1
+               dont_generate_debug_code
+       }
+       ARG_1 {
+               size            1
+               count           1
+               mask    SEND_MSG                0x80
+               mask    SEND_SENSE              0x40
+               mask    SEND_REJ                0x20
+               mask    MSGOUT_PHASEMIS         0x10
+               mask    EXIT_MSG_LOOP           0x08
+               mask    CONT_MSG_LOOP           0x04
+               mask    CONT_TARG_SESSION       0x02
+               alias   RETURN_1
+               dont_generate_debug_code
+       }
+       ARG_2 {
+               size            1
+               alias   RETURN_2
+               dont_generate_debug_code
+       }
+
+       /*
+        * Snapshot of MSG_OUT taken after each message is sent.
+        */
+       LAST_MSG {
+               size            1
+               alias   TARG_IMMEDIATE_SCB
+               dont_generate_debug_code
+       }
+
+       /*
+        * Sequences the kernel driver has okayed for us.  This allows
+        * the driver to do things like prevent initiator or target
+        * operations.
+        */
+       SCSISEQ_TEMPLATE {
+               size            1
+               field   ENSELO          0x40
+               field   ENSELI          0x20
+               field   ENRSELI         0x10
+               field   ENAUTOATNO      0x08
+               field   ENAUTOATNI      0x04
+               field   ENAUTOATNP      0x02
+               dont_generate_debug_code
+       }
+}
+
+scratch_ram {
+       address         0x056
+       size            4
+       /*
+        * These scratch ram locations are initialized by the 274X BIOS.
+        * We reuse them after capturing the BIOS settings during
+        * initialization.
+        */
+
+       /*
+        * The initiator specified tag for this target mode transaction.
+        */
+       HA_274_BIOSGLOBAL {
+               size    1
+               field   HA_274_EXTENDED_TRANS   0x01
+               alias   INITIATOR_TAG
+               count           1
+               dont_generate_debug_code
+       }
+
+       SEQ_FLAGS2 {
+               size    1
+               field   SCB_DMA                 0x01
+               field   TARGET_MSG_PENDING      0x02
+               dont_generate_debug_code
+       }
+}
+
+scratch_ram {
+       address         0x05a
+       size            6
+       /*
+        * These are reserved registers in the card's scratch ram on the 2742.
+        * The EISA configuraiton chip is mapped here.  On Rev E. of the
+        * aic7770, the sequencer can use this area for scratch, but the
+        * host cannot directly access these registers.  On later chips, this
+        * area can be read and written by both the host and the sequencer.
+        * Even on later chips, many of these locations are initialized by
+        * the BIOS.
+        */
+       SCSICONF {
+               size            1
+               count           12
+               field   TERM_ENB        0x80
+               field   RESET_SCSI      0x40
+               field   ENSPCHK         0x20
+               mask    HSCSIID         0x07    /* our SCSI ID */
+               mask    HWSCSIID        0x0f    /* our SCSI ID if Wide Bus */
+               dont_generate_debug_code
+       }
+       INTDEF {
+               address         0x05c
+               size            1
+               count           1
+               field   EDGE_TRIG       0x80
+               mask    VECTOR          0x0f
+               dont_generate_debug_code
+       }
+       HOSTCONF {
+               address         0x05d
+               size            1
+               count           1
+               dont_generate_debug_code
+       }
+       HA_274_BIOSCTRL {
+               address         0x05f
+               size            1
+               count           1
+               mask    BIOSMODE                0x30
+               mask    BIOSDISABLED            0x30    
+               field   CHANNEL_B_PRIMARY       0x08
+               dont_generate_debug_code
+       }
+}
+
+scratch_ram {
+       address         0x070
+       size            16
+
+       /*
+        * Per target SCSI offset values for Ultra2 controllers.
+        */
+       TARG_OFFSET {
+               size            16
+               count           1
+               dont_generate_debug_code
+       }
+}
+
+const TID_SHIFT                4
+const SCB_LIST_NULL    0xff
+const TARGET_CMD_CMPLT 0xfe
+
+const CCSGADDR_MAX     0x80
+const CCSGRAM_MAXSEGS  16
+
+/* WDTR Message values */
+const BUS_8_BIT                        0x00
+const BUS_16_BIT               0x01
+const BUS_32_BIT               0x02
+
+/* Offset maximums */
+const MAX_OFFSET_8BIT          0x0f
+const MAX_OFFSET_16BIT         0x08
+const MAX_OFFSET_ULTRA2                0x7f
+const MAX_OFFSET               0x7f
+const HOST_MSG                 0xff
+
+/* Target mode command processing constants */
+const CMD_GROUP_CODE_SHIFT     0x05
+
+const STATUS_BUSY              0x08
+const STATUS_QUEUE_FULL        0x28
+const TARGET_DATA_IN           1
+
+/*
+ * Downloaded (kernel inserted) constants
+ */
+/* Offsets into the SCBID array where different data is stored */
+const QOUTFIFO_OFFSET download
+const QINFIFO_OFFSET download
+const CACHESIZE_MASK download
+const INVERTED_CACHESIZE_MASK download
+const SG_PREFETCH_CNT download
+const SG_PREFETCH_ALIGN_MASK download
+const SG_PREFETCH_ADDR_MASK download