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

Cache object: 82c0a402159e29dc06946a462444b295


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