root/usr/src/uts/common/io/aac/aac_regs.h
/*
 * 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__ */