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