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