root/usr/src/uts/common/io/mr_sas/fusion.h
/*
 * fusion.h
 *
 * Solaris MegaRAID device driver for SAS2.0 controllers
 * Copyright (c) 2008-2012, LSI Logic Corporation.
 * All rights reserved.
 *
 * Version:
 * Author:
 *              Swaminathan K S
 *              Arun Chandrashekhar
 *              Manju R
 *              Rasheed
 *              Shakeel Bukhari
 */


#ifndef _FUSION_H_
#define _FUSION_H_

#define U64     uint64_t
#define U32     uint32_t
#define U16     uint16_t
#define U8      uint8_t
#define S8      char
#define S16     short
#define S32     int

/* MPI2 defines */
#define MPI2_REPLY_POST_HOST_INDEX_OFFSET       (0x6C)
#define MPI2_FUNCTION_IOC_INIT                  (0x02) /* IOC Init */
#define MPI2_WHOINIT_HOST_DRIVER                (0x04)
#define MPI2_VERSION_MAJOR                      (0x02)
#define MPI2_VERSION_MINOR                      (0x00)
#define MPI2_VERSION_MAJOR_MASK                 (0xFF00)
#define MPI2_VERSION_MAJOR_SHIFT                (8)
#define MPI2_VERSION_MINOR_MASK                 (0x00FF)
#define MPI2_VERSION_MINOR_SHIFT                (0)
#define MPI2_VERSION    ((MPI2_VERSION_MAJOR << MPI2_VERSION_MAJOR_SHIFT) | \
                        MPI2_VERSION_MINOR)
#define MPI2_HEADER_VERSION_UNIT                (0x10)
#define MPI2_HEADER_VERSION_DEV                 (0x00)
#define MPI2_HEADER_VERSION_UNIT_MASK           (0xFF00)
#define MPI2_HEADER_VERSION_UNIT_SHIFT          (8)
#define MPI2_HEADER_VERSION_DEV_MASK            (0x00FF)
#define MPI2_HEADER_VERSION_DEV_SHIFT           (0)
#define MPI2_HEADER_VERSION                     ((MPI2_HEADER_VERSION_UNIT \
                                                << 8) | \
                                                MPI2_HEADER_VERSION_DEV)
#define MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR      (0x03)
#define MPI2_SCSIIO_EEDPFLAGS_INC_PRI_REFTAG    (0x8000)
#define MPI2_SCSIIO_EEDPFLAGS_CHECK_REFTAG      (0x0400)
#define MPI2_SCSIIO_EEDPFLAGS_CHECK_REMOVE_OP   (0x0003)
#define MPI2_SCSIIO_EEDPFLAGS_CHECK_APPTAG      (0x0200)
#define MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD       (0x0100)
#define MPI2_SCSIIO_EEDPFLAGS_INSERT_OP         (0x0004)
#define MPI2_FUNCTION_SCSI_IO_REQUEST           (0x00) /* SCSI IO */
#define MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY   (0x06)
#define MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO         (0x00)
#define MPI2_SGE_FLAGS_64_BIT_ADDRESSING        (0x02)
#define MPI2_SCSIIO_CONTROL_WRITE               (0x01000000)
#define MPI2_SCSIIO_CONTROL_READ                (0x02000000)
#define MPI2_REQ_DESCRIPT_FLAGS_TYPE_MASK       (0x0E)
#define MPI2_RPY_DESCRIPT_FLAGS_UNUSED          (0x0F)
#define MPI2_RPY_DESCRIPT_FLAGS_SCSI_IO_SUCCESS (0x00)
#define MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK       (0x0F)
#define MPI2_WRSEQ_FLUSH_KEY_VALUE              (0x0)
#define MPI2_WRITE_SEQUENCE_OFFSET              (0x00000004)
#define MPI2_WRSEQ_1ST_KEY_VALUE                (0xF)
#define MPI2_WRSEQ_2ND_KEY_VALUE                (0x4)
#define MPI2_WRSEQ_3RD_KEY_VALUE                (0xB)
#define MPI2_WRSEQ_4TH_KEY_VALUE                (0x2)
#define MPI2_WRSEQ_5TH_KEY_VALUE                (0x7)
#define MPI2_WRSEQ_6TH_KEY_VALUE                (0xD)

/* Invader defines */
#define MPI2_TYPE_CUDA                                  0x2
#define MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH       0x4000
#define MR_RL_FLAGS_GRANT_DESTINATION_CPU0                      0x00
#define MR_RL_FLAGS_GRANT_DESTINATION_CPU1                      0x10
#define MR_RL_FLAGS_GRANT_DESTINATION_CUDA                      0x80
#define MR_RL_FLAGS_SEQ_NUM_ENABLE                                      0x8
#define MPI2_NSEG_FLAGS_SHIFT                                           4


#define MR_PD_INVALID                           0xFFFF
#define MAX_SPAN_DEPTH                          8
#define MAX_RAIDMAP_SPAN_DEPTH                  (MAX_SPAN_DEPTH)
#define MAX_ROW_SIZE                            32
#define MAX_RAIDMAP_ROW_SIZE                    (MAX_ROW_SIZE)
#define MAX_LOGICAL_DRIVES                      64
#define MAX_RAIDMAP_LOGICAL_DRIVES              (MAX_LOGICAL_DRIVES)
#define MAX_RAIDMAP_VIEWS                       (MAX_LOGICAL_DRIVES)
#define MAX_ARRAYS                              128
#define MAX_RAIDMAP_ARRAYS                      (MAX_ARRAYS)
#define MAX_PHYSICAL_DEVICES                    256
#define MAX_RAIDMAP_PHYSICAL_DEVICES            (MAX_PHYSICAL_DEVICES)

/* get the mapping information of LD */
#define MR_DCMD_LD_MAP_GET_INFO                 0x0300e101

#ifndef MPI2_POINTER
#define MPI2_POINTER    *
#endif

#pragma pack(1)

typedef struct _MPI25_IEEE_SGE_CHAIN64
{
        U64     Address;
        U32     Length;
        U16     Reserved1;
        U8      NextChainOffset;
        U8      Flags;
} MPI25_IEEE_SGE_CHAIN64, MPI2_POINTER PTR_MPI25_IEEE_SGE_CHAIN64,
    Mpi25IeeeSgeChain64_t, MPI2_POINTER pMpi25IeeeSgeChain64_t;

typedef struct _MPI2_SGE_SIMPLE_UNION
{
        U32     FlagsLength;
        union
        {
                U32     Address32;
                U64     Address64;
        } u1;
} MPI2_SGE_SIMPLE_UNION, MPI2_POINTER PTR_MPI2_SGE_SIMPLE_UNION,
    Mpi2SGESimpleUnion_t, MPI2_POINTER pMpi2SGESimpleUnion_t;

typedef struct
{
        U8      CDB[20];                        /* 0x00 */
        U32     PrimaryReferenceTag;            /* 0x14 */
        U16     PrimaryApplicationTag;          /* 0x18 */
        U16     PrimaryApplicationTagMask;      /* 0x1A */
        U32     TransferLength;                 /* 0x1C */
} MPI2_SCSI_IO_CDB_EEDP32, MPI2_POINTER PTR_MPI2_SCSI_IO_CDB_EEDP32,
    Mpi2ScsiIoCdbEedp32_t, MPI2_POINTER pMpi2ScsiIoCdbEedp32_t;

typedef struct _MPI2_SGE_CHAIN_UNION
{
        U16     Length;
        U8      NextChainOffset;
        U8      Flags;
        union
        {
                U32     Address32;
                U64     Address64;
        } u1;
} MPI2_SGE_CHAIN_UNION, MPI2_POINTER PTR_MPI2_SGE_CHAIN_UNION,
    Mpi2SGEChainUnion_t, MPI2_POINTER pMpi2SGEChainUnion_t;

typedef struct _MPI2_IEEE_SGE_SIMPLE32
{
        U32     Address;
        U32     FlagsLength;
} MPI2_IEEE_SGE_SIMPLE32, MPI2_POINTER PTR_MPI2_IEEE_SGE_SIMPLE32,
    Mpi2IeeeSgeSimple32_t, MPI2_POINTER pMpi2IeeeSgeSimple32_t;

typedef struct _MPI2_IEEE_SGE_SIMPLE64
{
        U64     Address;
        U32     Length;
        U16     Reserved1;
        U8      Reserved2;
        U8      Flags;
} MPI2_IEEE_SGE_SIMPLE64, MPI2_POINTER PTR_MPI2_IEEE_SGE_SIMPLE64,
    Mpi2IeeeSgeSimple64_t, MPI2_POINTER pMpi2IeeeSgeSimple64_t;

typedef union _MPI2_IEEE_SGE_SIMPLE_UNION
{
        MPI2_IEEE_SGE_SIMPLE32  Simple32;
        MPI2_IEEE_SGE_SIMPLE64  Simple64;
} MPI2_IEEE_SGE_SIMPLE_UNION, MPI2_POINTER PTR_MPI2_IEEE_SGE_SIMPLE_UNION,
    Mpi2IeeeSgeSimpleUnion_t, MPI2_POINTER pMpi2IeeeSgeSimpleUnion_t;

typedef MPI2_IEEE_SGE_SIMPLE32  MPI2_IEEE_SGE_CHAIN32;
typedef MPI2_IEEE_SGE_SIMPLE64  MPI2_IEEE_SGE_CHAIN64;

typedef union _MPI2_IEEE_SGE_CHAIN_UNION
{
        MPI2_IEEE_SGE_CHAIN32   Chain32;
        MPI2_IEEE_SGE_CHAIN64   Chain64;
} MPI2_IEEE_SGE_CHAIN_UNION, MPI2_POINTER PTR_MPI2_IEEE_SGE_CHAIN_UNION,
    Mpi2IeeeSgeChainUnion_t, MPI2_POINTER pMpi2IeeeSgeChainUnion_t;

typedef union _MPI2_SGE_IO_UNION
{
        MPI2_SGE_SIMPLE_UNION           MpiSimple;
        MPI2_SGE_CHAIN_UNION            MpiChain;
        MPI2_IEEE_SGE_SIMPLE_UNION      IeeeSimple;
        MPI2_IEEE_SGE_CHAIN_UNION       IeeeChain;
} MPI2_SGE_IO_UNION, MPI2_POINTER PTR_MPI2_SGE_IO_UNION,
    Mpi2SGEIOUnion_t, MPI2_POINTER pMpi2SGEIOUnion_t;

typedef union
{
        U8                              CDB32[32];
        MPI2_SCSI_IO_CDB_EEDP32         EEDP32;
        MPI2_SGE_SIMPLE_UNION           SGE;
} MPI2_SCSI_IO_CDB_UNION, MPI2_POINTER PTR_MPI2_SCSI_IO_CDB_UNION,
    Mpi2ScsiIoCdb_t, MPI2_POINTER pMpi2ScsiIoCdb_t;

/* Default Request Descriptor */
typedef struct _MPI2_DEFAULT_REQUEST_DESCRIPTOR
{
        U8              RequestFlags;                   /* 0x00 */
        U8              MSIxIndex;                      /* 0x01 */
        U16             SMID;                           /* 0x02 */
        U16             LMID;                           /* 0x04 */
        U16             DescriptorTypeDependent;        /* 0x06 */
} MPI2_DEFAULT_REQUEST_DESCRIPTOR,
    MPI2_POINTER PTR_MPI2_DEFAULT_REQUEST_DESCRIPTOR,
    Mpi2DefaultRequestDescriptor_t,
    MPI2_POINTER pMpi2DefaultRequestDescriptor_t;

/* High Priority Request Descriptor */
typedef struct _MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR
{
        U8              RequestFlags;                   /* 0x00 */
        U8              MSIxIndex;                      /* 0x01 */
        U16             SMID;                           /* 0x02 */
        U16             LMID;                           /* 0x04 */
        U16             Reserved1;                      /* 0x06 */
} MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR,
    MPI2_POINTER PTR_MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR,
    Mpi2HighPriorityRequestDescriptor_t,
    MPI2_POINTER pMpi2HighPriorityRequestDescriptor_t;

/* SCSI IO Request Descriptor */
typedef struct _MPI2_SCSI_IO_REQUEST_DESCRIPTOR
{
        U8              RequestFlags;                   /* 0x00 */
        U8              MSIxIndex;                      /* 0x01 */
        U16             SMID;                           /* 0x02 */
        U16             LMID;                           /* 0x04 */
        U16             DevHandle;                      /* 0x06 */
} MPI2_SCSI_IO_REQUEST_DESCRIPTOR,
    MPI2_POINTER PTR_MPI2_SCSI_IO_REQUEST_DESCRIPTOR,
    Mpi2SCSIIORequestDescriptor_t,
    MPI2_POINTER pMpi2SCSIIORequestDescriptor_t;

/* SCSI Target Request Descriptor */
typedef struct _MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR
{
        U8              RequestFlags;                   /* 0x00 */
        U8              MSIxIndex;                      /* 0x01 */
        U16             SMID;                           /* 0x02 */
        U16             LMID;                           /* 0x04 */
        U16             IoIndex;                        /* 0x06 */
} MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR,
    MPI2_POINTER PTR_MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR,
    Mpi2SCSITargetRequestDescriptor_t,
    MPI2_POINTER pMpi2SCSITargetRequestDescriptor_t;

/* RAID Accelerator Request Descriptor */
typedef struct _MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR
{
        U8              RequestFlags;                   /* 0x00 */
        U8              MSIxIndex;                      /* 0x01 */
        U16             SMID;                           /* 0x02 */
        U16             LMID;                           /* 0x04 */
        U16             Reserved;                       /* 0x06 */
} MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR,
    MPI2_POINTER PTR_MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR,
    Mpi2RAIDAcceleratorRequestDescriptor_t,
    MPI2_POINTER pMpi2RAIDAcceleratorRequestDescriptor_t;

/* Default Reply Descriptor */
typedef struct _MPI2_DEFAULT_REPLY_DESCRIPTOR
{
        U8              ReplyFlags;                     /* 0x00 */
        U8              MSIxIndex;                      /* 0x01 */
        U16             DescriptorTypeDependent1;       /* 0x02 */
        U32             DescriptorTypeDependent2;       /* 0x04 */
} MPI2_DEFAULT_REPLY_DESCRIPTOR, MPI2_POINTER PTR_MPI2_DEFAULT_REPLY_DESCRIPTOR,
    Mpi2DefaultReplyDescriptor_t, MPI2_POINTER pMpi2DefaultReplyDescriptor_t;

/* Address Reply Descriptor */
typedef struct _MPI2_ADDRESS_REPLY_DESCRIPTOR
{
        U8              ReplyFlags;                     /* 0x00 */
        U8              MSIxIndex;                      /* 0x01 */
        U16             SMID;                           /* 0x02 */
        U32             ReplyFrameAddress;              /* 0x04 */
} MPI2_ADDRESS_REPLY_DESCRIPTOR, MPI2_POINTER PTR_MPI2_ADDRESS_REPLY_DESCRIPTOR,
    Mpi2AddressReplyDescriptor_t, MPI2_POINTER pMpi2AddressReplyDescriptor_t;

/* SCSI IO Success Reply Descriptor */
typedef struct _MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR
{
        U8              ReplyFlags;                     /* 0x00 */
        U8              MSIxIndex;                      /* 0x01 */
        U16             SMID;                           /* 0x02 */
        U16             TaskTag;                        /* 0x04 */
        U16             Reserved1;                      /* 0x06 */
} MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR,
    MPI2_POINTER PTR_MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR,
    Mpi2SCSIIOSuccessReplyDescriptor_t,
    MPI2_POINTER pMpi2SCSIIOSuccessReplyDescriptor_t;

/* TargetAssist Success Reply Descriptor */
typedef struct _MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR
{
        U8              ReplyFlags;                     /* 0x00 */
        U8              MSIxIndex;                      /* 0x01 */
        U16             SMID;                           /* 0x02 */
        U8              SequenceNumber;                 /* 0x04 */
        U8              Reserved1;                      /* 0x05 */
        U16             IoIndex;                        /* 0x06 */
} MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR,
    MPI2_POINTER PTR_MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR,
    Mpi2TargetAssistSuccessReplyDescriptor_t,
    MPI2_POINTER pMpi2TargetAssistSuccessReplyDescriptor_t;

/* Target Command Buffer Reply Descriptor */
typedef struct _MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR
{
        U8              ReplyFlags;                     /* 0x00 */
        U8              MSIxIndex;                      /* 0x01 */
        U8              VP_ID;                          /* 0x02 */
        U8              Flags;                          /* 0x03 */
        U16             InitiatorDevHandle;             /* 0x04 */
        U16             IoIndex;                        /* 0x06 */
} MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR,
    MPI2_POINTER PTR_MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR,
    Mpi2TargetCommandBufferReplyDescriptor_t,
    MPI2_POINTER pMpi2TargetCommandBufferReplyDescriptor_t;

/* RAID Accelerator Success Reply Descriptor */
typedef struct _MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR
{
        U8              ReplyFlags;                     /* 0x00 */
        U8              MSIxIndex;                      /* 0x01 */
        U16             SMID;                           /* 0x02 */
        U32             Reserved;                       /* 0x04 */
} MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR,
    MPI2_POINTER PTR_MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR,
    Mpi2RAIDAcceleratorSuccessReplyDescriptor_t,
    MPI2_POINTER pMpi2RAIDAcceleratorSuccessReplyDescriptor_t;

/* union of Reply Descriptors */
typedef union _MPI2_REPLY_DESCRIPTORS_UNION
{
        MPI2_DEFAULT_REPLY_DESCRIPTOR                   Default;
        MPI2_ADDRESS_REPLY_DESCRIPTOR                   AddressReply;
        MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR           SCSIIOSuccess;
        MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR      TargetAssistSuccess;
        MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR     TargetCommandBuffer;
        MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR  RAIDAcceleratorSuccess;
        U64                                             Words;
} MPI2_REPLY_DESCRIPTORS_UNION, MPI2_POINTER PTR_MPI2_REPLY_DESCRIPTORS_UNION,
    Mpi2ReplyDescriptorsUnion_t, MPI2_POINTER pMpi2ReplyDescriptorsUnion_t;

/* IOCInit Request message */
typedef struct _MPI2_IOC_INIT_REQUEST
{
        U8              WhoInit;                                /* 0x00 */
        U8              Reserved1;                              /* 0x01 */
        U8              ChainOffset;                            /* 0x02 */
        U8              Function;                               /* 0x03 */
        U16             Reserved2;                              /* 0x04 */
        U8              Reserved3;                              /* 0x06 */
        U8              MsgFlags;                               /* 0x07 */
        U8              VP_ID;                                  /* 0x08 */
        U8              VF_ID;                                  /* 0x09 */
        U16             Reserved4;                              /* 0x0A */
        U16             MsgVersion;                             /* 0x0C */
        U16             HeaderVersion;                          /* 0x0E */
        U32             Reserved5;                              /* 0x10 */
        U16             Reserved6;                              /* 0x14 */
        U8              Reserved7;                              /* 0x16 */
        U8              HostMSIxVectors;                        /* 0x17 */
        U16             Reserved8;                              /* 0x18 */
        U16             SystemRequestFrameSize;                 /* 0x1A */
        U16             ReplyDescriptorPostQueueDepth;          /* 0x1C */
        U16             ReplyFreeQueueDepth;                    /* 0x1E */
        U32             SenseBufferAddressHigh;                 /* 0x20 */
        U32             SystemReplyAddressHigh;                 /* 0x24 */
        U64             SystemRequestFrameBaseAddress;          /* 0x28 */
        U64             ReplyDescriptorPostQueueAddress;        /* 0x30 */
        U64             ReplyFreeQueueAddress;                  /* 0x38 */
        U64             TimeStamp;                              /* 0x40 */
} MPI2_IOC_INIT_REQUEST, MPI2_POINTER PTR_MPI2_IOC_INIT_REQUEST,
    Mpi2IOCInitRequest_t, MPI2_POINTER pMpi2IOCInitRequest_t;


typedef struct _MR_DEV_HANDLE_INFO {

        /* Send bitmap of LDs that are idle with respect to FP */
        U16             curDevHdl;

        /* bitmap of valid device handles. */
        U8              validHandles;
        U8              reserved;
        /* 0x04 dev handles for all the paths. */
        U16             devHandle[2];
} MR_DEV_HANDLE_INFO;                           /* 0x08, Total Size */

typedef struct _MR_ARRAY_INFO {
        U16     pd[MAX_RAIDMAP_ROW_SIZE];
} MR_ARRAY_INFO;                        /* 0x40, Total Size */

typedef struct _MR_QUAD_ELEMENT {
        U64             logStart;                       /* 0x00 */
        U64             logEnd;                         /* 0x08 */
        U64             offsetInSpan;                   /* 0x10 */
        U32             diff;                           /* 0x18 */
        U32             reserved1;                      /* 0x1C */
} MR_QUAD_ELEMENT;                                      /* 0x20, Total size */

typedef struct _MR_SPAN_INFO {
        U32             noElements;                     /* 0x00 */
        U32             reserved1;                      /* 0x04 */
        MR_QUAD_ELEMENT quads[MAX_RAIDMAP_SPAN_DEPTH];  /* 0x08 */
} MR_SPAN_INFO;                                         /* 0x108, Total size */

typedef struct _MR_LD_SPAN_ {                           /* SPAN structure */
        /* 0x00, starting block number in array */
        U64             startBlk;

        /* 0x08, number of blocks */
        U64             numBlks;

        /* 0x10, array reference */
        U16             arrayRef;

        U8              reserved[6];    /* 0x12 */
} MR_LD_SPAN;                           /* 0x18, Total Size */

typedef struct _MR_SPAN_BLOCK_INFO {
        /* number of rows/span */
        U64             num_rows;

        MR_LD_SPAN      span;                           /* 0x08 */
        MR_SPAN_INFO    block_span_info;                /* 0x20 */
} MR_SPAN_BLOCK_INFO;                                   /* 0x128, Total Size */

typedef struct _MR_LD_RAID {
        struct {
                U32     fpCapable       :1;
                U32     reserved5       :3;
                U32     ldPiMode        :4;
                U32     pdPiMode        :4;

                /* FDE or controller encryption (MR_LD_ENCRYPTION_TYPE) */
                U32     encryptionType  :8;

                U32     fpWriteCapable  :1;
                U32     fpReadCapable   :1;
                U32     fpWriteAcrossStripe:1;
                U32     fpReadAcrossStripe:1;
                U32     reserved4       :8;
        } capability;                   /* 0x00 */
        U32     reserved6;
        U64     size;                   /* 0x08, LD size in blocks */
        U8      spanDepth;              /* 0x10, Total Number of Spans */
        U8      level;                  /* 0x11, RAID level */
        /* 0x12, shift-count to get stripe size (0=512, 1=1K, 7=64K, etc.) */
        U8      stripeShift;
        U8      rowSize;                /* 0x13, number of disks in a row */
        /* 0x14, number of data disks in a row */
        U8      rowDataSize;
        U8      writeMode;              /* 0x15, WRITE_THROUGH or WRITE_BACK */

        /* 0x16, To differentiate between RAID1 and RAID1E */
        U8      PRL;

        U8      SRL;                    /* 0x17 */
        U16     targetId;               /* 0x18, ld Target Id. */

        /* 0x1a, state of ld, state corresponds to MR_LD_STATE */
        U8      ldState;

        /* 0x1b, Pre calculate region type requests based on MFC etc.. */
        U8      regTypeReqOnWrite;

        U8      modFactor;              /* 0x1c, same as rowSize */
        /*
         * 0x1d, region lock type used for read, valid only if
         * regTypeOnReadIsValid=1
         */
        U8      regTypeReqOnRead;
        U16     seqNum;                 /* 0x1e, LD sequence number */

        struct {
                /* This LD requires sync command before completing */
                U32     ldSyncRequired:1;
                U32     reserved:31;
        } flags;                        /* 0x20 */

        U8      reserved3[0x5C];        /* 0x24 */
} MR_LD_RAID;                           /* 0x80, Total Size */

typedef struct _MR_LD_SPAN_MAP {
        MR_LD_RAID              ldRaid; /* 0x00 */

        /* 0x80, needed for GET_ARM() - R0/1/5 only. */
        U8                      dataArmMap[MAX_RAIDMAP_ROW_SIZE];

        MR_SPAN_BLOCK_INFO      spanBlock[MAX_RAIDMAP_SPAN_DEPTH]; /* 0xA0 */
} MR_LD_SPAN_MAP;       /* 0x9E0 */

typedef struct _MR_FW_RAID_MAP {
        /* total size of this structure, including this field */
        U32                     totalSize;
        union {
                /* Simple method of version checking variables */
                struct {
                        U32     maxLd;
                        U32     maxSpanDepth;
                        U32     maxRowSize;
                        U32     maxPdCount;
                        U32     maxArrays;
                } validationInfo;
                U32     version[5];
                U32     reserved1[5];
        } u1;

        U32                     ldCount;                /* count of lds */
        U32                     Reserved1;

        /*
         * 0x20 This doesn't correspond to
         * FW Ld Tgt Id to LD, but will purge. For example: if tgt Id is 4
         * and FW LD is 2, and there is only one LD, FW will populate the
         * array like this. [0xFF, 0xFF, 0xFF, 0xFF, 0x0.....]. This is to
         * help reduce the entire structure size if there are few LDs or
         * driver is looking info for 1 LD only.
         */
        U8                      ldTgtIdToLd[MAX_RAIDMAP_LOGICAL_DRIVES+ \
                                MAX_RAIDMAP_VIEWS]; /* 0x20 */
        /* timeout value used by driver in FP IOs */
        U8                      fpPdIoTimeoutSec;
        U8                      reserved2[7];
        MR_ARRAY_INFO           arMapInfo[MAX_RAIDMAP_ARRAYS];  /* 0x00a8 */
        MR_DEV_HANDLE_INFO      devHndlInfo[MAX_RAIDMAP_PHYSICAL_DEVICES];

        /* 0x28a8-[0 -MAX_RAIDMAP_LOGICAL_DRIVES+MAX_RAIDMAP_VIEWS+1]; */
        MR_LD_SPAN_MAP          ldSpanMap[1];
}MR_FW_RAID_MAP;                                        /* 0x3288, Total Size */

typedef struct _LD_TARGET_SYNC {
        U8      ldTargetId;
        U8      reserved;
        U16     seqNum;
} LD_TARGET_SYNC;

#pragma pack()

struct IO_REQUEST_INFO {
        U64     ldStartBlock;
        U32     numBlocks;
        U16     ldTgtId;
        U8      isRead;
        U16     devHandle;
        U64     pdBlock;
        U8      fpOkForIo;
        U8      ldPI;
};

#endif /* _FUSION_H_ */