xref: /openbmc/linux/drivers/scsi/3w-sas.h (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
1f619106bSadam radford /*
2f619106bSadam radford    3w-sas.h -- LSI 3ware SAS/SATA-RAID Controller device driver for Linux.
3f619106bSadam radford 
42c9bce5bSadam radford    Written By: Adam Radford <aradford@gmail.com>
5f619106bSadam radford 
6f619106bSadam radford    Copyright (C) 2009 LSI Corporation.
7f619106bSadam radford 
8f619106bSadam radford    This program is free software; you can redistribute it and/or modify
9f619106bSadam radford    it under the terms of the GNU General Public License as published by
10f619106bSadam radford    the Free Software Foundation; version 2 of the License.
11f619106bSadam radford 
12f619106bSadam radford    This program is distributed in the hope that it will be useful,
13f619106bSadam radford    but WITHOUT ANY WARRANTY; without even the implied warranty of
14f619106bSadam radford    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15f619106bSadam radford    GNU General Public License for more details.
16f619106bSadam radford 
17f619106bSadam radford    NO WARRANTY
18f619106bSadam radford    THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
19f619106bSadam radford    CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
20f619106bSadam radford    LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
21f619106bSadam radford    MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
22f619106bSadam radford    solely responsible for determining the appropriateness of using and
23f619106bSadam radford    distributing the Program and assumes all risks associated with its
24f619106bSadam radford    exercise of rights under this Agreement, including but not limited to
25f619106bSadam radford    the risks and costs of program errors, damage to or loss of data,
26f619106bSadam radford    programs or equipment, and unavailability or interruption of operations.
27f619106bSadam radford 
28f619106bSadam radford    DISCLAIMER OF LIABILITY
29f619106bSadam radford    NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
30f619106bSadam radford    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31f619106bSadam radford    DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
32f619106bSadam radford    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
33f619106bSadam radford    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
34f619106bSadam radford    USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
35f619106bSadam radford    HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
36f619106bSadam radford 
37f619106bSadam radford    You should have received a copy of the GNU General Public License
38f619106bSadam radford    along with this program; if not, write to the Free Software
39f619106bSadam radford    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
40f619106bSadam radford 
41f619106bSadam radford    Bugs/Comments/Suggestions should be mailed to:
422c9bce5bSadam radford    aradford@gmail.com
43f619106bSadam radford */
44f619106bSadam radford 
45f619106bSadam radford #ifndef _3W_SAS_H
46f619106bSadam radford #define _3W_SAS_H
47f619106bSadam radford 
48f619106bSadam radford /* AEN severity table */
49f619106bSadam radford static char *twl_aen_severity_table[] =
50f619106bSadam radford {
51f619106bSadam radford 	"None", "ERROR", "WARNING", "INFO", "DEBUG", NULL
52f619106bSadam radford };
53f619106bSadam radford 
54f619106bSadam radford /* Liberator register offsets */
55f619106bSadam radford #define TWL_STATUS			   0x0  /* Status */
56f619106bSadam radford #define TWL_HIBDB			   0x20 /* Inbound doorbell */
57f619106bSadam radford #define TWL_HISTAT			   0x30 /* Host interrupt status */
58f619106bSadam radford #define TWL_HIMASK			   0x34 /* Host interrupt mask */
59f619106bSadam radford #define TWL_HOBDB			   0x9C /* Outbound doorbell */
60f619106bSadam radford #define TWL_HOBDBC			   0xA0 /* Outbound doorbell clear */
61f619106bSadam radford #define TWL_SCRPD3			   0xBC /* Scratchpad */
62f619106bSadam radford #define TWL_HIBQPL			   0xC0 /* Host inbound Q low */
63f619106bSadam radford #define TWL_HIBQPH			   0xC4 /* Host inbound Q high */
64f619106bSadam radford #define TWL_HOBQPL			   0xC8 /* Host outbound Q low */
65f619106bSadam radford #define TWL_HOBQPH			   0xCC /* Host outbound Q high */
66f619106bSadam radford #define TWL_HISTATUS_VALID_INTERRUPT	   0xC
67f619106bSadam radford #define TWL_HISTATUS_ATTENTION_INTERRUPT   0x4
68f619106bSadam radford #define TWL_HISTATUS_RESPONSE_INTERRUPT	   0x8
69f619106bSadam radford #define TWL_STATUS_OVERRUN_SUBMIT	   0x2000
70f619106bSadam radford #define TWL_ISSUE_SOFT_RESET		   0x100
71f619106bSadam radford #define TWL_CONTROLLER_READY		   0x2000
72f619106bSadam radford #define TWL_DOORBELL_CONTROLLER_ERROR	   0x200000
73f619106bSadam radford #define TWL_DOORBELL_ATTENTION_INTERRUPT   0x40000
74f619106bSadam radford #define TWL_PULL_MODE			   0x1
75f619106bSadam radford 
76f619106bSadam radford /* Command packet opcodes used by the driver */
77f619106bSadam radford #define TW_OP_INIT_CONNECTION 0x1
78f619106bSadam radford #define TW_OP_GET_PARAM	      0x12
79f619106bSadam radford #define TW_OP_SET_PARAM	      0x13
80f619106bSadam radford #define TW_OP_EXECUTE_SCSI    0x10
81f619106bSadam radford 
82f619106bSadam radford /* Asynchronous Event Notification (AEN) codes used by the driver */
83f619106bSadam radford #define TW_AEN_QUEUE_EMPTY	 0x0000
84f619106bSadam radford #define TW_AEN_SOFT_RESET	 0x0001
85f619106bSadam radford #define TW_AEN_SYNC_TIME_WITH_HOST 0x031
86f619106bSadam radford #define TW_AEN_SEVERITY_ERROR	 0x1
87f619106bSadam radford #define TW_AEN_SEVERITY_DEBUG	 0x4
88f619106bSadam radford #define TW_AEN_NOT_RETRIEVED	 0x1
89f619106bSadam radford 
90f619106bSadam radford /* Command state defines */
91f619106bSadam radford #define TW_S_INITIAL   0x1  /* Initial state */
92f619106bSadam radford #define TW_S_STARTED   0x2  /* Id in use */
93f619106bSadam radford #define TW_S_POSTED    0x4  /* Posted to the controller */
94f619106bSadam radford #define TW_S_COMPLETED 0x8  /* Completed by isr */
95f619106bSadam radford #define TW_S_FINISHED  0x10 /* I/O completely done */
96f619106bSadam radford 
97f619106bSadam radford /* Compatibility defines */
98f619106bSadam radford #define TW_9750_ARCH_ID 10
99f619106bSadam radford #define TW_CURRENT_DRIVER_SRL 40
100f619106bSadam radford #define TW_CURRENT_DRIVER_BUILD 0
101f619106bSadam radford #define TW_CURRENT_DRIVER_BRANCH 0
102f619106bSadam radford 
103f619106bSadam radford /* Misc defines */
104f619106bSadam radford #define TW_SECTOR_SIZE			      512
105f619106bSadam radford #define TW_MAX_UNITS			      32
106f619106bSadam radford #define TW_INIT_MESSAGE_CREDITS		      0x100
107f619106bSadam radford #define TW_INIT_COMMAND_PACKET_SIZE	      0x3
108f619106bSadam radford #define TW_INIT_COMMAND_PACKET_SIZE_EXTENDED  0x6
109f619106bSadam radford #define TW_EXTENDED_INIT_CONNECT	      0x2
110f619106bSadam radford #define TW_BASE_FW_SRL			      24
111f619106bSadam radford #define TW_BASE_FW_BRANCH		      0
112f619106bSadam radford #define TW_BASE_FW_BUILD		      1
113f619106bSadam radford #define TW_Q_LENGTH			      256
114f619106bSadam radford #define TW_Q_START			      0
115f619106bSadam radford #define TW_MAX_SLOT			      32
116f619106bSadam radford #define TW_MAX_RESET_TRIES		      2
117f619106bSadam radford #define TW_MAX_CMDS_PER_LUN		      254
118f619106bSadam radford #define TW_MAX_AEN_DRAIN		      255
119f619106bSadam radford #define TW_IN_RESET			      2
120f619106bSadam radford #define TW_USING_MSI			      3
121f619106bSadam radford #define TW_IN_ATTENTION_LOOP		      4
122f619106bSadam radford #define TW_MAX_SECTORS			      256
123f619106bSadam radford #define TW_MAX_CDB_LEN			      16
124f619106bSadam radford #define TW_IOCTL_CHRDEV_TIMEOUT		      60 /* 60 seconds */
125f619106bSadam radford #define TW_IOCTL_CHRDEV_FREE		      -1
126f619106bSadam radford #define TW_COMMAND_OFFSET		      128 /* 128 bytes */
127f619106bSadam radford #define TW_VERSION_TABLE		      0x0402
128f619106bSadam radford #define TW_TIMEKEEP_TABLE		      0x040A
129f619106bSadam radford #define TW_INFORMATION_TABLE		      0x0403
130f619106bSadam radford #define TW_PARAM_FWVER			      3
131f619106bSadam radford #define TW_PARAM_FWVER_LENGTH		      16
132f619106bSadam radford #define TW_PARAM_BIOSVER		      4
133f619106bSadam radford #define TW_PARAM_BIOSVER_LENGTH		      16
134f619106bSadam radford #define TW_PARAM_MODEL			      8
135f619106bSadam radford #define TW_PARAM_MODEL_LENGTH		      16
136f619106bSadam radford #define TW_PARAM_PHY_SUMMARY_TABLE	      1
137f619106bSadam radford #define TW_PARAM_PHYCOUNT		      2
138f619106bSadam radford #define TW_PARAM_PHYCOUNT_LENGTH	      1
139f619106bSadam radford #define TW_IOCTL_FIRMWARE_PASS_THROUGH	      0x108  // Used by smartmontools
140f619106bSadam radford #define TW_ALLOCATION_LENGTH		      128
141f619106bSadam radford #define TW_SENSE_DATA_LENGTH		      18
142f619106bSadam radford #define TW_ERROR_LOGICAL_UNIT_NOT_SUPPORTED   0x10a
143f619106bSadam radford #define TW_ERROR_INVALID_FIELD_IN_CDB	      0x10d
144f619106bSadam radford #define TW_ERROR_UNIT_OFFLINE		      0x128
145f619106bSadam radford #define TW_MESSAGE_SOURCE_CONTROLLER_ERROR    3
146f619106bSadam radford #define TW_MESSAGE_SOURCE_CONTROLLER_EVENT    4
147f619106bSadam radford #define TW_DRIVER			      6
148f619106bSadam radford #ifndef PCI_DEVICE_ID_3WARE_9750
149f619106bSadam radford #define PCI_DEVICE_ID_3WARE_9750 0x1010
150f619106bSadam radford #endif
151f619106bSadam radford 
152f619106bSadam radford /* Bitmask macros to eliminate bitfields */
153f619106bSadam radford 
154f619106bSadam radford /* opcode: 5, reserved: 3 */
155f619106bSadam radford #define TW_OPRES_IN(x,y) ((x << 5) | (y & 0x1f))
156f619106bSadam radford #define TW_OP_OUT(x) (x & 0x1f)
157f619106bSadam radford 
158f619106bSadam radford /* opcode: 5, sgloffset: 3 */
159f619106bSadam radford #define TW_OPSGL_IN(x,y) ((x << 5) | (y & 0x1f))
160f619106bSadam radford #define TW_SGL_OUT(x) ((x >> 5) & 0x7)
161f619106bSadam radford 
162f619106bSadam radford /* severity: 3, reserved: 5 */
163f619106bSadam radford #define TW_SEV_OUT(x) (x & 0x7)
164f619106bSadam radford 
165f619106bSadam radford /* not_mfa: 1, reserved: 7, status: 8, request_id: 16 */
166f619106bSadam radford #define TW_RESID_OUT(x) ((x >> 16) & 0xffff)
167f619106bSadam radford #define TW_NOTMFA_OUT(x) (x & 0x1)
168f619106bSadam radford 
169f619106bSadam radford /* request_id: 12, lun: 4 */
1701789671dSHannes Reinecke #define TW_REQ_LUN_IN(lun, request_id)			\
1711789671dSHannes Reinecke 	(((lun << 12) & 0xf000) | (request_id & 0xfff))
172f619106bSadam radford #define TW_LUN_OUT(lun) ((lun >> 12) & 0xf)
173f619106bSadam radford 
174f619106bSadam radford /* Register access macros */
1751789671dSHannes Reinecke #define TWL_STATUS_REG_ADDR(x)					\
1761789671dSHannes Reinecke 	((unsigned char __iomem *)x->base_addr + TWL_STATUS)
1771789671dSHannes Reinecke #define TWL_HOBQPL_REG_ADDR(x)					\
1781789671dSHannes Reinecke 	((unsigned char __iomem *)x->base_addr + TWL_HOBQPL)
1791789671dSHannes Reinecke #define TWL_HOBQPH_REG_ADDR(x)					\
1801789671dSHannes Reinecke 	((unsigned char __iomem *)x->base_addr + TWL_HOBQPH)
1811789671dSHannes Reinecke #define TWL_HOBDB_REG_ADDR(x)					\
1821789671dSHannes Reinecke 	((unsigned char __iomem *)x->base_addr + TWL_HOBDB)
1831789671dSHannes Reinecke #define TWL_HOBDBC_REG_ADDR(x)					\
1841789671dSHannes Reinecke 	((unsigned char __iomem *)x->base_addr + TWL_HOBDBC)
1851789671dSHannes Reinecke #define TWL_HIMASK_REG_ADDR(x)					\
1861789671dSHannes Reinecke 	((unsigned char __iomem *)x->base_addr + TWL_HIMASK)
1871789671dSHannes Reinecke #define TWL_HISTAT_REG_ADDR(x)					\
1881789671dSHannes Reinecke 	((unsigned char __iomem *)x->base_addr + TWL_HISTAT)
1891789671dSHannes Reinecke #define TWL_HIBQPH_REG_ADDR(x)					\
1901789671dSHannes Reinecke 	((unsigned char __iomem *)x->base_addr + TWL_HIBQPH)
1911789671dSHannes Reinecke #define TWL_HIBQPL_REG_ADDR(x)					\
1921789671dSHannes Reinecke 	((unsigned char __iomem *)x->base_addr + TWL_HIBQPL)
1931789671dSHannes Reinecke #define TWL_HIBDB_REG_ADDR(x)					\
1941789671dSHannes Reinecke 	((unsigned char __iomem *)x->base_addr + TWL_HIBDB)
1951789671dSHannes Reinecke #define TWL_SCRPD3_REG_ADDR(x)					\
1961789671dSHannes Reinecke 	((unsigned char __iomem *)x->base_addr + TWL_SCRPD3)
1971789671dSHannes Reinecke #define TWL_MASK_INTERRUPTS(x)					\
1981789671dSHannes Reinecke 	(writel(~0, TWL_HIMASK_REG_ADDR(tw_dev)))
1991789671dSHannes Reinecke #define TWL_UNMASK_INTERRUPTS(x)				\
2001789671dSHannes Reinecke 	(writel(~TWL_HISTATUS_VALID_INTERRUPT, TWL_HIMASK_REG_ADDR(tw_dev)))
2011789671dSHannes Reinecke #define TWL_CLEAR_DB_INTERRUPT(x)				\
2021789671dSHannes Reinecke 	(writel(~0, TWL_HOBDBC_REG_ADDR(tw_dev)))
2031789671dSHannes Reinecke #define TWL_SOFT_RESET(x)					\
2041789671dSHannes Reinecke 	(writel(TWL_ISSUE_SOFT_RESET, TWL_HIBDB_REG_ADDR(tw_dev)))
205f619106bSadam radford 
206f619106bSadam radford /* Macros */
207f619106bSadam radford #define TW_PRINTK(h,a,b,c) { \
208f619106bSadam radford if (h) \
209f619106bSadam radford printk(KERN_WARNING "3w-sas: scsi%d: ERROR: (0x%02X:0x%04X): %s.\n",h->host_no,a,b,c); \
210f619106bSadam radford else \
211f619106bSadam radford printk(KERN_WARNING "3w-sas: ERROR: (0x%02X:0x%04X): %s.\n",a,b,c); \
212f619106bSadam radford }
213f619106bSadam radford #define TW_MAX_LUNS 16
214f619106bSadam radford #define TW_COMMAND_SIZE (sizeof(dma_addr_t) > 4 ? 6 : 4)
215f619106bSadam radford #define TW_LIBERATOR_MAX_SGL_LENGTH (sizeof(dma_addr_t) > 4 ? 46 : 92)
216f619106bSadam radford #define TW_LIBERATOR_MAX_SGL_LENGTH_OLD (sizeof(dma_addr_t) > 4 ? 47 : 94)
217f619106bSadam radford #define TW_PADDING_LENGTH_LIBERATOR 136
218f619106bSadam radford #define TW_PADDING_LENGTH_LIBERATOR_OLD 132
219f619106bSadam radford #define TW_CPU_TO_SGL(x) (sizeof(dma_addr_t) > 4 ? cpu_to_le64(x) : cpu_to_le32(x))
220f619106bSadam radford 
221f619106bSadam radford #pragma pack(1)
222f619106bSadam radford 
223f619106bSadam radford /* SGL entry */
224f619106bSadam radford typedef struct TAG_TW_SG_Entry_ISO {
225f619106bSadam radford 	dma_addr_t address;
226f619106bSadam radford 	dma_addr_t length;
227f619106bSadam radford } TW_SG_Entry_ISO;
228f619106bSadam radford 
229f619106bSadam radford /* Old Command Packet with ISO SGL */
230f619106bSadam radford typedef struct TW_Command {
231f619106bSadam radford 	unsigned char opcode__sgloffset;
232f619106bSadam radford 	unsigned char size;
233f619106bSadam radford 	unsigned char request_id;
234f619106bSadam radford 	unsigned char unit__hostid;
235f619106bSadam radford 	/* Second DWORD */
236f619106bSadam radford 	unsigned char status;
237f619106bSadam radford 	unsigned char flags;
238f619106bSadam radford 	union {
239f619106bSadam radford 		unsigned short block_count;
240f619106bSadam radford 		unsigned short parameter_count;
241f619106bSadam radford 	} byte6_offset;
242f619106bSadam radford 	union {
243f619106bSadam radford 		struct {
244f619106bSadam radford 			u32 lba;
245f619106bSadam radford 			TW_SG_Entry_ISO sgl[TW_LIBERATOR_MAX_SGL_LENGTH_OLD];
246f619106bSadam radford 			unsigned char padding[TW_PADDING_LENGTH_LIBERATOR_OLD];
247f619106bSadam radford 		} io;
248f619106bSadam radford 		struct {
249f619106bSadam radford 			TW_SG_Entry_ISO sgl[TW_LIBERATOR_MAX_SGL_LENGTH_OLD];
250f619106bSadam radford 			u32 padding;
251f619106bSadam radford 			unsigned char padding2[TW_PADDING_LENGTH_LIBERATOR_OLD];
252f619106bSadam radford 		} param;
253f619106bSadam radford 	} byte8_offset;
254f619106bSadam radford } TW_Command;
255f619106bSadam radford 
256f619106bSadam radford /* New Command Packet with ISO SGL */
257f619106bSadam radford typedef struct TAG_TW_Command_Apache {
258f619106bSadam radford 	unsigned char opcode__reserved;
259f619106bSadam radford 	unsigned char unit;
260f619106bSadam radford 	unsigned short request_id__lunl;
261f619106bSadam radford 	unsigned char status;
262f619106bSadam radford 	unsigned char sgl_offset;
263f619106bSadam radford 	unsigned short sgl_entries__lunh;
264f619106bSadam radford 	unsigned char cdb[16];
265f619106bSadam radford 	TW_SG_Entry_ISO sg_list[TW_LIBERATOR_MAX_SGL_LENGTH];
266f619106bSadam radford 	unsigned char padding[TW_PADDING_LENGTH_LIBERATOR];
267f619106bSadam radford } TW_Command_Apache;
268f619106bSadam radford 
269f619106bSadam radford /* New command packet header */
270f619106bSadam radford typedef struct TAG_TW_Command_Apache_Header {
271f619106bSadam radford 	unsigned char sense_data[TW_SENSE_DATA_LENGTH];
272f619106bSadam radford 	struct {
273f619106bSadam radford 		char reserved[4];
274f619106bSadam radford 		unsigned short error;
275f619106bSadam radford 		unsigned char padding;
276f619106bSadam radford 		unsigned char severity__reserved;
277f619106bSadam radford 	} status_block;
278f619106bSadam radford 	unsigned char err_specific_desc[98];
279f619106bSadam radford 	struct {
280f619106bSadam radford 		unsigned char size_header;
281f619106bSadam radford 		unsigned short request_id;
282f619106bSadam radford 		unsigned char size_sense;
283f619106bSadam radford 	} header_desc;
284f619106bSadam radford } TW_Command_Apache_Header;
285f619106bSadam radford 
286f619106bSadam radford /* This struct is a union of the 2 command packets */
287f619106bSadam radford typedef struct TAG_TW_Command_Full {
288f619106bSadam radford 	TW_Command_Apache_Header header;
289f619106bSadam radford 	union {
290f619106bSadam radford 		TW_Command oldcommand;
291f619106bSadam radford 		TW_Command_Apache newcommand;
292f619106bSadam radford 	} command;
293f619106bSadam radford } TW_Command_Full;
294f619106bSadam radford 
295f619106bSadam radford /* Initconnection structure */
296f619106bSadam radford typedef struct TAG_TW_Initconnect {
297f619106bSadam radford 	unsigned char opcode__reserved;
298f619106bSadam radford 	unsigned char size;
299f619106bSadam radford 	unsigned char request_id;
300f619106bSadam radford 	unsigned char res2;
301f619106bSadam radford 	unsigned char status;
302f619106bSadam radford 	unsigned char flags;
303f619106bSadam radford 	unsigned short message_credits;
304f619106bSadam radford 	u32 features;
305f619106bSadam radford 	unsigned short fw_srl;
306f619106bSadam radford 	unsigned short fw_arch_id;
307f619106bSadam radford 	unsigned short fw_branch;
308f619106bSadam radford 	unsigned short fw_build;
309f619106bSadam radford 	u32 result;
310f619106bSadam radford } TW_Initconnect;
311f619106bSadam radford 
312f619106bSadam radford /* Event info structure */
313f619106bSadam radford typedef struct TAG_TW_Event
314f619106bSadam radford {
315f619106bSadam radford 	unsigned int sequence_id;
316f619106bSadam radford 	unsigned int time_stamp_sec;
317f619106bSadam radford 	unsigned short aen_code;
318f619106bSadam radford 	unsigned char severity;
319f619106bSadam radford 	unsigned char retrieved;
320f619106bSadam radford 	unsigned char repeat_count;
321f619106bSadam radford 	unsigned char parameter_len;
322f619106bSadam radford 	unsigned char parameter_data[98];
323f619106bSadam radford } TW_Event;
324f619106bSadam radford 
325f619106bSadam radford typedef struct TAG_TW_Ioctl_Driver_Command {
326f619106bSadam radford 	unsigned int control_code;
327f619106bSadam radford 	unsigned int status;
328f619106bSadam radford 	unsigned int unique_id;
329f619106bSadam radford 	unsigned int sequence_id;
330f619106bSadam radford 	unsigned int os_specific;
331f619106bSadam radford 	unsigned int buffer_length;
332f619106bSadam radford } TW_Ioctl_Driver_Command;
333f619106bSadam radford 
334f619106bSadam radford typedef struct TAG_TW_Ioctl_Apache {
335f619106bSadam radford 	TW_Ioctl_Driver_Command driver_command;
336f619106bSadam radford 	char padding[488];
337f619106bSadam radford 	TW_Command_Full firmware_command;
338*45b379f2SKees Cook 	char data_buffer[];
339f619106bSadam radford } TW_Ioctl_Buf_Apache;
340f619106bSadam radford 
341f619106bSadam radford /* GetParam descriptor */
342f619106bSadam radford typedef struct {
343f619106bSadam radford 	unsigned short	table_id;
344f619106bSadam radford 	unsigned short	parameter_id;
345f619106bSadam radford 	unsigned short	parameter_size_bytes;
346f619106bSadam radford 	unsigned short  actual_parameter_size_bytes;
347*45b379f2SKees Cook 	unsigned char	data[];
348f619106bSadam radford } TW_Param_Apache;
349f619106bSadam radford 
350f619106bSadam radford /* Compatibility information structure */
351f619106bSadam radford typedef struct TAG_TW_Compatibility_Info
352f619106bSadam radford {
353f619106bSadam radford 	char driver_version[32];
354f619106bSadam radford 	unsigned short working_srl;
355f619106bSadam radford 	unsigned short working_branch;
356f619106bSadam radford 	unsigned short working_build;
357f619106bSadam radford 	unsigned short driver_srl_high;
358f619106bSadam radford 	unsigned short driver_branch_high;
359f619106bSadam radford 	unsigned short driver_build_high;
360f619106bSadam radford 	unsigned short driver_srl_low;
361f619106bSadam radford 	unsigned short driver_branch_low;
362f619106bSadam radford 	unsigned short driver_build_low;
363f619106bSadam radford 	unsigned short fw_on_ctlr_srl;
364f619106bSadam radford 	unsigned short fw_on_ctlr_branch;
365f619106bSadam radford 	unsigned short fw_on_ctlr_build;
366f619106bSadam radford } TW_Compatibility_Info;
367f619106bSadam radford 
368f619106bSadam radford #pragma pack()
369f619106bSadam radford 
370f619106bSadam radford typedef struct TAG_TW_Device_Extension {
371f619106bSadam radford 	void			__iomem *base_addr;
372f619106bSadam radford 	unsigned long		*generic_buffer_virt[TW_Q_LENGTH];
373f619106bSadam radford 	dma_addr_t		generic_buffer_phys[TW_Q_LENGTH];
374f619106bSadam radford 	TW_Command_Full		*command_packet_virt[TW_Q_LENGTH];
375f619106bSadam radford 	dma_addr_t		command_packet_phys[TW_Q_LENGTH];
376f619106bSadam radford 	TW_Command_Apache_Header *sense_buffer_virt[TW_Q_LENGTH];
377f619106bSadam radford 	dma_addr_t		sense_buffer_phys[TW_Q_LENGTH];
378f619106bSadam radford 	struct pci_dev		*tw_pci_dev;
379f619106bSadam radford 	struct scsi_cmnd	*srb[TW_Q_LENGTH];
380f619106bSadam radford 	unsigned char		free_queue[TW_Q_LENGTH];
381f619106bSadam radford 	unsigned char		free_head;
382f619106bSadam radford 	unsigned char		free_tail;
383f619106bSadam radford 	int			state[TW_Q_LENGTH];
384f619106bSadam radford 	unsigned int		posted_request_count;
385f619106bSadam radford 	unsigned int		max_posted_request_count;
386f619106bSadam radford 	unsigned int		max_sgl_entries;
387f619106bSadam radford 	unsigned int		sgl_entries;
388f619106bSadam radford 	unsigned int		num_resets;
389f619106bSadam radford 	unsigned int		sector_count;
390f619106bSadam radford 	unsigned int		max_sector_count;
391f619106bSadam radford 	unsigned int		aen_count;
392f619106bSadam radford 	struct Scsi_Host	*host;
393f619106bSadam radford 	long			flags;
394f619106bSadam radford 	TW_Event		*event_queue[TW_Q_LENGTH];
395f619106bSadam radford 	unsigned char		error_index;
396f619106bSadam radford 	unsigned int		error_sequence_id;
397f619106bSadam radford 	int			chrdev_request_id;
398f619106bSadam radford 	wait_queue_head_t	ioctl_wqueue;
399f619106bSadam radford 	struct mutex		ioctl_lock;
400f619106bSadam radford 	TW_Compatibility_Info	tw_compat_info;
401f619106bSadam radford 	char			online;
402f619106bSadam radford } TW_Device_Extension;
403f619106bSadam radford 
404f619106bSadam radford #endif /* _3W_SAS_H */
405f619106bSadam radford 
406