Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/scsi/aic7xxx/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 37 kB image not shown  

Quelle  aic7xxx.reg   Sprache: unbekannt

 
/*
 * 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 configuration 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

[ Dauer der Verarbeitung: 0.17 Sekunden  (vorverarbeitet)  ]