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