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

Annotation of sys/dev/ic/aacreg.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: aacreg.h,v 1.8 2006/04/22 02:36:26 brad Exp $ */
                      2:
                      3: /*-
                      4:  * Copyright (c) 2000 Michael Smith
                      5:  * Copyright (c) 2000-2001 Scott Long
                      6:  * Copyright (c) 2000 BSDi
                      7:  * Copyright (c) 2001 Adaptec, Inc.
                      8:  * Copyright (c) 2000 Niklas Hallqvist
                      9:  * All rights reserved.
                     10:  *
                     11:  * Redistribution and use in source and binary forms, with or without
                     12:  * modification, are permitted provided that the following conditions
                     13:  * are met:
                     14:  * 1. Redistributions of source code must retain the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer.
                     16:  * 2. Redistributions in binary form must reproduce the above copyright
                     17:  *    notice, this list of conditions and the following disclaimer in the
                     18:  *    documentation and/or other materials provided with the distribution.
                     19:  *
                     20:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                     21:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     22:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     23:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
                     24:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     25:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     26:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     27:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     28:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     29:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     30:  * SUCH DAMAGE.
                     31:  *
                     32:  *     $FreeBSD$
                     33:  */
                     34:
                     35: /*
                     36:  * Data structures defining the interface between the driver and the Adaptec
                     37:  * 'FSA' adapters.  Note that many field names and comments here are taken
                     38:  * verbatim from the Adaptec driver source in order to make comparing the
                     39:  * two slightly easier.
                     40:  */
                     41:
                     42: /*
                     43:  * Misc. magic numbers.
                     44:  */
                     45: #define AAC_MAX_CONTAINERS     64
                     46: #define AAC_BLOCK_SIZE         512
                     47:
                     48: /*
                     49:  * Communications interface.
                     50:  *
                     51:  * Where datastructure layouts are closely parallel to the Adaptec sample code,
                     52:  * retain their naming conventions (for now) to aid in cross-referencing.
                     53:  */
                     54:
                     55: /*
                     56:  * We establish 4 command queues and matching response queues.  Queues must
                     57:  * be 16-byte aligned, and are sized as follows:
                     58:  */
                     59: #define AAC_HOST_NORM_CMD_ENTRIES      8       /* command adapter->host,
                     60:                                                 * normal priority */
                     61: #define AAC_HOST_HIGH_CMD_ENTRIES      4       /* command adapter->host,
                     62:                                                 * high priority */
                     63: #define AAC_ADAP_NORM_CMD_ENTRIES      512     /* command host->adapter,
                     64:                                                 * normal priority */
                     65: #define AAC_ADAP_HIGH_CMD_ENTRIES      4       /* command host->adapter,
                     66:                                                 * high priority */
                     67: #define AAC_HOST_NORM_RESP_ENTRIES     512     /* response, adapter->host,
                     68:                                                 * normal priority */
                     69: #define AAC_HOST_HIGH_RESP_ENTRIES     4       /* response, adapter->host,
                     70:                                                 * high priority */
                     71: #define AAC_ADAP_NORM_RESP_ENTRIES     8       /* response, host->adapter,
                     72:                                                 * normal priority */
                     73: #define AAC_ADAP_HIGH_RESP_ENTRIES     4       /* response, host->adapter,
                     74:                                                 * high priority */
                     75:
                     76: #define AAC_TOTALQ_LENGTH      (AAC_HOST_HIGH_CMD_ENTRIES +    \
                     77:                                 AAC_HOST_NORM_CMD_ENTRIES +    \
                     78:                                 AAC_ADAP_HIGH_CMD_ENTRIES +    \
                     79:                                 AAC_ADAP_NORM_CMD_ENTRIES +    \
                     80:                                 AAC_HOST_HIGH_RESP_ENTRIES +   \
                     81:                                 AAC_HOST_NORM_RESP_ENTRIES +   \
                     82:                                 AAC_ADAP_HIGH_RESP_ENTRIES +   \
                     83:                                 AAC_ADAP_NORM_RESP_ENTRIES)
                     84: #define AAC_QUEUE_COUNT                8
                     85: #define AAC_QUEUE_ALIGN                16
                     86:
                     87: struct aac_queue_entry {
                     88:        u_int32_t       aq_fib_size;    /* FIB size in bytes */
                     89:        u_int32_t       aq_fib_addr;    /* receiver-space address of the FIB */
                     90: } __attribute__ ((__packed__));
                     91:
                     92: #define AAC_PRODUCER_INDEX     0
                     93: #define AAC_CONSUMER_INDEX     1
                     94:
                     95: /*
                     96:  * Table of queue indices and queues used to communicate with the
                     97:  * controller.  This structure must be aligned to AAC_QUEUE_ALIGN
                     98:  */
                     99: struct aac_queue_table {
                    100:        /* queue consumer/producer indexes (layout mandated by adapter) */
                    101:        u_int32_t                       qt_qindex[AAC_QUEUE_COUNT][2];
                    102:
                    103:        /* queue entry structures (layout mandated by adapter) */
                    104:        struct aac_queue_entry qt_HostNormCmdQueue [AAC_HOST_NORM_CMD_ENTRIES];
                    105:        struct aac_queue_entry qt_HostHighCmdQueue [AAC_HOST_HIGH_CMD_ENTRIES];
                    106:        struct aac_queue_entry qt_AdapNormCmdQueue [AAC_ADAP_NORM_CMD_ENTRIES];
                    107:        struct aac_queue_entry qt_AdapHighCmdQueue [AAC_ADAP_HIGH_CMD_ENTRIES];
                    108:        struct aac_queue_entry qt_HostNormRespQueue[AAC_HOST_NORM_RESP_ENTRIES];
                    109:        struct aac_queue_entry qt_HostHighRespQueue[AAC_HOST_HIGH_RESP_ENTRIES];
                    110:        struct aac_queue_entry qt_AdapNormRespQueue[AAC_ADAP_NORM_RESP_ENTRIES];
                    111:        struct aac_queue_entry qt_AdapHighRespQueue[AAC_ADAP_HIGH_RESP_ENTRIES];
                    112: } __attribute__ ((__packed__));
                    113:
                    114: /*
                    115:  * Queue names
                    116:  *
                    117:  * Note that we base these at 0 in order to use them as array indices.  Adaptec
                    118:  * used base 1 for some unknown reason, and sorted them in a different order.
                    119:  */
                    120: #define AAC_HOST_NORM_CMD_QUEUE                0
                    121: #define AAC_HOST_HIGH_CMD_QUEUE                1
                    122: #define AAC_ADAP_NORM_CMD_QUEUE                2
                    123: #define AAC_ADAP_HIGH_CMD_QUEUE                3
                    124: #define AAC_HOST_NORM_RESP_QUEUE       4
                    125: #define AAC_HOST_HIGH_RESP_QUEUE       5
                    126: #define AAC_ADAP_NORM_RESP_QUEUE       6
                    127: #define AAC_ADAP_HIGH_RESP_QUEUE       7
                    128:
                    129: /*
                    130:  * List structure used to chain FIBs (used by the adapter - we hang FIBs off
                    131:  * our private command structure and don't touch these)
                    132:  */
                    133: struct aac_fib_list_entry {
                    134:        u_int32_t       Flink;
                    135:        u_int32_t       Blink;
                    136: } __attribute__ ((__packed__));
                    137:
                    138: /*
                    139:  * FIB (FSA Interface Block?); this is the datastructure passed between the host
                    140:  * and adapter.
                    141:  */
                    142: struct aac_fib_header {
                    143:        u_int32_t               XferState;
                    144:        u_int16_t               Command;
                    145:        u_int8_t                StructType;
                    146:        u_int8_t                Flags;
                    147:        u_int16_t               Size;
                    148:        u_int16_t               SenderSize;
                    149:        u_int32_t               SenderFibAddress;
                    150:        u_int32_t               ReceiverFibAddress;
                    151:        u_int32_t               SenderData;
                    152:        union {
                    153:                struct {
                    154:                        u_int32_t       ReceiverTimeStart;
                    155:                        u_int32_t       ReceiverTimeDone;
                    156:                } _s;
                    157:                struct aac_fib_list_entry FibLinks;
                    158:        } _u;
                    159: } __attribute__ ((__packed__));
                    160:
                    161: #define AAC_FIB_DATASIZE       (512 - sizeof(struct aac_fib_header))
                    162:
                    163: struct aac_fib {
                    164:        struct aac_fib_header   Header;
                    165:        u_int8_t                        data[AAC_FIB_DATASIZE];
                    166: } __attribute__ ((__packed__));
                    167:
                    168: /*
                    169:  * FIB commands
                    170:  */
                    171: typedef enum {
                    172:        TestCommandResponse =           1,
                    173:        TestAdapterCommand =            2,
                    174:
                    175:        /* lowlevel and comm commands */
                    176:        LastTestCommand =               100,
                    177:        ReinitHostNormCommandQueue =    101,
                    178:        ReinitHostHighCommandQueue =    102,
                    179:        ReinitHostHighRespQueue =       103,
                    180:        ReinitHostNormRespQueue =       104,
                    181:        ReinitAdapNormCommandQueue =    105,
                    182:        ReinitAdapHighCommandQueue =    107,
                    183:        ReinitAdapHighRespQueue =       108,
                    184:        ReinitAdapNormRespQueue =       109,
                    185:        InterfaceShutdown =             110,
                    186:        DmaCommandFib =                 120,
                    187:        StartProfile =                  121,
                    188:        TermProfile =                   122,
                    189:        SpeedTest =                     123,
                    190:        TakeABreakPt =                  124,
                    191:        RequestPerfData =               125,
                    192:        SetInterruptDefTimer=           126,
                    193:        SetInterruptDefCount=           127,
                    194:        GetInterruptDefStatus=          128,
                    195:        LastCommCommand =               129,
                    196:
                    197:        /* filesystem commands */
                    198:        NuFileSystem =                  300,
                    199:        UFS =                           301,
                    200:        HostFileSystem =                302,
                    201:        LastFileSystemCommand =         303,
                    202:
                    203:        /* Container Commands */
                    204:        ContainerCommand =              500,
                    205:        ContainerCommand64 =            501,
                    206:
                    207:        /* Cluster Commands */
                    208:        ClusterCommand =                550,
                    209:
                    210:        /* Scsi Port commands (scsi passthrough) */
                    211:        ScsiPortCommand =               600,
                    212:
                    213:        /* misc house keeping and generic adapter initiated commands */
                    214:        AifRequest =                    700,
                    215:        CheckRevision =                 701,
                    216:        FsaHostShutdown =               702,
                    217:        RequestAdapterInfo =            703,
                    218:        IsAdapterPaused =               704,
                    219:        SendHostTime =                  705,
                    220:        LastMiscCommand =               706
                    221: } AAC_FibCommands;
                    222:
                    223: /*
                    224:  * FIB types
                    225:  */
                    226: #define AAC_FIBTYPE_TFIB       1
                    227: #define AAC_FIBTYPE_TQE                2
                    228: #define AAC_FIBTYPE_TCTPERF    3
                    229:
                    230: /*
                    231:  * FIB transfer state
                    232:  */
                    233: #define AAC_FIBSTATE_HOSTOWNED         (1<<0)  /* owned by the host */
                    234: #define AAC_FIBSTATE_ADAPTEROWNED      (1<<1)  /* owned by the adapter */
                    235: #define AAC_FIBSTATE_INITIALISED       (1<<2)  /* initialised */
                    236: #define AAC_FIBSTATE_EMPTY             (1<<3)  /* empty */
                    237: #define AAC_FIBSTATE_FROMPOOL          (1<<4)  /* allocated from pool */
                    238: #define AAC_FIBSTATE_FROMHOST          (1<<5)  /* sent from the host */
                    239: #define AAC_FIBSTATE_FROMADAP          (1<<6)  /* sent from the adapter */
                    240: #define AAC_FIBSTATE_REXPECTED         (1<<7)  /* response is expected */
                    241: #define AAC_FIBSTATE_RNOTEXPECTED      (1<<8)  /* response is not expected */
                    242: #define AAC_FIBSTATE_DONEADAP          (1<<9)  /* processed by the adapter */
                    243: #define AAC_FIBSTATE_DONEHOST          (1<<10) /* processed by the host */
                    244: #define AAC_FIBSTATE_HIGH              (1<<11) /* high priority */
                    245: #define AAC_FIBSTATE_NORM              (1<<12) /* normal priority */
                    246: #define AAC_FIBSTATE_ASYNC             (1<<13)
                    247: #define AAC_FIBSTATE_ASYNCIO           (1<<13) /* to be removed */
                    248: #define AAC_FIBSTATE_PAGEFILEIO                (1<<14) /* to be removed */
                    249: #define AAC_FIBSTATE_SHUTDOWN          (1<<15)
                    250: #define AAC_FIBSTATE_LAZYWRITE         (1<<16) /* to be removed */
                    251: #define AAC_FIBSTATE_ADAPMICROFIB      (1<<17)
                    252: #define AAC_FIBSTATE_BIOSFIB           (1<<18)
                    253: #define AAC_FIBSTATE_FAST_RESPONSE     (1<<19) /* fast response capable */
                    254: #define AAC_FIBSTATE_APIFIB            (1<<20)
                    255:
                    256: /*
                    257:  * FIB error values
                    258:  */
                    259: #define AAC_ERROR_NORMAL                       0x00
                    260: #define AAC_ERROR_PENDING                      0x01
                    261: #define AAC_ERROR_FATAL                                0x02
                    262: #define AAC_ERROR_INVALID_QUEUE                        0x03
                    263: #define AAC_ERROR_NOENTRIES                    0x04
                    264: #define AAC_ERROR_SENDFAILED                   0x05
                    265: #define AAC_ERROR_INVALID_QUEUE_PRIORITY       0x06
                    266: #define AAC_ERROR_FIB_ALLOCATION_FAILED                0x07
                    267: #define AAC_ERROR_FIB_DEALLOCATION_FAILED      0x08
                    268:
                    269: /*
                    270:  * Adapter Init Structure: this is passed to the adapter with the
                    271:  * AAC_MONKER_INITSTRUCT command to point it at our control structures.
                    272:  */
                    273: struct aac_adapter_init {
                    274:        u_int32_t       InitStructRevision;
                    275: #define AAC_INIT_STRUCT_REVISION               3
                    276:        u_int32_t       MiniPortRevision;
                    277: #define AAC_INIT_STRUCT_MINIPORT_REVISION      1
                    278:        u_int32_t       FilesystemRevision;
                    279:        u_int32_t       CommHeaderAddress;
                    280:        u_int32_t       FastIoCommAreaAddress;
                    281:        u_int32_t       AdapterFibsPhysicalAddress;
                    282:        u_int32_t       AdapterFibsVirtualAddress;
                    283:        u_int32_t       AdapterFibsSize;
                    284:        u_int32_t       AdapterFibAlign;
                    285:        u_int32_t       PrintfBufferAddress;
                    286:        u_int32_t       PrintfBufferSize;
                    287: #define        AAC_PAGE_SIZE                           4096
                    288:        u_int32_t       HostPhysMemPages;
                    289:        u_int32_t       HostElapsedSeconds;
                    290: } __attribute__ ((__packed__));
                    291:
                    292: /*
                    293:  * Shared data types
                    294:  */
                    295: /*
                    296:  * Container types
                    297:  */
                    298: typedef enum {
                    299:        CT_NONE = 0,
                    300:        CT_VOLUME,
                    301:        CT_MIRROR,
                    302:        CT_STRIPE,
                    303:        CT_RAID5,
                    304:        CT_SSRW,
                    305:        CT_SSRO,
                    306:        CT_MORPH,
                    307:        CT_PASSTHRU,
                    308:        CT_RAID4,
                    309:        CT_RAID10,                  /* stripe of mirror */
                    310:        CT_RAID00,                  /* stripe of stripe */
                    311:        CT_VOLUME_OF_MIRRORS,       /* volume of mirror */
                    312:        CT_PSEUDO_RAID3,            /* really raid4 */
                    313:        CT_RAID50,                  /* stripe of raid5 */
                    314: } AAC_FSAVolType;
                    315:
                    316: /*
                    317:  * Host-addressable object types
                    318:  */
                    319: typedef enum {
                    320:        FT_REG = 1,     /* regular file */
                    321:        FT_DIR,         /* directory */
                    322:        FT_BLK,         /* "block" device - reserved */
                    323:        FT_CHR,         /* "character special" device - reserved */
                    324:        FT_LNK,         /* symbolic link */
                    325:        FT_SOCK,        /* socket */
                    326:        FT_FIFO,        /* fifo */
                    327:        FT_FILESYS,     /* ADAPTEC's "FSA"(tm) filesystem */
                    328:        FT_DRIVE,       /* physical disk - addressable in scsi by b/t/l */
                    329:        FT_SLICE,       /* virtual disk - raw volume - slice */
                    330:        FT_PARTITION,   /* FSA partition - carved out of a slice - building
                    331:                         * block for containers */
                    332:        FT_VOLUME,      /* Container - Volume Set */
                    333:        FT_STRIPE,      /* Container - Stripe Set */
                    334:        FT_MIRROR,      /* Container - Mirror Set */
                    335:        FT_RAID5,       /* Container - Raid 5 Set */
                    336:        FT_DATABASE     /* Storage object with "foreign" content manager */
                    337: } AAC_FType;
                    338:
                    339: /*
                    340:  * Host-side scatter/gather list for 32-bit commands.
                    341:  */
                    342: struct aac_sg_entry {
                    343:        u_int32_t       SgAddress;
                    344:        u_int32_t       SgByteCount;
                    345: } __attribute__ ((__packed__));
                    346:
                    347: struct aac_sg_entry64 {
                    348:        u_int64_t       SgAddress;
                    349:        u_int32_t       SgByteCount;
                    350: } __attribute__ ((__packed__));
                    351:
                    352: struct aac_sg_table {
                    353:        u_int32_t               SgCount;
                    354:        struct aac_sg_entry     SgEntry[0];
                    355: } __attribute__ ((__packed__));
                    356:
                    357: /*
                    358:  * Host-side scatter/gather list for 64-bit commands.
                    359:  */
                    360: struct aac_sg_table64 {
                    361:        u_int32_t       SgCount;
                    362:        struct aac_sg_entry64   SgEntry64[0];
                    363: } __attribute__ ((__packed__));
                    364:
                    365: /*
                    366:  * Container creation data
                    367:  */
                    368: struct aac_container_creation {
                    369:        u_int8_t        ViaBuildNumber;
                    370:        u_int8_t        MicroSecond;
                    371:        u_int8_t        Via;            /* 1 = FSU, 2 = API, etc. */
                    372:        u_int8_t        YearsSince1900;
                    373:        u_int32_t       Month:4;        /* 1-12 */
                    374:        u_int32_t       Day:6;          /* 1-32 */
                    375:        u_int32_t       Hour:6;         /* 0-23 */
                    376:        u_int32_t       Minute:6;       /* 0-59 */
                    377:        u_int32_t       Second:6;       /* 0-59 */
                    378:        u_int64_t       ViaAdapterSerialNumber;
                    379: } __attribute__ ((__packed__));
                    380:
                    381: /*
                    382:  * Revision number handling
                    383:  */
                    384:
                    385: typedef enum {
                    386:        RevApplication = 1,
                    387:        RevDkiCli,
                    388:        RevNetService,
                    389:        RevApi,
                    390:        RevFileSysDriver,
                    391:        RevMiniportDriver,
                    392:        RevAdapterSW,
                    393:        RevMonitor,
                    394:        RevRemoteApi
                    395: } RevComponent;
                    396:
                    397: struct FsaRevision {
                    398:        union {
                    399:                struct {
                    400:                        u_int8_t        dash;
                    401:                        u_int8_t        type;
                    402:                        u_int8_t        minor;
                    403:                        u_int8_t        major;
                    404:                } comp;
                    405:                u_int32_t       ul;
                    406:        } external;
                    407:        u_int32_t       buildNumber;
                    408: }  __attribute__ ((__packed__));
                    409:
                    410: /*
                    411:  * Adapter Information
                    412:  */
                    413:
                    414: typedef enum {
                    415:        CPU_NTSIM = 1,
                    416:        CPU_I960,
                    417:        CPU_ARM,
                    418:        CPU_SPARC,
                    419:        CPU_POWERPC,
                    420:        CPU_ALPHA,
                    421:        CPU_P7,
                    422:        CPU_I960_RX,
                    423:        CPU__last
                    424: } AAC_CpuType;
                    425:
                    426: typedef enum {
                    427:        CPUI960_JX = 1,
                    428:        CPUI960_CX,
                    429:        CPUI960_HX,
                    430:        CPUI960_RX,
                    431:        CPUARM_SA110,
                    432:        CPUARM_xxx,
                    433:        CPUMPC_824x,
                    434:        CPUPPC_xxx,
                    435:        CPUI960_302,
                    436:        CPUSUBTYPE__last
                    437: } AAC_CpuSubType;
                    438:
                    439: typedef enum {
                    440:        PLAT_NTSIM = 1,
                    441:        PLAT_V3ADU,
                    442:        PLAT_CYCLONE,
                    443:        PLAT_CYCLONE_HD,
                    444:        PLAT_BATBOARD,
                    445:        PLAT_BATBOARD_HD,
                    446:        PLAT_YOLO,
                    447:        PLAT_COBRA,
                    448:        PLAT_ANAHEIM,
                    449:        PLAT_JALAPENO,
                    450:        PLAT_QUEENS,
                    451:        PLAT_JALAPENO_DELL,
                    452:        PLAT_POBLANO,
                    453:        PLAT_POBLANO_OPAL,
                    454:        PLAT_POBLANO_SL0,
                    455:        PLAT_POBLANO_SL1,
                    456:        PLAT_POBLANO_SL2,
                    457:        PLAT_POBLANO_XXX,
                    458:        PLAT_JALAPENO_P2,
                    459:        PLAT_HABANERO,
                    460:        PLAT__last
                    461: } AAC_Platform;
                    462:
                    463: typedef enum {
                    464:        OEM_FLAVOR_ADAPTEC = 1,
                    465:        OEM_FLAVOR_DELL,
                    466:        OEM_FLAVOR_HP,
                    467:        OEM_FLAVOR_IBM,
                    468:        OEM_FLAVOR_CPQ,
                    469:        OEM_FLAVOR_BRAND_X,
                    470:        OEM_FLAVOR_BRAND_Y,
                    471:        OEM_FLAVOR_BRAND_Z,
                    472:        OEM_FLAVOR__last
                    473: } AAC_OemFlavor;
                    474:
                    475: /*
                    476:  * XXX the aac-2622 with no battery present reports PLATFORM_BAT_OPT_PRESENT
                    477:  */
                    478: typedef enum
                    479: {
                    480:        PLATFORM_BAT_REQ_PRESENT = 1,   /* BATTERY REQUIRED AND PRESENT */
                    481:        PLATFORM_BAT_REQ_NOTPRESENT,    /* BATTERY REQUIRED AND NOT PRESENT */
                    482:        PLATFORM_BAT_OPT_PRESENT,       /* BATTERY OPTIONAL AND PRESENT */
                    483:        PLATFORM_BAT_OPT_NOTPRESENT,    /* BATTERY OPTIONAL AND NOT PRESENT */
                    484:        PLATFORM_BAT_NOT_SUPPORTED      /* BATTERY NOT SUPPORTED */
                    485: } AAC_BatteryPlatform;
                    486:
                    487: /*
                    488:  * options supported by this board
                    489:  * there has to be a one to one mapping of these defines and the ones in
                    490:  * fsaapi.h, search for FSA_SUPPORT_SNAPSHOT
                    491:  */
                    492: #define AAC_SUPPORTED_SNAPSHOT         0x01
                    493: #define AAC_SUPPORTED_CLUSTERS         0x02
                    494: #define AAC_SUPPORTED_WRITE_CACHE      0x04
                    495: #define AAC_SUPPORTED_64BIT_DATA       0x08
                    496: #define AAC_SUPPORTED_HOST_TIME_FIB    0x10
                    497: #define AAC_SUPPORTED_RAID50           0x20
                    498: #define AAC_SUPPORTED_4GB_WINDOW       0x40
                    499: #define AAC_SUPPORTED_SCSI_UPGRADEABLE 0x80
                    500: #define AAC_SUPPORTED_SOFT_ERR_REPORT  0x100
                    501: #define AAC_SUPPORTED_NOT_RECONDITION  0x200
                    502: #define AAC_SUPPORTED_SGMAP_HOST64     0x400
                    503: #define AAC_SUPPORTED_ALARM            0x800
                    504: #define AAC_SUPPORTED_NONDASD          0x1000
                    505:
                    506: /*
                    507:  * Structure used to respond to a RequestAdapterInfo fib.
                    508:  */
                    509: struct aac_adapter_info {
                    510:        AAC_Platform            PlatformBase;    /* adapter type */
                    511:        AAC_CpuType             CpuArchitecture; /* adapter CPU type */
                    512:        AAC_CpuSubType          CpuVariant;      /* adapter CPU subtype */
                    513:        u_int32_t               ClockSpeed;      /* adapter CPU clockspeed */
                    514:        u_int32_t               ExecutionMem;    /* adapter Execution Memory
                    515:                                                  * size */
                    516:        u_int32_t               BufferMem;       /* adapter Data Memory */
                    517:        u_int32_t               TotalMem;        /* adapter Total Memory */
                    518:        struct FsaRevision      KernelRevision;  /* adapter Kernel Software
                    519:                                                  * Revision */
                    520:        struct FsaRevision      MonitorRevision; /* adapter Monitor/Diagnostic
                    521:                                                  * Software Revision */
                    522:        struct FsaRevision      HardwareRevision;/* TBD */
                    523:        struct FsaRevision      BIOSRevision;    /* adapter BIOS Revision */
                    524:        u_int32_t               ClusteringEnabled;
                    525:        u_int32_t               ClusterChannelMask;
                    526:        u_int64_t               SerialNumber;
                    527:        AAC_BatteryPlatform     batteryPlatform;
                    528:        u_int32_t               SupportedOptions; /* supported features of this
                    529:                                                   * controller */
                    530:        AAC_OemFlavor   OemVariant;
                    531: } __attribute__ ((__packed__));
                    532:
                    533: /*
                    534:  * Monitor/Kernel interface.
                    535:  */
                    536:
                    537: /*
                    538:  * Synchronous commands to the monitor/kernel.
                    539:  */
                    540: #define AAC_MONKER_INITSTRUCT  0x05
                    541: #define AAC_MONKER_SYNCFIB     0x0c
                    542: #define AAC_MONKER_GETKERNVER  0x11
                    543: #define AAC_MONKER_GETINFO     0x19
                    544:
                    545: /*
                    546:  *  Adapter Status Register
                    547:  *
                    548:  *  Phase Staus mailbox is 32bits:
                    549:  *  <31:16> = Phase Status
                    550:  *  <15:0>  = Phase
                    551:  *
                    552:  *  The adapter reports its present state through the phase.  Only
                    553:  *  a single phase should be ever be set.  Each phase can have multiple
                    554:  *  phase status bits to provide more detailed information about the
                    555:  *  state of the adapter.
                    556:  */
                    557: #define AAC_SELF_TEST_FAILED   0x00000004
                    558: #define AAC_UP_AND_RUNNING     0x00000080
                    559: #define AAC_KERNEL_PANIC       0x00000100
                    560:
                    561: /*
                    562:  * Data types relating to control and monitoring of the NVRAM/WriteCache
                    563:  * subsystem.
                    564:  */
                    565:
                    566: #define AAC_NFILESYS   24      /* maximum number of filesystems */
                    567:
                    568: /*
                    569:  * NVRAM/Write Cache subsystem states
                    570:  */
                    571: typedef enum {
                    572:        NVSTATUS_DISABLED = 0,  /* present, clean, not being used */
                    573:        NVSTATUS_ENABLED,       /* present, possibly dirty, ready for use */
                    574:        NVSTATUS_ERROR,         /* present, dirty, contains dirty data */
                    575:        NVSTATUS_BATTERY,       /* present, bad or low battery, may contain
                    576:                                 * dirty data */
                    577:        NVSTATUS_UNKNOWN        /* for bad/missing device */
                    578: } AAC_NVSTATUS;
                    579:
                    580: /*
                    581:  * NVRAM/Write Cache subsystem battery component states
                    582:  *
                    583:  */
                    584: typedef enum {
                    585:        NVBATTSTATUS_NONE = 0,  /* battery has no power or is not present */
                    586:        NVBATTSTATUS_LOW,       /* battery is low on power */
                    587:        NVBATTSTATUS_OK,        /* battery is okay - normal operation possible
                    588:                                 * only in this state */
                    589:        NVBATTSTATUS_RECONDITIONING     /* no battery present - reconditioning
                    590:                                         * in process */
                    591: } AAC_NVBATTSTATUS;
                    592:
                    593: /*
                    594:  * Battery transition type
                    595:  */
                    596: typedef enum {
                    597:        NVBATT_TRANSITION_NONE = 0,     /* battery now has no power or is not
                    598:                                         * present */
                    599:        NVBATT_TRANSITION_LOW,          /* battery is now low on power */
                    600:        NVBATT_TRANSITION_OK            /* battery is now okay - normal
                    601:                                         * operation possible only in this
                    602:                                         * state */
                    603: } AAC_NVBATT_TRANSITION;
                    604:
                    605: /*
                    606:  * NVRAM Info structure returned for NVRAM_GetInfo call
                    607:  */
                    608: struct aac_nvramdevinfo {
                    609:        u_int32_t       NV_Enabled;     /* write caching enabled */
                    610:        u_int32_t       NV_Error;       /* device in error state */
                    611:        u_int32_t       NV_NDirty;      /* count of dirty NVRAM buffers */
                    612:        u_int32_t       NV_NActive;     /* count of NVRAM buffers being
                    613:                                         * written */
                    614: } __attribute__ ((__packed__));
                    615:
                    616: struct aac_nvraminfo {
                    617:        AAC_NVSTATUS            NV_Status;      /* nvram subsystem status */
                    618:        AAC_NVBATTSTATUS        NV_BattStatus;  /* battery status */
                    619:        u_int32_t               NV_Size;        /* size of WriteCache NVRAM in
                    620:                                                 * bytes */
                    621:        u_int32_t               NV_BufSize;     /* size of NVRAM buffers in
                    622:                                                 * bytes */
                    623:        u_int32_t               NV_NBufs;       /* number of NVRAM buffers */
                    624:        u_int32_t               NV_NDirty;      /* Num dirty NVRAM buffers */
                    625:        u_int32_t               NV_NClean;      /* Num clean NVRAM buffers */
                    626:        u_int32_t               NV_NActive;     /* Num NVRAM buffers being
                    627:                                                 * written */
                    628:        u_int32_t               NV_NBrokered;   /* Num brokered NVRAM buffers */
                    629:        struct aac_nvramdevinfo NV_DevInfo[AAC_NFILESYS];       /* per device
                    630:                                                                 * info */
                    631:        u_int32_t               NV_BattNeedsReconditioning;     /* boolean */
                    632:        u_int32_t               NV_TotalSize;   /* size of all non-volatile
                    633:                                                 * memories in bytes */
                    634: } __attribute__ ((__packed__));
                    635:
                    636: /*
                    637:  * Data types relating to adapter-initiated FIBs
                    638:  *
                    639:  * Based on types and structures in <aifstruc.h>
                    640:  */
                    641:
                    642: /*
                    643:  * Progress Reports
                    644:  */
                    645: typedef enum {
                    646:        AifJobStsSuccess = 1,
                    647:        AifJobStsFinished,
                    648:        AifJobStsAborted,
                    649:        AifJobStsFailed,
                    650:        AifJobStsLastReportMarker = 100,        /* All prior mean last report */
                    651:        AifJobStsSuspended,
                    652:        AifJobStsRunning
                    653: } AAC_AifJobStatus;
                    654:
                    655: typedef enum {
                    656:        AifJobScsiMin = 1,              /* Minimum value for Scsi operation */
                    657:        AifJobScsiZero,                 /* SCSI device clear operation */
                    658:        AifJobScsiVerify,               /* SCSI device Verify operation NO
                    659:                                         * REPAIR */
                    660:        AifJobScsiExercise,             /* SCSI device Exercise operation */
                    661:        AifJobScsiVerifyRepair,         /* SCSI device Verify operation WITH
                    662:                                         * repair */
                    663:        AifJobScsiMax = 99,             /* Max Scsi value */
                    664:        AifJobCtrMin,                   /* Min Ctr op value */
                    665:        AifJobCtrZero,                  /* Container clear operation */
                    666:        AifJobCtrCopy,                  /* Container copy operation */
                    667:        AifJobCtrCreateMirror,          /* Container Create Mirror operation */
                    668:        AifJobCtrMergeMirror,           /* Container Merge Mirror operation */
                    669:        AifJobCtrScrubMirror,           /* Container Scrub Mirror operation */
                    670:        AifJobCtrRebuildRaid5,          /* Container Rebuild Raid5 operation */
                    671:        AifJobCtrScrubRaid5,            /* Container Scrub Raid5 operation */
                    672:        AifJobCtrMorph,                 /* Container morph operation */
                    673:        AifJobCtrPartCopy,              /* Container Partition copy operation */
                    674:        AifJobCtrRebuildMirror,         /* Container Rebuild Mirror operation */
                    675:        AifJobCtrCrazyCache,            /* crazy cache */
                    676:        AifJobCtrMax = 199,             /* Max Ctr type operation */
                    677:        AifJobFsMin,                    /* Min Fs type operation */
                    678:        AifJobFsCreate,                 /* File System Create operation */
                    679:        AifJobFsVerify,                 /* File System Verify operation */
                    680:        AifJobFsExtend,                 /* File System Extend operation */
                    681:        AifJobFsMax = 299,              /* Max Fs type operation */
                    682:        AifJobApiFormatNTFS,            /* Format a drive to NTFS */
                    683:        AifJobApiFormatFAT,             /* Format a drive to FAT */
                    684:        AifJobApiUpdateSnapshot,        /* update the read/write half of a
                    685:                                         * snapshot */
                    686:        AifJobApiFormatFAT32,           /* Format a drive to FAT32 */
                    687:        AifJobApiMax = 399,             /* Max API type operation */
                    688:        AifJobCtlContinuousCtrVerify,   /* Adapter operation */
                    689:        AifJobCtlMax = 499              /* Max Adapter type operation */
                    690: } AAC_AifJobType;
                    691:
                    692: struct aac_AifContainers {
                    693:        u_int32_t       src;            /* from/master */
                    694:        u_int32_t       dst;            /* to/slave */
                    695: } __attribute__ ((__packed__));
                    696:
                    697: union aac_AifJobClient {
                    698:        struct aac_AifContainers        container;      /* For Container and
                    699:                                                         * filesystem progress
                    700:                                                         * ops; */
                    701:        int32_t                         scsi_dh;        /* For SCSI progress
                    702:                                                         * ops */
                    703: };
                    704:
                    705: struct aac_AifJobDesc {
                    706:        u_int32_t               jobID;          /* DO NOT FILL IN! Will be
                    707:                                                 * filled in by AIF */
                    708:        AAC_AifJobType          type;           /* Operation that is being
                    709:                                                 * performed */
                    710:        union aac_AifJobClient  client;         /* Details */
                    711: } __attribute__ ((__packed__));
                    712:
                    713: struct aac_AifJobProgressReport {
                    714:        struct aac_AifJobDesc   jd;
                    715:        AAC_AifJobStatus        status;
                    716:        u_int32_t               finalTick;
                    717:        u_int32_t               currentTick;
                    718:        u_int32_t               jobSpecificData1;
                    719:        u_int32_t               jobSpecificData2;
                    720: } __attribute__ ((__packed__));
                    721:
                    722: /*
                    723:  * Event Notification
                    724:  */
                    725: typedef enum {
                    726:        /* General application notifies start here */
                    727:        AifEnGeneric = 1,               /* Generic notification */
                    728:        AifEnTaskComplete,              /* Task has completed */
                    729:        AifEnConfigChange,              /* Adapter config change occurred */
                    730:        AifEnContainerChange,           /* Adapter specific container
                    731:                                         * configuration change */
                    732:        AifEnDeviceFailure,             /* SCSI device failed */
                    733:        AifEnMirrorFailover,            /* Mirror failover started */
                    734:        AifEnContainerEvent,            /* Significant container event */
                    735:        AifEnFileSystemChange,          /* File system changed */
                    736:        AifEnConfigPause,               /* Container pause event */
                    737:        AifEnConfigResume,              /* Container resume event */
                    738:        AifEnFailoverChange,            /* Failover space assignment changed */
                    739:        AifEnRAID5RebuildDone,          /* RAID5 rebuild finished */
                    740:        AifEnEnclosureManagement,       /* Enclosure management event */
                    741:        AifEnBatteryEvent,              /* Significant NV battery event */
                    742:        AifEnAddContainer,              /* A new container was created. */
                    743:        AifEnDeleteContainer,           /* A container was deleted. */
                    744:        AifEnSMARTEvent,                /* SMART Event */
                    745:        AifEnBatteryNeedsRecond,        /* The battery needs reconditioning */
                    746:        AifEnClusterEvent,              /* Some cluster event */
                    747:        AifEnDiskSetEvent,              /* A disk set event occured. */
                    748:        AifDriverNotifyStart=199,       /* Notifies for host driver go here */
                    749:        /* Host driver notifications start here */
                    750:        AifDenMorphComplete,            /* A morph operation completed */
                    751:        AifDenVolumeExtendComplete      /* Volume expand operation completed */
                    752: } AAC_AifEventNotifyType;
                    753:
                    754: struct aac_AifEnsGeneric {
                    755:        char    text[132];              /* Generic text */
                    756: } __attribute__ ((__packed__));
                    757:
                    758: struct aac_AifEnsDeviceFailure {
                    759:        u_int32_t       deviceHandle;   /* SCSI device handle */
                    760: } __attribute__ ((__packed__));
                    761:
                    762: struct aac_AifEnsMirrorFailover {
                    763:        u_int32_t       container;      /* Container with failed element */
                    764:        u_int32_t       failedSlice;    /* Old slice which failed */
                    765:        u_int32_t       creatingSlice;  /* New slice used for auto-create */
                    766: } __attribute__ ((__packed__));
                    767:
                    768: struct aac_AifEnsContainerChange {
                    769:        u_int32_t       container[2];   /* container that changed, -1 if no
                    770:                                         * container */
                    771: } __attribute__ ((__packed__));
                    772:
                    773: struct aac_AifEnsContainerEvent {
                    774:        u_int32_t       container;      /* container number  */
                    775:        u_int32_t       eventType;      /* event type */
                    776: } __attribute__ ((__packed__));
                    777:
                    778: struct aac_AifEnsEnclosureEvent {
                    779:        u_int32_t       empID;          /* enclosure management proc number  */
                    780:        u_int32_t       unitID;         /* unitId, fan id, power supply id,
                    781:                                         * slot id, tempsensor id.  */
                    782:        u_int32_t       eventType;      /* event type */
                    783: } __attribute__ ((__packed__));
                    784:
                    785: struct aac_AifEnsBatteryEvent {
                    786:        AAC_NVBATT_TRANSITION   transition_type;        /* eg from low to ok */
                    787:        AAC_NVBATTSTATUS        current_state;          /* current batt state */
                    788:        AAC_NVBATTSTATUS        prior_state;            /* prev batt state */
                    789: } __attribute__ ((__packed__));
                    790:
                    791: struct aac_AifEnsDiskSetEvent {
                    792:        u_int32_t       eventType;
                    793:        u_int64_t       DsNum;
                    794:        u_int64_t       CreatorId;
                    795: } __attribute__ ((__packed__));
                    796:
                    797: typedef enum {
                    798:        CLUSTER_NULL_EVENT = 0,
                    799:        CLUSTER_PARTNER_NAME_EVENT,     /* change in partner hostname or
                    800:                                         * adaptername from NULL to non-NULL */
                    801:        /* (partner's agent may be up) */
                    802:        CLUSTER_PARTNER_NULL_NAME_EVENT /* change in partner hostname or
                    803:                                         * adaptername from non-null to NULL */
                    804:        /* (partner has rebooted) */
                    805: } AAC_ClusterAifEvent;
                    806:
                    807: struct aac_AifEnsClusterEvent {
                    808:        AAC_ClusterAifEvent     eventType;
                    809: } __attribute__ ((__packed__));
                    810:
                    811: struct aac_AifEventNotify {
                    812:        AAC_AifEventNotifyType  type;
                    813:        union {
                    814:                struct aac_AifEnsGeneric                EG;
                    815:                struct aac_AifEnsDeviceFailure          EDF;
                    816:                struct aac_AifEnsMirrorFailover         EMF;
                    817:                struct aac_AifEnsContainerChange        ECC;
                    818:                struct aac_AifEnsContainerEvent         ECE;
                    819:                struct aac_AifEnsEnclosureEvent         EEE;
                    820:                struct aac_AifEnsBatteryEvent           EBE;
                    821:                struct aac_AifEnsDiskSetEvent           EDS;
                    822: /*             struct aac_AifEnsSMARTEvent             ES;*/
                    823:                struct aac_AifEnsClusterEvent           ECLE;
                    824:        } data;
                    825: } __attribute__ ((__packed__));
                    826:
                    827: /*
                    828:  * Adapter Initiated FIB command structures. Start with the adapter
                    829:  * initiated FIBs that really come from the adapter, and get responded
                    830:  * to by the host.
                    831:  */
                    832: #define AAC_AIF_REPORT_MAX_SIZE 64
                    833:
                    834: typedef enum {
                    835:        AifCmdEventNotify = 1,  /* Notify of event */
                    836:        AifCmdJobProgress,      /* Progress report */
                    837:        AifCmdAPIReport,        /* Report from other user of API */
                    838:        AifCmdDriverNotify,     /* Notify host driver of event */
                    839:        AifReqJobList = 100,    /* Gets back complete job list */
                    840:        AifReqJobsForCtr,       /* Gets back jobs for specific container */
                    841:        AifReqJobsForScsi,      /* Gets back jobs for specific SCSI device */
                    842:        AifReqJobReport,        /* Gets back a specific job report or list */
                    843:        AifReqTerminateJob,     /* Terminates job */
                    844:        AifReqSuspendJob,       /* Suspends a job */
                    845:        AifReqResumeJob,        /* Resumes a job */
                    846:        AifReqSendAPIReport,    /* API generic report requests */
                    847:        AifReqAPIJobStart,      /* Start a job from the API */
                    848:        AifReqAPIJobUpdate,     /* Update a job report from the API */
                    849:        AifReqAPIJobFinish      /* Finish a job from the API */
                    850: } AAC_AifCommand;
                    851:
                    852: struct aac_aif_command {
                    853:        AAC_AifCommand  command;        /* Tell host what type of
                    854:                                         * notify this is */
                    855:        u_int32_t       seqNumber;      /* To allow ordering of
                    856:                                         * reports (if necessary) */
                    857:        union {
                    858:                struct aac_AifEventNotify       EN;     /* Event notify */
                    859:                struct aac_AifJobProgressReport PR[1];  /* Progress report */
                    860:                u_int8_t                        AR[AAC_AIF_REPORT_MAX_SIZE];
                    861:                u_int8_t                        data[AAC_FIB_DATASIZE - 8];
                    862:        } data;
                    863: } __attribute__ ((__packed__));
                    864:
                    865: /*
                    866:  * Filesystem commands/data
                    867:  *
                    868:  * The adapter has a very complex filesystem interface, most of which we ignore.
                    869:  * (And which seems not to be implemented, anyway.)
                    870:  */
                    871:
                    872: /*
                    873:  * FSA commands
                    874:  * (not used?)
                    875:  */
                    876: typedef enum {
                    877:        Null = 0,
                    878:        GetAttributes,
                    879:        SetAttributes,
                    880:        Lookup,
                    881:        ReadLink,
                    882:        Read,
                    883:        Write,
                    884:        Create,
                    885:        MakeDirectory,
                    886:        SymbolicLink,
                    887:        MakeNode,
                    888:        Removex,
                    889:        RemoveDirectory,
                    890:        Rename,
                    891:        Link,
                    892:        ReadDirectory,
                    893:        ReadDirectoryPlus,
                    894:        FileSystemStatus,
                    895:        FileSystemInfo,
                    896:        PathConfigure,
                    897:        Commit,
                    898:        Mount,
                    899:        UnMount,
                    900:        Newfs,
                    901:        FsCheck,
                    902:        FsSync,
                    903:        SimReadWrite,
                    904:        SetFileSystemStatus,
                    905:        BlockRead,
                    906:        BlockWrite,
                    907:        NvramIoctl,
                    908:        FsSyncWait,
                    909:        ClearArchiveBit,
                    910:        SetAcl,
                    911:        GetAcl,
                    912:        AssignAcl,
                    913:        FaultInsertion,
                    914:        CrazyCache
                    915: } AAC_FSACommand;
                    916:
                    917: /*
                    918:  * Command status values
                    919:  */
                    920: typedef enum {
                    921:        ST_OK = 0,
                    922:        ST_PERM = 1,
                    923:        ST_NOENT = 2,
                    924:        ST_IO = 5,
                    925:        ST_NXIO = 6,
                    926:        ST_E2BIG = 7,
                    927:        ST_ACCES = 13,
                    928:        ST_EXIST = 17,
                    929:        ST_XDEV = 18,
                    930:        ST_NODEV = 19,
                    931:        ST_NOTDIR = 20,
                    932:        ST_ISDIR = 21,
                    933:        ST_INVAL = 22,
                    934:        ST_FBIG = 27,
                    935:        ST_NOSPC = 28,
                    936:        ST_ROFS = 30,
                    937:        ST_MLINK = 31,
                    938:        ST_WOULDBLOCK = 35,
                    939:        ST_NAMETOOLONG = 63,
                    940:        ST_NOTEMPTY = 66,
                    941:        ST_DQUOT = 69,
                    942:        ST_STALE = 70,
                    943:        ST_REMOTE = 71,
                    944:        ST_BADHANDLE = 10001,
                    945:        ST_NOT_SYNC = 10002,
                    946:        ST_BAD_COOKIE = 10003,
                    947:        ST_NOTSUPP = 10004,
                    948:        ST_TOOSMALL = 10005,
                    949:        ST_SERVERFAULT = 10006,
                    950:        ST_BADTYPE = 10007,
                    951:        ST_JUKEBOX = 10008,
                    952:        ST_NOTMOUNTED = 10009,
                    953:        ST_MAINTMODE = 10010,
                    954:        ST_STALEACL = 10011
                    955: } AAC_FSAStatus;
                    956:
                    957: /*
                    958:  * Volume manager commands
                    959:  */
                    960: typedef enum _VM_COMMANDS {
                    961:        VM_Null = 0,
                    962:        VM_NameServe,
                    963:        VM_ContainerConfig,
                    964:        VM_Ioctl,
                    965:        VM_FilesystemIoctl,
                    966:        VM_CloseAll,
                    967:        VM_CtBlockRead,
                    968:        VM_CtBlockWrite,
                    969:        VM_SliceBlockRead,       /* raw access to configured storage objects */
                    970:        VM_SliceBlockWrite,
                    971:        VM_DriveBlockRead,       /* raw access to physical devices */
                    972:        VM_DriveBlockWrite,
                    973:        VM_EnclosureMgt,         /* enclosure management */
                    974:        VM_Unused,               /* used to be diskset management */
                    975:        VM_CtBlockVerify,
                    976:        VM_CtPerf,               /* performance test */
                    977:        VM_CtBlockRead64,
                    978:        VM_CtBlockWrite64,
                    979:        VM_CtBlockVerify64,
                    980:        VM_CtHostRead64,
                    981:        VM_CtHostWrite64,
                    982: } AAC_VMCommand;
                    983:
                    984: /*
                    985:  * "mountable object"
                    986:  */
                    987: struct aac_mntobj {
                    988:        u_int32_t                       ObjectId;
                    989:        char                            FileSystemName[16];
                    990:        struct aac_container_creation   CreateInfo;
                    991:        u_int32_t                       Capacity;
                    992:        u_int32_t                       VolType;
                    993:        u_int32_t                       ObjType;
                    994:        u_int32_t                       ContentState;
                    995: #define FSCS_READONLY          0x0002          /* XXX need more information
                    996:                                                 * than this */
                    997:        union {
                    998:                u_int32_t       pad[8];
                    999:        } ObjExtension;
                   1000:        u_int32_t                       AlterEgoId;
                   1001: } __attribute__ ((__packed__));
                   1002:
                   1003: struct aac_mntinfo {
                   1004:        u_int32_t               Command;
                   1005:        u_int32_t               MntType;
                   1006:        u_int32_t               MntCount;
                   1007: } __attribute__ ((__packed__));
                   1008:
                   1009: struct aac_mntinforesp {
                   1010:        u_int32_t               Status;
                   1011:        u_int32_t               MntType;
                   1012:        u_int32_t               MntRespCount;
                   1013:        struct aac_mntobj       MntTable[1];
                   1014: } __attribute__ ((__packed__));
                   1015:
                   1016: /*
                   1017:  * Container shutdown command.
                   1018:  */
                   1019: struct aac_closecommand {
                   1020:        u_int32_t       Command;
                   1021:        u_int32_t       ContainerId;
                   1022: } __attribute__ ((__packed__));
                   1023:
                   1024: /*
                   1025:  * Container Config Command
                   1026:  */
                   1027: #define CT_GET_SCSI_METHOD     64
                   1028: struct aac_ctcfg {
                   1029:        u_int32_t               Command;
                   1030:        u_int32_t               cmd;
                   1031:        u_int32_t               param;
                   1032: } __attribute__ ((__packed__));
                   1033:
                   1034: struct aac_ctcfg_resp {
                   1035:        u_int32_t               Status;
                   1036:        u_int32_t               resp;
                   1037:        u_int32_t               param;
                   1038: } __attribute__ ((__packed__));
                   1039:
                   1040: /*
                   1041:  * 'Ioctl' commads
                   1042:  */
                   1043: #define AAC_SCSI_MAX_PORTS     10
                   1044: #define AAC_BUS_NO_EXIST       0
                   1045: #define AAC_BUS_VALID          1
                   1046: #define AAC_BUS_FAULTED                2
                   1047: #define AAC_BUS_DISABLED       3
                   1048: #define GetBusInfo             0x9
                   1049:
                   1050: struct aac_getbusinf {
                   1051:        u_int32_t               ProbeComplete;
                   1052:        u_int32_t               BusCount;
                   1053:        u_int32_t               TargetsPerBus;
                   1054:        u_int8_t                InitiatorBusId[AAC_SCSI_MAX_PORTS];
                   1055:        u_int8_t                BusValid[AAC_SCSI_MAX_PORTS];
                   1056: } __attribute__ ((__packed__));
                   1057:
                   1058: struct aac_vmioctl {
                   1059:        u_int32_t               Command;
                   1060:        u_int32_t               ObjType;
                   1061:        u_int32_t               MethId;
                   1062:        u_int32_t               ObjId;
                   1063:        u_int32_t               IoctlCmd;
                   1064:        u_int32_t               IoctlBuf[1];    /* Placeholder? */
                   1065: } __attribute__ ((__packed__));
                   1066:
                   1067: struct aac_vmi_businf_resp {
                   1068:        u_int32_t               Status;
                   1069:        u_int32_t               ObjType;
                   1070:        u_int32_t               MethId;
                   1071:        u_int32_t               ObjId;
                   1072:        u_int32_t               IoctlCmd;
                   1073:        struct aac_getbusinf    BusInf;
                   1074: } __attribute__ ((__packed__));
                   1075:
                   1076: #define AAC_BTL_TO_HANDLE(b, t, l) \
                   1077:     (((b & 0x3f) << 7) | ((l & 0x7) << 4) | (t & 0xf))
                   1078: #define GetDeviceProbeInfo 0x5
                   1079:
                   1080: struct aac_vmi_devinfo_resp {
                   1081:        u_int32_t               Status;
                   1082:        u_int32_t               ObjType;
                   1083:        u_int32_t               MethId;
                   1084:        u_int32_t               ObjId;
                   1085:        u_int32_t               IoctlCmd;
                   1086:        u_int8_t                VendorId[8];
                   1087:        u_int8_t                ProductId[16];
                   1088:        u_int8_t                ProductRev[4];
                   1089:        u_int32_t               Inquiry7;
                   1090:        u_int32_t               align1;
                   1091:        u_int32_t               Inquiry0;
                   1092:        u_int32_t               align2;
                   1093:        u_int32_t               Inquiry1;
                   1094:        u_int32_t               align3;
                   1095:        u_int32_t               reserved[2];
                   1096:        u_int8_t                VendorSpecific[20];
                   1097:        u_int32_t               Smart:1;
                   1098:        u_int32_t               AAC_Managed:1;
                   1099:        u_int32_t               align4;
                   1100:        u_int32_t               reserved2:6;
                   1101:        u_int32_t               Bus;
                   1102:        u_int32_t               Target;
                   1103:        u_int32_t               Lun;
                   1104:        u_int32_t               ultraEnable:1,
                   1105:                                disconnectEnable:1,
                   1106:                                fast20EnabledW:1,
                   1107:                                scamDevice:1,
                   1108:                                scamTolerant:1,
                   1109:                                setForSync:1,
                   1110:                                setForWide:1,
                   1111:                                syncDevice:1,
                   1112:                                wideDevice:1,
                   1113:                                reserved1:7,
                   1114:                                ScsiRate:8,
                   1115:                                ScsiOffset:8;
                   1116: }; /* Do not pack */
                   1117:
                   1118: #define ResetBus 0x16
                   1119: struct aac_resetbus {
                   1120:        u_int32_t               BusNumber;
                   1121: };
                   1122:
                   1123: /*
                   1124:  * Write 'stability' options.
                   1125:  */
                   1126: typedef enum {
                   1127:        CSTABLE = 1,
                   1128:        CUNSTABLE
                   1129: } AAC_CacheLevel;
                   1130:
                   1131: /*
                   1132:  * Commit level response for a write request.
                   1133:  */
                   1134: typedef enum {
                   1135:        CMFILE_SYNC_NVRAM = 1,
                   1136:        CMDATA_SYNC_NVRAM,
                   1137:        CMFILE_SYNC,
                   1138:        CMDATA_SYNC,
                   1139:        CMUNSTABLE
                   1140: } AAC_CommitLevel;
                   1141:
                   1142: /*
                   1143:  * Block read/write operations.
                   1144:  * These structures are packed into the 'data' area in the FIB.
                   1145:  */
                   1146:
                   1147: struct aac_blockread {
                   1148:        u_int32_t               Command;        /* not FSACommand! */
                   1149:        u_int32_t               ContainerId;
                   1150:        u_int32_t               BlockNumber;
                   1151:        u_int32_t               ByteCount;
                   1152:        struct aac_sg_table     SgMap;          /* variable size */
                   1153: } __attribute__ ((__packed__));
                   1154:
                   1155: struct aac_blockread64 {
                   1156:        u_int32_t               Command;
                   1157:        u_int16_t               ContainerId;
                   1158:        u_int16_t               SectorCount;
                   1159:        u_int32_t               BlockNumber;
                   1160:        u_int16_t               Pad;
                   1161:        u_int16_t               Flags;
                   1162:        struct aac_sg_table64   SgMap64;
                   1163: } __attribute__ ((__packed__));
                   1164:
                   1165: struct aac_blockread_response {
                   1166:        u_int32_t               Status;
                   1167:        u_int32_t               ByteCount;
                   1168: } __attribute__ ((__packed__));
                   1169:
                   1170: struct aac_blockwrite {
                   1171:        u_int32_t               Command;        /* not FSACommand! */
                   1172:        u_int32_t               ContainerId;
                   1173:        u_int32_t               BlockNumber;
                   1174:        u_int32_t               ByteCount;
                   1175:        u_int32_t               Stable;
                   1176:        struct aac_sg_table     SgMap;          /* variable size */
                   1177: } __attribute__ ((__packed__));
                   1178:
                   1179: struct aac_blockwrite64 {
                   1180:        u_int32_t               Command;        /* not FSACommand! */
                   1181:        u_int16_t               ContainerId;
                   1182:        u_int16_t               SectorCount;
                   1183:        u_int32_t               BlockNumber;
                   1184:        u_int16_t               Pad;
                   1185:        u_int16_t               Flags;
                   1186:        struct aac_sg_table64   SgMap64;        /* variable size */
                   1187: } __attribute__ ((__packed__));
                   1188:
                   1189: struct aac_blockwrite_response {
                   1190:        u_int32_t               Status;
                   1191:        u_int32_t               ByteCount;
                   1192:        u_int32_t               Committed;
                   1193: } __attribute__ ((__packed__));
                   1194:
                   1195: /*
                   1196:  * Container shutdown command.
                   1197:  */
                   1198: struct aac_close_command {
                   1199:        u_int32_t               Command;
                   1200:        u_int32_t               ContainerId;
                   1201: };
                   1202:
                   1203: /*
                   1204:  * SCSI Passthrough structures
                   1205:  */
                   1206: struct aac_srb32 {
                   1207:        u_int32_t               function;
                   1208:        u_int32_t               bus;
                   1209:        u_int32_t               target;
                   1210:        u_int32_t               lun;
                   1211:        u_int32_t               timeout;
                   1212:        u_int32_t               flags;
                   1213:        u_int32_t               data_len;
                   1214:        u_int32_t               retry_limit;
                   1215:        u_int32_t               cdb_len;
                   1216:        u_int8_t                cdb[16];
                   1217:        struct aac_sg_table     sg_map32;
                   1218: };
                   1219:
                   1220: enum {
                   1221:        AAC_SRB_FUNC_EXECUTE_SCSI       = 0x00,
                   1222:        AAC_SRB_FUNC_CLAIM_DEVICE,
                   1223:        AAC_SRB_FUNC_IO_CONTROL,
                   1224:        AAC_SRB_FUNC_RECEIVE_EVENT,
                   1225:        AAC_SRB_FUNC_RELEASE_QUEUE,
                   1226:        AAC_SRB_FUNC_ATTACH_DEVICE,
                   1227:        AAC_SRB_FUNC_RELEASE_DEVICE,
                   1228:        AAC_SRB_FUNC_SHUTDOWN,
                   1229:        AAC_SRB_FUNC_FLUSH,
                   1230:        AAC_SRB_FUNC_ABORT_COMMAND      = 0x10,
                   1231:        AAC_SRB_FUNC_RELEASE_RECOVERY,
                   1232:        AAC_SRB_FUNC_RESET_BUS,
                   1233:        AAC_SRB_FUNC_RESET_DEVICE,
                   1234:        AAC_SRB_FUNC_TERMINATE_IO,
                   1235:        AAC_SRB_FUNC_FLUSH_QUEUE,
                   1236:        AAC_SRB_FUNC_REMOVE_DEVICE,
                   1237:        AAC_SRB_FUNC_DOMAIN_VALIDATION
                   1238: };
                   1239:
                   1240: #define AAC_SRB_FLAGS_NO_DATA_XFER             0x0000
                   1241: #define        AAC_SRB_FLAGS_DISABLE_DISCONNECT        0x0004
                   1242: #define        AAC_SRB_FLAGS_DISABLE_SYNC_TRANSFER     0x0008
                   1243: #define AAC_SRB_FLAGS_BYPASS_FROZEN_QUEUE      0x0010
                   1244: #define        AAC_SRB_FLAGS_DISABLE_AUTOSENSE         0x0020
                   1245: #define        AAC_SRB_FLAGS_DATA_IN                   0x0040
                   1246: #define AAC_SRB_FLAGS_DATA_OUT                 0x0080
                   1247: #define        AAC_SRB_FLAGS_UNSPECIFIED_DIRECTION \
                   1248:                        (AAC_SRB_FLAGS_DATA_IN | AAC_SRB_FLAGS_DATA_OUT)
                   1249:
                   1250: #define AAC_HOST_SENSE_DATA_MAX                        30
                   1251:
                   1252: struct aac_srb_response {
                   1253:        u_int32_t       fib_status;
                   1254:        u_int32_t       srb_status;
                   1255:        u_int32_t       scsi_status;
                   1256:        u_int32_t       data_len;
                   1257:        u_int32_t       sense_len;
                   1258:        u_int8_t        sense[AAC_HOST_SENSE_DATA_MAX];
                   1259: };
                   1260:
                   1261: enum {
                   1262:        AAC_SRB_STS_PENDING                     = 0x00,
                   1263:        AAC_SRB_STS_SUCCESS,
                   1264:        AAC_SRB_STS_ABORTED,
                   1265:        AAC_SRB_STS_ABORT_FAILED,
                   1266:        AAC_SRB_STS_ERROR,
                   1267:        AAC_SRB_STS_BUSY,
                   1268:        AAC_SRB_STS_INVALID_REQUEST,
                   1269:        AAC_SRB_STS_INVALID_PATH_ID,
                   1270:        AAC_SRB_STS_NO_DEVICE,
                   1271:        AAC_SRB_STS_TIMEOUT,
                   1272:        AAC_SRB_STS_SELECTION_TIMEOUT,
                   1273:        AAC_SRB_STS_COMMAND_TIMEOUT,
                   1274:        AAC_SRB_STS_MESSAGE_REJECTED            = 0x0D,
                   1275:        AAC_SRB_STS_BUS_RESET,
                   1276:        AAC_SRB_STS_PARITY_ERROR,
                   1277:        AAC_SRB_STS_REQUEST_SENSE_FAILED,
                   1278:        AAC_SRB_STS_NO_HBA,
                   1279:        AAC_SRB_STS_DATA_OVERRUN,
                   1280:        AAC_SRB_STS_UNEXPECTED_BUS_FREE,
                   1281:        AAC_SRB_STS_PHASE_SEQUENCE_FAILURE,
                   1282:        AAC_SRB_STS_BAD_SRB_BLOCK_LENGTH,
                   1283:        AAC_SRB_STS_REQUEST_FLUSHED,
                   1284:        AAC_SRB_STS_INVALID_LUN                 = 0x20,
                   1285:        AAC_SRB_STS_INVALID_TARGET_ID,
                   1286:        AAC_SRB_STS_BAD_FUNCTION,
                   1287:        AAC_SRB_STS_ERROR_RECOVERY
                   1288: };
                   1289:
                   1290: /*
                   1291:  * Register set for adapters based on the Falcon bridge and PPC core
                   1292:  */
                   1293:
                   1294: #define AAC_FA_DOORBELL0_CLEAR         0x00
                   1295: #define AAC_FA_DOORBELL1_CLEAR         0x02
                   1296: #define AAC_FA_DOORBELL0               0x04
                   1297: #define AAC_FA_DOORBELL1               0x06
                   1298: #define AAC_FA_MASK0_CLEAR             0x08
                   1299: #define AAC_FA_MASK1_CLEAR             0x0a
                   1300: #define        AAC_FA_MASK0                    0x0c
                   1301: #define AAC_FA_MASK1                   0x0e
                   1302: #define AAC_FA_MAILBOX                 0x10
                   1303: #define        AAC_FA_FWSTATUS                 0x2c    /* Mailbox 7 */
                   1304: #define        AAC_FA_INTSRC                   0x900
                   1305:
                   1306: #define AAC_FA_HACK(sc)        (void)AAC_GETREG4(sc, AAC_FA_INTSRC)
                   1307:
                   1308: /*
                   1309:  * Register definitions for the Adaptec AAC-364 'Jalapeno I/II' adapters, based
                   1310:  * on the SA110 'StrongArm'.
                   1311:  */
                   1312:
                   1313: #define AAC_REGSIZE                    0x100
                   1314:
                   1315: #define AAC_SA_DOORBELL0_CLEAR         0x98    /* doorbell 0 (adapter->host) */
                   1316: #define AAC_SA_DOORBELL0_SET           0x9c
                   1317: #define AAC_SA_DOORBELL0               0x9c
                   1318: #define AAC_SA_MASK0_CLEAR             0xa0
                   1319: #define AAC_SA_MASK0_SET               0xa4
                   1320:
                   1321: #define AAC_SA_DOORBELL1_CLEAR         0x9a    /* doorbell 1 (host->adapter) */
                   1322: #define AAC_SA_DOORBELL1_SET           0x9e
                   1323: #define AAC_SA_DOORBELL1               0x9e
                   1324: #define AAC_SA_MASK1_CLEAR             0xa2
                   1325: #define AAC_SA_MASK1_SET               0xa6
                   1326:
                   1327: #define AAC_SA_MAILBOX                 0xa8    /* mailbox (20 bytes) */
                   1328: #define AAC_SA_FWSTATUS                        0xc4
                   1329:
                   1330: /*
                   1331:  * Register definitions for the Adaptec 'Pablano' adapters, based on the i960Rx,
                   1332:  * and other related adapters.
                   1333:  */
                   1334:
                   1335: #define AAC_RX_IDBR            0x20    /* inbound doorbell register */
                   1336: #define AAC_RX_IISR            0x24    /* inbound interrupt status register */
                   1337: #define AAC_RX_IIMR            0x28    /* inbound interrupt mask register */
                   1338: #define AAC_RX_ODBR            0x2c    /* outbound doorbell register */
                   1339: #define AAC_RX_OISR            0x30    /* outbound interrupt status register */
                   1340: #define AAC_RX_OIMR            0x34    /* outbound interrupt mask register */
                   1341:
                   1342: #define AAC_RX_MAILBOX         0x50    /* mailbox (20 bytes) */
                   1343: #define AAC_RX_FWSTATUS                0x6c
                   1344:
                   1345: /*
                   1346:  * Register definitions for the Adaptec 'Rocket' RAID-On-Chip adapters.
                   1347:  * Unsurprisingly, it's quite similar to the i960!
                   1348:  */
                   1349:
                   1350: #define AAC_RKT_IDBR           0x20    /* inbound doorbell register */
                   1351: #define AAC_RKT_IISR           0x24    /* inbound interrupt status register */
                   1352: #define AAC_RKT_IIMR           0x28    /* inbound interrupt mask register */
                   1353: #define AAC_RKT_ODBR           0x2c    /* outbound doorbell register */
                   1354: #define AAC_RKT_OISR           0x30    /* outbound interrupt status register */
                   1355: #define AAC_RKT_OIMR           0x34    /* outbound interrupt mask register */
                   1356:
                   1357: #define AAC_RKT_MAILBOX                0x1000  /* mailbox */
                   1358: #define AAC_RKT_FWSTATUS       0x101c  /* Firmware Status (mailbox 7) */
                   1359:
                   1360: /*
                   1361:  * Common bit definitions for the doorbell registers.
                   1362:  */
                   1363:
                   1364: /*
                   1365:  * Status bits in the doorbell registers.
                   1366:  */
                   1367: #define AAC_DB_SYNC_COMMAND    (1<<0)  /* send/completed synchronous FIB */
                   1368: #define AAC_DB_COMMAND_READY   (1<<1)  /* posted one or more commands */
                   1369: #define AAC_DB_RESPONSE_READY  (1<<2)  /* one or more commands complete */
                   1370: #define AAC_DB_COMMAND_NOT_FULL        (1<<3)  /* command queue not full */
                   1371: #define AAC_DB_RESPONSE_NOT_FULL (1<<4)        /* response queue not full */
                   1372:
                   1373: /*
                   1374:  * The adapter can request the host print a message by setting the
                   1375:  * DB_PRINTF flag in DOORBELL0.  The driver responds by collecting the
                   1376:  * message from the printf buffer, clearing the DB_PRINTF flag in
                   1377:  * DOORBELL0 and setting it in DOORBELL1.
                   1378:  * (ODBR and IDBR respectively for the i960Rx adapters)
                   1379:  */
                   1380: #define AAC_DB_PRINTF          (1<<5)  /* adapter requests host printf */
                   1381: #define AAC_PRINTF_DONE                (1<<5)  /* Host completed printf processing */
                   1382:
                   1383: /*
                   1384:  * Mask containing the interrupt bits we care about.  We don't anticipate (or
                   1385:  * want) interrupts not in this mask.
                   1386:  */
                   1387: #define AAC_DB_INTERRUPTS      (AAC_DB_COMMAND_READY  |        \
                   1388:                                 AAC_DB_RESPONSE_READY |        \
                   1389:                                 AAC_DB_PRINTF)

CVSweb