#ifndef _ARRAY_H_
#define _ARRAY_H_
#pragma pack(1)
#ifdef __BIG_ENDIAN_BITFIELD
typedef DWORD TIME_RECORD;
#else
typedef struct _TIME_RECORD {
UINT seconds:6;
UINT minutes:6;
UINT month:4;
UINT hours:6;
UINT day:5;
UINT year:5;
} TIME_RECORD;
#endif
#pragma pack()
typedef struct _RaidArray
{
UCHAR bArnMember;
UCHAR bArRealnMember;
UCHAR bArBlockSizeShift;
UCHAR reserve1;
ULONG dArStamp;
ULONG failedStamps[4];
USHORT bStripeWitch;
USHORT rf_broken: 1;
USHORT rf_need_rebuild: 1;
USHORT rf_need_sync: 1;
USHORT rf_auto_rebuild: 1;
USHORT rf_newly_created: 1;
USHORT rf_rebuilding: 1;
USHORT rf_verifying: 1;
USHORT rf_initializing: 1;
USHORT rf_abort_rebuild: 1;
USHORT rf_duplicate_and_create: 1;
USHORT rf_duplicate_and_created: 1;
USHORT rf_duplicate_must_done: 1;
USHORT rf_raid15: 1;
USHORT CriticalMembers;
UCHAR last_read;
UCHAR alreadyBroken;
LBA_T RebuildSectors;
PVDevice pMember[MAX_MEMBERS];
UCHAR ArrayName[MAX_ARRAY_NAME];
TIME_RECORD CreateTime;
UCHAR Description[64];
UCHAR CreateManager[16];
} RaidArray;
#pragma pack(1)
typedef struct _ArrayDescript
{
ULONG Signature;
ULONG dArStamp;
UCHAR bCheckSum;
#ifdef __BIG_ENDIAN_BITFIELD
UCHAR df_reservedbits: 6;
UCHAR df_user_mode_set: 1;
UCHAR df_bootmark:1;
#else
UCHAR df_bootmark:1;
UCHAR df_user_mode_set: 1;
UCHAR df_reservedbits: 6;
#endif
UCHAR bUserDeviceMode;
UCHAR ArrayLevel;
struct {
ULONG Capacity;
UCHAR VDeviceType;
UCHAR bMemberCount;
UCHAR bSerialNumber;
UCHAR bArBlockSizeShift;
#ifdef __BIG_ENDIAN_BITFIELD
USHORT rf_reserved: 14;
USHORT rf_raid15: 1;
USHORT rf_need_rebuild:1;
#else
USHORT rf_need_rebuild:1;
USHORT rf_raid15: 1;
USHORT rf_reserved: 14;
#endif
USHORT CriticalMembers;
ULONG RebuildSectors;
} level[2];
UCHAR ArrayName[MAX_ARRAY_NAME];
TIME_RECORD CreateTime;
UCHAR Description[64];
UCHAR CreateManager[16];
#define ArrayDescript_3_0_size ((unsigned)(ULONG_PTR)&((struct _ArrayDescript *)0)->bCheckSum31)
#define ArrayDescript_3_1_size 512
UCHAR bCheckSum31;
UCHAR PrivateFlag1;
UCHAR alreadyBroken;
#ifdef __BIG_ENDIAN_BITFIELD
UCHAR df_read_ahead: 1;
UCHAR df_read_ahead_set: 1;
UCHAR df_write_cache: 1;
UCHAR df_write_cache_set: 1;
UCHAR df_ncq: 1;
UCHAR df_ncq_set: 1;
UCHAR df_tcq: 1;
UCHAR df_tcq_set: 1;
#else
UCHAR df_tcq_set: 1;
UCHAR df_tcq: 1;
UCHAR df_ncq_set: 1;
UCHAR df_ncq: 1;
UCHAR df_write_cache_set: 1;
UCHAR df_write_cache: 1;
UCHAR df_read_ahead_set: 1;
UCHAR df_read_ahead: 1;
#endif
struct {
ULONG CapacityHi32;
ULONG RebuildSectorsHi32;
}
levelex[2];
ULONG failedStamps[4];
} ArrayDescript;
typedef char ArrayDescript_size_should_not_exceed_512[512-sizeof(ArrayDescript)];
#pragma pack()
#define HPT_ARRAY_V3 0x5a7816f3
#ifdef ARRAY_V2_ONLY
#define SAVE_FOR_RAID_INFO 0
#else
#define SAVE_FOR_RAID_INFO 10
#endif
ULONG FASTCALL GetStamp(void);
void HPTLIBAPI SyncArrayInfo(PVDevice pVDev);
void HPTLIBAPI fDeleteArray(_VBUS_ARG PVDevice pVArray, BOOLEAN del_block0);
void HPTLIBAPI fCheckArray(PDevice pDevice);
void HPTLIBAPI CheckArrayCritical(_VBUS_ARG0);
PVDevice HPTLIBAPI GetSpareDisk(_VBUS_ARG PVDevice pArray);
#ifdef SUPPORT_OLD_ARRAY
void HPTLIBAPI fFixRAID01Stripe(_VBUS_ARG PVDevice pStripe);
#endif
#ifndef MAX_ARRAY_PER_VBUS
#define MAX_ARRAY_PER_VBUS (MAX_VDEVICE_PER_VBUS*2)
#endif
#if defined(MAX_ARRAY_DEVICE)
#if MAX_ARRAY_DEVICE!=MAX_ARRAY_PER_VBUS
#error "remove MAX_ARRAY_DEVICE and use MAX_ARRAY_PER_VBUS instead"
#endif
#endif
#define _SET_ARRAY_BUS_(pArray) pArray->pVBus = _vbus_p;
#ifdef ARRAY_V2_ONLY
#define _SET_ARRAY_VER_(pArray) pArray->vf_format_v2 = 1;
#else
#define _SET_ARRAY_VER_(pArray)
#endif
#define mArGetArrayTable(pVArray) \
if((pVArray = _vbus_(pFreeArrayLink)) != 0) { \
_vbus_(pFreeArrayLink) = (PVDevice)_vbus_(pFreeArrayLink)->pVBus; \
ZeroMemory(pVArray, ARRAY_VDEV_SIZE); \
_SET_ARRAY_BUS_(pVArray) \
_SET_ARRAY_VER_(pVArray) \
} else
#define mArFreeArrayTable(pVArray) \
do { \
pVArray->pVBus = (PVBus)_vbus_(pFreeArrayLink);\
_vbus_(pFreeArrayLink) = pVArray; \
pVArray->u.array.dArStamp = 0; \
} while(0)
UCHAR CheckSum(UCHAR *p, int size);
void HPTLIBAPI fRAID0SendCommand(_VBUS_ARG PCommand pCmd);
void HPTLIBAPI fRAID1SendCommand(_VBUS_ARG PCommand pCmd);
void HPTLIBAPI fJBODSendCommand(_VBUS_ARG PCommand pCmd);
void HPTLIBAPI fRAID0MemberFailed(_VBUS_ARG PVDevice pVDev);
void HPTLIBAPI fRAID1MemberFailed(_VBUS_ARG PVDevice pVDev);
void HPTLIBAPI fJBODMemberFailed(_VBUS_ARG PVDevice pVDev);
#if SUPPORT_RAID5
void HPTLIBAPI fRAID5SendCommand(_VBUS_ARG PCommand pCmd);
void HPTLIBAPI fRAID5MemberFailed(_VBUS_ARG PVDevice pVDev);
#else
#define fRAID5SendCommand 0
#define fRAID5MemberFailed 0
#endif
#endif