xref: /OK3568_Linux_fs/kernel/drivers/scsi/megaraid/mbox_defs.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  *			Linux MegaRAID Unified device driver
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Copyright (c) 2003-2004  LSI Logic Corporation.
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * FILE		: mbox_defs.h
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun #ifndef _MRAID_MBOX_DEFS_H_
11*4882a593Smuzhiyun #define _MRAID_MBOX_DEFS_H_
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <linux/types.h>
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun /*
16*4882a593Smuzhiyun  * Commands and states for mailbox based controllers
17*4882a593Smuzhiyun  */
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #define MBOXCMD_LREAD		0x01
20*4882a593Smuzhiyun #define MBOXCMD_LWRITE		0x02
21*4882a593Smuzhiyun #define MBOXCMD_PASSTHRU	0x03
22*4882a593Smuzhiyun #define MBOXCMD_ADPEXTINQ	0x04
23*4882a593Smuzhiyun #define MBOXCMD_ADAPTERINQ	0x05
24*4882a593Smuzhiyun #define MBOXCMD_LREAD64		0xA7
25*4882a593Smuzhiyun #define MBOXCMD_LWRITE64	0xA8
26*4882a593Smuzhiyun #define MBOXCMD_PASSTHRU64	0xC3
27*4882a593Smuzhiyun #define MBOXCMD_EXTPTHRU	0xE3
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #define MAIN_MISC_OPCODE	0xA4
30*4882a593Smuzhiyun #define GET_MAX_SG_SUPPORT	0x01
31*4882a593Smuzhiyun #define SUPPORT_EXT_CDB		0x16
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #define FC_NEW_CONFIG		0xA1
34*4882a593Smuzhiyun #define NC_SUBOP_PRODUCT_INFO	0x0E
35*4882a593Smuzhiyun #define NC_SUBOP_ENQUIRY3	0x0F
36*4882a593Smuzhiyun #define ENQ3_GET_SOLICITED_FULL	0x02
37*4882a593Smuzhiyun #define OP_DCMD_READ_CONFIG	0x04
38*4882a593Smuzhiyun #define NEW_READ_CONFIG_8LD	0x67
39*4882a593Smuzhiyun #define READ_CONFIG_8LD		0x07
40*4882a593Smuzhiyun #define FLUSH_ADAPTER		0x0A
41*4882a593Smuzhiyun #define FLUSH_SYSTEM		0xFE
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun /*
44*4882a593Smuzhiyun  * Command for random deletion of logical drives
45*4882a593Smuzhiyun  */
46*4882a593Smuzhiyun #define	FC_DEL_LOGDRV		0xA4
47*4882a593Smuzhiyun #define	OP_SUP_DEL_LOGDRV	0x2A
48*4882a593Smuzhiyun #define OP_GET_LDID_MAP		0x18
49*4882a593Smuzhiyun #define OP_DEL_LOGDRV		0x1C
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun /*
52*4882a593Smuzhiyun  * BIOS commands
53*4882a593Smuzhiyun  */
54*4882a593Smuzhiyun #define IS_BIOS_ENABLED		0x62
55*4882a593Smuzhiyun #define GET_BIOS		0x01
56*4882a593Smuzhiyun #define CHNL_CLASS		0xA9
57*4882a593Smuzhiyun #define GET_CHNL_CLASS		0x00
58*4882a593Smuzhiyun #define SET_CHNL_CLASS		0x01
59*4882a593Smuzhiyun #define CH_RAID			0x01
60*4882a593Smuzhiyun #define CH_SCSI			0x00
61*4882a593Smuzhiyun #define BIOS_PVT_DATA		0x40
62*4882a593Smuzhiyun #define GET_BIOS_PVT_DATA	0x00
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /*
66*4882a593Smuzhiyun  * Commands to support clustering
67*4882a593Smuzhiyun  */
68*4882a593Smuzhiyun #define GET_TARGET_ID		0x7D
69*4882a593Smuzhiyun #define CLUSTER_OP		0x70
70*4882a593Smuzhiyun #define GET_CLUSTER_MODE	0x02
71*4882a593Smuzhiyun #define CLUSTER_CMD		0x6E
72*4882a593Smuzhiyun #define RESERVE_LD		0x01
73*4882a593Smuzhiyun #define RELEASE_LD		0x02
74*4882a593Smuzhiyun #define RESET_RESERVATIONS	0x03
75*4882a593Smuzhiyun #define RESERVATION_STATUS	0x04
76*4882a593Smuzhiyun #define RESERVE_PD		0x05
77*4882a593Smuzhiyun #define RELEASE_PD		0x06
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /*
81*4882a593Smuzhiyun  * Module battery status
82*4882a593Smuzhiyun  */
83*4882a593Smuzhiyun #define BATTERY_MODULE_MISSING		0x01
84*4882a593Smuzhiyun #define BATTERY_LOW_VOLTAGE		0x02
85*4882a593Smuzhiyun #define BATTERY_TEMP_HIGH		0x04
86*4882a593Smuzhiyun #define BATTERY_PACK_MISSING		0x08
87*4882a593Smuzhiyun #define BATTERY_CHARGE_MASK		0x30
88*4882a593Smuzhiyun #define BATTERY_CHARGE_DONE		0x00
89*4882a593Smuzhiyun #define BATTERY_CHARGE_INPROG		0x10
90*4882a593Smuzhiyun #define BATTERY_CHARGE_FAIL		0x20
91*4882a593Smuzhiyun #define BATTERY_CYCLES_EXCEEDED		0x40
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun /*
94*4882a593Smuzhiyun  * Physical drive states.
95*4882a593Smuzhiyun  */
96*4882a593Smuzhiyun #define PDRV_UNCNF	0
97*4882a593Smuzhiyun #define PDRV_ONLINE	3
98*4882a593Smuzhiyun #define PDRV_FAILED	4
99*4882a593Smuzhiyun #define PDRV_RBLD	5
100*4882a593Smuzhiyun #define PDRV_HOTSPARE	6
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun /*
104*4882a593Smuzhiyun  * Raid logical drive states.
105*4882a593Smuzhiyun  */
106*4882a593Smuzhiyun #define RDRV_OFFLINE	0
107*4882a593Smuzhiyun #define RDRV_DEGRADED	1
108*4882a593Smuzhiyun #define RDRV_OPTIMAL	2
109*4882a593Smuzhiyun #define RDRV_DELETED	3
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun /*
112*4882a593Smuzhiyun  * Read, write and cache policies
113*4882a593Smuzhiyun  */
114*4882a593Smuzhiyun #define NO_READ_AHEAD		0
115*4882a593Smuzhiyun #define READ_AHEAD		1
116*4882a593Smuzhiyun #define ADAP_READ_AHEAD		2
117*4882a593Smuzhiyun #define WRMODE_WRITE_THRU	0
118*4882a593Smuzhiyun #define WRMODE_WRITE_BACK	1
119*4882a593Smuzhiyun #define CACHED_IO		0
120*4882a593Smuzhiyun #define DIRECT_IO		1
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun #define MAX_LOGICAL_DRIVES_8LD		8
123*4882a593Smuzhiyun #define MAX_LOGICAL_DRIVES_40LD		40
124*4882a593Smuzhiyun #define FC_MAX_PHYSICAL_DEVICES		256
125*4882a593Smuzhiyun #define MAX_MBOX_CHANNELS		5
126*4882a593Smuzhiyun #define MAX_MBOX_TARGET			15
127*4882a593Smuzhiyun #define MBOX_MAX_PHYSICAL_DRIVES	MAX_MBOX_CHANNELS*MAX_MBOX_TARGET
128*4882a593Smuzhiyun #define MAX_ROW_SIZE_40LD		32
129*4882a593Smuzhiyun #define MAX_ROW_SIZE_8LD		8
130*4882a593Smuzhiyun #define SPAN_DEPTH_8_SPANS		8
131*4882a593Smuzhiyun #define SPAN_DEPTH_4_SPANS		4
132*4882a593Smuzhiyun #define MAX_REQ_SENSE_LEN		0x20
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun /**
137*4882a593Smuzhiyun  * struct mbox_t - Driver and f/w handshake structure.
138*4882a593Smuzhiyun  * @cmd		: firmware command
139*4882a593Smuzhiyun  * @cmdid	: command id
140*4882a593Smuzhiyun  * @numsectors	: number of sectors to be transferred
141*4882a593Smuzhiyun  * @lba		: Logical Block Address on LD
142*4882a593Smuzhiyun  * @xferaddr	: DMA address for data transfer
143*4882a593Smuzhiyun  * @logdrv	: logical drive number
144*4882a593Smuzhiyun  * @numsge	: number of scatter gather elements in sg list
145*4882a593Smuzhiyun  * @resvd	: reserved
146*4882a593Smuzhiyun  * @busy	: f/w busy, must wait to issue more commands.
147*4882a593Smuzhiyun  * @numstatus	: number of commands completed.
148*4882a593Smuzhiyun  * @status	: status of the commands completed
149*4882a593Smuzhiyun  * @completed	: array of completed command ids.
150*4882a593Smuzhiyun  * @poll	: poll and ack sequence
151*4882a593Smuzhiyun  * @ack		: poll and ack sequence
152*4882a593Smuzhiyun  *
153*4882a593Smuzhiyun  * The central handshake structure between the driver and the firmware. This
154*4882a593Smuzhiyun  * structure must be allocated by the driver and aligned at 8-byte boundary.
155*4882a593Smuzhiyun  */
156*4882a593Smuzhiyun #define MBOX_MAX_FIRMWARE_STATUS	46
157*4882a593Smuzhiyun typedef struct {
158*4882a593Smuzhiyun 	uint8_t		cmd;
159*4882a593Smuzhiyun 	uint8_t		cmdid;
160*4882a593Smuzhiyun 	uint16_t	numsectors;
161*4882a593Smuzhiyun 	uint32_t	lba;
162*4882a593Smuzhiyun 	uint32_t	xferaddr;
163*4882a593Smuzhiyun 	uint8_t		logdrv;
164*4882a593Smuzhiyun 	uint8_t		numsge;
165*4882a593Smuzhiyun 	uint8_t		resvd;
166*4882a593Smuzhiyun 	uint8_t		busy;
167*4882a593Smuzhiyun 	uint8_t		numstatus;
168*4882a593Smuzhiyun 	uint8_t		status;
169*4882a593Smuzhiyun 	uint8_t		completed[MBOX_MAX_FIRMWARE_STATUS];
170*4882a593Smuzhiyun 	uint8_t		poll;
171*4882a593Smuzhiyun 	uint8_t		ack;
172*4882a593Smuzhiyun } __attribute__ ((packed)) mbox_t;
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun /**
176*4882a593Smuzhiyun  * mbox64_t - 64-bit extension for the mailbox
177*4882a593Smuzhiyun  * @segment_lo	: the low 32-bits of the address of the scatter-gather list
178*4882a593Smuzhiyun  * @segment_hi	: the upper 32-bits of the address of the scatter-gather list
179*4882a593Smuzhiyun  * @mbox	: 32-bit mailbox, whose xferadder field must be set to
180*4882a593Smuzhiyun  *		0xFFFFFFFF
181*4882a593Smuzhiyun  *
182*4882a593Smuzhiyun  * This is the extension of the 32-bit mailbox to be able to perform DMA
183*4882a593Smuzhiyun  * beyond 4GB address range.
184*4882a593Smuzhiyun  */
185*4882a593Smuzhiyun typedef struct {
186*4882a593Smuzhiyun 	uint32_t	xferaddr_lo;
187*4882a593Smuzhiyun 	uint32_t	xferaddr_hi;
188*4882a593Smuzhiyun 	mbox_t		mbox32;
189*4882a593Smuzhiyun } __attribute__ ((packed)) mbox64_t;
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun /*
192*4882a593Smuzhiyun  * mailbox structure used for internal commands
193*4882a593Smuzhiyun  */
194*4882a593Smuzhiyun typedef struct {
195*4882a593Smuzhiyun 	u8	cmd;
196*4882a593Smuzhiyun 	u8	cmdid;
197*4882a593Smuzhiyun 	u8	opcode;
198*4882a593Smuzhiyun 	u8	subopcode;
199*4882a593Smuzhiyun 	u32	lba;
200*4882a593Smuzhiyun 	u32	xferaddr;
201*4882a593Smuzhiyun 	u8	logdrv;
202*4882a593Smuzhiyun 	u8	rsvd[3];
203*4882a593Smuzhiyun 	u8	numstatus;
204*4882a593Smuzhiyun 	u8	status;
205*4882a593Smuzhiyun } __attribute__ ((packed)) int_mbox_t;
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun /**
208*4882a593Smuzhiyun  * mraid_passthru_t - passthru structure to issue commands to physical devices
209*4882a593Smuzhiyun  * @timeout		: command timeout, 0=6sec, 1=60sec, 2=10min, 3=3hr
210*4882a593Smuzhiyun  * @ars			: set if ARS required after check condition
211*4882a593Smuzhiyun  * @islogical		: set if command meant for logical devices
212*4882a593Smuzhiyun  * @logdrv		: logical drive number if command for LD
213*4882a593Smuzhiyun  * @channel		: Channel on which physical device is located
214*4882a593Smuzhiyun  * @target		: SCSI target of the device
215*4882a593Smuzhiyun  * @queuetag		: unused
216*4882a593Smuzhiyun  * @queueaction		: unused
217*4882a593Smuzhiyun  * @cdb			: SCSI CDB
218*4882a593Smuzhiyun  * @cdblen		: length of the CDB
219*4882a593Smuzhiyun  * @reqsenselen		: amount of request sense data to be returned
220*4882a593Smuzhiyun  * @reqsensearea	: Sense information buffer
221*4882a593Smuzhiyun  * @numsge		: number of scatter-gather elements in the sg list
222*4882a593Smuzhiyun  * @scsistatus		: SCSI status of the command completed.
223*4882a593Smuzhiyun  * @dataxferaddr	: DMA data transfer address
224*4882a593Smuzhiyun  * @dataxferlen		: amount of the data to be transferred.
225*4882a593Smuzhiyun  */
226*4882a593Smuzhiyun typedef struct {
227*4882a593Smuzhiyun 	uint8_t		timeout		:3;
228*4882a593Smuzhiyun 	uint8_t		ars		:1;
229*4882a593Smuzhiyun 	uint8_t		reserved	:3;
230*4882a593Smuzhiyun 	uint8_t		islogical	:1;
231*4882a593Smuzhiyun 	uint8_t		logdrv;
232*4882a593Smuzhiyun 	uint8_t		channel;
233*4882a593Smuzhiyun 	uint8_t		target;
234*4882a593Smuzhiyun 	uint8_t		queuetag;
235*4882a593Smuzhiyun 	uint8_t		queueaction;
236*4882a593Smuzhiyun 	uint8_t		cdb[10];
237*4882a593Smuzhiyun 	uint8_t		cdblen;
238*4882a593Smuzhiyun 	uint8_t		reqsenselen;
239*4882a593Smuzhiyun 	uint8_t		reqsensearea[MAX_REQ_SENSE_LEN];
240*4882a593Smuzhiyun 	uint8_t		numsge;
241*4882a593Smuzhiyun 	uint8_t		scsistatus;
242*4882a593Smuzhiyun 	uint32_t	dataxferaddr;
243*4882a593Smuzhiyun 	uint32_t	dataxferlen;
244*4882a593Smuzhiyun } __attribute__ ((packed)) mraid_passthru_t;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun typedef struct {
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	uint32_t		dataxferaddr_lo;
249*4882a593Smuzhiyun 	uint32_t		dataxferaddr_hi;
250*4882a593Smuzhiyun 	mraid_passthru_t	pthru32;
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun } __attribute__ ((packed)) mega_passthru64_t;
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun /**
255*4882a593Smuzhiyun  * mraid_epassthru_t - passthru structure to issue commands to physical devices
256*4882a593Smuzhiyun  * @timeout		: command timeout, 0=6sec, 1=60sec, 2=10min, 3=3hr
257*4882a593Smuzhiyun  * @ars			: set if ARS required after check condition
258*4882a593Smuzhiyun  * @rsvd1		: reserved field
259*4882a593Smuzhiyun  * @cd_rom		: (?)
260*4882a593Smuzhiyun  * @rsvd2		: reserved field
261*4882a593Smuzhiyun  * @islogical		: set if command meant for logical devices
262*4882a593Smuzhiyun  * @logdrv		: logical drive number if command for LD
263*4882a593Smuzhiyun  * @channel		: Channel on which physical device is located
264*4882a593Smuzhiyun  * @target		: SCSI target of the device
265*4882a593Smuzhiyun  * @queuetag		: unused
266*4882a593Smuzhiyun  * @queueaction		: unused
267*4882a593Smuzhiyun  * @cdblen		: length of the CDB
268*4882a593Smuzhiyun  * @rsvd3		: reserved field
269*4882a593Smuzhiyun  * @cdb			: SCSI CDB
270*4882a593Smuzhiyun  * @numsge		: number of scatter-gather elements in the sg list
271*4882a593Smuzhiyun  * @status		: SCSI status of the command completed.
272*4882a593Smuzhiyun  * @reqsenselen		: amount of request sense data to be returned
273*4882a593Smuzhiyun  * @reqsensearea	: Sense information buffer
274*4882a593Smuzhiyun  * @rsvd4		: reserved field
275*4882a593Smuzhiyun  * @dataxferaddr	: DMA data transfer address
276*4882a593Smuzhiyun  * @dataxferlen		: amount of the data to be transferred.
277*4882a593Smuzhiyun  */
278*4882a593Smuzhiyun typedef struct {
279*4882a593Smuzhiyun 	uint8_t		timeout		:3;
280*4882a593Smuzhiyun 	uint8_t		ars		:1;
281*4882a593Smuzhiyun 	uint8_t		rsvd1		:1;
282*4882a593Smuzhiyun 	uint8_t		cd_rom		:1;
283*4882a593Smuzhiyun 	uint8_t		rsvd2		:1;
284*4882a593Smuzhiyun 	uint8_t		islogical	:1;
285*4882a593Smuzhiyun 	uint8_t		logdrv;
286*4882a593Smuzhiyun 	uint8_t		channel;
287*4882a593Smuzhiyun 	uint8_t		target;
288*4882a593Smuzhiyun 	uint8_t		queuetag;
289*4882a593Smuzhiyun 	uint8_t		queueaction;
290*4882a593Smuzhiyun 	uint8_t		cdblen;
291*4882a593Smuzhiyun 	uint8_t		rsvd3;
292*4882a593Smuzhiyun 	uint8_t		cdb[16];
293*4882a593Smuzhiyun 	uint8_t		numsge;
294*4882a593Smuzhiyun 	uint8_t		status;
295*4882a593Smuzhiyun 	uint8_t		reqsenselen;
296*4882a593Smuzhiyun 	uint8_t		reqsensearea[MAX_REQ_SENSE_LEN];
297*4882a593Smuzhiyun 	uint8_t		rsvd4;
298*4882a593Smuzhiyun 	uint32_t	dataxferaddr;
299*4882a593Smuzhiyun 	uint32_t	dataxferlen;
300*4882a593Smuzhiyun } __attribute__ ((packed)) mraid_epassthru_t;
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun /**
304*4882a593Smuzhiyun  * mraid_pinfo_t - product info, static information about the controller
305*4882a593Smuzhiyun  * @data_size		: current size in bytes (not including resvd)
306*4882a593Smuzhiyun  * @config_signature	: Current value is 0x00282008
307*4882a593Smuzhiyun  * @fw_version		: Firmware version
308*4882a593Smuzhiyun  * @bios_version	: version of the BIOS
309*4882a593Smuzhiyun  * @product_name	: Name given to the controller
310*4882a593Smuzhiyun  * @max_commands	: Maximum concurrent commands supported
311*4882a593Smuzhiyun  * @nchannels		: Number of SCSI Channels detected
312*4882a593Smuzhiyun  * @fc_loop_present	: Number of Fibre Loops detected
313*4882a593Smuzhiyun  * @mem_type		: EDO, FPM, SDRAM etc
314*4882a593Smuzhiyun  * @signature		:
315*4882a593Smuzhiyun  * @dram_size		: In terms of MB
316*4882a593Smuzhiyun  * @subsysid		: device PCI subsystem ID
317*4882a593Smuzhiyun  * @subsysvid		: device PCI subsystem vendor ID
318*4882a593Smuzhiyun  * @notify_counters	:
319*4882a593Smuzhiyun  * @pad1k		: 135 + 889 resvd = 1024 total size
320*4882a593Smuzhiyun  *
321*4882a593Smuzhiyun  * This structures holds the information about the controller which is not
322*4882a593Smuzhiyun  * expected to change dynamically.
323*4882a593Smuzhiyun  *
324*4882a593Smuzhiyun  * The current value of config signature is 0x00282008:
325*4882a593Smuzhiyun  * 0x28 = MAX_LOGICAL_DRIVES,
326*4882a593Smuzhiyun  * 0x20 = Number of stripes and
327*4882a593Smuzhiyun  * 0x08 = Number of spans
328*4882a593Smuzhiyun  */
329*4882a593Smuzhiyun typedef struct {
330*4882a593Smuzhiyun 	uint32_t	data_size;
331*4882a593Smuzhiyun 	uint32_t	config_signature;
332*4882a593Smuzhiyun 	uint8_t		fw_version[16];
333*4882a593Smuzhiyun 	uint8_t		bios_version[16];
334*4882a593Smuzhiyun 	uint8_t		product_name[80];
335*4882a593Smuzhiyun 	uint8_t		max_commands;
336*4882a593Smuzhiyun 	uint8_t		nchannels;
337*4882a593Smuzhiyun 	uint8_t		fc_loop_present;
338*4882a593Smuzhiyun 	uint8_t		mem_type;
339*4882a593Smuzhiyun 	uint32_t	signature;
340*4882a593Smuzhiyun 	uint16_t	dram_size;
341*4882a593Smuzhiyun 	uint16_t	subsysid;
342*4882a593Smuzhiyun 	uint16_t	subsysvid;
343*4882a593Smuzhiyun 	uint8_t		notify_counters;
344*4882a593Smuzhiyun 	uint8_t		pad1k[889];
345*4882a593Smuzhiyun } __attribute__ ((packed)) mraid_pinfo_t;
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun /**
349*4882a593Smuzhiyun  * mraid_notify_t - the notification structure
350*4882a593Smuzhiyun  * @global_counter		: Any change increments this counter
351*4882a593Smuzhiyun  * @param_counter		: Indicates any params changed
352*4882a593Smuzhiyun  * @param_id			: Param modified - defined below
353*4882a593Smuzhiyun  * @param_val			: New val of last param modified
354*4882a593Smuzhiyun  * @write_config_counter	: write config occurred
355*4882a593Smuzhiyun  * @write_config_rsvd		:
356*4882a593Smuzhiyun  * @ldrv_op_counter		: Indicates ldrv op started/completed
357*4882a593Smuzhiyun  * @ldrv_opid			: ldrv num
358*4882a593Smuzhiyun  * @ldrv_opcmd			: ldrv operation - defined below
359*4882a593Smuzhiyun  * @ldrv_opstatus		: status of the operation
360*4882a593Smuzhiyun  * @ldrv_state_counter		: Indicates change of ldrv state
361*4882a593Smuzhiyun  * @ldrv_state_id		: ldrv num
362*4882a593Smuzhiyun  * @ldrv_state_new		: New state
363*4882a593Smuzhiyun  * @ldrv_state_old		: old state
364*4882a593Smuzhiyun  * @pdrv_state_counter		: Indicates change of ldrv state
365*4882a593Smuzhiyun  * @pdrv_state_id		: pdrv id
366*4882a593Smuzhiyun  * @pdrv_state_new		: New state
367*4882a593Smuzhiyun  * @pdrv_state_old		: old state
368*4882a593Smuzhiyun  * @pdrv_fmt_counter		: Indicates pdrv format started/over
369*4882a593Smuzhiyun  * @pdrv_fmt_id			: pdrv id
370*4882a593Smuzhiyun  * @pdrv_fmt_val		: format started/over
371*4882a593Smuzhiyun  * @pdrv_fmt_rsvd		:
372*4882a593Smuzhiyun  * @targ_xfer_counter		: Indicates SCSI-2 Xfer rate change
373*4882a593Smuzhiyun  * @targ_xfer_id		: pdrv Id
374*4882a593Smuzhiyun  * @targ_xfer_val		: new Xfer params of last pdrv
375*4882a593Smuzhiyun  * @targ_xfer_rsvd		:
376*4882a593Smuzhiyun  * @fcloop_id_chg_counter	: Indicates loopid changed
377*4882a593Smuzhiyun  * @fcloopid_pdrvid		: pdrv id
378*4882a593Smuzhiyun  * @fcloop_id0			: loopid on fc loop 0
379*4882a593Smuzhiyun  * @fcloop_id1			: loopid on fc loop 1
380*4882a593Smuzhiyun  * @fcloop_state_counter	: Indicates loop state changed
381*4882a593Smuzhiyun  * @fcloop_state0		: state of fc loop 0
382*4882a593Smuzhiyun  * @fcloop_state1		: state of fc loop 1
383*4882a593Smuzhiyun  * @fcloop_state_rsvd		:
384*4882a593Smuzhiyun  */
385*4882a593Smuzhiyun typedef struct {
386*4882a593Smuzhiyun 	uint32_t	global_counter;
387*4882a593Smuzhiyun 	uint8_t		param_counter;
388*4882a593Smuzhiyun 	uint8_t		param_id;
389*4882a593Smuzhiyun 	uint16_t	param_val;
390*4882a593Smuzhiyun 	uint8_t		write_config_counter;
391*4882a593Smuzhiyun 	uint8_t		write_config_rsvd[3];
392*4882a593Smuzhiyun 	uint8_t		ldrv_op_counter;
393*4882a593Smuzhiyun 	uint8_t		ldrv_opid;
394*4882a593Smuzhiyun 	uint8_t		ldrv_opcmd;
395*4882a593Smuzhiyun 	uint8_t		ldrv_opstatus;
396*4882a593Smuzhiyun 	uint8_t		ldrv_state_counter;
397*4882a593Smuzhiyun 	uint8_t		ldrv_state_id;
398*4882a593Smuzhiyun 	uint8_t		ldrv_state_new;
399*4882a593Smuzhiyun 	uint8_t		ldrv_state_old;
400*4882a593Smuzhiyun 	uint8_t		pdrv_state_counter;
401*4882a593Smuzhiyun 	uint8_t		pdrv_state_id;
402*4882a593Smuzhiyun 	uint8_t		pdrv_state_new;
403*4882a593Smuzhiyun 	uint8_t		pdrv_state_old;
404*4882a593Smuzhiyun 	uint8_t		pdrv_fmt_counter;
405*4882a593Smuzhiyun 	uint8_t		pdrv_fmt_id;
406*4882a593Smuzhiyun 	uint8_t		pdrv_fmt_val;
407*4882a593Smuzhiyun 	uint8_t		pdrv_fmt_rsvd;
408*4882a593Smuzhiyun 	uint8_t		targ_xfer_counter;
409*4882a593Smuzhiyun 	uint8_t		targ_xfer_id;
410*4882a593Smuzhiyun 	uint8_t		targ_xfer_val;
411*4882a593Smuzhiyun 	uint8_t		targ_xfer_rsvd;
412*4882a593Smuzhiyun 	uint8_t		fcloop_id_chg_counter;
413*4882a593Smuzhiyun 	uint8_t		fcloopid_pdrvid;
414*4882a593Smuzhiyun 	uint8_t		fcloop_id0;
415*4882a593Smuzhiyun 	uint8_t		fcloop_id1;
416*4882a593Smuzhiyun 	uint8_t		fcloop_state_counter;
417*4882a593Smuzhiyun 	uint8_t		fcloop_state0;
418*4882a593Smuzhiyun 	uint8_t		fcloop_state1;
419*4882a593Smuzhiyun 	uint8_t		fcloop_state_rsvd;
420*4882a593Smuzhiyun } __attribute__ ((packed)) mraid_notify_t;
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun /**
424*4882a593Smuzhiyun  * mraid_inquiry3_t - enquiry for device information
425*4882a593Smuzhiyun  *
426*4882a593Smuzhiyun  * @data_size		: current size in bytes (not including resvd)
427*4882a593Smuzhiyun  * @notify		:
428*4882a593Smuzhiyun  * @notify_rsvd		:
429*4882a593Smuzhiyun  * @rebuild_rate	: rebuild rate (0% - 100%)
430*4882a593Smuzhiyun  * @cache_flush_int	: cache flush interval in seconds
431*4882a593Smuzhiyun  * @sense_alert		:
432*4882a593Smuzhiyun  * @drive_insert_count	: drive insertion count
433*4882a593Smuzhiyun  * @battery_status	:
434*4882a593Smuzhiyun  * @num_ldrv		: no. of Log Drives configured
435*4882a593Smuzhiyun  * @recon_state		: state of reconstruct
436*4882a593Smuzhiyun  * @ldrv_op_status	: logdrv Status
437*4882a593Smuzhiyun  * @ldrv_size		: size of each log drv
438*4882a593Smuzhiyun  * @ldrv_prop		:
439*4882a593Smuzhiyun  * @ldrv_state		: state of log drives
440*4882a593Smuzhiyun  * @pdrv_state		: state of phys drvs.
441*4882a593Smuzhiyun  * @pdrv_format		:
442*4882a593Smuzhiyun  * @targ_xfer		: phys device transfer rate
443*4882a593Smuzhiyun  * @pad1k		: 761 + 263reserved = 1024 bytes total size
444*4882a593Smuzhiyun  */
445*4882a593Smuzhiyun #define MAX_NOTIFY_SIZE		0x80
446*4882a593Smuzhiyun #define CUR_NOTIFY_SIZE		sizeof(mraid_notify_t)
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun typedef struct {
449*4882a593Smuzhiyun 	uint32_t	data_size;
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun 	mraid_notify_t	notify;
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun 	uint8_t		notify_rsvd[MAX_NOTIFY_SIZE - CUR_NOTIFY_SIZE];
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun 	uint8_t		rebuild_rate;
456*4882a593Smuzhiyun 	uint8_t		cache_flush_int;
457*4882a593Smuzhiyun 	uint8_t		sense_alert;
458*4882a593Smuzhiyun 	uint8_t		drive_insert_count;
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun 	uint8_t		battery_status;
461*4882a593Smuzhiyun 	uint8_t		num_ldrv;
462*4882a593Smuzhiyun 	uint8_t		recon_state[MAX_LOGICAL_DRIVES_40LD / 8];
463*4882a593Smuzhiyun 	uint16_t	ldrv_op_status[MAX_LOGICAL_DRIVES_40LD / 8];
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun 	uint32_t	ldrv_size[MAX_LOGICAL_DRIVES_40LD];
466*4882a593Smuzhiyun 	uint8_t		ldrv_prop[MAX_LOGICAL_DRIVES_40LD];
467*4882a593Smuzhiyun 	uint8_t		ldrv_state[MAX_LOGICAL_DRIVES_40LD];
468*4882a593Smuzhiyun 	uint8_t		pdrv_state[FC_MAX_PHYSICAL_DEVICES];
469*4882a593Smuzhiyun 	uint16_t	pdrv_format[FC_MAX_PHYSICAL_DEVICES / 16];
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun 	uint8_t		targ_xfer[80];
472*4882a593Smuzhiyun 	uint8_t		pad1k[263];
473*4882a593Smuzhiyun } __attribute__ ((packed)) mraid_inquiry3_t;
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun /**
477*4882a593Smuzhiyun  * mraid_adapinfo_t - information about the adapter
478*4882a593Smuzhiyun  * @max_commands		: max concurrent commands supported
479*4882a593Smuzhiyun  * @rebuild_rate		: rebuild rate - 0% thru 100%
480*4882a593Smuzhiyun  * @max_targ_per_chan		: max targ per channel
481*4882a593Smuzhiyun  * @nchannels			: number of channels on HBA
482*4882a593Smuzhiyun  * @fw_version			: firmware version
483*4882a593Smuzhiyun  * @age_of_flash		: number of times FW has been flashed
484*4882a593Smuzhiyun  * @chip_set_value		: contents of 0xC0000832
485*4882a593Smuzhiyun  * @dram_size			: in MB
486*4882a593Smuzhiyun  * @cache_flush_interval	: in seconds
487*4882a593Smuzhiyun  * @bios_version		:
488*4882a593Smuzhiyun  * @board_type			:
489*4882a593Smuzhiyun  * @sense_alert			:
490*4882a593Smuzhiyun  * @write_config_count		: increase with every configuration change
491*4882a593Smuzhiyun  * @drive_inserted_count	: increase with every drive inserted
492*4882a593Smuzhiyun  * @inserted_drive		: channel:Id of inserted drive
493*4882a593Smuzhiyun  * @battery_status		: bit 0: battery module missing
494*4882a593Smuzhiyun  *				bit 1: VBAD
495*4882a593Smuzhiyun  *				bit 2: temperature high
496*4882a593Smuzhiyun  *				bit 3: battery pack missing
497*4882a593Smuzhiyun  *				bit 4,5:
498*4882a593Smuzhiyun  *					00 - charge complete
499*4882a593Smuzhiyun  *					01 - fast charge in progress
500*4882a593Smuzhiyun  *					10 - fast charge fail
501*4882a593Smuzhiyun  *					11 - undefined
502*4882a593Smuzhiyun  *				bit 6: counter > 1000
503*4882a593Smuzhiyun  *				bit 7: Undefined
504*4882a593Smuzhiyun  * @dec_fault_bus_info		:
505*4882a593Smuzhiyun  */
506*4882a593Smuzhiyun typedef struct {
507*4882a593Smuzhiyun 	uint8_t		max_commands;
508*4882a593Smuzhiyun 	uint8_t		rebuild_rate;
509*4882a593Smuzhiyun 	uint8_t		max_targ_per_chan;
510*4882a593Smuzhiyun 	uint8_t		nchannels;
511*4882a593Smuzhiyun 	uint8_t		fw_version[4];
512*4882a593Smuzhiyun 	uint16_t	age_of_flash;
513*4882a593Smuzhiyun 	uint8_t		chip_set_value;
514*4882a593Smuzhiyun 	uint8_t		dram_size;
515*4882a593Smuzhiyun 	uint8_t		cache_flush_interval;
516*4882a593Smuzhiyun 	uint8_t		bios_version[4];
517*4882a593Smuzhiyun 	uint8_t		board_type;
518*4882a593Smuzhiyun 	uint8_t		sense_alert;
519*4882a593Smuzhiyun 	uint8_t		write_config_count;
520*4882a593Smuzhiyun 	uint8_t		battery_status;
521*4882a593Smuzhiyun 	uint8_t		dec_fault_bus_info;
522*4882a593Smuzhiyun } __attribute__ ((packed)) mraid_adapinfo_t;
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun /**
526*4882a593Smuzhiyun  * mraid_ldrv_info_t - information about the logical drives
527*4882a593Smuzhiyun  * @nldrv	: Number of logical drives configured
528*4882a593Smuzhiyun  * @rsvd	:
529*4882a593Smuzhiyun  * @size	: size of each logical drive
530*4882a593Smuzhiyun  * @prop	:
531*4882a593Smuzhiyun  * @state	: state of each logical drive
532*4882a593Smuzhiyun  */
533*4882a593Smuzhiyun typedef struct {
534*4882a593Smuzhiyun 	uint8_t		nldrv;
535*4882a593Smuzhiyun 	uint8_t		rsvd[3];
536*4882a593Smuzhiyun 	uint32_t	size[MAX_LOGICAL_DRIVES_8LD];
537*4882a593Smuzhiyun 	uint8_t		prop[MAX_LOGICAL_DRIVES_8LD];
538*4882a593Smuzhiyun 	uint8_t		state[MAX_LOGICAL_DRIVES_8LD];
539*4882a593Smuzhiyun } __attribute__ ((packed)) mraid_ldrv_info_t;
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun 
542*4882a593Smuzhiyun /**
543*4882a593Smuzhiyun  * mraid_pdrv_info_t - information about the physical drives
544*4882a593Smuzhiyun  * @pdrv_state	: state of each physical drive
545*4882a593Smuzhiyun  */
546*4882a593Smuzhiyun typedef struct {
547*4882a593Smuzhiyun 	uint8_t		pdrv_state[MBOX_MAX_PHYSICAL_DRIVES];
548*4882a593Smuzhiyun 	uint8_t		rsvd;
549*4882a593Smuzhiyun } __attribute__ ((packed)) mraid_pdrv_info_t;
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun /**
553*4882a593Smuzhiyun  * mraid_inquiry_t - RAID inquiry, mailbox command 0x05
554*4882a593Smuzhiyun  * @mraid_adapinfo_t	: adapter information
555*4882a593Smuzhiyun  * @mraid_ldrv_info_t	: logical drives information
556*4882a593Smuzhiyun  * @mraid_pdrv_info_t	: physical drives information
557*4882a593Smuzhiyun  */
558*4882a593Smuzhiyun typedef struct {
559*4882a593Smuzhiyun 	mraid_adapinfo_t	adapter_info;
560*4882a593Smuzhiyun 	mraid_ldrv_info_t	logdrv_info;
561*4882a593Smuzhiyun 	mraid_pdrv_info_t	pdrv_info;
562*4882a593Smuzhiyun } __attribute__ ((packed)) mraid_inquiry_t;
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun 
565*4882a593Smuzhiyun /**
566*4882a593Smuzhiyun  * mraid_extinq_t - RAID extended inquiry, mailbox command 0x04
567*4882a593Smuzhiyun  *
568*4882a593Smuzhiyun  * @raid_inq		: raid inquiry
569*4882a593Smuzhiyun  * @phys_drv_format	:
570*4882a593Smuzhiyun  * @stack_attn		:
571*4882a593Smuzhiyun  * @modem_status	:
572*4882a593Smuzhiyun  * @rsvd		:
573*4882a593Smuzhiyun  */
574*4882a593Smuzhiyun typedef struct {
575*4882a593Smuzhiyun 	mraid_inquiry_t	raid_inq;
576*4882a593Smuzhiyun 	uint16_t	phys_drv_format[MAX_MBOX_CHANNELS];
577*4882a593Smuzhiyun 	uint8_t		stack_attn;
578*4882a593Smuzhiyun 	uint8_t		modem_status;
579*4882a593Smuzhiyun 	uint8_t		rsvd[2];
580*4882a593Smuzhiyun } __attribute__ ((packed)) mraid_extinq_t;
581*4882a593Smuzhiyun 
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun /**
584*4882a593Smuzhiyun  * adap_device_t - device information
585*4882a593Smuzhiyun  * @channel	: channel fpor the device
586*4882a593Smuzhiyun  * @target	: target ID of the device
587*4882a593Smuzhiyun  */
588*4882a593Smuzhiyun typedef struct {
589*4882a593Smuzhiyun 	uint8_t		channel;
590*4882a593Smuzhiyun 	uint8_t		target;
591*4882a593Smuzhiyun }__attribute__ ((packed)) adap_device_t;
592*4882a593Smuzhiyun 
593*4882a593Smuzhiyun 
594*4882a593Smuzhiyun /**
595*4882a593Smuzhiyun  * adap_span_40ld_t - 40LD span
596*4882a593Smuzhiyun  * @start_blk	: starting block
597*4882a593Smuzhiyun  * @num_blks	: number of blocks
598*4882a593Smuzhiyun  */
599*4882a593Smuzhiyun typedef struct {
600*4882a593Smuzhiyun 	uint32_t	start_blk;
601*4882a593Smuzhiyun 	uint32_t	num_blks;
602*4882a593Smuzhiyun 	adap_device_t	device[MAX_ROW_SIZE_40LD];
603*4882a593Smuzhiyun }__attribute__ ((packed)) adap_span_40ld_t;
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun 
606*4882a593Smuzhiyun /**
607*4882a593Smuzhiyun  * adap_span_8ld_t - 8LD span
608*4882a593Smuzhiyun  * @start_blk	: starting block
609*4882a593Smuzhiyun  * @num_blks	: number of blocks
610*4882a593Smuzhiyun  */
611*4882a593Smuzhiyun typedef struct {
612*4882a593Smuzhiyun 	uint32_t	start_blk;
613*4882a593Smuzhiyun 	uint32_t	num_blks;
614*4882a593Smuzhiyun 	adap_device_t	device[MAX_ROW_SIZE_8LD];
615*4882a593Smuzhiyun }__attribute__ ((packed)) adap_span_8ld_t;
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun 
618*4882a593Smuzhiyun /**
619*4882a593Smuzhiyun  * logdrv_param_t - logical drives parameters
620*4882a593Smuzhiyun  *
621*4882a593Smuzhiyun  * @span_depth	: total number of spans
622*4882a593Smuzhiyun  * @level	: RAID level
623*4882a593Smuzhiyun  * @read_ahead	: read ahead, no read ahead, adaptive read ahead
624*4882a593Smuzhiyun  * @stripe_sz	: encoded stripe size
625*4882a593Smuzhiyun  * @status	: status of the logical drive
626*4882a593Smuzhiyun  * @write_mode	: write mode, write_through/write_back
627*4882a593Smuzhiyun  * @direct_io	: direct io or through cache
628*4882a593Smuzhiyun  * @row_size	: number of stripes in a row
629*4882a593Smuzhiyun  */
630*4882a593Smuzhiyun typedef struct {
631*4882a593Smuzhiyun 	uint8_t		span_depth;
632*4882a593Smuzhiyun 	uint8_t		level;
633*4882a593Smuzhiyun 	uint8_t		read_ahead;
634*4882a593Smuzhiyun 	uint8_t		stripe_sz;
635*4882a593Smuzhiyun 	uint8_t		status;
636*4882a593Smuzhiyun 	uint8_t		write_mode;
637*4882a593Smuzhiyun 	uint8_t		direct_io;
638*4882a593Smuzhiyun 	uint8_t		row_size;
639*4882a593Smuzhiyun } __attribute__ ((packed)) logdrv_param_t;
640*4882a593Smuzhiyun 
641*4882a593Smuzhiyun 
642*4882a593Smuzhiyun /**
643*4882a593Smuzhiyun  * logdrv_40ld_t - logical drive definition for 40LD controllers
644*4882a593Smuzhiyun  * @lparam	: logical drives parameters
645*4882a593Smuzhiyun  * @span	: span
646*4882a593Smuzhiyun  */
647*4882a593Smuzhiyun typedef struct {
648*4882a593Smuzhiyun 	logdrv_param_t		lparam;
649*4882a593Smuzhiyun 	adap_span_40ld_t	span[SPAN_DEPTH_8_SPANS];
650*4882a593Smuzhiyun }__attribute__ ((packed)) logdrv_40ld_t;
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun 
653*4882a593Smuzhiyun /**
654*4882a593Smuzhiyun  * logdrv_8ld_span8_t - logical drive definition for 8LD controllers
655*4882a593Smuzhiyun  * @lparam	: logical drives parameters
656*4882a593Smuzhiyun  * @span	: span
657*4882a593Smuzhiyun  *
658*4882a593Smuzhiyun  * 8-LD logical drive with up to 8 spans
659*4882a593Smuzhiyun  */
660*4882a593Smuzhiyun typedef struct {
661*4882a593Smuzhiyun 	logdrv_param_t	lparam;
662*4882a593Smuzhiyun 	adap_span_8ld_t	span[SPAN_DEPTH_8_SPANS];
663*4882a593Smuzhiyun }__attribute__ ((packed)) logdrv_8ld_span8_t;
664*4882a593Smuzhiyun 
665*4882a593Smuzhiyun 
666*4882a593Smuzhiyun /**
667*4882a593Smuzhiyun  * logdrv_8ld_span4_t - logical drive definition for 8LD controllers
668*4882a593Smuzhiyun  * @lparam	: logical drives parameters
669*4882a593Smuzhiyun  * @span	: span
670*4882a593Smuzhiyun  *
671*4882a593Smuzhiyun  * 8-LD logical drive with up to 4 spans
672*4882a593Smuzhiyun  */
673*4882a593Smuzhiyun typedef struct {
674*4882a593Smuzhiyun 	logdrv_param_t	lparam;
675*4882a593Smuzhiyun 	adap_span_8ld_t	span[SPAN_DEPTH_4_SPANS];
676*4882a593Smuzhiyun }__attribute__ ((packed)) logdrv_8ld_span4_t;
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun 
679*4882a593Smuzhiyun /**
680*4882a593Smuzhiyun  * phys_drive_t - physical device information
681*4882a593Smuzhiyun  * @type	: Type of the device
682*4882a593Smuzhiyun  * @cur_status	: current status of the device
683*4882a593Smuzhiyun  * @tag_depth	: Level of tagging
684*4882a593Smuzhiyun  * @sync_neg	: sync negotiation - ENABLE or DISABLE
685*4882a593Smuzhiyun  * @size	: configurable size in terms of 512 byte
686*4882a593Smuzhiyun  */
687*4882a593Smuzhiyun typedef struct {
688*4882a593Smuzhiyun 	uint8_t		type;
689*4882a593Smuzhiyun 	uint8_t		cur_status;
690*4882a593Smuzhiyun 	uint8_t		tag_depth;
691*4882a593Smuzhiyun 	uint8_t		sync_neg;
692*4882a593Smuzhiyun 	uint32_t	size;
693*4882a593Smuzhiyun }__attribute__ ((packed)) phys_drive_t;
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun 
696*4882a593Smuzhiyun /**
697*4882a593Smuzhiyun  * disk_array_40ld_t - disk array for 40LD controllers
698*4882a593Smuzhiyun  * @numldrv	: number of logical drives
699*4882a593Smuzhiyun  * @resvd	:
700*4882a593Smuzhiyun  * @ldrv	: logical drives information
701*4882a593Smuzhiyun  * @pdrv	: physical drives information
702*4882a593Smuzhiyun  */
703*4882a593Smuzhiyun typedef struct {
704*4882a593Smuzhiyun 	uint8_t		numldrv;
705*4882a593Smuzhiyun 	uint8_t		resvd[3];
706*4882a593Smuzhiyun 	logdrv_40ld_t	ldrv[MAX_LOGICAL_DRIVES_40LD];
707*4882a593Smuzhiyun 	phys_drive_t	pdrv[MBOX_MAX_PHYSICAL_DRIVES];
708*4882a593Smuzhiyun }__attribute__ ((packed)) disk_array_40ld_t;
709*4882a593Smuzhiyun 
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun /**
712*4882a593Smuzhiyun  * disk_array_8ld_span8_t - disk array for 8LD controllers
713*4882a593Smuzhiyun  * @numldrv	: number of logical drives
714*4882a593Smuzhiyun  * @resvd	:
715*4882a593Smuzhiyun  * @ldrv	: logical drives information
716*4882a593Smuzhiyun  * @pdrv	: physical drives information
717*4882a593Smuzhiyun  *
718*4882a593Smuzhiyun  * Disk array for 8LD logical drives with up to 8 spans
719*4882a593Smuzhiyun  */
720*4882a593Smuzhiyun typedef struct {
721*4882a593Smuzhiyun 	uint8_t			numldrv;
722*4882a593Smuzhiyun 	uint8_t			resvd[3];
723*4882a593Smuzhiyun 	logdrv_8ld_span8_t	ldrv[MAX_LOGICAL_DRIVES_8LD];
724*4882a593Smuzhiyun 	phys_drive_t		pdrv[MBOX_MAX_PHYSICAL_DRIVES];
725*4882a593Smuzhiyun }__attribute__ ((packed)) disk_array_8ld_span8_t;
726*4882a593Smuzhiyun 
727*4882a593Smuzhiyun 
728*4882a593Smuzhiyun /**
729*4882a593Smuzhiyun  * disk_array_8ld_span4_t - disk array for 8LD controllers
730*4882a593Smuzhiyun  * @numldrv	: number of logical drives
731*4882a593Smuzhiyun  * @resvd	:
732*4882a593Smuzhiyun  * @ldrv	: logical drives information
733*4882a593Smuzhiyun  * @pdrv	: physical drives information
734*4882a593Smuzhiyun  *
735*4882a593Smuzhiyun  * Disk array for 8LD logical drives with up to 4 spans
736*4882a593Smuzhiyun  */
737*4882a593Smuzhiyun typedef struct {
738*4882a593Smuzhiyun 	uint8_t			numldrv;
739*4882a593Smuzhiyun 	uint8_t			resvd[3];
740*4882a593Smuzhiyun 	logdrv_8ld_span4_t	ldrv[MAX_LOGICAL_DRIVES_8LD];
741*4882a593Smuzhiyun 	phys_drive_t		pdrv[MBOX_MAX_PHYSICAL_DRIVES];
742*4882a593Smuzhiyun }__attribute__ ((packed)) disk_array_8ld_span4_t;
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun 
745*4882a593Smuzhiyun /**
746*4882a593Smuzhiyun  * struct private_bios_data - bios private data for boot devices
747*4882a593Smuzhiyun  * @geometry	: bits 0-3 - BIOS geometry, 0x0001 - 1GB, 0x0010 - 2GB,
748*4882a593Smuzhiyun  *		0x1000 - 8GB, Others values are invalid
749*4882a593Smuzhiyun  * @unused	: bits 4-7 are unused
750*4882a593Smuzhiyun  * @boot_drv	: logical drive set as boot drive, 0..7 - for 8LD cards,
751*4882a593Smuzhiyun  * 		0..39 - for 40LD cards
752*4882a593Smuzhiyun  * @cksum	: 0-(sum of first 13 bytes of this structure)
753*4882a593Smuzhiyun  */
754*4882a593Smuzhiyun struct private_bios_data {
755*4882a593Smuzhiyun 	uint8_t		geometry	:4;
756*4882a593Smuzhiyun 	uint8_t		unused		:4;
757*4882a593Smuzhiyun 	uint8_t		boot_drv;
758*4882a593Smuzhiyun 	uint8_t		rsvd[12];
759*4882a593Smuzhiyun 	uint16_t	cksum;
760*4882a593Smuzhiyun } __attribute__ ((packed));
761*4882a593Smuzhiyun 
762*4882a593Smuzhiyun 
763*4882a593Smuzhiyun /**
764*4882a593Smuzhiyun  * mbox_sgl64 - 64-bit scatter list for mailbox based controllers
765*4882a593Smuzhiyun  * @address	: address of the buffer
766*4882a593Smuzhiyun  * @length	: data transfer length
767*4882a593Smuzhiyun  */
768*4882a593Smuzhiyun typedef struct {
769*4882a593Smuzhiyun 	uint64_t	address;
770*4882a593Smuzhiyun 	uint32_t	length;
771*4882a593Smuzhiyun } __attribute__ ((packed)) mbox_sgl64;
772*4882a593Smuzhiyun 
773*4882a593Smuzhiyun /**
774*4882a593Smuzhiyun  * mbox_sgl32 - 32-bit scatter list for mailbox based controllers
775*4882a593Smuzhiyun  * @address	: address of the buffer
776*4882a593Smuzhiyun  * @length	: data transfer length
777*4882a593Smuzhiyun  */
778*4882a593Smuzhiyun typedef struct {
779*4882a593Smuzhiyun 	uint32_t	address;
780*4882a593Smuzhiyun 	uint32_t	length;
781*4882a593Smuzhiyun } __attribute__ ((packed)) mbox_sgl32;
782*4882a593Smuzhiyun 
783*4882a593Smuzhiyun #endif		// _MRAID_MBOX_DEFS_H_
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun /* vim: set ts=8 sw=8 tw=78: */
786