/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Copyright 2005-06 Adaptec, Inc.
* Copyright (c) 2005-06 Adaptec Inc., Achim Leubner
* Copyright (c) 2000 Michael Smith
* Copyright (c) 2000-2001 Scott Long
* Copyright (c) 2000 BSDi
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD: src/sys/dev/aac/aacreg.h,v 1.23 2005/10/14 16:22:45 scottl Exp $
*/
#ifndef __AAC_REGS_H__
#define __AAC_REGS_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Status bits in the doorbell registers */
#define AAC_DB_SYNC_COMMAND (1<<0) /* send/completed synchronous */
/* FIB */
#define AAC_DB_COMMAND_READY (1<<1) /* posted one or more */
/* commands */
#define AAC_DB_RESPONSE_READY (1<<2) /* one or more commands */
/* complete */
#define AAC_DB_COMMAND_NOT_FULL (1<<3) /* command queue not full */
#define AAC_DB_RESPONSE_NOT_FULL (1<<4) /* response queue not full */
#define AAC_DB_PRINTF_READY (1<<5) /* adapter requests host */
/* printf */
#define AAC_DB_INTR_BITS (AAC_DB_COMMAND_READY | \
AAC_DB_RESPONSE_READY | AAC_DB_PRINTF_READY)
#define AAC_DB_INTR_NEW 0x08
/* Status bits in firmware status reg */
#define AAC_SELF_TEST_FAILED 0x00000004
#define AAC_MONITOR_PANIC 0x00000020
#define AAC_KERNEL_UP_AND_RUNNING 0x00000080
#define AAC_KERNEL_PANIC 0x00000100
/* aac registers definitions */
#define AAC_OMR0 0x18 /* outbound message register 0 */
#define AAC_OMR1 0x1c /* outbound message register 1 */
#define AAC_IDBR 0x20 /* inbound doorbell reg */
#define AAC_ODBR 0x2c /* outbound doorbell reg */
#define AAC_OIMR 0x34 /* outbound interrupt mask reg */
#define AAC_IRCSR 0x38 /* inbound dual cores reset (SRL) */
#define AAC_IQUE 0x40 /* inbound queue */
#define AAC_OQUE 0x44 /* outbound queue */
#define AAC_RX_MAILBOX 0x50 /* mailbox, size=20bytes, rx */
#define AAC_RX_FWSTATUS 0x6c /* firmware status, rx */
#define AAC_RKT_MAILBOX 0x1000 /* mailbox, size=20bytes, rkt */
#define AAC_RKT_FWSTATUS 0x101c /* firmware status, rkt */
/* Synchronous commands to the monitor/kernel. */
#define AAC_BREAKPOINT_REQ 0x04
#define AAC_MONKER_INITSTRUCT 0x05
#define AAC_MONKER_SYNCFIB 0x0c
#define AAC_MONKER_GETKERNVER 0x11
#define AAC_MONKER_GETINFO 0x19
#define AAC_MONKER_GETDRVPROP 0x23
#define AAC_MONKER_GETCOMMPREF 0x26
#define AAC_IOP_RESET 0x1000
/* Sunrise Lake dual core reset */
#define AAC_IRCSR_CORES_RST 3
#define AAC_SECTOR_SIZE 512
#define AAC_NUMBER_OF_HEADS 255
#define AAC_SECTORS_PER_TRACK 63
#define AAC_ROTATION_SPEED 10000
#define AAC_MAX_PFN 0xfffff
#define AAC_ADDITIONAL_LEN 31
#define AAC_ANSI_VER 2
#define AAC_RESP_DATA_FORMAT 2
#define AAC_MAX_LD 64 /* max number of logical disks */
#define AAC_MAX_PD(s) ((s)->bus_max * (s)->tgt_max)
#define AAC_MAX_DEV(s) (AAC_MAX_LD + AAC_MAX_PD((s)))
#define AAC_BLK_SIZE AAC_SECTOR_SIZE
#define AAC_DMA_ALIGN 4
#define AAC_DMA_ALIGN_MASK (AAC_DMA_ALIGN - 1)
#define AAC_MAX_CONTAINERS AAC_MAX_LD
/*
* Minimum memory sizes we need to map to address the adapter. Before
* we know the actual size to map, minimum memory is used instead.
*/
#define AAC_MAP_SIZE_MIN_RX 4096
#define AAC_MAP_SIZE_MIN_RKT 8192
/*
* Options supported by the adapter
*/
#define AAC_SUPPORTED_SNAPSHOT 0x01
#define AAC_SUPPORTED_CLUSTERS 0x02
#define AAC_SUPPORTED_WRITE_CACHE 0x04
#define AAC_SUPPORTED_64BIT_DATA 0x08
#define AAC_SUPPORTED_HOST_TIME_FIB 0x10
#define AAC_SUPPORTED_RAID50 0x20
#define AAC_SUPPORTED_4GB_WINDOW 0x40
#define AAC_SUPPORTED_SCSI_UPGRADEABLE 0x80
#define AAC_SUPPORTED_SOFT_ERR_REPORT 0x100
#define AAC_SUPPORTED_NOT_RECONDITION 0x200
#define AAC_SUPPORTED_SGMAP_HOST64 0x400
#define AAC_SUPPORTED_ALARM 0x800
#define AAC_SUPPORTED_NONDASD 0x1000
#define AAC_SUPPORTED_SCSI_MANAGED 0x2000
#define AAC_SUPPORTED_RAID_SCSI_MODE 0x4000
#define AAC_SUPPORTED_SUPPLEMENT_ADAPTER_INFO 0x10000
#define AAC_SUPPORTED_NEW_COMM 0x20000
#define AAC_SUPPORTED_64BIT_ARRAYSIZE 0x40000
#define AAC_SUPPORTED_HEAT_SENSOR 0x80000
/*
* More options from supplement info - SupportedOptions2
*/
#define AAC_SUPPORTED_MU_RESET 0x01
#define AAC_SUPPORTED_IGNORE_RESET 0x02
#define AAC_SUPPORTED_POWER_MANAGEMENT 0x04
#define AAC_SUPPORTED_ARCIO_PHYDEV 0x08
/*
* FeatureBits of RequestSupplementAdapterInfo used in the driver
*/
#define AAC_FEATURE_SUPPORTED_JBOD 0x08000000
#pragma pack(1)
/*
* FIB (FSA Interface Block) this is the data structure passed between
* the host and adapter.
*/
struct aac_fib_header {
uint32_t XferState;
uint16_t Command;
uint8_t StructType;
uint8_t Flags;
uint16_t Size;
uint16_t SenderSize;
uint32_t SenderFibAddress;
uint32_t ReceiverFibAddress;
uint32_t SenderData;
int prev;
int next;
};
/* FIB completed without error or no data was transferred in the FIB */
#define AAC_SENDERADDR_MASK_FAST_RESPONSE 0x01
/* The received FIB is an AIF */
#define AAC_SENDERADDR_MASK_AIF 0x02
#define AAC_FIB_SIZE 512 /* size of a fib block in byte */
#define AAC_FIB_DATASIZE (AAC_FIB_SIZE - sizeof (struct aac_fib_header))
struct aac_fib {
struct aac_fib_header Header;
uint8_t data[AAC_FIB_DATASIZE];
};
/* FIB transfer state */
#define AAC_FIBSTATE_HOSTOWNED (1<<0) /* owned by the host */
#define AAC_FIBSTATE_ADAPTEROWNED (1<<1) /* owned by the adapter */
#define AAC_FIBSTATE_INITIALISED (1<<2) /* has been initialised */
#define AAC_FIBSTATE_EMPTY (1<<3) /* is empty now */
#define AAC_FIBSTATE_FROMHOST (1<<5) /* sent from the host */
#define AAC_FIBSTATE_FROMADAP (1<<6) /* sent from the adapter */
#define AAC_FIBSTATE_REXPECTED (1<<7) /* response is expected */
#define AAC_FIBSTATE_NOREXPECTED (1<<8) /* no response is expected */
#define AAC_FIBSTATE_DONEADAP (1<<9) /* processed by the adapter */
#define AAC_FIBSTATE_DONEHOST (1<<10) /* processed by the host */
#define AAC_FIBSTATE_NORM (1<<12) /* normal priority */
#define AAC_FIBSTATE_ASYNC (1<<13)
#define AAC_FIBSTATE_FAST_RESPONSE (1<<19) /* fast response capable */
/* FIB types */
#define AAC_FIBTYPE_TFIB 1
/*
* FIB commands
*/
#define TestCommandResponse 1
#define TestAdapterCommand 2
/* Lowlevel and comm commands */
#define LastTestCommand 100
#define ReinitHostNormCommandQueue 101
#define ReinitHostHighCommandQueue 102
#define ReinitHostHighRespQueue 103
#define ReinitHostNormRespQueue 104
#define ReinitAdapNormCommandQueue 105
#define ReinitAdapHighCommandQueue 107
#define ReinitAdapHighRespQueue 108
#define ReinitAdapNormRespQueue 109
#define InterfaceShutdown 110
#define DmaCommandFib 120
#define StartProfile 121
#define TermProfile 122
#define SpeedTest 123
#define TakeABreakPt 124
#define RequestPerfData 125
#define SetInterruptDefTimer 126
#define SetInterruptDefCount 127
#define GetInterruptDefStatus 128
#define LastCommCommand 129
/* Filesystem commands */
#define NuFileSystem 300
#define UFS 301
#define HostFileSystem 302
#define LastFileSystemCommand 303
/* Container commands */
#define ContainerCommand 500
#define ContainerCommand64 501
#define RawIo 502
/* Cluster commands */
#define ClusterCommand 550
/* Scsi Port commands (scsi passthrough) */
#define ScsiPortCommand 600
#define ScsiPortCommandU64 601
/* Misc house keeping and generic adapter initiated commands */
#define AifRequest 700
#define CheckRevision 701
#define FsaHostShutdown 702
#define RequestAdapterInfo 703
#define IsAdapterPaused 704
#define SendHostTime 705
#define RequestSupplementAdapterInfo 706
#define LastMiscCommand 707
#define OnLineDiagnostic 800
#define FduAdapterTest 801
/*
* Revision number handling
*/
struct FsaRev {
union {
struct {
uint8_t dash;
uint8_t type;
uint8_t minor;
uint8_t major;
} comp;
uint32_t ul;
} external;
uint32_t buildNumber;
};
/*
* Structures used to respond to a RequestAdapterInfo FIB
*/
struct aac_adapter_info {
uint32_t PlatformBase; /* adapter type */
uint32_t CpuArchitecture; /* adapter CPU type */
uint32_t CpuVariant; /* adapter CPU subtype */
uint32_t ClockSpeed; /* adapter CPU clockspeed */
uint32_t ExecutionMem; /* adapter Execution Memory size */
uint32_t BufferMem; /* adapter Data Memory */
uint32_t TotalMem; /* adapter Total Memory */
struct FsaRev KernelRevision; /* adapter Kernel Software Revision */
struct FsaRev MonitorRevision; /* adapter Monitor Software Revision */
struct FsaRev HardwareRevision;
struct FsaRev BIOSRevision; /* adapter BIOS Revision */
uint32_t ClusteringEnabled;
uint32_t ClusterChannelMask;
uint64_t SerialNumber;
uint32_t batteryPlatform;
uint32_t SupportedOptions; /* supported features */
uint32_t OemVariant;
};
/*
* The following definitions on Supplement Adapter Information
* come from Adaptec:
*/
struct vpd_info {
uint8_t AssemblyPn[8];
uint8_t FruPn[8];
uint8_t BatteryFruPn[8];
uint8_t EcVersionString[8];
uint8_t Tsid[12];
};
#define MFG_PCBA_SERIAL_NUMBER_WIDTH 12
#define MFG_WWN_WIDTH 8
struct aac_supplement_adapter_info {
/* The assigned Adapter Type Text, extra byte for null termination */
int8_t AdapterTypeText[17+1];
/* Pad for the text above */
int8_t Pad[2];
/* Size in bytes of the memory that is flashed */
uint32_t FlashMemoryByteSize;
/* The assigned IMAGEID_xxx for this adapter */
uint32_t FlashImageId;
/*
* The maximum number of Phys available on a SATA/SAS
* Controller, 0 otherwise
*/
uint32_t MaxNumberPorts;
/* Version of expansion area */
uint32_t Version;
uint32_t FeatureBits;
uint8_t SlotNumber;
uint8_t ReservedPad0[3];
uint8_t BuildDate[12];
/* The current number of Ports on a SAS controller, 0 otherwise */
uint32_t CurrentNumberPorts;
struct vpd_info VpdInfo;
/* Firmware Revision (Vmaj.min-dash.) */
struct FsaRev FlashFirmwareRevision;
uint32_t RaidTypeMorphOptions;
/* Firmware's boot code Revision (Vmaj.min-dash.) */
struct FsaRev FlashFirmwareBootRevision;
/* PCBA serial no. from th MFG sector */
uint8_t MfgPcbaSerialNo[MFG_PCBA_SERIAL_NUMBER_WIDTH];
/* WWN from the MFG sector */
uint8_t MfgWWNName[MFG_WWN_WIDTH];
uint32_t SupportedOptions2; /* more supported features */
uint32_t ExpansionFlag; /* 1 - following fields are valid */
uint32_t FeatureBits3;
uint32_t SupportedPerformanceMode;
/* Growth Area for future expansion */
uint32_t ReservedGrowth[80];
};
/* Container creation data */
struct aac_container_creation {
uint8_t ViaBuildNumber;
uint8_t MicroSecond;
uint8_t Via; /* 1 = FSU, 2 = API, etc */
uint8_t Years; /* Since1900 */
uint32_t Month:4; /* 1-12 */
uint32_t Day:6; /* 1-32 */
uint32_t Hour:6; /* 0-23 */
uint32_t Minute:6; /* 0-59 */
uint32_t Second:6; /* 0-59 */
uint64_t ViaAdapterSerialNumber;
};
struct aac_mntobj {
uint32_t ObjectId;
char FileSystemName[16];
struct aac_container_creation CreateInfo;
uint32_t Capacity;
uint32_t VolType;
uint32_t ObjType;
uint32_t ContentState;
union {
uint32_t pad[8];
} ObjExtension;
uint32_t AlterEgoId;
uint32_t CapacityHigh; /* 64-bit LBA */
};
struct aac_mntinfo {
uint32_t Command;
uint32_t MntType;
uint32_t MntCount;
};
struct aac_mntinforesp {
uint32_t Status;
uint32_t MntType;
uint32_t MntRespCount;
struct aac_mntobj MntObj;
};
/*
* Structures used to access physical drives
*/
struct aac_bus_info {
uint32_t Command; /* VM_Ioctl */
uint32_t ObjType; /* FT_DRIVE */
uint32_t MethodId; /* 1 = SCSI Layer */
uint32_t ObjectId; /* Handle */
uint32_t CtlCmd; /* GetBusInfo */
};
struct aac_bus_info_response {
uint32_t Status; /* ST_OK */
uint32_t ObjType;
uint32_t MethodId; /* unused */
uint32_t ObjectId; /* unused */
uint32_t CtlCmd; /* unused */
uint32_t ProbeComplete;
uint32_t BusCount;
uint32_t TargetsPerBus;
uint8_t InitiatorBusId[10];
uint8_t BusValid[10];
};
#define CT_FIB_PARAMS 6
#define MAX_FIB_PARAMS 10
#define CT_PACKET_SIZE \
(AAC_FIB_DATASIZE - sizeof (uint32_t) - \
((sizeof (uint32_t)) * (MAX_FIB_PARAMS + 1)))
#define CNT_SIZE 5
/* Container types */
typedef enum {
CT_NONE = 0,
CT_VOLUME,
CT_MIRROR,
CT_STRIPE,
CT_RAID5,
CT_SSRW,
CT_SSRO,
CT_MORPH,
CT_PASSTHRU,
CT_RAID4,
CT_RAID10, /* stripe of mirror */
CT_RAID00, /* stripe of stripe */
CT_VOLUME_OF_MIRRORS, /* volume of mirror */
CT_PSEUDO_RAID3, /* really raid4 */
CT_RAID50, /* stripe of raid5 */
CT_RAID5D, /* raid5 distributed hot-sparing */
CT_RAID5D0,
CT_RAID1E, /* extended raid1 mirroring */
CT_RAID6,
CT_RAID60
} AAC_FSAVolType;
/*
* Container Configuration Sub-Commands
*/
typedef enum {
CT_Null = 0,
CT_GET_SLICE_COUNT, /* 1 */
CT_GET_PARTITION_COUNT, /* 2 */
CT_GET_PARTITION_INFO, /* 3 */
CT_GET_CONTAINER_COUNT, /* 4 */
CT_GET_CONTAINER_INFO_OLD, /* 5 */
CT_WRITE_MBR, /* 6 */
CT_WRITE_PARTITION, /* 7 */
CT_UPDATE_PARTITION, /* 8 */
CT_UNLOAD_CONTAINER, /* 9 */
CT_CONFIG_SINGLE_PRIMARY, /* 10 */
CT_READ_CONFIG_AGE, /* 11 */
CT_WRITE_CONFIG_AGE, /* 12 */
CT_READ_SERIAL_NUMBER, /* 13 */
CT_ZERO_PAR_ENTRY, /* 14 */
CT_READ_MBR, /* 15 */
CT_READ_PARTITION, /* 16 */
CT_DESTROY_CONTAINER, /* 17 */
CT_DESTROY2_CONTAINER, /* 18 */
CT_SLICE_SIZE, /* 19 */
CT_CHECK_CONFLICTS, /* 20 */
CT_MOVE_CONTAINER, /* 21 */
CT_READ_LAST_DRIVE, /* 22 */
CT_WRITE_LAST_DRIVE, /* 23 */
CT_UNMIRROR, /* 24 */
CT_MIRROR_DELAY, /* 25 */
CT_GEN_MIRROR, /* 26 */
CT_GEN_MIRROR2, /* 27 */
CT_TEST_CONTAINER, /* 28 */
CT_MOVE2, /* 29 */
CT_SPLIT, /* 30 */
CT_SPLIT2, /* 31 */
CT_SPLIT_BROKEN, /* 32 */
CT_SPLIT_BROKEN2, /* 33 */
CT_RECONFIG, /* 34 */
CT_BREAK2, /* 35 */
CT_BREAK, /* 36 */
CT_MERGE2, /* 37 */
CT_MERGE, /* 38 */
CT_FORCE_ERROR, /* 39 */
CT_CLEAR_ERROR, /* 40 */
CT_ASSIGN_FAILOVER, /* 41 */
CT_CLEAR_FAILOVER, /* 42 */
CT_GET_FAILOVER_DATA, /* 43 */
CT_VOLUME_ADD, /* 44 */
CT_VOLUME_ADD2, /* 45 */
CT_MIRROR_STATUS, /* 46 */
CT_COPY_STATUS, /* 47 */
CT_COPY, /* 48 */
CT_UNLOCK_CONTAINER, /* 49 */
CT_LOCK_CONTAINER, /* 50 */
CT_MAKE_READ_ONLY, /* 51 */
CT_MAKE_READ_WRITE, /* 52 */
CT_CLEAN_DEAD, /* 53 */
CT_ABORT_MIRROR_COMMAND, /* 54 */
CT_SET, /* 55 */
CT_GET, /* 56 */
CT_GET_NVLOG_ENTRY, /* 57 */
CT_GET_DELAY, /* 58 */
CT_ZERO_CONTAINER_SPACE, /* 59 */
CT_GET_ZERO_STATUS, /* 60 */
CT_SCRUB, /* 61 */
CT_GET_SCRUB_STATUS, /* 62 */
CT_GET_SLICE_INFO, /* 63 */
CT_GET_SCSI_METHOD, /* 64 */
CT_PAUSE_IO, /* 65 */
CT_RELEASE_IO, /* 66 */
CT_SCRUB2, /* 67 */
CT_MCHECK, /* 68 */
CT_CORRUPT, /* 69 */
CT_GET_TASK_COUNT, /* 70 */
CT_PROMOTE, /* 71 */
CT_SET_DEAD, /* 72 */
CT_CONTAINER_OPTIONS, /* 73 */
CT_GET_NV_PARAM, /* 74 */
CT_GET_PARAM, /* 75 */
CT_NV_PARAM_SIZE, /* 76 */
CT_COMMON_PARAM_SIZE, /* 77 */
CT_PLATFORM_PARAM_SIZE, /* 78 */
CT_SET_NV_PARAM, /* 79 */
CT_ABORT_SCRUB, /* 80 */
CT_GET_SCRUB_ERROR, /* 81 */
CT_LABEL_CONTAINER, /* 82 */
CT_CONTINUE_DATA, /* 83 */
CT_STOP_DATA, /* 84 */
CT_GET_PARTITION_TABLE, /* 85 */
CT_GET_DISK_PARTITIONS, /* 86 */
CT_GET_MISC_STATUS, /* 87 */
CT_GET_CONTAINER_PERF_INFO, /* 88 */
CT_GET_TIME, /* 89 */
CT_READ_DATA, /* 90 */
CT_CTR, /* 91 */
CT_CTL, /* 92 */
CT_DRAINIO, /* 93 */
CT_RELEASEIO, /* 94 */
CT_GET_NVRAM, /* 95 */
CT_GET_MEMORY, /* 96 */
CT_PRINT_CT_LOG, /* 97 */
CT_ADD_LEVEL, /* 98 */
CT_NV_ZERO, /* 99 */
CT_READ_SIGNATURE, /* 100 */
CT_THROTTLE_ON, /* 101 */
CT_THROTTLE_OFF, /* 102 */
CT_GET_THROTTLE_STATS, /* 103 */
CT_MAKE_SNAPSHOT, /* 104 */
CT_REMOVE_SNAPSHOT, /* 105 */
CT_WRITE_USER_FLAGS, /* 106 */
CT_READ_USER_FLAGS, /* 107 */
CT_MONITOR, /* 108 */
CT_GEN_MORPH, /* 109 */
CT_GET_SNAPSHOT_INFO, /* 110 */
CT_CACHE_SET, /* 111 */
CT_CACHE_STAT, /* 112 */
CT_TRACE_START, /* 113 */
CT_TRACE_STOP, /* 114 */
CT_TRACE_ENABLE, /* 115 */
CT_TRACE_DISABLE, /* 116 */
CT_FORCE_CORE_DUMP, /* 117 */
CT_SET_SERIAL_NUMBER, /* 118 */
CT_RESET_SERIAL_NUMBER, /* 119 */
CT_ENABLE_RAID5, /* 120 */
CT_CLEAR_VALID_DUMP_FLAG, /* 121 */
CT_GET_MEM_STATS, /* 122 */
CT_GET_CORE_SIZE, /* 123 */
CT_CREATE_CONTAINER_OLD, /* 124 */
CT_STOP_DUMPS, /* 125 */
CT_PANIC_ON_TAKE_A_BREAK, /* 126 */
CT_GET_CACHE_STATS, /* 127 */
CT_MOVE_PARTITION, /* 128 */
CT_FLUSH_CACHE, /* 129 */
CT_READ_NAME, /* 130 */
CT_WRITE_NAME, /* 131 */
CT_TOSS_CACHE, /* 132 */
CT_LOCK_DRAINIO, /* 133 */
CT_CONTAINER_OFFLINE, /* 134 */
CT_SET_CACHE_SIZE, /* 135 */
CT_CLEAN_SHUTDOWN_STATUS, /* 136 */
CT_CLEAR_DISKLOG_ON_DISK, /* 137 */
CT_CLEAR_ALL_DISKLOG, /* 138 */
CT_CACHE_FAVOR, /* 139 */
CT_READ_PASSTHRU_MBR, /* 140 */
CT_SCRUB_NOFIX, /* 141 */
CT_SCRUB2_NOFIX, /* 142 */
CT_FLUSH, /* 143 */
CT_REBUILD, /* 144 rma, not really a command, partner to CT_SCRUB */
CT_FLUSH_CONTAINER, /* 145 */
CT_RESTART, /* 146 */
CT_GET_CONFIG_STATUS, /* 147 */
CT_TRACE_FLAG, /* 148 */
CT_RESTART_MORPH, /* 149 */
CT_GET_TRACE_INFO, /* 150 */
CT_GET_TRACE_ITEM, /* 151 */
CT_COMMIT_CONFIG, /* 152 */
CT_CONTAINER_EXISTS, /* 153 */
CT_GET_SLICE_FROM_DEVT, /* 154 */
CT_OPEN_READ_WRITE, /* 155 */
CT_WRITE_MEMORY_BLOCK, /* 156 */
CT_GET_CACHE_PARAMS, /* 157 */
CT_CRAZY_CACHE, /* 158 */
CT_GET_PROFILE_STRUCT, /* 159 */
CT_SET_IO_TRACE_FLAG, /* 160 */
CT_GET_IO_TRACE_STRUCT, /* 161 */
CT_CID_TO_64BITS_UID, /* 162 */
CT_64BITS_UID_TO_CID, /* 163 */
CT_PAR_TO_64BITS_UID, /* 164 */
CT_CID_TO_32BITS_UID, /* 165 */
CT_32BITS_UID_TO_CID, /* 166 */
CT_PAR_TO_32BITS_UID, /* 167 */
CT_SET_FAILOVER_OPTION, /* 168 */
CT_GET_FAILOVER_OPTION, /* 169 */
CT_STRIPE_ADD2, /* 170 */
CT_CREATE_VOLUME_SET, /* 171 */
CT_CREATE_STRIPE_SET, /* 172 */
/* 173 command and partner to scrub and rebuild task types */
CT_VERIFY_CONTAINER,
CT_IS_CONTAINER_DEAD, /* 174 */
CT_GET_CONTAINER_OPTION, /* 175 */
CT_GET_SNAPSHOT_UNUSED_STRUCT, /* 176 */
CT_CLEAR_SNAPSHOT_UNUSED_STRUCT, /* 177 */
CT_GET_CONTAINER_INFO, /* 178 */
CT_CREATE_CONTAINER, /* 179 */
CT_CHANGE_CREATIONINFO, /* 180 */
CT_CHECK_CONFLICT_UID, /* 181 */
CT_CONTAINER_UID_CHECK, /* 182 */
/* 183 :RECmm: 20011220 added to support the Babylon */
CT_IS_CONTAINER_MEATADATA_STANDARD,
/* 184 :RECmm: 20011220 array imports */
CT_IS_SLICE_METADATA_STANDARD,
/* :BIOS_TEST: */
/* 185 :RECmm: 20020116 added to support BIOS interface for */
CT_GET_IMPORT_COUNT,
/* 186 :RECmm: 20020116 metadata conversion */
CT_CANCEL_ALL_IMPORTS,
CT_GET_IMPORT_INFO, /* 187 :RECmm: 20020116 " */
CT_IMPORT_ARRAY, /* 188 :RECmm: 20020116 " */
CT_GET_LOG_SIZE, /* 189 */
/* Not BIOS TEST */
CT_ALARM_GET_STATE, /* 190 */
CT_ALARM_SET_STATE, /* 191 */
CT_ALARM_ON_OFF, /* 192 */
CT_GET_EE_OEM_ID, /* 193 */
CT_GET_PPI_HEADERS, /* 194 get header fields only */
CT_GET_PPI_DATA, /* 195 get all ppitable.data */
/* 196 get only range of entries specified in c_params */
CT_GET_PPI_ENTRIES,
/* 197 remove ppitable bundle specified by uid in c_param0 */
CT_DELETE_PPI_BUNDLE,
/* 198 current partition structure (not legacy) */
CT_GET_PARTITION_TABLE_2,
CT_GET_PARTITION_INFO_2,
CT_GET_DISK_PARTITIONS_2,
CT_QUIESCE_ADAPTER, /* 201 chill dude */
CT_CLEAR_PPI_TABLE, /* 202 clear ppi table */
CT_SET_DEVICE_CACHE_POLICY, /* 203 */
CT_GET_DEVICE_CACHE_POLICY, /* 204 */
CT_SET_VERIFY_DELAY, /* 205 */
CT_GET_VERIFY_DELAY, /* 206 */
/* 207 delete all PPI bundles that have an entry for device at devt */
CT_DELETE_PPI_BUNDLES_FOR_DEVT,
CT_READ_SW_SECTOR, /* 208 */
CT_WRITE_SW_SECTOR, /* 209 */
/* 210 added to support firmware cache sync operations */
CT_GET_CACHE_SYNC_INFO,
CT_SET_CACHE_SYNC_MODE, /* 211 */
CT_PM_DRIVER_SUPPORT, /* 212 */
CT_PM_CONFIGURATION, /* 213 */
CT_LAST_COMMAND /* last command */
} AAC_CTCommand;
/* General return status */
#define CT_OK 218
/* CT_PM_DRIVER_SUPPORT parameter */
typedef enum {
AAC_PM_DRIVERSUP_GET_STATUS = 1,
AAC_PM_DRIVERSUP_START_UNIT,
AAC_PM_DRIVERSUP_STOP_UNIT
} AAC_CT_PM_DRIVER_SUPPORT_SUB_COM;
struct aac_fsa_ctm {
uint32_t command;
uint32_t param[CT_FIB_PARAMS];
int8_t data[CT_PACKET_SIZE];
};
struct aac_Container {
uint32_t Command;
struct aac_fsa_ctm CTCommand;
};
struct aac_fsa_ctr {
uint32_t response;
uint32_t param[CT_FIB_PARAMS];
int8_t data[CT_PACKET_SIZE];
};
struct aac_Container_resp {
uint32_t Status;
struct aac_fsa_ctr CTResponse;
};
struct aac_cf_status_header {
uint32_t action;
uint16_t flags;
int16_t recordcount;
};
enum aac_cf_action_type {
CFACT_CONTINUE = 0, /* Continue without pause */
CFACT_PAUSE, /* Pause, then continue */
CFACT_ABORT /* Abort */
};
enum aac_mpe {
AACMPE_OK = 0x0,
AACMPE_GET_CONFIG_STATUS = 0x1,
AACMPE_CONFIG_STATUS = 0x2,
AACMPE_COMMIT_CONFIG = 0x3
};
/*
* CT_PAUSE_IO is immediate minimal runtime command that is used
* to restart the applications and cache.
*/
struct aac_pause_command {
uint32_t Command;
uint32_t Type;
uint32_t Timeout;
uint32_t Min;
uint32_t NoRescan;
uint32_t Parm3;
uint32_t Parm4;
uint32_t Count;
};
/*
* The following two definitions come from Adaptec:
*
* Used to flush drive cache for container "cid"
*/
struct aac_synchronize_command {
uint32_t Command; /* VM_ContainerConfig */
uint32_t Type; /* CT_FLUSH_CACHE */
uint32_t Cid;
uint32_t Parm1;
uint32_t Parm2;
uint32_t Parm3;
uint32_t Parm4;
uint32_t Count;
};
struct aac_synchronize_reply {
uint32_t Dummy0;
uint32_t Dummy1;
uint32_t Status;
uint32_t Parm1;
uint32_t Parm2;
uint32_t Parm3;
uint32_t Parm4;
uint32_t Parm5;
uint8_t Data[16];
};
/*
* Command status values
*/
typedef enum {
ST_OK = 0,
ST_PERM = 1,
ST_NOENT = 2,
ST_IO = 5,
ST_NXIO = 6,
ST_E2BIG = 7,
ST_ACCES = 13,
ST_EXIST = 17,
ST_XDEV = 18,
ST_NODEV = 19,
ST_NOTDIR = 20,
ST_ISDIR = 21,
ST_INVAL = 22,
ST_FBIG = 27,
ST_NOSPC = 28,
ST_ROFS = 30,
ST_MLINK = 31,
ST_WOULDBLOCK = 35,
ST_NAMETOOLONG = 63,
ST_NOTEMPTY = 66,
ST_DQUOT = 69,
ST_STALE = 70,
ST_REMOTE = 71,
ST_BADHANDLE = 10001,
ST_NOT_SYNC = 10002,
ST_BAD_COOKIE = 10003,
ST_NOTSUPP = 10004,
ST_TOOSMALL = 10005,
ST_SERVERFAULT = 10006,
ST_BADTYPE = 10007,
ST_JUKEBOX = 10008,
ST_NOTMOUNTED = 10009,
ST_MAINTMODE = 10010,
ST_STALEACL = 10011
} AAC_FSAStatus;
/*
* Object-Server / Volume-Manager Dispatch Classes
*/
typedef enum {
VM_Null = 0,
VM_NameServe,
VM_ContainerConfig,
VM_Ioctl,
VM_FilesystemIoctl,
VM_CloseAll,
VM_CtBlockRead,
VM_CtBlockWrite,
VM_SliceBlockRead, /* raw access to configured "storage objects" */
VM_SliceBlockWrite,
VM_DriveBlockRead, /* raw access to physical devices */
VM_DriveBlockWrite,
VM_EnclosureMgt, /* enclosure management */
VM_Unused, /* used to be diskset management */
VM_CtBlockVerify,
VM_CtPerf, /* performance test */
VM_CtBlockRead64,
VM_CtBlockWrite64,
VM_CtBlockVerify64,
VM_CtHostRead64,
VM_CtHostWrite64,
VM_NameServe64 = 22,
MAX_VMCOMMAND_NUM /* used for sizing stats array - leave last */
} AAC_VMCommand;
/*
* Host-addressable object types
*/
typedef enum {
FT_REG = 1, /* regular file */
FT_DIR, /* directory */
FT_BLK, /* "block" device - reserved */
FT_CHR, /* "character special" device - reserved */
FT_LNK, /* symbolic link */
FT_SOCK, /* socket */
FT_FIFO, /* fifo */
FT_FILESYS, /* ADAPTEC's "FSA"(tm) filesystem */
FT_DRIVE, /* physical disk - addressable in scsi by b/t/l */
FT_SLICE, /* virtual disk - raw volume - slice */
FT_PARTITION, /* FSA partition - carved out of a slice - building */
/* block for containers */
FT_VOLUME, /* Container - Volume Set */
FT_STRIPE, /* Container - Stripe Set */
FT_MIRROR, /* Container - Mirror Set */
FT_RAID5, /* Container - Raid 5 Set */
FT_DATABASE /* Storage object with "foreign" content manager */
} AAC_FType;
/* Host-side scatter/gather list for 32-bit, 64-bit, raw commands */
struct aac_sg_entry {
uint32_t SgAddress;
uint32_t SgByteCount;
};
struct aac_sg_entry64 {
uint64_t SgAddress;
uint32_t SgByteCount;
};
struct aac_sg_entryraw {
uint32_t Next; /* reserved */
uint32_t Prev; /* reserved */
uint64_t SgAddress;
uint32_t SgByteCount;
uint32_t Flags; /* reserved */
};
struct aac_sg_table {
uint32_t SgCount;
struct aac_sg_entry SgEntry[1]; /* at least there is one */
/* SUN's CC cannot accept [0] */
};
struct aac_sg_table64 {
uint32_t SgCount;
struct aac_sg_entry64 SgEntry64[1];
};
struct aac_sg_tableraw {
uint32_t SgCount;
struct aac_sg_entryraw SgEntryRaw[1];
};
/*
* Block read/write operations.
* These structures are packed into the 'data' area in the FIB.
*/
struct aac_blockread {
uint32_t Command;
uint32_t ContainerId;
uint32_t BlockNumber;
uint32_t ByteCount;
struct aac_sg_table SgMap;
};
struct aac_blockread64 {
uint32_t Command;
uint16_t ContainerId;
uint16_t SectorCount;
uint32_t BlockNumber;
uint16_t Pad;
uint16_t Flags;
struct aac_sg_table64 SgMap64;
};
struct aac_blockread_response {
uint32_t Status;
uint32_t ByteCount;
};
struct aac_blockwrite {
uint32_t Command;
uint32_t ContainerId;
uint32_t BlockNumber;
uint32_t ByteCount;
uint32_t Stable;
struct aac_sg_table SgMap;
};
struct aac_blockwrite64 {
uint32_t Command;
uint16_t ContainerId;
uint16_t SectorCount;
uint32_t BlockNumber;
uint16_t Pad;
uint16_t Flags;
struct aac_sg_table64 SgMap64;
};
struct aac_blockwrite_response {
uint32_t Status;
uint32_t ByteCount;
uint32_t Committed;
};
struct aac_raw_io {
uint64_t BlockNumber;
uint32_t ByteCount;
uint16_t ContainerId;
uint16_t Flags; /* 0: W, 1: R */
uint16_t BpTotal; /* reserved */
uint16_t BpComplete; /* reserved */
struct aac_sg_tableraw SgMapRaw;
};
/*
* Container shutdown command.
*/
struct aac_close_command {
uint32_t Command;
uint32_t ContainerId;
};
/*
* Container Config Command
*/
struct aac_ctcfg {
uint32_t Command;
uint32_t cmd;
uint32_t param;
};
struct aac_ctcfg_resp {
uint32_t Status;
uint32_t resp;
uint32_t param;
};
/* Write 'stability' options */
#define CSTABLE 1
#define CUNSTABLE 2
/* Number of FIBs for the controller to send us messages */
#define AAC_ADAPTER_FIBS 8
/* Number of FIBs for the host I/O request */
#define AAC_HOST_FIBS 256
/* Size of buffer for text messages from the controller */
#define AAC_ADAPTER_PRINT_BUFSIZE 256
#define AAC_INIT_STRUCT_REVISION 3
#define AAC_INIT_STRUCT_REVISION_4 4
#define AAC_INIT_STRUCT_MINIPORT_REVISION 1
#define AAC_INIT_FLAGS_NEW_COMM_SUPPORTED 1
#define AAC_INIT_FLAGS_DRIVER_USES_UTC_TIME 0x10
#define AAC_INIT_FLAGS_DRIVER_SUPPORTS_PM 0x20
#define AAC_PAGE_SIZE 4096
struct aac_adapter_init {
uint32_t InitStructRevision;
uint32_t MiniPortRevision;
uint32_t FilesystemRevision;
uint32_t CommHeaderAddress;
uint32_t FastIoCommAreaAddress;
uint32_t AdapterFibsPhysicalAddress;
uint32_t AdapterFibsVirtualAddress;
uint32_t AdapterFibsSize;
uint32_t AdapterFibAlign;
uint32_t PrintfBufferAddress;
uint32_t PrintfBufferSize;
uint32_t HostPhysMemPages;
uint32_t HostElapsedSeconds;
/* ADAPTER_INIT_STRUCT_REVISION_4 begins here */
uint32_t InitFlags;
uint32_t MaxIoCommands;
uint32_t MaxIoSize;
uint32_t MaxFibSize;
};
/* ************AAC QUEUE DEFINES (BELOW)*********** */
#define AAC_QUEUE_ALIGN 16
#define AAC_QUEUE_COUNT 8
#define AAC_PRODUCER_INDEX 0
#define AAC_CONSUMER_INDEX 1
struct aac_queue_entry {
uint32_t aq_fib_size; /* FIB size in bytes */
uint32_t aq_fib_addr; /* receiver-space address of the FIB */
};
/*
* Queue names
*
* Note that we base these at 0 in order to use them as array indices.
* Adaptec used base 1 for some unknown reason, and sorted them in a
* different order.
*/
#define AAC_HOST_NORM_CMD_Q 0
#define AAC_HOST_HIGH_CMD_Q 1
#define AAC_ADAP_NORM_CMD_Q 2
#define AAC_ADAP_HIGH_CMD_Q 3
#define AAC_HOST_NORM_RESP_Q 4
#define AAC_HOST_HIGH_RESP_Q 5
#define AAC_ADAP_NORM_RESP_Q 6
#define AAC_ADAP_HIGH_RESP_Q 7
/*
* We establish 4 command queues and matching response queues. Queues must
* be 16-byte aligned, and are sized as follows:
*/
/* command adapter->host, normal priority */
#define AAC_HOST_NORM_CMD_ENTRIES 8
/* command adapter->host, high priority */
#define AAC_HOST_HIGH_CMD_ENTRIES 4
/* command host->adapter, normal priority */
#define AAC_ADAP_NORM_CMD_ENTRIES 512
/* command host->adapter, high priority */
#define AAC_ADAP_HIGH_CMD_ENTRIES 4
/* response, adapter->host, normal priority */
#define AAC_HOST_NORM_RESP_ENTRIES 512
/* response, adapter->host, high priority */
#define AAC_HOST_HIGH_RESP_ENTRIES 4
/* response, host->adapter, normal priority */
#define AAC_ADAP_NORM_RESP_ENTRIES 8
/* response, host->adapter, high priority */
#define AAC_ADAP_HIGH_RESP_ENTRIES 4
#define AAC_TOTALQ_LENGTH (AAC_HOST_HIGH_CMD_ENTRIES + \
AAC_HOST_NORM_CMD_ENTRIES + \
AAC_ADAP_HIGH_CMD_ENTRIES + \
AAC_ADAP_NORM_CMD_ENTRIES + \
AAC_HOST_HIGH_RESP_ENTRIES + \
AAC_HOST_NORM_RESP_ENTRIES + \
AAC_ADAP_HIGH_RESP_ENTRIES + \
AAC_ADAP_NORM_RESP_ENTRIES)
/*
* Table of queue indices and queues used to communicate with the
* controller. This structure must be aligned to AAC_QUEUE_ALIGN.
*/
struct aac_queue_table {
/* queue consumer/producer indexes (layout mandated by adapter) */
uint32_t qt_qindex[AAC_QUEUE_COUNT][2];
/* queue entry structures (layout mandated by adapter) */
struct aac_queue_entry qt_HostNormCmdQueue \
[AAC_HOST_NORM_CMD_ENTRIES];
struct aac_queue_entry qt_HostHighCmdQueue \
[AAC_HOST_HIGH_CMD_ENTRIES];
struct aac_queue_entry qt_AdapNormCmdQueue \
[AAC_ADAP_NORM_CMD_ENTRIES];
struct aac_queue_entry qt_AdapHighCmdQueue \
[AAC_ADAP_HIGH_CMD_ENTRIES];
struct aac_queue_entry qt_HostNormRespQueue \
[AAC_HOST_NORM_RESP_ENTRIES];
struct aac_queue_entry qt_HostHighRespQueue \
[AAC_HOST_HIGH_RESP_ENTRIES];
struct aac_queue_entry qt_AdapNormRespQueue \
[AAC_ADAP_NORM_RESP_ENTRIES];
struct aac_queue_entry qt_AdapHighRespQueue \
[AAC_ADAP_HIGH_RESP_ENTRIES];
};
/* ************AAC QUEUE DEFINES (ABOVE)*********** */
/*
* NVRAM/Write Cache subsystem battery component states
*/
typedef enum {
NVBATTSTATUS_NONE = 0, /* battery has no power or is not present */
NVBATTSTATUS_LOW, /* battery is low on power */
NVBATTSTATUS_OK, /* battery is okay - normal operation */
/* possible only in this state */
NVBATTSTATUS_RECONDITIONING /* no battery present */
/* - reconditioning in process */
} AAC_NVBATTSTATUS;
/*
* Battery transition type
*/
typedef enum {
NVBATT_TRANSITION_NONE = 0, /* battery now has no power or is not */
/* present */
NVBATT_TRANSITION_LOW, /* battery is now low on power */
NVBATT_TRANSITION_OK /* battery is now okay - normal */
/* operation possible only in this state */
} AAC_NVBATT_TRANSITION;
/*
* Data types relating to AIFs
*/
/*
* Progress Reports
*/
typedef enum {
AifJobStsSuccess = 1,
AifJobStsFinished,
AifJobStsAborted,
AifJobStsFailed,
AifJobStsLastReportMarker = 100, /* All prior mean last report */
AifJobStsSuspended,
AifJobStsRunning
} AAC_AifJobStatus;
typedef enum {
AifJobScsiMin = 1, /* Minimum value for Scsi operation */
AifJobScsiZero, /* SCSI device clear operation */
AifJobScsiVerify, /* SCSI device Verify operation NO REPAIR */
AifJobScsiExercise, /* SCSI device Exercise operation */
AifJobScsiVerifyRepair, /* SCSI device Verify operation WITH repair */
AifJobScsiWritePattern, /* write pattern */
AifJobScsiMax = 99, /* Max Scsi value */
AifJobCtrMin, /* Min Ctr op value */
AifJobCtrZero, /* Container clear operation */
AifJobCtrCopy, /* Container copy operation */
AifJobCtrCreateMirror, /* Container Create Mirror operation */
AifJobCtrMergeMirror, /* Container Merge Mirror operation */
AifJobCtrScrubMirror, /* Container Scrub Mirror operation */
AifJobCtrRebuildRaid5, /* Container Rebuild Raid5 operation */
AifJobCtrScrubRaid5, /* Container Scrub Raid5 operation */
AifJobCtrMorph, /* Container morph operation */
AifJobCtrPartCopy, /* Container Partition copy operation */
AifJobCtrRebuildMirror, /* Container Rebuild Mirror operation */
AifJobCtrCrazyCache, /* crazy cache */
AifJobCtrCopyback, /* Container Copyback operation */
AifJobCtrCompactRaid5D, /* Container Compaction operation */
AifJobCtrExpandRaid5D, /* Container Expansion operation */
AifJobCtrRebuildRaid6, /* Container Rebuild Raid6 operation */
AifJobCtrScrubRaid6, /* Container Scrub Raid6 operation */
AifJobCtrSSBackup, /* Container snapshot backup task */
AifJobCtrMax = 199, /* Max Ctr type operation */
AifJobFsMin, /* Min Fs type operation */
AifJobFsCreate, /* File System Create operation */
AifJobFsVerify, /* File System Verify operation */
AifJobFsExtend, /* File System Extend operation */
AifJobFsMax = 299, /* Max Fs type operation */
AifJobApiFormatNTFS, /* Format a drive to NTFS */
AifJobApiFormatFAT, /* Format a drive to FAT */
AifJobApiUpdateSnapshot, /* update the read/write half of a snapshot */
AifJobApiFormatFAT32, /* Format a drive to FAT32 */
AifJobApiMax = 399, /* Max API type operation */
AifJobCtlContinuousCtrVerify, /* Adapter operation */
AifJobCtlMax = 499 /* Max Adapter type operation */
} AAC_AifJobType;
struct aac_AifContainers {
uint32_t src; /* from/master */
uint32_t dst; /* to/slave */
};
union aac_AifJobClient {
struct aac_AifContainers container; /* For Container and */
/* filesystem progress ops */
int32_t scsi_dh; /* For SCSI progress ops */
};
struct aac_AifJobDesc {
uint32_t jobID; /* DO NOT FILL IN! Will be filled in by AIF */
AAC_AifJobType type; /* Operation that is being performed */
union aac_AifJobClient client; /* Details */
};
struct aac_AifJobProgressReport {
struct aac_AifJobDesc jd;
AAC_AifJobStatus status;
uint32_t finalTick;
uint32_t currentTick;
uint32_t jobSpecificData1;
uint32_t jobSpecificData2;
};
/*
* Event Notification
*/
typedef enum {
/* General application notifies start here */
AifEnGeneric = 1, /* Generic notification */
AifEnTaskComplete, /* Task has completed */
AifEnConfigChange, /* Adapter config change occurred */
AifEnContainerChange, /* Adapter specific container cfg. change */
AifEnDeviceFailure, /* SCSI device failed */
AifEnMirrorFailover, /* Mirror failover started */
AifEnContainerEvent, /* Significant container event */
AifEnFileSystemChange, /* File system changed */
AifEnConfigPause, /* Container pause event */
AifEnConfigResume, /* Container resume event */
AifEnFailoverChange, /* Failover space assignment changed */
AifEnRAID5RebuildDone, /* RAID5 rebuild finished */
AifEnEnclosureManagement, /* Enclosure management event */
AifEnBatteryEvent, /* Significant NV battery event */
AifEnAddContainer, /* A new container was created. */
AifEnDeleteContainer, /* A container was deleted. */
AifEnSMARTEvent, /* SMART Event */
AifEnBatteryNeedsRecond, /* The battery needs reconditioning */
AifEnClusterEvent, /* Some cluster event */
AifEnDiskSetEvent, /* A disk set event occured. */
AifEnAddJBOD = 30, /* A new JBOD type drive was created (30) */
AifEnDeleteJBOD = 31, /* A JBOD type drive was deleted (31) */
AifDriverNotifyStart = 199, /* Notifies for host driver go here */
/* Host driver notifications start here */
AifDenMorphComplete, /* A morph operation completed */
AifDenVolumeExtendComplete /* Volume expand operation completed */
} AAC_AifEventNotifyType;
struct aac_AifEnsGeneric {
char text[132]; /* Generic text */
};
struct aac_AifEnsDeviceFailure {
uint32_t deviceHandle; /* SCSI device handle */
};
struct aac_AifEnsMirrorFailover {
uint32_t container; /* Container with failed element */
uint32_t failedSlice; /* Old slice which failed */
uint32_t creatingSlice; /* New slice used for auto-create */
};
struct aac_AifEnsContainerChange {
uint32_t container[2]; /* container that changed, -1 if */
/* no container */
};
struct aac_AifEnsContainerEvent {
uint32_t container; /* container number */
uint32_t eventType; /* event type */
};
struct aac_AifEnsEnclosureEvent {
uint32_t empID; /* enclosure management proc number */
uint32_t unitID; /* unitId, fan id, power supply id, */
/* slot id, tempsensor id. */
uint32_t eventType; /* event type */
};
struct aac_AifEnsBatteryEvent {
AAC_NVBATT_TRANSITION transition_type; /* eg from low to ok */
AAC_NVBATTSTATUS current_state; /* current batt state */
AAC_NVBATTSTATUS prior_state; /* prev batt state */
};
struct aac_AifEnsDiskSetEvent {
uint32_t eventType;
uint64_t DsNum;
uint64_t CreatorId;
};
typedef enum {
CLUSTER_NULL_EVENT = 0,
CLUSTER_PARTNER_NAME_EVENT, /* change in partner hostname or */
/* adaptername from NULL to non-NULL */
/* (partner's agent may be up) */
CLUSTER_PARTNER_NULL_NAME_EVENT /* change in partner hostname or */
/* adaptername from non-null to NULL */
/* (partner has rebooted) */
} AAC_ClusterAifEvent;
struct aac_AifEnsClusterEvent {
AAC_ClusterAifEvent eventType;
};
struct aac_AifEventNotify {
AAC_AifEventNotifyType type;
union {
struct aac_AifEnsGeneric EG;
struct aac_AifEnsDeviceFailure EDF;
struct aac_AifEnsMirrorFailover EMF;
struct aac_AifEnsContainerChange ECC;
struct aac_AifEnsContainerEvent ECE;
struct aac_AifEnsEnclosureEvent EEE;
struct aac_AifEnsBatteryEvent EBE;
struct aac_AifEnsDiskSetEvent EDS;
/* struct aac_AifEnsSMARTEvent ES; */
struct aac_AifEnsClusterEvent ECLE;
} data;
};
/*
* Adapter Initiated FIB command structures. Start with the adapter
* initiated FIBs that really come from the adapter, and get responded
* to by the host.
*/
#define AAC_AIF_REPORT_MAX_SIZE 64
typedef enum {
AifCmdEventNotify = 1, /* Notify of event */
AifCmdJobProgress, /* Progress report */
AifCmdAPIReport, /* Report from other user of API */
AifCmdDriverNotify, /* Notify host driver of event */
AifReqJobList = 100, /* Gets back complete job list */
AifReqJobsForCtr, /* Gets back jobs for specific container */
AifReqJobsForScsi, /* Gets back jobs for specific SCSI device */
AifReqJobReport, /* Gets back a specific job report or list */
AifReqTerminateJob, /* Terminates job */
AifReqSuspendJob, /* Suspends a job */
AifReqResumeJob, /* Resumes a job */
AifReqSendAPIReport, /* API generic report requests */
AifReqAPIJobStart, /* Start a job from the API */
AifReqAPIJobUpdate, /* Update a job report from the API */
AifReqAPIJobFinish /* Finish a job from the API */
} AAC_AifCommand;
struct aac_aif_command {
AAC_AifCommand command; /* Tell host what type of notify this is */
uint32_t seqNumber; /* To allow ordering of reports */
/* (if necessary) */
union {
struct aac_AifEventNotify EN; /* Event notify */
struct aac_AifJobProgressReport PR[1]; /* Progress report */
uint8_t AR[AAC_AIF_REPORT_MAX_SIZE];
uint8_t data[AAC_FIB_DATASIZE - 8];
} data;
};
#define CT_PUP_MISSING_DRIVE 27
/*
* Cluster Management Commands
*/
typedef enum {
CL_NULL = 0, /* 0x00 null */
/* disk set commands */
DS_INIT = 1, /* 0x01 init disk set control block */
DS_RESCAN, /* 0x02 refresh drive, disk set, and slice */
/* structs */
DS_CREATE, /* 0x03 create a disk set */
DS_DELETE, /* 0x04 delete a disk set */
DS_ADD_DISK, /* 0x05 add a disk to an existing disk set */
DS_REMOVE_DISK, /* 0x06 remove a disk from an existing disk */
/* set */
DS_MOVE_DISK, /* 0x07 move a disk from one existing disk */
/* set to another */
DS_TAKE_OWNERSHIP, /* 0x08 take ownership of an unowned disk set */
DS_RELEASE_OWNERSHIP, /* 0x09 release ownership of a disk set */
DS_FORCE_OWNERSHIP, /* 0x0A force ownership of an disk set */
DS_GET_DISK_SET_PARAM, /* 0x0B get info on a disk set */
DS_GET_DRIVE_PARAM, /* 0x0C get info on a drive */
DS_GET_SLICE_PARAM, /* 0x0D get info on a slice */
DS_GET_DISK_SETS, /* 0x0E get a list of disk sets */
DS_GET_DRIVES, /* 0x0F get a list of drives */
DS_SET_DISK_SET_PARAM, /* 0x10 set info of a disk set */
DS_ONLINE, /* 0x11 take disk set online */
DS_OFFLINE, /* 0x12 take disk set offline */
DS_ONLINE_CONTAINERS, /* 0x13 bring containers in diskset online */
DS_FSAPRINT, /* 0x14 do an FsaPrint */
/* config commands */
CL_CFG_SET_HOST_IDS = 0x100, /* 0x100 set host ids (host name and */
/* adapter name) */
CL_CFG_SET_PARTNER_HOST_IDS, /* 0x101 set partner host ids (host */
/* name and adapter name) */
CL_CFG_GET_CLUSTER_CONFIG, /* 0x102 get cluster configuration */
/* cluster comm commands */
CC_CLI_CLEAR_MESSAGE_BUFFER = 0x200, /* 0x200 CC - client - clear */
/* contents of message buffer */
CC_SRV_CLEAR_MESSAGE_BUFFER, /* 0x201 CC - server - clear contents */
/* of message buffer */
CC_CLI_SHOW_MESSAGE_BUFFER, /* 0x202 CC - client - show contents */
/* of message buffer */
CC_SRV_SHOW_MESSAGE_BUFFER, /* 0x203 CC - server - show contents */
/* of message buffer */
CC_CLI_SEND_MESSAGE, /* 0x204 CC - client - send (req) message to */
/* server side */
CC_SRV_SEND_MESSAGE, /* 0x205 CC - server - send (reply) message */
/* to client side */
CC_CLI_GET_MESSAGE, /* 0x206 CC - client - read thru read message */
/* buffer */
CC_SRV_GET_MESSAGE, /* 0x207 CC - server - read thru read message */
/* buffer */
CC_SEND_TEST_MESSAGE, /* 0x208 CC - send a special subclass message */
CC_GET_BUSINFO, /* 0x209 CC - get bus info */
CC_GET_PORTINFO, /* 0x20A CC - get bus,port info */
CC_GET_NAMEINFO, /* 0x20B CC - get misc info */
CC_GET_CONFIGINFO, /* 0x20C CC - get misc info */
CQ_QUORUM_OP = 0x300, /* 0x300 CQ - quorum messages */
/* last command */
CL_LAST_COMMAND /* used for bounds checking */
} AAC_CLCommand;
/*
* Disk IOCTL Functions
*/
#define Reserved_IOCTL 0x0000
#define GetDeviceHandle 0x0001
#define BusTargetLun_to_DeviceHandle 0x0002
#define DeviceHandle_to_BusTargetLun 0x0003
#define RescanBus 0x0004
#define GetDeviceProbeInfo 0x0005
#define GetDeviceCapacity 0x0006
#define GetContainerProbeInfo 0x0007 /* Container, not diskclass */
/* ioctl */
#define GetRequestedMemorySize 0x0008
#define GetBusInfo 0x0009
#define GetVendorSpecific 0x000a
#define EnhancedGetDeviceProbeInfo 0x000b
#define EnhancedGetBusInfo 0x000c
#define SetupExtendedCounters 0x000d
#define GetPerformanceCounters 0x000f
#define ResetPerformanceCounters 0x0010
#define ReadModePage 0x0011
#define WriteModePage 0x0012
#define ReadDriveParameter 0x0013
#define WriteDriveParameter 0x0014
#define ResetAdapter 0x0015
#define ResetBus 0x0016
#define ResetBusDevice 0x0017
#define ExecuteSrb 0x0018
#define Create_IO_Task 0x0030
#define Delete_IO_Task 0x0031
#define Get_IO_Task_Info 0x0032
#define Check_Task_Progress 0x0033
#define InjectError 0x0040
#define GetDeviceDefectCounts 0x0041
#define GetDeviceDefectInfo 0x0042
#define GetDeviceStatus 0x0043
#define ClearDeviceStatus 0x0044
#define DiskSpinControl 0x0045
#define DiskSmartControl 0x0046
#define WriteSame 0x0047
#define ReadWriteLong 0x0048
#define FormatUnit 0x0049
#define TargetDeviceControl 0x0050
#define TargetChannelControl 0x0051
#define FlashNewCode 0x0052
#define DiskCheck 0x0053
#define RequestSense 0x0054
#define DiskPERControl 0x0055
#define Read10 0x0056
#define Write10 0x0057
/*
* The following definitions come from Adaptec:
*
* SRB is required for the new management tools
* and non-DASD support.
*/
struct aac_srb
{
uint32_t function;
uint32_t channel;
uint32_t id;
uint32_t lun;
uint32_t timeout; /* timeout in sec. */
uint32_t flags;
uint32_t count; /* data xfer size */
uint32_t retry_limit; /* obsolete */
uint32_t cdb_size;
uint8_t cdb[16];
struct aac_sg_table sg;
};
#define AAC_SENSE_BUFFERSIZE 30
struct aac_srb_reply
{
uint32_t status;
uint32_t srb_status;
uint32_t scsi_status;
uint32_t data_xfer_length;
uint32_t sense_data_size;
uint8_t sense_data[AAC_SENSE_BUFFERSIZE];
};
/*
* SRB Flags
*/
#define SRB_NoDataXfer 0x0000
#define SRB_DisableDisconnect 0x0004
#define SRB_DisableSynchTransfer 0x0008
#define SRB_BypassFrozenQueue 0x0010
#define SRB_DisableAutosense 0x0020
#define SRB_DataIn 0x0040
#define SRB_DataOut 0x0080
/*
* SRB Functions - set in aac_srb->function
*/
#define SRBF_ExecuteScsi 0x0000
#define SRBF_ClaimDevice 0x0001
#define SRBF_IO_Control 0x0002
#define SRBF_ReceiveEvent 0x0003
#define SRBF_ReleaseQueue 0x0004
#define SRBF_AttachDevice 0x0005
#define SRBF_ReleaseDevice 0x0006
#define SRBF_Shutdown 0x0007
#define SRBF_Flush 0x0008
#define SRBF_AbortCommand 0x0010
#define SRBF_ReleaseRecovery 0x0011
#define SRBF_ResetBus 0x0012
#define SRBF_ResetDevice 0x0013
#define SRBF_TerminateIO 0x0014
#define SRBF_FlushQueue 0x0015
#define SRBF_RemoveDevice 0x0016
#define SRBF_DomainValidation 0x0017
/*
* SRB SCSI Status
* Status codes for SCSI passthrough commands,
* set in aac_srb->scsi_status
*/
#define SRB_STATUS_PENDING 0x00
#define SRB_STATUS_SUCCESS 0x01
#define SRB_STATUS_ABORTED 0x02
#define SRB_STATUS_ABORT_FAILED 0x03
#define SRB_STATUS_ERROR 0x04
#define SRB_STATUS_BUSY 0x05
#define SRB_STATUS_INVALID_REQUEST 0x06
#define SRB_STATUS_INVALID_PATH_ID 0x07
#define SRB_STATUS_NO_DEVICE 0x08
#define SRB_STATUS_TIMEOUT 0x09
#define SRB_STATUS_SELECTION_TIMEOUT 0x0A
#define SRB_STATUS_COMMAND_TIMEOUT 0x0B
#define SRB_STATUS_MESSAGE_REJECTED 0x0D
#define SRB_STATUS_BUS_RESET 0x0E
#define SRB_STATUS_PARITY_ERROR 0x0F
#define SRB_STATUS_REQUEST_SENSE_FAILED 0x10
#define SRB_STATUS_NO_HBA 0x11
#define SRB_STATUS_DATA_OVERRUN 0x12
#define SRB_STATUS_UNEXPECTED_BUS_FREE 0x13
#define SRB_STATUS_PHASE_SEQUENCE_FAILURE 0x14
#define SRB_STATUS_BAD_SRB_BLOCK_LENGTH 0x15
#define SRB_STATUS_REQUEST_FLUSHED 0x16
#define SRB_STATUS_DELAYED_RETRY 0x17
#define SRB_STATUS_INVALID_LUN 0x20
#define SRB_STATUS_INVALID_TARGET_ID 0x21
#define SRB_STATUS_BAD_FUNCTION 0x22
#define SRB_STATUS_ERROR_RECOVERY 0x23
#define SRB_STATUS_NOT_STARTED 0x24
#define SRB_STATUS_NOT_IN_USE 0x30
#define SRB_STATUS_FORCE_ABORT 0x31
#define SRB_STATUS_DOMAIN_VALIDATION_FAIL 0x32
#pragma pack()
/*
* Aligned structure definition for variable declarations that require
* alignment.
*/
union aac_fib_align {
struct aac_fib d;
uint32_t dumb;
};
/* AAC Communication Space */
struct aac_comm_space {
struct aac_fib adapter_fibs[AAC_ADAPTER_FIBS];
struct aac_adapter_init init_data;
struct aac_queue_table qtable;
char qt_align_pad[AAC_QUEUE_ALIGN];
char adapter_print_buf[AAC_ADAPTER_PRINT_BUFSIZE];
};
#ifdef __cplusplus
}
#endif
#endif /* __AAC_REGS_H__ */