[BACK]Return to aic7xxxvar.h CVS log [TXT][DIR] Up to [local] / sys / dev / ic

Annotation of sys/dev/ic/aic7xxxvar.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: aic7xxxvar.h,v 1.24 2007/08/04 14:37:34 krw Exp $     */
        !             2: /*
        !             3:  * Core definitions and data structures shareable across OS platforms.
        !             4:  *
        !             5:  * Copyright (c) 1994-2001 Justin T. Gibbs.
        !             6:  * Copyright (c) 2000-2001 Adaptec Inc.
        !             7:  * All rights reserved.
        !             8:  *
        !             9:  * Redistribution and use in source and binary forms, with or without
        !            10:  * modification, are permitted provided that the following conditions
        !            11:  * are met:
        !            12:  * 1. Redistributions of source code must retain the above copyright
        !            13:  *    notice, this list of conditions, and the following disclaimer,
        !            14:  *    without modification.
        !            15:  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
        !            16:  *    substantially similar to the "NO WARRANTY" disclaimer below
        !            17:  *    ("Disclaimer") and any redistribution must be conditioned upon
        !            18:  *    including a substantially similar Disclaimer requirement for further
        !            19:  *    binary redistribution.
        !            20:  * 3. Neither the names of the above-listed copyright holders nor the names
        !            21:  *    of any contributors may be used to endorse or promote products derived
        !            22:  *    from this software without specific prior written permission.
        !            23:  *
        !            24:  * Alternatively, this software may be distributed under the terms of the
        !            25:  * GNU General Public License ("GPL") version 2 as published by the Free
        !            26:  * Software Foundation.
        !            27:  *
        !            28:  * NO WARRANTY
        !            29:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        !            30:  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        !            31:  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
        !            32:  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
        !            33:  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            34:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            35:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            36:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
        !            37:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
        !            38:  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            39:  * POSSIBILITY OF SUCH DAMAGES.
        !            40:  *
        !            41:  * $Id: aic7xxxvar.h,v 1.24 2007/08/04 14:37:34 krw Exp $
        !            42:  *
        !            43:  * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx.h,v 1.50 2003/12/17 00:02:09 gibbs Exp $
        !            44:  */
        !            45: /*
        !            46:  * Ported from FreeBSD by Pascal Renauld, Network Storage Solutions, Inc. - April 2003
        !            47:  */
        !            48:
        !            49: #ifndef _AIC7XXXVAR_H_
        !            50: #define _AIC7XXXVAR_H_
        !            51:
        !            52: #undef AHC_DEBUG
        !            53:
        !            54: /* Register Definitions */
        !            55: #include <dev/microcode/aic7xxx/aic7xxx_reg.h>
        !            56:
        !            57: #include <dev/ic/aic7xxx_cam.h>
        !            58: /************************* Forward Declarations *******************************/
        !            59: struct ahc_platform_data;
        !            60: struct scb_platform_data;
        !            61: struct seeprom_descriptor;
        !            62:
        !            63: /****************************** Useful Macros *********************************/
        !            64: #ifndef MAX
        !            65: #define MAX(a,b) (((a) > (b)) ? (a) : (b))
        !            66: #endif
        !            67:
        !            68: #ifndef MIN
        !            69: #define MIN(a,b) (((a) < (b)) ? (a) : (b))
        !            70: #endif
        !            71:
        !            72: #ifndef TRUE
        !            73: #define TRUE 1
        !            74: #endif
        !            75: #ifndef FALSE
        !            76: #define FALSE 0
        !            77: #endif
        !            78:
        !            79: #define NUM_ELEMENTS(array) (sizeof(array) / sizeof(*array))
        !            80:
        !            81: #define ALL_CHANNELS '\0'
        !            82: #define ALL_TARGETS_MASK 0xFFFF
        !            83: #define INITIATOR_WILDCARD     (~0)
        !            84:
        !            85: #define SCSIID_TARGET(ahc, scsiid) \
        !            86:        (((scsiid) & ((((ahc)->features & AHC_TWIN) != 0) ? TWIN_TID : TID)) \
        !            87:        >> TID_SHIFT)
        !            88: #define SCSIID_OUR_ID(scsiid) \
        !            89:        ((scsiid) & OID)
        !            90: #define SCSIID_CHANNEL(ahc, scsiid) \
        !            91:        ((((ahc)->features & AHC_TWIN) != 0) \
        !            92:         ? ((((scsiid) & TWIN_CHNLB) != 0) ? 'B' : 'A') \
        !            93:        : 'A')
        !            94: #define        SCB_IS_SCSIBUS_B(ahc, scb) \
        !            95:        (SCSIID_CHANNEL(ahc, (scb)->hscb->scsiid) == 'B')
        !            96: #define        SCB_GET_OUR_ID(scb) \
        !            97:        SCSIID_OUR_ID((scb)->hscb->scsiid)
        !            98: #define        SCB_GET_TARGET(ahc, scb) \
        !            99:        SCSIID_TARGET((ahc), (scb)->hscb->scsiid)
        !           100: #define        SCB_GET_CHANNEL(ahc, scb) \
        !           101:        SCSIID_CHANNEL(ahc, (scb)->hscb->scsiid)
        !           102: #define        SCB_GET_LUN(scb) \
        !           103:        ((scb)->hscb->lun & LID)
        !           104: #define SCB_GET_TARGET_OFFSET(ahc, scb)        \
        !           105:        (SCB_GET_TARGET(ahc, scb))
        !           106: #define SCB_GET_TARGET_MASK(ahc, scb) \
        !           107:        (0x01 << (SCB_GET_TARGET_OFFSET(ahc, scb)))
        !           108: #ifdef AHC_DEBUG
        !           109: #define SCB_IS_SILENT(scb)                                     \
        !           110:        ((ahc_debug & AHC_SHOW_MASKED_ERRORS) == 0              \
        !           111:       && (((scb)->flags & SCB_SILENT) != 0))
        !           112: #else
        !           113: #define SCB_IS_SILENT(scb)                                     \
        !           114:        (((scb)->flags & SCB_SILENT) != 0)
        !           115: #endif
        !           116: #define TCL_TARGET_OFFSET(tcl) \
        !           117:        ((((tcl) >> 4) & TID) >> 4)
        !           118: #define TCL_LUN(tcl) \
        !           119:        (tcl & (AHC_NUM_LUNS - 1))
        !           120: #define BUILD_TCL(scsiid, lun) \
        !           121:        ((lun) | (((scsiid) & TID) << 4))
        !           122:
        !           123: #ifndef        AHC_TARGET_MODE
        !           124: #undef AHC_TMODE_ENABLE
        !           125: #define        AHC_TMODE_ENABLE 0
        !           126: #endif
        !           127:
        !           128: /**************************** Driver Constants ********************************/
        !           129: /*
        !           130:  * The maximum number of supported targets.
        !           131:  */
        !           132: #define AHC_NUM_TARGETS 16
        !           133:
        !           134: /*
        !           135:  * The maximum number of supported luns.
        !           136:  * The identify message only supports 64 luns in SPI3.
        !           137:  * You can have 2^64 luns when information unit transfers are enabled,
        !           138:  * but it is doubtful this driver will ever support IUTs.
        !           139:  */
        !           140: #define AHC_NUM_LUNS 64
        !           141:
        !           142: /*
        !           143:  * The maximum transfer per S/G segment.
        !           144:  * Limited by MAXPHYS or a 24-bit counter.
        !           145:  */
        !           146: #define AHC_MAXTRANSFER_SIZE    MIN(MAXPHYS,0x00ffffff)
        !           147:
        !           148: /*
        !           149:  * The maximum amount of SCB storage in hardware on a controller.
        !           150:  * This value represents an upper bound.  Controllers vary in the number
        !           151:  * they actually support.
        !           152:  */
        !           153: #define AHC_SCB_MAX    255
        !           154:
        !           155: /*
        !           156:  * The maximum number of concurrent transactions supported per driver instance.
        !           157:  * Sequencer Control Blocks (SCBs) store per-transaction information.  Although
        !           158:  * the space for SCBs on the host adapter varies by model, the driver will
        !           159:  * page the SCBs between host and controller memory as needed.  We are limited
        !           160:  * to 253 because:
        !           161:  *     1) The 8bit nature of the RISC engine holds us to an 8bit value.
        !           162:  *     2) We reserve one value, 255, to represent the invalid element.
        !           163:  *     3) Our input queue scheme requires one SCB to always be reserved
        !           164:  *        in advance of queuing any SCBs.  This takes us down to 254.
        !           165:  *     4) To handle our output queue correctly on machines that only
        !           166:  *        support 32bit stores, we must clear the array 4 bytes at a
        !           167:  *        time.  To avoid colliding with a DMA write from the sequencer,
        !           168:  *        we must be sure that 4 slots are empty when we write to clear
        !           169:  *        the queue.  This reduces us to 253 SCBs: 1 that just completed
        !           170:  *        and the known three additional empty slots in the queue that
        !           171:  *        precede it.
        !           172:  */
        !           173: #define AHC_MAX_QUEUE  253
        !           174:
        !           175: /*
        !           176:  * The maximum amount of SCB storage we allocate in host memory.  This
        !           177:  * number should reflect the 1 additional SCB we require to handle our
        !           178:  * qinfifo mechanism.
        !           179:  */
        !           180: #define AHC_SCB_MAX_ALLOC (AHC_MAX_QUEUE+1)
        !           181:
        !           182: /*
        !           183:  * Ring Buffer of incoming target commands.
        !           184:  * We allocate 256 to simplify the logic in the sequencer
        !           185:  * by using the natural wrap point of an 8bit counter.
        !           186:  */
        !           187: #define AHC_TMODE_CMDS 256
        !           188:
        !           189: /* Reset line assertion time in us */
        !           190: #define AHC_BUSRESET_DELAY     25
        !           191:
        !           192: /******************* Chip Characteristics/Operating Settings  *****************/
        !           193: /*
        !           194:  * Chip Type
        !           195:  * The chip order is from least sophisticated to most sophisticated.
        !           196:  */
        !           197: typedef enum {
        !           198:        AHC_NONE        = 0x0000,
        !           199:        AHC_CHIPID_MASK = 0x00FF,
        !           200:        AHC_AIC7770     = 0x0001,
        !           201:        AHC_AIC7850     = 0x0002,
        !           202:        AHC_AIC7855     = 0x0003,
        !           203:        AHC_AIC7859     = 0x0004,
        !           204:        AHC_AIC7860     = 0x0005,
        !           205:        AHC_AIC7870     = 0x0006,
        !           206:        AHC_AIC7880     = 0x0007,
        !           207:        AHC_AIC7895     = 0x0008,
        !           208:        AHC_AIC7895C    = 0x0009,
        !           209:        AHC_AIC7890     = 0x000a,
        !           210:        AHC_AIC7896     = 0x000b,
        !           211:        AHC_AIC7892     = 0x000c,
        !           212:        AHC_AIC7899     = 0x000d,
        !           213:        AHC_VL          = 0x0100,       /* Bus type VL */
        !           214:        AHC_EISA        = 0x0200,       /* Bus type EISA */
        !           215:        AHC_PCI         = 0x0400,       /* Bus type PCI */
        !           216:        AHC_BUS_MASK    = 0x0F00
        !           217: } ahc_chip;
        !           218:
        !           219: /*
        !           220:  * Features available in each chip type.
        !           221:  */
        !           222: typedef enum {
        !           223:        AHC_FENONE      = 0x00000,
        !           224:        AHC_ULTRA       = 0x00001,      /* Supports 20MHz Transfers */
        !           225:        AHC_ULTRA2      = 0x00002,      /* Supports 40MHz Transfers */
        !           226:        AHC_WIDE        = 0x00004,      /* Wide Channel */
        !           227:        AHC_TWIN        = 0x00008,      /* Twin Channel */
        !           228:        AHC_MORE_SRAM   = 0x00010,      /* 80 bytes instead of 64 */
        !           229:        AHC_CMD_CHAN    = 0x00020,      /* Has a Command DMA Channel */
        !           230:        AHC_QUEUE_REGS  = 0x00040,      /* Has Queue management registers */
        !           231:        AHC_SG_PRELOAD  = 0x00080,      /* Can perform auto-SG preload */
        !           232:        AHC_SPIOCAP     = 0x00100,      /* Has a Serial Port I/O Cap Register */
        !           233:        AHC_MULTI_TID   = 0x00200,      /* Has bitmask of TIDs for select-in */
        !           234:        AHC_HS_MAILBOX  = 0x00400,      /* Has HS_MAILBOX register */
        !           235:        AHC_DT          = 0x00800,      /* Double Transition transfers */
        !           236:        AHC_NEW_TERMCTL = 0x01000,      /* Newer termination scheme */
        !           237:        AHC_MULTI_FUNC  = 0x02000,      /* Multi-Function Twin Channel Device */
        !           238:        AHC_LARGE_SCBS  = 0x04000,      /* 64byte SCBs */
        !           239:        AHC_AUTORATE    = 0x08000,      /* Automatic update of SCSIRATE/OFFSET*/
        !           240:        AHC_AUTOPAUSE   = 0x10000,      /* Automatic pause on register access */
        !           241:        AHC_TARGETMODE  = 0x20000,      /* Has tested target mode support */
        !           242:        AHC_MULTIROLE   = 0x40000,      /* Space for two roles at a time */
        !           243:        AHC_REMOVABLE   = 0x80000,      /* Hot-Swap supported */
        !           244:        AHC_AIC7770_FE  = AHC_FENONE,
        !           245:        /*
        !           246:         * The real 7850 does not support Ultra modes, but there are
        !           247:         * several cards that use the generic 7850 PCI ID even though
        !           248:         * they are using an Ultra capable chip (7859/7860).  We start
        !           249:         * out with the AHC_ULTRA feature set and then check the DEVSTATUS
        !           250:         * register to determine if the capability is really present.
        !           251:         */
        !           252:        AHC_AIC7850_FE  = AHC_SPIOCAP|AHC_AUTOPAUSE|AHC_TARGETMODE|AHC_ULTRA,
        !           253:        AHC_AIC7860_FE  = AHC_AIC7850_FE,
        !           254:        AHC_AIC7870_FE  = AHC_TARGETMODE|AHC_AUTOPAUSE,
        !           255:        AHC_AIC7880_FE  = AHC_AIC7870_FE|AHC_ULTRA,
        !           256:        /*
        !           257:         * Although we have space for both the initiator and
        !           258:         * target roles on ULTRA2 chips, we currently disable
        !           259:         * the initiator role to allow multi-scsi-id target mode
        !           260:         * configurations.  We can only respond on the same SCSI
        !           261:         * ID as our initiator role if we allow initiator operation.
        !           262:         * At some point, we should add a configuration knob to
        !           263:         * allow both roles to be loaded.
        !           264:         */
        !           265:        AHC_AIC7890_FE  = AHC_MORE_SRAM|AHC_CMD_CHAN|AHC_ULTRA2
        !           266:                          |AHC_QUEUE_REGS|AHC_SG_PRELOAD|AHC_MULTI_TID
        !           267:                          |AHC_HS_MAILBOX|AHC_NEW_TERMCTL|AHC_LARGE_SCBS
        !           268:                          |AHC_TARGETMODE,
        !           269:        AHC_AIC7892_FE  = AHC_AIC7890_FE|AHC_DT|AHC_AUTORATE|AHC_AUTOPAUSE,
        !           270:        AHC_AIC7895_FE  = AHC_AIC7880_FE|AHC_MORE_SRAM|AHC_AUTOPAUSE
        !           271:                          |AHC_CMD_CHAN|AHC_MULTI_FUNC|AHC_LARGE_SCBS,
        !           272:        AHC_AIC7895C_FE = AHC_AIC7895_FE|AHC_MULTI_TID,
        !           273:        AHC_AIC7896_FE  = AHC_AIC7890_FE|AHC_MULTI_FUNC,
        !           274:        AHC_AIC7899_FE  = AHC_AIC7892_FE|AHC_MULTI_FUNC
        !           275: } ahc_feature;
        !           276:
        !           277: /*
        !           278:  * Bugs in the silicon that we work around in software.
        !           279:  */
        !           280: typedef enum {
        !           281:        AHC_BUGNONE             = 0x00,
        !           282:        /*
        !           283:         * On all chips prior to the U2 product line,
        !           284:         * the WIDEODD S/G segment feature does not
        !           285:         * work during scsi->HostBus transfers.
        !           286:         */
        !           287:        AHC_TMODE_WIDEODD_BUG   = 0x01,
        !           288:        /*
        !           289:         * On the aic7890/91 Rev 0 chips, the autoflush
        !           290:         * feature does not work.  A manual flush of
        !           291:         * the DMA FIFO is required.
        !           292:         */
        !           293:        AHC_AUTOFLUSH_BUG       = 0x02,
        !           294:        /*
        !           295:         * On many chips, cacheline streaming does not work.
        !           296:         */
        !           297:        AHC_CACHETHEN_BUG       = 0x04,
        !           298:        /*
        !           299:         * On the aic7896/97 chips, cacheline
        !           300:         * streaming must be enabled.
        !           301:         */
        !           302:        AHC_CACHETHEN_DIS_BUG   = 0x08,
        !           303:        /*
        !           304:         * PCI 2.1 Retry failure on non-empty data fifo.
        !           305:         */
        !           306:        AHC_PCI_2_1_RETRY_BUG   = 0x10,
        !           307:        /*
        !           308:         * Controller does not handle cacheline residuals
        !           309:         * properly on S/G segments if PCI MWI instructions
        !           310:         * are allowed.
        !           311:         */
        !           312:        AHC_PCI_MWI_BUG         = 0x20,
        !           313:        /*
        !           314:         * An SCB upload using the SCB channel's
        !           315:         * auto array entry copy feature may
        !           316:         * corrupt data.  This appears to only
        !           317:         * occur on 66MHz systems.
        !           318:         */
        !           319:        AHC_SCBCHAN_UPLOAD_BUG  = 0x40
        !           320: } ahc_bug;
        !           321:
        !           322: /*
        !           323:  * Configuration specific settings.
        !           324:  * The driver determines these settings by probing the
        !           325:  * chip/controller's configuration.
        !           326:  */
        !           327: typedef enum {
        !           328:        AHC_FNONE             = 0x000,
        !           329:        AHC_PRIMARY_CHANNEL   = 0x003,  /*
        !           330:                                         * The channel that should
        !           331:                                         * be probed first.
        !           332:                                         */
        !           333:        AHC_USEDEFAULTS       = 0x004,  /*
        !           334:                                         * For cards without an seeprom
        !           335:                                         * or a BIOS to initialize the chip's
        !           336:                                         * SRAM, we use the default target
        !           337:                                         * settings.
        !           338:                                         */
        !           339:        AHC_SEQUENCER_DEBUG   = 0x008,
        !           340:        AHC_SHARED_SRAM       = 0x010,
        !           341:        AHC_LARGE_SEEPROM     = 0x020,  /* Uses C56_66 not C46 */
        !           342:        AHC_RESET_BUS_A       = 0x040,
        !           343:        AHC_RESET_BUS_B       = 0x080,
        !           344:        AHC_EXTENDED_TRANS_A  = 0x100,
        !           345:        AHC_EXTENDED_TRANS_B  = 0x200,
        !           346:        AHC_TERM_ENB_A        = 0x400,
        !           347:        AHC_TERM_ENB_B        = 0x800,
        !           348:        AHC_INITIATORROLE     = 0x1000,  /*
        !           349:                                          * Allow initiator operations on
        !           350:                                          * this controller.
        !           351:                                          */
        !           352:        AHC_TARGETROLE        = 0x2000,  /*
        !           353:                                          * Allow target operations on this
        !           354:                                          * controller.
        !           355:                                          */
        !           356:        AHC_NEWEEPROM_FMT     = 0x4000,
        !           357:        AHC_RESOURCE_SHORTAGE = 0x8000,
        !           358:        AHC_TQINFIFO_BLOCKED  = 0x10000,  /* Blocked waiting for ATIOs */
        !           359:        AHC_INT50_SPEEDFLEX   = 0x20000,  /*
        !           360:                                           * Internal 50pin connector
        !           361:                                           * sits behind an aic3860
        !           362:                                           */
        !           363:        AHC_SCB_BTT           = 0x40000,  /*
        !           364:                                           * The busy targets table is
        !           365:                                           * stored in SCB space rather
        !           366:                                           * than SRAM.
        !           367:                                           */
        !           368:        AHC_BIOS_ENABLED      = 0x80000,
        !           369:        AHC_ALL_INTERRUPTS    = 0x100000,
        !           370:        AHC_PAGESCBS          = 0x400000,  /* Enable SCB paging */
        !           371:        AHC_EDGE_INTERRUPT    = 0x800000,  /* Device uses edge triggered ints */
        !           372:        AHC_39BIT_ADDRESSING  = 0x1000000, /* Use 39 bit addressing scheme. */
        !           373:        AHC_LSCBS_ENABLED     = 0x2000000, /* 64Byte SCBs enabled */
        !           374:        AHC_SCB_CONFIG_USED   = 0x4000000, /* No SEEPROM but SCB2 had info. */
        !           375:        AHC_NO_BIOS_INIT      = 0x8000000, /* No BIOS left over settings. */
        !           376:        AHC_DISABLE_PCI_PERR  = 0x10000000,
        !           377:        AHC_HAS_TERM_LOGIC    = 0x20000000,
        !           378:        AHC_SHUTDOWN_RECOVERY = 0x40000000 /* Terminate recovery thread. */
        !           379: } ahc_flag;
        !           380:
        !           381: /************************* Hardware  SCB Definition ***************************/
        !           382:
        !           383: /*
        !           384:  * The driver keeps up to MAX_SCB scb structures per card in memory.  The SCB
        !           385:  * consists of a "hardware SCB" mirroring the fields available on the card
        !           386:  * and additional information the kernel stores for each transaction.
        !           387:  *
        !           388:  * To minimize space utilization, a portion of the hardware scb stores
        !           389:  * different data during different portions of a SCSI transaction.
        !           390:  * As initialized by the host driver for the initiator role, this area
        !           391:  * contains the SCSI cdb (or a pointer to the  cdb) to be executed.  After
        !           392:  * the cdb has been presented to the target, this area serves to store
        !           393:  * residual transfer information and the SCSI status byte.
        !           394:  * For the target role, the contents of this area do not change, but
        !           395:  * still serve a different purpose than for the initiator role.  See
        !           396:  * struct target_data for details.
        !           397:  */
        !           398:
        !           399: /*
        !           400:  * Status information embedded in the shared portion of
        !           401:  * an SCB after passing the cdb to the target.  The kernel
        !           402:  * driver will only read this data for transactions that
        !           403:  * complete abnormally (non-zero status byte).
        !           404:  */
        !           405: struct status_pkt {
        !           406:        uint32_t residual_datacnt;      /* Residual in the current S/G seg */
        !           407:        uint32_t residual_sg_ptr;       /* The next S/G for this transfer */
        !           408:        uint8_t  scsi_status;           /* Standard SCSI status byte */
        !           409: };
        !           410:
        !           411: /*
        !           412:  * Target mode version of the shared data SCB segment.
        !           413:  */
        !           414: struct target_data {
        !           415:        uint32_t residual_datacnt;      /* Residual in the current S/G seg */
        !           416:        uint32_t residual_sg_ptr;       /* The next S/G for this transfer */
        !           417:        uint8_t  scsi_status;           /* SCSI status to give to initiator */
        !           418:        uint8_t  target_phases;         /* Bitmap of phases to execute */
        !           419:        uint8_t  data_phase;            /* Data-In or Data-Out */
        !           420:        uint8_t  initiator_tag;         /* Initiator's transaction tag */
        !           421: };
        !           422:
        !           423: struct hardware_scb {
        !           424: /*0*/  union {
        !           425:                /*
        !           426:                 * If the cdb is 12 bytes or less, we embed it directly
        !           427:                 * in the SCB.  For longer cdbs, we embed the address
        !           428:                 * of the cdb payload as seen by the chip and a DMA
        !           429:                 * is used to pull it in.
        !           430:                 */
        !           431:                uint8_t  cdb[12];
        !           432:                uint32_t cdb_ptr;
        !           433:                struct   status_pkt status;
        !           434:                struct   target_data tdata;
        !           435:        } shared_data;
        !           436: /*
        !           437:  * A word about residuals.
        !           438:  * The scb is presented to the sequencer with the dataptr and datacnt
        !           439:  * fields initialized to the contents of the first S/G element to
        !           440:  * transfer.  The sgptr field is initialized to the bus address for
        !           441:  * the S/G element that follows the first in the in core S/G array
        !           442:  * or'ed with the SG_FULL_RESID flag.  Sgptr may point to an invalid
        !           443:  * S/G entry for this transfer (single S/G element transfer with the
        !           444:  * first elements address and length preloaded in the dataptr/datacnt
        !           445:  * fields).  If no transfer is to occur, sgptr is set to SG_LIST_NULL.
        !           446:  * The SG_FULL_RESID flag ensures that the residual will be correctly
        !           447:  * noted even if no data transfers occur.  Once the data phase is entered,
        !           448:  * the residual sgptr and datacnt are loaded from the sgptr and the
        !           449:  * datacnt fields.  After each S/G element's dataptr and length are
        !           450:  * loaded into the hardware, the residual sgptr is advanced.  After
        !           451:  * each S/G element is expired, its datacnt field is checked to see
        !           452:  * if the LAST_SEG flag is set.  If so, SG_LIST_NULL is set in the
        !           453:  * residual sg ptr and the transfer is considered complete.  If the
        !           454:  * sequencer determines that there is a residual in the transfer, it
        !           455:  * will set the SG_RESID_VALID flag in sgptr and DMA the scb back into
        !           456:  * host memory.  To summarize:
        !           457:  *
        !           458:  * Sequencer:
        !           459:  *     o A residual has occurred if SG_FULL_RESID is set in sgptr,
        !           460:  *       or residual_sgptr does not have SG_LIST_NULL set.
        !           461:  *
        !           462:  *     o We are transfering the last segment if residual_datacnt has
        !           463:  *       the SG_LAST_SEG flag set.
        !           464:  *
        !           465:  * Host:
        !           466:  *     o A residual has occurred if a completed scb has the
        !           467:  *       SG_RESID_VALID flag set.
        !           468:  *
        !           469:  *     o residual_sgptr and sgptr refer to the "next" sg entry
        !           470:  *       and so may point beyond the last valid sg entry for the
        !           471:  *       transfer.
        !           472:  */
        !           473: /*12*/ uint32_t dataptr;
        !           474: /*16*/ uint32_t datacnt;               /*
        !           475:                                         * Byte 3 (numbered from 0) of
        !           476:                                         * the datacnt is really the
        !           477:                                         * 4th byte in that data address.
        !           478:                                         */
        !           479: /*20*/ uint32_t sgptr;
        !           480: #define SG_PTR_MASK    0xFFFFFFF8
        !           481: /*24*/ uint8_t  control;       /* See SCB_CONTROL in aic7xxx.reg for details */
        !           482: /*25*/ uint8_t  scsiid;        /* what to load in the SCSIID register */
        !           483: /*26*/ uint8_t  lun;
        !           484: /*27*/ uint8_t  tag;                   /*
        !           485:                                         * Index into our kernel SCB array.
        !           486:                                         * Also used as the tag for tagged I/O
        !           487:                                         */
        !           488: /*28*/ uint8_t  cdb_len;
        !           489: /*29*/ uint8_t  scsirate;              /* Value for SCSIRATE register */
        !           490: /*30*/ uint8_t  scsioffset;            /* Value for SCSIOFFSET register */
        !           491: /*31*/ uint8_t  next;                  /*
        !           492:                                         * Used for threading SCBs in the
        !           493:                                         * "Waiting for Selection" and
        !           494:                                         * "Disconnected SCB" lists down
        !           495:                                         * in the sequencer.
        !           496:                                         */
        !           497: /*32*/ uint8_t  cdb32[32];             /*
        !           498:                                         * CDB storage for cdbs of size
        !           499:                                         * 13->32.  We store them here
        !           500:                                         * because hardware scbs are
        !           501:                                         * allocated from DMA safe
        !           502:                                         * memory so we are guaranteed
        !           503:                                         * the controller can access
        !           504:                                         * this data.
        !           505:                                         */
        !           506: };
        !           507:
        !           508: /************************ Kernel SCB Definitions ******************************/
        !           509: /*
        !           510:  * Some fields of the SCB are OS dependent.  Here we collect the
        !           511:  * definitions for elements that all OS platforms need to include
        !           512:  * in there SCB definition.
        !           513:  */
        !           514:
        !           515: /*
        !           516:  * Definition of a scatter/gather element as transferred to the controller.
        !           517:  * The aic7xxx chips only support a 24bit length.  We use the top byte of
        !           518:  * the length to store additional address bits and a flag to indicate
        !           519:  * that a given segment terminates the transfer.  This gives us an
        !           520:  * addressable range of 512GB on machines with 64bit PCI or with chips
        !           521:  * that can support dual address cycles on 32bit PCI busses.
        !           522:  */
        !           523: struct ahc_dma_seg {
        !           524:        uint32_t        addr;
        !           525:        uint32_t        len;
        !           526: #define        AHC_DMA_LAST_SEG        0x80000000
        !           527: #define        AHC_SG_HIGH_ADDR_MASK   0x7F000000
        !           528: #define        AHC_SG_LEN_MASK         0x00FFFFFF
        !           529: };
        !           530:
        !           531: struct sg_map_node {
        !           532:        bus_dmamap_t             sg_dmamap;
        !           533:        bus_addr_t               sg_physaddr;
        !           534:        bus_dma_segment_t        sg_dmasegs;
        !           535:        int                      sg_nseg;
        !           536:        struct ahc_dma_seg*      sg_vaddr;
        !           537:        SLIST_ENTRY(sg_map_node) links;
        !           538: };
        !           539:
        !           540: struct ahc_pci_busdata {
        !           541:        pci_chipset_tag_t pc;
        !           542:        pcitag_t tag;
        !           543:        u_int dev;
        !           544:        u_int func;
        !           545:        pcireg_t class;
        !           546: };
        !           547:
        !           548: /*
        !           549:  * The current state of this SCB.
        !           550:  */
        !           551: typedef enum {
        !           552:        SCB_FLAG_NONE           = 0x0000,
        !           553:        SCB_OTHERTCL_TIMEOUT    = 0x0002,/*
        !           554:                                          * Another device was active
        !           555:                                          * during the first timeout for
        !           556:                                          * this SCB so we gave ourselves
        !           557:                                          * an additional timeout period
        !           558:                                          * in case it was hogging the
        !           559:                                          * bus.
        !           560:                                          */
        !           561:        SCB_DEVICE_RESET        = 0x0004,
        !           562:        SCB_SENSE               = 0x0008,
        !           563:        SCB_CDB32_PTR           = 0x0010,
        !           564:        SCB_AUTO_NEGOTIATE      = 0x0040,/* Negotiate to achieve goal. */
        !           565:        SCB_NEGOTIATE           = 0x0080,/* Negotiation forced for command. */
        !           566:        SCB_ABORT               = 0x0100,
        !           567:        SCB_UNTAGGEDQ           = 0x0200,
        !           568:        SCB_ACTIVE              = 0x0400,
        !           569:        SCB_TARGET_IMMEDIATE    = 0x0800,
        !           570:        SCB_TRANSMISSION_ERROR  = 0x1000,/*
        !           571:                                          * We detected a parity or CRC
        !           572:                                          * error that has effected the
        !           573:                                          * payload of the command.  This
        !           574:                                          * flag is checked when normal
        !           575:                                          * status is returned to catch
        !           576:                                          * the case of a target not
        !           577:                                          * responding to our attempt
        !           578:                                          * to report the error.
        !           579:                                          */
        !           580:        SCB_TARGET_SCB          = 0x2000,
        !           581:        SCB_SILENT              = 0x4000 /*
        !           582:                                          * Be quiet about transmission type
        !           583:                                          * errors.  They are expected and we
        !           584:                                          * don't want to upset the user.  This
        !           585:                                          * flag is typically used during DV.
        !           586:                                          */
        !           587: } scb_flag;
        !           588:
        !           589: struct scb {
        !           590:        struct  hardware_scb     *hscb;
        !           591:        union {
        !           592:                SLIST_ENTRY(scb)  sle;
        !           593:                TAILQ_ENTRY(scb)  tqe;
        !           594:        } links;
        !           595:        LIST_ENTRY(scb)           pending_links;
        !           596:
        !           597:        struct scsipi_xfer       *xs;
        !           598:        struct ahc_softc         *ahc_softc;
        !           599:        scb_flag                  flags;
        !           600: #ifndef __linux__
        !           601:        bus_dmamap_t              dmamap;
        !           602: #endif
        !           603:        struct scb_platform_data *platform_data;
        !           604:        struct sg_map_node       *sg_map;
        !           605:        struct ahc_dma_seg       *sg_list;
        !           606:        bus_addr_t                sg_list_phys;
        !           607:        u_int                     sg_count;/* How full ahc_dma_seg is */
        !           608: };
        !           609:
        !           610: struct scb_data {
        !           611:        SLIST_HEAD(, scb) free_scbs;    /*
        !           612:                                         * Pool of SCBs ready to be assigned
        !           613:                                         * commands to execute.
        !           614:                                         */
        !           615:        struct  scb *scbindex[256];     /*
        !           616:                                         * Mapping from tag to SCB.
        !           617:                                         * As tag identifiers are an
        !           618:                                         * 8bit value, we provide space
        !           619:                                         * for all possible tag values.
        !           620:                                         * Any lookups to entries at or
        !           621:                                         * above AHC_SCB_MAX_ALLOC will
        !           622:                                         * always fail.
        !           623:                                         */
        !           624:        struct  hardware_scb    *hscbs; /* Array of hardware SCBs */
        !           625:        struct  scb *scbarray;          /* Array of kernel SCBs */
        !           626:        struct  scsipi_sense_data *sense; /* Per SCB sense data */
        !           627:
        !           628:        /*
        !           629:         * "Bus" addresses of our data structures.
        !           630:         */
        !           631:        bus_dmamap_t     hscb_dmamap;
        !           632:        bus_addr_t       hscb_busaddr;
        !           633:        bus_dma_segment_t hscb_seg;
        !           634:        int               hscb_nseg;
        !           635:        int               hscb_size;
        !           636:
        !           637:        bus_dmamap_t     sense_dmamap;
        !           638:        bus_addr_t       sense_busaddr;
        !           639:        bus_dma_segment_t sense_seg;
        !           640:        int               sense_nseg;
        !           641:        int               sense_size;
        !           642:
        !           643:        SLIST_HEAD(, sg_map_node) sg_maps;
        !           644:        uint8_t numscbs;
        !           645:        uint8_t maxhscbs;               /* Number of SCBs on the card */
        !           646:        uint8_t init_level;             /*
        !           647:                                         * How far we've initialized
        !           648:                                         * this structure.
        !           649:                                         */
        !           650: };
        !           651:
        !           652: /************************ Target Mode Definitions *****************************/
        !           653:
        !           654: /*
        !           655:  * Connection desciptor for select-in requests in target mode.
        !           656:  */
        !           657: struct target_cmd {
        !           658:        uint8_t scsiid;         /* Our ID and the initiator's ID */
        !           659:        uint8_t identify;       /* Identify message */
        !           660:        uint8_t bytes[22];      /*
        !           661:                                 * Bytes contains any additional message
        !           662:                                 * bytes terminated by 0xFF.  The remainder
        !           663:                                 * is the cdb to execute.
        !           664:                                 */
        !           665:        uint8_t cmd_valid;      /*
        !           666:                                 * When a command is complete, the firmware
        !           667:                                 * will set cmd_valid to all bits set.
        !           668:                                 * After the host has seen the command,
        !           669:                                 * the bits are cleared.  This allows us
        !           670:                                 * to just peek at host memory to determine
        !           671:                                 * if more work is complete. cmd_valid is on
        !           672:                                 * an 8 byte boundary to simplify setting
        !           673:                                 * it on aic7880 hardware which only has
        !           674:                                 * limited direct access to the DMA FIFO.
        !           675:                                 */
        !           676:        uint8_t pad[7];
        !           677: };
        !           678:
        !           679: /*
        !           680:  * Number of events we can buffer up if we run out
        !           681:  * of immediate notify ccbs.
        !           682:  */
        !           683: #define AHC_TMODE_EVENT_BUFFER_SIZE 8
        !           684: struct ahc_tmode_event {
        !           685:        uint8_t initiator_id;
        !           686:        uint8_t event_type;     /* MSG type or EVENT_TYPE_BUS_RESET */
        !           687: #define        EVENT_TYPE_BUS_RESET 0xFF
        !           688:        uint8_t event_arg;
        !           689: };
        !           690:
        !           691: /*
        !           692:  * Per enabled lun target mode state.
        !           693:  * As this state is directly influenced by the host OS'es target mode
        !           694:  * environment, we let the OS module define it.  Forward declare the
        !           695:  * structure here so we can store arrays of them, etc. in OS neutral
        !           696:  * data structures.
        !           697:  */
        !           698: #ifdef AHC_TARGET_MODE
        !           699: struct ahc_tmode_lstate {
        !           700: #if 0
        !           701:        struct cam_path *path;
        !           702:        struct ccb_hdr_slist accept_tios;
        !           703:        struct ccb_hdr_slist immed_notifies;
        !           704: #endif
        !           705:        struct ahc_tmode_event event_buffer[AHC_TMODE_EVENT_BUFFER_SIZE];
        !           706:        uint8_t event_r_idx;
        !           707:        uint8_t event_w_idx;
        !           708: };
        !           709: #else
        !           710: struct ahc_tmode_lstate;
        !           711: #endif
        !           712:
        !           713: /******************** Transfer Negotiation Datastructures *********************/
        !           714: #define AHC_TRANS_CUR          0x01    /* Modify current negotiation status */
        !           715: #define AHC_TRANS_ACTIVE       0x03    /* Assume this target is on the bus */
        !           716: #define AHC_TRANS_GOAL         0x04    /* Modify negotiation goal */
        !           717: #define AHC_TRANS_USER         0x08    /* Modify user negotiation settings */
        !           718:
        !           719: #define AHC_WIDTH_UNKNOWN      0xFF
        !           720: #define AHC_PERIOD_UNKNOWN     0xFF
        !           721: #define AHC_OFFSET_UNKNOWN     0xFF
        !           722: #define AHC_PPR_OPTS_UNKNOWN   0xFF
        !           723:
        !           724: /*
        !           725:  * Transfer Negotiation Information.
        !           726:  */
        !           727: struct ahc_transinfo {
        !           728:        uint8_t protocol_version;       /* SCSI Revision level */
        !           729:        uint8_t transport_version;      /* SPI Revision level */
        !           730:        uint8_t width;                  /* Bus width */
        !           731:        uint8_t period;                 /* Sync rate factor */
        !           732:        uint8_t offset;                 /* Sync offset */
        !           733:        uint8_t ppr_options;            /* Parallel Protocol Request options */
        !           734: };
        !           735:
        !           736: /*
        !           737:  * Per-initiator current, goal and user transfer negotiation information. */
        !           738: struct ahc_initiator_tinfo {
        !           739:        uint8_t scsirate;               /* Computed value for SCSIRATE reg */
        !           740:        struct ahc_transinfo curr;
        !           741:        struct ahc_transinfo goal;
        !           742:        struct ahc_transinfo user;
        !           743: };
        !           744:
        !           745: /*
        !           746:  * Per enabled target ID state.
        !           747:  * Pointers to lun target state as well as sync/wide negotiation information
        !           748:  * for each initiator<->target mapping.  For the initiator role we pretend
        !           749:  * that we are the target and the targets are the initiators since the
        !           750:  * negotiation is the same regardless of role.
        !           751:  */
        !           752: struct ahc_tmode_tstate {
        !           753:        struct ahc_tmode_lstate*        enabled_luns[AHC_NUM_LUNS];
        !           754:        struct ahc_initiator_tinfo      transinfo[AHC_NUM_TARGETS];
        !           755:
        !           756:        /*
        !           757:         * Per initiator state bitmasks.
        !           758:         */
        !           759:        uint16_t         auto_negotiate;/* Auto Negotiation Required */
        !           760:        uint16_t         ultraenb;      /* Using ultra sync rate  */
        !           761:        uint16_t         discenable;    /* Disconnection allowed  */
        !           762:        uint16_t         tagenable;     /* Tagged Queuing allowed */
        !           763: };
        !           764:
        !           765: /*
        !           766:  * Data structure for our table of allowed synchronous transfer rates.
        !           767:  */
        !           768: struct ahc_syncrate {
        !           769:        u_int sxfr_u2;  /* Value of the SXFR parameter for Ultra2+ Chips */
        !           770:        u_int sxfr;     /* Value of the SXFR parameter for <= Ultra Chips */
        !           771: #define                ULTRA_SXFR 0x100        /* Rate Requires Ultra Mode set */
        !           772: #define                ST_SXFR    0x010        /* Rate Single Transition Only */
        !           773: #define                DT_SXFR    0x040        /* Rate Double Transition Only */
        !           774:        uint8_t period; /* Period to send to SCSI target */
        !           775:        char *rate;
        !           776: };
        !           777:
        !           778: /* Safe and valid period for async negotiations. */
        !           779: #define        AHC_ASYNC_XFER_PERIOD 0x45
        !           780: #define        AHC_ULTRA2_XFER_PERIOD 0x0a
        !           781:
        !           782: /*
        !           783:  * Indexes into our table of syncronous transfer rates.
        !           784:  */
        !           785: #define AHC_SYNCRATE_DT                0
        !           786: #define AHC_SYNCRATE_ULTRA2    1
        !           787: #define AHC_SYNCRATE_ULTRA     3
        !           788: #define AHC_SYNCRATE_FAST      6
        !           789: #define AHC_SYNCRATE_MAX       AHC_SYNCRATE_DT
        !           790: #define        AHC_SYNCRATE_MIN        13
        !           791:
        !           792: /***************************** Lookup Tables **********************************/
        !           793: /*
        !           794:  * Phase -> name and message out response
        !           795:  * to parity errors in each phase table.
        !           796:  */
        !           797: struct ahc_phase_table_entry {
        !           798:         uint8_t phase;
        !           799:         uint8_t mesg_out; /* Message response to parity errors */
        !           800:        char *phasemsg;
        !           801: };
        !           802:
        !           803: /************************** Serial EEPROM Format ******************************/
        !           804:
        !           805: struct seeprom_config {
        !           806: /*
        !           807:  * Per SCSI ID Configuration Flags
        !           808:  */
        !           809:        uint16_t device_flags[16];      /* words 0-15 */
        !           810: #define                CFXFER          0x0007  /* synchronous transfer rate */
        !           811: #define                CFSYNCH         0x0008  /* enable synchronous transfer */
        !           812: #define                CFDISC          0x0010  /* enable disconnection */
        !           813: #define                CFWIDEB         0x0020  /* wide bus device */
        !           814: #define                CFSYNCHISULTRA  0x0040  /* CFSYNCH is an ultra offset (2940AU)*/
        !           815: #define                CFSYNCSINGLE    0x0080  /* Single-Transition signalling */
        !           816: #define                CFSTART         0x0100  /* send start unit SCSI command */
        !           817: #define                CFINCBIOS       0x0200  /* include in BIOS scan */
        !           818: #define                CFRNFOUND       0x0400  /* report even if not found */
        !           819: #define                CFMULTILUNDEV   0x0800  /* Probe multiple luns in BIOS scan */
        !           820: #define                CFWBCACHEENB    0x4000  /* Enable W-Behind Cache on disks */
        !           821: #define                CFWBCACHENOP    0xc000  /* Don't touch W-Behind Cache */
        !           822:
        !           823: /*
        !           824:  * BIOS Control Bits
        !           825:  */
        !           826:        uint16_t bios_control;          /* word 16 */
        !           827: #define                CFSUPREM        0x0001  /* support all removable drives */
        !           828: #define                CFSUPREMB       0x0002  /* support removable boot drives */
        !           829: #define                CFBIOSEN        0x0004  /* BIOS enabled */
        !           830: #define                CFBIOS_BUSSCAN  0x0008  /* Have the BIOS Scan the Bus */
        !           831: #define                CFSM2DRV        0x0010  /* support more than two drives */
        !           832: #define                CFSTPWLEVEL     0x0010  /* Termination level control */
        !           833: #define                CF284XEXTEND    0x0020  /* extended translation (284x cards) */
        !           834: #define                CFCTRL_A        0x0020  /* BIOS displays Ctrl-A message */
        !           835: #define                CFTERM_MENU     0x0040  /* BIOS displays termination menu */
        !           836: #define                CFEXTEND        0x0080  /* extended translation enabled */
        !           837: #define                CFSCAMEN        0x0100  /* SCAM enable */
        !           838: #define                CFMSG_LEVEL     0x0600  /* BIOS Message Level */
        !           839: #define                        CFMSG_VERBOSE   0x0000
        !           840: #define                        CFMSG_SILENT    0x0200
        !           841: #define                        CFMSG_DIAG      0x0400
        !           842: #define                CFBOOTCD        0x0800  /* Support Bootable CD-ROM */
        !           843: /*             UNUSED          0xff00  */
        !           844:
        !           845: /*
        !           846:  * Host Adapter Control Bits
        !           847:  */
        !           848:        uint16_t adapter_control;       /* word 17 */
        !           849: #define                CFAUTOTERM      0x0001  /* Perform Auto termination */
        !           850: #define                CFULTRAEN       0x0002  /* Ultra SCSI speed enable */
        !           851: #define                CF284XSELTO     0x0003  /* Selection timeout (284x cards) */
        !           852: #define                CF284XFIFO      0x000C  /* FIFO Threshold (284x cards) */
        !           853: #define                CFSTERM         0x0004  /* SCSI low byte termination */
        !           854: #define                CFWSTERM        0x0008  /* SCSI high byte termination */
        !           855: #define                CFSPARITY       0x0010  /* SCSI parity */
        !           856: #define                CF284XSTERM     0x0020  /* SCSI low byte term (284x cards) */
        !           857: #define                CFMULTILUN      0x0020
        !           858: #define                CFRESETB        0x0040  /* reset SCSI bus at boot */
        !           859: #define                CFCLUSTERENB    0x0080  /* Cluster Enable */
        !           860: #define                CFBOOTCHAN      0x0300  /* probe this channel first */
        !           861: #define                CFBOOTCHANSHIFT 8
        !           862: #define                CFSEAUTOTERM    0x0400  /* Ultra2 Perform secondary Auto Term*/
        !           863: #define                CFSELOWTERM     0x0800  /* Ultra2 secondary low term */
        !           864: #define                CFSEHIGHTERM    0x1000  /* Ultra2 secondary high term */
        !           865: #define                CFENABLEDV      0x4000  /* Perform Domain Validation*/
        !           866:
        !           867: /*
        !           868:  * Bus Release Time, Host Adapter ID
        !           869:  */
        !           870:        uint16_t brtime_id;             /* word 18 */
        !           871: #define                CFSCSIID        0x000f  /* host adapter SCSI ID */
        !           872: /*             UNUSED          0x00f0  */
        !           873: #define                CFBRTIME        0xff00  /* bus release time */
        !           874:
        !           875: /*
        !           876:  * Maximum targets
        !           877:  */
        !           878:        uint16_t max_targets;           /* word 19 */
        !           879: #define                CFMAXTARG       0x00ff  /* maximum targets */
        !           880: #define                CFBOOTLUN       0x0f00  /* Lun to boot from */
        !           881: #define                CFBOOTID        0xf000  /* Target to boot from */
        !           882:        uint16_t res_1[10];             /* words 20-29 */
        !           883:        uint16_t signature;             /* Signature == 0x250 */
        !           884: #define                CFSIGNATURE     0x250
        !           885: #define                CFSIGNATURE2    0x300
        !           886:        uint16_t checksum;              /* word 31 */
        !           887: };
        !           888:
        !           889: /****************************  Message Buffer *********************************/
        !           890: typedef enum {
        !           891:        MSG_TYPE_NONE                   = 0x00,
        !           892:        MSG_TYPE_INITIATOR_MSGOUT       = 0x01,
        !           893:        MSG_TYPE_INITIATOR_MSGIN        = 0x02,
        !           894:        MSG_TYPE_TARGET_MSGOUT          = 0x03,
        !           895:        MSG_TYPE_TARGET_MSGIN           = 0x04
        !           896: } ahc_msg_type;
        !           897:
        !           898: typedef enum {
        !           899:        MSGLOOP_IN_PROG,
        !           900:        MSGLOOP_MSGCOMPLETE,
        !           901:        MSGLOOP_TERMINATED
        !           902: } msg_loop_stat;
        !           903:
        !           904: /*********************** Software Configuration Structure *********************/
        !           905: TAILQ_HEAD(scb_tailq, scb);
        !           906:
        !           907: struct ahc_aic7770_softc {
        !           908:        /*
        !           909:         * Saved register state used for chip_init().
        !           910:         */
        !           911:        uint8_t busspd;
        !           912:        uint8_t bustime;
        !           913: };
        !           914:
        !           915: struct ahc_pci_softc {
        !           916:        /*
        !           917:         * Saved register state used for chip_init().
        !           918:         */
        !           919:        uint32_t  devconfig;
        !           920:        uint16_t  targcrccnt;
        !           921:        uint8_t   command;
        !           922:        uint8_t   csize_lattime;
        !           923:        uint8_t   optionmode;
        !           924:        uint8_t   crccontrol1;
        !           925:        uint8_t   dscommand0;
        !           926:        uint8_t   dspcistatus;
        !           927:        uint8_t   scbbaddr;
        !           928:        uint8_t   dff_thrsh;
        !           929: };
        !           930:
        !           931: union ahc_bus_softc {
        !           932:        struct ahc_aic7770_softc aic7770_softc;
        !           933:        struct ahc_pci_softc pci_softc;
        !           934: };
        !           935:
        !           936: typedef void (*ahc_bus_intr_t)(struct ahc_softc *);
        !           937: typedef int (*ahc_bus_chip_init_t)(struct ahc_softc *);
        !           938: typedef void ahc_callback_t (void *);
        !           939:
        !           940: struct ahc_softc {
        !           941:        struct device             sc_dev;
        !           942:
        !           943:        struct scsipi_channel     sc_channel;
        !           944:        struct scsipi_channel     sc_channel_b;
        !           945:        struct device *           sc_child;
        !           946:        struct device *           sc_child_b;
        !           947:        struct scsipi_adapter     sc_adapter;
        !           948:
        !           949:        bus_space_tag_t           tag;
        !           950:        bus_space_handle_t        bsh;
        !           951:
        !           952: #ifndef __linux__
        !           953:        bus_dma_tag_t             buffer_dmat;   /* dmat for buffer I/O */
        !           954: #endif
        !           955:        struct scb_data          *scb_data;
        !           956:
        !           957:        struct scb               *next_queued_scb;
        !           958:
        !           959:        /*
        !           960:         * SCBs that have been sent to the controller
        !           961:         */
        !           962:        LIST_HEAD(, scb)          pending_scbs;
        !           963:
        !           964:        /*
        !           965:         * Counting lock for deferring the release of additional
        !           966:         * untagged transactions from the untagged_queues.  When
        !           967:         * the lock is decremented to 0, all queues in the
        !           968:         * untagged_queues array are run.
        !           969:         */
        !           970:        u_int                     untagged_queue_lock;
        !           971:
        !           972:        /*
        !           973:         * Per-target queue of untagged-transactions.  The
        !           974:         * transaction at the head of the queue is the
        !           975:         * currently pending untagged transaction for the
        !           976:         * target.  The driver only allows a single untagged
        !           977:         * transaction per target.
        !           978:         */
        !           979:        struct scb_tailq          untagged_queues[AHC_NUM_TARGETS];
        !           980:
        !           981:        /*
        !           982:         * Bus attachment specific data.
        !           983:         */
        !           984:        union ahc_bus_softc       bus_softc;
        !           985:
        !           986:        /*
        !           987:         * Platform specific data.
        !           988:         */
        !           989:        struct ahc_platform_data *platform_data;
        !           990:
        !           991:        /*
        !           992:         * Platform specific device information.
        !           993:         */
        !           994:        ahc_dev_softc_t           dev_softc;
        !           995:
        !           996:        /*
        !           997:         * Bus specific device information.
        !           998:         */
        !           999:        ahc_bus_intr_t            bus_intr;
        !          1000:
        !          1001:        /*
        !          1002:         * Bus specific initialization required
        !          1003:         * after a chip reset.
        !          1004:         */
        !          1005:        ahc_bus_chip_init_t       bus_chip_init;
        !          1006:
        !          1007:        /*
        !          1008:         * Target mode related state kept on a per enabled lun basis.
        !          1009:         * Targets that are not enabled will have null entries.
        !          1010:         * As an initiator, we keep one target entry for our initiator
        !          1011:         * ID to store our sync/wide transfer settings.
        !          1012:         */
        !          1013:        struct ahc_tmode_tstate  *enabled_targets[AHC_NUM_TARGETS];
        !          1014:
        !          1015:        char inited_target[AHC_NUM_TARGETS];
        !          1016:
        !          1017:        /*
        !          1018:         * The black hole device responsible for handling requests for
        !          1019:         * disabled luns on enabled targets.
        !          1020:         */
        !          1021:        struct ahc_tmode_lstate  *black_hole;
        !          1022:
        !          1023:        /*
        !          1024:         * Device instance currently on the bus awaiting a continue TIO
        !          1025:         * for a command that was not given the disconnect privilege.
        !          1026:         */
        !          1027:        struct ahc_tmode_lstate  *pending_device;
        !          1028:
        !          1029:        /*
        !          1030:         * Card characteristics
        !          1031:         */
        !          1032:        ahc_chip                  chip;
        !          1033:        ahc_feature               features;
        !          1034:        ahc_bug                   bugs;
        !          1035:        ahc_flag                  flags;
        !          1036:        struct seeprom_config    *seep_config;
        !          1037:
        !          1038:        /* Values to store in the SEQCTL register for pause and unpause */
        !          1039:        uint8_t                   unpause;
        !          1040:        uint8_t                   pause;
        !          1041:
        !          1042:        /* Command Queues */
        !          1043:        uint8_t                   qoutfifonext;
        !          1044:        uint8_t                   qinfifonext;
        !          1045:        uint8_t                  *qoutfifo;
        !          1046:        uint8_t                  *qinfifo;
        !          1047:
        !          1048:        /* Critical Section Data */
        !          1049:        struct cs                *critical_sections;
        !          1050:        u_int                     num_critical_sections;
        !          1051:
        !          1052:        /* Links for chaining softcs */
        !          1053:        TAILQ_ENTRY(ahc_softc)    links;
        !          1054:
        !          1055:        /* Channel Names ('A', 'B', etc.) */
        !          1056:        char                      channel;
        !          1057:        char                      channel_b;
        !          1058:
        !          1059:        /* Initiator Bus ID */
        !          1060:        uint8_t                   our_id;
        !          1061:        uint8_t                   our_id_b;
        !          1062:
        !          1063:        /*
        !          1064:         * PCI error detection.
        !          1065:         */
        !          1066:        int                       unsolicited_ints;
        !          1067:
        !          1068:        /*
        !          1069:         * Target incoming command FIFO.
        !          1070:         */
        !          1071:        struct target_cmd        *targetcmds;
        !          1072:        uint8_t                   tqinfifonext;
        !          1073:
        !          1074:        /*
        !          1075:         * Cached copy of the sequencer control register.
        !          1076:         */
        !          1077:        uint8_t                   seqctl;
        !          1078:
        !          1079:        /*
        !          1080:         * Incoming and outgoing message handling.
        !          1081:         */
        !          1082:        uint8_t                   send_msg_perror;
        !          1083:        ahc_msg_type              msg_type;
        !          1084:        uint8_t                   msgout_buf[12];/* Message we are sending */
        !          1085:        uint8_t                   msgin_buf[12];/* Message we are receiving */
        !          1086:        u_int                     msgout_len;   /* Length of message to send */
        !          1087:        u_int                     msgout_index; /* Current index in msgout */
        !          1088:        u_int                     msgin_index;  /* Current index in msgin */
        !          1089:
        !          1090:        /* Interrupt routine */
        !          1091:        void                     *ih;
        !          1092:
        !          1093:        /*
        !          1094:         * Mapping information for data structures shared
        !          1095:         * between the sequencer and kernel.
        !          1096:         */
        !          1097:        bus_dma_tag_t             parent_dmat;
        !          1098:        bus_dmamap_t              shared_data_dmamap;
        !          1099:        bus_addr_t                shared_data_busaddr;
        !          1100:
        !          1101:        bus_dma_segment_t         shared_data_seg;
        !          1102:        int                       shared_data_nseg;
        !          1103:        int                       shared_data_size;
        !          1104:        int                       sc_dmaflags;
        !          1105:
        !          1106:        /*
        !          1107:         * Bus address of the one byte buffer used to
        !          1108:         * work-around a DMA bug for chips <= aic7880
        !          1109:         * in target mode.
        !          1110:         */
        !          1111:        bus_addr_t                dma_bug_buf;
        !          1112:
        !          1113:        /* Number of enabled target mode device on this card */
        !          1114:        u_int                     enabled_luns;
        !          1115:
        !          1116:        /* Initialization level of this data structure */
        !          1117:        u_int                     init_level;
        !          1118:
        !          1119:        /* PCI cacheline size. */
        !          1120:        u_int                     pci_cachesize;
        !          1121:
        !          1122:        /*
        !          1123:         * Count of parity errors we have seen as a target.
        !          1124:         * We auto-disable parity error checking after seeing
        !          1125:         * AHC_PCI_TARGET_PERR_THRESH number of errors.
        !          1126:         */
        !          1127:        u_int                     pci_target_perr_count;
        !          1128: #define                AHC_PCI_TARGET_PERR_THRESH      10
        !          1129:
        !          1130:        /* Maximum number of sequencer instructions supported. */
        !          1131:        u_int                     instruction_ram_size;
        !          1132:
        !          1133:        /* Per-Unit descriptive information */
        !          1134:        char                     *name;
        !          1135:        int                       unit;
        !          1136:
        !          1137:        /* Selection Timer settings */
        !          1138:        int                       seltime;
        !          1139:        int                       seltime_b;
        !          1140:
        !          1141:        uint16_t                  user_discenable;/* Disconnection allowed  */
        !          1142:        uint16_t                  user_tagenable;/* Tagged Queuing allowed */
        !          1143:
        !          1144:        struct ahc_pci_busdata    *bd;
        !          1145:
        !          1146:        void                      *shutdown_hook;
        !          1147: };
        !          1148:
        !          1149: TAILQ_HEAD(ahc_softc_tailq, ahc_softc);
        !          1150: extern struct ahc_softc_tailq ahc_tailq;
        !          1151:
        !          1152: /************************ Active Device Information ***************************/
        !          1153: typedef enum {
        !          1154:        ROLE_UNKNOWN,
        !          1155:        ROLE_INITIATOR,
        !          1156:        ROLE_TARGET
        !          1157: } role_t;
        !          1158:
        !          1159: struct ahc_devinfo {
        !          1160:        int      our_scsiid;
        !          1161:        int      target_offset;
        !          1162:        uint16_t target_mask;
        !          1163:        u_int    target;
        !          1164:        u_int    lun;
        !          1165:        char     channel;
        !          1166:        role_t   role;          /*
        !          1167:                                 * Only guaranteed to be correct if not
        !          1168:                                 * in the busfree state.
        !          1169:                                 */
        !          1170: };
        !          1171:
        !          1172: /****************************** PCI Structures ********************************/
        !          1173: typedef int (ahc_device_setup_t)(struct ahc_softc *);
        !          1174:
        !          1175: struct ahc_pci_identity {
        !          1176:        uint64_t                 full_id;
        !          1177:        uint64_t                 id_mask;
        !          1178:        ahc_device_setup_t      *setup;
        !          1179: };
        !          1180: extern struct ahc_pci_identity ahc_pci_ident_table[];
        !          1181:
        !          1182: /***************************** VL/EISA Declarations ***************************/
        !          1183: struct aic7770_identity {
        !          1184:        uint32_t                 full_id;
        !          1185:        uint32_t                 id_mask;
        !          1186:        const char              *name;
        !          1187:        ahc_device_setup_t      *setup;
        !          1188: };
        !          1189: extern struct aic7770_identity aic7770_ident_table[];
        !          1190: extern const int ahc_num_aic7770_devs;
        !          1191:
        !          1192: #define AHC_EISA_SLOT_OFFSET   0xc00
        !          1193: #define AHC_EISA_IOSIZE                0x100
        !          1194:
        !          1195: /*************************** Function Declarations ****************************/
        !          1196: /******************************************************************************/
        !          1197: u_int                  ahc_index_busy_tcl(struct ahc_softc *, u_int);
        !          1198: void                   ahc_unbusy_tcl(struct ahc_softc *, u_int);
        !          1199: void                   ahc_busy_tcl(struct ahc_softc *, u_int, u_int);
        !          1200:
        !          1201: /***************************** PCI Front End *********************************/
        !          1202: const struct ahc_pci_identity  *ahc_find_pci_device(pcireg_t, pcireg_t, u_int);
        !          1203: int                     ahc_pci_config(struct ahc_softc *,
        !          1204:                            struct ahc_pci_identity *);
        !          1205: int                     ahc_pci_test_register_access(struct ahc_softc *);
        !          1206:
        !          1207: /*************************** EISA/VL Front End ********************************/
        !          1208: struct aic7770_identity *aic7770_find_device(uint32_t);
        !          1209: int                     aic7770_config(struct ahc_softc *,
        !          1210:                            struct aic7770_identity *, u_int);
        !          1211:
        !          1212: /************************** SCB and SCB queue management **********************/
        !          1213: int            ahc_probe_scbs(struct ahc_softc *);
        !          1214: void           ahc_run_untagged_queues(struct ahc_softc *ahc);
        !          1215: void           ahc_run_untagged_queue(struct ahc_softc *ahc,
        !          1216:                                       struct scb_tailq *queue);
        !          1217: void           ahc_qinfifo_requeue_tail(struct ahc_softc *ahc,
        !          1218:                                         struct scb *scb);
        !          1219: int            ahc_match_scb(struct ahc_softc *ahc, struct scb *scb,
        !          1220:                              int target, char channel, int lun,
        !          1221:                              u_int tag, role_t role);
        !          1222:
        !          1223: /****************************** Initialization ********************************/
        !          1224: int                     ahc_softc_init(struct ahc_softc *);
        !          1225: #ifndef DEBUG
        !          1226: void                    ahc_controller_info(struct ahc_softc *, char *, size_t);
        !          1227: #endif
        !          1228: int                     ahc_chip_init(struct ahc_softc *ahc);
        !          1229: int                     ahc_init(struct ahc_softc *ahc);
        !          1230: void                    ahc_intr_enable(struct ahc_softc *ahc, int enable);
        !          1231: void                    ahc_softc_insert(struct ahc_softc *);
        !          1232: void                    ahc_set_unit(struct ahc_softc *, int);
        !          1233: void                    ahc_set_name(struct ahc_softc *, char *);
        !          1234: void                    ahc_alloc_scbs(struct ahc_softc *ahc);
        !          1235: void                    ahc_free(struct ahc_softc *ahc);
        !          1236: int                     ahc_reset(struct ahc_softc *ahc, int reinit);
        !          1237: void                    ahc_shutdown(void *arg);
        !          1238:
        !          1239: /*************************** Interrupt Services *******************************/
        !          1240: void                   ahc_pci_intr(struct ahc_softc *);
        !          1241: void                   ahc_clear_intstat(struct ahc_softc *);
        !          1242: void                   ahc_run_qoutfifo(struct ahc_softc *);
        !          1243: #ifdef AHC_TARGET_MODE
        !          1244: void                   ahc_run_tqinfifo(struct ahc_softc *ahc, int paused);
        !          1245: #endif
        !          1246: void                   ahc_handle_brkadrint(struct ahc_softc *ahc);
        !          1247: void                   ahc_handle_seqint(struct ahc_softc *ahc, u_int intstat);
        !          1248: void                   ahc_handle_scsiint(struct ahc_softc *ahc,
        !          1249:                                           u_int intstat);
        !          1250: void                   ahc_clear_critical_section(struct ahc_softc *ahc);
        !          1251:
        !          1252: /***************************** Error Recovery *********************************/
        !          1253: typedef enum {
        !          1254:        SEARCH_COMPLETE,
        !          1255:        SEARCH_COUNT,
        !          1256:        SEARCH_REMOVE
        !          1257: } ahc_search_action;
        !          1258: int                    ahc_search_qinfifo(struct ahc_softc *, int, char,
        !          1259:                            int, u_int, role_t, uint32_t, ahc_search_action);
        !          1260: int                    ahc_search_untagged_queues(struct ahc_softc *,
        !          1261:                            struct scsipi_xfer *, int, char, int, uint32_t,
        !          1262:                            ahc_search_action);
        !          1263: int                    ahc_search_disc_list(struct ahc_softc *, int, char,
        !          1264:                            int, u_int, int, int, int);
        !          1265: void                   ahc_freeze_devq(struct ahc_softc *, struct scb *);
        !          1266: int                    ahc_reset_channel(struct ahc_softc *, char, int);
        !          1267: int                    ahc_abort_scbs(struct ahc_softc *, int, char, int,
        !          1268:                            u_int, role_t, uint32_t);
        !          1269: void                   ahc_restart(struct ahc_softc *);
        !          1270: void                   ahc_calc_residual(struct ahc_softc *, struct scb *);
        !          1271: /*************************** Utility Functions ********************************/
        !          1272: struct ahc_phase_table_entry*
        !          1273:                        ahc_lookup_phase_entry(int phase);
        !          1274: void                   ahc_compile_devinfo(struct ahc_devinfo *devinfo,
        !          1275:                                            u_int our_id, u_int target,
        !          1276:                                            u_int lun, char channel,
        !          1277:                                            role_t role);
        !          1278: /************************** Transfer Negotiation ******************************/
        !          1279: struct ahc_syncrate*   ahc_find_syncrate(struct ahc_softc *ahc, u_int *period,
        !          1280:                                          u_int *ppr_options, u_int maxsync);
        !          1281: u_int                  ahc_find_period(struct ahc_softc *ahc,
        !          1282:                                        u_int scsirate, u_int maxsync);
        !          1283: void                   ahc_validate_offset(struct ahc_softc *ahc,
        !          1284:                                            struct ahc_initiator_tinfo *tinfo,
        !          1285:                                            struct ahc_syncrate *syncrate,
        !          1286:                                            u_int *offset, int wide,
        !          1287:                                            role_t role);
        !          1288: void                   ahc_validate_width(struct ahc_softc *ahc,
        !          1289:                                           struct ahc_initiator_tinfo *tinfo,
        !          1290:                                           u_int *bus_width,
        !          1291:                                           role_t role);
        !          1292: /*
        !          1293:  * Negotiation types.  These are used to qualify if we should renegotiate
        !          1294:  * even if our goal and current transport parameters are identical.
        !          1295:  */
        !          1296: typedef enum {
        !          1297:        AHC_NEG_TO_GOAL,        /* Renegotiate only if goal and curr differ. */
        !          1298:        AHC_NEG_IF_NON_ASYNC,   /* Renegotiate so long as goal is non-async. */
        !          1299:        AHC_NEG_ALWAYS          /* Renegotiate even if goal is async. */
        !          1300: } ahc_neg_type;
        !          1301: int                    ahc_update_neg_request(struct ahc_softc *,
        !          1302:                            struct ahc_devinfo *, struct ahc_tmode_tstate *,
        !          1303:                            struct ahc_initiator_tinfo*, ahc_neg_type);
        !          1304: void                   ahc_set_width(struct ahc_softc *, struct ahc_devinfo *,
        !          1305:                            u_int, u_int, int);
        !          1306: void                   ahc_set_syncrate(struct ahc_softc *,
        !          1307:                            struct ahc_devinfo *, struct ahc_syncrate *,
        !          1308:                            u_int, u_int, u_int, u_int, int);
        !          1309: void                   ahc_scb_devinfo(struct ahc_softc *,
        !          1310:                                        struct ahc_devinfo *, struct scb *);
        !          1311:
        !          1312:
        !          1313: typedef enum {
        !          1314:        AHC_QUEUE_NONE,
        !          1315:        AHC_QUEUE_BASIC,
        !          1316:        AHC_QUEUE_TAGGED
        !          1317: } ahc_queue_alg;
        !          1318:
        !          1319: void                   ahc_set_tags(struct ahc_softc *ahc,
        !          1320:                                     struct ahc_devinfo *devinfo,
        !          1321:                                     ahc_queue_alg alg);
        !          1322:
        !          1323: /**************************** Target Mode *************************************/
        !          1324: #ifdef AHC_TARGET_MODE
        !          1325: void           ahc_send_lstate_events(struct ahc_softc *,
        !          1326:                    struct ahc_tmode_lstate *);
        !          1327: void           ahc_handle_en_lun(struct ahc_softc *, struct scsipi_xfer *);
        !          1328: cam_status     ahc_find_tmode_devs(struct ahc_softc *,
        !          1329:                    struct ahc_tmode_tstate **, struct ahc_tmode_lstate **,
        !          1330:                    int);
        !          1331: #ifndef AHC_TMODE_ENABLE
        !          1332: #define AHC_TMODE_ENABLE 0
        !          1333: #endif
        !          1334: #endif
        !          1335: /******************************* Debug ***************************************/
        !          1336: #ifdef AHC_DEBUG
        !          1337: extern uint32_t ahc_debug;
        !          1338: #define        AHC_SHOW_MISC           0x0001
        !          1339: #define        AHC_SHOW_SENSE          0x0002
        !          1340: #define AHC_DUMP_SEEPROM       0x0004
        !          1341: #define AHC_SHOW_TERMCTL       0x0008
        !          1342: #define AHC_SHOW_MEMORY                0x0010
        !          1343: #define AHC_SHOW_MESSAGES      0x0020
        !          1344: #define        AHC_SHOW_DV             0x0040
        !          1345: #define AHC_SHOW_SELTO         0x0080
        !          1346: #define AHC_SHOW_QFULL         0x0200
        !          1347: #define AHC_SHOW_QUEUE         0x0400
        !          1348: #define AHC_SHOW_TQIN          0x0800
        !          1349: #define AHC_SHOW_MASKED_ERRORS 0x1000
        !          1350: #define AHC_DEBUG_SEQUENCER    0x2000
        !          1351: #endif
        !          1352: void                   ahc_print_scb(struct scb *scb);
        !          1353: void                   ahc_print_devinfo(struct ahc_softc *ahc,
        !          1354:                                          struct ahc_devinfo *dev);
        !          1355: void                   ahc_dump_card_state(struct ahc_softc *ahc);
        !          1356: int                    ahc_print_register(ahc_reg_parse_entry_t *table,
        !          1357:                                           u_int num_entries,
        !          1358:                                           const char *name,
        !          1359:                                           u_int address,
        !          1360:                                           u_int value,
        !          1361:                                           u_int *cur_column,
        !          1362:                                           u_int wrap_point);
        !          1363: /******************************* SEEPROM *************************************/
        !          1364: int            ahc_acquire_seeprom(struct ahc_softc *ahc,
        !          1365:                                    struct seeprom_descriptor *sd);
        !          1366: void           ahc_release_seeprom(struct seeprom_descriptor *sd);
        !          1367:
        !          1368: void           ahc_check_extport(struct ahc_softc *, u_int *);
        !          1369: #endif /* _AIC7XXXVAR_H_ */

CVSweb