Annotation of Gnu-Mach/linux/src/drivers/scsi/ncr53c8xx.h, revision 1.1.1.2

1.1       root        1: /******************************************************************************
                      2: **  Device driver for the PCI-SCSI NCR538XX controller family.
                      3: **
                      4: **  Copyright (C) 1994  Wolfgang Stanglmeier
                      5: **
                      6: **  This program is free software; you can redistribute it and/or modify
                      7: **  it under the terms of the GNU General Public License as published by
                      8: **  the Free Software Foundation; either version 2 of the License, or
                      9: **  (at your option) any later version.
                     10: **
                     11: **  This program is distributed in the hope that it will be useful,
                     12: **  but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: **  GNU General Public License for more details.
                     15: **
                     16: **  You should have received a copy of the GNU General Public License
                     17: **  along with this program; if not, write to the Free Software
                     18: **  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     19: **
                     20: **-----------------------------------------------------------------------------
                     21: **
                     22: **  This driver has been ported to Linux from the FreeBSD NCR53C8XX driver
                     23: **  and is currently maintained by
                     24: **
                     25: **          Gerard Roudier              <[email protected]>
                     26: **
                     27: **  Being given that this driver originates from the FreeBSD version, and
                     28: **  in order to keep synergy on both, any suggested enhancements and corrections
                     29: **  received on Linux are automatically a potential candidate for the FreeBSD 
                     30: **  version.
                     31: **
                     32: **  The original driver has been written for 386bsd and FreeBSD by
                     33: **          Wolfgang Stanglmeier        <[email protected]>
                     34: **          Stefan Esser                <[email protected]>
                     35: **
                     36: **  And has been ported to NetBSD by
                     37: **          Charles M. Hannum           <[email protected]>
                     38: **
                     39: *******************************************************************************
                     40: */
                     41: 
                     42: #ifndef NCR53C8XX_H
                     43: #define NCR53C8XX_H
                     44: 
                     45: /*
                     46: **     Name and revision of the driver
                     47: */
                     48: #define SCSI_NCR_DRIVER_NAME           "ncr53c8xx - revision 2.5f.1"
                     49: 
                     50: /*
                     51: **     Check supported Linux versions
                     52: */
                     53: 
                     54: #if !defined(LINUX_VERSION_CODE)
                     55: #include <linux/version.h>
                     56: #endif
                     57: #include <linux/config.h>
                     58: 
                     59: /*
                     60: **     During make dep of linux-1.2.13, LINUX_VERSION_CODE is undefined
                     61: **     Under linux-1.3.X, all seems to be OK.
                     62: **     So, we have only to define it under 1.2.13
                     63: */
                     64: 
                     65: #define LinuxVersionCode(v, p, s) (((v)<<16)+((p)<<8)+(s))
                     66: 
                     67: #if !defined(LINUX_VERSION_CODE)
                     68: #define LINUX_VERSION_CODE LinuxVersionCode(1,2,13)
                     69: #endif
                     70: 
                     71: /*
                     72: **     Normal IO or memory mapped IO.
                     73: **
                     74: **     Memory mapped IO only works with linux-1.3.X
                     75: **     If your motherboard does not work with memory mapped IO,
                     76: **     define SCSI_NCR_IOMAPPED for PATCHLEVEL 3 too.
                     77: */
                     78: 
                     79: #if    LINUX_VERSION_CODE < LinuxVersionCode(1,3,0)
                     80: #      define  SCSI_NCR_IOMAPPED
                     81: #endif
                     82: 
                     83: #if    LINUX_VERSION_CODE >= LinuxVersionCode(1,3,0)
1.1.1.2 ! root       84: //#    define  SCSI_NCR_PROC_INFO_SUPPORT
1.1       root       85: #endif
                     86: 
                     87: #if    LINUX_VERSION_CODE >= LinuxVersionCode(1,3,72)
                     88: #      define SCSI_NCR_SHARE_IRQ
                     89: #endif
                     90: 
                     91: /*
                     92: **     If you want a driver as small as possible, donnot define the 
                     93: **     following options.
                     94: */
                     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_PROFILE_SUPPORT
                    101: #      define  SCSI_NCR_USER_COMMAND_SUPPORT
                    102: #      define  SCSI_NCR_USER_INFO_SUPPORT
                    103: /* #   define  SCSI_NCR_DEBUG_ERROR_RECOVERY_SUPPORT */
                    104: #endif
                    105: 
                    106: /*==========================================================
                    107: **
                    108: ** nvram settings - #define SCSI_NCR_NVRAM_SUPPORT to enable
                    109: **
                    110: **==========================================================
                    111: */
                    112: 
                    113: #ifdef CONFIG_SCSI_NCR53C8XX_NVRAM_DETECT
                    114: #define SCSI_NCR_NVRAM_SUPPORT
                    115: /* #define SCSI_NCR_DEBUG_NVRAM */
                    116: #endif
                    117: 
                    118: /* ---------------------------------------------------------------------
                    119: ** Take into account kernel configured parameters.
                    120: ** Most of these options can be overridden at startup by a command line.
                    121: ** ---------------------------------------------------------------------
                    122: */
                    123: 
                    124: /*
                    125:  * For Ultra2 SCSI support option, use special features and allow 40Mhz 
                    126:  * synchronous data transfers.
                    127:  */
                    128: #define        SCSI_NCR_SETUP_SPECIAL_FEATURES         (3)
                    129: #define SCSI_NCR_SETUP_ULTRA_SCSI              (2)
                    130: #define SCSI_NCR_MAX_SYNC                      (40)
                    131: 
                    132: /*
                    133:  * Allow tags from 2 to 12, default 4
                    134:  */
                    135: #ifdef CONFIG_SCSI_NCR53C8XX_MAX_TAGS
                    136: #if    CONFIG_SCSI_NCR53C8XX_MAX_TAGS < 2
                    137: #define SCSI_NCR_MAX_TAGS      (2)
                    138: #elif  CONFIG_SCSI_NCR53C8XX_MAX_TAGS > 12
                    139: #define SCSI_NCR_MAX_TAGS      (12)
                    140: #else
                    141: #define        SCSI_NCR_MAX_TAGS       CONFIG_SCSI_NCR53C8XX_MAX_TAGS
                    142: #endif
                    143: #else
                    144: #define SCSI_NCR_MAX_TAGS      (4)
                    145: #endif
                    146: 
                    147: /*
                    148:  * Allow tagged command queuing support if configured with default number 
                    149:  * of tags set to max (see above).
                    150:  */
                    151: #ifdef CONFIG_SCSI_NCR53C8XX_TAGGED_QUEUE
                    152: #define        SCSI_NCR_SETUP_DEFAULT_TAGS     SCSI_NCR_MAX_TAGS
                    153: #else
                    154: #define        SCSI_NCR_SETUP_DEFAULT_TAGS     (0)
                    155: #endif
                    156: 
                    157: /*
                    158:  * Use normal IO if configured. Forced for alpha and ppc.
                    159:  */
                    160: #if defined(CONFIG_SCSI_NCR53C8XX_IOMAPPED)
                    161: #define        SCSI_NCR_IOMAPPED
                    162: #elif defined(__alpha__) || defined(__powerpc__)
                    163: #define        SCSI_NCR_IOMAPPED
                    164: #endif
                    165: 
                    166: /*
                    167:  * Sync transfer frequency at startup.
                    168:  * Allow from 5Mhz to 40Mhz default 10 Mhz.
                    169:  */
                    170: #ifndef        CONFIG_SCSI_NCR53C8XX_SYNC
                    171: #define        CONFIG_SCSI_NCR53C8XX_SYNC      (5)
                    172: #elif  CONFIG_SCSI_NCR53C8XX_SYNC > SCSI_NCR_MAX_SYNC
                    173: #define        SCSI_NCR_SETUP_DEFAULT_SYNC     SCSI_NCR_MAX_SYNC
                    174: #endif
                    175: 
                    176: #if    CONFIG_SCSI_NCR53C8XX_SYNC == 0
                    177: #define        SCSI_NCR_SETUP_DEFAULT_SYNC     (255)
                    178: #elif  CONFIG_SCSI_NCR53C8XX_SYNC <= 5
                    179: #define        SCSI_NCR_SETUP_DEFAULT_SYNC     (50)
                    180: #elif  CONFIG_SCSI_NCR53C8XX_SYNC <= 20
                    181: #define        SCSI_NCR_SETUP_DEFAULT_SYNC     (250/(CONFIG_SCSI_NCR53C8XX_SYNC))
                    182: #elif  CONFIG_SCSI_NCR53C8XX_SYNC <= 33
                    183: #define        SCSI_NCR_SETUP_DEFAULT_SYNC     (11)
                    184: #else
                    185: #define        SCSI_NCR_SETUP_DEFAULT_SYNC     (10)
                    186: #endif
                    187: 
                    188: /*
                    189:  * Disallow disconnections at boot-up
                    190:  */
                    191: #ifdef CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
                    192: #define SCSI_NCR_SETUP_DISCONNECTION   (0)
                    193: #else
                    194: #define SCSI_NCR_SETUP_DISCONNECTION   (1)
                    195: #endif
                    196: 
                    197: /*
                    198:  * Force synchronous negotiation for all targets
                    199:  */
                    200: #ifdef CONFIG_SCSI_NCR53C8XX_FORCE_SYNC_NEGO
                    201: #define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (1)
                    202: #else
                    203: #define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (0)
                    204: #endif
                    205: 
                    206: /*
                    207:  * Disable master parity checking (flawed hardwares need that)
                    208:  */
                    209: #ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_MPARITY_CHECK
                    210: #define SCSI_NCR_SETUP_MASTER_PARITY   (0)
                    211: #else
                    212: #define SCSI_NCR_SETUP_MASTER_PARITY   (1)
                    213: #endif
                    214: 
                    215: /*
                    216:  * Disable scsi parity checking (flawed devices may need that)
                    217:  */
                    218: #ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_PARITY_CHECK
                    219: #define SCSI_NCR_SETUP_SCSI_PARITY     (0)
                    220: #else
                    221: #define SCSI_NCR_SETUP_SCSI_PARITY     (1)
                    222: #endif
                    223: 
                    224: /*
                    225:  * Vendor specific stuff
                    226:  */
                    227: #ifdef CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT
                    228: #define SCSI_NCR_SETUP_LED_PIN         (1)
                    229: #define SCSI_NCR_SETUP_DIFF_SUPPORT    (3)
                    230: #else
                    231: #define SCSI_NCR_SETUP_LED_PIN         (0)
                    232: #define SCSI_NCR_SETUP_DIFF_SUPPORT    (0)
                    233: #endif
                    234: 
                    235: /*
                    236:  * Settle time after reset at boot-up
                    237:  */
                    238: #define SCSI_NCR_SETUP_SETTLE_TIME     (2)
                    239: 
                    240: /*
                    241: **     Other parameters not configurable with "make config"
                    242: **     Avoid to change these constants, unless you know what you are doing.
                    243: */
                    244: 
                    245: #define SCSI_NCR_ALWAYS_SIMPLE_TAG
                    246: #define SCSI_NCR_MAX_SCATTER   (127)
                    247: #define SCSI_NCR_MAX_TARGET    (16)
                    248: #define SCSI_NCR_MAX_HOST      (2)
                    249: #define SCSI_NCR_TIMEOUT_ALERT (3*HZ)
                    250: 
                    251: #define SCSI_NCR_CAN_QUEUE     (7*SCSI_NCR_MAX_TAGS)
                    252: #define SCSI_NCR_CMD_PER_LUN   (SCSI_NCR_MAX_TAGS)
                    253: #define SCSI_NCR_SG_TABLESIZE  (SCSI_NCR_MAX_SCATTER)
                    254: 
                    255: #define SCSI_NCR_TIMER_INTERVAL        ((HZ+5-1)/5)
                    256: 
                    257: #if 1 /* defined CONFIG_SCSI_MULTI_LUN */
                    258: #define SCSI_NCR_MAX_LUN       (8)
                    259: #else
                    260: #define SCSI_NCR_MAX_LUN       (1)
                    261: #endif
                    262: 
                    263: /*
                    264: **     Define Scsi_Host_Template parameters
                    265: **
                    266: **     Used by hosts.c and ncr53c8xx.c with module configuration.
                    267: */
                    268: 
                    269: #if defined(HOSTS_C) || defined(MODULE)
                    270: 
                    271: #if    LINUX_VERSION_CODE >= LinuxVersionCode(1,3,98)
                    272: #include <scsi/scsicam.h>
                    273: #else
                    274: #include <linux/scsicam.h>
                    275: #endif
                    276: 
                    277: int ncr53c8xx_abort(Scsi_Cmnd *);
                    278: int ncr53c8xx_detect(Scsi_Host_Template *tpnt);
                    279: int ncr53c8xx_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
                    280: 
                    281: #if    LINUX_VERSION_CODE >= LinuxVersionCode(1,3,98)
                    282: int ncr53c8xx_reset(Scsi_Cmnd *, unsigned int);
                    283: #else
                    284: int ncr53c8xx_reset(Scsi_Cmnd *);
                    285: #endif
                    286: 
                    287: #ifdef MODULE
                    288: int ncr53c8xx_release(struct Scsi_Host *);
                    289: #else
                    290: #define ncr53c8xx_release NULL
                    291: #endif
                    292: 
                    293: #if    LINUX_VERSION_CODE >= LinuxVersionCode(2,1,75)
                    294: 
                    295: #define NCR53C8XX {     name:           SCSI_NCR_DRIVER_NAME,  \
                    296:                        detect:         ncr53c8xx_detect,       \
                    297:                        release:        ncr53c8xx_release,      \
                    298:                        queuecommand:   ncr53c8xx_queue_command,\
                    299:                        abort:          ncr53c8xx_abort,        \
                    300:                        reset:          ncr53c8xx_reset,        \
                    301:                        bios_param:     scsicam_bios_param,     \
                    302:                        can_queue:      SCSI_NCR_CAN_QUEUE,     \
                    303:                        this_id:        7,                      \
                    304:                        sg_tablesize:   SCSI_NCR_SG_TABLESIZE,  \
                    305:                        cmd_per_lun:    SCSI_NCR_CMD_PER_LUN,   \
                    306:                        use_clustering: DISABLE_CLUSTERING} 
                    307:   
                    308: #elif  LINUX_VERSION_CODE >= LinuxVersionCode(1,3,0)
                    309: 
                    310: #define NCR53C8XX {    NULL, NULL, NULL, NULL,                         \
                    311:                        SCSI_NCR_DRIVER_NAME,   ncr53c8xx_detect,       \
                    312:                        ncr53c8xx_release,      NULL,   NULL,           \
                    313:                        ncr53c8xx_queue_command,ncr53c8xx_abort,        \
                    314:                        ncr53c8xx_reset, NULL,  scsicam_bios_param,     \
                    315:                        SCSI_NCR_CAN_QUEUE,     7,                      \
                    316:                        SCSI_NCR_SG_TABLESIZE,  SCSI_NCR_CMD_PER_LUN,   \
                    317:                        0,      0,      DISABLE_CLUSTERING} 
                    318: 
                    319: #else
                    320: 
                    321: #define NCR53C8XX {    NULL, NULL,                                     \
                    322:                        SCSI_NCR_DRIVER_NAME,   ncr53c8xx_detect,       \
                    323:                        ncr53c8xx_release,      NULL,   NULL,           \
                    324:                        ncr53c8xx_queue_command,ncr53c8xx_abort,        \
                    325:                        ncr53c8xx_reset, NULL,  scsicam_bios_param,     \
                    326:                        SCSI_NCR_CAN_QUEUE,     7,                      \
                    327:                        SCSI_NCR_SG_TABLESIZE,  SCSI_NCR_CMD_PER_LUN,   \
                    328:                        0,      0,      DISABLE_CLUSTERING} 
                    329: 
                    330: #endif /* LINUX_VERSION_CODE */
                    331: 
                    332: #endif /* defined(HOSTS_C) || defined(MODULE) */ 
                    333: 
                    334: 
                    335: #ifndef HOSTS_C
                    336: 
                    337: /*
                    338: **     IO functions definition for big/little endian support.
                    339: **     For now, the NCR is only supported in little endian addressing mode, 
                    340: **     and big endian byte ordering is only supported for the PPC.
                    341: **     MMIO is not used on PPC.
                    342: */
                    343: 
                    344: #ifdef __BIG_ENDIAN
                    345: 
                    346: #if    LINUX_VERSION_CODE < LinuxVersionCode(2,1,0)
                    347: #error "BIG ENDIAN byte ordering needs kernel version >= 2.1.0"
                    348: #endif
                    349: 
                    350: #ifdef __powerpc__
                    351: #define        inw_l2b         inw
                    352: #define        inl_l2b         inl
                    353: #define        outw_b2l        outw
                    354: #define        outl_b2l        outl
                    355: #else
                    356: #error "Support for BIG ENDIAN is only available for the PowerPC"
                    357: #endif
                    358: 
                    359: #else  /* Assumed x86 or alpha */
                    360: 
                    361: #define        inw_raw         inw
                    362: #define        inl_raw         inl
                    363: #define        outw_raw        outw
                    364: #define        outl_raw        outl
                    365: #define        readw_raw       readw
                    366: #define        readl_raw       readl
                    367: #define        writew_raw      writew
                    368: #define        writel_raw      writel
                    369: 
                    370: #endif
                    371: 
                    372: #ifdef SCSI_NCR_BIG_ENDIAN
                    373: #error "The NCR in BIG ENDIAN adressing mode is not (yet) supported"
                    374: #endif
                    375: 
                    376: /*
                    377: **     NCR53C8XX Device Ids
                    378: */
                    379: 
                    380: #ifndef PCI_DEVICE_ID_NCR_53C810
                    381: #define PCI_DEVICE_ID_NCR_53C810 1
                    382: #endif
                    383: 
                    384: #ifndef PCI_DEVICE_ID_NCR_53C810AP
                    385: #define PCI_DEVICE_ID_NCR_53C810AP 5
                    386: #endif
                    387: 
                    388: #ifndef PCI_DEVICE_ID_NCR_53C815
                    389: #define PCI_DEVICE_ID_NCR_53C815 4
                    390: #endif
                    391: 
                    392: #ifndef PCI_DEVICE_ID_NCR_53C820
                    393: #define PCI_DEVICE_ID_NCR_53C820 2
                    394: #endif
                    395: 
                    396: #ifndef PCI_DEVICE_ID_NCR_53C825
                    397: #define PCI_DEVICE_ID_NCR_53C825 3
                    398: #endif
                    399: 
                    400: #ifndef PCI_DEVICE_ID_NCR_53C860
                    401: #define PCI_DEVICE_ID_NCR_53C860 6
                    402: #endif
                    403: 
                    404: #ifndef PCI_DEVICE_ID_NCR_53C875
                    405: #define PCI_DEVICE_ID_NCR_53C875 0xf
                    406: #endif
                    407: 
                    408: #ifndef PCI_DEVICE_ID_NCR_53C875J
                    409: #define PCI_DEVICE_ID_NCR_53C875J 0x8f
                    410: #endif
                    411: 
                    412: #ifndef PCI_DEVICE_ID_NCR_53C885
                    413: #define PCI_DEVICE_ID_NCR_53C885 0xd
                    414: #endif
                    415: 
                    416: #ifndef PCI_DEVICE_ID_NCR_53C895
                    417: #define PCI_DEVICE_ID_NCR_53C895 0xc
                    418: #endif
                    419: 
                    420: #ifndef PCI_DEVICE_ID_NCR_53C896
                    421: #define PCI_DEVICE_ID_NCR_53C896 0xb
                    422: #endif
                    423: 
                    424: /*
                    425: **   NCR53C8XX devices features table.
                    426: */
                    427: typedef struct {
                    428:        unsigned short  device_id;
                    429:        unsigned short  revision_id;
                    430:        char    *name;
                    431:        unsigned char   burst_max;
                    432:        unsigned char   offset_max;
                    433:        unsigned char   nr_divisor;
                    434:        unsigned int    features;
                    435: #define FE_LED0                (1<<0)
                    436: #define FE_WIDE                (1<<1)
                    437: #define FE_ULTRA       (1<<2)
                    438: #define FE_ULTRA2      (1<<3)
                    439: #define FE_DBLR                (1<<4)
                    440: #define FE_QUAD                (1<<5)
                    441: #define FE_ERL         (1<<6)
                    442: #define FE_CLSE                (1<<7)
                    443: #define FE_WRIE                (1<<8)
                    444: #define FE_ERMP                (1<<9)
                    445: #define FE_BOF         (1<<10)
                    446: #define FE_DFS         (1<<11)
                    447: #define FE_PFEN                (1<<12)
                    448: #define FE_LDSTR       (1<<13)
                    449: #define FE_RAM         (1<<14)
                    450: #define FE_CLK80       (1<<15)
                    451: #define FE_CACHE_SET   (FE_ERL|FE_CLSE|FE_WRIE|FE_ERMP)
                    452: #define FE_SCSI_SET    (FE_WIDE|FE_ULTRA|FE_ULTRA2|FE_DBLR|FE_QUAD|F_CLK80)
                    453: #define FE_SPECIAL_SET (FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM)
                    454: } ncr_chip;
                    455: 
                    456: /*
                    457: **     DEL 397 - 53C875 Rev 3 - Part Number 609-0392410 - ITEM 3.
                    458: **     Memory Read transaction terminated by a retry followed by 
                    459: **     Memory Read Line command.
                    460: */
                    461: #define FE_CACHE0_SET  (FE_CACHE_SET & ~FE_ERL)
                    462: 
                    463: /*
                    464: **     DEL 397 - 53C875 Rev 3 - Part Number 609-0392410 - ITEM 5.
                    465: **     On paper, this errata is harmless. But it is a good reason for 
                    466: **     using a shorter programmed burst length (64 DWORDS instead of 128).
                    467: */
                    468: 
                    469: #define SCSI_NCR_CHIP_TABLE                                            \
                    470: {                                                                      \
                    471:  {PCI_DEVICE_ID_NCR_53C810, 0x0f, "810",  4,  8, 4,                    \
                    472:  FE_ERL}                                                               \
                    473:  ,                                                                     \
                    474:  {PCI_DEVICE_ID_NCR_53C810, 0xff, "810a", 4,  8, 4,                    \
                    475:  FE_CACHE_SET|FE_LDSTR|FE_PFEN|FE_BOF}                                 \
                    476:  ,                                                                     \
                    477:  {PCI_DEVICE_ID_NCR_53C815, 0xff, "815",  4,  8, 4,                    \
                    478:  FE_ERL|FE_BOF}                                                                \
                    479:  ,                                                                     \
                    480:  {PCI_DEVICE_ID_NCR_53C820, 0xff, "820",  4,  8, 4,                    \
                    481:  FE_WIDE|FE_ERL}                                                       \
                    482:  ,                                                                     \
                    483:  {PCI_DEVICE_ID_NCR_53C825, 0x0f, "825",  4,  8, 4,                    \
                    484:  FE_WIDE|FE_ERL|FE_BOF}                                                        \
                    485:  ,                                                                     \
                    486:  {PCI_DEVICE_ID_NCR_53C825, 0xff, "825a", 6,  8, 4,                    \
                    487:  FE_WIDE|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM}          \
                    488:  ,                                                                     \
                    489:  {PCI_DEVICE_ID_NCR_53C860, 0xff, "860",  4,  8, 5,                    \
                    490:  FE_ULTRA|FE_CLK80|FE_CACHE_SET|FE_BOF|FE_LDSTR|FE_PFEN}               \
                    491:  ,                                                                     \
                    492:  {PCI_DEVICE_ID_NCR_53C875, 0x01, "875",  6, 16, 5,                    \
                    493:  FE_WIDE|FE_ULTRA|FE_CLK80|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM}\
                    494:  ,                                                                     \
                    495:  {PCI_DEVICE_ID_NCR_53C875, 0xff, "875",  6, 16, 5,                    \
                    496:  FE_WIDE|FE_ULTRA|FE_DBLR|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM}\
                    497:  ,                                                                     \
                    498:  {PCI_DEVICE_ID_NCR_53C875J,0xff, "875J", 6, 16, 5,                    \
                    499:  FE_WIDE|FE_ULTRA|FE_DBLR|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM}\
                    500:  ,                                                                     \
                    501:  {PCI_DEVICE_ID_NCR_53C885, 0xff, "885",  6, 16, 5,                    \
                    502:  FE_WIDE|FE_ULTRA|FE_DBLR|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM}\
                    503:  ,                                                                     \
                    504:  {PCI_DEVICE_ID_NCR_53C895, 0xff, "895",  7, 31, 7,                    \
                    505:  FE_WIDE|FE_ULTRA2|FE_QUAD|FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM}\
                    506:  ,                                                                     \
                    507:  {PCI_DEVICE_ID_NCR_53C896, 0xff, "896",  7, 31, 7,                    \
                    508:  FE_WIDE|FE_ULTRA2|FE_QUAD|FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM}\
                    509: }
                    510: 
                    511: /*
                    512:  * List of supported NCR chip ids
                    513:  */
                    514: #define SCSI_NCR_CHIP_IDS              \
                    515: {                                      \
                    516:        PCI_DEVICE_ID_NCR_53C810,       \
                    517:        PCI_DEVICE_ID_NCR_53C815,       \
                    518:        PCI_DEVICE_ID_NCR_53C820,       \
                    519:        PCI_DEVICE_ID_NCR_53C825,       \
                    520:        PCI_DEVICE_ID_NCR_53C860,       \
                    521:        PCI_DEVICE_ID_NCR_53C875,       \
                    522:        PCI_DEVICE_ID_NCR_53C875J,      \
                    523:        PCI_DEVICE_ID_NCR_53C885,       \
                    524:        PCI_DEVICE_ID_NCR_53C895,       \
                    525:        PCI_DEVICE_ID_NCR_53C896        \
                    526: }
                    527: 
                    528: /*
                    529: **     Initial setup.
                    530: **     Can be overriden at startup by a command line.
                    531: */
                    532: #define SCSI_NCR_DRIVER_SETUP                  \
                    533: {                                              \
                    534:        SCSI_NCR_SETUP_MASTER_PARITY,           \
                    535:        SCSI_NCR_SETUP_SCSI_PARITY,             \
                    536:        SCSI_NCR_SETUP_DISCONNECTION,           \
                    537:        SCSI_NCR_SETUP_SPECIAL_FEATURES,        \
                    538:        SCSI_NCR_SETUP_ULTRA_SCSI,              \
                    539:        SCSI_NCR_SETUP_FORCE_SYNC_NEGO,         \
                    540:        0,                                      \
                    541:        0,                                      \
                    542:        1,                                      \
                    543:        1,                                      \
                    544:        SCSI_NCR_SETUP_DEFAULT_TAGS,            \
                    545:        SCSI_NCR_SETUP_DEFAULT_SYNC,            \
                    546:        0x00,                                   \
                    547:        7,                                      \
                    548:        SCSI_NCR_SETUP_LED_PIN,                 \
                    549:        1,                                      \
                    550:        SCSI_NCR_SETUP_SETTLE_TIME,             \
                    551:        SCSI_NCR_SETUP_DIFF_SUPPORT,            \
                    552:        0,                                      \
                    553:        1                                       \
                    554: }
                    555: 
                    556: /*
                    557: **     Boot fail safe setup.
                    558: **     Override initial setup from boot command line:
                    559: **     ncr53c8xx=safe:y
                    560: */
                    561: #define SCSI_NCR_DRIVER_SAFE_SETUP             \
                    562: {                                              \
                    563:        0,                                      \
                    564:        1,                                      \
                    565:        0,                                      \
                    566:        0,                                      \
                    567:        0,                                      \
                    568:        0,                                      \
                    569:        0,                                      \
                    570:        0,                                      \
                    571:        1,                                      \
                    572:        2,                                      \
                    573:        0,                                      \
                    574:        255,                                    \
                    575:        0x00,                                   \
                    576:        255,                                    \
                    577:        0,                                      \
                    578:        0,                                      \
                    579:        10,                                     \
                    580:        1,                                      \
                    581:        1,                                      \
                    582:        1                                       \
                    583: }
                    584: 
                    585: /*
                    586: **     Define the table of target capabilities by host and target
                    587: **
                    588: **     If you have problems with a scsi device, note the host unit and the
                    589: **     corresponding target number.
                    590: **
                    591: **     Edit the corresponding entry of the table below and try successively:
                    592: **             NQ7_Questionnable
                    593: **             NQ7_IdeLike
                    594: **
                    595: **     This bitmap is anded with the byte 7 of inquiry data on completion of
                    596: **     INQUIRY command.
                    597: **     The driver never see the zeroed bits and will ignore the corresponding
                    598: **     capabilities of the target.
                    599: */
                    600: 
                    601: #define INQ7_SftRe     1
                    602: #define INQ7_CmdQueue  (1<<1)          /* Tagged Command */
                    603: #define INQ7_Reserved  (1<<2)
                    604: #define INQ7_Linked    (1<<3)
                    605: #define INQ7_Sync      (1<<4)          /* Synchronous Negotiation */
                    606: #define INQ7_WBus16    (1<<5)
                    607: #define INQ7_WBus32    (1<<6)
                    608: #define INQ7_RelAdr    (1<<7)
                    609: 
                    610: #define INQ7_IdeLike           0
                    611: #define INQ7_Scsi1Like         INQ7_IdeLike
                    612: #define INQ7_Perfect           0xff
                    613: #define INQ7_Questionnable     ~(INQ7_CmdQueue|INQ7_Sync)
                    614: #define INQ7_VeryQuestionnable \
                    615:                        ~(INQ7_CmdQueue|INQ7_Sync|INQ7_WBus16|INQ7_WBus32)
                    616: 
                    617: #define INQ7_Default           INQ7_Perfect
                    618: 
                    619: #define NCR53C8XX_TARGET_CAPABILITIES                                  \
                    620: /* Host 0 */                                                           \
                    621: {                                                                      \
                    622:        {                                                               \
                    623:        /* Target  0 */         INQ7_Default,                           \
                    624:        /* Target  1 */         INQ7_Default,                           \
                    625:        /* Target  2 */         INQ7_Default,                           \
                    626:        /* Target  3 */         INQ7_Default,                           \
                    627:        /* Target  4 */         INQ7_Default,                           \
                    628:        /* Target  5 */         INQ7_Default,                           \
                    629:        /* Target  6 */         INQ7_Default,                           \
                    630:        /* Target  7 */         INQ7_Default,                           \
                    631:        /* Target  8 */         INQ7_Default,                           \
                    632:        /* Target  9 */         INQ7_Default,                           \
                    633:        /* Target 10 */         INQ7_Default,                           \
                    634:        /* Target 11 */         INQ7_Default,                           \
                    635:        /* Target 12 */         INQ7_Default,                           \
                    636:        /* Target 13 */         INQ7_Default,                           \
                    637:        /* Target 14 */         INQ7_Default,                           \
                    638:        /* Target 15 */         INQ7_Default,                           \
                    639:        }                                                               \
                    640: },                                                                     \
                    641: /* Host 1 */                                                           \
                    642: {                                                                      \
                    643:        {                                                               \
                    644:        /* Target  0 */         INQ7_Default,                           \
                    645:        /* Target  1 */         INQ7_Default,                           \
                    646:        /* Target  2 */         INQ7_Default,                           \
                    647:        /* Target  3 */         INQ7_Default,                           \
                    648:        /* Target  4 */         INQ7_Default,                           \
                    649:        /* Target  5 */         INQ7_Default,                           \
                    650:        /* Target  6 */         INQ7_Default,                           \
                    651:        /* Target  7 */         INQ7_Default,                           \
                    652:        /* Target  8 */         INQ7_Default,                           \
                    653:        /* Target  9 */         INQ7_Default,                           \
                    654:        /* Target 10 */         INQ7_Default,                           \
                    655:        /* Target 11 */         INQ7_Default,                           \
                    656:        /* Target 12 */         INQ7_Default,                           \
                    657:        /* Target 13 */         INQ7_Default,                           \
                    658:        /* Target 14 */         INQ7_Default,                           \
                    659:        /* Target 15 */         INQ7_Default,                           \
                    660:        }                                                               \
                    661: }
                    662: 
                    663: /*
                    664: **     Replace the proc_dir_entry of the standard ncr driver.
                    665: */
                    666: 
                    667: #if    LINUX_VERSION_CODE >= LinuxVersionCode(1,3,0)
                    668: #if    defined(CONFIG_SCSI_NCR53C7xx) || !defined(CONFIG_SCSI_NCR53C8XX)
                    669: #define PROC_SCSI_NCR53C8XX    PROC_SCSI_NCR53C7xx
                    670: #endif
                    671: #endif
                    672: 
                    673: /**************** ORIGINAL CONTENT of ncrreg.h from FreeBSD ******************/
                    674: 
                    675: /*-----------------------------------------------------------------
                    676: **
                    677: **     The ncr 53c810 register structure.
                    678: **
                    679: **-----------------------------------------------------------------
                    680: */
                    681: 
                    682: struct ncr_reg {
                    683: /*00*/  u_char    nc_scntl0;    /* full arb., ena parity, par->ATN  */
                    684: 
                    685: /*01*/  u_char    nc_scntl1;    /* no reset                         */
                    686:         #define   ISCON   0x10  /* connected to scsi               */
                    687:         #define   CRST    0x08  /* force reset                      */
                    688: 
                    689: /*02*/  u_char    nc_scntl2;    /* no disconnect expected           */
                    690:        #define   SDU     0x80  /* cmd: disconnect will raise error */
                    691:        #define   CHM     0x40  /* sta: chained mode                */
                    692:        #define   WSS     0x08  /* sta: wide scsi send           [W]*/
                    693:        #define   WSR     0x01  /* sta: wide scsi received       [W]*/
                    694: 
                    695: /*03*/  u_char    nc_scntl3;    /* cnf system clock dependent       */
                    696:        #define   EWS     0x08  /* cmd: enable wide scsi         [W]*/
                    697:        #define   ULTRA   0x80  /* cmd: ULTRA enable                */
                    698: 
                    699: /*04*/  u_char    nc_scid;     /* cnf host adapter scsi address    */
                    700:        #define   RRE     0x40  /* r/w:e enable response to resel.  */
                    701:        #define   SRE     0x20  /* r/w:e enable response to select  */
                    702: 
                    703: /*05*/  u_char    nc_sxfer;    /* ### Sync speed and count         */
                    704: 
                    705: /*06*/  u_char    nc_sdid;     /* ### Destination-ID               */
                    706: 
                    707: /*07*/  u_char    nc_gpreg;    /* ??? IO-Pins                      */
                    708: 
                    709: /*08*/  u_char    nc_sfbr;     /* ### First byte in phase          */
                    710: 
                    711: /*09*/  u_char    nc_socl;
                    712:        #define   CREQ    0x80  /* r/w: SCSI-REQ                    */
                    713:        #define   CACK    0x40  /* r/w: SCSI-ACK                    */
                    714:        #define   CBSY    0x20  /* r/w: SCSI-BSY                    */
                    715:        #define   CSEL    0x10  /* r/w: SCSI-SEL                    */
                    716:        #define   CATN    0x08  /* r/w: SCSI-ATN                    */
                    717:        #define   CMSG    0x04  /* r/w: SCSI-MSG                    */
                    718:        #define   CC_D    0x02  /* r/w: SCSI-C_D                    */
                    719:        #define   CI_O    0x01  /* r/w: SCSI-I_O                    */
                    720: 
                    721: /*0a*/  u_char    nc_ssid;
                    722: 
                    723: /*0b*/  u_char    nc_sbcl;
                    724: 
                    725: /*0c*/  u_char    nc_dstat;
                    726:         #define   DFE     0x80  /* sta: dma fifo empty              */
                    727:         #define   MDPE    0x40  /* int: master data parity error    */
                    728:         #define   BF      0x20  /* int: script: bus fault           */
                    729:         #define   ABRT    0x10  /* int: script: command aborted     */
                    730:         #define   SSI     0x08  /* int: script: single step         */
                    731:         #define   SIR     0x04  /* int: script: interrupt instruct. */
                    732:         #define   IID     0x01  /* int: script: illegal instruct.   */
                    733: 
                    734: /*0d*/  u_char    nc_sstat0;
                    735:         #define   ILF     0x80  /* sta: data in SIDL register lsb   */
                    736:         #define   ORF     0x40  /* sta: data in SODR register lsb   */
                    737:         #define   OLF     0x20  /* sta: data in SODL register lsb   */
                    738:         #define   AIP     0x10  /* sta: arbitration in progress     */
                    739:         #define   LOA     0x08  /* sta: arbitration lost            */
                    740:         #define   WOA     0x04  /* sta: arbitration won             */
                    741:         #define   IRST    0x02  /* sta: scsi reset signal           */
                    742:         #define   SDP     0x01  /* sta: scsi parity signal          */
                    743: 
                    744: /*0e*/  u_char    nc_sstat1;
                    745:        #define   FF3210  0xf0  /* sta: bytes in the scsi fifo      */
                    746: 
                    747: /*0f*/  u_char    nc_sstat2;
                    748:         #define   ILF1    0x80  /* sta: data in SIDL register msb[W]*/
                    749:         #define   ORF1    0x40  /* sta: data in SODR register msb[W]*/
                    750:         #define   OLF1    0x20  /* sta: data in SODL register msb[W]*/
                    751:         #define   DM      0x04  /* sta: DIFFSENS mismatch (895/6 only) */
                    752:         #define   LDSC    0x02  /* sta: disconnect & reconnect      */
                    753: 
                    754: /*10*/  u_int32    nc_dsa;     /* --> Base page                    */
                    755: 
                    756: /*14*/  u_char    nc_istat;    /* --> Main Command and status      */
                    757:         #define   CABRT   0x80  /* cmd: abort current operation     */
                    758:         #define   SRST    0x40  /* mod: reset chip                  */
                    759:         #define   SIGP    0x20  /* r/w: message from host to ncr    */
                    760:         #define   SEM     0x10  /* r/w: message between host + ncr  */
                    761:         #define   CON     0x08  /* sta: connected to scsi           */
                    762:         #define   INTF    0x04  /* sta: int on the fly (reset by wr)*/
                    763:         #define   SIP     0x02  /* sta: scsi-interrupt              */
                    764:         #define   DIP     0x01  /* sta: host/script interrupt       */
                    765: 
                    766: /*15*/  u_char    nc_15_;
                    767: /*16*/ u_char    nc_16_;
                    768: /*17*/  u_char    nc_17_;
                    769: 
                    770: /*18*/ u_char    nc_ctest0;
                    771: /*19*/  u_char    nc_ctest1;
                    772: 
                    773: /*1a*/  u_char    nc_ctest2;
                    774:        #define   CSIGP   0x40
                    775: 
                    776: /*1b*/  u_char    nc_ctest3;
                    777:        #define   FLF     0x08  /* cmd: flush dma fifo              */
                    778:        #define   CLF     0x04  /* cmd: clear dma fifo              */
                    779:        #define   FM      0x02  /* mod: fetch pin mode              */
                    780:        #define   WRIE    0x01  /* mod: write and invalidate enable */
                    781: 
                    782: /*1c*/  u_int32    nc_temp;    /* ### Temporary stack              */
                    783: 
                    784: /*20*/ u_char    nc_dfifo;
                    785: /*21*/  u_char    nc_ctest4;
                    786:        #define   BDIS    0x80  /* mod: burst disable               */
                    787:        #define   MPEE    0x08  /* mod: master parity error enable  */
                    788: 
                    789: /*22*/  u_char    nc_ctest5;
                    790:        #define   DFS     0x20  /* mod: dma fifo size               */
                    791: /*23*/  u_char    nc_ctest6;
                    792: 
                    793: /*24*/  u_int32    nc_dbc;     /* ### Byte count and command       */
                    794: /*28*/  u_int32    nc_dnad;    /* ### Next command register        */
                    795: /*2c*/  u_int32    nc_dsp;     /* --> Script Pointer               */
                    796: /*30*/  u_int32    nc_dsps;    /* --> Script pointer save/opcode#2 */
                    797: /*34*/  u_int32    nc_scratcha;  /* ??? Temporary register a         */
                    798: 
                    799: /*38*/  u_char    nc_dmode;
                    800:        #define   BL_2    0x80  /* mod: burst length shift value +2 */
                    801:        #define   BL_1    0x40  /* mod: burst length shift value +1 */
                    802:        #define   ERL     0x08  /* mod: enable read line            */
                    803:        #define   ERMP    0x04  /* mod: enable read multiple        */
                    804:        #define   BOF     0x02  /* mod: burst op code fetch         */
                    805: 
                    806: /*39*/  u_char    nc_dien;
                    807: /*3a*/  u_char    nc_dwt;
                    808: 
                    809: /*3b*/  u_char    nc_dcntl;    /* --> Script execution control     */
                    810: 
                    811:        #define   CLSE    0x80  /* mod: cache line size enable      */
                    812:        #define   PFF     0x40  /* cmd: pre-fetch flush             */
                    813:        #define   PFEN    0x20  /* mod: pre-fetch enable            */
                    814:        #define   SSM     0x10  /* mod: single step mode            */
                    815:        #define   IRQM    0x08  /* mod: irq mode (1 = totem pole !) */
                    816:        #define   STD     0x04  /* cmd: start dma mode              */
                    817:        #define   IRQD    0x02  /* mod: irq disable                 */
                    818:        #define   NOCOM   0x01  /* cmd: protect sfbr while reselect */
                    819: 
                    820: /*3c*/  u_int32    nc_adder;
                    821: 
                    822: /*40*/  u_short   nc_sien;     /* -->: interrupt enable            */
                    823: /*42*/  u_short   nc_sist;     /* <--: interrupt status            */
                    824:         #define   SBMC    0x1000/* sta: SCSI Bus Mode Change (895/6 only) */
                    825:         #define   STO     0x0400/* sta: timeout (select)            */
                    826:         #define   GEN     0x0200/* sta: timeout (general)           */
                    827:         #define   HTH     0x0100/* sta: timeout (handshake)         */
                    828:         #define   MA      0x80  /* sta: phase mismatch              */
                    829:         #define   CMP     0x40  /* sta: arbitration complete        */
                    830:         #define   SEL     0x20  /* sta: selected by another device  */
                    831:         #define   RSL     0x10  /* sta: reselected by another device*/
                    832:         #define   SGE     0x08  /* sta: gross error (over/underflow)*/
                    833:         #define   UDC     0x04  /* sta: unexpected disconnect       */
                    834:         #define   RST     0x02  /* sta: scsi bus reset detected     */
                    835:         #define   PAR     0x01  /* sta: scsi parity error           */
                    836: 
                    837: /*44*/  u_char    nc_slpar;
                    838: /*45*/  u_char    nc_swide;
                    839: /*46*/  u_char    nc_macntl;
                    840: /*47*/  u_char    nc_gpcntl;
                    841: /*48*/  u_char    nc_stime0;    /* cmd: timeout for select&handshake*/
                    842: /*49*/  u_char    nc_stime1;    /* cmd: timeout user defined        */
                    843: /*4a*/  u_short   nc_respid;    /* sta: Reselect-IDs                */
                    844: 
                    845: /*4c*/  u_char    nc_stest0;
                    846: 
                    847: /*4d*/  u_char    nc_stest1;
                    848:        #define   DBLEN   0x08  /* clock doubler running                */
                    849:        #define   DBLSEL  0x04  /* clock doubler selected               */
                    850:   
                    851: 
                    852: /*4e*/  u_char    nc_stest2;
                    853:        #define   ROF     0x40  /* reset scsi offset (after gross error!) */
                    854:        #define   EXT     0x02  /* extended filtering                     */
                    855: 
                    856: /*4f*/  u_char    nc_stest3;
                    857:        #define   TE     0x80   /* c: tolerAnt enable */
                    858:        #define   HSC    0x20   /* c: Halt SCSI Clock */
                    859:        #define   CSF    0x02   /* c: clear scsi fifo */
                    860: 
                    861: /*50*/  u_short   nc_sidl;     /* Lowlevel: latched from scsi data */
                    862: /*52*/  u_char    nc_stest4;
                    863:        #define   SMODE  0xc0   /* SCSI bus mode      (895/6 only) */
                    864:        #define    SMODE_HVD 0x40       /* High Voltage Differential       */
                    865:        #define    SMODE_SE  0x80       /* Single Ended                    */
                    866:        #define    SMODE_LVD 0xc0       /* Low Voltage Differential        */
                    867:        #define   LCKFRQ 0x20   /* Frequency Lock (895/6 only)     */
                    868: 
                    869: /*53*/ u_char    nc_53_;
                    870: /*54*/  u_short   nc_sodl;     /* Lowlevel: data out to scsi data  */
                    871: /*56*/  u_short   nc_56_;
                    872: /*58*/  u_short   nc_sbdl;     /* Lowlevel: data from scsi data    */
                    873: /*5a*/  u_short   nc_5a_;
                    874: /*5c*/  u_char    nc_scr0;     /* Working register B               */
                    875: /*5d*/  u_char    nc_scr1;     /*                                  */
                    876: /*5e*/  u_char    nc_scr2;     /*                                  */
                    877: /*5f*/  u_char    nc_scr3;     /*                                  */
                    878: /*60*/
                    879: };
                    880: 
                    881: /*-----------------------------------------------------------
                    882: **
                    883: **     Utility macros for the script.
                    884: **
                    885: **-----------------------------------------------------------
                    886: */
                    887: 
                    888: #define REGJ(p,r) (offsetof(struct ncr_reg, p ## r))
                    889: #define REG(r) REGJ (nc_, r)
                    890: 
                    891: #ifndef TARGET_MODE
                    892: #define TARGET_MODE 0
                    893: #endif
                    894: 
                    895: typedef u_int32 ncrcmd;
                    896: 
                    897: /*-----------------------------------------------------------
                    898: **
                    899: **     SCSI phases
                    900: **
                    901: **-----------------------------------------------------------
                    902: */
                    903: 
                    904: #define        SCR_DATA_OUT    0x00000000
                    905: #define        SCR_DATA_IN     0x01000000
                    906: #define        SCR_COMMAND     0x02000000
                    907: #define        SCR_STATUS      0x03000000
                    908: #define SCR_ILG_OUT    0x04000000
                    909: #define SCR_ILG_IN     0x05000000
                    910: #define SCR_MSG_OUT    0x06000000
                    911: #define SCR_MSG_IN      0x07000000
                    912: 
                    913: /*-----------------------------------------------------------
                    914: **
                    915: **     Data transfer via SCSI.
                    916: **
                    917: **-----------------------------------------------------------
                    918: **
                    919: **     MOVE_ABS (LEN)
                    920: **     <<start address>>
                    921: **
                    922: **     MOVE_IND (LEN)
                    923: **     <<dnad_offset>>
                    924: **
                    925: **     MOVE_TBL
                    926: **     <<dnad_offset>>
                    927: **
                    928: **-----------------------------------------------------------
                    929: */
                    930: 
                    931: #define SCR_MOVE_ABS(l) ((0x08000000 ^ (TARGET_MODE << 1ul)) | (l))
                    932: #define SCR_MOVE_IND(l) ((0x28000000 ^ (TARGET_MODE << 1ul)) | (l))
                    933: #define SCR_MOVE_TBL     (0x18000000 ^ (TARGET_MODE << 1ul))
                    934: 
                    935: struct scr_tblmove {
                    936:         u_int32  size;
                    937:         u_int32  addr;
                    938: };
                    939: 
                    940: /*-----------------------------------------------------------
                    941: **
                    942: **     Selection
                    943: **
                    944: **-----------------------------------------------------------
                    945: **
                    946: **     SEL_ABS | SCR_ID (0..7)     [ | REL_JMP]
                    947: **     <<alternate_address>>
                    948: **
                    949: **     SEL_TBL | << dnad_offset>>  [ | REL_JMP]
                    950: **     <<alternate_address>>
                    951: **
                    952: **-----------------------------------------------------------
                    953: */
                    954: 
                    955: #define        SCR_SEL_ABS     0x40000000
                    956: #define        SCR_SEL_ABS_ATN 0x41000000
                    957: #define        SCR_SEL_TBL     0x42000000
                    958: #define        SCR_SEL_TBL_ATN 0x43000000
                    959: 
                    960: struct scr_tblsel {
                    961:         u_char  sel_0;
                    962:         u_char  sel_sxfer;
                    963:         u_char  sel_id;
                    964:         u_char  sel_scntl3;
                    965: };
                    966: 
                    967: #define SCR_JMP_REL     0x04000000
                    968: #define SCR_ID(id)     (((u_int32)(id)) << 16)
                    969: 
                    970: /*-----------------------------------------------------------
                    971: **
                    972: **     Waiting for Disconnect or Reselect
                    973: **
                    974: **-----------------------------------------------------------
                    975: **
                    976: **     WAIT_DISC
                    977: **     dummy: <<alternate_address>>
                    978: **
                    979: **     WAIT_RESEL
                    980: **     <<alternate_address>>
                    981: **
                    982: **-----------------------------------------------------------
                    983: */
                    984: 
                    985: #define        SCR_WAIT_DISC   0x48000000
                    986: #define SCR_WAIT_RESEL  0x50000000
                    987: 
                    988: /*-----------------------------------------------------------
                    989: **
                    990: **     Bit Set / Reset
                    991: **
                    992: **-----------------------------------------------------------
                    993: **
                    994: **     SET (flags {|.. })
                    995: **
                    996: **     CLR (flags {|.. })
                    997: **
                    998: **-----------------------------------------------------------
                    999: */
                   1000: 
                   1001: #define SCR_SET(f)     (0x58000000 | (f))
                   1002: #define SCR_CLR(f)     (0x60000000 | (f))
                   1003: 
                   1004: #define        SCR_CARRY       0x00000400
                   1005: #define        SCR_TRG         0x00000200
                   1006: #define        SCR_ACK         0x00000040
                   1007: #define        SCR_ATN         0x00000008
                   1008: 
                   1009: 
                   1010: 
                   1011: 
                   1012: /*-----------------------------------------------------------
                   1013: **
                   1014: **     Memory to memory move
                   1015: **
                   1016: **-----------------------------------------------------------
                   1017: **
                   1018: **     COPY (bytecount)
                   1019: **     << source_address >>
                   1020: **     << destination_address >>
                   1021: **
                   1022: **     SCR_COPY   sets the NO FLUSH option by default.
                   1023: **     SCR_COPY_F does not set this option.
                   1024: **
                   1025: **     For chips which do not support this option,
                   1026: **     ncr_copy_and_bind() will remove this bit.
                   1027: **-----------------------------------------------------------
                   1028: */
                   1029: 
                   1030: #define SCR_NO_FLUSH 0x01000000
                   1031: 
                   1032: #define SCR_COPY(n) (0xc0000000 | SCR_NO_FLUSH | (n))
                   1033: #define SCR_COPY_F(n) (0xc0000000 | (n))
                   1034: 
                   1035: /*-----------------------------------------------------------
                   1036: **
                   1037: **     Register move and binary operations
                   1038: **
                   1039: **-----------------------------------------------------------
                   1040: **
                   1041: **     SFBR_REG (reg, op, data)        reg  = SFBR op data
                   1042: **     << 0 >>
                   1043: **
                   1044: **     REG_SFBR (reg, op, data)        SFBR = reg op data
                   1045: **     << 0 >>
                   1046: **
                   1047: **     REG_REG  (reg, op, data)        reg  = reg op data
                   1048: **     << 0 >>
                   1049: **
                   1050: **-----------------------------------------------------------
                   1051: */
                   1052: 
                   1053: #define SCR_REG_OFS(ofs) ((ofs) << 16ul)
                   1054: 
                   1055: #define SCR_SFBR_REG(reg,op,data) \
                   1056:         (0x68000000 | (SCR_REG_OFS(REG(reg))) | (op) | ((data)<<8ul))
                   1057: 
                   1058: #define SCR_REG_SFBR(reg,op,data) \
                   1059:         (0x70000000 | (SCR_REG_OFS(REG(reg))) | (op) | ((data)<<8ul))
                   1060: 
                   1061: #define SCR_REG_REG(reg,op,data) \
                   1062:         (0x78000000 | (SCR_REG_OFS(REG(reg))) | (op) | ((data)<<8ul))
                   1063: 
                   1064: 
                   1065: #define      SCR_LOAD   0x00000000
                   1066: #define      SCR_SHL    0x01000000
                   1067: #define      SCR_OR     0x02000000
                   1068: #define      SCR_XOR    0x03000000
                   1069: #define      SCR_AND    0x04000000
                   1070: #define      SCR_SHR    0x05000000
                   1071: #define      SCR_ADD    0x06000000
                   1072: #define      SCR_ADDC   0x07000000
                   1073: 
                   1074: /*-----------------------------------------------------------
                   1075: **
                   1076: **     FROM_REG (reg)            reg  = SFBR
                   1077: **     << 0 >>
                   1078: **
                   1079: **     TO_REG   (reg)            SFBR = reg
                   1080: **     << 0 >>
                   1081: **
                   1082: **     LOAD_REG (reg, data)      reg  = <data>
                   1083: **     << 0 >>
                   1084: **
                   1085: **     LOAD_SFBR(data)           SFBR = <data>
                   1086: **     << 0 >>
                   1087: **
                   1088: **-----------------------------------------------------------
                   1089: */
                   1090: 
                   1091: #define        SCR_FROM_REG(reg) \
                   1092:        SCR_REG_SFBR(reg,SCR_OR,0)
                   1093: 
                   1094: #define        SCR_TO_REG(reg) \
                   1095:        SCR_SFBR_REG(reg,SCR_OR,0)
                   1096: 
                   1097: #define        SCR_LOAD_REG(reg,data) \
                   1098:        SCR_REG_REG(reg,SCR_LOAD,data)
                   1099: 
                   1100: #define SCR_LOAD_SFBR(data) \
                   1101:         (SCR_REG_SFBR (gpreg, SCR_LOAD, data))
                   1102: 
                   1103: /*-----------------------------------------------------------
                   1104: **
                   1105: **     Waiting for Disconnect or Reselect
                   1106: **
                   1107: **-----------------------------------------------------------
                   1108: **
                   1109: **     JUMP            [ | IFTRUE/IFFALSE ( ... ) ]
                   1110: **     <<address>>
                   1111: **
                   1112: **     JUMPR           [ | IFTRUE/IFFALSE ( ... ) ]
                   1113: **     <<distance>>
                   1114: **
                   1115: **     CALL            [ | IFTRUE/IFFALSE ( ... ) ]
                   1116: **     <<address>>
                   1117: **
                   1118: **     CALLR           [ | IFTRUE/IFFALSE ( ... ) ]
                   1119: **     <<distance>>
                   1120: **
                   1121: **     RETURN          [ | IFTRUE/IFFALSE ( ... ) ]
                   1122: **     <<dummy>>
                   1123: **
                   1124: **     INT             [ | IFTRUE/IFFALSE ( ... ) ]
                   1125: **     <<ident>>
                   1126: **
                   1127: **     INT_FLY         [ | IFTRUE/IFFALSE ( ... ) ]
                   1128: **     <<ident>>
                   1129: **
                   1130: **     Conditions:
                   1131: **          WHEN (phase)
                   1132: **          IF   (phase)
                   1133: **          CARRY
                   1134: **          DATA (data, mask)
                   1135: **
                   1136: **-----------------------------------------------------------
                   1137: */
                   1138: 
                   1139: #define SCR_NO_OP        0x80000000
                   1140: #define SCR_JUMP        0x80080000
                   1141: #define SCR_JUMPR       0x80880000
                   1142: #define SCR_CALL        0x88080000
                   1143: #define SCR_CALLR       0x88880000
                   1144: #define SCR_RETURN      0x90080000
                   1145: #define SCR_INT         0x98080000
                   1146: #define SCR_INT_FLY     0x98180000
                   1147: 
                   1148: #define IFFALSE(arg)   (0x00080000 | (arg))
                   1149: #define IFTRUE(arg)    (0x00000000 | (arg))
                   1150: 
                   1151: #define WHEN(phase)    (0x00030000 | (phase))
                   1152: #define IF(phase)      (0x00020000 | (phase))
                   1153: 
                   1154: #define DATA(D)        (0x00040000 | ((D) & 0xff))
                   1155: #define MASK(D,M)      (0x00040000 | (((M ^ 0xff) & 0xff) << 8ul)|((D) & 0xff))
                   1156: 
                   1157: #define CARRYSET       (0x00200000)
                   1158: 
                   1159: /*-----------------------------------------------------------
                   1160: **
                   1161: **     SCSI  constants.
                   1162: **
                   1163: **-----------------------------------------------------------
                   1164: */
                   1165: 
                   1166: /*
                   1167: **     Messages
                   1168: */
                   1169: 
                   1170: #define        M_COMPLETE      (0x00)
                   1171: #define        M_EXTENDED      (0x01)
                   1172: #define        M_SAVE_DP       (0x02)
                   1173: #define        M_RESTORE_DP    (0x03)
                   1174: #define        M_DISCONNECT    (0x04)
                   1175: #define        M_ID_ERROR      (0x05)
                   1176: #define        M_ABORT         (0x06)
                   1177: #define        M_REJECT        (0x07)
                   1178: #define        M_NOOP          (0x08)
                   1179: #define        M_PARITY        (0x09)
                   1180: #define        M_LCOMPLETE     (0x0a)
                   1181: #define        M_FCOMPLETE     (0x0b)
                   1182: #define        M_RESET         (0x0c)
                   1183: #define        M_ABORT_TAG     (0x0d)
                   1184: #define        M_CLEAR_QUEUE   (0x0e)
                   1185: #define        M_INIT_REC      (0x0f)
                   1186: #define        M_REL_REC       (0x10)
                   1187: #define        M_TERMINATE     (0x11)
                   1188: #define        M_SIMPLE_TAG    (0x20)
                   1189: #define        M_HEAD_TAG      (0x21)
                   1190: #define        M_ORDERED_TAG   (0x22)
                   1191: #define        M_IGN_RESIDUE   (0x23)
                   1192: #define        M_IDENTIFY      (0x80)
                   1193: 
                   1194: #define        M_X_MODIFY_DP   (0x00)
                   1195: #define        M_X_SYNC_REQ    (0x01)
                   1196: #define        M_X_WIDE_REQ    (0x03)
                   1197: 
                   1198: /*
                   1199: **     Status
                   1200: */
                   1201: 
                   1202: #define        S_GOOD          (0x00)
                   1203: #define        S_CHECK_COND    (0x02)
                   1204: #define        S_COND_MET      (0x04)
                   1205: #define        S_BUSY          (0x08)
                   1206: #define        S_INT           (0x10)
                   1207: #define        S_INT_COND_MET  (0x14)
                   1208: #define        S_CONFLICT      (0x18)
                   1209: #define        S_TERMINATED    (0x20)
                   1210: #define        S_QUEUE_FULL    (0x28)
                   1211: #define        S_ILLEGAL       (0xff)
                   1212: #define        S_SENSE         (0x80)
                   1213: 
                   1214: /*
                   1215:  * End of ncrreg from FreeBSD
                   1216:  */
                   1217: 
                   1218: #endif /* !defined HOSTS_C */
                   1219: 
                   1220: #endif /* defined NCR53C8XX_H */

unix.superglobalmegacorp.com

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