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
162typedef 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 */
190typedef 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 */
199typedef 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 */
231typedef 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
251typedef 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 */
283typedef 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 */
334typedef 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 */
390typedef 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
453typedef 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 */
511typedef 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 */
538typedef 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 */
551typedef 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 */
563typedef 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 */
579typedef 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 */
593typedef 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 */
604typedef 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 */
616typedef 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 */
635typedef 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 */
652typedef 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 */
665typedef 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 */
678typedef 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 */
692typedef 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 */
708typedef 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 */
725typedef 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 */
742typedef 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 */
759struct 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 */
773typedef 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 */
783typedef 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