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

Cache object: 5c1305d30a4d1380aeee5ed5ef944329


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