Annotation of Gnu-Mach/linux/src/drivers/scsi/53c7,8xx.h, revision 1.1.1.2

1.1       root        1: /*
                      2:  * NCR 53c{7,8}0x0 driver, header file
                      3:  *
                      4:  * Sponsored by
                      5:  *      iX Multiuser Multitasking Magazine
                      6:  *     Hannover, Germany
                      7:  *     [email protected]        
                      8:  *
                      9:  * Copyright 1993, 1994, 1995 Drew Eckhardt
                     10:  *      Visionary Computing 
                     11:  *      (Unix and Linux consulting and custom programming)
                     12:  *      [email protected]
                     13:  *     +1 (303) 786-7975
                     14:  *
                     15:  * TolerANT and SCSI SCRIPTS are registered trademarks of NCR Corporation.
                     16:  * 
                     17:  * PRE-ALPHA
                     18:  *
                     19:  * For more information, please consult 
                     20:  *
                     21:  * NCR 53C700/53C700-66
                     22:  * SCSI I/O Processor
                     23:  * Data Manual
                     24:  *
                     25:  * NCR 53C810
                     26:  * PCI-SCSI I/O Processor 
                     27:  * Data Manual
                     28:  *
                     29:  * NCR Microelectronics
                     30:  * 1635 Aeroplaza Drive
                     31:  * Colorado Springs, CO 80916
                     32:  * +1 (719) 578-3400
                     33:  *
                     34:  * Toll free literature number
                     35:  * +1 (800) 334-5454
                     36:  *
                     37:  */
                     38: 
                     39: #ifndef NCR53c7x0_H
                     40: #define NCR53c7x0_H
                     41: #if !defined(LINUX_1_2) && !defined(LINUX_1_3)
                     42: #include <linux/version.h>
                     43: #if LINUX_VERSION_CODE > 65536 + 3 * 256
                     44: #define LINUX_1_3
                     45: #else
                     46: #define LINUX_1_2
                     47: #endif
                     48: #endif
                     49: 
                     50: /* 
                     51:  * Prevent name space pollution in hosts.c, and only provide the 
                     52:  * define we need to get the NCR53c7x0 driver into the host template
                     53:  * array.
                     54:  */
                     55: 
                     56: #if defined(HOSTS_C) || defined(MODULE)
                     57: #include <scsi/scsicam.h>
                     58: 
                     59: extern int NCR53c7xx_abort(Scsi_Cmnd *);
                     60: extern int NCR53c7xx_detect(Scsi_Host_Template *tpnt);
                     61: extern int NCR53c7xx_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
                     62: extern int NCR53c7xx_reset(Scsi_Cmnd *, unsigned int);
                     63: #ifdef MODULE
                     64: extern int NCR53c7xx_release(struct Scsi_Host *);
                     65: #else
                     66: #define NCR53c7xx_release NULL
                     67: #endif
                     68: 
                     69: #ifdef LINUX_1_2
                     70: #define NCR53c7xx {NULL, NULL, "NCR53c{7,8}xx (rel 17)", NCR53c7xx_detect,\
                     71:        NULL, /* info */ NULL, /* command, deprecated */ NULL,          \
                     72:        NCR53c7xx_queue_command, NCR53c7xx_abort, NCR53c7xx_reset,      \
                     73:        NULL /* slave attach */, scsicam_bios_param, /* can queue */ 24, \
                     74:        /* id */ 7, 127 /* old SG_ALL */, /* cmd per lun */ 3,          \
                     75:        /* present */ 0, /* unchecked isa dma */ 0, DISABLE_CLUSTERING} 
                     76: #else
                     77: #define NCR53c7xx {NULL, NULL, NULL, NULL, \
                     78:         "NCR53c{7,8}xx (rel 17)", NCR53c7xx_detect,\
                     79:         NULL, /* info */ NULL, /* command, deprecated */ NULL,         \
                     80:        NCR53c7xx_queue_command, NCR53c7xx_abort, NCR53c7xx_reset,      \
                     81:        NULL /* slave attach */, scsicam_bios_param, /* can queue */ 24, \
                     82:        /* id */ 7, 127 /* old SG_ALL */, /* cmd per lun */ 3,          \
                     83:        /* present */ 0, /* unchecked isa dma */ 0, DISABLE_CLUSTERING} 
                     84: #endif
                     85: 
                     86: #endif /* defined(HOSTS_C) || defined(MODULE) */ 
                     87: 
                     88: #ifndef HOSTS_C
                     89: #ifdef LINUX_1_2
                     90: /*
                     91:  * Change virtual addresses to physical addresses and vv.
                     92:  * These are trivial on the 1:1 Linux/i386 mapping (but if we ever
                     93:  * make the kernel segment mapped at 0, we need to do translation
                     94:  * on the i386 as well)
                     95:  */
                     96: extern inline unsigned long virt_to_phys(volatile void * address)
                     97: {       
                     98:        return (unsigned long) address;
                     99: }       
                    100: 
                    101: extern inline void * phys_to_virt(unsigned long address)
                    102: {
                    103:        return (void *) address;      
                    104: }
                    105: 
                    106: /*
                    107:  * IO bus memory addresses are also 1:1 with the physical address
                    108:  */
                    109: #define virt_to_bus virt_to_phys
                    110: #define bus_to_virt phys_to_virt
                    111: 
                    112: /*
                    113:  * readX/writeX() are used to access memory mapped devices. On some
                    114:  * architectures the memory mapped IO stuff needs to be accessed
                    115:  * differently. On the x86 architecture, we just read/write the
                    116:  * memory location directly.
                    117:  */
                    118: #define readb(addr) (*(volatile unsigned char *) (addr))
                    119: #define readw(addr) (*(volatile unsigned short *) (addr))
                    120: #define readl(addr) (*(volatile unsigned int *) (addr))
                    121: 
                    122: #define writeb(b,addr) ((*(volatile unsigned char *) (addr)) = (b))
                    123: #define writew(b,addr) ((*(volatile unsigned short *) (addr)) = (b))
                    124: #define writel(b,addr) ((*(volatile unsigned int *) (addr)) = (b))
                    125: 
                    126: #define mb()
                    127: 
                    128: #endif /* def LINUX_1_2 */
                    129: 
                    130: /* Register addresses, ordered numerically */
                    131: 
                    132: /* SCSI control 0 rw, default = 0xc0 */ 
                    133: #define SCNTL0_REG             0x00    
                    134: #define SCNTL0_ARB1            0x80    /* 0 0 = simple arbitration */
                    135: #define SCNTL0_ARB2            0x40    /* 1 1 = full arbitration */
                    136: #define SCNTL0_STRT            0x20    /* Start Sequence */
                    137: #define SCNTL0_WATN            0x10    /* Select with ATN */
                    138: #define SCNTL0_EPC             0x08    /* Enable parity checking */
                    139: /* Bit 2 is reserved on 800 series chips */
                    140: #define SCNTL0_EPG_700         0x04    /* Enable parity generation */
                    141: #define SCNTL0_AAP             0x02    /*  ATN/ on parity error */
                    142: #define SCNTL0_TRG             0x01    /* Target mode */
                    143: 
                    144: /* SCSI control 1 rw, default = 0x00 */
                    145: 
                    146: #define SCNTL1_REG             0x01    
                    147: #define SCNTL1_EXC             0x80    /* Extra Clock Cycle of Data setup */
                    148: #define SCNTL1_ADB             0x40    /*  contents of SODL on bus */
                    149: #define SCNTL1_ESR_700         0x20    /* Enable SIOP response to selection 
                    150:                                           and reselection */
                    151: #define SCNTL1_DHP_800         0x20    /* Disable halt on parity error or ATN
                    152:                                           target mode only */
                    153: #define SCNTL1_CON             0x10    /* Connected */
                    154: #define SCNTL1_RST             0x08    /* SCSI RST/ */
                    155: #define SCNTL1_AESP            0x04    /* Force bad parity */
                    156: #define SCNTL1_SND_700         0x02    /* Start SCSI send */
                    157: #define SCNTL1_IARB_800                0x02    /* Immediate Arbitration, start
                    158:                                           arbitration immediately after
                    159:                                           busfree is detected */
                    160: #define SCNTL1_RCV_700         0x01    /* Start SCSI receive */
                    161: #define SCNTL1_SST_800         0x01    /* Start SCSI transfer */
                    162: 
                    163: /* SCSI control 2 rw, */
                    164: 
                    165: #define SCNTL2_REG_800         0x02    
                    166: #define SCNTL2_800_SDU         0x80    /* SCSI disconnect unexpected */
                    167: 
                    168: /* SCSI control 3 rw */
                    169: 
                    170: #define SCNTL3_REG_800                 0x03    
                    171: #define SCNTL3_800_SCF_SHIFT   4
                    172: #define SCNTL3_800_SCF_MASK    0x70
                    173: #define SCNTL3_800_SCF2                0x40    /* Synchronous divisor */
                    174: #define SCNTL3_800_SCF1                0x20    /* 0x00 = SCLK/3 */
                    175: #define SCNTL3_800_SCF0                0x10    /* 0x10 = SCLK/1 */
                    176:                                        /* 0x20 = SCLK/1.5 
                    177:                                           0x30 = SCLK/2 
                    178:                                           0x40 = SCLK/3 */
                    179:            
                    180: #define SCNTL3_800_CCF_SHIFT   0
                    181: #define SCNTL3_800_CCF_MASK    0x07
                    182: #define SCNTL3_800_CCF2                0x04    /* 0x00 50.01 to 66 */
                    183: #define SCNTL3_800_CCF1                0x02    /* 0x01 16.67 to 25 */
                    184: #define SCNTL3_800_CCF0                0x01    /* 0x02 25.01 - 37.5 
                    185:                                           0x03 37.51 - 50 
                    186:                                           0x04 50.01 - 66 */
                    187: 
                    188: /*  
                    189:  * SCSI destination ID rw - the appropriate bit is set for the selected
                    190:  * target ID.  This is written by the SCSI SCRIPTS processor.
                    191:  * default = 0x00
                    192:  */
                    193: #define SDID_REG_700           0x02    
                    194: #define SDID_REG_800           0x06
                    195: 
                    196: #define GP_REG_800             0x07    /* General purpose IO */
                    197: #define GP_800_IO1             0x02
                    198: #define GP_800_IO2             0x01
                    199: 
                    200: 
                    201: /* SCSI interrupt enable rw, default = 0x00 */
                    202: #define SIEN_REG_700           0x03    
                    203: #define SIEN0_REG_800          0x40
                    204: #define SIEN_MA                        0x80    /* Phase mismatch (ini) or ATN (tgt) */
                    205: #define SIEN_FC                        0x40    /* Function complete */
                    206: #define SIEN_700_STO           0x20    /* Selection or reselection timeout */
                    207: #define SIEN_800_SEL           0x20    /* Selected */
                    208: #define SIEN_700_SEL           0x10    /* Selected or reselected */
                    209: #define SIEN_800_RESEL         0x10    /* Reselected */
                    210: #define SIEN_SGE               0x08    /* SCSI gross error */
                    211: #define SIEN_UDC               0x04    /* Unexpected disconnect */
                    212: #define SIEN_RST               0x02    /* SCSI RST/ received */
                    213: #define SIEN_PAR               0x01    /* Parity error */
                    214: 
                    215: /* 
                    216:  * SCSI chip ID rw
                    217:  * NCR53c700 : 
                    218:  *     When arbitrating, the highest bit is used, when reselection or selection
                    219:  *     occurs, the chip responds to all IDs for which a bit is set.
                    220:  *     default = 0x00 
                    221:  * NCR53c810 : 
                    222:  *     Uses bit mapping
                    223:  */
                    224: #define SCID_REG               0x04    
                    225: /* Bit 7 is reserved on 800 series chips */
                    226: #define SCID_800_RRE           0x40    /* Enable response to reselection */
                    227: #define SCID_800_SRE           0x20    /* Enable response to selection */
                    228: /* Bits four and three are reserved on 800 series chips */
                    229: #define SCID_800_ENC_MASK      0x07    /* Encoded SCSI ID */
                    230: 
                    231: /* SCSI transfer rw, default = 0x00 */
                    232: #define SXFER_REG              0x05
                    233: #define SXFER_DHP              0x80    /* Disable halt on parity */
                    234: 
                    235: #define SXFER_TP2              0x40    /* Transfer period msb */
                    236: #define SXFER_TP1              0x20
                    237: #define SXFER_TP0              0x10    /* lsb */
                    238: #define SXFER_TP_MASK          0x70
                    239: /* FIXME : SXFER_TP_SHIFT == 5 is right for '8xx chips */
                    240: #define SXFER_TP_SHIFT         5
                    241: #define SXFER_TP_4             0x00    /* Divisors */
                    242: #define SXFER_TP_5             0x10<<1
                    243: #define SXFER_TP_6             0x20<<1
                    244: #define SXFER_TP_7             0x30<<1
                    245: #define SXFER_TP_8             0x40<<1
                    246: #define SXFER_TP_9             0x50<<1
                    247: #define SXFER_TP_10            0x60<<1
                    248: #define SXFER_TP_11            0x70<<1
                    249: 
                    250: #define SXFER_MO3              0x08    /* Max offset msb */
                    251: #define SXFER_MO2              0x04
                    252: #define SXFER_MO1              0x02
                    253: #define SXFER_MO0              0x01    /* lsb */
                    254: #define SXFER_MO_MASK          0x0f
                    255: #define SXFER_MO_SHIFT         0
                    256: 
                    257: /* 
                    258:  * SCSI output data latch rw
                    259:  * The contents of this register are driven onto the SCSI bus when 
                    260:  * the Assert Data Bus bit of the SCNTL1 register is set and 
                    261:  * the CD, IO, and MSG bits of the SOCL register match the SCSI phase
                    262:  */
                    263: #define SODL_REG_700           0x06    
                    264: #define SODL_REG_800           0x54
                    265: 
                    266: 
                    267: /* 
                    268:  * SCSI output control latch rw, default = 0 
                    269:  * Note that when the chip is being manually programmed as an initiator,
                    270:  * the MSG, CD, and IO bits must be set correctly for the phase the target
                    271:  * is driving the bus in.  Otherwise no data transfer will occur due to 
                    272:  * phase mismatch.
                    273:  */
                    274: 
                    275: #define SBCL_REG               0x0b
                    276: #define SBCL_REQ               0x80    /*  REQ */
                    277: #define SBCL_ACK               0x40    /*  ACK */
                    278: #define SBCL_BSY               0x20    /*  BSY */
                    279: #define SBCL_SEL               0x10    /*  SEL */
                    280: #define SBCL_ATN               0x08    /*  ATN */
                    281: #define SBCL_MSG               0x04    /*  MSG */
                    282: #define SBCL_CD                        0x02    /*  C/D */
                    283: #define SBCL_IO                        0x01    /*  I/O */
                    284: #define SBCL_PHASE_CMDOUT      SBCL_CD
                    285: #define SBCL_PHASE_DATAIN      SBCL_IO
                    286: #define SBCL_PHASE_DATAOUT     0
                    287: #define SBCL_PHASE_MSGIN       (SBCL_CD|SBCL_IO|SBCL_MSG)
                    288: #define SBCL_PHASE_MSGOUT      (SBCL_CD|SBCL_MSG)
                    289: #define SBCL_PHASE_STATIN      (SBCL_CD|SBCL_IO)
                    290: #define SBCL_PHASE_MASK                (SBCL_CD|SBCL_IO|SBCL_MSG)
                    291: 
                    292: /* 
                    293:  * SCSI first byte received latch ro 
                    294:  * This register contains the first byte received during a block MOVE 
                    295:  * SCSI SCRIPTS instruction, including
                    296:  * 
                    297:  * Initiator mode      Target mode
                    298:  * Message in          Command
                    299:  * Status              Message out
                    300:  * Data in             Data out
                    301:  *
                    302:  * It also contains the selecting or reselecting device's ID and our 
                    303:  * ID.
                    304:  *
                    305:  * Note that this is the register the various IF conditionals can 
                    306:  * operate on.
                    307:  */
                    308: #define SFBR_REG               0x08    
                    309: 
                    310: /* 
                    311:  * SCSI input data latch ro
                    312:  * In initiator mode, data is latched into this register on the rising
                    313:  * edge of REQ/. In target mode, data is latched on the rising edge of 
                    314:  * ACK/
                    315:  */
                    316: #define SIDL_REG_700           0x09
                    317: #define SIDL_REG_800           0x50
                    318: 
                    319: /* 
                    320:  * SCSI bus data lines ro 
                    321:  * This register reflects the instantaneous status of the SCSI data 
                    322:  * lines.  Note that SCNTL0 must be set to disable parity checking, 
                    323:  * otherwise reading this register will latch new parity.
                    324:  */
                    325: #define SBDL_REG_700           0x0a
                    326: #define SBDL_REG_800           0x58
                    327: 
                    328: #define SSID_REG_800           0x0a
                    329: #define SSID_800_VAL           0x80    /* Exactly two bits asserted at sel */
                    330: #define SSID_800_ENCID_MASK    0x07    /* Device which performed operation */
                    331: 
                    332: 
                    333: /* 
                    334:  * SCSI bus control lines rw, 
                    335:  * instantaneous readout of control lines 
                    336:  */
                    337: #define SOCL_REG               0x0b    
                    338: #define SOCL_REQ               0x80    /*  REQ ro */
                    339: #define SOCL_ACK               0x40    /*  ACK ro */
                    340: #define SOCL_BSY               0x20    /*  BSY ro */
                    341: #define SOCL_SEL               0x10    /*  SEL ro */
                    342: #define SOCL_ATN               0x08    /*  ATN ro */
                    343: #define SOCL_MSG               0x04    /*  MSG ro */
                    344: #define SOCL_CD                        0x02    /*  C/D ro */
                    345: #define SOCL_IO                        0x01    /*  I/O ro */
                    346: /* 
                    347:  * Synchronous SCSI Clock Control bits 
                    348:  * 0 - set by DCNTL 
                    349:  * 1 - SCLK / 1.0
                    350:  * 2 - SCLK / 1.5
                    351:  * 3 - SCLK / 2.0 
                    352:  */
                    353: #define SBCL_SSCF1             0x02    /* wo, -66 only */
                    354: #define SBCL_SSCF0             0x01    /* wo, -66 only */
                    355: #define SBCL_SSCF_MASK         0x03
                    356: 
                    357: /* 
                    358:  * XXX note : when reading the DSTAT and STAT registers to clear interrupts,
                    359:  * insure that 10 clocks elapse between the two  
                    360:  */
                    361: /* DMA status ro */
                    362: #define DSTAT_REG              0x0c    
                    363: #define DSTAT_DFE              0x80    /* DMA FIFO empty */
                    364: #define DSTAT_800_MDPE         0x40    /* Master Data Parity Error */
                    365: #define DSTAT_800_BF           0x20    /* Bus Fault */
                    366: #define DSTAT_ABRT             0x10    /* Aborted - set on error */
                    367: #define DSTAT_SSI              0x08    /* SCRIPTS single step interrupt */
                    368: #define DSTAT_SIR              0x04    /* SCRIPTS interrupt received - 
                    369:                                           set when INT instruction is 
                    370:                                           executed */
                    371: #define DSTAT_WTD              0x02    /* Watchdog timeout detected */
                    372: #define DSTAT_OPC              0x01    /* Illegal instruction */
                    373: #define DSTAT_800_IID          0x01    /* Same thing, different name */
                    374: 
                    375: 
                    376: /* NCR53c800 moves this stuff into SIST0 */
                    377: #define SSTAT0_REG             0x0d    /* SCSI status 0 ro */
                    378: #define SIST0_REG_800          0x42    
                    379: #define SSTAT0_MA              0x80    /* ini : phase mismatch,
                    380:                                         * tgt : ATN/ asserted 
                    381:                                         */
                    382: #define SSTAT0_CMP             0x40    /* function complete */
                    383: #define SSTAT0_700_STO         0x20    /* Selection or reselection timeout */
                    384: #define SIST0_800_SEL          0x20    /* Selected */
                    385: #define SSTAT0_700_SEL         0x10    /* Selected or reselected */
                    386: #define SIST0_800_RSL          0x10    /* Reselected */
                    387: #define SSTAT0_SGE             0x08    /* SCSI gross error */
                    388: #define SSTAT0_UDC             0x04    /* Unexpected disconnect */
                    389: #define SSTAT0_RST             0x02    /* SCSI RST/ received */
                    390: #define SSTAT0_PAR             0x01    /* Parity error */
                    391: 
                    392: /* And uses SSTAT0 for what was SSTAT1 */
                    393: 
                    394: #define SSTAT1_REG             0x0e    /* SCSI status 1 ro */
                    395: #define SSTAT1_ILF             0x80    /* SIDL full */
                    396: #define SSTAT1_ORF             0x40    /* SODR full */
                    397: #define SSTAT1_OLF             0x20    /* SODL full */
                    398: #define SSTAT1_AIP             0x10    /* Arbitration in progress */
                    399: #define SSTAT1_LOA             0x08    /* Lost arbitration */
                    400: #define SSTAT1_WOA             0x04    /* Won arbitration */
                    401: #define SSTAT1_RST             0x02    /* Instant readout of RST/ */
                    402: #define SSTAT1_SDP             0x01    /* Instant readout of SDP/ */
                    403: 
                    404: #define SSTAT2_REG             0x0f    /* SCSI status 2 ro */
                    405: #define SSTAT2_FF3             0x80    /* number of bytes in synchronous */
                    406: #define SSTAT2_FF2             0x40    /* data FIFO */
                    407: #define SSTAT2_FF1             0x20    
                    408: #define SSTAT2_FF0             0x10
                    409: #define SSTAT2_FF_MASK         0xf0
                    410: #define SSTAT2_FF_SHIFT                4
                    411: 
                    412: /* 
                    413:  * Latched signals, latched on the leading edge of REQ/ for initiators,
                    414:  * ACK/ for targets.
                    415:  */
                    416: #define SSTAT2_SDP             0x08    /* SDP */
                    417: #define SSTAT2_MSG             0x04    /* MSG */
                    418: #define SSTAT2_CD              0x02    /* C/D */
                    419: #define SSTAT2_IO              0x01    /* I/O */
                    420: #define SSTAT2_PHASE_CMDOUT    SSTAT2_CD
                    421: #define SSTAT2_PHASE_DATAIN    SSTAT2_IO
                    422: #define SSTAT2_PHASE_DATAOUT   0
                    423: #define SSTAT2_PHASE_MSGIN     (SSTAT2_CD|SSTAT2_IO|SSTAT2_MSG)
                    424: #define SSTAT2_PHASE_MSGOUT    (SSTAT2_CD|SSTAT2_MSG)
                    425: #define SSTAT2_PHASE_STATIN    (SSTAT2_CD|SSTAT2_IO)
                    426: #define SSTAT2_PHASE_MASK      (SSTAT2_CD|SSTAT2_IO|SSTAT2_MSG)
                    427: 
                    428: 
                    429: /* NCR53c700-66 only */
                    430: #define SCRATCHA_REG_00                0x10    /* through  0x13 Scratch A rw */
                    431: /* NCR53c710 and higher */
                    432: #define DSA_REG                        0x10    /* DATA structure address */
                    433: 
                    434: #define CTEST0_REG_700         0x14    /* Chip test 0 ro */
                    435: #define CTEST0_REG_800         0x18    /* Chip test 0 rw, general purpose */
                    436: /* 0x80 - 0x04 are reserved */
                    437: #define CTEST0_700_RTRG                0x02    /* Real target mode */
                    438: #define CTEST0_700_DDIR                0x01    /* Data direction, 1 = 
                    439:                                         * SCSI bus to host, 0  =
                    440:                                         * host to SCSI.
                    441:                                         */
                    442: 
                    443: #define CTEST1_REG_700         0x15    /* Chip test 1 ro */
                    444: #define CTEST1_REG_800         0x19    /* Chip test 1 ro */
                    445: #define CTEST1_FMT3            0x80    /* Identify which byte lanes are empty */
                    446: #define CTEST1_FMT2            0x40    /* in the DMA FIFO */
                    447: #define CTEST1_FMT1            0x20
                    448: #define CTEST1_FMT0            0x10
                    449: 
                    450: #define CTEST1_FFL3            0x08    /* Identify which bytes lanes are full */
                    451: #define CTEST1_FFL2            0x04    /* in the DMA FIFO */
                    452: #define CTEST1_FFL1            0x02
                    453: #define CTEST1_FFL0            0x01
                    454: 
                    455: #define CTEST2_REG_700         0x16    /* Chip test 2 ro */
                    456: #define CTEST2_REG_800         0x1a    /* Chip test 2 ro */
                    457: 
                    458: #define CTEST2_800_DDIR                0x80    /* 1 = SCSI->host */
                    459: #define CTEST2_800_SIGP                0x40    /* A copy of SIGP in ISTAT.
                    460:                                           Reading this register clears */
                    461: #define CTEST2_800_CIO         0x20    /* Configured as IO */.
                    462: #define CTEST2_800_CM          0x10    /* Configured as memory */
                    463: 
                    464: /* 0x80 - 0x40 are reserved on 700 series chips */
                    465: #define CTEST2_700_SOFF                0x20    /* SCSI Offset Compare,
                    466:                                         * As an initiator, this bit is 
                    467:                                         * one when the synchronous offset
                    468:                                         * is zero, as a target this bit 
                    469:                                         * is one when the synchronous 
                    470:                                         * offset is at the maximum
                    471:                                         * defined in SXFER
                    472:                                         */
                    473: #define CTEST2_700_SFP         0x10    /* SCSI FIFO parity bit,
                    474:                                         * reading CTEST3 unloads a byte
                    475:                                         * from the FIFO and sets this
                    476:                                         */
                    477: #define CTEST2_700_DFP         0x08    /* DMA FIFO parity bit,
                    478:                                         * reading CTEST6 unloads a byte
                    479:                                         * from the FIFO and sets this
                    480:                                         */
                    481: #define CTEST2_TEOP            0x04    /* SCSI true end of process,
                    482:                                         * indicates a totally finished
                    483:                                         * transfer
                    484:                                         */
                    485: #define CTEST2_DREQ            0x02    /* Data request signal */
                    486: /* 0x01 is reserved on 700 series chips */
                    487: #define CTEST2_800_DACK                0x01    
                    488: 
                    489: /* 
                    490:  * Chip test 3 ro 
                    491:  * Unloads the bottom byte of the eight deep SCSI synchronous FIFO,
                    492:  * check SSTAT2 FIFO full bits to determine size.  Note that a GROSS
                    493:  * error results if a read is attempted on this register.  Also note 
                    494:  * that 16 and 32 bit reads of this register will cause corruption.
                    495:  */
                    496: #define CTEST3_REG_700         0x17    
                    497: /*  Chip test 3 rw */
                    498: #define CTEST3_REG_800         0x1b
                    499: #define CTEST3_800_V3          0x80    /* Chip revision */
                    500: #define CTEST3_800_V2          0x40
                    501: #define CTEST3_800_V1          0x20
                    502: #define CTEST3_800_V0          0x10
                    503: #define CTEST3_800_FLF         0x08    /* Flush DMA FIFO */
                    504: #define CTEST3_800_CLF         0x04    /* Clear DMA FIFO */
                    505: #define CTEST3_800_FM          0x02    /* Fetch mode pin */
                    506: /* bit 0 is reserved on 800 series chips */
                    507: 
                    508: #define CTEST4_REG_700         0x18    /* Chip test 4 rw */
                    509: #define CTEST4_REG_800         0x21    /* Chip test 4 rw */
                    510: /* 0x80 is reserved on 700 series chips */
                    511: #define CTEST4_800_BDIS                0x80    /* Burst mode disable */
                    512: #define CTEST4_ZMOD            0x40    /* High impedance mode */
                    513: #define CTEST4_SZM             0x20    /* SCSI bus high impedance */
                    514: #define CTEST4_700_SLBE                0x10    /* SCSI loopback enabled */
                    515: #define CTEST4_800_SRTM                0x10    /* Shadow Register Test Mode */
                    516: #define CTEST4_700_SFWR                0x08    /* SCSI FIFO write enable, 
                    517:                                         * redirects writes from SODL
                    518:                                         * to the SCSI FIFO.
                    519:                                         */
                    520: #define CTEST4_800_MPEE                0x08    /* Enable parity checking
                    521:                                           during master cycles on PCI
                    522:                                           bus */
                    523: 
                    524: /* 
                    525:  * These bits send the contents of the CTEST6 register to the appropriate
                    526:  * byte lane of the 32 bit DMA FIFO.  Normal operation is zero, otherwise 
                    527:  * the high bit means the low two bits select the byte lane.
                    528:  */
                    529: #define CTEST4_FBL2            0x04    
                    530: #define CTEST4_FBL1            0x02
                    531: #define CTEST4_FBL0            0x01    
                    532: #define CTEST4_FBL_MASK                0x07
                    533: #define CTEST4_FBL_0           0x04    /* Select DMA FIFO byte lane 0 */
                    534: #define CTEST4_FBL_1           0x05    /* Select DMA FIFO byte lane 1 */
                    535: #define CTEST4_FBL_2           0x06    /* Select DMA FIFO byte lane 2 */
                    536: #define CTEST4_FBL_3           0x07    /* Select DMA FIFO byte lane 3 */
                    537: #define CTEST4_800_SAVE                (CTEST4_800_BDIS)
                    538: 
                    539: 
                    540: #define CTEST5_REG_700         0x19    /* Chip test 5 rw */
                    541: #define CTEST5_REG_800         0x22    /* Chip test 5 rw */
                    542: /* 
                    543:  * Clock Address Incrementor.  When set, it increments the 
                    544:  * DNAD register to the next bus size boundary.  It automatically 
                    545:  * resets itself when the operation is complete.
                    546:  */
                    547: #define CTEST5_ADCK            0x80
                    548: /*
                    549:  * Clock Byte Counter.  When set, it decrements the DBC register to
                    550:  * the next bus size boundary.
                    551:  */
                    552: #define CTEST5_BBCK            0x40
                    553: /*
                    554:  * Reset SCSI Offset.  Setting this bit to 1 clears the current offset
                    555:  * pointer in the SCSI synchronous offset counter (SSTAT).  This bit
                    556:  * is set to 1 if a SCSI Gross Error Condition occurs.  The offset should
                    557:  * be cleared when a synchronous transfer fails.  When written, it is 
                    558:  * automatically cleared after the SCSI synchronous offset counter is 
                    559:  * reset.
                    560:  */
                    561: /* Bit 5 is reserved on 800 series chips */
                    562: #define CTEST5_700_ROFF                0x20
                    563: /* 
                    564:  * Master Control for Set or Reset pulses. When 1, causes the low 
                    565:  * four bits of register to set when set, 0 causes the low bits to
                    566:  * clear when set.
                    567:  */
                    568: #define CTEST5_MASR            0x10    
                    569: #define CTEST5_DDIR            0x08    /* DMA direction */
                    570: /*
                    571:  * Bits 2-0 are reserved on 800 series chips
                    572:  */
                    573: #define CTEST5_700_EOP         0x04    /* End of process */
                    574: #define CTEST5_700_DREQ                0x02    /* Data request */
                    575: #define CTEST5_700_DACK                0x01    /* Data acknowledge */
                    576: 
                    577: /* 
                    578:  * Chip test 6 rw - writing to this register writes to the byte 
                    579:  * lane in the DMA FIFO as determined by the FBL bits in the CTEST4
                    580:  * register.
                    581:  */
                    582: #define CTEST6_REG_700         0x1a
                    583: #define CTEST6_REG_800         0x23
                    584: 
                    585: #define CTEST7_REG             0x1b    /* Chip test 7 rw */
                    586: /* 0x80 - 0x40 are reserved on NCR53c700 and NCR53c700-66 chips */
                    587: #define CTEST7_10_CDIS         0x80    /* Cache burst disable */
                    588: #define CTEST7_10_SC1          0x40    /* Snoop control bits */
                    589: #define CTEST7_10_SC0          0x20    
                    590: #define CTEST7_10_SC_MASK      0x60
                    591: /* 0x20 is reserved on the NCR53c700 */
                    592: #define CTEST7_0060_FM         0x20    /* Fetch mode */
                    593: #define CTEST7_STD             0x10    /* Selection timeout disable */
                    594: #define CTEST7_DFP             0x08    /* DMA FIFO parity bit for CTEST6 */
                    595: #define CTEST7_EVP             0x04    /* 1 = host bus even parity, 0 = odd */
                    596: #define CTEST7_10_TT1          0x02    /* Transfer type */
                    597: #define CTEST7_00_DC           0x02    /* Set to drive DC low during instruction 
                    598:                                           fetch */
                    599: #define CTEST7_DIFF            0x01    /* Differential mode */
                    600: 
                    601: #define CTEST7_SAVE ( CTEST7_EVP | CTEST7_DIFF )
                    602: 
                    603: 
                    604: #define TEMP_REG               0x1c    /* through 0x1f Temporary stack rw */
                    605: 
                    606: #define DFIFO_REG              0x20    /* DMA FIFO rw */
                    607: /* 
                    608:  * 0x80 is reserved on the NCR53c710, the CLF and FLF bits have been
                    609:  * moved into the CTEST8 register.
                    610:  */
                    611: #define DFIFO_00_FLF           0x80    /* Flush DMA FIFO to memory */
                    612: #define DFIFO_00_CLF           0x40    /* Clear DMA and SCSI FIFOs */
                    613: #define DFIFO_BO6              0x40
                    614: #define DFIFO_BO5              0x20
                    615: #define DFIFO_BO4              0x10
                    616: #define DFIFO_BO3              0x08
                    617: #define DFIFO_BO2              0x04 
                    618: #define DFIFO_BO1              0x02
                    619: #define DFIFO_BO0              0x01
                    620: #define DFIFO_10_BO_MASK       0x7f    /* 7 bit counter */
                    621: #define DFIFO_00_BO_MASK       0x3f    /* 6 bit counter */
                    622: 
                    623: /* 
                    624:  * Interrupt status rw 
                    625:  * Note that this is the only register which can be read while SCSI
                    626:  * SCRIPTS are being executed.
                    627:  */
                    628: #define ISTAT_REG_700          0x21
                    629: #define ISTAT_REG_800          0x14
                    630: #define ISTAT_ABRT             0x80    /* Software abort, write 
                    631:                                         *1 to abort, wait for interrupt. */
                    632: /* 0x40 and 0x20 are reserved on NCR53c700 and NCR53c700-66 chips */
                    633: #define ISTAT_10_SRST          0x40    /* software reset */
                    634: #define ISTAT_10_SIGP          0x20    /* signal script */
                    635: /* 0x10 is reserved on NCR53c700 series chips */
                    636: #define ISTAT_800_SEM          0x10    /* semaphore */
                    637: #define ISTAT_CON              0x08    /* 1 when connected */
                    638: #define ISTAT_800_INTF         0x04    /* Interrupt on the fly */
                    639: #define ISTAT_700_PRE          0x04    /* Pointer register empty.
                    640:                                         * Set to 1 when DSPS and DSP
                    641:                                         * registers are empty in pipeline
                    642:                                         * mode, always set otherwise.
                    643:                                         */
                    644: #define ISTAT_SIP              0x02    /* SCSI interrupt pending from
                    645:                                         * SCSI portion of SIOP see
                    646:                                         * SSTAT0
                    647:                                         */
                    648: #define ISTAT_DIP              0x01    /* DMA interrupt pending 
                    649:                                         * see DSTAT
                    650:                                         */
                    651: 
                    652: /* NCR53c700-66 and NCR53c710 only */
                    653: #define CTEST8_REG             0x22    /* Chip test 8 rw */
                    654: #define CTEST8_0066_EAS                0x80    /* Enable alternate SCSI clock,
                    655:                                         * ie read from SCLK/ rather than CLK/
                    656:                                         */
                    657: #define CTEST8_0066_EFM                0x40    /* Enable fetch and master outputs */
                    658: #define CTEST8_0066_GRP                0x20    /* Generate Receive Parity for 
                    659:                                         * pass through.  This insures that 
                    660:                                         * bad parity won't reach the host 
                    661:                                         * bus.
                    662:                                         */
                    663: #define CTEST8_0066_TE         0x10    /* TolerANT enable.  Enable 
                    664:                                         * active negation, should only
                    665:                                         * be used for slow SCSI 
                    666:                                         * non-differential.
                    667:                                         */
                    668: #define CTEST8_0066_HSC                0x08    /* Halt SCSI clock */
                    669: #define CTEST8_0066_SRA                0x04    /* Shorten REQ/ACK filtering,
                    670:                                         * must be set for fast SCSI-II
                    671:                                         * speeds.
                    672:                                         */
                    673: #define CTEST8_0066_DAS                0x02    /* Disable automatic target/initiator
                    674:                                         * switching.
                    675:                                         */
                    676: #define CTEST8_0066_LDE                0x01    /* Last disconnect enable.
                    677:                                         * The status of pending 
                    678:                                         * disconnect is maintained by
                    679:                                         * the core, eliminating
                    680:                                         * the possibility of missing a 
                    681:                                         * selection or reselection
                    682:                                         * while waiting to fetch a 
                    683:                                         * WAIT DISCONNECT opcode.
                    684:                                         */
                    685: 
                    686: #define CTEST8_10_V3           0x80    /* Chip revision */
                    687: #define CTEST8_10_V2           0x40
                    688: #define CTEST8_10_V1           0x20    
                    689: #define CTEST8_10_V0           0x10
                    690: #define CTEST8_10_V_MASK       0xf0    
                    691: #define CTEST8_10_FLF          0x08    /* Flush FIFOs */
                    692: #define CTEST8_10_CLF          0x04    /* Clear FIFOs */
                    693: #define CTEST8_10_FM           0x02    /* Fetch pin mode */
                    694: #define CTEST8_10_SM           0x01    /* Snoop pin mode */
                    695: 
                    696: 
                    697: /* 
                    698:  * The CTEST9 register may be used to differentiate between a
                    699:  * NCR53c700 and a NCR53c710.  
                    700:  *
                    701:  * Write 0xff to this register.
                    702:  * Read it.
                    703:  * If the contents are 0xff, it is a NCR53c700
                    704:  * If the contents are 0x00, it is a NCR53c700-66 first revision
                    705:  * If the contents are some other value, it is some other NCR53c700-66
                    706:  */
                    707: #define CTEST9_REG_00          0x23    /* Chip test 9 ro */
                    708: #define LCRC_REG_10            0x23    
                    709: 
                    710: /*
                    711:  * 0x24 through 0x27 are the DMA byte counter register.  Instructions
                    712:  * write their high 8 bits into the DCMD register, the low 24 bits into
                    713:  * the DBC register.
                    714:  *
                    715:  * Function is dependent on the command type being executed.
                    716:  */
                    717: 
                    718:  
                    719: #define DBC_REG                        0x24
                    720: /* 
                    721:  * For Block Move Instructions, DBC is a 24 bit quantity representing 
                    722:  *     the number of bytes to transfer.
                    723:  * For Transfer Control Instructions, DBC is bit fielded as follows : 
                    724:  */
                    725: /* Bits 20 - 23 should be clear */
                    726: #define DBC_TCI_TRUE           (1 << 19)       /* Jump when true */
                    727: #define DBC_TCI_COMPARE_DATA   (1 << 18)       /* Compare data */
                    728: #define DBC_TCI_COMPARE_PHASE  (1 << 17)       /* Compare phase with DCMD field */
                    729: #define DBC_TCI_WAIT_FOR_VALID (1 << 16)       /* Wait for REQ */
                    730: /* Bits 8 - 15 are reserved on some implementations ? */
                    731: #define DBC_TCI_MASK_MASK      0xff00          /* Mask for data compare */
                    732: #define DBC_TCI_MASK_SHIFT     8
                    733: #define DBC_TCI_DATA_MASK      0xff            /* Data to be compared */ 
                    734: #define DBC_TCI_DATA_SHIFT     0
                    735: 
                    736: #define DBC_RWRI_IMMEDIATE_MASK        0xff00          /* Immediate data */
                    737: #define DBC_RWRI_IMMEDIATE_SHIFT 8             /* Amount to shift */
                    738: #define DBC_RWRI_ADDRESS_MASK  0x3f0000        /* Register address */
                    739: #define DBC_RWRI_ADDRESS_SHIFT         16
                    740: 
                    741: 
                    742: /*
                    743:  * DMA command r/w
                    744:  */
                    745: #define DCMD_REG               0x27    
                    746: #define DCMD_TYPE_MASK         0xc0    /* Masks off type */
                    747: #define DCMD_TYPE_BMI          0x00    /* Indicates a Block Move instruction */
                    748: #define DCMD_BMI_IO            0x01    /* I/O, CD, and MSG bits selecting   */
                    749: #define DCMD_BMI_CD            0x02    /* the phase for the block MOVE      */
                    750: #define DCMD_BMI_MSG           0x04    /* instruction                       */
                    751: 
                    752: #define DCMD_BMI_OP_MASK       0x18    /* mask for opcode */
                    753: #define DCMD_BMI_OP_MOVE_T     0x00    /* MOVE */
                    754: #define DCMD_BMI_OP_MOVE_I     0x08    /* MOVE Initiator */
                    755: 
                    756: #define DCMD_BMI_INDIRECT      0x20    /*  Indirect addressing */
                    757: 
                    758: #define DCMD_TYPE_TCI          0x80    /* Indicates a Transfer Control 
                    759:                                           instruction */
                    760: #define DCMD_TCI_IO            0x01    /* I/O, CD, and MSG bits selecting   */
                    761: #define DCMD_TCI_CD            0x02    /* the phase for the block MOVE      */
                    762: #define DCMD_TCI_MSG           0x04    /* instruction                       */
                    763: #define DCMD_TCI_OP_MASK       0x38    /* mask for opcode */
                    764: #define DCMD_TCI_OP_JUMP       0x00    /* JUMP */
                    765: #define DCMD_TCI_OP_CALL       0x08    /* CALL */
                    766: #define DCMD_TCI_OP_RETURN     0x10    /* RETURN */
                    767: #define DCMD_TCI_OP_INT                0x18    /* INT */
                    768: 
                    769: #define DCMD_TYPE_RWRI         0x40    /* Indicates I/O or register Read/Write
                    770:                                           instruction */
                    771: #define DCMD_RWRI_OPC_MASK     0x38    /* Opcode mask */
                    772: #define DCMD_RWRI_OPC_WRITE    0x28    /* Write SFBR to register */
                    773: #define DCMD_RWRI_OPC_READ     0x30    /* Read register to SFBR */
                    774: #define DCMD_RWRI_OPC_MODIFY   0x38    /* Modify in place */
                    775: 
                    776: #define DCMD_RWRI_OP_MASK      0x07
                    777: #define DCMD_RWRI_OP_MOVE      0x00
                    778: #define DCMD_RWRI_OP_SHL       0x01
                    779: #define DCMD_RWRI_OP_OR                0x02
                    780: #define DCMD_RWRI_OP_XOR       0x03
                    781: #define DCMD_RWRI_OP_AND       0x04
                    782: #define DCMD_RWRI_OP_SHR       0x05
                    783: #define DCMD_RWRI_OP_ADD       0x06
                    784: #define DCMD_RWRI_OP_ADDC      0x07
                    785: 
                    786: #define DCMD_TYPE_MMI          0xc0    /* Indicates a Memory Move instruction 
                    787:                                           (three words) */
                    788: 
                    789: 
                    790: #define DNAD_REG               0x28    /* through 0x2b DMA next address for 
                    791:                                           data */
                    792: #define DSP_REG                        0x2c    /* through 0x2f DMA SCRIPTS pointer rw */
                    793: #define DSPS_REG               0x30    /* through 0x33 DMA SCRIPTS pointer 
                    794:                                           save rw */
                    795: #define DMODE_REG_00           0x34    /* DMA mode rw */
                    796: #define DMODE_00_BL1   0x80    /* Burst length bits */
                    797: #define DMODE_00_BL0   0x40
                    798: #define DMODE_BL_MASK  0xc0
                    799: /* Burst lengths (800) */
                    800: #define DMODE_BL_2     0x00    /* 2 transfer */
                    801: #define DMODE_BL_4     0x40    /* 4 transfers */
                    802: #define DMODE_BL_8     0x80    /* 8 transfers */
                    803: #define DMODE_BL_16    0xc0    /* 16 transfers */
                    804: 
                    805: #define DMODE_700_BW16 0x20    /* Host buswidth = 16 */
                    806: #define DMODE_700_286  0x10    /* 286 mode */
                    807: #define DMODE_700_IOM  0x08    /* Transfer to IO port */
                    808: #define DMODE_700_FAM  0x04    /* Fixed address mode */
                    809: #define DMODE_700_PIPE 0x02    /* Pipeline mode disables 
                    810:                                         * automatic fetch / exec 
                    811:                                         */
                    812: #define DMODE_MAN      0x01            /* Manual start mode, 
                    813:                                         * requires a 1 to be written
                    814:                                         * to the start DMA bit in the DCNTL
                    815:                                         * register to run scripts 
                    816:                                         */
                    817: 
                    818: #define DMODE_700_SAVE ( DMODE_00_BL_MASK | DMODE_00_BW16 | DMODE_00_286 )
                    819: 
                    820: /* NCR53c800 series only */
                    821: #define SCRATCHA_REG_800       0x34    /* through 0x37 Scratch A rw */
                    822: /* NCR53c710 only */
                    823: #define SCRATCB_REG_10         0x34    /* through 0x37 scratch B rw */
                    824: 
                    825: #define DMODE_REG_10           0x38    /* DMA mode rw, NCR53c710 and newer */
                    826: #define DMODE_800_SIOM         0x20    /* Source IO = 1 */
                    827: #define DMODE_800_DIOM         0x10    /* Destination IO = 1 */
                    828: #define DMODE_800_ERL          0x08    /* Enable Read Line */
                    829: 
                    830: /* 35-38 are reserved on 700 and 700-66 series chips */
                    831: #define DIEN_REG               0x39    /* DMA interrupt enable rw */
                    832: /* 0x80, 0x40, and 0x20 are reserved on 700-series chips */
                    833: #define DIEN_800_MDPE          0x40    /* Master data parity error */
                    834: #define DIEN_800_BF            0x20    /* BUS fault */
                    835: #define DIEN_ABRT              0x10    /* Enable aborted interrupt */
                    836: #define DIEN_SSI               0x08    /* Enable single step interrupt */
                    837: #define DIEN_SIR               0x04    /* Enable SCRIPTS INT command 
                    838:                                         * interrupt
                    839:                                         */
                    840: /* 0x02 is reserved on 800 series chips */
                    841: #define DIEN_700_WTD           0x02    /* Enable watchdog timeout interrupt */
                    842: #define DIEN_700_OPC           0x01    /* Enable illegal instruction 
                    843:                                         * interrupt 
                    844:                                         */
                    845: #define DIEN_800_IID           0x01    /*  Same meaning, different name */ 
                    846: 
                    847: /*
                    848:  * DMA watchdog timer rw
                    849:  * set in 16 CLK input periods.
                    850:  */
                    851: #define DWT_REG                        0x3a
                    852: 
                    853: /* DMA control rw */
                    854: #define DCNTL_REG              0x3b
                    855: #define DCNTL_700_CF1          0x80    /* Clock divisor bits */
                    856: #define DCNTL_700_CF0          0x40
                    857: #define DCNTL_700_CF_MASK      0xc0
                    858: /* Clock divisors                         Divisor SCLK range (MHZ) */
                    859: #define DCNTL_700_CF_2         0x00    /* 2.0     37.51-50.00 */
                    860: #define DCNTL_700_CF_1_5       0x40    /* 1.5     25.01-37.50 */
                    861: #define DCNTL_700_CF_1         0x80    /* 1.0     16.67-25.00 */
                    862: #define DCNTL_700_CF_3         0xc0    /* 3.0     50.01-66.67 (53c700-66) */
                    863: 
                    864: #define DCNTL_700_S16          0x20    /* Load scripts 16 bits at a time */
                    865: #define DCNTL_SSM              0x10    /* Single step mode */
                    866: #define DCNTL_700_LLM          0x08    /* Low level mode, can only be set 
                    867:                                         * after selection */
                    868: #define DCNTL_800_IRQM         0x08    /* Totem pole IRQ pin */
                    869: #define DCNTL_STD              0x04    /* Start DMA / SCRIPTS */
                    870: /* 0x02 is reserved */
                    871: #define DCNTL_00_RST           0x01    /* Software reset, resets everything
                    872:                                         * but 286 mode bit  in DMODE. On the
                    873:                                         * NCR53c710, this bit moved to CTEST8
                    874:                                         */
                    875: #define DCNTL_10_COM           0x01    /* 700 software compatibility mode */
                    876: 
                    877: #define DCNTL_700_SAVE ( DCNTL_CF_MASK | DCNTL_S16)
                    878: 
                    879: 
                    880: /* NCR53c700-66 only */
                    881: #define SCRATCHB_REG_00                0x3c    /* through 0x3f scratch b rw */
                    882: #define SCRATCHB_REG_800       0x5c    /* through 0x5f scratch b rw */
                    883: /* NCR53c710 only */
                    884: #define ADDER_REG_10           0x3c    /* Adder, NCR53c710 only */
                    885: 
                    886: #define SIEN1_REG_800          0x41
                    887: #define SIEN1_800_STO          0x04    /* selection/reselection timeout */
                    888: #define SIEN1_800_GEN          0x02    /* general purpose timer */
                    889: #define SIEN1_800_HTH          0x01    /* handshake to handshake */
                    890: 
                    891: #define SIST1_REG_800          0x43
                    892: #define SIST1_800_STO          0x04    /* selection/reselection timeout */
                    893: #define SIST1_800_GEN          0x02    /* general purpose timer */
                    894: #define SIST1_800_HTH          0x01    /* handshake to handshake */
                    895: 
                    896: #define SLPAR_REG_800          0x44    /* Parity */
                    897: 
                    898: #define MACNTL_REG_800         0x46    /* Memory access control */
                    899: #define MACNTL_800_TYP3                0x80
                    900: #define MACNTL_800_TYP2                0x40
                    901: #define MACNTL_800_TYP1                0x20
                    902: #define MACNTL_800_TYP0                0x10
                    903: #define MACNTL_800_DWR         0x08
                    904: #define MACNTL_800_DRD         0x04
                    905: #define MACNTL_800_PSCPT       0x02
                    906: #define MACNTL_800_SCPTS       0x01
                    907: 
                    908: #define GPCNTL_REG_800         0x47    /* General Purpose Pin Control */
                    909: 
                    910: /* Timeouts are expressed such that 0=off, 1=100us, doubling after that */
                    911: #define STIME0_REG_800         0x48    /* SCSI Timer Register 0 */
                    912: #define STIME0_800_HTH_MASK    0xf0    /* Handshake to Handshake timeout */
                    913: #define STIME0_800_HTH_SHIFT   4
                    914: #define STIME0_800_SEL_MASK    0x0f    /* Selection timeout */
                    915: #define STIME0_800_SEL_SHIFT   0
                    916: 
                    917: #define STIME1_REG_800         0x49
                    918: #define STIME1_800_GEN_MASK    0x0f    /* General purpose timer */
                    919: 
                    920: #define RESPID_REG_800         0x4a    /* Response ID, bit fielded.  8
                    921:                                           bits on narrow chips, 16 on WIDE */
                    922: 
                    923: #define STEST0_REG_800         0x4c    
                    924: #define STEST0_800_SLT         0x08    /* Selection response logic test */
                    925: #define STEST0_800_ART         0x04    /* Arbitration priority encoder test */
                    926: #define STEST0_800_SOZ         0x02    /* Synchronous offset zero */
                    927: #define STEST0_800_SOM         0x01    /* Synchronous offset maximum */
                    928: 
                    929: #define STEST1_REG_800         0x4d
                    930: #define STEST1_800_SCLK                0x80    /* Disable SCSI clock */
                    931: 
                    932: #define STEST2_REG_800         0x4e    
                    933: #define STEST2_800_SCE         0x80    /* Enable SOCL/SODL */
                    934: #define STEST2_800_ROF         0x40    /* Reset SCSI sync offset */
                    935: #define STEST2_800_SLB         0x10    /* Enable SCSI loopback mode */
                    936: #define STEST2_800_SZM         0x08    /* SCSI high impedance mode */
                    937: #define STEST2_800_EXT         0x02    /* Extend REQ/ACK filter 30 to 60ns */
                    938: #define STEST2_800_LOW         0x01    /* SCSI low level mode */
                    939: 
                    940: #define STEST3_REG_800         0x4f     
                    941: #define STEST3_800_TE          0x80    /* Enable active negation */
                    942: #define STEST3_800_STR         0x40    /* SCSI FIFO test read */
                    943: #define STEST3_800_HSC         0x20    /* Halt SCSI clock */
                    944: #define STEST3_800_DSI         0x10    /* Disable single initiator response */
                    945: #define STEST3_800_TTM         0x04    /* Time test mode */
                    946: #define STEST3_800_CSF         0x02    /* Clear SCSI FIFO */
                    947: #define STEST3_800_STW         0x01    /* SCSI FIFO test write */
                    948: 
                    949: #define OPTION_PARITY          0x1     /* Enable parity checking */
                    950: #define OPTION_TAGGED_QUEUE    0x2     /* Enable SCSI-II tagged queuing */
                    951: #define OPTION_700             0x8     /* Always run NCR53c700 scripts */
                    952: #define OPTION_INTFLY          0x10    /* Use INTFLY interrupts */
                    953: #define OPTION_DEBUG_INTR      0x20    /* Debug interrupts */
                    954: #define OPTION_DEBUG_INIT_ONLY 0x40    /* Run initialization code and 
                    955:                                           simple test code, return
                    956:                                           DID_NO_CONNECT if any SCSI
                    957:                                           commands are attempted. */
                    958: #define OPTION_DEBUG_READ_ONLY 0x80    /* Return DID_ERROR if any 
                    959:                                           SCSI write is attempted */
                    960: #define OPTION_DEBUG_TRACE     0x100   /* Animated trace mode, print 
                    961:                                           each address and instruction 
                    962:                                           executed to debug buffer. */
                    963: #define OPTION_DEBUG_SINGLE    0x200   /* stop after executing one 
                    964:                                           instruction */
                    965: #define OPTION_SYNCHRONOUS     0x400   /* Enable sync SCSI.  */
                    966: #define OPTION_MEMORY_MAPPED   0x800   /* NCR registers have valid 
                    967:                                           memory mapping */
                    968: #define OPTION_IO_MAPPED       0x1000  /* NCR registers have valid
                    969:                                             I/O mapping */
                    970: #define OPTION_DEBUG_PROBE_ONLY        0x2000  /* Probe only, don't even init */
                    971: #define OPTION_DEBUG_TESTS_ONLY        0x4000  /* Probe, init, run selected tests */
                    972: #define OPTION_DEBUG_TEST0     0x08000 /* Run test 0 */
                    973: #define OPTION_DEBUG_TEST1     0x10000 /* Run test 1 */
                    974: #define OPTION_DEBUG_TEST2     0x20000 /* Run test 2 */
                    975: #define OPTION_DEBUG_DUMP      0x40000 /* Dump commands */
                    976: #define OPTION_DEBUG_TARGET_LIMIT 0x80000 /* Only talk to target+luns specified */
                    977: #define OPTION_DEBUG_NCOMMANDS_LIMIT 0x100000 /* Limit the number of commands */
                    978: #define OPTION_DEBUG_SCRIPT 0x200000 /* Print when checkpoints are passed */
                    979: #define OPTION_DEBUG_FIXUP 0x400000 /* print fixup values */
                    980: #define OPTION_DEBUG_DSA 0x800000
                    981: #define OPTION_DEBUG_CORRUPTION        0x1000000       /* Detect script corruption */
                    982: #define OPTION_DEBUG_SDTR       0x2000000      /* Debug SDTR problem */
                    983: #define OPTION_DEBUG_MISMATCH  0x4000000       /* Debug phase mismatches */
                    984: #define OPTION_DISCONNECT      0x8000000       /* Allow disconnect */
                    985: #define OPTION_DEBUG_DISCONNECT 0x10000000     
                    986: #define OPTION_ALWAYS_SYNCHRONOUS 0x20000000   /* Negotiate sync. transfers
                    987:                                                   on power up */
                    988: #define OPTION_DEBUG_QUEUES    0x80000000      
                    989: #define OPTION_DEBUG_ALLOCATION 0x100000000LL
                    990: #define OPTION_DEBUG_SYNCHRONOUS 0x200000000LL /* Sanity check SXFER and 
                    991:                                                   SCNTL3 registers */
                    992: #define OPTION_NO_ASYNC        0x400000000LL           /* Don't automagically send
                    993:                                                   SDTR for async transfers when
                    994:                                                   we haven't been told to do
                    995:                                                   a synchronous transfer. */
                    996: #define OPTION_NO_PRINT_RACE 0x800000000LL     /* Don't print message when
                    997:                                                   the reselect/WAIT DISCONNECT
                    998:                                                   race condition hits */
                    999: #if !defined(PERM_OPTIONS)
                   1000: #define PERM_OPTIONS 0
                   1001: #endif
                   1002:                                
                   1003: struct NCR53c7x0_synchronous {
                   1004:     u32 select_indirect;               /* Value used for indirect selection */
                   1005:     u32 script[8];                     /* Size ?? Script used when target is 
                   1006:                                                reselected */
                   1007:     unsigned char synchronous_want[5]; /* Per target desired SDTR */
                   1008: /* 
                   1009:  * Set_synchronous programs these, select_indirect and current settings after
                   1010:  * int_debug_should show a match.
                   1011:  */
                   1012:     unsigned char sxfer_sanity, scntl3_sanity;
                   1013: };
                   1014: 
                   1015: #define CMD_FLAG_SDTR          1       /* Initiating synchronous 
                   1016:                                           transfer negotiation */
                   1017: #define CMD_FLAG_WDTR          2       /* Initiating wide transfer
                   1018:                                           negotiation */
                   1019: #define CMD_FLAG_DID_SDTR      4       /* did SDTR */
                   1020: #define CMD_FLAG_DID_WDTR      8       /* did WDTR */
                   1021: 
                   1022: struct NCR53c7x0_table_indirect {
                   1023:     u32 count;
                   1024:     void *address;
                   1025: };
                   1026: 
                   1027: enum ncr_event { 
                   1028:     EVENT_NONE = 0,
                   1029: /* 
                   1030:  * Order is IMPORTANT, since these must correspond to the event interrupts
                   1031:  * in 53c7,8xx.scr 
                   1032:  */
                   1033: 
                   1034:     EVENT_ISSUE_QUEUE = 0x5000000,     /* Command was added to issue queue */
                   1035:     EVENT_START_QUEUE,                 /* Command moved to start queue */
                   1036:     EVENT_SELECT,                      /* Command completed selection */
                   1037:     EVENT_DISCONNECT,                  /* Command disconnected */
                   1038:     EVENT_RESELECT,                    /* Command reselected */
                   1039:     EVENT_COMPLETE,                    /* Command completed */
                   1040:     EVENT_IDLE,
                   1041:     EVENT_SELECT_FAILED,
                   1042:     EVENT_BEFORE_SELECT,
                   1043:     EVENT_RESELECT_FAILED
                   1044: };
                   1045: 
                   1046: struct NCR53c7x0_event {
                   1047:     enum ncr_event event;      /* What type of event */
                   1048:     unsigned char target;
                   1049:     unsigned char lun;
                   1050:     struct timeval time;       
                   1051:     u32 *dsa;                  /* What's in the DSA register now (virt) */
                   1052: /* 
                   1053:  * A few things from that SCSI pid so we know what happened after 
                   1054:  * the Scsi_Cmnd structure in question may have disappeared.
                   1055:  */
                   1056:     unsigned long pid;         /* The SCSI PID which caused this 
                   1057:                                   event */
                   1058:     unsigned char cmnd[12];
                   1059: };
                   1060: 
                   1061: /*
                   1062:  * Things in the NCR53c7x0_cmd structure are split into two parts :
                   1063:  *
                   1064:  * 1.  A fixed portion, for things which are not accessed directly by static NCR
                   1065:  *     code (ie, are referenced only by the Linux side of the driver,
                   1066:  *     or only by dynamically generated code).  
                   1067:  *
                   1068:  * 2.  The DSA portion, for things which are accessed directly by static NCR
                   1069:  *     code.
                   1070:  *
                   1071:  * This is a little ugly, but it 
                   1072:  * 1.  Avoids conflicts between the NCR code's picture of the structure, and 
                   1073:  *     Linux code's idea of what it looks like.
                   1074:  *
                   1075:  * 2.  Minimizes the pain in the Linux side of the code needed 
                   1076:  *     to calculate real dsa locations for things, etc.
                   1077:  * 
                   1078:  */
                   1079: 
                   1080: struct NCR53c7x0_cmd {
                   1081:     void *real;                                /* Real, unaligned address for
                   1082:                                           free function */
                   1083:     void (* free)(void *, int);                /* Command to deallocate; NULL
                   1084:                                           for structures allocated with
                   1085:                                           scsi_register, etc. */
                   1086:     Scsi_Cmnd *cmd;                    /* Associated Scsi_Cmnd 
                   1087:                                           structure, Scsi_Cmnd points
                   1088:                                           at NCR53c7x0_cmd using 
                   1089:                                           host_scribble structure */
                   1090: 
                   1091:     int size;                          /* scsi_malloc'd size of this 
                   1092:                                           structure */
                   1093: 
                   1094:     int flags;                         /* CMD_* flags */
                   1095: 
                   1096: /*
                   1097:  * SDTR and WIDE messages are an either/or affair
                   1098:  * in this message, since we will go into message out and send
                   1099:  * _the whole mess_ without dropping out of message out to 
                   1100:  * let the target go into message in after sending the first 
                   1101:  * message.
                   1102:  */
                   1103: 
                   1104:     unsigned char select[11];          /* Select message, includes
                   1105:                                           IDENTIFY
                   1106:                                           (optional) QUEUE TAG
                   1107:                                           (optional) SDTR or WDTR
                   1108:                                         */
                   1109: 
                   1110: 
                   1111:     volatile struct NCR53c7x0_cmd *next; /* Linux maintained lists (free,
                   1112:                                            running, eventually finished */
                   1113:                                         
                   1114: 
                   1115:     u32 *data_transfer_start;          /* Start of data transfer routines */
                   1116:     u32 *data_transfer_end;            /* Address after end of data transfer o
                   1117:                                           routines */
                   1118: /* 
                   1119:  * The following three fields were moved from the DSA proper to here
                   1120:  * since only dynamically generated NCR code refers to them, meaning
                   1121:  * we don't need dsa_* absolutes, and it is simpler to let the 
                   1122:  * host code refer to them directly.
                   1123:  */
                   1124: 
                   1125: /* 
                   1126:  * HARD CODED : residual and saved_residual need to agree with the sizes
                   1127:  * used in NCR53c7,8xx.scr.  
                   1128:  * 
                   1129:  * FIXME: we want to consider the case where we have odd-length 
                   1130:  *     scatter/gather buffers and a WIDE transfer, in which case 
                   1131:  *     we'll need to use the CHAIN MOVE instruction.  Ick.
                   1132:  */
                   1133:     u32 residual[6];                   /* Residual data transfer which
                   1134:                                           allows pointer code to work
                   1135:                                           right.
                   1136: 
                   1137:                                            [0-1] : Conditional call to 
                   1138:                                                appropriate other transfer 
                   1139:                                                routine.
                   1140:                                            [2-3] : Residual block transfer
                   1141:                                                instruction.
                   1142:                                            [4-5] : Jump to instruction
                   1143:                                                after splice.
                   1144:                                         */
                   1145:     u32 saved_residual[6];             /* Copy of old residual, so we 
                   1146:                                           can get another partial 
                   1147:                                           transfer and still recover 
                   1148:                                         */
                   1149:                
                   1150:     u32 saved_data_pointer;            /* Saved data pointer */
                   1151: 
                   1152:     u32 dsa_next_addr;                 /* _Address_ of dsa_next field  
                   1153:                                           in this dsa for RISCy 
                   1154:                                           style constant. */
                   1155: 
                   1156:     u32 dsa_addr;                      /* Address of dsa; RISCy style
                   1157:                                           constant */
                   1158: 
                   1159:     u32 dsa[0];                                /* Variable length (depending
                   1160:                                           on host type, number of scatter /
                   1161:                                           gather buffers, etc).  */
                   1162: };
                   1163: 
                   1164: struct NCR53c7x0_break {
                   1165:     u32 *address, old_instruction[2];
                   1166:     struct NCR53c7x0_break *next;
                   1167:     unsigned char old_size;            /* Size of old instruction */
                   1168: };
                   1169: 
                   1170: /* Indicates that the NCR is not executing code */
                   1171: #define STATE_HALTED   0               
                   1172: /* 
                   1173:  * Indicates that the NCR is executing the wait for select / reselect 
                   1174:  * script.  Only used when running NCR53c700 compatible scripts, only 
                   1175:  * state during which an ABORT is _not_ considered an error condition.
                   1176:  */
                   1177: #define STATE_WAITING  1               
                   1178: /* Indicates that the NCR is executing other code. */
                   1179: #define STATE_RUNNING  2               
                   1180: /* 
                   1181:  * Indicates that the NCR was being aborted.
                   1182:  */
                   1183: #define STATE_ABORTING 3
                   1184: /* Indicates that the NCR was successfully aborted. */
                   1185: #define STATE_ABORTED 4
                   1186: /* Indicates that the NCR has been disabled due to a fatal error */
                   1187: #define STATE_DISABLED 5
                   1188: 
                   1189: /* 
                   1190:  * Where knowledge of SCSI SCRIPT(tm) specified values are needed 
                   1191:  * in an interrupt handler, an interrupt handler exists for each 
                   1192:  * different SCSI script so we don't have name space problems.
                   1193:  * 
                   1194:  * Return values of these handlers are as follows : 
                   1195:  */
                   1196: #define SPECIFIC_INT_NOTHING   0       /* don't even restart */
                   1197: #define SPECIFIC_INT_RESTART   1       /* restart at the next instruction */
                   1198: #define SPECIFIC_INT_ABORT     2       /* recoverable error, abort cmd */
                   1199: #define SPECIFIC_INT_PANIC     3       /* unrecoverable error, panic */
                   1200: #define SPECIFIC_INT_DONE      4       /* normal command completion */
                   1201: #define SPECIFIC_INT_BREAK     5       /* break point encountered */
                   1202: 
                   1203: struct NCR53c7x0_hostdata {
                   1204:     int size;                          /* Size of entire Scsi_Host
                   1205:                                           structure */
                   1206:     int board;                         /* set to board type, useful if 
                   1207:                                           we have host specific things,
                   1208:                                           ie, a general purpose I/O 
                   1209:                                           bit is being used to enable
                   1210:                                           termination, etc. */
                   1211: 
                   1212:     int chip;                          /* set to chip type; 700-66 is
                   1213:                                           700-66, rest are last three
                   1214:                                           digits of part number */
                   1215:     /*
                   1216:      * PCI bus, device, function, only for NCR53c8x0 chips.
                   1217:      * pci_valid indicates that the PCI configuration information
                   1218:      * is valid, and we can twiddle MAX_LAT, etc. as recommended
                   1219:      * for maximum performance in the NCR documentation.
                   1220:      */
                   1221:     unsigned char pci_bus, pci_device_fn;
                   1222:     unsigned pci_valid:1;
                   1223: 
                   1224:     u32 *dsp;                          /* dsp to restart with after
                   1225:                                           all stacked interrupts are
                   1226:                                           handled. */
                   1227: 
                   1228:     unsigned dsp_changed:1;            /* Has dsp changed within this
                   1229:                                           set of stacked interrupts ? */
                   1230: 
                   1231:     unsigned char dstat;               /* Most recent value of dstat */
                   1232:     unsigned dstat_valid:1;
                   1233: 
                   1234:     unsigned expecting_iid:1;          /* Expect IID interrupt */
                   1235:     unsigned expecting_sto:1;          /* Expect STO interrupt */
                   1236:     
                   1237:     /* 
                   1238:      * The code stays cleaner if we use variables with function
                   1239:      * pointers and offsets that are unique for the different
                   1240:      * scripts rather than having a slew of switch(hostdata->chip) 
                   1241:      * statements.
                   1242:      * 
                   1243:      * It also means that the #defines from the SCSI SCRIPTS(tm)
                   1244:      * don't have to be visible outside of the script-specific
                   1245:      * instructions, preventing name space pollution.
                   1246:      */
                   1247: 
                   1248:     void (* init_fixup)(struct Scsi_Host *host);
                   1249:     void (* init_save_regs)(struct Scsi_Host *host);
                   1250:     void (* dsa_fixup)(struct NCR53c7x0_cmd *cmd);
                   1251:     void (* soft_reset)(struct Scsi_Host *host);
                   1252:     int (* run_tests)(struct Scsi_Host *host);
                   1253: 
                   1254:     /*
                   1255:      * Called when DSTAT_SIR is set, indicating an interrupt generated
                   1256:      * by the INT instruction, where values are unique for each SCSI
                   1257:      * script.  Should return one of the SPEC_* values.
                   1258:      */
                   1259: 
                   1260:     int (* dstat_sir_intr)(struct Scsi_Host *host, struct NCR53c7x0_cmd *cmd);
                   1261: 
                   1262:     int dsa_len; /* Size of DSA structure */
                   1263: 
                   1264:     /*
                   1265:      * Location of DSA fields for the SCSI SCRIPT corresponding to this 
                   1266:      * chip.  
                   1267:      */
                   1268: 
                   1269:     s32 dsa_start;                     
                   1270:     s32 dsa_end;                       
                   1271:     s32 dsa_next;
                   1272:     s32 dsa_prev;
                   1273:     s32 dsa_cmnd;
                   1274:     s32 dsa_select;
                   1275:     s32 dsa_msgout;
                   1276:     s32 dsa_cmdout;
                   1277:     s32 dsa_dataout;
                   1278:     s32 dsa_datain;
                   1279:     s32 dsa_msgin;
                   1280:     s32 dsa_msgout_other;
                   1281:     s32 dsa_write_sync;
                   1282:     s32 dsa_write_resume;
                   1283:     s32 dsa_check_reselect;
                   1284:     s32 dsa_status;
                   1285:     s32 dsa_saved_pointer;
                   1286:     s32 dsa_jump_dest;
                   1287: 
                   1288:     /* 
                   1289:      * Important entry points that generic fixup code needs
                   1290:      * to know about, fixed up.
                   1291:      */
                   1292: 
                   1293:     s32 E_accept_message;
                   1294:     s32 E_command_complete;            
                   1295:     s32 E_data_transfer;
                   1296:     s32 E_dsa_code_template;
                   1297:     s32 E_dsa_code_template_end;
                   1298:     s32 E_end_data_transfer;
                   1299:     s32 E_msg_in;
                   1300:     s32 E_initiator_abort;
                   1301:     s32 E_other_transfer;
                   1302:     s32 E_other_in;
                   1303:     s32 E_other_out;
                   1304:     s32 E_target_abort;
                   1305:     s32 E_debug_break; 
                   1306:     s32 E_reject_message;
                   1307:     s32 E_respond_message;
                   1308:     s32 E_select;
                   1309:     s32 E_select_msgout;
                   1310:     s32 E_test_0;
                   1311:     s32 E_test_1;
                   1312:     s32 E_test_2;
                   1313:     s32 E_test_3;
                   1314:     s32 E_dsa_zero;
                   1315:     s32 E_cmdout_cmdout;
                   1316:     s32 E_wait_reselect;
                   1317:     s32 E_dsa_code_begin;
                   1318: 
                   1319:     long long options;                 /* Bitfielded set of options enabled */
                   1320:     volatile u32 test_completed;       /* Test completed */
                   1321:     int test_running;                  /* Test currently running */
                   1322:     s32 test_source;
                   1323:     volatile s32 test_dest;
                   1324: 
                   1325:     volatile int state;                        /* state of driver, only used for 
                   1326:                                           OPTION_700 */
                   1327: 
                   1328:     unsigned char  dmode;              /* 
                   1329:                                         * set to the address of the DMODE 
                   1330:                                         * register for this chip.
                   1331:                                         */
                   1332:     unsigned char istat;               /* 
                   1333:                                         * set to the address of the ISTAT 
                   1334:                                         * register for this chip.
                   1335:                                         */
                   1336:   
                   1337:     int scsi_clock;                    /* 
                   1338:                                         * SCSI clock in HZ. 0 may be used 
                   1339:                                         * for unknown, although this will
                   1340:                                         * disable synchronous negotiation.
                   1341:                                         */
                   1342: 
                   1343:     volatile int intrs;                        /* Number of interrupts */
                   1344:     volatile int resets;               /* Number of SCSI resets */
                   1345:     unsigned char saved_dmode; 
                   1346:     unsigned char saved_ctest4;
                   1347:     unsigned char saved_ctest7;
                   1348:     unsigned char saved_dcntl;
                   1349:     unsigned char saved_scntl3;
                   1350: 
                   1351:     unsigned char this_id_mask;
                   1352: 
                   1353:     /* Debugger information */
                   1354:     struct NCR53c7x0_break *breakpoints, /* Linked list of all break points */
                   1355:        *breakpoint_current;            /* Current breakpoint being stepped 
                   1356:                                           through, NULL if we are running 
                   1357:                                           normally. */
                   1358: #ifdef NCR_DEBUG
                   1359:     int debug_size;                    /* Size of debug buffer */
                   1360:     volatile int debug_count;          /* Current data count */
                   1361:     volatile char *debug_buf;          /* Output ring buffer */
                   1362:     volatile char *debug_write;                /* Current write pointer */
                   1363:     volatile char *debug_read;         /* Current read pointer */
                   1364: #endif /* def NCR_DEBUG */
                   1365: 
                   1366:     /* XXX - primitive debugging junk, remove when working ? */
                   1367:     int debug_print_limit;             /* Number of commands to print
                   1368:                                           out exhaustive debugging
                   1369:                                           information for if 
                   1370:                                           OPTION_DEBUG_DUMP is set */ 
                   1371: 
                   1372:     unsigned char debug_lun_limit[16]; /* If OPTION_DEBUG_TARGET_LIMIT
                   1373:                                           set, puke if commands are sent
                   1374:                                           to other target/lun combinations */
                   1375: 
                   1376:     int debug_count_limit;             /* Number of commands to execute
                   1377:                                           before puking to limit debugging 
                   1378:                                           output */
                   1379:                                    
                   1380: 
                   1381:     volatile unsigned idle:1;                  /* set to 1 if idle */
                   1382: 
                   1383:     /* 
                   1384:      * Table of synchronous+wide transfer parameters set on a per-target
                   1385:      * basis.
                   1386:      */
                   1387:     
                   1388:     volatile struct NCR53c7x0_synchronous sync[16];
                   1389: 
                   1390:     volatile Scsi_Cmnd *issue_queue;
                   1391:                                                /* waiting to be issued by
                   1392:                                                   Linux driver */
                   1393:     volatile struct NCR53c7x0_cmd *running_list;       
                   1394:                                                /* commands running, maintained
                   1395:                                                   by Linux driver */
                   1396: 
                   1397:     volatile struct NCR53c7x0_cmd *current;    /* currently connected 
                   1398:                                                   nexus, ONLY valid for
                   1399:                                                   NCR53c700/NCR53c700-66
                   1400:                                                 */
                   1401: 
                   1402:     volatile struct NCR53c7x0_cmd *spare;      /* pointer to spare,
                   1403:                                                   allocated at probe time,
                   1404:                                                   which we can use for 
                   1405:                                                   initialization */
                   1406:     volatile struct NCR53c7x0_cmd *free;
                   1407:     int max_cmd_size;                          /* Maximum size of NCR53c7x0_cmd
                   1408:                                                   based on number of 
                   1409:                                                   scatter/gather segments, etc.
                   1410:                                                   */
                   1411:     volatile int num_cmds;                     /* Number of commands 
                   1412:                                                   allocated */
                   1413:     volatile int extra_allocate;
                   1414:     volatile unsigned char cmd_allocated[16];  /* Have we allocated commands
                   1415:                                                   for this target yet?  If not,
                   1416:                                                   do so ASAP */
                   1417:     volatile unsigned char busy[16][8];        /* number of commands 
                   1418:                                                   executing on each target
                   1419:                                                 */
                   1420:     /* 
                   1421:      * Eventually, I'll switch to a coroutine for calling 
                   1422:      * cmd->done(cmd), etc. so that we can overlap interrupt
                   1423:      * processing with this code for maximum performance.
                   1424:      */
                   1425:     
                   1426:     volatile struct NCR53c7x0_cmd *finished_queue;     
                   1427:                                                
                   1428: 
                   1429:     /* Shared variables between SCRIPT and host driver */
                   1430:     volatile u32 *schedule;                    /* Array of JUMPs to dsa_begin
                   1431:                                                   routines of various DSAs.  
                   1432:                                                   When not in use, replace
                   1433:                                                   with jump to next slot */
                   1434: 
                   1435: 
                   1436:     volatile unsigned char msg_buf[16];                /* buffer for messages
                   1437:                                                   other than the command
                   1438:                                                   complete message */
                   1439: 
                   1440:     /* Per-target default synchronous and WIDE messages */
                   1441:     volatile unsigned char synchronous_want[16][5];
                   1442:     volatile unsigned char wide_want[16][4];
                   1443: 
                   1444:     /* Bit fielded set of targets we want to speak synchronously with */ 
                   1445:     volatile u16 initiate_sdtr;        
                   1446:     /* Bit fielded set of targets we want to speak wide with */
                   1447:     volatile u16 initiate_wdtr;
                   1448:     /* Bit fielded list of targets we've talked to. */
                   1449:     volatile u16 talked_to;
                   1450: 
                   1451:     /* Array of bit-fielded lun lists that we need to request_sense */
                   1452:     volatile unsigned char request_sense[16];
                   1453: 
                   1454:     u32 addr_reconnect_dsa_head;               /* RISCy style constant,
                   1455:                                                   address of following */
                   1456:     volatile u32 reconnect_dsa_head;   
                   1457:     /* Data identifying nexus we are trying to match during reselection */
                   1458:     volatile unsigned char reselected_identify; /* IDENTIFY message */
                   1459:     volatile unsigned char reselected_tag;     /* second byte of queue tag 
                   1460:                                                   message or 0 */
                   1461:     /* These were static variables before we moved them */
                   1462: 
                   1463:     s32 NCR53c7xx_zero;
                   1464:     s32 NCR53c7xx_sink;
                   1465:     u32 NOP_insn;
                   1466:     char NCR53c7xx_msg_reject;
                   1467:     char NCR53c7xx_msg_abort;
                   1468:     char NCR53c7xx_msg_nop;
                   1469: 
                   1470:     volatile int event_size, event_index;
                   1471:     volatile struct NCR53c7x0_event *events;
                   1472: 
                   1473:     /* If we need to generate code to kill off the currently connected 
                   1474:        command, this is where we do it. Should have a BMI instruction
                   1475:        to source or sink the current data, followed by a JUMP
                   1476:        to abort_connected */
                   1477: 
                   1478:     u32 *abort_script;
                   1479: 
                   1480:     int script_count;                          /* Size of script in words */
                   1481:     u32 script[0];                             /* Relocated SCSI script */
                   1482: 
                   1483: };
                   1484: 
                   1485: #define IRQ_NONE       255
                   1486: #define DMA_NONE       255
                   1487: #define IRQ_AUTO       254
                   1488: #define DMA_AUTO       254
                   1489: 
                   1490: #define BOARD_GENERIC  0
                   1491: 
                   1492: #define NCR53c7x0_insn_size(insn)                                      \
                   1493:     (((insn) & DCMD_TYPE_MASK) == DCMD_TYPE_MMI ? 3 : 2)
                   1494:     
                   1495: 
                   1496: #define NCR53c7x0_local_declare()                                      \
                   1497:     volatile unsigned char *NCR53c7x0_address_memory;                  \
                   1498:     unsigned int NCR53c7x0_address_io;                                 \
                   1499:     int NCR53c7x0_memory_mapped
                   1500: 
                   1501: #define NCR53c7x0_local_setup(host)                                    \
                   1502:     NCR53c7x0_address_memory = (void *) (host)->base;                  \
                   1503:     NCR53c7x0_address_io = (unsigned int) (host)->io_port;             \
                   1504:     NCR53c7x0_memory_mapped = ((struct NCR53c7x0_hostdata *)           \
                   1505:        host->hostdata)-> options & OPTION_MEMORY_MAPPED 
                   1506: 
                   1507: #define NCR53c7x0_read8(address)                                       \
                   1508:     (NCR53c7x0_memory_mapped ?                                                 \
                   1509:        (unsigned int)readb(NCR53c7x0_address_memory + (address)) :     \
                   1510:        inb(NCR53c7x0_address_io + (address)))
                   1511: 
                   1512: #define NCR53c7x0_read16(address)                                      \
                   1513:     (NCR53c7x0_memory_mapped ?                                                 \
                   1514:        (unsigned int)readw(NCR53c7x0_address_memory + (address)) :     \
                   1515:        inw(NCR53c7x0_address_io + (address)))
                   1516: 
                   1517: #define NCR53c7x0_read32(address)                                      \
                   1518:     (NCR53c7x0_memory_mapped ?                                                 \
                   1519:        (unsigned int) readl(NCR53c7x0_address_memory + (address)) :    \
                   1520:        inl(NCR53c7x0_address_io + (address)))
                   1521: 
                   1522: #define NCR53c7x0_write8(address,value)                                \
                   1523:     (NCR53c7x0_memory_mapped ?                                                 \
                   1524:      ({writeb((value), NCR53c7x0_address_memory + (address)); mb();}) :        \
                   1525:        outb((value), NCR53c7x0_address_io + (address)))
                   1526: 
                   1527: #define NCR53c7x0_write16(address,value)                               \
                   1528:     (NCR53c7x0_memory_mapped ?                                                 \
                   1529:      ({writew((value), NCR53c7x0_address_memory + (address)); mb();}) :        \
                   1530:        outw((value), NCR53c7x0_address_io + (address)))
                   1531: 
                   1532: #define NCR53c7x0_write32(address,value)                               \
                   1533:     (NCR53c7x0_memory_mapped ?                                                 \
                   1534:      ({writel((value), NCR53c7x0_address_memory + (address)); mb();}) :        \
                   1535:        outl((value), NCR53c7x0_address_io + (address)))
                   1536: 
                   1537: /* Patch arbitrary 32 bit words in the script */
                   1538: #define patch_abs_32(script, offset, symbol, value)                    \
                   1539:        for (i = 0; i < (sizeof (A_##symbol##_used) / sizeof            \
                   1540:            (u32)); ++i) {                                      \
                   1541:            (script)[A_##symbol##_used[i] - (offset)] += (value);       \
                   1542:            if (hostdata->options & OPTION_DEBUG_FIXUP)                 \
                   1543:              printk("scsi%d : %s reference %d at 0x%x in %s is now 0x%x\n",\
                   1544:                host->host_no, #symbol, i, A_##symbol##_used[i] -       \
                   1545:                (int)(offset), #script, (script)[A_##symbol##_used[i] - \
                   1546:                (offset)]);                                             \
                   1547:        }
                   1548: 
                   1549: /* Patch read/write instruction immediate field */
                   1550: #define patch_abs_rwri_data(script, offset, symbol, value)             \
                   1551:        for (i = 0; i < (sizeof (A_##symbol##_used) / sizeof            \
                   1552:            (u32)); ++i)                                        \
                   1553:            (script)[A_##symbol##_used[i] - (offset)] =                 \
                   1554:                ((script)[A_##symbol##_used[i] - (offset)] &            \
                   1555:                ~DBC_RWRI_IMMEDIATE_MASK) |                             \
                   1556:                (((value) << DBC_RWRI_IMMEDIATE_SHIFT) &                \
                   1557:                 DBC_RWRI_IMMEDIATE_MASK)
                   1558: 
                   1559: /* Patch transfer control instruction data field */
                   1560: #define patch_abs_tci_data(script, offset, symbol, value)              \
                   1561:        for (i = 0; i < (sizeof (A_##symbol##_used) / sizeof            \
                   1562:            (u32)); ++i)                                        \
                   1563:            (script)[A_##symbol##_used[i] - (offset)] =                 \
                   1564:                ((script)[A_##symbol##_used[i] - (offset)] &            \
                   1565:                ~DBC_TCI_DATA_MASK) |                                   \
                   1566:                (((value) << DBC_TCI_DATA_SHIFT) &                      \
                   1567:                 DBC_TCI_DATA_MASK)
                   1568: 
                   1569: /* Patch field in dsa structure (assignment should be +=?) */
                   1570: #define patch_dsa_32(dsa, symbol, word, value)                         \
                   1571:        {                                                               \
1.1.1.2 ! root     1572:        (dsa)[(hostdata->symbol - hostdata->dsa_start) / sizeof(u32)    \
1.1       root     1573:            + (word)] = (value);                                        \
                   1574:        if (hostdata->options & OPTION_DEBUG_DSA)                       \
                   1575:            printk("scsi : dsa %s symbol %s(%d) word %d now 0x%x\n",    \
1.1.1.2 ! root     1576:                #dsa, #symbol, hostdata->symbol,                        \
1.1       root     1577:                (word), (u32) (value));                                 \
                   1578:        }
                   1579: 
                   1580: /* Paranoid people could use panic() here. */
                   1581: #define FATAL(host) shutdown((host));
                   1582: 
                   1583: #endif /* NCR53c7x0_C */
                   1584: #endif /* NCR53c7x0_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.