summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/mr_sas/fusion.h
blob: c8e761ab888ddede0cf187be14bf9fe3ac1bda2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
/*
 * 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_ */