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