mbox_defs.h revision 25985edcedea6396277003854657b5f3cb31a628
1dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes/*
2dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes *
3dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes *			Linux MegaRAID Unified device driver
4dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes *
5dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * Copyright (c) 2003-2004  LSI Logic Corporation.
6dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes *
7dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes *	   This program is free software; you can redistribute it and/or
8dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes *	   modify it under the terms of the GNU General Public License
9dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes *	   as published by the Free Software Foundation; either version
10dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes *	   2 of the License, or (at your option) any later version.
11dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes *
12dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * FILE		: mbox_defs.h
1327c766aaacb265d625dc634bf7903f7f9fd0c697Joe Perches *
1427c766aaacb265d625dc634bf7903f7f9fd0c697Joe Perches */
1527c766aaacb265d625dc634bf7903f7f9fd0c697Joe Perches#ifndef _MRAID_MBOX_DEFS_H_
16dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define _MRAID_MBOX_DEFS_H_
17dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
18dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#include <linux/types.h>
19dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
20dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes/*
21dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * Commands and states for mailbox based controllers
22dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes */
23dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
24dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MBOXCMD_LREAD		0x01
25dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MBOXCMD_LWRITE		0x02
26dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MBOXCMD_PASSTHRU	0x03
27dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MBOXCMD_ADPEXTINQ	0x04
28dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MBOXCMD_ADAPTERINQ	0x05
29dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MBOXCMD_LREAD64		0xA7
30dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MBOXCMD_LWRITE64	0xA8
31dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MBOXCMD_PASSTHRU64	0xC3
32dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MBOXCMD_EXTPTHRU	0xE3
33dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
34dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MAIN_MISC_OPCODE	0xA4
35dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define GET_MAX_SG_SUPPORT	0x01
36dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define SUPPORT_EXT_CDB		0x16
37dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
38dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define FC_NEW_CONFIG		0xA1
39dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define NC_SUBOP_PRODUCT_INFO	0x0E
40dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define NC_SUBOP_ENQUIRY3	0x0F
41dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define ENQ3_GET_SOLICITED_FULL	0x02
42dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define OP_DCMD_READ_CONFIG	0x04
43dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define NEW_READ_CONFIG_8LD	0x67
44dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define READ_CONFIG_8LD		0x07
45dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define FLUSH_ADAPTER		0x0A
46dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define FLUSH_SYSTEM		0xFE
47dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
48dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes/*
49dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * Command for random deletion of logical drives
50dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes */
51dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define	FC_DEL_LOGDRV		0xA4
52dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define	OP_SUP_DEL_LOGDRV	0x2A
53dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define OP_GET_LDID_MAP		0x18
54dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define OP_DEL_LOGDRV		0x1C
55dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
56dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes/*
57dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * BIOS commands
58dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes */
59dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define IS_BIOS_ENABLED		0x62
60dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define GET_BIOS		0x01
6186a1e1896c2710402e29a875d8d830244274244dWim Van Sebroeck#define CHNL_CLASS		0xA9
6286a1e1896c2710402e29a875d8d830244274244dWim Van Sebroeck#define GET_CHNL_CLASS		0x00
63dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define SET_CHNL_CLASS		0x01
64dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define CH_RAID			0x01
65dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define CH_SCSI			0x00
66dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define BIOS_PVT_DATA		0x40
67dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define GET_BIOS_PVT_DATA	0x00
68dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
69dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
70dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes/*
71dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * Commands to support clustering
72dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes */
73dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define GET_TARGET_ID		0x7D
74dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define CLUSTER_OP		0x70
75dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define GET_CLUSTER_MODE	0x02
76dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define CLUSTER_CMD		0x6E
77dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define RESERVE_LD		0x01
78dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define RELEASE_LD		0x02
79dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define RESET_RESERVATIONS	0x03
80dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define RESERVATION_STATUS	0x04
81dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define RESERVE_PD		0x05
82dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define RELEASE_PD		0x06
83dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
84dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
85dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes/*
86dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * Module battery status
87dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes */
88dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define BATTERY_MODULE_MISSING		0x01
89dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define BATTERY_LOW_VOLTAGE		0x02
90dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define BATTERY_TEMP_HIGH		0x04
91dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define BATTERY_PACK_MISSING		0x08
92dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define BATTERY_CHARGE_MASK		0x30
93dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define BATTERY_CHARGE_DONE		0x00
94dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define BATTERY_CHARGE_INPROG		0x10
95dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define BATTERY_CHARGE_FAIL		0x20
96dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define BATTERY_CYCLES_EXCEEDED		0x40
97dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
98dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes/*
99dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * Physical drive states.
100dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes */
101dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define PDRV_UNCNF	0
102dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define PDRV_ONLINE	3
103dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define PDRV_FAILED	4
1040197c1c49ef1ff386b2ebb6d3b0fc85a8e174b5cWim Van Sebroeck#define PDRV_RBLD	5
105dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define PDRV_HOTSPARE	6
106dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
107dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
108dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes/*
109dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * Raid logical drive states.
110dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes */
111dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define RDRV_OFFLINE	0
1120197c1c49ef1ff386b2ebb6d3b0fc85a8e174b5cWim Van Sebroeck#define RDRV_DEGRADED	1
113dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define RDRV_OPTIMAL	2
114dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define RDRV_DELETED	3
115dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
116dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes/*
117dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * Read, write and cache policies
118dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes */
119dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define NO_READ_AHEAD		0
120dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define READ_AHEAD		1
121dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define ADAP_READ_AHEAD		2
122dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define WRMODE_WRITE_THRU	0
123dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define WRMODE_WRITE_BACK	1
124dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define CACHED_IO		0
125dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define DIRECT_IO		1
126dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
127dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MAX_LOGICAL_DRIVES_8LD		8
128dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MAX_LOGICAL_DRIVES_40LD		40
129dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define FC_MAX_PHYSICAL_DEVICES		256
130dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MAX_MBOX_CHANNELS		5
1310197c1c49ef1ff386b2ebb6d3b0fc85a8e174b5cWim Van Sebroeck#define MAX_MBOX_TARGET			15
132dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MBOX_MAX_PHYSICAL_DRIVES	MAX_MBOX_CHANNELS*MAX_MBOX_TARGET
133dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MAX_ROW_SIZE_40LD		32
134dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MAX_ROW_SIZE_8LD		8
135dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define SPAN_DEPTH_8_SPANS		8
136dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define SPAN_DEPTH_4_SPANS		4
137dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MAX_REQ_SENSE_LEN		0x20
138dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
139dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
140dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
141dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes/**
142dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * struct mbox_t - Driver and f/w handshake structure.
143dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @cmd		: firmware command
144dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @cmdid	: command id
145dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @numsectors	: number of sectors to be transferred
146dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @lba		: Logical Block Address on LD
147dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @xferaddr	: DMA address for data transfer
148dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @logdrv	: logical drive number
149dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @numsge	: number of scatter gather elements in sg list
150dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @resvd	: reserved
151dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @busy	: f/w busy, must wait to issue more commands.
152dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @numstatus	: number of commands completed.
153dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @status	: status of the commands completed
154f6dd94f8194408e11df4e33e1f7113612e84ca17Axel Lin * @completed	: array of completed command ids.
155f6dd94f8194408e11df4e33e1f7113612e84ca17Axel Lin * @poll	: poll and ack sequence
156dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @ack		: poll and ack sequence
157dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes *
158dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * The central handshake structure between the driver and the firmware. This
159dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * structure must be allocated by the driver and aligned at 8-byte boundary.
160dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes */
161dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes#define MBOX_MAX_FIRMWARE_STATUS	46
162dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertestypedef struct {
163dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		cmd;
164dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		cmdid;
165dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint16_t	numsectors;
166dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint32_t	lba;
167dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint32_t	xferaddr;
168dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		logdrv;
169dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		numsge;
170dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		resvd;
171dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		busy;
172dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		numstatus;
173dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		status;
174dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		completed[MBOX_MAX_FIRMWARE_STATUS];
175dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		poll;
176dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		ack;
177dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes} __attribute__ ((packed)) mbox_t;
178dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
179dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
180dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes/**
181dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * mbox64_t - 64-bit extension for the mailbox
182dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @segment_lo	: the low 32-bits of the address of the scatter-gather list
183dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @segment_hi	: the upper 32-bits of the address of the scatter-gather list
184dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @mbox	: 32-bit mailbox, whose xferadder field must be set to
185dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes *		0xFFFFFFFF
186dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes *
187dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * This is the extension of the 32-bit mailbox to be able to perform DMA
188dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * beyond 4GB address range.
189dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes */
190dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertestypedef struct {
191dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint32_t	xferaddr_lo;
192dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint32_t	xferaddr_hi;
193dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	mbox_t		mbox32;
194dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes} __attribute__ ((packed)) mbox64_t;
195dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
196dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes/*
197dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * mailbox structure used for internal commands
198dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes */
199dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertestypedef struct {
200dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	u8	cmd;
201dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	u8	cmdid;
202dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	u8	opcode;
203dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	u8	subopcode;
204dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	u32	lba;
205dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	u32	xferaddr;
206dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	u8	logdrv;
207dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	u8	rsvd[3];
208dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	u8	numstatus;
209dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	u8	status;
210dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes} __attribute__ ((packed)) int_mbox_t;
211dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
212dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes/**
213dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * mraid_passthru_t - passthru structure to issue commands to physical devices
214dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @timeout		: command timeout, 0=6sec, 1=60sec, 2=10min, 3=3hr
215dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @ars			: set if ARS required after check condition
216dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @islogical		: set if command meant for logical devices
217dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @logdrv		: logical drive number if command for LD
218dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @channel		: Channel on which physical device is located
219dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @target		: SCSI target of the device
220dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @queuetag		: unused
221dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @queueaction		: unused
222dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @cdb			: SCSI CDB
223dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @cdblen		: length of the CDB
224dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @reqsenselen		: amount of request sense data to be returned
225dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @reqsensearea	: Sense information buffer
226dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @numsge		: number of scatter-gather elements in the sg list
227dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @scsistatus		: SCSI status of the command completed.
228dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @dataxferaddr	: DMA data transfer address
229dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @dataxferlen		: amount of the data to be transferred.
230dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes */
231dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertestypedef struct {
232dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		timeout		:3;
233dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		ars		:1;
234dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		reserved	:3;
235dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		islogical	:1;
236dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		logdrv;
237dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		channel;
238dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		target;
2390318e286f9a73547dedfd9f733671f4941efb0e2Axel Lin	uint8_t		queuetag;
240dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		queueaction;
241dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		cdb[10];
242dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		cdblen;
243dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		reqsenselen;
244dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		reqsensearea[MAX_REQ_SENSE_LEN];
245dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		numsge;
246dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint8_t		scsistatus;
247dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint32_t	dataxferaddr;
248dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint32_t	dataxferlen;
249dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes} __attribute__ ((packed)) mraid_passthru_t;
250dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
251dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertestypedef struct {
252dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
253dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint32_t		dataxferaddr_lo;
254dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	uint32_t		dataxferaddr_hi;
255dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes	mraid_passthru_t	pthru32;
256dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
257dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes} __attribute__ ((packed)) mega_passthru64_t;
258dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes
259dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes/**
260dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * mraid_epassthru_t - passthru structure to issue commands to physical devices
261dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @timeout		: command timeout, 0=6sec, 1=60sec, 2=10min, 3=3hr
262dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @ars			: set if ARS required after check condition
263dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @rsvd1		: reserved field
264dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @cd_rom		: (?)
265dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @rsvd2		: reserved field
266dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @islogical		: set if command meant for logical devices
267dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @logdrv		: logical drive number if command for LD
268dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @channel		: Channel on which physical device is located
269dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @target		: SCSI target of the device
270dc3c56b703dad4aec8a9b3dd86f03a90d0c26a2dMarc Vertes * @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