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