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

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

1.1     ! nbrk        1: /*     $OpenBSD: aic79xx.h,v 1.21 2006/12/21 02:28:47 krw Exp $        */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 2004 Milos Urbanek, Kenneth R. Westerback & Marco Peereboom
        !             5:  * All rights reserved.
        !             6:  *
        !             7:  * Redistribution and use in source and binary forms, with or without
        !             8:  * modification, are permitted provided that the following conditions
        !             9:  * are met:
        !            10:  * 1. Redistributions of source code must retain the above copyright
        !            11:  *    notice, this list of conditions and the following disclaimer.
        !            12:  * 2. Redistributions in binary form must reproduce the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer in the
        !            14:  *    documentation and/or other materials provided with the distribution.
        !            15:  *
        !            16:  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
        !            17:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            18:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            19:  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
        !            20:  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            21:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            22:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            23:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            24:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            25:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            26:  * SUCH DAMAGE.
        !            27:  *
        !            28:  */
        !            29:
        !            30: /*
        !            31:  * Core definitions and data structures shareable across OS platforms.
        !            32:  *
        !            33:  * Copyright (c) 1994-2002 Justin T. Gibbs.
        !            34:  * Copyright (c) 2000-2002 Adaptec Inc.
        !            35:  * All rights reserved.
        !            36:  *
        !            37:  * Redistribution and use in source and binary forms, with or without
        !            38:  * modification, are permitted provided that the following conditions
        !            39:  * are met:
        !            40:  * 1. Redistributions of source code must retain the above copyright
        !            41:  *    notice, this list of conditions, and the following disclaimer,
        !            42:  *    without modification.
        !            43:  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
        !            44:  *    substantially similar to the "NO WARRANTY" disclaimer below
        !            45:  *    ("Disclaimer") and any redistribution must be conditioned upon
        !            46:  *    including a substantially similar Disclaimer requirement for further
        !            47:  *    binary redistribution.
        !            48:  * 3. Neither the names of the above-listed copyright holders nor the names
        !            49:  *    of any contributors may be used to endorse or promote products derived
        !            50:  *    from this software without specific prior written permission.
        !            51:  *
        !            52:  * Alternatively, this software may be distributed under the terms of the
        !            53:  * GNU General Public License ("GPL") version 2 as published by the Free
        !            54:  * Software Foundation.
        !            55:  *
        !            56:  * NO WARRANTY
        !            57:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        !            58:  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        !            59:  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
        !            60:  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
        !            61:  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            62:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            63:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            64:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
        !            65:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
        !            66:  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            67:  * POSSIBILITY OF SUCH DAMAGES.
        !            68:  *
        !            69:  * Id: //depot/aic7xxx/aic7xxx/aic79xx.h#107
        !            70:  *
        !            71:  * FreeBSD: src/sys/dev/aic7xxx/aic79xx.h,v 1.23 2004/11/18 20:22:31 gibbs Exp
        !            72:  */
        !            73:
        !            74: #ifndef _AIC79XX_H_
        !            75: #define _AIC79XX_H_
        !            76:
        !            77: /* #define AHD_DEBUG */
        !            78:
        !            79: /* Register Definitions */
        !            80: #include <dev/microcode/aic7xxx/aic79xx_reg.h>
        !            81:
        !            82: #include <dev/ic/aic7xxx_cam.h>
        !            83:
        !            84: /************************* Forward Declarations *******************************/
        !            85: struct ahd_platform_data;
        !            86: struct scb_platform_data;
        !            87:
        !            88: /****************************** Useful Macros *********************************/
        !            89: #ifndef MAX
        !            90: #define MAX(a,b) (((a) > (b)) ? (a) : (b))
        !            91: #endif
        !            92:
        !            93: #ifndef MIN
        !            94: #define MIN(a,b) (((a) < (b)) ? (a) : (b))
        !            95: #endif
        !            96:
        !            97: #ifndef TRUE
        !            98: #define TRUE 1
        !            99: #endif
        !           100: #ifndef FALSE
        !           101: #define FALSE 0
        !           102: #endif
        !           103:
        !           104: #define NUM_ELEMENTS(array) (sizeof(array) / sizeof(*array))
        !           105:
        !           106: #define ALL_CHANNELS '\0'
        !           107: #define ALL_TARGETS_MASK 0xFFFF
        !           108: #define INITIATOR_WILDCARD     (~0)
        !           109: #define        SCB_LIST_NULL           0xFF00
        !           110: #define        SCB_LIST_NULL_LE        (aic_htole16(SCB_LIST_NULL))
        !           111: #define QOUTFIFO_ENTRY_VALID 0x80
        !           112: #define SCBID_IS_NULL(scbid) (((scbid) & 0xFF00 ) == SCB_LIST_NULL)
        !           113:
        !           114: #define SCSIID_TARGET(ahd, scsiid)     \
        !           115:        (((scsiid) & TID) >> TID_SHIFT)
        !           116: #define SCSIID_OUR_ID(scsiid)          \
        !           117:        ((scsiid) & OID)
        !           118: #define SCSIID_CHANNEL(ahd, scsiid) ('A')
        !           119: #define        SCB_IS_SCSIBUS_B(ahd, scb) (0)
        !           120: #define        SCB_GET_OUR_ID(scb) \
        !           121:        SCSIID_OUR_ID((scb)->hscb->scsiid)
        !           122: #define        SCB_GET_TARGET(ahd, scb) \
        !           123:        SCSIID_TARGET((ahd), (scb)->hscb->scsiid)
        !           124: #define        SCB_GET_CHANNEL(ahd, scb) \
        !           125:        SCSIID_CHANNEL(ahd, (scb)->hscb->scsiid)
        !           126: #define        SCB_GET_LUN(scb) \
        !           127:        ((scb)->hscb->lun)
        !           128: #define SCB_GET_TARGET_OFFSET(ahd, scb)        \
        !           129:        SCB_GET_TARGET(ahd, scb)
        !           130: #define SCB_GET_TARGET_MASK(ahd, scb) \
        !           131:        (0x01 << (SCB_GET_TARGET_OFFSET(ahd, scb)))
        !           132: #ifdef AHD_DEBUG
        !           133: #define SCB_IS_SILENT(scb)                                     \
        !           134:        ((ahd_debug & AHD_SHOW_MASKED_ERRORS) == 0              \
        !           135:       && (((scb)->flags & SCB_SILENT) != 0))
        !           136: #else
        !           137: #define SCB_IS_SILENT(scb)                                     \
        !           138:        (((scb)->flags & SCB_SILENT) != 0)
        !           139: #endif
        !           140: /*
        !           141:  * TCLs have the following format: TTTTLLLLLLLL
        !           142:  */
        !           143: #define TCL_TARGET_OFFSET(tcl) \
        !           144:        ((((tcl) >> 4) & TID) >> 4)
        !           145: #define TCL_LUN(tcl) \
        !           146:        (tcl & (AHD_NUM_LUNS - 1))
        !           147: #define BUILD_TCL(scsiid, lun) \
        !           148:        ((lun) | (((scsiid) & TID) << 4))
        !           149: #define BUILD_TCL_RAW(target, channel, lun) \
        !           150:        ((lun) | ((target) << 8))
        !           151:
        !           152: #define SCB_GET_TAG(scb) \
        !           153:        aic_le16toh(scb->hscb->tag)
        !           154:
        !           155: #ifndef        AHD_TARGET_MODE
        !           156: #undef AHD_TMODE_ENABLE
        !           157: #define        AHD_TMODE_ENABLE 0
        !           158: #endif
        !           159:
        !           160: #define AHD_BUILD_COL_IDX(target, lun)                         \
        !           161:        (((lun) << 4) | target)
        !           162:
        !           163: #define AHD_GET_SCB_COL_IDX(ahd, scb)                          \
        !           164:        ((SCB_GET_LUN(scb) << 4) | SCB_GET_TARGET(ahd, scb))
        !           165:
        !           166: #define AHD_SET_SCB_COL_IDX(scb, col_idx)                              \
        !           167: do {                                                                   \
        !           168:        (scb)->hscb->scsiid = ((col_idx) << TID_SHIFT) & TID;           \
        !           169:        (scb)->hscb->lun = ((col_idx) >> 4) & (AHD_NUM_LUNS_NONPKT-1);  \
        !           170: } while (0)
        !           171:
        !           172: #define AHD_COPY_SCB_COL_IDX(dst, src)                         \
        !           173: do {                                                           \
        !           174:        dst->hscb->scsiid = src->hscb->scsiid;                  \
        !           175:        dst->hscb->lun = src->hscb->lun;                        \
        !           176: } while (0)
        !           177:
        !           178: #define        AHD_NEVER_COL_IDX 0xFFFF
        !           179:
        !           180: /**************************** Driver Constants ********************************/
        !           181: /*
        !           182:  * The maximum number of supported targets.
        !           183:  */
        !           184: #define AHD_NUM_TARGETS 16
        !           185:
        !           186: /*
        !           187:  * The maximum number of supported luns.
        !           188:  * The identify message only supports 64 luns in non-packetized transfers.
        !           189:  * You can have 2^64 luns when information unit transfers are enabled,
        !           190:  * but until we see a need to support that many, we support 256.
        !           191:  */
        !           192: #define AHD_NUM_LUNS_NONPKT 64
        !           193: #define AHD_NUM_LUNS 256
        !           194:
        !           195: /*
        !           196:  * The maximum transfer per S/G segment.
        !           197:  */
        !           198: #define AHD_MAXTRANSFER_SIZE    0x00ffffff     /* limited by 24bit counter */
        !           199:
        !           200: /*
        !           201:  * The maximum amount of SCB storage in hardware on a controller.
        !           202:  * This value represents an upper bound.  Due to software design,
        !           203:  * we may not be able to use this number.
        !           204:  */
        !           205: #define AHD_SCB_MAX    512
        !           206:
        !           207: /*
        !           208:  * The maximum number of concurrent transactions supported per driver instance.
        !           209:  * Sequencer Control Blocks (SCBs) store per-transaction information.
        !           210:  */
        !           211: #define AHD_MAX_QUEUE  AHD_SCB_MAX
        !           212:
        !           213: /*
        !           214:  * Define the size of our QIN and QOUT FIFOs.  They must be a power of 2
        !           215:  * in size and accommodate as many transactions as can be queued concurrently.
        !           216:  */
        !           217: #define        AHD_QIN_SIZE    AHD_MAX_QUEUE
        !           218: #define        AHD_QOUT_SIZE   AHD_MAX_QUEUE
        !           219:
        !           220: #define AHD_QIN_WRAP(x) ((x) & (AHD_QIN_SIZE-1))
        !           221: /*
        !           222:  * The maximum amount of SCB storage we allocate in host memory.
        !           223:  */
        !           224: #define AHD_SCB_MAX_ALLOC AHD_MAX_QUEUE
        !           225:
        !           226: /*
        !           227:  * Ring Buffer of incoming target commands.
        !           228:  * We allocate 256 to simplify the logic in the sequencer
        !           229:  * by using the natural wrap point of an 8bit counter.
        !           230:  */
        !           231: #define AHD_TMODE_CMDS 256
        !           232:
        !           233: /* Reset line assertion time in us */
        !           234: #define AHD_BUSRESET_DELAY     25
        !           235:
        !           236: /******************* Chip Characteristics/Operating Settings  *****************/
        !           237: extern uint32_t ahd_attach_to_HostRAID_controllers;
        !           238:
        !           239: /*
        !           240:  * Chip Type
        !           241:  * The chip order is from least sophisticated to most sophisticated.
        !           242:  */
        !           243: typedef enum {
        !           244:        AHD_NONE        = 0x0000,
        !           245:        AHD_CHIPID_MASK = 0x00FF,
        !           246:        AHD_AIC7901     = 0x0001,
        !           247:        AHD_AIC7902     = 0x0002,
        !           248:        AHD_AIC7901A    = 0x0003,
        !           249:        AHD_PCI         = 0x0100,       /* Bus type PCI */
        !           250:        AHD_PCIX        = 0x0200,       /* Bus type PCIX */
        !           251:        AHD_BUS_MASK    = 0x0F00
        !           252: } ahd_chip;
        !           253:
        !           254: /*
        !           255:  * Features available in each chip type.
        !           256:  */
        !           257: typedef enum {
        !           258:        AHD_FENONE              = 0x00000,
        !           259:        AHD_WIDE                = 0x00001,/* Wide Channel */
        !           260:        AHD_MULTI_FUNC          = 0x00100,/* Multi-Function/Channel Device */
        !           261:        AHD_TARGETMODE          = 0x01000,/* Has tested target mode support */
        !           262:        AHD_MULTIROLE           = 0x02000,/* Space for two roles at a time */
        !           263:        AHD_RTI                 = 0x04000,/* Retained Training Support */
        !           264:        AHD_NEW_IOCELL_OPTS     = 0x08000,/* More Signal knobs in the IOCELL */
        !           265:        AHD_NEW_DFCNTRL_OPTS    = 0x10000,/* SCSIENWRDIS bit */
        !           266:        AHD_FAST_CDB_DELIVERY   = 0x20000,/* CDB acks released to Output Sync */
        !           267:        AHD_REMOVABLE           = 0x00000,/* Hot-Swap supported - None so far*/
        !           268:        AHD_AIC7901_FE          = AHD_FENONE,
        !           269:        AHD_AIC7901A_FE         = AHD_FENONE,
        !           270:        AHD_AIC7902_FE          = AHD_MULTI_FUNC
        !           271: } ahd_feature;
        !           272:
        !           273: /*
        !           274:  * Bugs in the silicon that we work around in software.
        !           275:  */
        !           276: typedef enum {
        !           277:        AHD_BUGNONE             = 0x0000,
        !           278:        /*
        !           279:         * Rev A hardware fails to update LAST/CURR/NEXTSCB
        !           280:         * correctly in certain packetized selection cases.
        !           281:         */
        !           282:        AHD_SENT_SCB_UPDATE_BUG = 0x0001,
        !           283:        /* The wrong SCB is accessed to check the abort pending bit. */
        !           284:        AHD_ABORT_LQI_BUG       = 0x0002,
        !           285:        /* Packetized bitbucket crosses packet boundaries. */
        !           286:        AHD_PKT_BITBUCKET_BUG   = 0x0004,
        !           287:        /* The selection timer runs twice as long as its setting. */
        !           288:        AHD_LONG_SETIMO_BUG     = 0x0008,
        !           289:        /* The Non-LQ CRC error status is delayed until phase change. */
        !           290:        AHD_NLQICRC_DELAYED_BUG = 0x0010,
        !           291:        /* The chip must be reset for all outgoing bus resets.  */
        !           292:        AHD_SCSIRST_BUG         = 0x0020,
        !           293:        /* Some PCIX fields must be saved and restored across chip reset. */
        !           294:        AHD_PCIX_CHIPRST_BUG    = 0x0040,
        !           295:        /* MMAPIO is not functional in PCI-X mode.  */
        !           296:        AHD_PCIX_MMAPIO_BUG     = 0x0080,
        !           297:        /* Reads to SCBRAM fail to reset the discard timer. */
        !           298:        AHD_PCIX_SCBRAM_RD_BUG  = 0x0100,
        !           299:        /* Bug workarounds that can be disabled on non-PCIX busses. */
        !           300:        AHD_PCIX_BUG_MASK       = AHD_PCIX_CHIPRST_BUG
        !           301:                                | AHD_PCIX_MMAPIO_BUG
        !           302:                                | AHD_PCIX_SCBRAM_RD_BUG,
        !           303:        /*
        !           304:         * LQOSTOP0 status set even for forced selections with ATN
        !           305:         * to perform non-packetized message delivery.
        !           306:         */
        !           307:        AHD_LQO_ATNO_BUG        = 0x0200,
        !           308:        /* FIFO auto-flush does not always trigger.  */
        !           309:        AHD_AUTOFLUSH_BUG       = 0x0400,
        !           310:        /* The CLRLQO registers are not self-clearing. */
        !           311:        AHD_CLRLQO_AUTOCLR_BUG  = 0x0800,
        !           312:        /* The PACKETIZED status bit refers to the previous connection. */
        !           313:        AHD_PKTIZED_STATUS_BUG  = 0x1000,
        !           314:        /* "Short Luns" are not placed into outgoing LQ packets correctly. */
        !           315:        AHD_PKT_LUN_BUG         = 0x2000,
        !           316:        /*
        !           317:         * Only the FIFO allocated to the non-packetized connection may
        !           318:         * be in use during a non-packetzied connection.
        !           319:         */
        !           320:        AHD_NONPACKFIFO_BUG     = 0x4000,
        !           321:        /*
        !           322:         * Writing to a DFF SCBPTR register may fail if concurent with
        !           323:         * a hardware write to the other DFF SCBPTR register.  This is
        !           324:         * not currently a concern in our sequencer since all chips with
        !           325:         * this bug have the AHD_NONPACKFIFO_BUG and all writes of concern
        !           326:         * occur in non-packetized connections.
        !           327:         */
        !           328:        AHD_MDFF_WSCBPTR_BUG    = 0x8000,
        !           329:        /* SGHADDR updates are slow. */
        !           330:        AHD_REG_SLOW_SETTLE_BUG = 0x10000,
        !           331:        /*
        !           332:         * Changing the MODE_PTR coincident with an interrupt that
        !           333:         * switches to a different mode will cause the interrupt to
        !           334:         * be in the mode written outside of interrupt context.
        !           335:         */
        !           336:        AHD_SET_MODE_BUG        = 0x20000,
        !           337:        /* Non-packetized busfree revision does not work. */
        !           338:        AHD_BUSFREEREV_BUG      = 0x40000,
        !           339:        /*
        !           340:         * Paced transfers are indicated with a non-standard PPR
        !           341:         * option bit in the neg table, 160MHz is indicated by
        !           342:         * sync factor 0x7, and the offset if off by a factor of 2.
        !           343:         */
        !           344:        AHD_PACED_NEGTABLE_BUG  = 0x80000,
        !           345:        /* LQOOVERRUN false positives. */
        !           346:        AHD_LQOOVERRUN_BUG      = 0x100000,
        !           347:        /*
        !           348:         * Controller write to INTSTAT will lose to a host
        !           349:         * write to CLRINT.
        !           350:         */
        !           351:        AHD_INTCOLLISION_BUG    = 0x200000,
        !           352:        /*
        !           353:         * The GEM318 violates the SCSI spec by not waiting
        !           354:         * the mandated bus settle delay between phase changes
        !           355:         * in some situations.  Some aic79xx chip revs. are more
        !           356:         * strict in this regard and will treat REQ assertions
        !           357:         * that fall within the bus settle delay window as
        !           358:         * glitches.  This flag tells the firmware to tolerate
        !           359:         * early REQ assertions.
        !           360:         */
        !           361:        AHD_EARLY_REQ_BUG       = 0x400000,
        !           362:        /*
        !           363:         * The LED does not stay on long enough in packetized modes.
        !           364:         */
        !           365:        AHD_FAINT_LED_BUG       = 0x800000
        !           366: } ahd_bug;
        !           367:
        !           368: /*
        !           369:  * Configuration specific settings.
        !           370:  * The driver determines these settings by probing the
        !           371:  * chip/controller's configuration.
        !           372:  */
        !           373: typedef enum {
        !           374:        AHD_FNONE             = 0x00000,
        !           375:        AHD_BOOT_CHANNEL      = 0x00001,/* We were set as the boot channel. */
        !           376:        AHD_USEDEFAULTS       = 0x00004,/*
        !           377:                                         * For cards without an seeprom
        !           378:                                         * or a BIOS to initialize the chip's
        !           379:                                         * SRAM, we use the default target
        !           380:                                         * settings.
        !           381:                                         */
        !           382:        AHD_SEQUENCER_DEBUG   = 0x00008,
        !           383:        AHD_RESET_BUS_A       = 0x00010,
        !           384:        AHD_EXTENDED_TRANS_A  = 0x00020,
        !           385:        AHD_TERM_ENB_A        = 0x00040,
        !           386:        AHD_SPCHK_ENB_A       = 0x00080,
        !           387:        AHD_STPWLEVEL_A       = 0x00100,
        !           388:        AHD_INITIATORROLE     = 0x00200,/*
        !           389:                                         * Allow initiator operations on
        !           390:                                         * this controller.
        !           391:                                         */
        !           392:        AHD_TARGETROLE        = 0x00400,/*
        !           393:                                         * Allow target operations on this
        !           394:                                         * controller.
        !           395:                                         */
        !           396:        AHD_RESOURCE_SHORTAGE = 0x00800,
        !           397:        AHD_TQINFIFO_BLOCKED  = 0x01000,/* Blocked waiting for ATIOs */
        !           398:        AHD_INT50_SPEEDFLEX   = 0x02000,/*
        !           399:                                         * Internal 50pin connector
        !           400:                                         * sits behind an aic3860
        !           401:                                         */
        !           402:        AHD_BIOS_ENABLED      = 0x04000,
        !           403:        AHD_ALL_INTERRUPTS    = 0x08000,
        !           404:        AHD_39BIT_ADDRESSING  = 0x10000,/* Use 39 bit addressing scheme. */
        !           405:        AHD_64BIT_ADDRESSING  = 0x20000,/* Use 64 bit addressing scheme. */
        !           406:        AHD_CURRENT_SENSING   = 0x40000,
        !           407:        AHD_SCB_CONFIG_USED   = 0x80000,/* No SEEPROM but SCB had info. */
        !           408:        AHD_HP_BOARD          = 0x100000,
        !           409:        AHD_RESET_POLL_ACTIVE = 0x200000,
        !           410:        AHD_UPDATE_PEND_CMDS  = 0x400000,
        !           411:        AHD_RUNNING_QOUTFIFO  = 0x800000,
        !           412:        AHD_HAD_FIRST_SEL     = 0x1000000,
        !           413:        AHD_SHUTDOWN_RECOVERY = 0x2000000, /* Terminate recovery thread. */
        !           414:        AHD_HOSTRAID_BOARD    = 0x4000000
        !           415: } ahd_flag;
        !           416:
        !           417: /************************* Hardware  SCB Definition ***************************/
        !           418:
        !           419: /*
        !           420:  * The driver keeps up to MAX_SCB scb structures per card in memory.  The SCB
        !           421:  * consists of a "hardware SCB" mirroring the fields available on the card
        !           422:  * and additional information the kernel stores for each transaction.
        !           423:  *
        !           424:  * To minimize space utilization, a portion of the hardware scb stores
        !           425:  * different data during different portions of a SCSI transaction.
        !           426:  * As initialized by the host driver for the initiator role, this area
        !           427:  * contains the SCSI cdb (or a pointer to the  cdb) to be executed.  After
        !           428:  * the cdb has been presented to the target, this area serves to store
        !           429:  * residual transfer information and the SCSI status byte.
        !           430:  * For the target role, the contents of this area do not change, but
        !           431:  * still serve a different purpose than for the initiator role.  See
        !           432:  * struct target_data for details.
        !           433:  */
        !           434:
        !           435: /*
        !           436:  * Status information embedded in the shared poriton of
        !           437:  * an SCB after passing the cdb to the target.  The kernel
        !           438:  * driver will only read this data for transactions that
        !           439:  * complete abnormally.
        !           440:  */
        !           441: struct initiator_status {
        !           442:        uint32_t residual_datacnt;      /* Residual in the current S/G seg */
        !           443:        uint32_t residual_sgptr;        /* The next S/G for this transfer */
        !           444:        uint8_t  scsi_status;           /* Standard SCSI status byte */
        !           445: };
        !           446:
        !           447: struct target_status {
        !           448:        uint32_t residual_datacnt;      /* Residual in the current S/G seg */
        !           449:        uint32_t residual_sgptr;        /* The next S/G for this transfer */
        !           450:        uint8_t  scsi_status;           /* SCSI status to give to initiator */
        !           451:        uint8_t  target_phases;         /* Bitmap of phases to execute */
        !           452:        uint8_t  data_phase;            /* Data-In or Data-Out */
        !           453:        uint8_t  initiator_tag;         /* Initiator's transaction tag */
        !           454: };
        !           455:
        !           456: /*
        !           457:  * Initiator mode SCB shared data area.
        !           458:  * If the embedded CDB is 12 bytes or less, we embed
        !           459:  * the sense buffer address in the SCB.  This allows
        !           460:  * us to retrieve sense information without interrupting
        !           461:  * the host in packetized mode.
        !           462:  */
        !           463: typedef uint32_t sense_addr_t;
        !           464: #define MAX_CDB_LEN 16
        !           465: #define MAX_CDB_LEN_WITH_SENSE_ADDR (MAX_CDB_LEN - sizeof(sense_addr_t))
        !           466: union initiator_data {
        !           467:        struct {
        !           468:                uint64_t cdbptr;
        !           469:                uint8_t  cdblen;
        !           470:        } cdb_from_host;
        !           471:        uint8_t  cdb[MAX_CDB_LEN];
        !           472:        struct {
        !           473:                uint8_t  cdb[MAX_CDB_LEN_WITH_SENSE_ADDR];
        !           474:                sense_addr_t sense_addr;
        !           475:        } cdb_plus_saddr;
        !           476: };
        !           477:
        !           478: /*
        !           479:  * Target mode version of the shared data SCB segment.
        !           480:  */
        !           481: struct target_data {
        !           482:        uint32_t spare[2];
        !           483:        uint8_t  scsi_status;           /* SCSI status to give to initiator */
        !           484:        uint8_t  target_phases;         /* Bitmap of phases to execute */
        !           485:        uint8_t  data_phase;            /* Data-In or Data-Out */
        !           486:        uint8_t  initiator_tag;         /* Initiator's transaction tag */
        !           487: };
        !           488:
        !           489: struct hardware_scb {
        !           490: /*0*/  union {
        !           491:                union   initiator_data idata;
        !           492:                struct  target_data tdata;
        !           493:                struct  initiator_status istatus;
        !           494:                struct  target_status tstatus;
        !           495:        } shared_data;
        !           496: /*
        !           497:  * A word about residuals.
        !           498:  * The scb is presented to the sequencer with the dataptr and datacnt
        !           499:  * fields initialized to the contents of the first S/G element to
        !           500:  * transfer.  The sgptr field is initialized to the bus address for
        !           501:  * the S/G element that follows the first in the in core S/G array
        !           502:  * or'ed with the SG_FULL_RESID flag.  Sgptr may point to an invalid
        !           503:  * S/G entry for this transfer (single S/G element transfer with the
        !           504:  * first elements address and length preloaded in the dataptr/datacnt
        !           505:  * fields).  If no transfer is to occur, sgptr is set to SG_LIST_NULL.
        !           506:  * The SG_FULL_RESID flag ensures that the residual will be correctly
        !           507:  * noted even if no data transfers occur.  Once the data phase is entered,
        !           508:  * the residual sgptr and datacnt are loaded from the sgptr and the
        !           509:  * datacnt fields.  After each S/G element's dataptr and length are
        !           510:  * loaded into the hardware, the residual sgptr is advanced.  After
        !           511:  * each S/G element is expired, its datacnt field is checked to see
        !           512:  * if the LAST_SEG flag is set.  If so, SG_LIST_NULL is set in the
        !           513:  * residual sg ptr and the transfer is considered complete.  If the
        !           514:  * sequencer determines that there is a residual in the transfer, or
        !           515:  * there is non-zero status, it will set the SG_STATUS_VALID flag in
        !           516:  * sgptr and dma the scb back into host memory.  To sumarize:
        !           517:  *
        !           518:  * Sequencer:
        !           519:  *     o A residual has occurred if SG_FULL_RESID is set in sgptr,
        !           520:  *       or residual_sgptr does not have SG_LIST_NULL set.
        !           521:  *
        !           522:  *     o We are transfering the last segment if residual_datacnt has
        !           523:  *       the SG_LAST_SEG flag set.
        !           524:  *
        !           525:  * Host:
        !           526:  *     o A residual can only have occurred if a completed scb has the
        !           527:  *       SG_STATUS_VALID flag set.  Inspection of the SCSI status field,
        !           528:  *       the residual_datacnt, and the residual_sgptr field will tell
        !           529:  *       for sure.
        !           530:  *
        !           531:  *     o residual_sgptr and sgptr refer to the "next" sg entry
        !           532:  *       and so may point beyond the last valid sg entry for the
        !           533:  *       transfer.
        !           534:  */
        !           535: #define SG_PTR_MASK    0xFFFFFFF8
        !           536: /*16*/ uint16_t tag;           /* Reused by Sequencer. */
        !           537: /*18*/ uint8_t  control;       /* See SCB_CONTROL in aic79xx.reg for details */
        !           538: /*19*/ uint8_t  scsiid;        /*
        !           539:                                 * Selection out Id
        !           540:                                 * Our Id (bits 0-3) Their ID (bits 4-7)
        !           541:                                 */
        !           542: /*20*/ uint8_t  lun;
        !           543: /*21*/ uint8_t  task_attribute;
        !           544: /*22*/ uint8_t  cdb_len;
        !           545: /*23*/ uint8_t  task_management;
        !           546: /*24*/ uint64_t dataptr;
        !           547: /*32*/ uint32_t datacnt;       /* Byte 3 is spare. */
        !           548: /*36*/ uint32_t sgptr;
        !           549: /*40*/ uint32_t hscb_busaddr;
        !           550: /*44*/ uint32_t next_hscb_busaddr;
        !           551: /********** Long lun field only downloaded for full 8 byte lun support ********/
        !           552: /*48*/  uint8_t         pkt_long_lun[8];
        !           553: /******* Fields below are not Downloaded (Sequencer may use for scratch) ******/
        !           554: /*56*/  uint8_t         spare[8];
        !           555: };
        !           556:
        !           557: /************************ Kernel SCB Definitions ******************************/
        !           558: /*
        !           559:  * Some fields of the SCB are OS dependent.  Here we collect the
        !           560:  * definitions for elements that all OS platforms need to include
        !           561:  * in there SCB definition.
        !           562:  */
        !           563:
        !           564: /*
        !           565:  * Definition of a scatter/gather element as transfered to the controller.
        !           566:  * The aic7xxx chips only support a 24bit length.  We use the top byte of
        !           567:  * the length to store additional address bits and a flag to indicate
        !           568:  * that a given segment terminates the transfer.  This gives us an
        !           569:  * addressable range of 512GB on machines with 64bit PCI or with chips
        !           570:  * that can support dual address cycles on 32bit PCI busses.
        !           571:  */
        !           572: struct ahd_dma_seg {
        !           573:        uint32_t        addr;
        !           574:        uint32_t        len;
        !           575: #define        AHD_DMA_LAST_SEG        0x80000000
        !           576: #define        AHD_SG_HIGH_ADDR_MASK   0x7F000000
        !           577: #define        AHD_SG_LEN_MASK         0x00FFFFFF
        !           578: };
        !           579:
        !           580: struct ahd_dma64_seg {
        !           581:        uint64_t        addr;
        !           582:        uint32_t        len;
        !           583:        uint32_t        pad;
        !           584: };
        !           585:
        !           586: struct map_node {
        !           587:        bus_dmamap_t             dmamap;
        !           588:        bus_addr_t               busaddr;
        !           589:        uint8_t                 *vaddr;
        !           590:        bus_dma_segment_t        dmaseg;
        !           591:        size_t                   size;
        !           592:        SLIST_ENTRY(map_node)    links;
        !           593: };
        !           594:
        !           595: /*
        !           596:  * The current state of this SCB.
        !           597:  */
        !           598: typedef enum {
        !           599:        SCB_FLAG_NONE           = 0x00000,
        !           600:        SCB_TRANSMISSION_ERROR  = 0x00001,/*
        !           601:                                           * We detected a parity or CRC
        !           602:                                           * error that has effected the
        !           603:                                           * payload of the command.  This
        !           604:                                           * flag is checked when normal
        !           605:                                           * status is returned to catch
        !           606:                                           * the case of a target not
        !           607:                                           * responding to our attempt
        !           608:                                           * to report the error.
        !           609:                                           */
        !           610:        SCB_OTHERTCL_TIMEOUT    = 0x00002,/*
        !           611:                                           * Another device was active
        !           612:                                           * during the first timeout for
        !           613:                                           * this SCB so we gave ourselves
        !           614:                                           * an additional timeout period
        !           615:                                           * in case it was hogging the
        !           616:                                           * bus.
        !           617:                                           */
        !           618:        SCB_DEVICE_RESET        = 0x00004,
        !           619:        SCB_SENSE               = 0x00008,
        !           620:        SCB_CDB32_PTR           = 0x00010,
        !           621:        SCB_AUTO_NEGOTIATE      = 0x00040,/* Negotiate to achieve goal. */
        !           622:        SCB_NEGOTIATE           = 0x00080,/* Negotiation forced for command. */
        !           623:        SCB_ABORT               = 0x00100,
        !           624:        SCB_ACTIVE              = 0x00200,
        !           625:        SCB_TARGET_IMMEDIATE    = 0x00400,
        !           626:        SCB_PACKETIZED          = 0x00800,
        !           627:        SCB_EXPECT_PPR_BUSFREE  = 0x01000,
        !           628:        SCB_PKT_SENSE           = 0x02000,
        !           629:        SCB_CMDPHASE_ABORT      = 0x04000,
        !           630:        SCB_ON_COL_LIST         = 0x08000,
        !           631:        SCB_SILENT              = 0x10000,/*
        !           632:                                           * Be quiet about transmission type
        !           633:                                           * errors.  They are expected and we
        !           634:                                           * don't want to upset the user.  This
        !           635:                                           * flag is typically used during DV.
        !           636:                                           */
        !           637: } scb_flag;
        !           638:
        !           639: struct scb {
        !           640:        struct  hardware_scb     *hscb;
        !           641:        union {
        !           642:                SLIST_ENTRY(scb)  sle;
        !           643:                LIST_ENTRY(scb)   le;
        !           644:                TAILQ_ENTRY(scb)  tqe;
        !           645:        } links;
        !           646:        union {
        !           647:                SLIST_ENTRY(scb)  sle;
        !           648:                LIST_ENTRY(scb)   le;
        !           649:                TAILQ_ENTRY(scb)  tqe;
        !           650:        } links2;
        !           651: #define pending_links links2.le
        !           652: #define collision_links links2.le
        !           653:        LIST_ENTRY(scb)           timedout_links;
        !           654:        struct scb               *col_scb;
        !           655:        struct scsi_xfer         *xs;
        !           656:
        !           657:        struct ahd_softc         *ahd_softc;
        !           658:        scb_flag                  flags;
        !           659: #ifndef __linux__
        !           660:        bus_dmamap_t              dmamap;
        !           661: #endif
        !           662:        struct scb_platform_data *platform_data;
        !           663:        struct map_node          *hscb_map;
        !           664:        struct map_node          *sg_map;
        !           665:        struct map_node          *sense_map;
        !           666:        void                     *sg_list;
        !           667:        uint8_t                  *sense_data;
        !           668:        bus_addr_t                sg_list_busaddr;
        !           669:        bus_addr_t                sense_busaddr;
        !           670:        u_int                     sg_count;/* How full ahd_dma_seg is */
        !           671: #define        AHD_MAX_LQ_CRC_ERRORS 5
        !           672:        u_int                     crc_retry_count;
        !           673: };
        !           674:
        !           675: TAILQ_HEAD(scb_tailq, scb);
        !           676: LIST_HEAD(scb_list, scb);
        !           677:
        !           678: struct scb_data {
        !           679:        /*
        !           680:         * TAILQ of lists of free SCBs grouped by device
        !           681:         * collision domains.
        !           682:         */
        !           683:        struct scb_tailq free_scbs;
        !           684:
        !           685:        /*
        !           686:         * Per-device lists of SCBs whose tag ID would collide
        !           687:         * with an already active tag on the device.
        !           688:         */
        !           689:        struct scb_list free_scb_lists[AHD_NUM_TARGETS * AHD_NUM_LUNS_NONPKT];
        !           690:
        !           691:        /*
        !           692:         * SCBs that will not collide with any active device.
        !           693:         */
        !           694:        struct scb_list any_dev_free_scb_list;
        !           695:
        !           696:        /*
        !           697:         * Mapping from tag to SCB.
        !           698:         */
        !           699:        struct  scb *scbindex[AHD_SCB_MAX];
        !           700:
        !           701:        u_int            recovery_scbs; /* Transactions currently in recovery */
        !           702:
        !           703:        SLIST_HEAD(, map_node) hscb_maps;
        !           704:        SLIST_HEAD(, map_node) sg_maps;
        !           705:        SLIST_HEAD(, map_node) sense_maps;
        !           706:        int              scbs_left;     /* unallocated scbs in head map_node */
        !           707:        int              sgs_left;      /* unallocated sgs in head map_node */
        !           708:        int              sense_left;    /* unallocated sense in head map_node */
        !           709:        uint16_t         numscbs;
        !           710:        uint16_t         maxhscbs;      /* Number of SCBs on the card */
        !           711:        uint8_t          init_level;    /*
        !           712:                                         * How far we've initialized
        !           713:                                         * this structure.
        !           714:                                         */
        !           715: };
        !           716:
        !           717: /************************ Target Mode Definitions *****************************/
        !           718:
        !           719: /*
        !           720:  * Connection desciptor for select-in requests in target mode.
        !           721:  */
        !           722: struct target_cmd {
        !           723:        uint8_t scsiid;         /* Our ID and the initiator's ID */
        !           724:        uint8_t identify;       /* Identify message */
        !           725:        uint8_t bytes[22];      /*
        !           726:                                 * Bytes contains any additional message
        !           727:                                 * bytes terminated by 0xFF.  The remainder
        !           728:                                 * is the cdb to execute.
        !           729:                                 */
        !           730:        uint8_t cmd_valid;      /*
        !           731:                                 * When a command is complete, the firmware
        !           732:                                 * will set cmd_valid to all bits set.
        !           733:                                 * After the host has seen the command,
        !           734:                                 * the bits are cleared.  This allows us
        !           735:                                 * to just peek at host memory to determine
        !           736:                                 * if more work is complete. cmd_valid is on
        !           737:                                 * an 8 byte boundary to simplify setting
        !           738:                                 * it on aic7880 hardware which only has
        !           739:                                 * limited direct access to the DMA FIFO.
        !           740:                                 */
        !           741:        uint8_t pad[7];
        !           742: };
        !           743:
        !           744: /*
        !           745:  * Number of events we can buffer up if we run out
        !           746:  * of immediate notify ccbs.
        !           747:  */
        !           748: #define AHD_TMODE_EVENT_BUFFER_SIZE 8
        !           749: struct ahd_tmode_event {
        !           750:        uint8_t initiator_id;
        !           751:        uint8_t event_type;     /* MSG type or EVENT_TYPE_BUS_RESET */
        !           752: #define        EVENT_TYPE_BUS_RESET 0xFF
        !           753:        uint8_t event_arg;
        !           754: };
        !           755:
        !           756: /*
        !           757:  * Per enabled lun target mode state.
        !           758:  * As this state is directly influenced by the host OS'es target mode
        !           759:  * environment, we let the OS module define it.  Forward declare the
        !           760:  * structure here so we can store arrays of them, etc. in OS neutral
        !           761:  * data structures.
        !           762:  */
        !           763: #ifdef AHD_TARGET_MODE
        !           764: struct ahd_tmode_lstate {
        !           765:        struct ahd_tmode_event event_buffer[AHD_TMODE_EVENT_BUFFER_SIZE];
        !           766:        uint8_t event_r_idx;
        !           767:        uint8_t event_w_idx;
        !           768: };
        !           769: #else
        !           770: struct ahd_tmode_lstate;
        !           771: #endif
        !           772:
        !           773: /******************** Transfer Negotiation Datastructures *********************/
        !           774: #define AHD_TRANS_CUR          0x01    /* Modify current neogtiation status */
        !           775: #define AHD_TRANS_ACTIVE       0x03    /* Assume this target is on the bus */
        !           776: #define AHD_TRANS_GOAL         0x04    /* Modify negotiation goal */
        !           777: #define AHD_TRANS_USER         0x08    /* Modify user negotiation settings */
        !           778: #define AHD_PERIOD_10MHz       0x19
        !           779:
        !           780: #define AHD_WIDTH_UNKNOWN      0xFF
        !           781: #define AHD_PERIOD_UNKNOWN     0xFF
        !           782: #define AHD_OFFSET_UNKNOWN     0xFF
        !           783: #define AHD_PPR_OPTS_UNKNOWN   0xFF
        !           784:
        !           785: /*
        !           786:  * Transfer Negotiation Information.
        !           787:  */
        !           788: struct ahd_transinfo {
        !           789:        uint8_t protocol_version;       /* SCSI Revision level */
        !           790:        uint8_t transport_version;      /* SPI Revision level */
        !           791:        uint8_t width;                  /* Bus width */
        !           792:        uint8_t period;                 /* Sync rate factor */
        !           793:        uint8_t offset;                 /* Sync offset */
        !           794:        uint8_t ppr_options;            /* Parallel Protocol Request options */
        !           795: };
        !           796:
        !           797: /*
        !           798:  * Per-initiator current, goal and user transfer negotiation information. */
        !           799: struct ahd_initiator_tinfo {
        !           800:        struct ahd_transinfo curr;
        !           801:        struct ahd_transinfo goal;
        !           802:        struct ahd_transinfo user;
        !           803: };
        !           804:
        !           805: /*
        !           806:  * Per enabled target ID state.
        !           807:  * Pointers to lun target state as well as sync/wide negotiation information
        !           808:  * for each initiator<->target mapping.  For the initiator role we pretend
        !           809:  * that we are the target and the targets are the initiators since the
        !           810:  * negotiation is the same regardless of role.
        !           811:  */
        !           812: struct ahd_tmode_tstate {
        !           813:        struct ahd_tmode_lstate*        enabled_luns[AHD_NUM_LUNS];
        !           814:        struct ahd_initiator_tinfo      transinfo[AHD_NUM_TARGETS];
        !           815:
        !           816:        /*
        !           817:         * Per initiator state bitmasks.
        !           818:         */
        !           819:        uint16_t         auto_negotiate;/* Auto Negotiation Required */
        !           820:        uint16_t         discenable;    /* Disconnection allowed  */
        !           821:        uint16_t         tagenable;     /* Tagged Queuing allowed */
        !           822: };
        !           823:
        !           824: /*
        !           825:  * Points of interest along the negotiated transfer scale.
        !           826:  */
        !           827: #define AHD_SYNCRATE_160       0x8
        !           828: #define AHD_SYNCRATE_PACED     0x8
        !           829: #define AHD_SYNCRATE_DT                0x9
        !           830: #define AHD_SYNCRATE_ULTRA2    0xa
        !           831: #define AHD_SYNCRATE_ULTRA     0xc
        !           832: #define AHD_SYNCRATE_FAST      0x19
        !           833: #define AHD_SYNCRATE_MIN_DT    AHD_SYNCRATE_FAST
        !           834: #define AHD_SYNCRATE_SYNC      0x32
        !           835: #define AHD_SYNCRATE_MIN       0x60
        !           836: #define        AHD_SYNCRATE_ASYNC      0xFF
        !           837: #define AHD_SYNCRATE_MAX       AHD_SYNCRATE_160
        !           838:
        !           839: /* Safe and valid period for async negotiations. */
        !           840: #define        AHD_ASYNC_XFER_PERIOD   0x44
        !           841:
        !           842: /*
        !           843:  * In RevA, the synctable uses a 120MHz rate for the period
        !           844:  * factor 8 and 160MHz for the period factor 7.  The 120MHz
        !           845:  * rate never made it into the official SCSI spec, so we must
        !           846:  * compensate when setting the negotiation table for Rev A
        !           847:  * parts.
        !           848:  */
        !           849: #define AHD_SYNCRATE_REVA_120  0x8
        !           850: #define AHD_SYNCRATE_REVA_160  0x7
        !           851:
        !           852: /***************************** Lookup Tables **********************************/
        !           853: /*
        !           854:  * Phase -> name and message out response
        !           855:  * to parity errors in each phase table.
        !           856:  */
        !           857: struct ahd_phase_table_entry {
        !           858:         uint8_t phase;
        !           859:         uint8_t mesg_out; /* Message response to parity errors */
        !           860:        char *phasemsg;
        !           861: };
        !           862:
        !           863: /************************** Serial EEPROM Format ******************************/
        !           864:
        !           865: struct seeprom_config {
        !           866: /*
        !           867:  * Per SCSI ID Configuration Flags
        !           868:  */
        !           869:        uint16_t device_flags[16];      /* words 0-15 */
        !           870: #define                CFXFER          0x003F  /* synchronous transfer rate */
        !           871: #define                        CFXFER_ASYNC    0x3F
        !           872: #define                CFQAS           0x0040  /* Negotiate QAS */
        !           873: #define                CFPACKETIZED    0x0080  /* Negotiate Packetized Transfers */
        !           874: #define                CFSTART         0x0100  /* send start unit SCSI command */
        !           875: #define                CFINCBIOS       0x0200  /* include in BIOS scan */
        !           876: #define                CFDISC          0x0400  /* enable disconnection */
        !           877: #define                CFMULTILUNDEV   0x0800  /* Probe multiple luns in BIOS scan */
        !           878: #define                CFWIDEB         0x1000  /* wide bus device */
        !           879: #define                CFHOSTMANAGED   0x8000  /* Managed by a RAID controller */
        !           880:
        !           881: /*
        !           882:  * BIOS Control Bits
        !           883:  */
        !           884:        uint16_t bios_control;          /* word 16 */
        !           885: #define                CFSUPREM        0x0001  /* support all removeable drives */
        !           886: #define                CFSUPREMB       0x0002  /* support removeable boot drives */
        !           887: #define                CFBIOSSTATE     0x000C  /* BIOS Action State */
        !           888: #define                    CFBS_DISABLED       0x00
        !           889: #define                    CFBS_ENABLED        0x04
        !           890: #define                    CFBS_DISABLED_SCAN  0x08
        !           891: #define                CFENABLEDV      0x0010  /* Perform Domain Validation */
        !           892: #define                CFCTRL_A        0x0020  /* BIOS displays Ctrl-A message */
        !           893: #define                CFSPARITY       0x0040  /* SCSI parity */
        !           894: #define                CFEXTEND        0x0080  /* extended translation enabled */
        !           895: #define                CFBOOTCD        0x0100  /* Support Bootable CD-ROM */
        !           896: #define                CFMSG_LEVEL     0x0600  /* BIOS Message Level */
        !           897: #define                        CFMSG_VERBOSE   0x0000
        !           898: #define                        CFMSG_SILENT    0x0200
        !           899: #define                        CFMSG_DIAG      0x0400
        !           900: #define                CFRESETB        0x0800  /* reset SCSI bus at boot */
        !           901: /*             UNUSED          0xf000  */
        !           902:
        !           903: /*
        !           904:  * Host Adapter Control Bits
        !           905:  */
        !           906:        uint16_t adapter_control;       /* word 17 */
        !           907: #define                CFAUTOTERM      0x0001  /* Perform Auto termination */
        !           908: #define                CFSTERM         0x0002  /* SCSI low byte termination */
        !           909: #define                CFWSTERM        0x0004  /* SCSI high byte termination */
        !           910: #define                CFSEAUTOTERM    0x0008  /* Ultra2 Perform secondary Auto Term*/
        !           911: #define                CFSELOWTERM     0x0010  /* Ultra2 secondary low term */
        !           912: #define                CFSEHIGHTERM    0x0020  /* Ultra2 secondary high term */
        !           913: #define                CFSTPWLEVEL     0x0040  /* Termination level control */
        !           914: #define                CFBIOSAUTOTERM  0x0080  /* Perform Auto termination */
        !           915: #define                CFTERM_MENU     0x0100  /* BIOS displays termination menu */
        !           916: #define                CFCLUSTERENB    0x8000  /* Cluster Enable */
        !           917:
        !           918: /*
        !           919:  * Bus Release Time, Host Adapter ID
        !           920:  */
        !           921:        uint16_t brtime_id;             /* word 18 */
        !           922: #define                CFSCSIID        0x000f  /* host adapter SCSI ID */
        !           923: /*             UNUSED          0x00f0  */
        !           924: #define                CFBRTIME        0xff00  /* bus release time/PCI Latency Time */
        !           925:
        !           926: /*
        !           927:  * Maximum targets
        !           928:  */
        !           929:        uint16_t max_targets;           /* word 19 */
        !           930: #define                CFMAXTARG       0x00ff  /* maximum targets */
        !           931: #define                CFBOOTLUN       0x0f00  /* Lun to boot from */
        !           932: #define                CFBOOTID        0xf000  /* Target to boot from */
        !           933:        uint16_t res_1[10];             /* words 20-29 */
        !           934:        uint16_t signature;             /* BIOS Signature */
        !           935: #define                CFSIGNATURE     0x400
        !           936:        uint16_t checksum;              /* word 31 */
        !           937: };
        !           938:
        !           939: /*
        !           940:  * Vital Product Data used during POST and by the BIOS.
        !           941:  */
        !           942: struct vpd_config {
        !           943:        uint8_t  bios_flags;
        !           944: #define                VPDMASTERBIOS   0x0001
        !           945: #define                VPDBOOTHOST     0x0002
        !           946:        uint8_t  reserved_1[21];
        !           947:        uint8_t  resource_type;
        !           948:        uint8_t  resource_len[2];
        !           949:        uint8_t  resource_data[8];
        !           950:        uint8_t  vpd_tag;
        !           951:        uint16_t vpd_len;
        !           952:        uint8_t  vpd_keyword[2];
        !           953:        uint8_t  length;
        !           954:        uint8_t  revision;
        !           955:        uint8_t  device_flags;
        !           956:        uint8_t  termnation_menus[2];
        !           957:        uint8_t  fifo_threshold;
        !           958:        uint8_t  end_tag;
        !           959:        uint8_t  vpd_checksum;
        !           960:        uint16_t default_target_flags;
        !           961:        uint16_t default_bios_flags;
        !           962:        uint16_t default_ctrl_flags;
        !           963:        uint8_t  default_irq;
        !           964:        uint8_t  pci_lattime;
        !           965:        uint8_t  max_target;
        !           966:        uint8_t  boot_lun;
        !           967:        uint16_t signature;
        !           968:        uint8_t  reserved_2;
        !           969:        uint8_t  checksum;
        !           970:        uint8_t  reserved_3[4];
        !           971: };
        !           972:
        !           973: /****************************** Flexport Logic ********************************/
        !           974: #define FLXADDR_TERMCTL                        0x0
        !           975: #define                FLX_TERMCTL_ENSECHIGH   0x8
        !           976: #define                FLX_TERMCTL_ENSECLOW    0x4
        !           977: #define                FLX_TERMCTL_ENPRIHIGH   0x2
        !           978: #define                FLX_TERMCTL_ENPRILOW    0x1
        !           979: #define FLXADDR_ROMSTAT_CURSENSECTL    0x1
        !           980: #define                FLX_ROMSTAT_SEECFG      0xF0
        !           981: #define                FLX_ROMSTAT_EECFG       0x0F
        !           982: #define                FLX_ROMSTAT_SEE_93C66   0x00
        !           983: #define                FLX_ROMSTAT_SEE_NONE    0xF0
        !           984: #define                FLX_ROMSTAT_EE_512x8    0x0
        !           985: #define                FLX_ROMSTAT_EE_1MBx8    0x1
        !           986: #define                FLX_ROMSTAT_EE_2MBx8    0x2
        !           987: #define                FLX_ROMSTAT_EE_4MBx8    0x3
        !           988: #define                FLX_ROMSTAT_EE_16MBx8   0x4
        !           989: #define                CURSENSE_ENB    0x1
        !           990: #define        FLXADDR_FLEXSTAT                0x2
        !           991: #define                FLX_FSTAT_BUSY          0x1
        !           992: #define FLXADDR_CURRENT_STAT           0x4
        !           993: #define                FLX_CSTAT_SEC_HIGH      0xC0
        !           994: #define                FLX_CSTAT_SEC_LOW       0x30
        !           995: #define                FLX_CSTAT_PRI_HIGH      0x0C
        !           996: #define                FLX_CSTAT_PRI_LOW       0x03
        !           997: #define                FLX_CSTAT_MASK          0x03
        !           998: #define                FLX_CSTAT_SHIFT         2
        !           999: #define                FLX_CSTAT_OKAY          0x0
        !          1000: #define                FLX_CSTAT_OVER          0x1
        !          1001: #define                FLX_CSTAT_UNDER         0x2
        !          1002: #define                FLX_CSTAT_INVALID       0x3
        !          1003:
        !          1004: int            ahd_read_seeprom(struct ahd_softc *ahd, uint16_t *buf,
        !          1005:                                 u_int start_addr, u_int count, int bstream);
        !          1006:
        !          1007: int            ahd_write_seeprom(struct ahd_softc *ahd, uint16_t *buf,
        !          1008:                                  u_int start_addr, u_int count);
        !          1009: int            ahd_wait_seeprom(struct ahd_softc *ahd);
        !          1010: int            ahd_verify_vpd_cksum(struct vpd_config *vpd);
        !          1011: int            ahd_verify_cksum(struct seeprom_config *sc);
        !          1012: int            ahd_acquire_seeprom(struct ahd_softc *ahd);
        !          1013: void           ahd_release_seeprom(struct ahd_softc *ahd);
        !          1014:
        !          1015: /****************************  Message Buffer *********************************/
        !          1016: typedef enum {
        !          1017:        MSG_FLAG_NONE                   = 0x00,
        !          1018:        MSG_FLAG_EXPECT_PPR_BUSFREE     = 0x01,
        !          1019:        MSG_FLAG_IU_REQ_CHANGED         = 0x02,
        !          1020:        MSG_FLAG_EXPECT_IDE_BUSFREE     = 0x04,
        !          1021:        MSG_FLAG_EXPECT_QASREJ_BUSFREE  = 0x08,
        !          1022:        MSG_FLAG_PACKETIZED             = 0x10
        !          1023: } ahd_msg_flags;
        !          1024:
        !          1025: typedef enum {
        !          1026:        MSG_TYPE_NONE                   = 0x00,
        !          1027:        MSG_TYPE_INITIATOR_MSGOUT       = 0x01,
        !          1028:        MSG_TYPE_INITIATOR_MSGIN        = 0x02,
        !          1029:        MSG_TYPE_TARGET_MSGOUT          = 0x03,
        !          1030:        MSG_TYPE_TARGET_MSGIN           = 0x04
        !          1031: } ahd_msg_type;
        !          1032:
        !          1033: typedef enum {
        !          1034:        MSGLOOP_IN_PROG,
        !          1035:        MSGLOOP_MSGCOMPLETE,
        !          1036:        MSGLOOP_TERMINATED
        !          1037: } msg_loop_stat;
        !          1038:
        !          1039: /*********************** Software Configuration Structure *********************/
        !          1040: struct ahd_suspend_channel_state {
        !          1041:        uint8_t scsiseq;
        !          1042:        uint8_t sxfrctl0;
        !          1043:        uint8_t sxfrctl1;
        !          1044:        uint8_t simode0;
        !          1045:        uint8_t simode1;
        !          1046:        uint8_t seltimer;
        !          1047:        uint8_t seqctl;
        !          1048: };
        !          1049:
        !          1050: struct ahd_suspend_state {
        !          1051:        struct  ahd_suspend_channel_state channel[2];
        !          1052:        uint8_t optionmode;
        !          1053:        uint8_t dscommand0;
        !          1054:        uint8_t dspcistatus;
        !          1055:        /* hsmailbox */
        !          1056:        uint8_t crccontrol1;
        !          1057:        uint8_t scbbaddr;
        !          1058:        /* Host and sequencer SCB counts */
        !          1059:        uint8_t dff_thrsh;
        !          1060:        uint8_t *scratch_ram;
        !          1061:        uint8_t *btt;
        !          1062: };
        !          1063:
        !          1064: typedef void (*ahd_bus_intr_t)(struct ahd_softc *);
        !          1065:
        !          1066: typedef enum {
        !          1067:        AHD_MODE_DFF0,
        !          1068:        AHD_MODE_DFF1,
        !          1069:        AHD_MODE_CCHAN,
        !          1070:        AHD_MODE_SCSI,
        !          1071:        AHD_MODE_CFG,
        !          1072:        AHD_MODE_UNKNOWN
        !          1073: } ahd_mode;
        !          1074:
        !          1075: #define AHD_MK_MSK(x) (0x01 << (x))
        !          1076: #define AHD_MODE_DFF0_MSK      AHD_MK_MSK(AHD_MODE_DFF0)
        !          1077: #define AHD_MODE_DFF1_MSK      AHD_MK_MSK(AHD_MODE_DFF1)
        !          1078: #define AHD_MODE_CCHAN_MSK     AHD_MK_MSK(AHD_MODE_CCHAN)
        !          1079: #define AHD_MODE_SCSI_MSK      AHD_MK_MSK(AHD_MODE_SCSI)
        !          1080: #define AHD_MODE_CFG_MSK       AHD_MK_MSK(AHD_MODE_CFG)
        !          1081: #define AHD_MODE_UNKNOWN_MSK   AHD_MK_MSK(AHD_MODE_UNKNOWN)
        !          1082: #define AHD_MODE_ANY_MSK (~0)
        !          1083:
        !          1084: typedef uint8_t ahd_mode_state;
        !          1085:
        !          1086: typedef void ahd_callback_t (void *);
        !          1087:
        !          1088: struct ahd_completion
        !          1089: {
        !          1090:        uint16_t        tag;
        !          1091:        uint8_t         sg_status;
        !          1092:        uint8_t         valid_tag;
        !          1093: };
        !          1094:
        !          1095: #define AIC_SCB_DATA(softc) (&(softc)->scb_data)
        !          1096:
        !          1097: struct ahd_softc {
        !          1098:        struct device           sc_dev;
        !          1099:        struct scsi_link        sc_channel;
        !          1100:        struct device *         sc_child;
        !          1101:
        !          1102:        bus_space_tag_t         tags[2];
        !          1103:        bus_space_handle_t      bshs[2];
        !          1104:
        !          1105: #ifndef __linux__
        !          1106:        bus_dma_tag_t             buffer_dmat;   /* dmat for buffer I/O */
        !          1107: #endif
        !          1108:        void                    *shutdown_hook;
        !          1109:        struct scb_data         scb_data;
        !          1110:
        !          1111:        struct hardware_scb      *next_queued_hscb;
        !          1112:        struct map_node          *next_queued_hscb_map;
        !          1113:
        !          1114:        /*
        !          1115:         * SCBs that have been sent to the controller
        !          1116:         */
        !          1117:        LIST_HEAD(, scb)          pending_scbs;
        !          1118:
        !          1119:        /*
        !          1120:         * SCBs whose timeout routine has been called.
        !          1121:         */
        !          1122:        LIST_HEAD(, scb)          timedout_scbs;
        !          1123:
        !          1124:        /*
        !          1125:         * Current register window mode information.
        !          1126:         */
        !          1127:        ahd_mode                  dst_mode;
        !          1128:        ahd_mode                  src_mode;
        !          1129:
        !          1130:        /*
        !          1131:         * Saved register window mode information
        !          1132:         * used for restore on next unpause.
        !          1133:         */
        !          1134:        ahd_mode                  saved_dst_mode;
        !          1135:        ahd_mode                  saved_src_mode;
        !          1136:
        !          1137:        /*
        !          1138:         * Platform specific data.
        !          1139:         */
        !          1140:        struct ahd_platform_data *platform_data;
        !          1141:
        !          1142:        /*
        !          1143:         * Platform specific device information.
        !          1144:         */
        !          1145:        ahd_dev_softc_t           dev_softc;
        !          1146:
        !          1147:        /*
        !          1148:         * Bus specific device information.
        !          1149:         */
        !          1150:        ahd_bus_intr_t            bus_intr;
        !          1151:
        !          1152:        /*
        !          1153:         * Target mode related state kept on a per enabled lun basis.
        !          1154:         * Targets that are not enabled will have null entries.
        !          1155:         * As an initiator, we keep one target entry for our initiator
        !          1156:         * ID to store our sync/wide transfer settings.
        !          1157:         */
        !          1158:        struct ahd_tmode_tstate  *enabled_targets[AHD_NUM_TARGETS];
        !          1159:
        !          1160:        char                    inited_target[AHD_NUM_TARGETS];
        !          1161:
        !          1162:        /*
        !          1163:         * The black hole device responsible for handling requests for
        !          1164:         * disabled luns on enabled targets.
        !          1165:         */
        !          1166:        struct ahd_tmode_lstate  *black_hole;
        !          1167:
        !          1168:        /*
        !          1169:         * Device instance currently on the bus awaiting a continue TIO
        !          1170:         * for a command that was not given the disconnect priveledge.
        !          1171:         */
        !          1172:        struct ahd_tmode_lstate  *pending_device;
        !          1173:
        !          1174:        /*
        !          1175:         * Timer handles for timer driven callbacks.
        !          1176:         */
        !          1177:        aic_timer_t               reset_timer;
        !          1178:        aic_timer_t               stat_timer;
        !          1179:
        !          1180:        /*
        !          1181:         * Statistics.
        !          1182:         */
        !          1183: #define        AHD_STAT_UPDATE_MS      250
        !          1184: #define        AHD_STAT_BUCKETS        4
        !          1185:        u_int                     cmdcmplt_bucket;
        !          1186:        uint32_t                  cmdcmplt_counts[AHD_STAT_BUCKETS];
        !          1187:        uint32_t                  cmdcmplt_total;
        !          1188:
        !          1189:        /*
        !          1190:         * Card characteristics
        !          1191:         */
        !          1192:        ahd_chip                  chip;
        !          1193:        ahd_feature               features;
        !          1194:        ahd_bug                   bugs;
        !          1195:        ahd_flag                  flags;
        !          1196:        struct seeprom_config    *seep_config;
        !          1197:
        !          1198:        /* Command Queues */
        !          1199:        struct ahd_completion    *qoutfifo;
        !          1200:        uint16_t                  qoutfifonext;
        !          1201:        uint16_t                  qoutfifonext_valid_tag;
        !          1202:        uint16_t                  qinfifonext;
        !          1203:        uint16_t                  qinfifo[AHD_SCB_MAX];
        !          1204:
        !          1205:        /*
        !          1206:         * Our qfreeze count.  The sequencer compares
        !          1207:         * this value with its own counter to determine
        !          1208:         * whether to allow selections to occur.
        !          1209:         */
        !          1210:        uint16_t                  qfreeze_cnt;
        !          1211:
        !          1212:        /* Values to store in the SEQCTL register for pause and unpause */
        !          1213:        uint8_t                   unpause;
        !          1214:        uint8_t                   pause;
        !          1215:
        !          1216:        /* Critical Section Data */
        !          1217:        struct cs                *critical_sections;
        !          1218:        u_int                     num_critical_sections;
        !          1219:
        !          1220:        /* Buffer for handling packetized bitbucket. */
        !          1221:        uint8_t                  *overrun_buf;
        !          1222:
        !          1223:        /* Links for chaining softcs */
        !          1224:        TAILQ_ENTRY(ahd_softc)    links;
        !          1225:
        !          1226:        /* Channel Names ('A', 'B', etc.) */
        !          1227:        char                      channel;
        !          1228:
        !          1229:        /* Initiator Bus ID */
        !          1230:        uint8_t                   our_id;
        !          1231:
        !          1232:        /*
        !          1233:         * Target incoming command FIFO.
        !          1234:         */
        !          1235:        struct target_cmd        *targetcmds;
        !          1236:        uint8_t                   tqinfifonext;
        !          1237:
        !          1238:        /*
        !          1239:         * Cached verson of the hs_mailbox so we can avoid
        !          1240:         * pausing the sequencer during mailbox updates.
        !          1241:         */
        !          1242:        uint8_t                   hs_mailbox;
        !          1243:
        !          1244:        /*
        !          1245:         * Incoming and outgoing message handling.
        !          1246:         */
        !          1247:        uint8_t                   send_msg_perror;
        !          1248:        ahd_msg_flags             msg_flags;
        !          1249:        ahd_msg_type              msg_type;
        !          1250:        uint8_t                   msgout_buf[12];/* Message we are sending */
        !          1251:        uint8_t                   msgin_buf[12];/* Message we are receiving */
        !          1252:        u_int                     msgout_len;   /* Length of message to send */
        !          1253:        u_int                     msgout_index; /* Current index in msgout */
        !          1254:        u_int                     msgin_index;  /* Current index in msgin */
        !          1255:
        !          1256:        /*
        !          1257:         * Mapping information for data structures shared
        !          1258:         * between the sequencer and kernel.
        !          1259:         */
        !          1260:        bus_dma_tag_t             parent_dmat;
        !          1261:        struct map_node           shared_data_map;
        !          1262:
        !          1263:        /* Information saved through suspend/resume cycles */
        !          1264:        struct ahd_suspend_state  suspend_state;
        !          1265:
        !          1266:        /* Number of enabled target mode device on this card */
        !          1267:        u_int                     enabled_luns;
        !          1268:
        !          1269:        /* Initialization level of this data structure */
        !          1270:        u_int                     init_level;
        !          1271:
        !          1272:        /* PCI cacheline size. */
        !          1273:        u_int                     pci_cachesize;
        !          1274:
        !          1275:        /* IO Cell Parameters */
        !          1276:        uint8_t                   iocell_opts[AHD_NUM_PER_DEV_ANNEXCOLS];
        !          1277:
        !          1278:        u_int                     stack_size;
        !          1279:        uint16_t                 *saved_stack;
        !          1280:
        !          1281:        /* Per-Unit descriptive information */
        !          1282:        const char               *bus_description;
        !          1283:        char                     *name;
        !          1284:        int                       unit;
        !          1285:
        !          1286:        /* Selection Timer settings */
        !          1287:        int                       seltime;
        !          1288:
        !          1289:        /*
        !          1290:         * Interrupt coalescing settings.
        !          1291:         */
        !          1292: #define        AHD_INT_COALESCING_TIMER_DEFAULT                250 /*us*/
        !          1293: #define        AHD_INT_COALESCING_MAXCMDS_DEFAULT              10
        !          1294: #define        AHD_INT_COALESCING_MAXCMDS_MAX                  127
        !          1295: #define        AHD_INT_COALESCING_MINCMDS_DEFAULT              5
        !          1296: #define        AHD_INT_COALESCING_MINCMDS_MAX                  127
        !          1297: #define        AHD_INT_COALESCING_THRESHOLD_DEFAULT            2000
        !          1298: #define        AHD_INT_COALESCING_STOP_THRESHOLD_DEFAULT       1000
        !          1299:        u_int                     int_coalescing_timer;
        !          1300:        u_int                     int_coalescing_maxcmds;
        !          1301:        u_int                     int_coalescing_mincmds;
        !          1302:        u_int                     int_coalescing_threshold;
        !          1303:        u_int                     int_coalescing_stop_threshold;
        !          1304:
        !          1305:        uint16_t                  user_discenable;/* Disconnection allowed  */
        !          1306:        uint16_t                  user_tagenable;/* Tagged Queuing allowed */
        !          1307:
        !          1308:        /* Adapter interrupt routine */
        !          1309:        void                      *ih;
        !          1310:        int                        pcix_off;
        !          1311: };
        !          1312:
        !          1313: TAILQ_HEAD(ahd_softc_tailq, ahd_softc);
        !          1314: extern struct ahd_softc_tailq ahd_tailq;
        !          1315:
        !          1316: /*************************** IO Cell Configuration ****************************/
        !          1317: #define        AHD_PRECOMP_SLEW_INDEX                                          \
        !          1318:     (AHD_ANNEXCOL_PRECOMP_SLEW - AHD_ANNEXCOL_PER_DEV0)
        !          1319:
        !          1320: #define        AHD_AMPLITUDE_INDEX                                             \
        !          1321:     (AHD_ANNEXCOL_AMPLITUDE - AHD_ANNEXCOL_PER_DEV0)
        !          1322:
        !          1323: #define AHD_SET_SLEWRATE(ahd, new_slew)                                        \
        !          1324: do {                                                                   \
        !          1325:     (ahd)->iocell_opts[AHD_PRECOMP_SLEW_INDEX] &= ~AHD_SLEWRATE_MASK;  \
        !          1326:     (ahd)->iocell_opts[AHD_PRECOMP_SLEW_INDEX] |=                      \
        !          1327:        (((new_slew) << AHD_SLEWRATE_SHIFT) & AHD_SLEWRATE_MASK);       \
        !          1328: } while (0)
        !          1329:
        !          1330: #define AHD_SET_PRECOMP(ahd, new_pcomp)                                        \
        !          1331: do {                                                                   \
        !          1332:     (ahd)->iocell_opts[AHD_PRECOMP_SLEW_INDEX] &= ~AHD_PRECOMP_MASK;   \
        !          1333:     (ahd)->iocell_opts[AHD_PRECOMP_SLEW_INDEX] |=                      \
        !          1334:        (((new_pcomp) << AHD_PRECOMP_SHIFT) & AHD_PRECOMP_MASK);        \
        !          1335: } while (0)
        !          1336:
        !          1337: #define AHD_SET_AMPLITUDE(ahd, new_amp)                                        \
        !          1338: do {                                                                   \
        !          1339:     (ahd)->iocell_opts[AHD_AMPLITUDE_INDEX] &= ~AHD_AMPLITUDE_MASK;    \
        !          1340:     (ahd)->iocell_opts[AHD_AMPLITUDE_INDEX] |=                         \
        !          1341:        (((new_amp) << AHD_AMPLITUDE_SHIFT) & AHD_AMPLITUDE_MASK);      \
        !          1342: } while (0)
        !          1343:
        !          1344: /************************ Active Device Information ***************************/
        !          1345: typedef enum {
        !          1346:        ROLE_UNKNOWN,
        !          1347:        ROLE_INITIATOR,
        !          1348:        ROLE_TARGET
        !          1349: } role_t;
        !          1350:
        !          1351: struct ahd_devinfo {
        !          1352:        int      our_scsiid;
        !          1353:        int      target_offset;
        !          1354:        uint16_t target_mask;
        !          1355:        u_int    target;
        !          1356:        u_int    lun;
        !          1357:        char     channel;
        !          1358:        role_t   role;          /*
        !          1359:                                 * Only guaranteed to be correct if not
        !          1360:                                 * in the busfree state.
        !          1361:                                 */
        !          1362: };
        !          1363:
        !          1364: /****************************** PCI Structures ********************************/
        !          1365: #define AHD_PCI_IOADDR PCI_MAPREG_START        /* I/O BAR*/
        !          1366: #define AHD_PCI_MEMADDR (PCI_MAPREG_START + 4)  /* Memory BAR */
        !          1367: #define AHD_PCI_IOADDR1 (PCI_MAPREG_START + 12)/* Second I/O BAR */
        !          1368:
        !          1369: typedef int (ahd_device_setup_t)(struct ahd_softc *, struct pci_attach_args *pa);
        !          1370:
        !          1371: struct ahd_pci_identity {
        !          1372:        uint64_t                 full_id;
        !          1373:        uint64_t                 id_mask;
        !          1374:        ahd_device_setup_t      *setup;
        !          1375: };
        !          1376: extern struct ahd_pci_identity ahd_pci_ident_table [];
        !          1377: extern const u_int ahd_num_pci_devs;
        !          1378:
        !          1379: /*************************** Function Declarations ****************************/
        !          1380: /******************************************************************************/
        !          1381: void                   ahd_reset_cmds_pending(struct ahd_softc *ahd);
        !          1382: u_int                  ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl);
        !          1383: void                   ahd_busy_tcl(struct ahd_softc *ahd,
        !          1384:                                     u_int tcl, u_int busyid);
        !          1385: void                   ahd_unbusy_tcl(struct ahd_softc *ahd, u_int tcl);
        !          1386:
        !          1387: /***************************** PCI Front End *********************************/
        !          1388: const struct ahd_pci_identity * ahd_find_pci_device(pcireg_t, pcireg_t);
        !          1389: int                      ahd_pci_config(struct ahd_softc *,
        !          1390:                                         struct ahd_pci_identity *);
        !          1391: int    ahd_pci_test_register_access(struct ahd_softc *);
        !          1392:
        !          1393: /************************** SCB and SCB queue management **********************/
        !          1394: int            ahd_probe_scbs(struct ahd_softc *);
        !          1395: void           ahd_qinfifo_requeue_tail(struct ahd_softc *ahd,
        !          1396:                                         struct scb *scb);
        !          1397: int            ahd_match_scb(struct ahd_softc *ahd, struct scb *scb,
        !          1398:                              int target, char channel, int lun,
        !          1399:                              u_int tag, role_t role);
        !          1400:
        !          1401: /****************************** Initialization ********************************/
        !          1402: struct ahd_softc       *ahd_alloc(void *platform_arg, char *name);
        !          1403: int                     ahd_softc_init(struct ahd_softc *);
        !          1404: void                    ahd_controller_info(struct ahd_softc *ahd, char *buf,
        !          1405:                                             size_t bufsz);
        !          1406: int                     ahd_init(struct ahd_softc *ahd);
        !          1407: int                     ahd_default_config(struct ahd_softc *ahd);
        !          1408: int                     ahd_parse_vpddata(struct ahd_softc *ahd,
        !          1409:                                           struct vpd_config *vpd);
        !          1410: int                     ahd_parse_cfgdata(struct ahd_softc *ahd,
        !          1411:                                           struct seeprom_config *sc);
        !          1412: void                    ahd_intr_enable(struct ahd_softc *ahd, int enable);
        !          1413: void                    ahd_update_coalescing_values(struct ahd_softc *ahd,
        !          1414:                                                      u_int timer,
        !          1415:                                                      u_int maxcmds,
        !          1416:                                                      u_int mincmds);
        !          1417: void                    ahd_enable_coalescing(struct ahd_softc *ahd,
        !          1418:                                               int enable);
        !          1419: void                    ahd_pause_and_flushwork(struct ahd_softc *ahd);
        !          1420: int                     ahd_suspend(struct ahd_softc *ahd);
        !          1421: int                     ahd_resume(struct ahd_softc *ahd);
        !          1422: void                    ahd_softc_insert(struct ahd_softc *);
        !          1423: struct ahd_softc       *ahd_find_softc(struct ahd_softc *ahd);
        !          1424: void                    ahd_set_unit(struct ahd_softc *, int);
        !          1425: void                    ahd_set_name(struct ahd_softc *, char *);
        !          1426: struct scb             *ahd_get_scb(struct ahd_softc *ahd, u_int col_idx);
        !          1427: void                    ahd_free_scb(struct ahd_softc *ahd, struct scb *scb);
        !          1428: void                    ahd_alloc_scbs(struct ahd_softc *ahd);
        !          1429: void                    ahd_free(struct ahd_softc *ahd);
        !          1430: int                     ahd_reset(struct ahd_softc *ahd, int reinit);
        !          1431: void                    ahd_shutdown(void *arg);
        !          1432: int                     ahd_write_flexport(struct ahd_softc *ahd,
        !          1433:                                            u_int addr, u_int value);
        !          1434: int                     ahd_read_flexport(struct ahd_softc *ahd, u_int addr,
        !          1435:                                           uint8_t *value);
        !          1436: int                     ahd_wait_flexport(struct ahd_softc *ahd);
        !          1437:
        !          1438: /*************************** Interrupt Services *******************************/
        !          1439: void                   ahd_pci_intr(struct ahd_softc *ahd);
        !          1440: void                   ahd_clear_intstat(struct ahd_softc *ahd);
        !          1441: void                   ahd_flush_qoutfifo(struct ahd_softc *ahd);
        !          1442: void                   ahd_run_qoutfifo(struct ahd_softc *ahd);
        !          1443: #ifdef AHD_TARGET_MODE
        !          1444: void                   ahd_run_tqinfifo(struct ahd_softc *ahd, int paused);
        !          1445: #endif
        !          1446: void                   ahd_handle_hwerrint(struct ahd_softc *ahd);
        !          1447: void                   ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat);
        !          1448: void                   ahd_handle_scsiint(struct ahd_softc *ahd,
        !          1449:                                           u_int intstat);
        !          1450: void                   ahd_clear_critical_section(struct ahd_softc *ahd);
        !          1451:
        !          1452: /***************************** Error Recovery *********************************/
        !          1453: typedef enum {
        !          1454:        SEARCH_COMPLETE,
        !          1455:        SEARCH_COUNT,
        !          1456:        SEARCH_REMOVE,
        !          1457:        SEARCH_PRINT
        !          1458: } ahd_search_action;
        !          1459: void                   ahd_done_with_status(struct ahd_softc *ahd,
        !          1460:                                             struct scb *scb, uint32_t status);
        !          1461: int                    ahd_search_qinfifo(struct ahd_softc *ahd, int target,
        !          1462:                                           char channel, int lun, u_int tag,
        !          1463:                                           role_t role, uint32_t status,
        !          1464:                                           ahd_search_action action);
        !          1465: int                    ahd_search_disc_list(struct ahd_softc *ahd, int target,
        !          1466:                                             char channel, int lun, u_int tag,
        !          1467:                                             int stop_on_first, int remove,
        !          1468:                                             int save_state);
        !          1469: void                   ahd_freeze_devq(struct ahd_softc *ahd, struct scb *scb);
        !          1470: int                    ahd_reset_channel(struct ahd_softc *ahd, char channel,
        !          1471:                                          int initiate_reset);
        !          1472: int                    ahd_abort_scbs(struct ahd_softc *ahd, int target,
        !          1473:                                       char channel, int lun, u_int tag,
        !          1474:                                       role_t role, uint32_t status);
        !          1475: void                   ahd_restart(struct ahd_softc *ahd);
        !          1476: void                   ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo);
        !          1477: void                   ahd_handle_scb_status(struct ahd_softc *ahd,
        !          1478:                                              struct scb *scb);
        !          1479: void                   ahd_handle_scsi_status(struct ahd_softc *ahd,
        !          1480:                                               struct scb *scb);
        !          1481: void                   ahd_calc_residual(struct ahd_softc *ahd,
        !          1482:                                          struct scb *scb);
        !          1483: void                   ahd_timeout(void *);
        !          1484: /*************************** Utility Functions ********************************/
        !          1485: struct ahd_phase_table_entry*
        !          1486:                        ahd_lookup_phase_entry(int phase);
        !          1487: void                   ahd_compile_devinfo(struct ahd_devinfo *devinfo,
        !          1488:                                            u_int our_id, u_int target,
        !          1489:                                            u_int lun, char channel,
        !          1490:                                            role_t role);
        !          1491: /************************** Transfer Negotiation ******************************/
        !          1492: void                   ahd_find_syncrate(struct ahd_softc *ahd, u_int *period,
        !          1493:                                          u_int *ppr_options, u_int maxsync);
        !          1494: void                   ahd_validate_offset(struct ahd_softc *ahd,
        !          1495:                                            struct ahd_initiator_tinfo *tinfo,
        !          1496:                                            u_int period, u_int *offset,
        !          1497:                                            int wide, role_t role);
        !          1498: void                   ahd_validate_width(struct ahd_softc *ahd,
        !          1499:                                           struct ahd_initiator_tinfo *tinfo,
        !          1500:                                           u_int *bus_width,
        !          1501:                                           role_t role);
        !          1502: void                    ahd_scb_devinfo(struct ahd_softc *,
        !          1503:                             struct ahd_devinfo *, struct scb *);
        !          1504:
        !          1505: /*
        !          1506:  * Negotiation types.  These are used to qualify if we should renegotiate
        !          1507:  * even if our goal and current transport parameters are identical.
        !          1508:  */
        !          1509: typedef enum {
        !          1510:        AHD_NEG_TO_GOAL,        /* Renegotiate only if goal and curr differ. */
        !          1511:        AHD_NEG_IF_NON_ASYNC,   /* Renegotiate so long as goal is non-async. */
        !          1512:        AHD_NEG_ALWAYS          /* Renegotiat even if goal is async. */
        !          1513: } ahd_neg_type;
        !          1514: int                    ahd_update_neg_request(struct ahd_softc*,
        !          1515:                                               struct ahd_devinfo*,
        !          1516:                                               struct ahd_tmode_tstate*,
        !          1517:                                               struct ahd_initiator_tinfo*,
        !          1518:                                               ahd_neg_type);
        !          1519: void                   ahd_set_width(struct ahd_softc *ahd,
        !          1520:                                      struct ahd_devinfo *devinfo,
        !          1521:                                      u_int width, u_int type, int paused);
        !          1522: void                   ahd_set_syncrate(struct ahd_softc *ahd,
        !          1523:                                         struct ahd_devinfo *devinfo,
        !          1524:                                         u_int period, u_int offset,
        !          1525:                                         u_int ppr_options,
        !          1526:                                         u_int type, int paused);
        !          1527: typedef enum {
        !          1528:        AHD_QUEUE_NONE,
        !          1529:        AHD_QUEUE_BASIC,
        !          1530:        AHD_QUEUE_TAGGED
        !          1531: } ahd_queue_alg;
        !          1532:
        !          1533: void                   ahd_set_tags(struct ahd_softc *ahd,
        !          1534:                                     struct ahd_devinfo *devinfo,
        !          1535:                                     ahd_queue_alg alg);
        !          1536:
        !          1537: /**************************** Target Mode *************************************/
        !          1538: #ifdef AHD_TARGET_MODE
        !          1539: void           ahd_send_lstate_events(struct ahd_softc *,
        !          1540:                                       struct ahd_tmode_lstate *);
        !          1541: void           ahd_handle_en_lun(struct ahd_softc *ahd,
        !          1542:                                  struct cam_sim *sim, union ccb *ccb);
        !          1543: cam_status     ahd_find_tmode_devs(struct ahd_softc *ahd,
        !          1544:                                    struct cam_sim *sim, union ccb *ccb,
        !          1545:                                    struct ahd_tmode_tstate **tstate,
        !          1546:                                    struct ahd_tmode_lstate **lstate,
        !          1547:                                    int notfound_failure);
        !          1548: #ifndef AHD_TMODE_ENABLE
        !          1549: #define AHD_TMODE_ENABLE 0
        !          1550: #endif
        !          1551: #endif
        !          1552: /******************************* Debug ***************************************/
        !          1553: #ifdef AHD_DEBUG
        !          1554: extern uint32_t ahd_debug;
        !          1555: #define AHD_DEBUG_OPTS         0
        !          1556: #define AHD_SHOW_MISC          0x00001
        !          1557: #define AHD_SHOW_SENSE         0x00002
        !          1558: #define AHD_SHOW_RECOVERY      0x00004
        !          1559: #define AHD_DUMP_SEEPROM       0x00008
        !          1560: #define AHD_SHOW_TERMCTL       0x00010
        !          1561: #define AHD_SHOW_MEMORY                0x00020
        !          1562: #define AHD_SHOW_MESSAGES      0x00040
        !          1563: #define AHD_SHOW_MODEPTR       0x00080
        !          1564: #define AHD_SHOW_SELTO         0x00100
        !          1565: #define AHD_SHOW_FIFOS         0x00200
        !          1566: #define AHD_SHOW_QFULL         0x00400
        !          1567: #define        AHD_SHOW_DV             0x00800
        !          1568: #define AHD_SHOW_MASKED_ERRORS 0x01000
        !          1569: #define AHD_SHOW_QUEUE         0x02000
        !          1570: #define AHD_SHOW_TQIN          0x04000
        !          1571: #define AHD_SHOW_SG            0x08000
        !          1572: #define AHD_SHOW_INT_COALESCING        0x10000
        !          1573: #define AHD_DEBUG_SEQUENCER    0x20000
        !          1574: #endif
        !          1575: void                   ahd_print_scb(struct scb *scb);
        !          1576: void                   ahd_print_devinfo(struct ahd_softc *ahd,
        !          1577:                                          struct ahd_devinfo *devinfo);
        !          1578: void                   ahd_dump_sglist(struct scb *scb);
        !          1579: void                   ahd_dump_all_cards_state(void);
        !          1580: void                   ahd_dump_card_state(struct ahd_softc *ahd);
        !          1581: int                    ahd_print_register(ahd_reg_parse_entry_t *table,
        !          1582:                                           u_int num_entries,
        !          1583:                                           const char *name,
        !          1584:                                           u_int address,
        !          1585:                                           u_int value,
        !          1586:                                           u_int *cur_column,
        !          1587:                                           u_int wrap_point);
        !          1588: void                   ahd_dump_scbs(struct ahd_softc *ahd);
        !          1589:
        !          1590: #endif /* _AIC79XX_H_ */

CVSweb