Annotation of Gnu-Mach/linux/src/drivers/scsi/sym53c8xx_defs.h, revision 1.1.1.1

1.1       root        1: /******************************************************************************
                      2: **  High Performance device driver for the Symbios 53C896 controller.
                      3: **
                      4: **  Copyright (C) 1998-2000  Gerard Roudier <[email protected]>
                      5: **
                      6: **  This driver also supports all the Symbios 53C8XX controller family, 
                      7: **  except 53C810 revisions < 16, 53C825 revisions < 16 and all 
                      8: **  revisions of 53C815 controllers.
                      9: **
                     10: **  This driver is based on the Linux port of the FreeBSD ncr driver.
                     11: ** 
                     12: **  Copyright (C) 1994  Wolfgang Stanglmeier
                     13: **  
                     14: **-----------------------------------------------------------------------------
                     15: **  
                     16: **  This program is free software; you can redistribute it and/or modify
                     17: **  it under the terms of the GNU General Public License as published by
                     18: **  the Free Software Foundation; either version 2 of the License, or
                     19: **  (at your option) any later version.
                     20: **
                     21: **  This program is distributed in the hope that it will be useful,
                     22: **  but WITHOUT ANY WARRANTY; without even the implied warranty of
                     23: **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     24: **  GNU General Public License for more details.
                     25: **
                     26: **  You should have received a copy of the GNU General Public License
                     27: **  along with this program; if not, write to the Free Software
                     28: **  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     29: **
                     30: **-----------------------------------------------------------------------------
                     31: **
                     32: **  The Linux port of the FreeBSD ncr driver has been achieved in 
                     33: **  november 1995 by:
                     34: **
                     35: **          Gerard Roudier              <[email protected]>
                     36: **
                     37: **  Being given that this driver originates from the FreeBSD version, and
                     38: **  in order to keep synergy on both, any suggested enhancements and corrections
                     39: **  received on Linux are automatically a potential candidate for the FreeBSD 
                     40: **  version.
                     41: **
                     42: **  The original driver has been written for 386bsd and FreeBSD by
                     43: **          Wolfgang Stanglmeier        <[email protected]>
                     44: **          Stefan Esser                <[email protected]>
                     45: **
                     46: **-----------------------------------------------------------------------------
                     47: **
                     48: **  Major contributions:
                     49: **  --------------------
                     50: **
                     51: **  NVRAM detection and reading.
                     52: **    Copyright (C) 1997 Richard Waltham <[email protected]>
                     53: **
                     54: *******************************************************************************
                     55: */
                     56: 
                     57: #ifndef SYM53C8XX_DEFS_H
                     58: #define SYM53C8XX_DEFS_H
                     59: 
                     60: /*
                     61: **     Check supported Linux versions
                     62: */
                     63: 
                     64: #if !defined(LINUX_VERSION_CODE)
                     65: #include <linux/version.h>
                     66: #endif
                     67: #include <linux/config.h>
                     68: 
                     69: #ifndef LinuxVersionCode
                     70: #define LinuxVersionCode(v, p, s) (((v)<<16)+((p)<<8)+(s))
                     71: #endif
                     72: 
                     73: /*
                     74:  * NCR PQS/PDS special device support.
                     75:  */
                     76: #ifdef CONFIG_SCSI_NCR53C8XX_PQS_PDS
                     77: #define SCSI_NCR_PQS_PDS_SUPPORT
                     78: #endif
                     79: 
                     80: /*
                     81:  *     No more an option, enabled by default.
                     82:  */
                     83: #ifndef CONFIG_SCSI_NCR53C8XX_NVRAM_DETECT
                     84: #define CONFIG_SCSI_NCR53C8XX_NVRAM_DETECT
                     85: #endif
                     86: 
                     87: /*
                     88: **     These options are not tunable from 'make config'
                     89: */
                     90: //#define      SCSI_NCR_PROC_INFO_SUPPORT
                     91: 
                     92: /*
                     93: **     If you want a driver as small as possible, donnot define the 
                     94: **     following options.
                     95: */
                     96: #define SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT
                     97: #define SCSI_NCR_DEBUG_INFO_SUPPORT
                     98: #define SCSI_NCR_PCI_FIX_UP_SUPPORT
                     99: #ifdef SCSI_NCR_PROC_INFO_SUPPORT
                    100: #      define  SCSI_NCR_USER_COMMAND_SUPPORT
                    101: #      define  SCSI_NCR_USER_INFO_SUPPORT
                    102: #endif
                    103: 
                    104: /*
                    105: **     To disable integrity checking, do not define the 
                    106: **     following option.
                    107: */
                    108: #ifdef CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK
                    109: #      define SCSI_NCR_ENABLE_INTEGRITY_CHECK
                    110: #endif
                    111: 
                    112: /*==========================================================
                    113: **
                    114: ** nvram settings - #define SCSI_NCR_NVRAM_SUPPORT to enable
                    115: **
                    116: **==========================================================
                    117: */
                    118: 
                    119: #ifdef CONFIG_SCSI_NCR53C8XX_NVRAM_DETECT
                    120: #define SCSI_NCR_NVRAM_SUPPORT
                    121: /* #define SCSI_NCR_DEBUG_NVRAM */
                    122: #endif
                    123: 
                    124: /* ---------------------------------------------------------------------
                    125: ** Take into account kernel configured parameters.
                    126: ** Most of these options can be overridden at startup by a command line.
                    127: ** ---------------------------------------------------------------------
                    128: */
                    129: 
                    130: /*
                    131:  * For Ultra2 and Ultra3 SCSI support option, use special features. 
                    132:  *
                    133:  * Value (default) means:
                    134:  *     bit 0 : all features enabled, except:
                    135:  *             bit 1 : PCI Write And Invalidate.
                    136:  *             bit 2 : Data Phase Mismatch handling from SCRIPTS.
                    137:  *
                    138:  * Use boot options ncr53c8xx=specf:1 if you want all chip features to be 
                    139:  * enabled by the driver.
                    140:  */
                    141: #define        SCSI_NCR_SETUP_SPECIAL_FEATURES         (3)
                    142: 
                    143: /*
                    144:  * For Ultra2 and Ultra3 SCSI support allow 80Mhz synchronous data transfers.
                    145:  * Value means:
                    146:  *  0 - Ultra speeds disabled
                    147:  *  1 - Ultra enabled  (Maximum 20Mtrans/sec)
                    148:  *  2 - Ultra2 enabled (Maximum 40Mtrans/sec)
                    149:  *  3 - Ultra3 enabled (Maximum 80Mtrans/sec)
                    150:  *
                    151:  * Use boot options sym53c8xx=ultra:3 to enable Ultra3 support.
                    152:  */
                    153: 
                    154: #define SCSI_NCR_SETUP_ULTRA_SCSI              (3)
                    155: #define SCSI_NCR_MAX_SYNC                      (80)
                    156: 
                    157: /*
                    158:  * Allow tags from 2 to 256, default 8
                    159:  */
                    160: #ifdef CONFIG_SCSI_NCR53C8XX_MAX_TAGS
                    161: #if    CONFIG_SCSI_NCR53C8XX_MAX_TAGS < 2
                    162: #define SCSI_NCR_MAX_TAGS      (2)
                    163: #elif  CONFIG_SCSI_NCR53C8XX_MAX_TAGS > 256
                    164: #define SCSI_NCR_MAX_TAGS      (256)
                    165: #else
                    166: #define        SCSI_NCR_MAX_TAGS       CONFIG_SCSI_NCR53C8XX_MAX_TAGS
                    167: #endif
                    168: #else
                    169: #define SCSI_NCR_MAX_TAGS      (8)
                    170: #endif
                    171: 
                    172: /*
                    173:  * Allow tagged command queuing support if configured with default number 
                    174:  * of tags set to max (see above).
                    175:  */
                    176: #ifdef CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS
                    177: #define        SCSI_NCR_SETUP_DEFAULT_TAGS     CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS
                    178: #elif  defined CONFIG_SCSI_NCR53C8XX_TAGGED_QUEUE
                    179: #define        SCSI_NCR_SETUP_DEFAULT_TAGS     SCSI_NCR_MAX_TAGS
                    180: #else
                    181: #define        SCSI_NCR_SETUP_DEFAULT_TAGS     (0)
                    182: #endif
                    183: 
                    184: /*
                    185:  * Use normal IO if configured. Forced for alpha and powerpc.
                    186:  * Powerpc fails copying to on-chip RAM using memcpy_toio().
                    187:  */
                    188: #if defined(CONFIG_SCSI_NCR53C8XX_IOMAPPED)
                    189: #define        SCSI_NCR_IOMAPPED
                    190: #elif defined(__alpha__)
                    191: #define        SCSI_NCR_IOMAPPED
                    192: #elif defined(__powerpc__)
                    193: #define        SCSI_NCR_IOMAPPED
                    194: #define SCSI_NCR_PCI_MEM_NOT_SUPPORTED
                    195: #elif defined(__sparc__)
                    196: #undef SCSI_NCR_IOMAPPED
                    197: #endif
                    198: 
                    199: /*
                    200:  * Should we enable DAC cycles on this platform?
                    201:  * Until further investigation we do not enable it
                    202:  * anywhere at the moment.
                    203:  */
                    204: #undef SCSI_NCR_USE_64BIT_DAC
                    205: 
                    206: /*
                    207:  * Immediate arbitration
                    208:  */
                    209: #if defined(CONFIG_SCSI_NCR53C8XX_IARB)
                    210: #define SCSI_NCR_IARB_SUPPORT
                    211: #endif
                    212: 
                    213: /*
                    214:  * Should we enable DAC cycles on sparc64 platforms?
                    215:  * Until further investigation we do not enable it
                    216:  * anywhere at the moment.
                    217:  */
                    218: #undef SCSI_NCR_USE_64BIT_DAC
                    219: 
                    220: /*
                    221:  * Sync transfer frequency at startup.
                    222:  * Allow from 5Mhz to 80Mhz default 20 Mhz.
                    223:  */
                    224: #ifndef        CONFIG_SCSI_NCR53C8XX_SYNC
                    225: #define        CONFIG_SCSI_NCR53C8XX_SYNC      (20)
                    226: #elif  CONFIG_SCSI_NCR53C8XX_SYNC > SCSI_NCR_MAX_SYNC
                    227: #undef CONFIG_SCSI_NCR53C8XX_SYNC
                    228: #define        CONFIG_SCSI_NCR53C8XX_SYNC      SCSI_NCR_MAX_SYNC
                    229: #endif
                    230: 
                    231: #if    CONFIG_SCSI_NCR53C8XX_SYNC == 0
                    232: #define        SCSI_NCR_SETUP_DEFAULT_SYNC     (255)
                    233: #elif  CONFIG_SCSI_NCR53C8XX_SYNC <= 5
                    234: #define        SCSI_NCR_SETUP_DEFAULT_SYNC     (50)
                    235: #elif  CONFIG_SCSI_NCR53C8XX_SYNC <= 20
                    236: #define        SCSI_NCR_SETUP_DEFAULT_SYNC     (250/(CONFIG_SCSI_NCR53C8XX_SYNC))
                    237: #elif  CONFIG_SCSI_NCR53C8XX_SYNC <= 33
                    238: #define        SCSI_NCR_SETUP_DEFAULT_SYNC     (11)
                    239: #elif  CONFIG_SCSI_NCR53C8XX_SYNC <= 40
                    240: #define        SCSI_NCR_SETUP_DEFAULT_SYNC     (10)
                    241: #else
                    242: #define        SCSI_NCR_SETUP_DEFAULT_SYNC     (9)
                    243: #endif
                    244: 
                    245: /*
                    246:  * Disallow disconnections at boot-up
                    247:  */
                    248: #ifdef CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
                    249: #define SCSI_NCR_SETUP_DISCONNECTION   (0)
                    250: #else
                    251: #define SCSI_NCR_SETUP_DISCONNECTION   (1)
                    252: #endif
                    253: 
                    254: /*
                    255:  * Force synchronous negotiation for all targets
                    256:  */
                    257: #ifdef CONFIG_SCSI_NCR53C8XX_FORCE_SYNC_NEGO
                    258: #define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (1)
                    259: #else
                    260: #define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (0)
                    261: #endif
                    262: 
                    263: /*
                    264:  * Disable master parity checking (flawed hardwares need that)
                    265:  */
                    266: #ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_MPARITY_CHECK
                    267: #define SCSI_NCR_SETUP_MASTER_PARITY   (0)
                    268: #else
                    269: #define SCSI_NCR_SETUP_MASTER_PARITY   (1)
                    270: #endif
                    271: 
                    272: /*
                    273:  * Disable scsi parity checking (flawed devices may need that)
                    274:  */
                    275: #ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_PARITY_CHECK
                    276: #define SCSI_NCR_SETUP_SCSI_PARITY     (0)
                    277: #else
                    278: #define SCSI_NCR_SETUP_SCSI_PARITY     (1)
                    279: #endif
                    280: 
                    281: /*
                    282:  * Vendor specific stuff
                    283:  */
                    284: #ifdef CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT
                    285: #define SCSI_NCR_SETUP_LED_PIN         (1)
                    286: #define SCSI_NCR_SETUP_DIFF_SUPPORT    (4)
                    287: #else
                    288: #define SCSI_NCR_SETUP_LED_PIN         (0)
                    289: #define SCSI_NCR_SETUP_DIFF_SUPPORT    (0)
                    290: #endif
                    291: 
                    292: /*
                    293:  * Settle time after reset at boot-up
                    294:  */
                    295: #define SCSI_NCR_SETUP_SETTLE_TIME     (2)
                    296: 
                    297: /*
                    298: **     Bridge quirks work-around option defaulted to 1.
                    299: */
                    300: #ifndef        SCSI_NCR_PCIQ_WORK_AROUND_OPT
                    301: #define        SCSI_NCR_PCIQ_WORK_AROUND_OPT   1
                    302: #endif
                    303: 
                    304: /*
                    305: **     Work-around common bridge misbehaviour.
                    306: **
                    307: **     - Do not flush posted writes in the opposite 
                    308: **       direction on read.
                    309: **     - May reorder DMA writes to memory.
                    310: **
                    311: **     This option should not affect performances 
                    312: **     significantly, so it is the default.
                    313: */
                    314: #if    SCSI_NCR_PCIQ_WORK_AROUND_OPT == 1
                    315: #define        SCSI_NCR_PCIQ_MAY_NOT_FLUSH_PW_UPSTREAM
                    316: #define        SCSI_NCR_PCIQ_MAY_REORDER_WRITES
                    317: #define        SCSI_NCR_PCIQ_MAY_MISS_COMPLETIONS
                    318: 
                    319: /*
                    320: **     Same as option 1, but also deal with 
                    321: **     misconfigured interrupts.
                    322: **
                    323: **     - Edge triggerred instead of level sensitive.
                    324: **     - No interrupt line connected.
                    325: **     - IRQ number misconfigured.
                    326: **     
                    327: **     If no interrupt is delivered, the driver will 
                    328: **     catch the interrupt conditions 10 times per 
                    329: **     second. No need to say that this option is 
                    330: **     not recommended.
                    331: */
                    332: #elif  SCSI_NCR_PCIQ_WORK_AROUND_OPT == 2
                    333: #define        SCSI_NCR_PCIQ_MAY_NOT_FLUSH_PW_UPSTREAM
                    334: #define        SCSI_NCR_PCIQ_MAY_REORDER_WRITES
                    335: #define        SCSI_NCR_PCIQ_MAY_MISS_COMPLETIONS
                    336: #define        SCSI_NCR_PCIQ_BROKEN_INTR
                    337: 
                    338: /*
                    339: **     Some bridge designers decided to flush 
                    340: **     everything prior to deliver the interrupt.
                    341: **     This option tries to deal with such a 
                    342: **     behaviour.
                    343: */
                    344: #elif  SCSI_NCR_PCIQ_WORK_AROUND_OPT == 3
                    345: #define        SCSI_NCR_PCIQ_SYNC_ON_INTR
                    346: #endif
                    347: 
                    348: /*
                    349: **     Other parameters not configurable with "make config"
                    350: **     Avoid to change these constants, unless you know what you are doing.
                    351: */
                    352: 
                    353: #define SCSI_NCR_ALWAYS_SIMPLE_TAG
                    354: #define SCSI_NCR_MAX_SCATTER   (127)
                    355: #define SCSI_NCR_MAX_TARGET    (16)
                    356: 
                    357: /*
                    358: **   Compute some desirable value for CAN_QUEUE 
                    359: **   and CMD_PER_LUN.
                    360: **   The driver will use lower values if these 
                    361: **   ones appear to be too large.
                    362: */
                    363: #define SCSI_NCR_CAN_QUEUE     (8*SCSI_NCR_MAX_TAGS + 2*SCSI_NCR_MAX_TARGET)
                    364: #define SCSI_NCR_CMD_PER_LUN   (SCSI_NCR_MAX_TAGS)
                    365: 
                    366: #define SCSI_NCR_SG_TABLESIZE  (SCSI_NCR_MAX_SCATTER)
                    367: #define SCSI_NCR_TIMER_INTERVAL        (HZ)
                    368: 
                    369: #if 1 /* defined CONFIG_SCSI_MULTI_LUN */
                    370: #define SCSI_NCR_MAX_LUN       (16)
                    371: #else
                    372: #define SCSI_NCR_MAX_LUN       (1)
                    373: #endif
                    374: 
                    375: #ifndef HOSTS_C
                    376: 
                    377: /*
                    378: **     These simple macros limit expression involving 
                    379: **     kernel time values (jiffies) to some that have 
                    380: **     chance not to be too much incorrect. :-)
                    381: */
                    382: #define ktime_get(o)           (jiffies + (u_long) o)
                    383: #define ktime_exp(b)           ((long)(jiffies) - (long)(b) >= 0)
                    384: #define ktime_dif(a, b)                ((long)(a) - (long)(b))
                    385: /* These ones are not used in this driver */
                    386: #define ktime_add(a, o)                ((a) + (u_long)(o))
                    387: #define ktime_sub(a, o)                ((a) - (u_long)(o))
                    388: 
                    389: 
                    390: /*
                    391:  *  IO functions definition for big/little endian CPU support.
                    392:  *  For now, the NCR is only supported in little endian addressing mode, 
                    393:  */
                    394: 
                    395: #ifdef __BIG_ENDIAN
                    396: 
                    397: #if    LINUX_VERSION_CODE < LinuxVersionCode(2,1,0)
                    398: #error "BIG ENDIAN byte ordering needs kernel version >= 2.1.0"
                    399: #endif
                    400: 
                    401: #define        inw_l2b         inw
                    402: #define        inl_l2b         inl
                    403: #define        outw_b2l        outw
                    404: #define        outl_b2l        outl
                    405: #define        readw_l2b       readw
                    406: #define        readl_l2b       readl
                    407: #define        writew_b2l      writew
                    408: #define        writel_b2l      writel
                    409: 
                    410: #else  /* little endian */
                    411: 
                    412: #if defined(__i386__)  /* i386 implements full FLAT memory/MMIO model */
                    413: #define        inw_raw         inw
                    414: #define        inl_raw         inl
                    415: #define        outw_raw        outw
                    416: #define        outl_raw        outl
                    417: #define readb_raw(a)   (*(volatile unsigned char *) (a))
                    418: #define readw_raw(a)   (*(volatile unsigned short *) (a))
                    419: #define readl_raw(a)   (*(volatile unsigned int *) (a))
                    420: #define writeb_raw(b,a)        ((*(volatile unsigned char *) (a)) = (b))
                    421: #define writew_raw(b,a)        ((*(volatile unsigned short *) (a)) = (b))
                    422: #define writel_raw(b,a)        ((*(volatile unsigned int *) (a)) = (b))
                    423: 
                    424: #else  /* Other little-endian */
                    425: #define        inw_raw         inw
                    426: #define        inl_raw         inl
                    427: #define        outw_raw        outw
                    428: #define        outl_raw        outl
                    429: #define        readw_raw       readw
                    430: #define        readl_raw       readl
                    431: #define        writew_raw      writew
                    432: #define        writel_raw      writel
                    433: 
                    434: #endif
                    435: #endif
                    436: 
                    437: #ifdef SCSI_NCR_BIG_ENDIAN
                    438: #error "The NCR in BIG ENDIAN addressing mode is not (yet) supported"
                    439: #endif
                    440: 
                    441: 
                    442: /*
                    443:  *  IA32 architecture does not reorder STORES and prevents
                    444:  *  LOADS from passing STORES. It is called `program order' 
                    445:  *  by Intel and allows device drivers to deal with memory 
                    446:  *  ordering by only ensuring that the code is not reordered  
                    447:  *  by the compiler when ordering is required.
                    448:  *  Other architectures implement a weaker ordering that 
                    449:  *  requires memory barriers (and also IO barriers when they 
                    450:  *  make sense) to be used.
                    451:  *  We want to be paranoid for ppc and ia64. :)
                    452:  */
                    453: 
                    454: #if    defined __i386__
                    455: #define MEMORY_BARRIER()       do { ; } while(0)
                    456: #elif  defined __powerpc__
                    457: #define MEMORY_BARRIER()       __asm__ volatile("eieio; sync" : : : "memory")
                    458: #elif  defined __ia64__
                    459: #define MEMORY_BARRIER()       __asm__ volatile("mf.a; mf" : : : "memory")
                    460: #else
                    461: #define MEMORY_BARRIER()       mb()
                    462: #endif
                    463: 
                    464: 
                    465: /*
                    466:  *  If the NCR uses big endian addressing mode over the 
                    467:  *  PCI, actual io register addresses for byte and word 
                    468:  *  accesses must be changed according to lane routing.
                    469:  *  Btw, ncr_offb() and ncr_offw() macros only apply to 
                    470:  *  constants and so donnot generate bloated code.
                    471:  */
                    472: 
                    473: #if    defined(SCSI_NCR_BIG_ENDIAN)
                    474: 
                    475: #define ncr_offb(o)    (((o)&~3)+((~((o)&3))&3))
                    476: #define ncr_offw(o)    (((o)&~3)+((~((o)&3))&2))
                    477: 
                    478: #else
                    479: 
                    480: #define ncr_offb(o)    (o)
                    481: #define ncr_offw(o)    (o)
                    482: 
                    483: #endif
                    484: 
                    485: /*
                    486:  *  If the CPU and the NCR use same endian-ness addressing,
                    487:  *  no byte reordering is needed for script patching.
                    488:  *  Macro cpu_to_scr() is to be used for script patching.
                    489:  *  Macro scr_to_cpu() is to be used for getting a DWORD 
                    490:  *  from the script.
                    491:  */
                    492: 
                    493: #if    defined(__BIG_ENDIAN) && !defined(SCSI_NCR_BIG_ENDIAN)
                    494: 
                    495: #define cpu_to_scr(dw) cpu_to_le32(dw)
                    496: #define scr_to_cpu(dw) le32_to_cpu(dw)
                    497: 
                    498: #elif  defined(__LITTLE_ENDIAN) && defined(SCSI_NCR_BIG_ENDIAN)
                    499: 
                    500: #define cpu_to_scr(dw) cpu_to_be32(dw)
                    501: #define scr_to_cpu(dw) be32_to_cpu(dw)
                    502: 
                    503: #else
                    504: 
                    505: #define cpu_to_scr(dw) (dw)
                    506: #define scr_to_cpu(dw) (dw)
                    507: 
                    508: #endif
                    509: 
                    510: /*
                    511:  *  Access to the controller chip.
                    512:  *
                    513:  *  If SCSI_NCR_IOMAPPED is defined, the driver will use 
                    514:  *  normal IOs instead of the MEMORY MAPPED IO method  
                    515:  *  recommended by PCI specifications.
                    516:  *  If all PCI bridges, host brigdes and architectures 
                    517:  *  would have been correctly designed for PCI, this 
                    518:  *  option would be useless.
                    519:  *
                    520:  *  If the CPU and the NCR use same endian-ness addressing,
                    521:  *  no byte reordering is needed for accessing chip io 
                    522:  *  registers. Functions suffixed by '_raw' are assumed 
                    523:  *  to access the chip over the PCI without doing byte 
                    524:  *  reordering. Functions suffixed by '_l2b' are 
                    525:  *  assumed to perform little-endian to big-endian byte 
                    526:  *  reordering, those suffixed by '_b2l' blah, blah,
                    527:  *  blah, ...
                    528:  */
                    529: 
                    530: #if defined(SCSI_NCR_IOMAPPED)
                    531: 
                    532: /*
                    533:  *  IO mapped only input / ouput
                    534:  */
                    535: 
                    536: #define        INB_OFF(o)              inb (np->base_io + ncr_offb(o))
                    537: #define        OUTB_OFF(o, val)        outb ((val), np->base_io + ncr_offb(o))
                    538: 
                    539: #if    defined(__BIG_ENDIAN) && !defined(SCSI_NCR_BIG_ENDIAN)
                    540: 
                    541: #define        INW_OFF(o)              inw_l2b (np->base_io + ncr_offw(o))
                    542: #define        INL_OFF(o)              inl_l2b (np->base_io + (o))
                    543: 
                    544: #define        OUTW_OFF(o, val)        outw_b2l ((val), np->base_io + ncr_offw(o))
                    545: #define        OUTL_OFF(o, val)        outl_b2l ((val), np->base_io + (o))
                    546: 
                    547: #elif  defined(__LITTLE_ENDIAN) && defined(SCSI_NCR_BIG_ENDIAN)
                    548: 
                    549: #define        INW_OFF(o)              inw_b2l (np->base_io + ncr_offw(o))
                    550: #define        INL_OFF(o)              inl_b2l (np->base_io + (o))
                    551: 
                    552: #define        OUTW_OFF(o, val)        outw_l2b ((val), np->base_io + ncr_offw(o))
                    553: #define        OUTL_OFF(o, val)        outl_l2b ((val), np->base_io + (o))
                    554: 
                    555: #else
                    556: 
                    557: #define        INW_OFF(o)              inw_raw (np->base_io + ncr_offw(o))
                    558: #define        INL_OFF(o)              inl_raw (np->base_io + (o))
                    559: 
                    560: #define        OUTW_OFF(o, val)        outw_raw ((val), np->base_io + ncr_offw(o))
                    561: #define        OUTL_OFF(o, val)        outl_raw ((val), np->base_io + (o))
                    562: 
                    563: #endif /* ENDIANs */
                    564: 
                    565: #else  /* defined SCSI_NCR_IOMAPPED */
                    566: 
                    567: /*
                    568:  *  MEMORY mapped IO input / output
                    569:  */
                    570: 
                    571: #define INB_OFF(o)             readb((char *)np->reg + ncr_offb(o))
                    572: #define OUTB_OFF(o, val)       writeb((val), (char *)np->reg + ncr_offb(o))
                    573: 
                    574: #if    defined(__BIG_ENDIAN) && !defined(SCSI_NCR_BIG_ENDIAN)
                    575: 
                    576: #define INW_OFF(o)             readw_l2b((char *)np->reg + ncr_offw(o))
                    577: #define INL_OFF(o)             readl_l2b((char *)np->reg + (o))
                    578: 
                    579: #define OUTW_OFF(o, val)       writew_b2l((val), (char *)np->reg + ncr_offw(o))
                    580: #define OUTL_OFF(o, val)       writel_b2l((val), (char *)np->reg + (o))
                    581: 
                    582: #elif  defined(__LITTLE_ENDIAN) && defined(SCSI_NCR_BIG_ENDIAN)
                    583: 
                    584: #define INW_OFF(o)             readw_b2l((char *)np->reg + ncr_offw(o))
                    585: #define INL_OFF(o)             readl_b2l((char *)np->reg + (o))
                    586: 
                    587: #define OUTW_OFF(o, val)       writew_l2b((val), (char *)np->reg + ncr_offw(o))
                    588: #define OUTL_OFF(o, val)       writel_l2b((val), (char *)np->reg + (o))
                    589: 
                    590: #else
                    591: 
                    592: #define INW_OFF(o)             readw_raw((char *)np->reg + ncr_offw(o))
                    593: #define INL_OFF(o)             readl_raw((char *)np->reg + (o))
                    594: 
                    595: #define OUTW_OFF(o, val)       writew_raw((val), (char *)np->reg + ncr_offw(o))
                    596: #define OUTL_OFF(o, val)       writel_raw((val), (char *)np->reg + (o))
                    597: 
                    598: #endif
                    599: 
                    600: #endif /* defined SCSI_NCR_IOMAPPED */
                    601: 
                    602: #define INB(r)         INB_OFF (offsetof(struct ncr_reg,r))
                    603: #define INW(r)         INW_OFF (offsetof(struct ncr_reg,r))
                    604: #define INL(r)         INL_OFF (offsetof(struct ncr_reg,r))
                    605: 
                    606: #define OUTB(r, val)   OUTB_OFF (offsetof(struct ncr_reg,r), (val))
                    607: #define OUTW(r, val)   OUTW_OFF (offsetof(struct ncr_reg,r), (val))
                    608: #define OUTL(r, val)   OUTL_OFF (offsetof(struct ncr_reg,r), (val))
                    609: 
                    610: /*
                    611:  *  Set bit field ON, OFF 
                    612:  */
                    613: 
                    614: #define OUTONB(r, m)   OUTB(r, INB(r) | (m))
                    615: #define OUTOFFB(r, m)  OUTB(r, INB(r) & ~(m))
                    616: #define OUTONW(r, m)   OUTW(r, INW(r) | (m))
                    617: #define OUTOFFW(r, m)  OUTW(r, INW(r) & ~(m))
                    618: #define OUTONL(r, m)   OUTL(r, INL(r) | (m))
                    619: #define OUTOFFL(r, m)  OUTL(r, INL(r) & ~(m))
                    620: 
                    621: /*
                    622:  *  We normally want the chip to have a consistent view
                    623:  *  of driver internal data structures when we restart it.
                    624:  *  Thus these macros.
                    625:  */
                    626: #define OUTL_DSP(v)                            \
                    627:        do {                                    \
                    628:                MEMORY_BARRIER();               \
                    629:                OUTL (nc_dsp, (v));             \
                    630:        } while (0)
                    631: 
                    632: #define OUTONB_STD()                           \
                    633:        do {                                    \
                    634:                MEMORY_BARRIER();               \
                    635:                OUTONB (nc_dcntl, (STD|NOCOM)); \
                    636:        } while (0)
                    637: 
                    638: 
                    639: /*
                    640: **     NCR53C8XX Device Ids
                    641: */
                    642: 
                    643: #ifndef PCI_DEVICE_ID_NCR_53C810
                    644: #define PCI_DEVICE_ID_NCR_53C810 1
                    645: #endif
                    646: 
                    647: #ifndef PCI_DEVICE_ID_NCR_53C810AP
                    648: #define PCI_DEVICE_ID_NCR_53C810AP 5
                    649: #endif
                    650: 
                    651: #ifndef PCI_DEVICE_ID_NCR_53C815
                    652: #define PCI_DEVICE_ID_NCR_53C815 4
                    653: #endif
                    654: 
                    655: #ifndef PCI_DEVICE_ID_NCR_53C820
                    656: #define PCI_DEVICE_ID_NCR_53C820 2
                    657: #endif
                    658: 
                    659: #ifndef PCI_DEVICE_ID_NCR_53C825
                    660: #define PCI_DEVICE_ID_NCR_53C825 3
                    661: #endif
                    662: 
                    663: #ifndef PCI_DEVICE_ID_NCR_53C860
                    664: #define PCI_DEVICE_ID_NCR_53C860 6
                    665: #endif
                    666: 
                    667: #ifndef PCI_DEVICE_ID_NCR_53C875
                    668: #define PCI_DEVICE_ID_NCR_53C875 0xf
                    669: #endif
                    670: 
                    671: #ifndef PCI_DEVICE_ID_NCR_53C875J
                    672: #define PCI_DEVICE_ID_NCR_53C875J 0x8f
                    673: #endif
                    674: 
                    675: #ifndef PCI_DEVICE_ID_NCR_53C885
                    676: #define PCI_DEVICE_ID_NCR_53C885 0xd
                    677: #endif
                    678: 
                    679: #ifndef PCI_DEVICE_ID_NCR_53C895
                    680: #define PCI_DEVICE_ID_NCR_53C895 0xc
                    681: #endif
                    682: 
                    683: #ifndef PCI_DEVICE_ID_NCR_53C896
                    684: #define PCI_DEVICE_ID_NCR_53C896 0xb
                    685: #endif
                    686: 
                    687: #ifndef PCI_DEVICE_ID_NCR_53C895A
                    688: #define PCI_DEVICE_ID_NCR_53C895A 0x12
                    689: #endif
                    690: 
                    691: #ifndef PCI_DEVICE_ID_NCR_53C1510D
                    692: #define PCI_DEVICE_ID_NCR_53C1510D 0xa
                    693: #endif
                    694: 
                    695: #ifndef PCI_DEVICE_ID_LSI_53C1010
                    696: #define PCI_DEVICE_ID_LSI_53C1010 0x20
                    697: #endif
                    698: 
                    699: #ifndef PCI_DEVICE_ID_LSI_53C1010_66
                    700: #define PCI_DEVICE_ID_LSI_53C1010_66 0x21
                    701: #endif
                    702: 
                    703: 
                    704: /*
                    705: **   NCR53C8XX devices features table.
                    706: */
                    707: typedef struct {
                    708:        unsigned short  device_id;
                    709:        unsigned short  revision_id;
                    710:        char    *name;
                    711:        unsigned char   burst_max;      /* log-base-2 of max burst */
                    712:        unsigned char   offset_max;
                    713:        unsigned char   nr_divisor;
                    714:        unsigned int    features;
                    715: #define FE_LED0                (1<<0)
                    716: #define FE_WIDE                (1<<1)    /* Wide data transfers */
                    717: #define FE_ULTRA       (1<<2)    /* Ultra speed 20Mtrans/sec */
                    718: #define FE_ULTRA2      (1<<3)    /* Ultra 2 - 40 Mtrans/sec */
                    719: #define FE_DBLR                (1<<4)    /* Clock doubler present */
                    720: #define FE_QUAD                (1<<5)    /* Clock quadrupler present */
                    721: #define FE_ERL         (1<<6)    /* Enable read line */
                    722: #define FE_CLSE                (1<<7)    /* Cache line size enable */
                    723: #define FE_WRIE                (1<<8)    /* Write & Invalidate enable */
                    724: #define FE_ERMP                (1<<9)    /* Enable read multiple */
                    725: #define FE_BOF         (1<<10)   /* Burst opcode fetch */
                    726: #define FE_DFS         (1<<11)   /* DMA fifo size */
                    727: #define FE_PFEN                (1<<12)   /* Prefetch enable */
                    728: #define FE_LDSTR       (1<<13)   /* Load/Store supported */
                    729: #define FE_RAM         (1<<14)   /* On chip RAM present */
                    730: #define FE_CLK80       (1<<15)   /* Board clock is 80 MHz */
                    731: #define FE_RAM8K       (1<<16)   /* On chip RAM sized 8Kb */
                    732: #define FE_64BIT       (1<<17)   /* Supports 64-bit addressing */
                    733: #define FE_IO256       (1<<18)   /* Requires full 256 bytes in PCI space */
                    734: #define FE_NOPM                (1<<19)   /* Scripts handles phase mismatch */
                    735: #define FE_LEDC                (1<<20)   /* Hardware control of LED */
                    736: #define FE_DIFF                (1<<21)   /* Support Differential SCSI */
                    737: #define FE_ULTRA3      (1<<22)   /* Ultra-3 80Mtrans/sec */
                    738: #define FE_66MHZ       (1<<23)   /* 66MHz PCI Support */
                    739: 
                    740: #define FE_CACHE_SET   (FE_ERL|FE_CLSE|FE_WRIE|FE_ERMP)
                    741: #define FE_SCSI_SET    (FE_WIDE|FE_ULTRA|FE_ULTRA2|FE_DBLR|FE_QUAD|F_CLK80)
                    742: #define FE_SPECIAL_SET (FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM)
                    743: } ncr_chip;
                    744: 
                    745: /*
                    746: **     DEL 397 - 53C875 Rev 3 - Part Number 609-0392410 - ITEM 3.
                    747: **     Memory Read transaction terminated by a retry followed by 
                    748: **     Memory Read Line command.
                    749: */
                    750: #define FE_CACHE0_SET  (FE_CACHE_SET & ~FE_ERL)
                    751: 
                    752: /*
                    753: **     DEL 397 - 53C875 Rev 3 - Part Number 609-0392410 - ITEM 5.
                    754: **     On paper, this errata is harmless. But it is a good reason for 
                    755: **     using a shorter programmed burst length (64 DWORDS instead of 128).
                    756: */
                    757: 
                    758: #define SCSI_NCR_CHIP_TABLE                                            \
                    759: {                                                                      \
                    760:  {PCI_DEVICE_ID_NCR_53C810, 0x0f, "810",  4,  8, 4,                    \
                    761:  FE_ERL}                                                               \
                    762:  ,                                                                     \
                    763:  {PCI_DEVICE_ID_NCR_53C810, 0xff, "810a", 4,  8, 4,                    \
                    764:  FE_CACHE_SET|FE_LDSTR|FE_PFEN|FE_BOF}                                 \
                    765:  ,                                                                     \
                    766:  {PCI_DEVICE_ID_NCR_53C815, 0xff, "815",  4,  8, 4,                    \
                    767:  FE_ERL|FE_BOF}                                                                \
                    768:  ,                                                                     \
                    769:  {PCI_DEVICE_ID_NCR_53C820, 0xff, "820",  4,  8, 4,                    \
                    770:  FE_WIDE|FE_ERL}                                                       \
                    771:  ,                                                                     \
                    772:  {PCI_DEVICE_ID_NCR_53C825, 0x0f, "825",  4,  8, 4,                    \
                    773:  FE_WIDE|FE_ERL|FE_BOF|FE_DIFF}                                                \
                    774:  ,                                                                     \
                    775:  {PCI_DEVICE_ID_NCR_53C825, 0xff, "825a", 6,  8, 4,                    \
                    776:  FE_WIDE|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM|FE_DIFF}  \
                    777:  ,                                                                     \
                    778:  {PCI_DEVICE_ID_NCR_53C860, 0xff, "860",  4,  8, 5,                    \
                    779:  FE_ULTRA|FE_CLK80|FE_CACHE_SET|FE_BOF|FE_LDSTR|FE_PFEN}               \
                    780:  ,                                                                     \
                    781:  {PCI_DEVICE_ID_NCR_53C875, 0x01, "875",  6, 16, 5,                    \
                    782:  FE_WIDE|FE_ULTRA|FE_CLK80|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|\
                    783:  FE_RAM|FE_DIFF}                                                       \
                    784:  ,                                                                     \
                    785:  {PCI_DEVICE_ID_NCR_53C875, 0x0f, "875",  6, 16, 5,                    \
                    786:  FE_WIDE|FE_ULTRA|FE_DBLR|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|        \
                    787:  FE_RAM|FE_DIFF}                                                       \
                    788:  ,                                                                     \
                    789:  {PCI_DEVICE_ID_NCR_53C875, 0x1f, "876",  6, 16, 5,                    \
                    790:  FE_WIDE|FE_ULTRA|FE_DBLR|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|        \
                    791:  FE_RAM|FE_DIFF}                                                       \
                    792:  ,                                                                     \
                    793:  {PCI_DEVICE_ID_NCR_53C875, 0x2f, "875E",  6, 16, 5,                   \
                    794:  FE_WIDE|FE_ULTRA|FE_DBLR|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|        \
                    795:  FE_RAM|FE_DIFF}                                                       \
                    796:  ,                                                                     \
                    797:  {PCI_DEVICE_ID_NCR_53C875, 0xff, "876",  6, 16, 5,                    \
                    798:  FE_WIDE|FE_ULTRA|FE_DBLR|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|        \
                    799:  FE_RAM|FE_DIFF}                                                       \
                    800:  ,                                                                     \
                    801:  {PCI_DEVICE_ID_NCR_53C875J,0xff, "875J", 6, 16, 5,                    \
                    802:  FE_WIDE|FE_ULTRA|FE_DBLR|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|        \
                    803:  FE_RAM}                                                               \
                    804:  ,                                                                     \
                    805:  {PCI_DEVICE_ID_NCR_53C885, 0xff, "885",  6, 16, 5,                    \
                    806:  FE_WIDE|FE_ULTRA|FE_DBLR|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|        \
                    807:  FE_RAM|FE_DIFF}                                                       \
                    808:  ,                                                                     \
                    809:  {PCI_DEVICE_ID_NCR_53C895, 0xff, "895",  6, 31, 7,                    \
                    810:  FE_WIDE|FE_ULTRA2|FE_QUAD|FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|        \
                    811:  FE_RAM}                                                               \
                    812:  ,                                                                     \
                    813:  {PCI_DEVICE_ID_NCR_53C896, 0xff, "896",  6, 31, 7,                    \
                    814:  FE_WIDE|FE_ULTRA2|FE_QUAD|FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|        \
                    815:  FE_RAM|FE_RAM8K|FE_64BIT|FE_IO256|FE_NOPM|FE_LEDC}                    \
                    816:  ,                                                                     \
                    817:  {PCI_DEVICE_ID_NCR_53C895A, 0xff, "895a",  6, 31, 7,                  \
                    818:  FE_WIDE|FE_ULTRA2|FE_QUAD|FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|        \
                    819:  FE_RAM|FE_RAM8K|FE_64BIT|FE_IO256|FE_NOPM|FE_LEDC}                    \
                    820:  ,                                                                     \
                    821:  {PCI_DEVICE_ID_NCR_53C1510D, 0xff, "1510D",  7, 31, 7,                        \
                    822:  FE_WIDE|FE_ULTRA2|FE_QUAD|FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|        \
                    823:  FE_RAM|FE_IO256}                                                      \
                    824:  ,                                                                     \
                    825:  {PCI_DEVICE_ID_LSI_53C1010, 0xff, "1010",  6, 31, 7,                  \
                    826:  FE_WIDE|FE_QUAD|FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|          \
                    827:  FE_RAM|FE_RAM8K|FE_64BIT|FE_IO256|FE_NOPM|FE_LEDC|FE_ULTRA3}          \
                    828:  ,                                                                     \
                    829:  {PCI_DEVICE_ID_LSI_53C1010_66, 0xff, "1010_66",  6, 31, 7,            \
                    830:  FE_WIDE|FE_QUAD|FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|          \
                    831:  FE_RAM|FE_RAM8K|FE_64BIT|FE_IO256|FE_NOPM|FE_LEDC|FE_ULTRA3|FE_66MHZ} \
                    832: }
                    833: 
                    834: /*
                    835:  * List of supported NCR chip ids
                    836:  */
                    837: #define SCSI_NCR_CHIP_IDS              \
                    838: {                                      \
                    839:        PCI_DEVICE_ID_NCR_53C810,       \
                    840:        PCI_DEVICE_ID_NCR_53C815,       \
                    841:        PCI_DEVICE_ID_NCR_53C820,       \
                    842:        PCI_DEVICE_ID_NCR_53C825,       \
                    843:        PCI_DEVICE_ID_NCR_53C860,       \
                    844:        PCI_DEVICE_ID_NCR_53C875,       \
                    845:        PCI_DEVICE_ID_NCR_53C875J,      \
                    846:        PCI_DEVICE_ID_NCR_53C885,       \
                    847:        PCI_DEVICE_ID_NCR_53C895,       \
                    848:        PCI_DEVICE_ID_NCR_53C896,       \
                    849:        PCI_DEVICE_ID_NCR_53C895A,      \
                    850:        PCI_DEVICE_ID_NCR_53C1510D,     \
                    851:        PCI_DEVICE_ID_LSI_53C1010,      \
                    852:        PCI_DEVICE_ID_LSI_53C1010_66    \
                    853: }
                    854: 
                    855: /*
                    856: **     Driver setup structure.
                    857: **
                    858: **     This structure is initialized from linux config options.
                    859: **     It can be overridden at boot-up by the boot command line.
                    860: */
                    861: #define SCSI_NCR_MAX_EXCLUDES 8
                    862: struct ncr_driver_setup {
                    863:        u_char  master_parity;
                    864:        u_char  scsi_parity;
                    865:        u_char  disconnection;
                    866:        u_char  special_features;
                    867:        u_char  ultra_scsi;
                    868:        u_char  force_sync_nego;
                    869:        u_char  reverse_probe;
                    870:        u_char  pci_fix_up;
                    871:        u_char  use_nvram;
                    872:        u_char  verbose;
                    873:        u_char  default_tags;
                    874:        u_short default_sync;
                    875:        u_short debug;
                    876:        u_char  burst_max;
                    877:        u_char  led_pin;
                    878:        u_char  max_wide;
                    879:        u_char  settle_delay;
                    880:        u_char  diff_support;
                    881:        u_char  irqm;
                    882:        u_char  bus_check;
                    883:        u_char  optimize;
                    884:        u_char  recovery;
                    885:        u_char  host_id;
                    886:        u_short iarb;
                    887:        u_long  excludes[SCSI_NCR_MAX_EXCLUDES];
                    888:        char    tag_ctrl[100];
                    889: };
                    890: 
                    891: /*
                    892: **     Initial setup.
                    893: **     Can be overriden at startup by a command line.
                    894: */
                    895: #define SCSI_NCR_DRIVER_SETUP                  \
                    896: {                                              \
                    897:        SCSI_NCR_SETUP_MASTER_PARITY,           \
                    898:        SCSI_NCR_SETUP_SCSI_PARITY,             \
                    899:        SCSI_NCR_SETUP_DISCONNECTION,           \
                    900:        SCSI_NCR_SETUP_SPECIAL_FEATURES,        \
                    901:        SCSI_NCR_SETUP_ULTRA_SCSI,              \
                    902:        SCSI_NCR_SETUP_FORCE_SYNC_NEGO,         \
                    903:        0,                                      \
                    904:        0,                                      \
                    905:        1,                                      \
                    906:        0,                                      \
                    907:        SCSI_NCR_SETUP_DEFAULT_TAGS,            \
                    908:        SCSI_NCR_SETUP_DEFAULT_SYNC,            \
                    909:        0x00,                                   \
                    910:        7,                                      \
                    911:        SCSI_NCR_SETUP_LED_PIN,                 \
                    912:        1,                                      \
                    913:        SCSI_NCR_SETUP_SETTLE_TIME,             \
                    914:        SCSI_NCR_SETUP_DIFF_SUPPORT,            \
                    915:        0,                                      \
                    916:        1,                                      \
                    917:        0,                                      \
                    918:        0,                                      \
                    919:        255,                                    \
                    920:        0x00                                    \
                    921: }
                    922: 
                    923: /*
                    924: **     Boot fail safe setup.
                    925: **     Override initial setup from boot command line:
                    926: **     ncr53c8xx=safe:y
                    927: */
                    928: #define SCSI_NCR_DRIVER_SAFE_SETUP             \
                    929: {                                              \
                    930:        0,                                      \
                    931:        1,                                      \
                    932:        0,                                      \
                    933:        0,                                      \
                    934:        0,                                      \
                    935:        0,                                      \
                    936:        0,                                      \
                    937:        0,                                      \
                    938:        1,                                      \
                    939:        2,                                      \
                    940:        0,                                      \
                    941:        255,                                    \
                    942:        0x00,                                   \
                    943:        255,                                    \
                    944:        0,                                      \
                    945:        0,                                      \
                    946:        10,                                     \
                    947:        1,                                      \
                    948:        1,                                      \
                    949:        1,                                      \
                    950:        0,                                      \
                    951:        0,                                      \
                    952:        255                                     \
                    953: }
                    954: 
                    955: #ifdef SCSI_NCR_NVRAM_SUPPORT
                    956: /*
                    957: **     Symbios NvRAM data format
                    958: */
                    959: #define SYMBIOS_NVRAM_SIZE 368
                    960: #define SYMBIOS_NVRAM_ADDRESS 0x100
                    961: 
                    962: struct Symbios_nvram {
                    963: /* Header 6 bytes */
                    964:        u_short type;           /* 0x0000 */
                    965:        u_short byte_count;     /* excluding header/trailer */
                    966:        u_short checksum;
                    967: 
                    968: /* Controller set up 20 bytes */
                    969:        u_char  v_major;        /* 0x00 */
                    970:        u_char  v_minor;        /* 0x30 */
                    971:        u_int32 boot_crc;
                    972:        u_short flags;
                    973: #define SYMBIOS_SCAM_ENABLE    (1)
                    974: #define SYMBIOS_PARITY_ENABLE  (1<<1)
                    975: #define SYMBIOS_VERBOSE_MSGS   (1<<2)
                    976: #define SYMBIOS_CHS_MAPPING    (1<<3)
                    977: #define SYMBIOS_NO_NVRAM       (1<<3)  /* ??? */
                    978:        u_short flags1;
                    979: #define SYMBIOS_SCAN_HI_LO     (1)
                    980:        u_short term_state;
                    981: #define SYMBIOS_TERM_CANT_PROGRAM      (0)
                    982: #define SYMBIOS_TERM_ENABLED           (1)
                    983: #define SYMBIOS_TERM_DISABLED          (2)
                    984:        u_short rmvbl_flags;
                    985: #define SYMBIOS_RMVBL_NO_SUPPORT       (0)
                    986: #define SYMBIOS_RMVBL_BOOT_DEVICE      (1)
                    987: #define SYMBIOS_RMVBL_MEDIA_INSTALLED  (2)
                    988:        u_char  host_id;
                    989:        u_char  num_hba;        /* 0x04 */
                    990:        u_char  num_devices;    /* 0x10 */
                    991:        u_char  max_scam_devices;       /* 0x04 */
                    992:        u_char  num_valid_scam_devives; /* 0x00 */
                    993:        u_char  rsvd;
                    994: 
                    995: /* Boot order 14 bytes * 4 */
                    996:        struct Symbios_host{
                    997:                u_short type;           /* 4:8xx / 0:nok */
                    998:                u_short device_id;      /* PCI device id */
                    999:                u_short vendor_id;      /* PCI vendor id */
                   1000:                u_char  bus_nr;         /* PCI bus number */
                   1001:                u_char  device_fn;      /* PCI device/function number << 3*/
                   1002:                u_short word8;
                   1003:                u_short flags;
                   1004: #define        SYMBIOS_INIT_SCAN_AT_BOOT       (1)
                   1005:                u_short io_port;        /* PCI io_port address */
                   1006:        } host[4];
                   1007: 
                   1008: /* Targets 8 bytes * 16 */
                   1009:        struct Symbios_target {
                   1010:                u_char  flags;
                   1011: #define SYMBIOS_DISCONNECT_ENABLE      (1)
                   1012: #define SYMBIOS_SCAN_AT_BOOT_TIME      (1<<1)
                   1013: #define SYMBIOS_SCAN_LUNS              (1<<2)
                   1014: #define SYMBIOS_QUEUE_TAGS_ENABLED     (1<<3)
                   1015:                u_char  rsvd;
                   1016:                u_char  bus_width;      /* 0x08/0x10 */
                   1017:                u_char  sync_offset;
                   1018:                u_short sync_period;    /* 4*period factor */
                   1019:                u_short timeout;
                   1020:        } target[16];
                   1021: /* Scam table 8 bytes * 4 */
                   1022:        struct Symbios_scam {
                   1023:                u_short id;
                   1024:                u_short method;
                   1025: #define SYMBIOS_SCAM_DEFAULT_METHOD    (0)
                   1026: #define SYMBIOS_SCAM_DONT_ASSIGN       (1)
                   1027: #define SYMBIOS_SCAM_SET_SPECIFIC_ID   (2)
                   1028: #define SYMBIOS_SCAM_USE_ORDER_GIVEN   (3)
                   1029:                u_short status;
                   1030: #define SYMBIOS_SCAM_UNKNOWN           (0)
                   1031: #define SYMBIOS_SCAM_DEVICE_NOT_FOUND  (1)
                   1032: #define SYMBIOS_SCAM_ID_NOT_SET                (2)
                   1033: #define SYMBIOS_SCAM_ID_VALID          (3)
                   1034:                u_char  target_id;
                   1035:                u_char  rsvd;
                   1036:        } scam[4];
                   1037: 
                   1038:        u_char  spare_devices[15*8];
                   1039:        u_char  trailer[6];             /* 0xfe 0xfe 0x00 0x00 0x00 0x00 */
                   1040: };
                   1041: typedef struct Symbios_nvram   Symbios_nvram;
                   1042: typedef struct Symbios_host    Symbios_host;
                   1043: typedef struct Symbios_target  Symbios_target;
                   1044: typedef struct Symbios_scam    Symbios_scam;
                   1045: 
                   1046: /*
                   1047: **     Tekram NvRAM data format.
                   1048: */
                   1049: #define TEKRAM_NVRAM_SIZE 64
                   1050: #define TEKRAM_93C46_NVRAM_ADDRESS 0
                   1051: #define TEKRAM_24C16_NVRAM_ADDRESS 0x40
                   1052: 
                   1053: struct Tekram_nvram {
                   1054:        struct Tekram_target {
                   1055:                u_char  flags;
                   1056: #define        TEKRAM_PARITY_CHECK             (1)
                   1057: #define TEKRAM_SYNC_NEGO               (1<<1)
                   1058: #define TEKRAM_DISCONNECT_ENABLE       (1<<2)
                   1059: #define        TEKRAM_START_CMD                (1<<3)
                   1060: #define TEKRAM_TAGGED_COMMANDS         (1<<4)
                   1061: #define TEKRAM_WIDE_NEGO               (1<<5)
                   1062:                u_char  sync_index;
                   1063:                u_short word2;
                   1064:        } target[16];
                   1065:        u_char  host_id;
                   1066:        u_char  flags;
                   1067: #define TEKRAM_MORE_THAN_2_DRIVES      (1)
                   1068: #define TEKRAM_DRIVES_SUP_1GB          (1<<1)
                   1069: #define        TEKRAM_RESET_ON_POWER_ON        (1<<2)
                   1070: #define TEKRAM_ACTIVE_NEGATION         (1<<3)
                   1071: #define TEKRAM_IMMEDIATE_SEEK          (1<<4)
                   1072: #define        TEKRAM_SCAN_LUNS                (1<<5)
                   1073: #define        TEKRAM_REMOVABLE_FLAGS          (3<<6)  /* 0: disable; 1: boot device; 2:all */
                   1074:        u_char  boot_delay_index;
                   1075:        u_char  max_tags_index;
                   1076:        u_short flags1;
                   1077: #define TEKRAM_F2_F6_ENABLED           (1)
                   1078:        u_short spare[29];
                   1079: };
                   1080: typedef struct Tekram_nvram    Tekram_nvram;
                   1081: typedef struct Tekram_target   Tekram_target;
                   1082: 
                   1083: #endif /* SCSI_NCR_NVRAM_SUPPORT */
                   1084: 
                   1085: /**************** ORIGINAL CONTENT of ncrreg.h from FreeBSD ******************/
                   1086: 
                   1087: /*-----------------------------------------------------------------
                   1088: **
                   1089: **     The ncr 53c810 register structure.
                   1090: **
                   1091: **-----------------------------------------------------------------
                   1092: */
                   1093: 
                   1094: struct ncr_reg {
                   1095: /*00*/  u_char    nc_scntl0;    /* full arb., ena parity, par->ATN  */
                   1096: 
                   1097: /*01*/  u_char    nc_scntl1;    /* no reset                         */
                   1098:         #define   ISCON   0x10  /* connected to scsi               */
                   1099:         #define   CRST    0x08  /* force reset                      */
                   1100:         #define   IARB    0x02  /* immediate arbitration            */
                   1101: 
                   1102: /*02*/  u_char    nc_scntl2;    /* no disconnect expected           */
                   1103:        #define   SDU     0x80  /* cmd: disconnect will raise error */
                   1104:        #define   CHM     0x40  /* sta: chained mode                */
                   1105:        #define   WSS     0x08  /* sta: wide scsi send           [W]*/
                   1106:        #define   WSR     0x01  /* sta: wide scsi received       [W]*/
                   1107: 
                   1108: /*03*/  u_char    nc_scntl3;    /* cnf system clock dependent       */
                   1109:        #define   EWS     0x08  /* cmd: enable wide scsi         [W]*/
                   1110:        #define   ULTRA   0x80  /* cmd: ULTRA enable                */
                   1111:                                /* bits 0-2, 7 rsvd for C1010       */
                   1112: 
                   1113: /*04*/  u_char    nc_scid;     /* cnf host adapter scsi address    */
                   1114:        #define   RRE     0x40  /* r/w:e enable response to resel.  */
                   1115:        #define   SRE     0x20  /* r/w:e enable response to select  */
                   1116: 
                   1117: /*05*/  u_char    nc_sxfer;    /* ### Sync speed and count         */
                   1118:                                /* bits 6-7 rsvd for C1010          */
                   1119: 
                   1120: /*06*/  u_char    nc_sdid;     /* ### Destination-ID               */
                   1121: 
                   1122: /*07*/  u_char    nc_gpreg;    /* ??? IO-Pins                      */
                   1123: 
                   1124: /*08*/  u_char    nc_sfbr;     /* ### First byte in phase          */
                   1125: 
                   1126: /*09*/  u_char    nc_socl;
                   1127:        #define   CREQ    0x80  /* r/w: SCSI-REQ                    */
                   1128:        #define   CACK    0x40  /* r/w: SCSI-ACK                    */
                   1129:        #define   CBSY    0x20  /* r/w: SCSI-BSY                    */
                   1130:        #define   CSEL    0x10  /* r/w: SCSI-SEL                    */
                   1131:        #define   CATN    0x08  /* r/w: SCSI-ATN                    */
                   1132:        #define   CMSG    0x04  /* r/w: SCSI-MSG                    */
                   1133:        #define   CC_D    0x02  /* r/w: SCSI-C_D                    */
                   1134:        #define   CI_O    0x01  /* r/w: SCSI-I_O                    */
                   1135: 
                   1136: /*0a*/  u_char    nc_ssid;
                   1137: 
                   1138: /*0b*/  u_char    nc_sbcl;
                   1139: 
                   1140: /*0c*/  u_char    nc_dstat;
                   1141:         #define   DFE     0x80  /* sta: dma fifo empty              */
                   1142:         #define   MDPE    0x40  /* int: master data parity error    */
                   1143:         #define   BF      0x20  /* int: script: bus fault           */
                   1144:         #define   ABRT    0x10  /* int: script: command aborted     */
                   1145:         #define   SSI     0x08  /* int: script: single step         */
                   1146:         #define   SIR     0x04  /* int: script: interrupt instruct. */
                   1147:         #define   IID     0x01  /* int: script: illegal instruct.   */
                   1148: 
                   1149: /*0d*/  u_char    nc_sstat0;
                   1150:         #define   ILF     0x80  /* sta: data in SIDL register lsb   */
                   1151:         #define   ORF     0x40  /* sta: data in SODR register lsb   */
                   1152:         #define   OLF     0x20  /* sta: data in SODL register lsb   */
                   1153:         #define   AIP     0x10  /* sta: arbitration in progress     */
                   1154:         #define   LOA     0x08  /* sta: arbitration lost            */
                   1155:         #define   WOA     0x04  /* sta: arbitration won             */
                   1156:         #define   IRST    0x02  /* sta: scsi reset signal           */
                   1157:         #define   SDP     0x01  /* sta: scsi parity signal          */
                   1158: 
                   1159: /*0e*/  u_char    nc_sstat1;
                   1160:        #define   FF3210  0xf0  /* sta: bytes in the scsi fifo      */
                   1161: 
                   1162: /*0f*/  u_char    nc_sstat2;
                   1163:         #define   ILF1    0x80  /* sta: data in SIDL register msb[W]*/
                   1164:         #define   ORF1    0x40  /* sta: data in SODR register msb[W]*/
                   1165:         #define   OLF1    0x20  /* sta: data in SODL register msb[W]*/
                   1166:         #define   DM      0x04  /* sta: DIFFSENS mismatch (895/6 only) */
                   1167:         #define   LDSC    0x02  /* sta: disconnect & reconnect      */
                   1168: 
                   1169: /*10*/  u_char    nc_dsa;      /* --> Base page                    */
                   1170: /*11*/  u_char    nc_dsa1;
                   1171: /*12*/  u_char    nc_dsa2;
                   1172: /*13*/  u_char    nc_dsa3;
                   1173: 
                   1174: /*14*/  u_char    nc_istat;    /* --> Main Command and status      */
                   1175:         #define   CABRT   0x80  /* cmd: abort current operation     */
                   1176:         #define   SRST    0x40  /* mod: reset chip                  */
                   1177:         #define   SIGP    0x20  /* r/w: message from host to ncr    */
                   1178:         #define   SEM     0x10  /* r/w: message between host + ncr  */
                   1179:         #define   CON     0x08  /* sta: connected to scsi           */
                   1180:         #define   INTF    0x04  /* sta: int on the fly (reset by wr)*/
                   1181:         #define   SIP     0x02  /* sta: scsi-interrupt              */
                   1182:         #define   DIP     0x01  /* sta: host/script interrupt       */
                   1183: 
                   1184: /*15*/  u_char    nc_istat1;   /* 896 only */
                   1185: /*16*/  u_char    nc_mbox0;    /* 896 only */
                   1186: /*17*/  u_char    nc_mbox1;    /* 896 only */
                   1187: 
                   1188: /*18*/ u_char    nc_ctest0;
                   1189: /*19*/  u_char    nc_ctest1;
                   1190: 
                   1191: /*1a*/  u_char    nc_ctest2;
                   1192:        #define   CSIGP   0x40
                   1193:                                /* bits 0-2,7 rsvd for C1010        */
                   1194: 
                   1195: /*1b*/  u_char    nc_ctest3;
                   1196:        #define   FLF     0x08  /* cmd: flush dma fifo              */
                   1197:        #define   CLF     0x04  /* cmd: clear dma fifo              */
                   1198:        #define   FM      0x02  /* mod: fetch pin mode              */
                   1199:        #define   WRIE    0x01  /* mod: write and invalidate enable */
                   1200:                                /* bits 4-7 rsvd for C1010          */
                   1201: 
                   1202: /*1c*/  u_int32    nc_temp;    /* ### Temporary stack              */
                   1203: 
                   1204: /*20*/ u_char    nc_dfifo;
                   1205: /*21*/  u_char    nc_ctest4;
                   1206:        #define   BDIS    0x80  /* mod: burst disable               */
                   1207:        #define   MPEE    0x08  /* mod: master parity error enable  */
                   1208: 
                   1209: /*22*/  u_char    nc_ctest5;
                   1210:        #define   DFS     0x20  /* mod: dma fifo size               */
                   1211:                                /* bits 0-1, 3-7 rsvd for C1010          */
                   1212: /*23*/  u_char    nc_ctest6;
                   1213: 
                   1214: /*24*/  u_int32    nc_dbc;     /* ### Byte count and command       */
                   1215: /*28*/  u_int32    nc_dnad;    /* ### Next command register        */
                   1216: /*2c*/  u_int32    nc_dsp;     /* --> Script Pointer               */
                   1217: /*30*/  u_int32    nc_dsps;    /* --> Script pointer save/opcode#2 */
                   1218: 
                   1219: /*34*/  u_char     nc_scratcha;  /* Temporary register a            */
                   1220: /*35*/  u_char     nc_scratcha1;
                   1221: /*36*/  u_char     nc_scratcha2;
                   1222: /*37*/  u_char     nc_scratcha3;
                   1223: 
                   1224: /*38*/  u_char    nc_dmode;
                   1225:        #define   BL_2    0x80  /* mod: burst length shift value +2 */
                   1226:        #define   BL_1    0x40  /* mod: burst length shift value +1 */
                   1227:        #define   ERL     0x08  /* mod: enable read line            */
                   1228:        #define   ERMP    0x04  /* mod: enable read multiple        */
                   1229:        #define   BOF     0x02  /* mod: burst op code fetch         */
                   1230: 
                   1231: /*39*/  u_char    nc_dien;
                   1232: /*3a*/  u_char    nc_sbr;
                   1233: 
                   1234: /*3b*/  u_char    nc_dcntl;    /* --> Script execution control     */
                   1235:        #define   CLSE    0x80  /* mod: cache line size enable      */
                   1236:        #define   PFF     0x40  /* cmd: pre-fetch flush             */
                   1237:        #define   PFEN    0x20  /* mod: pre-fetch enable            */
                   1238:        #define   SSM     0x10  /* mod: single step mode            */
                   1239:        #define   IRQM    0x08  /* mod: irq mode (1 = totem pole !) */
                   1240:        #define   STD     0x04  /* cmd: start dma mode              */
                   1241:        #define   IRQD    0x02  /* mod: irq disable                 */
                   1242:        #define   NOCOM   0x01  /* cmd: protect sfbr while reselect */
                   1243:                                /* bits 0-1 rsvd for C1010          */
                   1244: 
                   1245: /*3c*/  u_int32    nc_adder;
                   1246: 
                   1247: /*40*/  u_short   nc_sien;     /* -->: interrupt enable            */
                   1248: /*42*/  u_short   nc_sist;     /* <--: interrupt status            */
                   1249:         #define   SBMC    0x1000/* sta: SCSI Bus Mode Change (895/6 only) */
                   1250:         #define   STO     0x0400/* sta: timeout (select)            */
                   1251:         #define   GEN     0x0200/* sta: timeout (general)           */
                   1252:         #define   HTH     0x0100/* sta: timeout (handshake)         */
                   1253:         #define   MA      0x80  /* sta: phase mismatch              */
                   1254:         #define   CMP     0x40  /* sta: arbitration complete        */
                   1255:         #define   SEL     0x20  /* sta: selected by another device  */
                   1256:         #define   RSL     0x10  /* sta: reselected by another device*/
                   1257:         #define   SGE     0x08  /* sta: gross error (over/underflow)*/
                   1258:         #define   UDC     0x04  /* sta: unexpected disconnect       */
                   1259:         #define   RST     0x02  /* sta: scsi bus reset detected     */
                   1260:         #define   PAR     0x01  /* sta: scsi parity error           */
                   1261: 
                   1262: /*44*/  u_char    nc_slpar;
                   1263: /*45*/  u_char    nc_swide;
                   1264: /*46*/  u_char    nc_macntl;
                   1265: /*47*/  u_char    nc_gpcntl;
                   1266: /*48*/  u_char    nc_stime0;    /* cmd: timeout for select&handshake*/
                   1267: /*49*/  u_char    nc_stime1;    /* cmd: timeout user defined        */
                   1268: /*4a*/  u_short   nc_respid;    /* sta: Reselect-IDs                */
                   1269: 
                   1270: /*4c*/  u_char    nc_stest0;
                   1271: 
                   1272: /*4d*/  u_char    nc_stest1;
                   1273:        #define   SCLK    0x80  /* Use the PCI clock as SCSI clock      */
                   1274:        #define   DBLEN   0x08  /* clock doubler running                */
                   1275:        #define   DBLSEL  0x04  /* clock doubler selected               */
                   1276:   
                   1277: 
                   1278: /*4e*/  u_char    nc_stest2;
                   1279:        #define   ROF     0x40  /* reset scsi offset (after gross error!) */
                   1280:        #define   EXT     0x02  /* extended filtering                     */
                   1281: 
                   1282: /*4f*/  u_char    nc_stest3;
                   1283:        #define   TE     0x80   /* c: tolerAnt enable */
                   1284:        #define   HSC    0x20   /* c: Halt SCSI Clock */
                   1285:        #define   CSF    0x02   /* c: clear scsi fifo */
                   1286: 
                   1287: /*50*/  u_short   nc_sidl;     /* Lowlevel: latched from scsi data */
                   1288: /*52*/  u_char    nc_stest4;
                   1289:        #define   SMODE  0xc0   /* SCSI bus mode      (895/6 only) */
                   1290:        #define    SMODE_HVD 0x40       /* High Voltage Differential       */
                   1291:        #define    SMODE_SE  0x80       /* Single Ended                    */
                   1292:        #define    SMODE_LVD 0xc0       /* Low Voltage Differential        */
                   1293:        #define   LCKFRQ 0x20   /* Frequency Lock (895/6 only)     */
                   1294:                                /* bits 0-5 rsvd for C1010          */
                   1295: 
                   1296: /*53*/  u_char    nc_53_;
                   1297: /*54*/  u_short   nc_sodl;     /* Lowlevel: data out to scsi data  */
                   1298: /*56*/ u_char    nc_ccntl0;    /* Chip Control 0 (896)             */
                   1299:        #define   ENPMJ  0x80   /* Enable Phase Mismatch Jump       */
                   1300:        #define   PMJCTL 0x40   /* Phase Mismatch Jump Control      */
                   1301:        #define   ENNDJ  0x20   /* Enable Non Data PM Jump          */
                   1302:        #define   DISFC  0x10   /* Disable Auto FIFO Clear          */
                   1303:        #define   DILS   0x02   /* Disable Internal Load/Store      */
                   1304:        #define   DPR    0x01   /* Disable Pipe Req                 */
                   1305: 
                   1306: /*57*/ u_char    nc_ccntl1;    /* Chip Control 1 (896)             */
                   1307:        #define   ZMOD   0x80   /* High Impedance Mode              */
                   1308:        #define   DIC    0x10   /* Disable Internal Cycles          */
                   1309:        #define   DDAC   0x08   /* Disable Dual Address Cycle       */
                   1310:        #define   XTIMOD 0x04   /* 64-bit Table Ind. Indexing Mode  */
                   1311:        #define   EXTIBMV 0x02  /* Enable 64-bit Table Ind. BMOV    */
                   1312:        #define   EXDBMV 0x01   /* Enable 64-bit Direct BMOV        */
                   1313: 
                   1314: /*58*/  u_short   nc_sbdl;     /* Lowlevel: data from scsi data    */
                   1315: /*5a*/  u_short   nc_5a_;
                   1316: 
                   1317: /*5c*/  u_char    nc_scr0;     /* Working register B               */
                   1318: /*5d*/  u_char    nc_scr1;     /*                                  */
                   1319: /*5e*/  u_char    nc_scr2;     /*                                  */
                   1320: /*5f*/  u_char    nc_scr3;     /*                                  */
                   1321: 
                   1322: /*60*/  u_char    nc_scrx[64]; /* Working register C-R             */
                   1323: /*a0*/ u_int32   nc_mmrs;      /* Memory Move Read Selector        */
                   1324: /*a4*/ u_int32   nc_mmws;      /* Memory Move Write Selector       */
                   1325: /*a8*/ u_int32   nc_sfs;       /* Script Fetch Selector            */
                   1326: /*ac*/ u_int32   nc_drs;       /* DSA Relative Selector            */
                   1327: /*b0*/ u_int32   nc_sbms;      /* Static Block Move Selector       */
                   1328: /*b4*/ u_int32   nc_dbms;      /* Dynamic Block Move Selector      */
                   1329: /*b8*/ u_int32   nc_dnad64;    /* DMA Next Address 64              */
                   1330: /*bc*/ u_short   nc_scntl4;    /* C1010 only                       */
                   1331:        #define   U3EN   0x80   /* Enable Ultra 3                   */
                   1332:        #define   AIPEN  0x40   /* Allow check upper byte lanes     */
                   1333:        #define   XCLKH_DT 0x08 /* Extra clock of data hold on DT
                   1334:                                        transfer edge               */
                   1335:        #define   XCLKH_ST 0x04 /* Extra clock of data hold on ST
                   1336:                                        transfer edge               */
                   1337: 
                   1338: /*be*/  u_char   nc_aipcntl0;  /* Epat Control 1 C1010 only        */
                   1339: /*bf*/  u_char   nc_aipcntl1;  /* AIP Control C1010_66 Only        */
                   1340: 
                   1341: /*c0*/ u_int32   nc_pmjad1;    /* Phase Mismatch Jump Address 1    */
                   1342: /*c4*/ u_int32   nc_pmjad2;    /* Phase Mismatch Jump Address 2    */
                   1343: /*c8*/ u_char    nc_rbc;       /* Remaining Byte Count             */
                   1344: /*c9*/ u_char    nc_rbc1;      /*                                  */
                   1345: /*ca*/ u_char    nc_rbc2;      /*                                  */
                   1346: /*cb*/ u_char    nc_rbc3;      /*                                  */
                   1347: 
                   1348: /*cc*/ u_char    nc_ua;        /* Updated Address                  */
                   1349: /*cd*/ u_char    nc_ua1;       /*                                  */
                   1350: /*ce*/ u_char    nc_ua2;       /*                                  */
                   1351: /*cf*/ u_char    nc_ua3;       /*                                  */
                   1352: /*d0*/ u_int32   nc_esa;       /* Entry Storage Address            */
                   1353: /*d4*/ u_char    nc_ia;        /* Instruction Address              */
                   1354: /*d5*/ u_char    nc_ia1;
                   1355: /*d6*/ u_char    nc_ia2;
                   1356: /*d7*/ u_char    nc_ia3;
                   1357: /*d8*/ u_int32   nc_sbc;       /* SCSI Byte Count (3 bytes only)   */
                   1358: /*dc*/ u_int32   nc_csbc;      /* Cumulative SCSI Byte Count       */
                   1359: 
                   1360:                                 /* Following for C1010 only         */
                   1361: /*e0*/ u_short    nc_crcpad;    /* CRC Value                        */
                   1362: /*e2*/ u_char     nc_crccntl0;  /* CRC control register             */
                   1363:        #define   SNDCRC  0x10  /* Send CRC Request                 */
                   1364: /*e3*/ u_char     nc_crccntl1;  /* CRC control register             */
                   1365: /*e4*/ u_int32    nc_crcdata;   /* CRC data register                */ 
                   1366: /*e8*/ u_int32   nc_e8_;       /* rsvd                             */
                   1367: /*ec*/ u_int32   nc_ec_;       /* rsvd                             */
                   1368: /*f0*/ u_short    nc_dfbc;      /* DMA FIFO byte count              */ 
                   1369: 
                   1370: };
                   1371: 
                   1372: /*-----------------------------------------------------------
                   1373: **
                   1374: **     Utility macros for the script.
                   1375: **
                   1376: **-----------------------------------------------------------
                   1377: */
                   1378: 
                   1379: #define REGJ(p,r) (offsetof(struct ncr_reg, p ## r))
                   1380: #define REG(r) REGJ (nc_, r)
                   1381: 
                   1382: typedef u_int32 ncrcmd;
                   1383: 
                   1384: /*-----------------------------------------------------------
                   1385: **
                   1386: **     SCSI phases
                   1387: **
                   1388: **     DT phases illegal for ncr driver.
                   1389: **
                   1390: **-----------------------------------------------------------
                   1391: */
                   1392: 
                   1393: #define        SCR_DATA_OUT    0x00000000
                   1394: #define        SCR_DATA_IN     0x01000000
                   1395: #define        SCR_COMMAND     0x02000000
                   1396: #define        SCR_STATUS      0x03000000
                   1397: #define SCR_DT_DATA_OUT        0x04000000
                   1398: #define SCR_DT_DATA_IN 0x05000000
                   1399: #define SCR_MSG_OUT    0x06000000
                   1400: #define SCR_MSG_IN      0x07000000
                   1401: 
                   1402: #define SCR_ILG_OUT    0x04000000
                   1403: #define SCR_ILG_IN     0x05000000
                   1404: 
                   1405: /*-----------------------------------------------------------
                   1406: **
                   1407: **     Data transfer via SCSI.
                   1408: **
                   1409: **-----------------------------------------------------------
                   1410: **
                   1411: **     MOVE_ABS (LEN)
                   1412: **     <<start address>>
                   1413: **
                   1414: **     MOVE_IND (LEN)
                   1415: **     <<dnad_offset>>
                   1416: **
                   1417: **     MOVE_TBL
                   1418: **     <<dnad_offset>>
                   1419: **
                   1420: **-----------------------------------------------------------
                   1421: */
                   1422: 
                   1423: #define OPC_MOVE          0x08000000
                   1424: 
                   1425: #define SCR_MOVE_ABS(l) ((0x00000000 | OPC_MOVE) | (l))
                   1426: #define SCR_MOVE_IND(l) ((0x20000000 | OPC_MOVE) | (l))
                   1427: #define SCR_MOVE_TBL     (0x10000000 | OPC_MOVE)
                   1428: 
                   1429: #define SCR_CHMOV_ABS(l) ((0x00000000) | (l))
                   1430: #define SCR_CHMOV_IND(l) ((0x20000000) | (l))
                   1431: #define SCR_CHMOV_TBL     (0x10000000)
                   1432: 
                   1433: struct scr_tblmove {
                   1434:         u_int32  size;
                   1435:         u_int32  addr;
                   1436: };
                   1437: 
                   1438: /*-----------------------------------------------------------
                   1439: **
                   1440: **     Selection
                   1441: **
                   1442: **-----------------------------------------------------------
                   1443: **
                   1444: **     SEL_ABS | SCR_ID (0..15)    [ | REL_JMP]
                   1445: **     <<alternate_address>>
                   1446: **
                   1447: **     SEL_TBL | << dnad_offset>>  [ | REL_JMP]
                   1448: **     <<alternate_address>>
                   1449: **
                   1450: **-----------------------------------------------------------
                   1451: */
                   1452: 
                   1453: #define        SCR_SEL_ABS     0x40000000
                   1454: #define        SCR_SEL_ABS_ATN 0x41000000
                   1455: #define        SCR_SEL_TBL     0x42000000
                   1456: #define        SCR_SEL_TBL_ATN 0x43000000
                   1457: 
                   1458: struct scr_tblsel {
                   1459:         u_char  sel_scntl4;    
                   1460:         u_char  sel_sxfer;
                   1461:         u_char  sel_id;
                   1462:         u_char  sel_scntl3;
                   1463: };
                   1464: 
                   1465: #define SCR_JMP_REL     0x04000000
                   1466: #define SCR_ID(id)     (((u_int32)(id)) << 16)
                   1467: 
                   1468: /*-----------------------------------------------------------
                   1469: **
                   1470: **     Waiting for Disconnect or Reselect
                   1471: **
                   1472: **-----------------------------------------------------------
                   1473: **
                   1474: **     WAIT_DISC
                   1475: **     dummy: <<alternate_address>>
                   1476: **
                   1477: **     WAIT_RESEL
                   1478: **     <<alternate_address>>
                   1479: **
                   1480: **-----------------------------------------------------------
                   1481: */
                   1482: 
                   1483: #define        SCR_WAIT_DISC   0x48000000
                   1484: #define SCR_WAIT_RESEL  0x50000000
                   1485: 
                   1486: /*-----------------------------------------------------------
                   1487: **
                   1488: **     Bit Set / Reset
                   1489: **
                   1490: **-----------------------------------------------------------
                   1491: **
                   1492: **     SET (flags {|.. })
                   1493: **
                   1494: **     CLR (flags {|.. })
                   1495: **
                   1496: **-----------------------------------------------------------
                   1497: */
                   1498: 
                   1499: #define SCR_SET(f)     (0x58000000 | (f))
                   1500: #define SCR_CLR(f)     (0x60000000 | (f))
                   1501: 
                   1502: #define        SCR_CARRY       0x00000400
                   1503: #define        SCR_TRG         0x00000200
                   1504: #define        SCR_ACK         0x00000040
                   1505: #define        SCR_ATN         0x00000008
                   1506: 
                   1507: 
                   1508: 
                   1509: 
                   1510: /*-----------------------------------------------------------
                   1511: **
                   1512: **     Memory to memory move
                   1513: **
                   1514: **-----------------------------------------------------------
                   1515: **
                   1516: **     COPY (bytecount)
                   1517: **     << source_address >>
                   1518: **     << destination_address >>
                   1519: **
                   1520: **     SCR_COPY   sets the NO FLUSH option by default.
                   1521: **     SCR_COPY_F does not set this option.
                   1522: **
                   1523: **     For chips which do not support this option,
                   1524: **     ncr_copy_and_bind() will remove this bit.
                   1525: **-----------------------------------------------------------
                   1526: */
                   1527: 
                   1528: #define SCR_NO_FLUSH 0x01000000
                   1529: 
                   1530: #define SCR_COPY(n) (0xc0000000 | SCR_NO_FLUSH | (n))
                   1531: #define SCR_COPY_F(n) (0xc0000000 | (n))
                   1532: 
                   1533: /*-----------------------------------------------------------
                   1534: **
                   1535: **     Register move and binary operations
                   1536: **
                   1537: **-----------------------------------------------------------
                   1538: **
                   1539: **     SFBR_REG (reg, op, data)        reg  = SFBR op data
                   1540: **     << 0 >>
                   1541: **
                   1542: **     REG_SFBR (reg, op, data)        SFBR = reg op data
                   1543: **     << 0 >>
                   1544: **
                   1545: **     REG_REG  (reg, op, data)        reg  = reg op data
                   1546: **     << 0 >>
                   1547: **
                   1548: **-----------------------------------------------------------
                   1549: **     On 810A, 860, 825A, 875, 895 and 896 chips the content 
                   1550: **     of SFBR register can be used as data (SCR_SFBR_DATA).
                   1551: **     The 896 has additionnal IO registers starting at 
                   1552: **     offset 0x80. Bit 7 of register offset is stored in 
                   1553: **     bit 7 of the SCRIPTS instruction first DWORD.
                   1554: **-----------------------------------------------------------
                   1555: */
                   1556: 
                   1557: #define SCR_REG_OFS(ofs) ((((ofs) & 0x7f) << 16ul) + ((ofs) & 0x80)) 
                   1558: 
                   1559: #define SCR_SFBR_REG(reg,op,data) \
                   1560:         (0x68000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
                   1561: 
                   1562: #define SCR_REG_SFBR(reg,op,data) \
                   1563:         (0x70000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
                   1564: 
                   1565: #define SCR_REG_REG(reg,op,data) \
                   1566:         (0x78000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
                   1567: 
                   1568: 
                   1569: #define      SCR_LOAD   0x00000000
                   1570: #define      SCR_SHL    0x01000000
                   1571: #define      SCR_OR     0x02000000
                   1572: #define      SCR_XOR    0x03000000
                   1573: #define      SCR_AND    0x04000000
                   1574: #define      SCR_SHR    0x05000000
                   1575: #define      SCR_ADD    0x06000000
                   1576: #define      SCR_ADDC   0x07000000
                   1577: 
                   1578: #define      SCR_SFBR_DATA   (0x00800000>>8ul) /* Use SFBR as data */
                   1579: 
                   1580: /*-----------------------------------------------------------
                   1581: **
                   1582: **     FROM_REG (reg)            SFBR = reg
                   1583: **     << 0 >>
                   1584: **
                   1585: **     TO_REG   (reg)            reg  = SFBR
                   1586: **     << 0 >>
                   1587: **
                   1588: **     LOAD_REG (reg, data)      reg  = <data>
                   1589: **     << 0 >>
                   1590: **
                   1591: **     LOAD_SFBR(data)           SFBR = <data>
                   1592: **     << 0 >>
                   1593: **
                   1594: **-----------------------------------------------------------
                   1595: */
                   1596: 
                   1597: #define        SCR_FROM_REG(reg) \
                   1598:        SCR_REG_SFBR(reg,SCR_OR,0)
                   1599: 
                   1600: #define        SCR_TO_REG(reg) \
                   1601:        SCR_SFBR_REG(reg,SCR_OR,0)
                   1602: 
                   1603: #define        SCR_LOAD_REG(reg,data) \
                   1604:        SCR_REG_REG(reg,SCR_LOAD,data)
                   1605: 
                   1606: #define SCR_LOAD_SFBR(data) \
                   1607:         (SCR_REG_SFBR (gpreg, SCR_LOAD, data))
                   1608: 
                   1609: /*-----------------------------------------------------------
                   1610: **
                   1611: **     LOAD  from memory   to register.
                   1612: **     STORE from register to memory.
                   1613: **
                   1614: **     Only supported by 810A, 860, 825A, 875, 895 and 896.
                   1615: **
                   1616: **-----------------------------------------------------------
                   1617: **
                   1618: **     LOAD_ABS (LEN)
                   1619: **     <<start address>>
                   1620: **
                   1621: **     LOAD_REL (LEN)        (DSA relative)
                   1622: **     <<dsa_offset>>
                   1623: **
                   1624: **-----------------------------------------------------------
                   1625: */
                   1626: 
                   1627: #define SCR_REG_OFS2(ofs) (((ofs) & 0xff) << 16ul)
                   1628: #define SCR_NO_FLUSH2  0x02000000
                   1629: #define SCR_DSA_REL2   0x10000000
                   1630: 
                   1631: #define SCR_LOAD_R(reg, how, n) \
                   1632:         (0xe1000000 | how | (SCR_REG_OFS2(REG(reg))) | (n))
                   1633: 
                   1634: #define SCR_STORE_R(reg, how, n) \
                   1635:         (0xe0000000 | how | (SCR_REG_OFS2(REG(reg))) | (n))
                   1636: 
                   1637: #define SCR_LOAD_ABS(reg, n)   SCR_LOAD_R(reg, SCR_NO_FLUSH2, n)
                   1638: #define SCR_LOAD_REL(reg, n)   SCR_LOAD_R(reg, SCR_NO_FLUSH2|SCR_DSA_REL2, n)
                   1639: #define SCR_LOAD_ABS_F(reg, n) SCR_LOAD_R(reg, 0, n)
                   1640: #define SCR_LOAD_REL_F(reg, n) SCR_LOAD_R(reg, SCR_DSA_REL2, n)
                   1641: 
                   1642: #define SCR_STORE_ABS(reg, n)  SCR_STORE_R(reg, SCR_NO_FLUSH2, n)
                   1643: #define SCR_STORE_REL(reg, n)  SCR_STORE_R(reg, SCR_NO_FLUSH2|SCR_DSA_REL2,n)
                   1644: #define SCR_STORE_ABS_F(reg, n)        SCR_STORE_R(reg, 0, n)
                   1645: #define SCR_STORE_REL_F(reg, n)        SCR_STORE_R(reg, SCR_DSA_REL2, n)
                   1646: 
                   1647: 
                   1648: /*-----------------------------------------------------------
                   1649: **
                   1650: **     Waiting for Disconnect or Reselect
                   1651: **
                   1652: **-----------------------------------------------------------
                   1653: **
                   1654: **     JUMP            [ | IFTRUE/IFFALSE ( ... ) ]
                   1655: **     <<address>>
                   1656: **
                   1657: **     JUMPR           [ | IFTRUE/IFFALSE ( ... ) ]
                   1658: **     <<distance>>
                   1659: **
                   1660: **     CALL            [ | IFTRUE/IFFALSE ( ... ) ]
                   1661: **     <<address>>
                   1662: **
                   1663: **     CALLR           [ | IFTRUE/IFFALSE ( ... ) ]
                   1664: **     <<distance>>
                   1665: **
                   1666: **     RETURN          [ | IFTRUE/IFFALSE ( ... ) ]
                   1667: **     <<dummy>>
                   1668: **
                   1669: **     INT             [ | IFTRUE/IFFALSE ( ... ) ]
                   1670: **     <<ident>>
                   1671: **
                   1672: **     INT_FLY         [ | IFTRUE/IFFALSE ( ... ) ]
                   1673: **     <<ident>>
                   1674: **
                   1675: **     Conditions:
                   1676: **          WHEN (phase)
                   1677: **          IF   (phase)
                   1678: **          CARRYSET
                   1679: **          DATA (data, mask)
                   1680: **
                   1681: **-----------------------------------------------------------
                   1682: */
                   1683: 
                   1684: #define SCR_NO_OP       0x80000000
                   1685: #define SCR_JUMP        0x80080000
                   1686: #define SCR_JUMP64      0x80480000
                   1687: #define SCR_JUMPR       0x80880000
                   1688: #define SCR_CALL        0x88080000
                   1689: #define SCR_CALLR       0x88880000
                   1690: #define SCR_RETURN      0x90080000
                   1691: #define SCR_INT         0x98080000
                   1692: #define SCR_INT_FLY     0x98180000
                   1693: 
                   1694: #define IFFALSE(arg)   (0x00080000 | (arg))
                   1695: #define IFTRUE(arg)    (0x00000000 | (arg))
                   1696: 
                   1697: #define WHEN(phase)    (0x00030000 | (phase))
                   1698: #define IF(phase)      (0x00020000 | (phase))
                   1699: 
                   1700: #define DATA(D)        (0x00040000 | ((D) & 0xff))
                   1701: #define MASK(D,M)      (0x00040000 | (((M ^ 0xff) & 0xff) << 8ul)|((D) & 0xff))
                   1702: 
                   1703: #define CARRYSET       (0x00200000)
                   1704: 
                   1705: /*-----------------------------------------------------------
                   1706: **
                   1707: **     SCSI  constants.
                   1708: **
                   1709: **-----------------------------------------------------------
                   1710: */
                   1711: 
                   1712: /*
                   1713: **     Messages
                   1714: */
                   1715: 
                   1716: #define        M_COMPLETE      (0x00)
                   1717: #define        M_EXTENDED      (0x01)
                   1718: #define        M_SAVE_DP       (0x02)
                   1719: #define        M_RESTORE_DP    (0x03)
                   1720: #define        M_DISCONNECT    (0x04)
                   1721: #define        M_ID_ERROR      (0x05)
                   1722: #define        M_ABORT         (0x06)
                   1723: #define        M_REJECT        (0x07)
                   1724: #define        M_NOOP          (0x08)
                   1725: #define        M_PARITY        (0x09)
                   1726: #define        M_LCOMPLETE     (0x0a)
                   1727: #define        M_FCOMPLETE     (0x0b)
                   1728: #define        M_RESET         (0x0c)
                   1729: #define        M_ABORT_TAG     (0x0d)
                   1730: #define        M_CLEAR_QUEUE   (0x0e)
                   1731: #define        M_INIT_REC      (0x0f)
                   1732: #define        M_REL_REC       (0x10)
                   1733: #define        M_TERMINATE     (0x11)
                   1734: #define        M_SIMPLE_TAG    (0x20)
                   1735: #define        M_HEAD_TAG      (0x21)
                   1736: #define        M_ORDERED_TAG   (0x22)
                   1737: #define        M_IGN_RESIDUE   (0x23)
                   1738: #define        M_IDENTIFY      (0x80)
                   1739: 
                   1740: #define        M_X_MODIFY_DP   (0x00)
                   1741: #define        M_X_SYNC_REQ    (0x01)
                   1742: #define        M_X_WIDE_REQ    (0x03)
                   1743: #define        M_X_PPR_REQ     (0x04)
                   1744: 
                   1745: /*
                   1746: **     Status
                   1747: */
                   1748: 
                   1749: #define        S_GOOD          (0x00)
                   1750: #define        S_CHECK_COND    (0x02)
                   1751: #define        S_COND_MET      (0x04)
                   1752: #define        S_BUSY          (0x08)
                   1753: #define        S_INT           (0x10)
                   1754: #define        S_INT_COND_MET  (0x14)
                   1755: #define        S_CONFLICT      (0x18)
                   1756: #define        S_TERMINATED    (0x20)
                   1757: #define        S_QUEUE_FULL    (0x28)
                   1758: #define        S_ILLEGAL       (0xff)
                   1759: #define        S_SENSE         (0x80)
                   1760: 
                   1761: /*
                   1762:  * End of ncrreg from FreeBSD
                   1763:  */
                   1764: 
                   1765: #endif /* !defined HOSTS_C */
                   1766: 
                   1767: #endif /* defined SYM53C8XX_DEFS_H */

unix.superglobalmegacorp.com

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