[BACK]Return to aic7xxx.reg CVS log [TXT][DIR] Up to [local] / sys / dev / microcode / aic7xxx

Annotation of sys/dev/microcode/aic7xxx/aic7xxx.reg, Revision 1.1.1.1

1.1       nbrk        1: /* $OpenBSD: aic7xxx.reg,v 1.11 2007/05/26 00:36:03 krw Exp $ */
                      2: /*
                      3:  * Aic7xxx register and scratch ram definitions.
                      4:  *
                      5:  * Copyright (c) 1994-2001 Justin T. Gibbs.
                      6:  * Copyright (c) 2000-2001 Adaptec Inc.
                      7:  * All rights reserved.
                      8:  *
                      9:  * Redistribution and use in source and binary forms, with or without
                     10:  * modification, are permitted provided that the following conditions
                     11:  * are met:
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions, and the following disclaimer,
                     14:  *    without modification.
                     15:  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
                     16:  *    substantially similar to the "NO WARRANTY" disclaimer below
                     17:  *    ("Disclaimer") and any redistribution must be conditioned upon
                     18:  *    including a substantially similar Disclaimer requirement for further
                     19:  *    binary redistribution.
                     20:  * 3. Neither the names of the above-listed copyright holders nor the names
                     21:  *    of any contributors may be used to endorse or promote products derived
                     22:  *    from this software without specific prior written permission.
                     23:  *
                     24:  * Alternatively, this software may be distributed under the terms of the
                     25:  * GNU General Public License ("GPL") version 2 as published by the Free
                     26:  * Software Foundation.
                     27:  *
                     28:  * NO WARRANTY
                     29:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
                     30:  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
                     31:  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
                     32:  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
                     33:  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     34:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     35:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     36:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
                     37:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
                     38:  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     39:  * POSSIBILITY OF SUCH DAMAGES.
                     40:  *
                     41:  * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx.reg,v 1.46 2003/12/17 00:02:09 gibbs Exp $
                     42:  */
                     43: VERSION = "$Id: aic7xxx.reg,v 1.11 2007/05/26 00:36:03 krw Exp $"
                     44:
                     45: /*
                     46:  * This file is processed by the aic7xxx_asm utility for use in assembling
                     47:  * firmware for the aic7xxx family of SCSI host adapters as well as to generate
                     48:  * a C header file for use in the kernel portion of the Aic7xxx driver.
                     49:  *
                     50:  * All page numbers refer to the Adaptec AIC-7770 Data Book available from
                     51:  * Adaptec's Technical Documents Department 1-800-934-2766
                     52:  */
                     53:
                     54: /*
                     55:  * SCSI Sequence Control (p. 3-11).
                     56:  * Each bit, when set starts a specific SCSI sequence on the bus
                     57:  */
                     58: register SCSISEQ {
                     59:        address                 0x000
                     60:        access_mode RW
                     61:        field   TEMODE          0x80
                     62:        field   ENSELO          0x40
                     63:        field   ENSELI          0x20
                     64:        field   ENRSELI         0x10
                     65:        field   ENAUTOATNO      0x08
                     66:        field   ENAUTOATNI      0x04
                     67:        field   ENAUTOATNP      0x02
                     68:        field   SCSIRSTO        0x01
                     69: }
                     70:
                     71: /*
                     72:  * SCSI Transfer Control 0 Register (pp. 3-13).
                     73:  * Controls the SCSI module data path.
                     74:  */
                     75: register SXFRCTL0 {
                     76:        address                 0x001
                     77:        access_mode RW
                     78:        field   DFON            0x80
                     79:        field   DFPEXP          0x40
                     80:        field   FAST20          0x20
                     81:        field   CLRSTCNT        0x10
                     82:        field   SPIOEN          0x08
                     83:        field   SCAMEN          0x04
                     84:        field   CLRCHN          0x02
                     85: }
                     86:
                     87: /*
                     88:  * SCSI Transfer Control 1 Register (pp. 3-14,15).
                     89:  * Controls the SCSI module data path.
                     90:  */
                     91: register SXFRCTL1 {
                     92:        address                 0x002
                     93:        access_mode RW
                     94:        field   BITBUCKET       0x80
                     95:        field   SWRAPEN         0x40
                     96:        field   ENSPCHK         0x20
                     97:        mask    STIMESEL        0x18
                     98:        field   ENSTIMER        0x04
                     99:        field   ACTNEGEN        0x02
                    100:        field   STPWEN          0x01    /* Powered Termination */
                    101: }
                    102:
                    103: /*
                    104:  * SCSI Control Signal Read Register (p. 3-15).
                    105:  * Reads the actual state of the SCSI bus pins
                    106:  */
                    107: register SCSISIGI {
                    108:        address                 0x003
                    109:        access_mode RO
                    110:        field   CDI             0x80
                    111:        field   IOI             0x40
                    112:        field   MSGI            0x20
                    113:        field   ATNI            0x10
                    114:        field   SELI            0x08
                    115:        field   BSYI            0x04
                    116:        field   REQI            0x02
                    117:        field   ACKI            0x01
                    118: /*
                    119:  * Possible phases in SCSISIGI
                    120:  */
                    121:        mask    PHASE_MASK      CDI|IOI|MSGI
                    122:        mask    P_DATAOUT       0x00
                    123:        mask    P_DATAIN        IOI
                    124:        mask    P_DATAOUT_DT    P_DATAOUT|MSGI
                    125:        mask    P_DATAIN_DT     P_DATAIN|MSGI
                    126:        mask    P_COMMAND       CDI
                    127:        mask    P_MESGOUT       CDI|MSGI
                    128:        mask    P_STATUS        CDI|IOI
                    129:        mask    P_MESGIN        CDI|IOI|MSGI
                    130: }
                    131:
                    132: /*
                    133:  * SCSI Control Signal Write Register (p. 3-16).
                    134:  * Writing to this register modifies the control signals on the bus.  Only
                    135:  * those signals that are allowed in the current mode (Initiator/Target) are
                    136:  * asserted.
                    137:  */
                    138: register SCSISIGO {
                    139:        address                 0x003
                    140:        access_mode WO
                    141:        field   CDO             0x80
                    142:        field   IOO             0x40
                    143:        field   MSGO            0x20
                    144:        field   ATNO            0x10
                    145:        field   SELO            0x08
                    146:        field   BSYO            0x04
                    147:        field   REQO            0x02
                    148:        field   ACKO            0x01
                    149: /*
                    150:  * Possible phases to write into SCSISIG0
                    151:  */
                    152:        mask    PHASE_MASK      CDI|IOI|MSGI
                    153:        mask    P_DATAOUT       0x00
                    154:        mask    P_DATAIN        IOI
                    155:        mask    P_COMMAND       CDI
                    156:        mask    P_MESGOUT       CDI|MSGI
                    157:        mask    P_STATUS        CDI|IOI
                    158:        mask    P_MESGIN        CDI|IOI|MSGI
                    159: }
                    160:
                    161: /*
                    162:  * SCSI Rate Control (p. 3-17).
                    163:  * Contents of this register determine the Synchronous SCSI data transfer
                    164:  * rate and the maximum synchronous Req/Ack offset.  An offset of 0 in the
                    165:  * SOFS (3:0) bits disables synchronous data transfers.  Any offset value
                    166:  * greater than 0 enables synchronous transfers.
                    167:  */
                    168: register SCSIRATE {
                    169:        address                 0x004
                    170:        access_mode RW
                    171:        field   WIDEXFER        0x80            /* Wide transfer control */
                    172:        field   ENABLE_CRC      0x40            /* CRC for D-Phases */
                    173:        field   SINGLE_EDGE     0x10            /* Disable DT Transfers */
                    174:        mask    SXFR            0x70            /* Sync transfer rate */
                    175:        mask    SXFR_ULTRA2     0x0f            /* Sync transfer rate */
                    176:        mask    SOFS            0x0f            /* Sync offset */
                    177: }
                    178:
                    179: /*
                    180:  * SCSI ID (p. 3-18).
                    181:  * Contains the ID of the board and the current target on the
                    182:  * selected channel.
                    183:  */
                    184: register SCSIID        {
                    185:        address                 0x005
                    186:        access_mode RW
                    187:        mask    TID             0xf0            /* Target ID mask */
                    188:        mask    TWIN_TID        0x70
                    189:        field   TWIN_CHNLB      0x80
                    190:        mask    OID             0x0f            /* Our ID mask */
                    191:        /*
                    192:         * SCSI Maximum Offset (p. 4-61 aic7890/91 Data Book)
                    193:         * The aic7890/91 allow an offset of up to 127 transfers in both wide
                    194:         * and narrow mode.
                    195:         */
                    196:        alias   SCSIOFFSET
                    197:        mask    SOFS_ULTRA2     0x7f            /* Sync offset U2 chips */
                    198: }
                    199:
                    200: /*
                    201:  * SCSI Latched Data (p. 3-19).
                    202:  * Read/Write latches used to transfer data on the SCSI bus during
                    203:  * Automatic or Manual PIO mode.  SCSIDATH can be used for the
                    204:  * upper byte of a 16bit wide asynchronouse data phase transfer.
                    205:  */
                    206: register SCSIDATL {
                    207:        address                 0x006
                    208:        access_mode RW
                    209: }
                    210:
                    211: register SCSIDATH {
                    212:        address                 0x007
                    213:        access_mode RW
                    214: }
                    215:
                    216: /*
                    217:  * SCSI Transfer Count (pp. 3-19,20)
                    218:  * These registers count down the number of bytes transferred
                    219:  * across the SCSI bus.  The counter is decremented only once
                    220:  * the data has been safely transferred.  SDONE in SSTAT0 is
                    221:  * set when STCNT goes to 0
                    222:  */
                    223: register STCNT {
                    224:        address                 0x008
                    225:        size    3
                    226:        access_mode RW
                    227: }
                    228:
                    229: /* ALT_MODE registers (Ultra2 and Ultra160 chips) */
                    230: register SXFRCTL2 {
                    231:        address                 0x013
                    232:        access_mode RW
                    233:        field   AUTORSTDIS      0x10
                    234:        field   CMDDMAEN        0x08
                    235:        mask    ASYNC_SETUP     0x07
                    236: }
                    237:
                    238: /* ALT_MODE register on Ultra160 chips */
                    239: register OPTIONMODE {
                    240:        address                 0x008
                    241:        access_mode RW
                    242:        field   AUTORATEEN              0x80
                    243:        field   AUTOACKEN               0x40
                    244:        field   ATNMGMNTEN              0x20
                    245:        field   BUSFREEREV              0x10
                    246:        field   EXPPHASEDIS             0x08
                    247:        field   SCSIDATL_IMGEN          0x04
                    248:        field   AUTO_MSGOUT_DE          0x02
                    249:        field   DIS_MSGIN_DUALEDGE      0x01
                    250:        mask    OPTIONMODE_DEFAULTS     AUTO_MSGOUT_DE|DIS_MSGIN_DUALEDGE
                    251: }
                    252:
                    253: /* ALT_MODE register on Ultra160 chips */
                    254: register TARGCRCCNT {
                    255:        address                 0x00a
                    256:        size    2
                    257:        access_mode RW
                    258: }
                    259:
                    260: /*
                    261:  * Clear SCSI Interrupt 0 (p. 3-20)
                    262:  * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT0.
                    263:  */
                    264: register CLRSINT0 {
                    265:        address                 0x00b
                    266:        access_mode WO
                    267:        field   CLRSELDO        0x40
                    268:        field   CLRSELDI        0x20
                    269:        field   CLRSELINGO      0x10
                    270:        field   CLRSWRAP        0x08
                    271:        field   CLRIOERR        0x08    /* Ultra2 Only */
                    272:        field   CLRSPIORDY      0x02
                    273: }
                    274:
                    275: /*
                    276:  * SCSI Status 0 (p. 3-21)
                    277:  * Contains one set of SCSI Interrupt codes
                    278:  * These are most likely of interest to the sequencer
                    279:  */
                    280: register SSTAT0        {
                    281:        address                 0x00b
                    282:        access_mode RO
                    283:        field   TARGET          0x80    /* Board acting as target */
                    284:        field   SELDO           0x40    /* Selection Done */
                    285:        field   SELDI           0x20    /* Board has been selected */
                    286:        field   SELINGO         0x10    /* Selection In Progress */
                    287:        field   SWRAP           0x08    /* 24bit counter wrap */
                    288:        field   IOERR           0x08    /* LVD Tranceiver mode changed */
                    289:        field   SDONE           0x04    /* STCNT = 0x000000 */
                    290:        field   SPIORDY         0x02    /* SCSI PIO Ready */
                    291:        field   DMADONE         0x01    /* DMA transfer completed */
                    292: }
                    293:
                    294: /*
                    295:  * Clear SCSI Interrupt 1 (p. 3-23)
                    296:  * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT1.
                    297:  */
                    298: register CLRSINT1 {
                    299:        address                 0x00c
                    300:        access_mode WO
                    301:        field   CLRSELTIMEO     0x80
                    302:        field   CLRATNO         0x40
                    303:        field   CLRSCSIRSTI     0x20
                    304:        field   CLRBUSFREE      0x08
                    305:        field   CLRSCSIPERR     0x04
                    306:        field   CLRPHASECHG     0x02
                    307:        field   CLRREQINIT      0x01
                    308: }
                    309:
                    310: /*
                    311:  * SCSI Status 1 (p. 3-24)
                    312:  */
                    313: register SSTAT1        {
                    314:        address                 0x00c
                    315:        access_mode RO
                    316:        field   SELTO           0x80
                    317:        field   ATNTARG         0x40
                    318:        field   SCSIRSTI        0x20
                    319:        field   PHASEMIS        0x10
                    320:        field   BUSFREE         0x08
                    321:        field   SCSIPERR        0x04
                    322:        field   PHASECHG        0x02
                    323:        field   REQINIT         0x01
                    324: }
                    325:
                    326: /*
                    327:  * SCSI Status 2 (pp. 3-25,26)
                    328:  */
                    329: register SSTAT2 {
                    330:        address                 0x00d
                    331:        access_mode RO
                    332:        field   OVERRUN         0x80
                    333:        field   SHVALID         0x40    /* Shadow Layer non-zero */
                    334:        field   EXP_ACTIVE      0x10    /* SCSI Expander Active */
                    335:        field   CRCVALERR       0x08    /* CRC doesn't match (U3 only) */
                    336:        field   CRCENDERR       0x04    /* No terminal CRC packet (U3 only) */
                    337:        field   CRCREQERR       0x02    /* Illegal CRC packet req (U3 only) */
                    338:        field   DUAL_EDGE_ERR   0x01    /* Incorrect data phase (U3 only) */
                    339:        mask    SFCNT           0x1f
                    340: }
                    341:
                    342: /*
                    343:  * SCSI Status 3 (p. 3-26)
                    344:  */
                    345: register SSTAT3 {
                    346:        address                 0x00e
                    347:        access_mode RO
                    348:        mask    SCSICNT         0xf0
                    349:        mask    OFFCNT          0x0f
                    350:        mask    U2OFFCNT        0x7f
                    351: }
                    352:
                    353: /*
                    354:  * SCSI ID for the aic7890/91 chips
                    355:  */
                    356: register SCSIID_ULTRA2 {
                    357:        address                 0x00f
                    358:        access_mode RW
                    359:        mask    TID             0xf0            /* Target ID mask */
                    360:        mask    OID             0x0f            /* Our ID mask */
                    361: }
                    362:
                    363: /*
                    364:  * SCSI Interrupt Mode 1 (p. 3-28)
                    365:  * Setting any bit will enable the corresponding function
                    366:  * in SIMODE0 to interrupt via the IRQ pin.
                    367:  */
                    368: register SIMODE0 {
                    369:        address                 0x010
                    370:        access_mode RW
                    371:        field   ENSELDO         0x40
                    372:        field   ENSELDI         0x20
                    373:        field   ENSELINGO       0x10
                    374:        field   ENSWRAP         0x08
                    375:        field   ENIOERR         0x08    /* LVD Tranceiver mode changes */
                    376:        field   ENSDONE         0x04
                    377:        field   ENSPIORDY       0x02
                    378:        field   ENDMADONE       0x01
                    379: }
                    380:
                    381: /*
                    382:  * SCSI Interrupt Mode 1 (pp. 3-28,29)
                    383:  * Setting any bit will enable the corresponding function
                    384:  * in SIMODE1 to interrupt via the IRQ pin.
                    385:  */
                    386: register SIMODE1 {
                    387:        address                 0x011
                    388:        access_mode RW
                    389:        field   ENSELTIMO       0x80
                    390:        field   ENATNTARG       0x40
                    391:        field   ENSCSIRST       0x20
                    392:        field   ENPHASEMIS      0x10
                    393:        field   ENBUSFREE       0x08
                    394:        field   ENSCSIPERR      0x04
                    395:        field   ENPHASECHG      0x02
                    396:        field   ENREQINIT       0x01
                    397: }
                    398:
                    399: /*
                    400:  * SCSI Data Bus (High) (p. 3-29)
                    401:  * This register reads data on the SCSI Data bus directly.
                    402:  */
                    403: register SCSIBUSL {
                    404:        address                 0x012
                    405:        access_mode RW
                    406: }
                    407:
                    408: register SCSIBUSH {
                    409:        address                 0x013
                    410:        access_mode RW
                    411: }
                    412:
                    413: /*
                    414:  * SCSI/Host Address (p. 3-30)
                    415:  * These registers hold the host address for the byte about to be
                    416:  * transferred on the SCSI bus.  They are counted up in the same
                    417:  * manner as STCNT is counted down.  SHADDR should always be used
                    418:  * to determine the address of the last byte transferred since HADDR
                    419:  * can be skewed by write ahead.
                    420:  */
                    421: register SHADDR {
                    422:        address                 0x014
                    423:        size    4
                    424:        access_mode RO
                    425: }
                    426:
                    427: /*
                    428:  * Selection Timeout Timer (p. 3-30)
                    429:  */
                    430: register SELTIMER {
                    431:        address                 0x018
                    432:        access_mode RW
                    433:        field   STAGE6          0x20
                    434:        field   STAGE5          0x10
                    435:        field   STAGE4          0x08
                    436:        field   STAGE3          0x04
                    437:        field   STAGE2          0x02
                    438:        field   STAGE1          0x01
                    439:        alias   TARGIDIN
                    440: }
                    441:
                    442: /*
                    443:  * Selection/Reselection ID (p. 3-31)
                    444:  * Upper four bits are the device id.  The ONEBIT is set when the re/selecting
                    445:  * device did not set its own ID.
                    446:  */
                    447: register SELID {
                    448:        address                 0x019
                    449:        access_mode RW
                    450:        mask    SELID_MASK      0xf0
                    451:        field   ONEBIT          0x08
                    452: }
                    453:
                    454: register SCAMCTL {
                    455:        address                 0x01a
                    456:        access_mode RW
                    457:        field   ENSCAMSELO      0x80
                    458:        field   CLRSCAMSELID    0x40
                    459:        field   ALTSTIM         0x20
                    460:        field   DFLTTID         0x10
                    461:        mask    SCAMLVL         0x03
                    462: }
                    463:
                    464: /*
                    465:  * Target Mode Selecting in ID bitmask (aic7890/91/96/97)
                    466:  */
                    467: register TARGID {
                    468:        address                 0x01b
                    469:        size                    2
                    470:        access_mode RW
                    471: }
                    472:
                    473: /*
                    474:  * Serial Port I/O Cabability register (p. 4-95 aic7860 Data Book)
                    475:  * Indicates if external logic has been attached to the chip to
                    476:  * perform the tasks of accessing a serial eeprom, testing termination
                    477:  * strength, and performing cable detection.  On the aic7860, most of
                    478:  * these features are handled on chip, but on the aic7855 an attached
                    479:  * aic3800 does the grunt work.
                    480:  */
                    481: register SPIOCAP {
                    482:        address                 0x01b
                    483:        access_mode RW
                    484:        field   SOFT1           0x80
                    485:        field   SOFT0           0x40
                    486:        field   SOFTCMDEN       0x20
                    487:        field   EXT_BRDCTL      0x10    /* External Board control */
                    488:        field   SEEPROM         0x08    /* External serial eeprom logic */
                    489:        field   EEPROM          0x04    /* Writable external BIOS ROM */
                    490:        field   ROM             0x02    /* Logic for accessing external ROM */
                    491:        field   SSPIOCPS        0x01    /* Termination and cable detection */
                    492: }
                    493:
                    494: register BRDCTL        {
                    495:        address                 0x01d
                    496:        field   BRDDAT7         0x80
                    497:        field   BRDDAT6         0x40
                    498:        field   BRDDAT5         0x20
                    499:        field   BRDSTB          0x10
                    500:        field   BRDCS           0x08
                    501:        field   BRDRW           0x04
                    502:        field   BRDCTL1         0x02
                    503:        field   BRDCTL0         0x01
                    504:        /* 7890 Definitions */
                    505:        field   BRDDAT4         0x10
                    506:        field   BRDDAT3         0x08
                    507:        field   BRDDAT2         0x04
                    508:        field   BRDRW_ULTRA2    0x02
                    509:        field   BRDSTB_ULTRA2   0x01
                    510: }
                    511:
                    512: /*
                    513:  * Serial EEPROM Control (p. 4-92 in 7870 Databook)
                    514:  * Controls the reading and writing of an external serial 1-bit
                    515:  * EEPROM Device.  In order to access the serial EEPROM, you must
                    516:  * first set the SEEMS bit that generates a request to the memory
                    517:  * port for access to the serial EEPROM device.  When the memory
                    518:  * port is not busy servicing another request, it reconfigures
                    519:  * to allow access to the serial EEPROM.  When this happens, SEERDY
                    520:  * gets set high to verify that the memory port access has been
                    521:  * granted.
                    522:  *
                    523:  * After successful arbitration for the memory port, the SEECS bit of
                    524:  * the SEECTL register is connected to the chip select.  The SEECK,
                    525:  * SEEDO, and SEEDI are connected to the clock, data out, and data in
                    526:  * lines respectively.  The SEERDY bit of SEECTL is useful in that it
                    527:  * gives us an 800 nsec timer.  After a write to the SEECTL register,
                    528:  * the SEERDY goes high 800 nsec later.  The one exception to this is
                    529:  * when we first request access to the memory port.  The SEERDY goes
                    530:  * high to signify that access has been granted and, for this case, has
                    531:  * no implied timing.
                    532:  *
                    533:  * See 93cx6.c for detailed information on the protocol necessary to
                    534:  * read the serial EEPROM.
                    535:  */
                    536: register SEECTL {
                    537:        address                 0x01e
                    538:        field   EXTARBACK       0x80
                    539:        field   EXTARBREQ       0x40
                    540:        field   SEEMS           0x20
                    541:        field   SEERDY          0x10
                    542:        field   SEECS           0x08
                    543:        field   SEECK           0x04
                    544:        field   SEEDO           0x02
                    545:        field   SEEDI           0x01
                    546: }
                    547: /*
                    548:  * SCSI Block Control (p. 3-32)
                    549:  * Controls Bus type and channel selection.  In a twin channel configuration
                    550:  * addresses 0x00-0x1e are gated to the appropriate channel based on this
                    551:  * register.  SELWIDE allows for the coexistence of 8bit and 16bit devices
                    552:  * on a wide bus.
                    553:  */
                    554: register SBLKCTL {
                    555:        address                 0x01f
                    556:        access_mode RW
                    557:        field   DIAGLEDEN       0x80    /* Aic78X0 only */
                    558:        field   DIAGLEDON       0x40    /* Aic78X0 only */
                    559:        field   AUTOFLUSHDIS    0x20
                    560:        field   SELBUSB         0x08
                    561:        field   ENAB40          0x08    /* LVD transceiver active */
                    562:        field   ENAB20          0x04    /* SE/HVD transceiver active */
                    563:        field   SELWIDE         0x02
                    564:        field   XCVR            0x01    /* External transceiver active */
                    565: }
                    566:
                    567: /*
                    568:  * Sequencer Control (p. 3-33)
                    569:  * Error detection mode and speed configuration
                    570:  */
                    571: register SEQCTL {
                    572:        address                 0x060
                    573:        access_mode RW
                    574:        field   PERRORDIS       0x80
                    575:        field   PAUSEDIS        0x40
                    576:        field   FAILDIS         0x20
                    577:        field   FASTMODE        0x10
                    578:        field   BRKADRINTEN     0x08
                    579:        field   STEP            0x04
                    580:        field   SEQRESET        0x02
                    581:        field   LOADRAM         0x01
                    582: }
                    583:
                    584: /*
                    585:  * Sequencer RAM Data (p. 3-34)
                    586:  * Single byte window into the Scratch Ram area starting at the address
                    587:  * specified by SEQADDR0 and SEQADDR1.  To write a full word, simply write
                    588:  * four bytes in succession.  The SEQADDRs will increment after the most
                    589:  * significant byte is written
                    590:  */
                    591: register SEQRAM {
                    592:        address                 0x061
                    593:        access_mode RW
                    594: }
                    595:
                    596: /*
                    597:  * Sequencer Address Registers (p. 3-35)
                    598:  * Only the first bit of SEQADDR1 holds addressing information
                    599:  */
                    600: register SEQADDR0 {
                    601:        address                 0x062
                    602:        access_mode RW
                    603: }
                    604:
                    605: register SEQADDR1 {
                    606:        address                 0x063
                    607:        access_mode RW
                    608:        mask    SEQADDR1_MASK   0x01
                    609: }
                    610:
                    611: /*
                    612:  * Accumulator
                    613:  * We cheat by passing arguments in the Accumulator up to the kernel driver
                    614:  */
                    615: register ACCUM {
                    616:        address                 0x064
                    617:        access_mode RW
                    618:        accumulator
                    619: }
                    620:
                    621: register SINDEX        {
                    622:        address                 0x065
                    623:        access_mode RW
                    624:        sindex
                    625: }
                    626:
                    627: register DINDEX {
                    628:        address                 0x066
                    629:        access_mode RW
                    630: }
                    631:
                    632: register ALLONES {
                    633:        address                 0x069
                    634:        access_mode RO
                    635:        allones
                    636: }
                    637:
                    638: register ALLZEROS {
                    639:        address                 0x06a
                    640:        access_mode RO
                    641:        allzeros
                    642: }
                    643:
                    644: register NONE {
                    645:        address                 0x06a
                    646:        access_mode WO
                    647:        none
                    648: }
                    649:
                    650: register FLAGS {
                    651:        address                 0x06b
                    652:        access_mode RO
                    653:        field   ZERO            0x02
                    654:        field   CARRY           0x01
                    655: }
                    656:
                    657: register SINDIR        {
                    658:        address                 0x06c
                    659:        access_mode RO
                    660: }
                    661:
                    662: register DINDIR         {
                    663:        address                 0x06d
                    664:        access_mode WO
                    665: }
                    666:
                    667: register FUNCTION1 {
                    668:        address                 0x06e
                    669:        access_mode RW
                    670: }
                    671:
                    672: register STACK {
                    673:        address                 0x06f
                    674:        access_mode RO
                    675: }
                    676:
                    677: const  STACK_SIZE      4
                    678:
                    679: /*
                    680:  * Board Control (p. 3-43)
                    681:  */
                    682: register BCTL {
                    683:        address                 0x084
                    684:        access_mode RW
                    685:        field   ACE             0x08
                    686:        field   ENABLE          0x01
                    687: }
                    688:
                    689: /*
                    690:  * On the aic78X0 chips, Board Control is replaced by the DSCommand
                    691:  * register (p. 4-64)
                    692:  */
                    693: register DSCOMMAND0 {
                    694:        address                 0x084
                    695:        access_mode RW
                    696:        field   CACHETHEN       0x80    /* Cache Threshold enable */
                    697:        field   DPARCKEN        0x40    /* Data Parity Check Enable */
                    698:        field   MPARCKEN        0x20    /* Memory Parity Check Enable */
                    699:        field   EXTREQLCK       0x10    /* External Request Lock */
                    700:        /* aic7890/91/96/97 only */
                    701:        field   INTSCBRAMSEL    0x08    /* Internal SCB RAM Select */
                    702:        field   RAMPS           0x04    /* External SCB RAM Present */
                    703:        field   USCBSIZE32      0x02    /* Use 32byte SCB Page Size */
                    704:        field   CIOPARCKEN      0x01    /* Internal bus parity error enable */
                    705: }
                    706:
                    707: register DSCOMMAND1 {
                    708:        address                 0x085
                    709:        access_mode RW
                    710:        mask    DSLATT          0xfc    /* PCI latency timer (non-ultra2) */
                    711:        field   HADDLDSEL1      0x02    /* Host Address Load Select Bits */
                    712:        field   HADDLDSEL0      0x01
                    713: }
                    714:
                    715: /*
                    716:  * Bus On/Off Time (p. 3-44) aic7770 only
                    717:  */
                    718: register BUSTIME {
                    719:        address                 0x085
                    720:        access_mode RW
                    721:        mask    BOFF            0xf0
                    722:        mask    BON             0x0f
                    723: }
                    724:
                    725: /*
                    726:  * Bus Speed (p. 3-45) aic7770 only
                    727:  */
                    728: register BUSSPD {
                    729:        address                 0x086
                    730:        access_mode RW
                    731:        mask    DFTHRSH         0xc0
                    732:        mask    STBOFF          0x38
                    733:        mask    STBON           0x07
                    734:        mask    DFTHRSH_100     0xc0
                    735:        mask    DFTHRSH_75      0x80
                    736: }
                    737:
                    738: /* aic7850/55/60/70/80/95 only */
                    739: register DSPCISTATUS {
                    740:        address                 0x086
                    741:        mask    DFTHRSH_100     0xc0
                    742: }
                    743:
                    744: /* aic7890/91/96/97 only */
                    745: register HS_MAILBOX {
                    746:        address                 0x086
                    747:        mask    HOST_MAILBOX    0xF0
                    748:        mask    SEQ_MAILBOX     0x0F
                    749:        mask    HOST_TQINPOS    0x80    /* Boundary at either 0 or 128 */
                    750: }
                    751:
                    752: const  HOST_MAILBOX_SHIFT      4
                    753: const  SEQ_MAILBOX_SHIFT       0
                    754:
                    755: /*
                    756:  * Host Control (p. 3-47) R/W
                    757:  * Overall host control of the device.
                    758:  */
                    759: register HCNTRL {
                    760:        address                 0x087
                    761:        access_mode RW
                    762:        field   POWRDN          0x40
                    763:        field   SWINT           0x10
                    764:        field   IRQMS           0x08
                    765:        field   PAUSE           0x04
                    766:        field   INTEN           0x02
                    767:        field   CHIPRST         0x01
                    768:        field   CHIPRSTACK      0x01
                    769: }
                    770:
                    771: /*
                    772:  * Host Address (p. 3-48)
                    773:  * This register contains the address of the byte about
                    774:  * to be transferred across the host bus.
                    775:  */
                    776: register HADDR {
                    777:        address                 0x088
                    778:        size    4
                    779:        access_mode RW
                    780: }
                    781:
                    782: register HCNT {
                    783:        address                 0x08c
                    784:        size    3
                    785:        access_mode RW
                    786: }
                    787:
                    788: /*
                    789:  * SCB Pointer (p. 3-49)
                    790:  * Gate one of the SCBs into the SCBARRAY window.
                    791:  */
                    792: register SCBPTR {
                    793:        address                 0x090
                    794:        access_mode RW
                    795: }
                    796:
                    797: /*
                    798:  * Interrupt Status (p. 3-50)
                    799:  * Status for system interrupts
                    800:  */
                    801: register INTSTAT {
                    802:        address                 0x091
                    803:        access_mode RW
                    804:        field   BRKADRINT 0x08
                    805:        field   SCSIINT   0x04
                    806:        field   CMDCMPLT  0x02
                    807:        field   SEQINT    0x01
                    808:        mask    BAD_PHASE       SEQINT          /* unknown scsi bus phase */
                    809:        mask    SEND_REJECT     0x10|SEQINT     /* sending a message reject */
                    810:        mask    PROTO_VIOLATION 0x20|SEQINT     /* SCSI protocol violation */
                    811:        mask    NO_MATCH        0x30|SEQINT     /* no cmd match for reconnect */
                    812:        mask    IGN_WIDE_RES    0x40|SEQINT     /* Complex IGN Wide Res Msg */
                    813:        mask    PDATA_REINIT    0x50|SEQINT     /*
                    814:                                                 * Returned to data phase
                    815:                                                 * that requires data
                    816:                                                 * transfer pointers to be
                    817:                                                 * recalculated from the
                    818:                                                 * transfer residual.
                    819:                                                 */
                    820:        mask    HOST_MSG_LOOP   0x60|SEQINT     /*
                    821:                                                 * The bus is ready for the
                    822:                                                 * host to perform another
                    823:                                                 * message transaction.  This
                    824:                                                 * mechanism is used for things
                    825:                                                 * like sync/wide negotiation
                    826:                                                 * that require a kernel based
                    827:                                                 * message state engine.
                    828:                                                 */
                    829:        mask    BAD_STATUS      0x70|SEQINT     /* Bad status from target */
                    830:        mask    PERR_DETECTED   0x80|SEQINT     /*
                    831:                                                 * Either the phase_lock
                    832:                                                 * or inb_next routine has
                    833:                                                 * noticed a parity error.
                    834:                                                 */
                    835:        mask    DATA_OVERRUN    0x90|SEQINT     /*
                    836:                                                 * Target attempted to write
                    837:                                                 * beyond the bounds of its
                    838:                                                 * command.
                    839:                                                 */
                    840:        mask    MKMSG_FAILED    0xa0|SEQINT     /*
                    841:                                                 * Target completed command
                    842:                                                 * without honoring our ATN
                    843:                                                 * request to issue a message.
                    844:                                                 */
                    845:        mask    MISSED_BUSFREE  0xb0|SEQINT     /*
                    846:                                                 * The sequencer never saw
                    847:                                                 * the bus go free after
                    848:                                                 * either a command complete
                    849:                                                 * or disconnect message.
                    850:                                                 */
                    851:        mask    SCB_MISMATCH    0xc0|SEQINT     /*
                    852:                                                 * Downloaded SCB's tag does
                    853:                                                 * not match the entry we
                    854:                                                 * intended to download.
                    855:                                                 */
                    856:        mask    NO_FREE_SCB     0xd0|SEQINT     /*
                    857:                                                 * get_free_or_disc_scb failed.
                    858:                                                 */
                    859:        mask    OUT_OF_RANGE    0xe0|SEQINT
                    860:
                    861:        mask    SEQINT_MASK     0xf0|SEQINT     /* SEQINT Status Codes */
                    862:        mask    INT_PEND  (BRKADRINT|SEQINT|SCSIINT|CMDCMPLT)
                    863: }
                    864:
                    865: /*
                    866:  * Hard Error (p. 3-53)
                    867:  * Reporting of catastrophic errors.  You usually cannot recover from
                    868:  * these without a full board reset.
                    869:  */
                    870: register ERROR {
                    871:        address                 0x092
                    872:        access_mode RO
                    873:        field   CIOPARERR       0x80    /* Ultra2 only */
                    874:        field   PCIERRSTAT      0x40    /* PCI only */
                    875:        field   MPARERR         0x20    /* PCI only */
                    876:        field   DPARERR         0x10    /* PCI only */
                    877:        field   SQPARERR        0x08
                    878:        field   ILLOPCODE       0x04
                    879:        field   ILLSADDR        0x02
                    880:        field   ILLHADDR        0x01
                    881: }
                    882:
                    883: /*
                    884:  * Clear Interrupt Status (p. 3-52)
                    885:  */
                    886: register CLRINT {
                    887:        address                 0x092
                    888:        access_mode WO
                    889:        field   CLRPARERR       0x10    /* PCI only */
                    890:        field   CLRBRKADRINT    0x08
                    891:        field   CLRSCSIINT      0x04
                    892:        field   CLRCMDINT       0x02
                    893:        field   CLRSEQINT       0x01
                    894: }
                    895:
                    896: register DFCNTRL {
                    897:        address                 0x093
                    898:        access_mode RW
                    899:        field   PRELOADEN       0x80    /* aic7890 only */
                    900:        field   WIDEODD         0x40
                    901:        field   SCSIEN          0x20
                    902:        field   SDMAEN          0x10
                    903:        field   SDMAENACK       0x10
                    904:        field   HDMAEN          0x08
                    905:        field   HDMAENACK       0x08
                    906:        field   DIRECTION       0x04
                    907:        field   FIFOFLUSH       0x02
                    908:        field   FIFORESET       0x01
                    909: }
                    910:
                    911: register DFSTATUS {
                    912:        address                 0x094
                    913:        access_mode RO
                    914:        field   PRELOAD_AVAIL   0x80
                    915:        field   DFCACHETH       0x40
                    916:        field   FIFOQWDEMP      0x20
                    917:        field   MREQPEND        0x10
                    918:        field   HDONE           0x08
                    919:        field   DFTHRESH        0x04
                    920:        field   FIFOFULL        0x02
                    921:        field   FIFOEMP         0x01
                    922: }
                    923:
                    924: register DFWADDR {
                    925:        address                 0x95
                    926:        access_mode RW
                    927: }
                    928:
                    929: register DFRADDR {
                    930:        address                 0x97
                    931:        access_mode RW
                    932: }
                    933:
                    934: register DFDAT {
                    935:        address                 0x099
                    936:        access_mode RW
                    937: }
                    938:
                    939: /*
                    940:  * SCB Auto Increment (p. 3-59)
                    941:  * Byte offset into the SCB Array and an optional bit to allow auto
                    942:  * incrementing of the address during download and upload operations
                    943:  */
                    944: register SCBCNT {
                    945:        address                 0x09a
                    946:        access_mode RW
                    947:        field   SCBAUTO         0x80
                    948:        mask    SCBCNT_MASK     0x1f
                    949: }
                    950:
                    951: /*
                    952:  * Queue In FIFO (p. 3-60)
                    953:  * Input queue for queued SCBs (commands that the sequencer has yet to start)
                    954:  */
                    955: register QINFIFO {
                    956:        address                 0x09b
                    957:        access_mode RW
                    958: }
                    959:
                    960: /*
                    961:  * Queue In Count (p. 3-60)
                    962:  * Number of queued SCBs
                    963:  */
                    964: register QINCNT        {
                    965:        address                 0x09c
                    966:        access_mode RO
                    967: }
                    968:
                    969: /*
                    970:  * Queue Out FIFO (p. 3-61)
                    971:  * Queue of SCBs that have completed and await the host
                    972:  */
                    973: register QOUTFIFO {
                    974:        address                 0x09d
                    975:        access_mode WO
                    976: }
                    977:
                    978: register CRCCONTROL1 {
                    979:        address                 0x09d
                    980:        access_mode RW
                    981:        field   CRCONSEEN               0x80
                    982:        field   CRCVALCHKEN             0x40
                    983:        field   CRCENDCHKEN             0x20
                    984:        field   CRCREQCHKEN             0x10
                    985:        field   TARGCRCENDEN            0x08
                    986:        field   TARGCRCCNTEN            0x04
                    987: }
                    988:
                    989:
                    990: /*
                    991:  * Queue Out Count (p. 3-61)
                    992:  * Number of queued SCBs in the Out FIFO
                    993:  */
                    994: register QOUTCNT {
                    995:        address                 0x09e
                    996:        access_mode RO
                    997: }
                    998:
                    999: register SCSIPHASE {
                   1000:        address                 0x09e
                   1001:        access_mode RO
                   1002:        field   STATUS_PHASE    0x20
                   1003:        field   COMMAND_PHASE   0x10
                   1004:        field   MSG_IN_PHASE    0x08
                   1005:        field   MSG_OUT_PHASE   0x04
                   1006:        field   DATA_IN_PHASE   0x02
                   1007:        field   DATA_OUT_PHASE  0x01
                   1008:        mask    DATA_PHASE_MASK 0x03
                   1009: }
                   1010:
                   1011: /*
                   1012:  * Special Function
                   1013:  */
                   1014: register SFUNCT {
                   1015:        address                 0x09f
                   1016:        access_mode RW
                   1017:        field   ALT_MODE        0x80
                   1018: }
                   1019:
                   1020: /*
                   1021:  * SCB Definition (p. 5-4)
                   1022:  */
                   1023: scb {
                   1024:        address         0x0a0
                   1025:        size            64
                   1026:
                   1027:        SCB_CDB_PTR {
                   1028:                size    4
                   1029:                alias   SCB_RESIDUAL_DATACNT
                   1030:                alias   SCB_CDB_STORE
                   1031:        }
                   1032:        SCB_RESIDUAL_SGPTR {
                   1033:                size    4
                   1034:        }
                   1035:        SCB_SCSI_STATUS {
                   1036:                size    1
                   1037:        }
                   1038:        SCB_TARGET_PHASES {
                   1039:                size    1
                   1040:        }
                   1041:        SCB_TARGET_DATA_DIR {
                   1042:                size    1
                   1043:        }
                   1044:        SCB_TARGET_ITAG {
                   1045:                size    1
                   1046:        }
                   1047:        SCB_DATAPTR {
                   1048:                size    4
                   1049:        }
                   1050:        SCB_DATACNT {
                   1051:                /*
                   1052:                 * The last byte is really the high address bits for
                   1053:                 * the data address.
                   1054:                 */
                   1055:                size    4
                   1056:                field   SG_LAST_SEG             0x80    /* In the fourth byte */
                   1057:                mask    SG_HIGH_ADDR_BITS       0x7F    /* In the fourth byte */
                   1058:        }
                   1059:        SCB_SGPTR {
                   1060:                size    4
                   1061:                field   SG_RESID_VALID  0x04    /* In the first byte */
                   1062:                field   SG_FULL_RESID   0x02    /* In the first byte */
                   1063:                field   SG_LIST_NULL    0x01    /* In the first byte */
                   1064:        }
                   1065:        SCB_CONTROL {
                   1066:                size    1
                   1067:                field   TARGET_SCB                      0x80
                   1068:                field   STATUS_RCVD                     0x80
                   1069:                field   DISCENB                         0x40
                   1070:                field   TAG_ENB                         0x20
                   1071:                field   MK_MESSAGE                      0x10
                   1072:                field   ULTRAENB                        0x08
                   1073:                field   DISCONNECTED                    0x04
                   1074:                mask    SCB_TAG_TYPE                    0x03
                   1075:        }
                   1076:        SCB_SCSIID {
                   1077:                size    1
                   1078:                field   TWIN_CHNLB                      0x80
                   1079:                mask    TWIN_TID                        0x70
                   1080:                mask    TID                             0xf0
                   1081:                mask    OID                             0x0f
                   1082:        }
                   1083:        SCB_LUN {
                   1084:                field   SCB_XFERLEN_ODD                 0x80
                   1085:                mask    LID                             0x3f
                   1086:                size    1
                   1087:        }
                   1088:        SCB_TAG {
                   1089:                size    1
                   1090:        }
                   1091:        SCB_CDB_LEN {
                   1092:                size    1
                   1093:        }
                   1094:        SCB_SCSIRATE {
                   1095:                size    1
                   1096:        }
                   1097:        SCB_SCSIOFFSET {
                   1098:                size    1
                   1099:        }
                   1100:        SCB_NEXT {
                   1101:                size    1
                   1102:        }
                   1103:        SCB_64_SPARE {
                   1104:                size    16
                   1105:        }
                   1106:        SCB_64_BTT {
                   1107:                size    16
                   1108:        }
                   1109: }
                   1110:
                   1111: const  SCB_UPLOAD_SIZE         32
                   1112: const  SCB_DOWNLOAD_SIZE       32
                   1113: const  SCB_DOWNLOAD_SIZE_64    48
                   1114:
                   1115: const  SG_SIZEOF       0x08            /* sizeof(struct ahc_dma) */
                   1116:
                   1117: /* --------------------- AHA-2840-only definitions -------------------- */
                   1118:
                   1119: register SEECTL_2840 {
                   1120:        address                 0x0c0
                   1121:        access_mode RW
                   1122:        field   CS_2840         0x04
                   1123:        field   CK_2840         0x02
                   1124:        field   DO_2840         0x01
                   1125: }
                   1126:
                   1127: register STATUS_2840 {
                   1128:        address                 0x0c1
                   1129:        access_mode RW
                   1130:        field   EEPROM_TF       0x80
                   1131:        mask    BIOS_SEL        0x60
                   1132:        mask    ADSEL           0x1e
                   1133:        field   DI_2840         0x01
                   1134: }
                   1135:
                   1136: /* --------------------- AIC-7870-only definitions -------------------- */
                   1137:
                   1138: register CCHADDR {
                   1139:        address                 0x0E0
                   1140:        size 8
                   1141: }
                   1142:
                   1143: register CCHCNT {
                   1144:        address                 0x0E8
                   1145: }
                   1146:
                   1147: register CCSGRAM {
                   1148:        address                 0x0E9
                   1149: }
                   1150:
                   1151: register CCSGADDR {
                   1152:        address                 0x0EA
                   1153: }
                   1154:
                   1155: register CCSGCTL {
                   1156:        address                 0x0EB
                   1157:        field   CCSGDONE        0x80
                   1158:        field   CCSGEN          0x08
                   1159:        field   SG_FETCH_NEEDED 0x02    /* Bit used for software state */
                   1160:        field   CCSGRESET       0x01
                   1161: }
                   1162:
                   1163: register CCSCBCNT {
                   1164:        address                 0xEF
                   1165: }
                   1166:
                   1167: register CCSCBCTL {
                   1168:        address                 0x0EE
                   1169:        field   CCSCBDONE       0x80
                   1170:        field   ARRDONE         0x40    /* SCB Array prefetch done */
                   1171:        field   CCARREN         0x10
                   1172:        field   CCSCBEN         0x08
                   1173:        field   CCSCBDIR        0x04
                   1174:        field   CCSCBRESET      0x01
                   1175: }
                   1176:
                   1177: register CCSCBADDR {
                   1178:        address                 0x0ED
                   1179: }
                   1180:
                   1181: register CCSCBRAM {
                   1182:        address                 0xEC
                   1183: }
                   1184:
                   1185: /*
                   1186:  * SCB bank address (7895/7896/97 only)
                   1187:  */
                   1188: register SCBBADDR {
                   1189:        address                 0x0F0
                   1190:        access_mode RW
                   1191: }
                   1192:
                   1193: register CCSCBPTR {
                   1194:        address                 0x0F1
                   1195: }
                   1196:
                   1197: register HNSCB_QOFF {
                   1198:        address                 0x0F4
                   1199: }
                   1200:
                   1201: register SNSCB_QOFF {
                   1202:        address                 0x0F6
                   1203: }
                   1204:
                   1205: register SDSCB_QOFF {
                   1206:        address                 0x0F8
                   1207: }
                   1208:
                   1209: register QOFF_CTLSTA {
                   1210:        address                 0x0FA
                   1211:        field   SCB_AVAIL       0x40
                   1212:        field   SNSCB_ROLLOVER  0x20
                   1213:        field   SDSCB_ROLLOVER  0x10
                   1214:        mask    SCB_QSIZE       0x07
                   1215:        mask    SCB_QSIZE_256   0x06
                   1216: }
                   1217:
                   1218: register DFF_THRSH {
                   1219:        address                 0x0FB
                   1220:        mask    WR_DFTHRSH      0x70
                   1221:        mask    RD_DFTHRSH      0x07
                   1222:        mask    RD_DFTHRSH_MIN  0x00
                   1223:        mask    RD_DFTHRSH_25   0x01
                   1224:        mask    RD_DFTHRSH_50   0x02
                   1225:        mask    RD_DFTHRSH_63   0x03
                   1226:        mask    RD_DFTHRSH_75   0x04
                   1227:        mask    RD_DFTHRSH_85   0x05
                   1228:        mask    RD_DFTHRSH_90   0x06
                   1229:        mask    RD_DFTHRSH_MAX  0x07
                   1230:        mask    WR_DFTHRSH_MIN  0x00
                   1231:        mask    WR_DFTHRSH_25   0x10
                   1232:        mask    WR_DFTHRSH_50   0x20
                   1233:        mask    WR_DFTHRSH_63   0x30
                   1234:        mask    WR_DFTHRSH_75   0x40
                   1235:        mask    WR_DFTHRSH_85   0x50
                   1236:        mask    WR_DFTHRSH_90   0x60
                   1237:        mask    WR_DFTHRSH_MAX  0x70
                   1238: }
                   1239:
                   1240: register SG_CACHE_PRE {
                   1241:        access_mode WO
                   1242:        address                 0x0fc
                   1243:        mask    SG_ADDR_MASK    0xf8
                   1244:        field   LAST_SEG        0x02
                   1245:        field   LAST_SEG_DONE   0x01
                   1246: }
                   1247:
                   1248: register SG_CACHE_SHADOW {
                   1249:        access_mode RO
                   1250:        address                 0x0fc
                   1251:        mask    SG_ADDR_MASK    0xf8
                   1252:        field   LAST_SEG        0x02
                   1253:        field   LAST_SEG_DONE   0x01
                   1254: }
                   1255: /* ---------------------- Scratch RAM Offsets ------------------------- */
                   1256: /* These offsets are either to values that are initialized by the board's
                   1257:  * BIOS or are specified by the sequencer code.
                   1258:  *
                   1259:  * The host adapter card (at least the BIOS) uses 20-2f for SCSI
                   1260:  * device information, 32-33 and 5a-5f as well. As it turns out, the
                   1261:  * BIOS trashes 20-2f, writing the synchronous negotiation results
                   1262:  * on top of the BIOS values, so we re-use those for our per-target
                   1263:  * scratchspace (actually a value that can be copied directly into
                   1264:  * SCSIRATE).  The kernel driver will enable synchronous negotiation
                   1265:  * for all targets that have a value other than 0 in the lower four
                   1266:  * bits of the target scratch space.  This should work regardless of
                   1267:  * whether the bios has been installed.
                   1268:  */
                   1269:
                   1270: scratch_ram {
                   1271:        address         0x020
                   1272:        size            58
                   1273:
                   1274:        /*
                   1275:         * 1 byte per target starting at this address for configuration values
                   1276:         */
                   1277:        BUSY_TARGETS {
                   1278:                alias           TARG_SCSIRATE
                   1279:                size            16
                   1280:        }
                   1281:        /*
                   1282:         * Bit vector of targets that have ULTRA enabled as set by
                   1283:         * the BIOS.  The Sequencer relies on a per-SCB field to
                   1284:         * control whether to enable Ultra transfers or not.  During
                   1285:         * initialization, we read this field and reuse it for 2
                   1286:         * entries in the busy target table.
                   1287:         */
                   1288:        ULTRA_ENB {
                   1289:                alias           CMDSIZE_TABLE
                   1290:                size            2
                   1291:        }
                   1292:        /*
                   1293:         * Bit vector of targets that have disconnection disabled as set by
                   1294:         * the BIOS.  The Sequencer relies in a per-SCB field to control the
                   1295:         * disconnect priveldge.  During initialization, we read this field
                   1296:         * and reuse it for 2 entries in the busy target table.
                   1297:         */
                   1298:        DISC_DSB {
                   1299:                size            2
                   1300:        }
                   1301:        CMDSIZE_TABLE_TAIL {
                   1302:                size            4
                   1303:        }
                   1304:        /*
                   1305:         * Partial transfer past cacheline end to be
                   1306:         * transferred using an extra S/G.
                   1307:         */
                   1308:        MWI_RESIDUAL {
                   1309:                size            1
                   1310:        }
                   1311:        /*
                   1312:         * SCBID of the next SCB to be started by the controller.
                   1313:         */
                   1314:        NEXT_QUEUED_SCB {
                   1315:                size            1
                   1316:        }
                   1317:        /*
                   1318:         * Single byte buffer used to designate the type or message
                   1319:         * to send to a target.
                   1320:         */
                   1321:        MSG_OUT {
                   1322:                size            1
                   1323:        }
                   1324:        /* Parameters for DMA Logic */
                   1325:        DMAPARAMS {
                   1326:                size            1
                   1327:                field   PRELOADEN       0x80
                   1328:                field   WIDEODD         0x40
                   1329:                field   SCSIEN          0x20
                   1330:                field   SDMAEN          0x10
                   1331:                field   SDMAENACK       0x10
                   1332:                field   HDMAEN          0x08
                   1333:                field   HDMAENACK       0x08
                   1334:                field   DIRECTION       0x04    /* Set indicates PCI->SCSI */
                   1335:                field   FIFOFLUSH       0x02
                   1336:                field   FIFORESET       0x01
                   1337:        }
                   1338:        SEQ_FLAGS {
                   1339:                size            1
                   1340:                field   NOT_IDENTIFIED          0x80
                   1341:                field   NO_CDB_SENT             0x40
                   1342:                field   TARGET_CMD_IS_TAGGED    0x40
                   1343:                field   DPHASE                  0x20
                   1344:                /* Target flags */
                   1345:                field   TARG_CMD_PENDING        0x10
                   1346:                field   CMDPHASE_PENDING        0x08
                   1347:                field   DPHASE_PENDING          0x04
                   1348:                field   SPHASE_PENDING          0x02
                   1349:                field   NO_DISCONNECT           0x01
                   1350:        }
                   1351:        /*
                   1352:         * Temporary storage for the
                   1353:         * target/channel/lun of a
                   1354:         * reconnecting target
                   1355:         */
                   1356:        SAVED_SCSIID {
                   1357:                size            1
                   1358:        }
                   1359:        SAVED_LUN {
                   1360:                size            1
                   1361:        }
                   1362:        /*
                   1363:         * The last bus phase as seen by the sequencer.
                   1364:         */
                   1365:        LASTPHASE {
                   1366:                size            1
                   1367:                field   CDI             0x80
                   1368:                field   IOI             0x40
                   1369:                field   MSGI            0x20
                   1370:                mask    PHASE_MASK      CDI|IOI|MSGI
                   1371:                mask    P_DATAOUT       0x00
                   1372:                mask    P_DATAIN        IOI
                   1373:                mask    P_COMMAND       CDI
                   1374:                mask    P_MESGOUT       CDI|MSGI
                   1375:                mask    P_STATUS        CDI|IOI
                   1376:                mask    P_MESGIN        CDI|IOI|MSGI
                   1377:                mask    P_BUSFREE       0x01
                   1378:        }
                   1379:        /*
                   1380:         * head of list of SCBs awaiting
                   1381:         * selection
                   1382:         */
                   1383:        WAITING_SCBH {
                   1384:                size            1
                   1385:        }
                   1386:        /*
                   1387:         * head of list of SCBs that are
                   1388:         * disconnected.  Used for SCB
                   1389:         * paging.
                   1390:         */
                   1391:        DISCONNECTED_SCBH {
                   1392:                size            1
                   1393:        }
                   1394:        /*
                   1395:         * head of list of SCBs that are
                   1396:         * not in use.  Used for SCB paging.
                   1397:         */
                   1398:        FREE_SCBH {
                   1399:                size            1
                   1400:        }
                   1401:        /*
                   1402:         * head of list of SCBs that have
                   1403:         * completed but have not been
                   1404:         * put into the qoutfifo.
                   1405:         */
                   1406:        COMPLETE_SCBH {
                   1407:                size            1
                   1408:        }
                   1409:        /*
                   1410:         * Address of the hardware scb array in the host.
                   1411:         */
                   1412:        HSCB_ADDR {
                   1413:                size            4
                   1414:        }
                   1415:        /*
                   1416:         * Base address of our shared data with the kernel driver in host
                   1417:         * memory.  This includes the qoutfifo and target mode
                   1418:         * incoming command queue.
                   1419:         */
                   1420:        SHARED_DATA_ADDR {
                   1421:                size            4
                   1422:        }
                   1423:        KERNEL_QINPOS {
                   1424:                size            1
                   1425:        }
                   1426:        QINPOS {
                   1427:                size            1
                   1428:        }
                   1429:        QOUTPOS {
                   1430:                size            1
                   1431:        }
                   1432:        /*
                   1433:         * Kernel and sequencer offsets into the queue of
                   1434:         * incoming target mode command descriptors.  The
                   1435:         * queue is full when the KERNEL_TQINPOS == TQINPOS.
                   1436:         */
                   1437:        KERNEL_TQINPOS {
                   1438:                size            1
                   1439:        }
                   1440:        TQINPOS {
                   1441:                size            1
                   1442:        }
                   1443:        ARG_1 {
                   1444:                size            1
                   1445:                mask    SEND_MSG                0x80
                   1446:                mask    SEND_SENSE              0x40
                   1447:                mask    SEND_REJ                0x20
                   1448:                mask    MSGOUT_PHASEMIS         0x10
                   1449:                mask    EXIT_MSG_LOOP           0x08
                   1450:                mask    CONT_MSG_LOOP           0x04
                   1451:                mask    CONT_TARG_SESSION       0x02
                   1452:                alias   RETURN_1
                   1453:        }
                   1454:        ARG_2 {
                   1455:                size            1
                   1456:                alias   RETURN_2
                   1457:        }
                   1458:
                   1459:        /*
                   1460:         * Snapshot of MSG_OUT taken after each message is sent.
                   1461:         */
                   1462:        LAST_MSG {
                   1463:                size            1
                   1464:                alias   TARG_IMMEDIATE_SCB
                   1465:        }
                   1466:
                   1467:        /*
                   1468:         * Sequences the kernel driver has okayed for us.  This allows
                   1469:         * the driver to do things like prevent initiator or target
                   1470:         * operations.
                   1471:         */
                   1472:        SCSISEQ_TEMPLATE {
                   1473:                size            1
                   1474:                field   ENSELO          0x40
                   1475:                field   ENSELI          0x20
                   1476:                field   ENRSELI         0x10
                   1477:                field   ENAUTOATNO      0x08
                   1478:                field   ENAUTOATNI      0x04
                   1479:                field   ENAUTOATNP      0x02
                   1480:        }
                   1481: }
                   1482:
                   1483: scratch_ram {
                   1484:        address         0x056
                   1485:        size            4
                   1486:        /*
                   1487:         * These scratch ram locations are initialized by the 274X BIOS.
                   1488:         * We reuse them after capturing the BIOS settings during
                   1489:         * initialization.
                   1490:         */
                   1491:
                   1492:        /*
                   1493:         * The initiator specified tag for this target mode transaction.
                   1494:         */
                   1495:        HA_274_BIOSGLOBAL {
                   1496:                size    1
                   1497:                field   HA_274_EXTENDED_TRANS   0x01
                   1498:                alias   INITIATOR_TAG
                   1499:        }
                   1500:
                   1501:        SEQ_FLAGS2 {
                   1502:                size    1
                   1503:                field   SCB_DMA                 0x01
                   1504:                field   TARGET_MSG_PENDING      0x02
                   1505:        }
                   1506: }
                   1507:
                   1508: scratch_ram {
                   1509:        address         0x05a
                   1510:        size            6
                   1511:        /*
                   1512:         * These are reserved registers in the card's scratch ram on the 2742.
                   1513:         * The EISA configuraiton chip is mapped here.  On Rev E. of the
                   1514:         * aic7770, the sequencer can use this area for scratch, but the
                   1515:         * host cannot directly access these registers.  On later chips, this
                   1516:         * area can be read and written by both the host and the sequencer.
                   1517:         * Even on later chips, many of these locations are initialized by
                   1518:         * the BIOS.
                   1519:         */
                   1520:        SCSICONF {
                   1521:                size            1
                   1522:                field   TERM_ENB        0x80
                   1523:                field   RESET_SCSI      0x40
                   1524:                field   ENSPCHK         0x20
                   1525:                mask    HSCSIID         0x07    /* our SCSI ID */
                   1526:                mask    HWSCSIID        0x0f    /* our SCSI ID if Wide Bus */
                   1527:        }
                   1528:        INTDEF {
                   1529:                address         0x05c
                   1530:                size            1
                   1531:                field   EDGE_TRIG       0x80
                   1532:                mask    VECTOR          0x0f
                   1533:        }
                   1534:        HOSTCONF {
                   1535:                address         0x05d
                   1536:                size            1
                   1537:        }
                   1538:        HA_274_BIOSCTRL {
                   1539:                address         0x05f
                   1540:                size            1
                   1541:                mask    BIOSMODE                0x30
                   1542:                mask    BIOSDISABLED            0x30
                   1543:                field   CHANNEL_B_PRIMARY       0x08
                   1544:        }
                   1545: }
                   1546:
                   1547: scratch_ram {
                   1548:        address         0x070
                   1549:        size            16
                   1550:
                   1551:        /*
                   1552:         * Per target SCSI offset values for Ultra2 controllers.
                   1553:         */
                   1554:        TARG_OFFSET {
                   1555:                size            16
                   1556:        }
                   1557: }
                   1558:
                   1559: const TID_SHIFT                4
                   1560: const SCB_LIST_NULL    0xff
                   1561: const TARGET_CMD_CMPLT 0xfe
                   1562:
                   1563: const CCSGADDR_MAX     0x80
                   1564: const CCSGRAM_MAXSEGS  16
                   1565:
                   1566: /* WDTR Message values */
                   1567: const BUS_8_BIT                        0x00
                   1568: const BUS_16_BIT               0x01
                   1569: const BUS_32_BIT               0x02
                   1570:
                   1571: /* Offset maximums */
                   1572: const MAX_OFFSET_8BIT          0x0f
                   1573: const MAX_OFFSET_16BIT         0x08
                   1574: const MAX_OFFSET_ULTRA2                0x7f
                   1575: const MAX_OFFSET               0x7f
                   1576: const HOST_MSG                 0xff
                   1577:
                   1578: /* Target mode command processing constants */
                   1579: const CMD_GROUP_CODE_SHIFT     0x05
                   1580:
                   1581: const STATUS_BUSY              0x08
                   1582: const STATUS_QUEUE_FULL        0x28
                   1583: const TARGET_DATA_IN           1
                   1584:
                   1585: /*
                   1586:  * Downloaded (kernel inserted) constants
                   1587:  */
                   1588: /* Offsets into the SCBID array where different data is stored */
                   1589: const QOUTFIFO_OFFSET download
                   1590: const QINFIFO_OFFSET download
                   1591: const CACHESIZE_MASK download
                   1592: const INVERTED_CACHESIZE_MASK download
                   1593: const SG_PREFETCH_CNT download
                   1594: const SG_PREFETCH_ALIGN_MASK download
                   1595: const SG_PREFETCH_ADDR_MASK download

CVSweb