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

Cache object: 313c24f6968071f4d09a4ce2a02fdc15


[ 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.