linux/drivers/scsi/aic7xxx_old/aic7xxx.reg
<<
>>
Prefs
   1/*
   2 * Aic7xxx register and scratch ram definitions.
   3 *
   4 * Copyright (c) 1994-1998 Justin Gibbs.
   5 * All rights reserved.
   6 *
   7 * Redistribution and use in source and binary forms, with or without
   8 * modification, are permitted provided that the following conditions
   9 * are met:
  10 * 1. Redistributions of source code must retain the above copyright
  11 *    notice, this list of conditions, and the following disclaimer,
  12 *    without modification, immediately at the beginning of the file.
  13 * 2. The name of the author may not be used to endorse or promote products
  14 *    derived from this software without specific prior written permission.
  15 *
  16 * Where this Software is combined with software released under the terms of 
  17 * the GNU General Public License ("GPL") and the terms of the GPL would require the 
  18 * combined work to also be released under the terms of the GPL, the terms
  19 * and conditions of this License will apply in addition to those of the
  20 * GPL with the exception of any terms or conditions of this License that
  21 * conflict with, or are expressly prohibited by, the GPL.
  22 *
  23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  26 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
  27 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  33 * SUCH DAMAGE.
  34 *
  35 *      $Id: aic7xxx.reg,v 1.4 1997/06/27 19:38:39 gibbs Exp $
  36 */
  37
  38/*
  39 * This file is processed by the aic7xxx_asm utility for use in assembling
  40 * firmware for the aic7xxx family of SCSI host adapters as well as to generate
  41 * a C header file for use in the kernel portion of the Aic7xxx driver.
  42 *
  43 * All page numbers refer to the Adaptec AIC-7770 Data Book available from
  44 * Adaptec's Technical Documents Department 1-800-934-2766
  45 */
  46
  47/*
  48 * SCSI Sequence Control (p. 3-11).
  49 * Each bit, when set starts a specific SCSI sequence on the bus
  50 */
  51register SCSISEQ {
  52        address                 0x000
  53        access_mode RW
  54        bit     TEMODE          0x80
  55        bit     ENSELO          0x40
  56        bit     ENSELI          0x20
  57        bit     ENRSELI         0x10
  58        bit     ENAUTOATNO      0x08
  59        bit     ENAUTOATNI      0x04
  60        bit     ENAUTOATNP      0x02
  61        bit     SCSIRSTO        0x01
  62}
  63
  64/*
  65 * SCSI Transfer Control 0 Register (pp. 3-13).
  66 * Controls the SCSI module data path.
  67 */
  68register SXFRCTL0 {
  69        address                 0x001
  70        access_mode RW
  71        bit     DFON            0x80
  72        bit     DFPEXP          0x40
  73        bit     FAST20          0x20
  74        bit     CLRSTCNT        0x10
  75        bit     SPIOEN          0x08
  76        bit     SCAMEN          0x04
  77        bit     CLRCHN          0x02
  78}
  79
  80/*
  81 * SCSI Transfer Control 1 Register (pp. 3-14,15).
  82 * Controls the SCSI module data path.
  83 */
  84register SXFRCTL1 {
  85        address                 0x002
  86        access_mode RW
  87        bit     BITBUCKET       0x80
  88        bit     SWRAPEN         0x40
  89        bit     ENSPCHK         0x20
  90        mask    STIMESEL        0x18
  91        bit     ENSTIMER        0x04
  92        bit     ACTNEGEN        0x02
  93        bit     STPWEN          0x01    /* Powered Termination */
  94}
  95
  96/*
  97 * SCSI Control Signal Read Register (p. 3-15).
  98 * Reads the actual state of the SCSI bus pins
  99 */
 100register SCSISIGI {
 101        address                 0x003
 102        access_mode RO
 103        bit     CDI             0x80
 104        bit     IOI             0x40
 105        bit     MSGI            0x20
 106        bit     ATNI            0x10
 107        bit     SELI            0x08
 108        bit     BSYI            0x04
 109        bit     REQI            0x02
 110        bit     ACKI            0x01
 111/*
 112 * Possible phases in SCSISIGI
 113 */
 114        mask    PHASE_MASK      CDI|IOI|MSGI
 115        mask    P_DATAOUT       0x00
 116        mask    P_DATAIN        IOI
 117        mask    P_COMMAND       CDI
 118        mask    P_MESGOUT       CDI|MSGI
 119        mask    P_STATUS        CDI|IOI
 120        mask    P_MESGIN        CDI|IOI|MSGI
 121}
 122
 123/*
 124 * SCSI Control Signal Write Register (p. 3-16).
 125 * Writing to this register modifies the control signals on the bus.  Only
 126 * those signals that are allowed in the current mode (Initiator/Target) are
 127 * asserted.
 128 */
 129register SCSISIGO {
 130        address                 0x003
 131        access_mode WO
 132        bit     CDO             0x80
 133        bit     IOO             0x40
 134        bit     MSGO            0x20
 135        bit     ATNO            0x10
 136        bit     SELO            0x08
 137        bit     BSYO            0x04
 138        bit     REQO            0x02
 139        bit     ACKO            0x01
 140/*
 141 * Possible phases to write into SCSISIG0
 142 */
 143        mask    PHASE_MASK      CDI|IOI|MSGI
 144        mask    P_DATAOUT       0x00
 145        mask    P_DATAIN        IOI
 146        mask    P_COMMAND       CDI
 147        mask    P_MESGOUT       CDI|MSGI
 148        mask    P_STATUS        CDI|IOI
 149        mask    P_MESGIN        CDI|IOI|MSGI
 150}
 151
 152/* 
 153 * SCSI Rate Control (p. 3-17).
 154 * Contents of this register determine the Synchronous SCSI data transfer
 155 * rate and the maximum synchronous Req/Ack offset.  An offset of 0 in the
 156 * SOFS (3:0) bits disables synchronous data transfers.  Any offset value
 157 * greater than 0 enables synchronous transfers.
 158 */
 159register SCSIRATE {
 160        address                 0x004
 161        access_mode RW
 162        bit     WIDEXFER        0x80            /* Wide transfer control */
 163        mask    SXFR            0x70            /* Sync transfer rate */
 164        mask    SXFR_ULTRA2     0x7f            /* Sync transfer rate */
 165        mask    SOFS            0x0f            /* Sync offset */
 166}
 167
 168/*
 169 * SCSI ID (p. 3-18).
 170 * Contains the ID of the board and the current target on the
 171 * selected channel.
 172 */
 173register SCSIID {
 174        address                 0x005
 175        access_mode RW
 176        mask    TID             0xf0            /* Target ID mask */
 177        mask    OID             0x0f            /* Our ID mask */
 178        /*
 179         * SCSI Maximum Offset (p. 4-61 aic7890/91 Data Book)
 180         * The aic7890/91 allow an offset of up to 127 transfers in both wide
 181         * and narrow mode.
 182         */
 183        alias   SCSIOFFSET
 184        mask    SOFS_ULTRA2     0x7f            /* Sync offset U2 chips */
 185}
 186
 187/*
 188 * SCSI Latched Data (p. 3-19).
 189 * Read/Write latches used to transfer data on the SCSI bus during
 190 * Automatic or Manual PIO mode.  SCSIDATH can be used for the
 191 * upper byte of a 16bit wide asynchronouse data phase transfer.
 192 */
 193register SCSIDATL {
 194        address                 0x006
 195        access_mode RW
 196}
 197
 198register SCSIDATH {
 199        address                 0x007
 200        access_mode RW
 201}
 202
 203/*
 204 * SCSI Transfer Count (pp. 3-19,20)
 205 * These registers count down the number of bytes transferred
 206 * across the SCSI bus.  The counter is decremented only once
 207 * the data has been safely transferred.  SDONE in SSTAT0 is
 208 * set when STCNT goes to 0
 209 */ 
 210register STCNT {
 211        address                 0x008
 212        size    3
 213        access_mode RW
 214}
 215
 216/*
 217 * Option Mode Register (Alternate Mode) (p. 5-198)
 218 * This register is used to set certain options on Ultra3 based chips.
 219 * The chip must be in alternate mode (bit ALT_MODE in SFUNCT must be set)
 220 */
 221register OPTIONMODE {
 222        address                 0x008
 223        access_mode RW
 224        bit     AUTORATEEN      0x80
 225        bit     AUTOACKEN       0x40
 226        bit     ATNMGMNTEN      0x20
 227        bit     BUSFREEREV      0x10
 228        bit     EXPPHASEDIS     0x08
 229        bit     SCSIDATL_IMGEN  0x04
 230        bit     AUTO_MSGOUT_DE  0x02
 231        bit     DIS_MSGIN_DUALEDGE      0x01
 232}
 233
 234
 235/*
 236 * Clear SCSI Interrupt 0 (p. 3-20)
 237 * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT0.
 238 */
 239register CLRSINT0 {
 240        address                 0x00b
 241        access_mode WO
 242        bit     CLRSELDO        0x40
 243        bit     CLRSELDI        0x20
 244        bit     CLRSELINGO      0x10
 245        bit     CLRSWRAP        0x08
 246        bit     CLRSPIORDY      0x02
 247}
 248
 249/*
 250 * SCSI Status 0 (p. 3-21)
 251 * Contains one set of SCSI Interrupt codes
 252 * These are most likely of interest to the sequencer
 253 */
 254register SSTAT0 {
 255        address                 0x00b
 256        access_mode RO
 257        bit     TARGET          0x80    /* Board acting as target */
 258        bit     SELDO           0x40    /* Selection Done */
 259        bit     SELDI           0x20    /* Board has been selected */
 260        bit     SELINGO         0x10    /* Selection In Progress */
 261        bit     SWRAP           0x08    /* 24bit counter wrap */
 262        bit     IOERR           0x08    /* LVD Tranceiver mode changed */
 263        bit     SDONE           0x04    /* STCNT = 0x000000 */
 264        bit     SPIORDY         0x02    /* SCSI PIO Ready */
 265        bit     DMADONE         0x01    /* DMA transfer completed */
 266}
 267
 268/*
 269 * Clear SCSI Interrupt 1 (p. 3-23)
 270 * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT1.
 271 */
 272register CLRSINT1 {
 273        address                 0x00c
 274        access_mode WO
 275        bit     CLRSELTIMEO     0x80
 276        bit     CLRATNO         0x40
 277        bit     CLRSCSIRSTI     0x20
 278        bit     CLRBUSFREE      0x08
 279        bit     CLRSCSIPERR     0x04
 280        bit     CLRPHASECHG     0x02
 281        bit     CLRREQINIT      0x01
 282}
 283
 284/*
 285 * SCSI Status 1 (p. 3-24)
 286 */
 287register SSTAT1 {
 288        address                 0x00c
 289        access_mode RO
 290        bit     SELTO           0x80
 291        bit     ATNTARG         0x40
 292        bit     SCSIRSTI        0x20
 293        bit     PHASEMIS        0x10
 294        bit     BUSFREE         0x08
 295        bit     SCSIPERR        0x04
 296        bit     PHASECHG        0x02
 297        bit     REQINIT         0x01
 298}
 299
 300/*
 301 * SCSI Status 2 (pp. 3-25,26)
 302 */
 303register SSTAT2 {
 304        address                 0x00d
 305        access_mode RO
 306        bit     OVERRUN         0x80
 307        bit     SHVALID         0x40
 308        bit     WIDE_RES        0x20
 309        bit     EXP_ACTIVE      0x10    /* SCSI Expander Active */
 310        bit     CRCVALERR       0x08    /* CRC Value Error */
 311        bit     CRCENDERR       0x04    /* CRC End Error */
 312        bit     CRCREQERR       0x02    /* CRC REQ Error */
 313        bit     DUAL_EDGE_ERROR 0x01    /* Invalid pins for Dual Edge phase */
 314        mask    SFCNT           0x1f
 315}
 316
 317/*
 318 * SCSI Status 3 (p. 3-26)
 319 */
 320register SSTAT3 {
 321        address                 0x00e
 322        access_mode RO
 323        mask    SCSICNT         0xf0
 324        mask    OFFCNT          0x0f
 325}
 326
 327/*
 328 * SCSI ID for the aic7890/91 chips
 329 */
 330register SCSIID_ULTRA2 {
 331        address                 0x00f
 332        access_mode RW
 333        mask    TID             0xf0            /* Target ID mask */
 334        mask    OID             0x0f            /* Our ID mask */
 335}
 336
 337/*
 338 * SCSI Interrupt Mode 1 (p. 3-28)
 339 * Setting any bit will enable the corresponding function
 340 * in SIMODE0 to interrupt via the IRQ pin.
 341 */
 342register SIMODE0 {
 343        address                 0x010
 344        access_mode RW
 345        bit     ENSELDO         0x40
 346        bit     ENSELDI         0x20
 347        bit     ENSELINGO       0x10
 348        bit     ENSWRAP         0x08
 349        bit     ENIOERR         0x08    /* LVD Tranceiver mode changes */
 350        bit     ENSDONE         0x04
 351        bit     ENSPIORDY       0x02
 352        bit     ENDMADONE       0x01
 353}
 354
 355/*
 356 * SCSI Interrupt Mode 1 (pp. 3-28,29)
 357 * Setting any bit will enable the corresponding function
 358 * in SIMODE1 to interrupt via the IRQ pin.
 359 */
 360register SIMODE1 {
 361        address                 0x011
 362        access_mode RW
 363        bit     ENSELTIMO       0x80
 364        bit     ENATNTARG       0x40
 365        bit     ENSCSIRST       0x20
 366        bit     ENPHASEMIS      0x10
 367        bit     ENBUSFREE       0x08
 368        bit     ENSCSIPERR      0x04
 369        bit     ENPHASECHG      0x02
 370        bit     ENREQINIT       0x01
 371}
 372
 373/*
 374 * SCSI Data Bus (High) (p. 3-29)
 375 * This register reads data on the SCSI Data bus directly.
 376 */
 377register SCSIBUSL {
 378        address                 0x012
 379        access_mode RO
 380}
 381
 382register SCSIBUSH {
 383        address                 0x013
 384        access_mode RO
 385}
 386
 387/*
 388 * SCSI/Host Address (p. 3-30)
 389 * These registers hold the host address for the byte about to be
 390 * transferred on the SCSI bus.  They are counted up in the same
 391 * manner as STCNT is counted down.  SHADDR should always be used
 392 * to determine the address of the last byte transferred since HADDR
 393 * can be skewed by write ahead.
 394 */
 395register SHADDR {
 396        address                 0x014
 397        size    4
 398        access_mode RO
 399}
 400
 401/*
 402 * Selection Timeout Timer (p. 3-30)
 403 */
 404register SELTIMER {
 405        address                 0x018
 406        access_mode RW
 407        bit     STAGE6          0x20
 408        bit     STAGE5          0x10
 409        bit     STAGE4          0x08
 410        bit     STAGE3          0x04
 411        bit     STAGE2          0x02
 412        bit     STAGE1          0x01
 413}
 414
 415/*
 416 * Selection/Reselection ID (p. 3-31)
 417 * Upper four bits are the device id.  The ONEBIT is set when the re/selecting
 418 * device did not set its own ID.
 419 */
 420register SELID {
 421        address                 0x019
 422        access_mode RW
 423        mask    SELID_MASK      0xf0
 424        bit     ONEBIT          0x08
 425}
 426
 427/*
 428 * Serial Port I/O Cabability register (p. 4-95 aic7860 Data Book)
 429 * Indicates if external logic has been attached to the chip to
 430 * perform the tasks of accessing a serial eeprom, testing termination
 431 * strength, and performing cable detection.  On the aic7860, most of
 432 * these features are handled on chip, but on the aic7855 an attached
 433 * aic3800 does the grunt work.
 434 */
 435register SPIOCAP {
 436        address                 0x01b
 437        access_mode RW
 438        bit     SOFT1           0x80
 439        bit     SOFT0           0x40
 440        bit     SOFTCMDEN       0x20    
 441        bit     HAS_BRDCTL      0x10    /* External Board control */
 442        bit     SEEPROM         0x08    /* External serial eeprom logic */
 443        bit     EEPROM          0x04    /* Writable external BIOS ROM */
 444        bit     ROM             0x02    /* Logic for accessing external ROM */
 445        bit     SSPIOCPS        0x01    /* Termination and cable detection */
 446}
 447
 448/*
 449 * SCSI Block Control (p. 3-32)
 450 * Controls Bus type and channel selection.  In a twin channel configuration
 451 * addresses 0x00-0x1e are gated to the appropriate channel based on this
 452 * register.  SELWIDE allows for the coexistence of 8bit and 16bit devices
 453 * on a wide bus.
 454 */
 455register SBLKCTL {
 456        address                 0x01f
 457        access_mode RW
 458        bit     DIAGLEDEN       0x80    /* Aic78X0 only */
 459        bit     DIAGLEDON       0x40    /* Aic78X0 only */
 460        bit     AUTOFLUSHDIS    0x20
 461        bit     SELBUSB         0x08
 462        bit     ENAB40          0x08    /* LVD transceiver active */
 463        bit     ENAB20          0x04    /* SE/HVD transceiver active */
 464        bit     SELWIDE         0x02
 465        bit     XCVR            0x01    /* External transceiver active */
 466}
 467
 468/*
 469 * Sequencer Control (p. 3-33)
 470 * Error detection mode and speed configuration
 471 */
 472register SEQCTL {
 473        address                 0x060
 474        access_mode RW
 475        bit     PERRORDIS       0x80
 476        bit     PAUSEDIS        0x40
 477        bit     FAILDIS         0x20
 478        bit     FASTMODE        0x10
 479        bit     BRKADRINTEN     0x08
 480        bit     STEP            0x04
 481        bit     SEQRESET        0x02
 482        bit     LOADRAM         0x01
 483}
 484
 485/*
 486 * Sequencer RAM Data (p. 3-34)
 487 * Single byte window into the Scratch Ram area starting at the address
 488 * specified by SEQADDR0 and SEQADDR1.  To write a full word, simply write
 489 * four bytes in succession.  The SEQADDRs will increment after the most
 490 * significant byte is written
 491 */
 492register SEQRAM {
 493        address                 0x061
 494        access_mode RW
 495}
 496
 497/*
 498 * Sequencer Address Registers (p. 3-35)
 499 * Only the first bit of SEQADDR1 holds addressing information
 500 */
 501register SEQADDR0 {
 502        address                 0x062
 503        access_mode RW
 504}
 505
 506register SEQADDR1 {
 507        address                 0x063
 508        access_mode RW
 509        mask    SEQADDR1_MASK   0x01
 510}
 511
 512/*
 513 * Accumulator
 514 * We cheat by passing arguments in the Accumulator up to the kernel driver
 515 */
 516register ACCUM {
 517        address                 0x064
 518        access_mode RW
 519        accumulator
 520}
 521
 522register SINDEX {
 523        address                 0x065
 524        access_mode RW
 525        sindex
 526}
 527
 528register DINDEX {
 529        address                 0x066
 530        access_mode RW
 531}
 532
 533register ALLONES {
 534        address                 0x069
 535        access_mode RO
 536        allones
 537}
 538
 539register ALLZEROS {
 540        address                 0x06a
 541        access_mode RO
 542        allzeros
 543}
 544
 545register NONE {
 546        address                 0x06a
 547        access_mode WO
 548        none
 549}
 550
 551register FLAGS {
 552        address                 0x06b
 553        access_mode RO
 554        bit     ZERO            0x02
 555        bit     CARRY           0x01
 556}
 557
 558register SINDIR {
 559        address                 0x06c
 560        access_mode RO
 561}
 562
 563register DINDIR  {
 564        address                 0x06d
 565        access_mode WO
 566}
 567
 568register FUNCTION1 {
 569        address                 0x06e
 570        access_mode RW
 571}
 572
 573register STACK {
 574        address                 0x06f
 575        access_mode RO
 576}
 577
 578/*
 579 * Board Control (p. 3-43)
 580 */
 581register BCTL {
 582        address                 0x084
 583        access_mode RW
 584        bit     ACE             0x08
 585        bit     ENABLE          0x01
 586}
 587
 588register DSCOMMAND0 {
 589        address                 0x084
 590        access_mode RW
 591        bit     CACHETHEN       0x80
 592        bit     DPARCKEN        0x40
 593        bit     MPARCKEN        0x20
 594        bit     EXTREQLCK       0x10
 595        bit     INTSCBRAMSEL    0x08
 596        bit     RAMPS           0x04
 597        bit     USCBSIZE32      0x02
 598        bit     CIOPARCKEN      0x01
 599}
 600
 601/*
 602 * On the aic78X0 chips, Board Control is replaced by the DSCommand
 603 * register (p. 4-64)
 604 */
 605register DSCOMMAND {
 606        address                 0x084
 607        access_mode RW
 608        bit     CACHETHEN       0x80    /* Cache Threshold enable */
 609        bit     DPARCKEN        0x40    /* Data Parity Check Enable */
 610        bit     MPARCKEN        0x20    /* Memory Parity Check Enable */
 611        bit     EXTREQLCK       0x10    /* External Request Lock */
 612}
 613
 614/*
 615 * Bus On/Off Time (p. 3-44)
 616 */
 617register BUSTIME {
 618        address                 0x085
 619        access_mode RW
 620        mask    BOFF            0xf0
 621        mask    BON             0x0f
 622}
 623
 624/*
 625 * Bus Speed (p. 3-45)
 626 */
 627register BUSSPD {
 628        address                 0x086
 629        access_mode RW
 630        mask    DFTHRSH         0xc0
 631        mask    STBOFF          0x38
 632        mask    STBON           0x07
 633        mask    DFTHRSH_100     0xc0
 634}
 635
 636/*
 637 * Host Control (p. 3-47) R/W
 638 * Overall host control of the device.
 639 */
 640register HCNTRL {
 641        address                 0x087
 642        access_mode RW
 643        bit     POWRDN          0x40
 644        bit     SWINT           0x10
 645        bit     IRQMS           0x08
 646        bit     PAUSE           0x04
 647        bit     INTEN           0x02
 648        bit     CHIPRST         0x01
 649        bit     CHIPRSTACK      0x01
 650}
 651
 652/*
 653 * Host Address (p. 3-48)
 654 * This register contains the address of the byte about
 655 * to be transferred across the host bus.
 656 */
 657register HADDR {
 658        address                 0x088
 659        size    4
 660        access_mode RW
 661}
 662
 663register HCNT {
 664        address                 0x08c
 665        size    3
 666        access_mode RW
 667}
 668
 669/*
 670 * SCB Pointer (p. 3-49)
 671 * Gate one of the four SCBs into the SCBARRAY window.
 672 */
 673register SCBPTR {
 674        address                 0x090
 675        access_mode RW
 676}
 677
 678/*
 679 * Interrupt Status (p. 3-50)
 680 * Status for system interrupts
 681 */
 682register INTSTAT {
 683        address                 0x091
 684        access_mode RW
 685        bit     BRKADRINT 0x08
 686        bit     SCSIINT   0x04
 687        bit     CMDCMPLT  0x02
 688        bit     SEQINT    0x01
 689        mask    BAD_PHASE       SEQINT          /* unknown scsi bus phase */
 690        mask    SEND_REJECT     0x10|SEQINT     /* sending a message reject */
 691        mask    NO_IDENT        0x20|SEQINT     /* no IDENTIFY after reconnect*/
 692        mask    NO_MATCH        0x30|SEQINT     /* no cmd match for reconnect */
 693        mask    EXTENDED_MSG    0x40|SEQINT     /* Extended message received */
 694        mask    WIDE_RESIDUE    0x50|SEQINT     /* need kernel to back up */
 695                                                /* the SG array for us */
 696        mask    REJECT_MSG      0x60|SEQINT     /* Reject message received */
 697        mask    BAD_STATUS      0x70|SEQINT     /* Bad status from target */
 698        mask    RESIDUAL        0x80|SEQINT     /* Residual byte count != 0 */
 699        mask    AWAITING_MSG    0xa0|SEQINT     /*
 700                                                 * Kernel requested to specify
 701                                                 * a message to this target
 702                                                 * (command was null), so tell
 703                                                 * it that it can fill the
 704                                                 * message buffer.
 705                                                 */
 706        mask    SEQ_SG_FIXUP    0xb0|SEQINT     /* need help with fixing up
 707                                                 * the sg array pointer after
 708                                                 * a phasemis with no valid
 709                                                 * sg elements in the shadow
 710                                                 * pipeline.
 711                                                 */
 712        mask    TRACEPOINT2     0xc0|SEQINT
 713        mask    MSGIN_PHASEMIS  0xd0|SEQINT     /*
 714                                                 * Target changed phase on us
 715                                                 * when we were expecting
 716                                                 * another msgin byte.
 717                                                 */
 718        mask    DATA_OVERRUN    0xe0|SEQINT     /*
 719                                                 * Target attempted to write
 720                                                 * beyond the bounds of its
 721                                                 * command.
 722                                                 */
 723
 724        mask    SEQINT_MASK     0xf0|SEQINT     /* SEQINT Status Codes */
 725        mask    INT_PEND  (BRKADRINT|SEQINT|SCSIINT|CMDCMPLT)
 726}
 727
 728/*
 729 * Hard Error (p. 3-53)
 730 * Reporting of catastrophic errors.  You usually cannot recover from
 731 * these without a full board reset.
 732 */
 733register ERROR {
 734        address                 0x092
 735        access_mode RO
 736        bit     CIOPARERR       0x80    /* Ultra2 only */
 737        bit     PCIERRSTAT      0x40    /* PCI only */
 738        bit     MPARERR         0x20    /* PCI only */
 739        bit     DPARERR         0x10    /* PCI only */
 740        bit     SQPARERR        0x08
 741        bit     ILLOPCODE       0x04
 742        bit     ILLSADDR        0x02
 743        bit     DSCTMOUT        0x02    /* Ultra3 only */
 744        bit     ILLHADDR        0x01
 745}
 746
 747/*
 748 * Clear Interrupt Status (p. 3-52)
 749 */
 750register CLRINT {
 751        address                 0x092
 752        access_mode WO
 753        bit     CLRPARERR       0x10    /* PCI only */
 754        bit     CLRBRKADRINT    0x08
 755        bit     CLRSCSIINT      0x04
 756        bit     CLRCMDINT       0x02
 757        bit     CLRSEQINT       0x01
 758}
 759
 760register DFCNTRL {
 761        address                 0x093
 762        access_mode RW
 763        bit     PRELOADEN       0x80    /* aic7890 only */
 764        bit     WIDEODD         0x40
 765        bit     SCSIEN          0x20
 766        bit     SDMAEN          0x10
 767        bit     SDMAENACK       0x10
 768        bit     HDMAEN          0x08
 769        bit     HDMAENACK       0x08
 770        bit     DIRECTION       0x04
 771        bit     FIFOFLUSH       0x02
 772        bit     FIFORESET       0x01
 773}
 774
 775register DFSTATUS {
 776        address                 0x094
 777        access_mode RO
 778        bit     PRELOAD_AVAIL   0x80
 779        bit     DWORDEMP        0x20
 780        bit     MREQPEND        0x10
 781        bit     HDONE           0x08
 782        bit     DFTHRESH        0x04
 783        bit     FIFOFULL        0x02
 784        bit     FIFOEMP         0x01
 785}
 786
 787register DFDAT {
 788        address                 0x099
 789        access_mode RW
 790}
 791
 792/*
 793 * SCB Auto Increment (p. 3-59)
 794 * Byte offset into the SCB Array and an optional bit to allow auto
 795 * incrementing of the address during download and upload operations
 796 */
 797register SCBCNT {
 798        address                 0x09a
 799        access_mode RW
 800        bit     SCBAUTO         0x80
 801        mask    SCBCNT_MASK     0x1f
 802}
 803
 804/*
 805 * Queue In FIFO (p. 3-60)
 806 * Input queue for queued SCBs (commands that the seqencer has yet to start)
 807 */
 808register QINFIFO {
 809        address                 0x09b
 810        access_mode RW
 811}
 812
 813/*
 814 * Queue In Count (p. 3-60)
 815 * Number of queued SCBs
 816 */
 817register QINCNT {
 818        address                 0x09c
 819        access_mode RO
 820}
 821
 822/*
 823 * SCSIDATL IMAGE Register (p. 5-104)
 824 * Write to this register also go to SCSIDATL but this register will preserve
 825 * the data for later reading as long as the SCSIDATL_IMGEN bit in the
 826 * OPTIONMODE register is set.
 827 */
 828register SCSIDATL_IMG {
 829        address                 0x09c
 830        access_mode RW
 831}
 832
 833/*
 834 * Queue Out FIFO (p. 3-61)
 835 * Queue of SCBs that have completed and await the host
 836 */
 837register QOUTFIFO {
 838        address                 0x09d
 839        access_mode WO
 840}
 841
 842/*
 843 * CRC Control 1 Register (p. 5-105)
 844 * Control bits for the Ultra 160/m CRC facilities
 845 */
 846register CRCCONTROL1 {
 847        address                 0x09d
 848        access_mode RW
 849        bit     CRCONSEEN       0x80 /* CRC ON Single Edge ENable */
 850        bit     CRCVALCHKEN     0x40 /* CRC Value Check Enable */
 851        bit     CRCENDCHKEN     0x20 /* CRC End Check Enable */
 852        bit     CRCREQCHKEN     0x10
 853        bit     TARGCRCENDEN    0x08 /* Enable End CRC transfer when target */
 854        bit     TARGCRCCNTEN    0x04 /* Enable CRC transfer when target */
 855}
 856
 857/*
 858 * Queue Out Count (p. 3-61)
 859 * Number of queued SCBs in the Out FIFO
 860 */
 861register QOUTCNT {
 862        address                 0x09e
 863        access_mode RO
 864}
 865
 866/*
 867 * SCSI Phase Register (p. 5-106)
 868 * Current bus phase
 869 */
 870register SCSIPHASE {
 871        address                 0x09e
 872        access_mode RO
 873        bit     SP_STATUS               0x20
 874        bit     SP_COMMAND              0x10
 875        bit     SP_MSG_IN               0x08
 876        bit     SP_MSG_OUT              0x04
 877        bit     SP_DATA_IN              0x02
 878        bit     SP_DATA_OUT     0x01
 879}
 880
 881/*
 882 * Special Function
 883 */
 884register SFUNCT {
 885        address                 0x09f
 886        access_mode RW
 887        bit     ALT_MODE        0x80
 888}
 889
 890/*
 891 * SCB Definition (p. 5-4)
 892 */
 893scb {
 894        address                 0x0a0
 895        SCB_CONTROL {
 896                size    1
 897                bit     MK_MESSAGE      0x80
 898                bit     DISCENB         0x40
 899                bit     TAG_ENB         0x20
 900                bit     DISCONNECTED    0x04
 901                mask    SCB_TAG_TYPE    0x03
 902        }
 903        SCB_TCL {
 904                size    1
 905                bit     SELBUSB         0x08
 906                mask    TID             0xf0
 907                mask    LID             0x07
 908        }
 909        SCB_TARGET_STATUS {
 910                size    1
 911        }
 912        SCB_SGCOUNT {
 913                size    1
 914        }
 915        SCB_SGPTR {
 916                size    4
 917        }
 918        SCB_RESID_SGCNT {
 919                size    1
 920        }
 921        SCB_RESID_DCNT  {
 922                size    3
 923        }
 924        SCB_DATAPTR {
 925                size    4
 926        }
 927        SCB_DATACNT {
 928                /*
 929                 * Really only 3 bytes, but padded to make
 930                 * the kernel's job easier.
 931                 */
 932                size    4
 933        }
 934        SCB_CMDPTR {
 935                size    4
 936        }
 937        SCB_CMDLEN {
 938                size    1
 939        }
 940        SCB_TAG {
 941                size    1
 942        }
 943        SCB_NEXT {
 944                size    1
 945        }
 946        SCB_PREV {
 947                size    1
 948        }
 949        SCB_BUSYTARGETS {
 950                size    4
 951        }
 952}
 953
 954const   SG_SIZEOF       0x08            /* sizeof(struct ahc_dma) */
 955
 956/* --------------------- AHA-2840-only definitions -------------------- */
 957
 958register SEECTL_2840 {
 959        address                 0x0c0
 960        access_mode RW
 961        bit     CS_2840         0x04
 962        bit     CK_2840         0x02
 963        bit     DO_2840         0x01
 964}
 965
 966register STATUS_2840 {
 967        address                 0x0c1
 968        access_mode RW
 969        bit     EEPROM_TF       0x80
 970        mask    BIOS_SEL        0x60
 971        mask    ADSEL           0x1e
 972        bit     DI_2840         0x01
 973}
 974
 975/* --------------------- AIC-7870-only definitions -------------------- */
 976
 977register DSPCISTATUS {
 978        address                 0x086
 979        mask    DFTHRSH_100     0xc0
 980}
 981
 982register CCHADDR {
 983        address                 0x0E0
 984        size 8
 985}
 986
 987register CCHCNT {
 988        address                 0x0E8
 989}
 990
 991register CCSGRAM {
 992        address                 0x0E9
 993}
 994
 995register CCSGADDR {
 996        address                 0x0EA
 997}
 998
 999register CCSGCTL {
1000        address                 0x0EB
1001        bit     CCSGDONE        0x80
1002        bit     CCSGEN          0x08
1003        bit     FLAG            0x02
1004        bit     CCSGRESET       0x01
1005}
1006
1007register CCSCBCNT {
1008        address                 0xEF
1009}
1010
1011register CCSCBCTL {
1012        address                 0x0EE
1013        bit     CCSCBDONE       0x80
1014        bit     ARRDONE         0x40    /* SCB Array prefetch done */
1015        bit     CCARREN         0x10
1016        bit     CCSCBEN         0x08
1017        bit     CCSCBDIR        0x04
1018        bit     CCSCBRESET      0x01
1019}
1020
1021register CCSCBADDR {
1022        address                 0x0ED
1023}
1024
1025register CCSCBRAM {
1026        address                 0xEC
1027}
1028
1029register CCSCBPTR {
1030        address                 0x0F1
1031}
1032
1033register HNSCB_QOFF {
1034        address                 0x0F4
1035}
1036
1037register HESCB_QOFF {
1038        address                 0x0F5
1039}
1040
1041register SNSCB_QOFF {
1042        address                 0x0F6
1043}
1044
1045register SESCB_QOFF {
1046        address                 0x0F7
1047}
1048
1049register SDSCB_QOFF {
1050        address                 0x0F8
1051}
1052
1053register QOFF_CTLSTA {
1054        address                 0x0FA
1055        bit     ESTABLISH_SCB_AVAIL     0x80
1056        bit     SCB_AVAIL       0x40
1057        bit     SNSCB_ROLLOVER  0x20
1058        bit     SDSCB_ROLLOVER  0x10
1059        bit     SESCB_ROLLOVER  0x08
1060        mask    SCB_QSIZE       0x07
1061        mask    SCB_QSIZE_256   0x06
1062}
1063
1064register DFF_THRSH {
1065        address                 0x0FB
1066        mask    WR_DFTHRSH      0x70
1067        mask    RD_DFTHRSH      0x07
1068        mask    RD_DFTHRSH_MIN  0x00
1069        mask    RD_DFTHRSH_25   0x01
1070        mask    RD_DFTHRSH_50   0x02
1071        mask    RD_DFTHRSH_63   0x03
1072        mask    RD_DFTHRSH_75   0x04
1073        mask    RD_DFTHRSH_85   0x05
1074        mask    RD_DFTHRSH_90   0x06
1075        mask    RD_DFTHRSH_MAX  0x07
1076        mask    WR_DFTHRSH_MIN  0x00
1077        mask    WR_DFTHRSH_25   0x10
1078        mask    WR_DFTHRSH_50   0x20
1079        mask    WR_DFTHRSH_63   0x30
1080        mask    WR_DFTHRSH_75   0x40
1081        mask    WR_DFTHRSH_85   0x50
1082        mask    WR_DFTHRSH_90   0x60
1083        mask    WR_DFTHRSH_MAX  0x70
1084}
1085
1086register SG_CACHEPTR {
1087        access_mode RW
1088        address                 0x0fc
1089        mask    SG_USER_DATA    0xfc
1090        bit     LAST_SEG        0x02
1091        bit     LAST_SEG_DONE   0x01
1092}
1093
1094register BRDCTL {
1095        address                 0x01d
1096        bit     BRDDAT7         0x80
1097        bit     BRDDAT6         0x40
1098        bit     BRDDAT5         0x20
1099        bit     BRDSTB          0x10
1100        bit     BRDCS           0x08
1101        bit     BRDRW           0x04
1102        bit     BRDCTL1         0x02
1103        bit     BRDCTL0         0x01
1104        /* 7890 Definitions */
1105        bit     BRDDAT4         0x10
1106        bit     BRDDAT3         0x08
1107        bit     BRDDAT2         0x04
1108        bit     BRDRW_ULTRA2    0x02
1109        bit     BRDSTB_ULTRA2   0x01
1110}
1111
1112/*
1113 * Serial EEPROM Control (p. 4-92 in 7870 Databook)
1114 * Controls the reading and writing of an external serial 1-bit
1115 * EEPROM Device.  In order to access the serial EEPROM, you must
1116 * first set the SEEMS bit that generates a request to the memory
1117 * port for access to the serial EEPROM device.  When the memory
1118 * port is not busy servicing another request, it reconfigures
1119 * to allow access to the serial EEPROM.  When this happens, SEERDY
1120 * gets set high to verify that the memory port access has been
1121 * granted.  
1122 *
1123 * After successful arbitration for the memory port, the SEECS bit of 
1124 * the SEECTL register is connected to the chip select.  The SEECK, 
1125 * SEEDO, and SEEDI are connected to the clock, data out, and data in 
1126 * lines respectively.  The SEERDY bit of SEECTL is useful in that it 
1127 * gives us an 800 nsec timer.  After a write to the SEECTL register, 
1128 * the SEERDY goes high 800 nsec later.  The one exception to this is 
1129 * when we first request access to the memory port.  The SEERDY goes 
1130 * high to signify that access has been granted and, for this case, has 
1131 * no implied timing.
1132 *
1133 * See 93cx6.c for detailed information on the protocol necessary to 
1134 * read the serial EEPROM.
1135 */
1136register SEECTL {
1137        address                 0x01e
1138        bit     EXTARBACK       0x80
1139        bit     EXTARBREQ       0x40
1140        bit     SEEMS           0x20
1141        bit     SEERDY          0x10
1142        bit     SEECS           0x08
1143        bit     SEECK           0x04
1144        bit     SEEDO           0x02
1145        bit     SEEDI           0x01
1146}
1147/* ---------------------- Scratch RAM Offsets ------------------------- */
1148/* These offsets are either to values that are initialized by the board's
1149 * BIOS or are specified by the sequencer code.
1150 *
1151 * The host adapter card (at least the BIOS) uses 20-2f for SCSI
1152 * device information, 32-33 and 5a-5f as well. As it turns out, the
1153 * BIOS trashes 20-2f, writing the synchronous negotiation results
1154 * on top of the BIOS values, so we re-use those for our per-target
1155 * scratchspace (actually a value that can be copied directly into
1156 * SCSIRATE).  The kernel driver will enable synchronous negotiation
1157 * for all targets that have a value other than 0 in the lower four
1158 * bits of the target scratch space.  This should work regardless of
1159 * whether the bios has been installed.
1160 */
1161
1162scratch_ram {
1163        address                 0x020
1164
1165        /*
1166         * 1 byte per target starting at this address for configuration values
1167         */
1168        TARG_SCSIRATE {
1169                size            16
1170        }
1171        /*
1172         * Bit vector of targets that have ULTRA enabled.
1173         */
1174        ULTRA_ENB {
1175                size            2
1176        }
1177        /*
1178         * Bit vector of targets that have disconnection disabled.
1179         */
1180        DISC_DSB {
1181                size            2
1182        }
1183        /*
1184         * Single byte buffer used to designate the type or message
1185         * to send to a target.
1186         */
1187        MSG_OUT {
1188                size            1
1189        }
1190        /* Parameters for DMA Logic */
1191        DMAPARAMS {
1192                size            1
1193                bit     PRELOADEN       0x80
1194                bit     WIDEODD         0x40
1195                bit     SCSIEN          0x20
1196                bit     SDMAEN          0x10
1197                bit     SDMAENACK       0x10
1198                bit     HDMAEN          0x08
1199                bit     HDMAENACK       0x08
1200                bit     DIRECTION       0x04
1201                bit     FIFOFLUSH       0x02
1202                bit     FIFORESET       0x01
1203        }
1204        SEQ_FLAGS {
1205                size            1
1206                bit     IDENTIFY_SEEN   0x80
1207                bit     SCBPTR_VALID    0x20
1208                bit     DPHASE          0x10
1209                bit     AMTARGET        0x08
1210                bit     WIDE_BUS        0x02
1211                bit     TWIN_BUS        0x01
1212        }
1213        /*
1214         * Temporary storage for the
1215         * target/channel/lun of a
1216         * reconnecting target
1217         */
1218        SAVED_TCL {
1219                size            1
1220        }
1221        /* Working value of the number of SG segments left */
1222        SG_COUNT {
1223                size            1
1224        }
1225        /* Working value of SG pointer */
1226        SG_NEXT {
1227                size            4
1228        }
1229        /*
1230         * The last bus phase as seen by the sequencer. 
1231         */
1232        LASTPHASE {
1233                size            1
1234                bit     CDI             0x80
1235                bit     IOI             0x40
1236                bit     MSGI            0x20
1237                mask    PHASE_MASK      CDI|IOI|MSGI
1238                mask    P_DATAOUT       0x00
1239                mask    P_DATAIN        IOI
1240                mask    P_COMMAND       CDI
1241                mask    P_MESGOUT       CDI|MSGI
1242                mask    P_STATUS        CDI|IOI
1243                mask    P_MESGIN        CDI|IOI|MSGI
1244                mask    P_BUSFREE       0x01
1245        }
1246        /*
1247         * head of list of SCBs awaiting
1248         * selection
1249         */
1250        WAITING_SCBH {
1251                size            1
1252        }
1253        /*
1254         * head of list of SCBs that are
1255         * disconnected.  Used for SCB
1256         * paging.
1257         */
1258        DISCONNECTED_SCBH {
1259                size            1
1260        }
1261        /*
1262         * head of list of SCBs that are
1263         * not in use.  Used for SCB paging.
1264         */
1265        FREE_SCBH {
1266                size            1
1267        }
1268        /*
1269         * Address of the hardware scb array in the host.
1270         */
1271        HSCB_ADDR {
1272                size            4
1273        }
1274        /*
1275         * Address of the 256 byte array storing the SCBID of outstanding
1276         * untagged SCBs indexed by TCL.
1277         */
1278        SCBID_ADDR {
1279                size            4
1280        }
1281        /*
1282         * Address of the array of command descriptors used to store
1283         * information about incoming selections.
1284         */
1285        TMODE_CMDADDR {
1286                size            4
1287        }
1288        KERNEL_QINPOS {
1289                size            1
1290        }
1291        QINPOS {
1292                size            1
1293        }
1294        QOUTPOS {
1295                size            1
1296        }
1297        /*
1298         * Offset into the command descriptor array for the next
1299         * available desciptor to use.
1300         */
1301        TMODE_CMDADDR_NEXT {
1302                size            1
1303        }
1304        ARG_1 {
1305                size            1
1306                mask    SEND_MSG        0x80
1307                mask    SEND_SENSE      0x40
1308                mask    SEND_REJ        0x20
1309                mask    MSGOUT_PHASEMIS 0x10
1310                alias   RETURN_1
1311        }
1312        ARG_2 {
1313                size            1
1314                alias   RETURN_2
1315        }
1316
1317        /*
1318         * Snapshot of MSG_OUT taken after each message is sent.
1319         */
1320        LAST_MSG {
1321                size            1
1322        }
1323
1324        /*
1325         * Number of times we have filled the CCSGRAM with prefetched
1326         * SG elements.
1327         */
1328        PREFETCH_CNT {
1329                size            1
1330        }
1331
1332
1333        /*
1334         * These are reserved registers in the card's scratch ram.  Some of
1335         * the values are specified in the AHA2742 technical reference manual
1336         * and are initialized by the BIOS at boot time.
1337         */
1338        SCSICONF {
1339                address         0x05a
1340                size            1
1341                bit     TERM_ENB        0x80
1342                bit     RESET_SCSI      0x40
1343                mask    HSCSIID         0x07    /* our SCSI ID */
1344                mask    HWSCSIID        0x0f    /* our SCSI ID if Wide Bus */
1345        }
1346        HOSTCONF {
1347                address         0x05d
1348                size            1
1349        }
1350        HA_274_BIOSCTRL {
1351                address         0x05f
1352                size            1
1353                mask    BIOSMODE                0x30
1354                mask    BIOSDISABLED            0x30    
1355                bit     CHANNEL_B_PRIMARY       0x08
1356        }
1357        /*
1358         * Per target SCSI offset values for Ultra2 controllers.
1359         */
1360        TARG_OFFSET {
1361                address         0x070
1362                size            16
1363        }
1364}
1365
1366const SCB_LIST_NULL     0xff
1367
1368const CCSGADDR_MAX      0x80
1369const CCSGRAM_MAXSEGS   16
1370
1371/* Offsets into the SCBID array where different data is stored */
1372const UNTAGGEDSCB_OFFSET        0
1373const QOUTFIFO_OFFSET           1
1374const QINFIFO_OFFSET            2
1375
1376/* WDTR Message values */
1377const BUS_8_BIT                 0x00
1378const BUS_16_BIT                0x01
1379const BUS_32_BIT                0x02
1380
1381/* Offset maximums */
1382const MAX_OFFSET_8BIT           0x0f
1383const MAX_OFFSET_16BIT          0x08
1384const MAX_OFFSET_ULTRA2         0x7f
1385const HOST_MSG                  0xff
1386
1387/* Target mode command processing constants */
1388const CMD_GROUP_CODE_SHIFT      0x05
1389const CMD_GROUP0_BYTE_DELTA     -4
1390const CMD_GROUP2_BYTE_DELTA     -6
1391const CMD_GROUP4_BYTE_DELTA     4
1392const CMD_GROUP5_BYTE_DELTA     11
1393
1394/*
1395 * Downloaded (kernel inserted) constants
1396 */
1397
1398/*
1399 * Number of command descriptors in the command descriptor array.
1400 */
1401const TMODE_NUMCMDS     download
1402
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.