[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

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