hptiop.h revision 00f5970193e22c48f399a2430635d6416b51befe
1ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team/*
200f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team * HighPoint RR3xxx/4xxx controller driver for Linux
3db9b6e89ea8dc3f32dea1125c672de1a9710be7cHighPoint Linux Team * Copyright (C) 2006-2007 HighPoint Technologies, Inc. All Rights Reserved.
4ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team *
5ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team * This program is free software; you can redistribute it and/or modify
6ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team * it under the terms of the GNU General Public License as published by
7ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team * the Free Software Foundation; version 2 of the License.
8ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team *
9ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team * This program is distributed in the hope that it will be useful,
10ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team * but WITHOUT ANY WARRANTY; without even the implied warranty of
11ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team * GNU General Public License for more details.
13ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team *
14ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team * Please report bugs/comments/suggestions to linux@highpoint-tech.com
15ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team *
16ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team * For more information, visit http://www.highpoint-tech.com
17ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team */
18ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#ifndef _HPTIOP_H_
19ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define _HPTIOP_H_
20ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
2100f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Teamstruct hpt_iopmu_itl {
22ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 resrved0[4];
23ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 inbound_msgaddr0;
24ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 inbound_msgaddr1;
25ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 outbound_msgaddr0;
26ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 outbound_msgaddr1;
27ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 inbound_doorbell;
28ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 inbound_intstatus;
29ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 inbound_intmask;
30ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 outbound_doorbell;
31ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 outbound_intstatus;
32ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 outbound_intmask;
33ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 reserved1[2];
34ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 inbound_queue;
35ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 outbound_queue;
36ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team};
37ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
38ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOPMU_QUEUE_EMPTY            0xffffffff
39ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOPMU_QUEUE_MASK_HOST_BITS   0xf0000000
40ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOPMU_QUEUE_ADDR_HOST_BIT    0x80000000
41db9b6e89ea8dc3f32dea1125c672de1a9710be7cHighPoint Linux Team#define IOPMU_QUEUE_REQUEST_SIZE_BIT    0x40000000
42db9b6e89ea8dc3f32dea1125c672de1a9710be7cHighPoint Linux Team#define IOPMU_QUEUE_REQUEST_RESULT_BIT   0x40000000
43ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
44ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOPMU_OUTBOUND_INT_MSG0      1
45ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOPMU_OUTBOUND_INT_MSG1      2
46ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOPMU_OUTBOUND_INT_DOORBELL  4
47ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOPMU_OUTBOUND_INT_POSTQUEUE 8
48ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOPMU_OUTBOUND_INT_PCI       0x10
49ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
50ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOPMU_INBOUND_INT_MSG0       1
51ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOPMU_INBOUND_INT_MSG1       2
52ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOPMU_INBOUND_INT_DOORBELL   4
53ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOPMU_INBOUND_INT_ERROR      8
54ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOPMU_INBOUND_INT_POSTQUEUE  0x10
55ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
5600f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team#define MVIOP_QUEUE_LEN  512
5700f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team
5800f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Teamstruct hpt_iopmu_mv {
5900f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	__le32 inbound_head;
6000f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	__le32 inbound_tail;
6100f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	__le32 outbound_head;
6200f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	__le32 outbound_tail;
6300f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	__le32 inbound_msg;
6400f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	__le32 outbound_msg;
6500f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	__le32 reserve[10];
6600f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	__le64 inbound_q[MVIOP_QUEUE_LEN];
6700f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	__le64 outbound_q[MVIOP_QUEUE_LEN];
6800f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team};
6900f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team
7000f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Teamstruct hpt_iopmv_regs {
7100f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	__le32 reserved[0x20400 / 4];
7200f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	__le32 inbound_doorbell;
7300f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	__le32 inbound_intmask;
7400f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	__le32 outbound_doorbell;
7500f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	__le32 outbound_intmask;
7600f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team};
7700f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team
7800f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team#define MVIOP_MU_QUEUE_ADDR_HOST_MASK   (~(0x1full))
7900f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team#define MVIOP_MU_QUEUE_ADDR_HOST_BIT    4
8000f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team
8100f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team#define MVIOP_MU_QUEUE_ADDR_IOP_HIGH32  0xffffffff
8200f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team#define MVIOP_MU_QUEUE_REQUEST_RESULT_BIT   1
8300f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team#define MVIOP_MU_QUEUE_REQUEST_RETURN_CONTEXT 2
8400f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team
8500f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team#define MVIOP_MU_INBOUND_INT_MSG        1
8600f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team#define MVIOP_MU_INBOUND_INT_POSTQUEUE  2
8700f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team#define MVIOP_MU_OUTBOUND_INT_MSG       1
8800f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team#define MVIOP_MU_OUTBOUND_INT_POSTQUEUE 2
8900f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team
90ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Teamenum hpt_iopmu_message {
91ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	/* host-to-iop messages */
92ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOPMU_INBOUND_MSG0_NOP = 0,
93ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOPMU_INBOUND_MSG0_RESET,
94ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOPMU_INBOUND_MSG0_FLUSH,
95ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOPMU_INBOUND_MSG0_SHUTDOWN,
96ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOPMU_INBOUND_MSG0_STOP_BACKGROUND_TASK,
97ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOPMU_INBOUND_MSG0_START_BACKGROUND_TASK,
98ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOPMU_INBOUND_MSG0_MAX = 0xff,
99ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	/* iop-to-host messages */
100ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOPMU_OUTBOUND_MSG0_REGISTER_DEVICE_0 = 0x100,
101ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOPMU_OUTBOUND_MSG0_REGISTER_DEVICE_MAX = 0x1ff,
102ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOPMU_OUTBOUND_MSG0_UNREGISTER_DEVICE_0 = 0x200,
103ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOPMU_OUTBOUND_MSG0_UNREGISTER_DEVICE_MAX = 0x2ff,
104ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOPMU_OUTBOUND_MSG0_REVALIDATE_DEVICE_0 = 0x300,
105ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOPMU_OUTBOUND_MSG0_REVALIDATE_DEVICE_MAX = 0x3ff,
106ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team};
107ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
10800f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Teamstruct hpt_iop_request_header {
109ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 size;
110ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 type;
111ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 flags;
112ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 result;
113ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 context; /* host context */
114ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 context_hi32;
115ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team};
116ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
117ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOP_REQUEST_FLAG_SYNC_REQUEST 1
118ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOP_REQUEST_FLAG_BIST_REQUEST 2
119ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOP_REQUEST_FLAG_REMAPPED     4
120ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOP_REQUEST_FLAG_OUTPUT_CONTEXT 8
121ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
122ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Teamenum hpt_iop_request_type {
123ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOP_REQUEST_TYPE_GET_CONFIG = 0,
124ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOP_REQUEST_TYPE_SET_CONFIG,
125ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOP_REQUEST_TYPE_BLOCK_COMMAND,
126ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOP_REQUEST_TYPE_SCSI_COMMAND,
127ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOP_REQUEST_TYPE_IOCTL_COMMAND,
128ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOP_REQUEST_TYPE_MAX
129ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team};
130ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
131ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Teamenum hpt_iop_result_type {
132ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOP_RESULT_PENDING = 0,
133ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOP_RESULT_SUCCESS,
134ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOP_RESULT_FAIL,
135ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOP_RESULT_BUSY,
136ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOP_RESULT_RESET,
137ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOP_RESULT_INVALID_REQUEST,
138ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	IOP_RESULT_BAD_TARGET,
13900f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	IOP_RESULT_CHECK_CONDITION,
140ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team};
141ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
14200f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Teamstruct hpt_iop_request_get_config {
143ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	struct hpt_iop_request_header header;
144ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 interface_version;
145ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 firmware_version;
146ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 max_requests;
147ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 request_size;
148ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 max_sg_count;
149ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 data_transfer_length;
150ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 alignment_mask;
151ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 max_devices;
152ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 sdram_size;
153ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team};
154ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
15500f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Teamstruct hpt_iop_request_set_config {
156ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	struct hpt_iop_request_header header;
157ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 iop_id;
158db9b6e89ea8dc3f32dea1125c672de1a9710be7cHighPoint Linux Team	__le16 vbus_id;
159db9b6e89ea8dc3f32dea1125c672de1a9710be7cHighPoint Linux Team	__le16 max_host_request_size;
160ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 reserve[6];
161ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team};
162ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
16300f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Teamstruct hpt_iopsg {
164ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 size;
165ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 eot; /* non-zero: end of table */
166ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le64 pci_address;
167ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team};
168ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
16900f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Teamstruct hpt_iop_request_block_command {
170ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	struct hpt_iop_request_header header;
171ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u8     channel;
172ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u8     target;
173ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u8     lun;
174ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u8     pad1;
175ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le16 command; /* IOP_BLOCK_COMMAND_{READ,WRITE} */
176ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le16 sectors;
177ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le64 lba;
178ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	struct hpt_iopsg sg_list[1];
179ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team};
180ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
181ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOP_BLOCK_COMMAND_READ     1
182ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOP_BLOCK_COMMAND_WRITE    2
183ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOP_BLOCK_COMMAND_VERIFY   3
184ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOP_BLOCK_COMMAND_FLUSH    4
185ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define IOP_BLOCK_COMMAND_SHUTDOWN 5
186ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
18700f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Teamstruct hpt_iop_request_scsi_command {
188ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	struct hpt_iop_request_header header;
189ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u8     channel;
190ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u8     target;
191ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u8     lun;
192ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u8     pad1;
193ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u8     cdb[16];
194ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 dataxfer_length;
195ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	struct hpt_iopsg sg_list[1];
196ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team};
197ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
19800f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Teamstruct hpt_iop_request_ioctl_command {
199ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	struct hpt_iop_request_header header;
200ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 ioctl_code;
201ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 inbuf_size;
202ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 outbuf_size;
203ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	__le32 bytes_returned;
204ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u8     buf[1];
205ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	/* out data should be put at buf[(inbuf_size+3)&~3] */
206ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team};
207ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
208ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define HPTIOP_MAX_REQUESTS  256u
209ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
210ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Teamstruct hptiop_request {
21100f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	struct hptiop_request *next;
21200f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	void                  *req_virt;
21300f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	u32                   req_shifted_phy;
21400f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	struct scsi_cmnd      *scp;
21500f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	int                   index;
216ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team};
217ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
218ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Teamstruct hpt_scsi_pointer {
219ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	int mapped;
220ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	int sgcnt;
221ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	dma_addr_t dma_handle;
222ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team};
223ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
224ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define HPT_SCP(scp) ((struct hpt_scsi_pointer *)&(scp)->SCp)
225ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
226ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Teamstruct hptiop_hba {
22700f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	struct hptiop_adapter_ops *ops;
22800f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	union {
22900f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team		struct {
23000f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team			struct hpt_iopmu_itl __iomem *iop;
23100f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team		} itl;
23200f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team		struct {
23300f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team			struct hpt_iopmv_regs *regs;
23400f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team			struct hpt_iopmu_mv __iomem *mu;
23500f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team			void *internal_req;
23600f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team			dma_addr_t internal_req_phy;
23700f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team		} mv;
23800f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	} u;
23900f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team
24000f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	struct Scsi_Host *host;
24100f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	struct pci_dev *pcidev;
242ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
243ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	/* IOP config info */
244db9b6e89ea8dc3f32dea1125c672de1a9710be7cHighPoint Linux Team	u32     interface_version;
245ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u32     firmware_version;
246ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u32     sdram_size;
247ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u32     max_devices;
248ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u32     max_requests;
249ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u32     max_request_size;
250ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u32     max_sg_descriptors;
251ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
252ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u32     req_size; /* host-allocated request buffer size */
253db9b6e89ea8dc3f32dea1125c672de1a9710be7cHighPoint Linux Team
25400f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	u32     iopintf_v2: 1;
25500f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	u32     initialized: 1;
25600f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	u32     msg_done: 1;
257ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
258ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	struct hptiop_request * req_list;
259ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	struct hptiop_request reqs[HPTIOP_MAX_REQUESTS];
260ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
261ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	/* used to free allocated dma area */
26200f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	void        *dma_coherent;
263ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	dma_addr_t  dma_coherent_handle;
264ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
265ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	atomic_t    reset_count;
266ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	atomic_t    resetting;
267ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
268ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	wait_queue_head_t reset_wq;
269ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	wait_queue_head_t ioctl_wq;
270ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team};
271ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
27200f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Teamstruct hpt_ioctl_k {
273ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	struct hptiop_hba * hba;
274ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u32    ioctl_code;
275ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u32    inbuf_size;
276ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	u32    outbuf_size;
27700f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	void   *inbuf;
27800f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	void   *outbuf;
27900f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	u32    *bytes_returned;
280ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	void (*done)(struct hpt_ioctl_k *);
281ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team	int    result; /* HPT_IOCTL_RESULT_ */
282ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team};
283ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
28400f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Teamstruct hptiop_adapter_ops {
28500f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	int  (*iop_wait_ready)(struct hptiop_hba *hba, u32 millisec);
28600f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	int  (*internal_memalloc)(struct hptiop_hba *hba);
28700f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	int  (*internal_memfree)(struct hptiop_hba *hba);
28800f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	int  (*map_pci_bar)(struct hptiop_hba *hba);
28900f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	void (*unmap_pci_bar)(struct hptiop_hba *hba);
29000f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	void (*enable_intr)(struct hptiop_hba *hba);
29100f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	void (*disable_intr)(struct hptiop_hba *hba);
29200f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	int  (*get_config)(struct hptiop_hba *hba,
29300f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team				struct hpt_iop_request_get_config *config);
29400f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	int  (*set_config)(struct hptiop_hba *hba,
29500f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team				struct hpt_iop_request_set_config *config);
29600f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	int  (*iop_intr)(struct hptiop_hba *hba);
29700f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	void (*post_msg)(struct hptiop_hba *hba, u32 msg);
29800f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team	void (*post_req)(struct hptiop_hba *hba, struct hptiop_request *_req);
29900f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team};
30000f5970193e22c48f399a2430635d6416b51befeHighPoint Linux Team
301ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define HPT_IOCTL_RESULT_OK         0
302ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define HPT_IOCTL_RESULT_FAILED     (-1)
303ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
304ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#if 0
305ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define dprintk(fmt, args...) do { printk(fmt, ##args); } while(0)
306ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#else
307ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#define dprintk(fmt, args...)
308ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#endif
309ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team
310ede1e6f8b43246a9796583346839669b1f4b77d4HighPoint Linux Team#endif
311