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

Cache object: 9fef03953eb226742a176704cba632aa


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