The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/aac/aacreg.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 0d18972998cedc3f51c540b0c1f1bb56


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.