Linux-2.6.12-rc2
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / scsi / gdth_ioctl.h
1 #ifndef _GDTH_IOCTL_H
2 #define _GDTH_IOCTL_H
3
4 /* gdth_ioctl.h
5 * $Id: gdth_ioctl.h,v 1.14 2004/02/19 15:43:15 achim Exp $
6 */
7
8 /* IOCTLs */
9 #define GDTIOCTL_MASK ('J'<<8)
10 #define GDTIOCTL_GENERAL (GDTIOCTL_MASK | 0) /* general IOCTL */
11 #define GDTIOCTL_DRVERS (GDTIOCTL_MASK | 1) /* get driver version */
12 #define GDTIOCTL_CTRTYPE (GDTIOCTL_MASK | 2) /* get controller type */
13 #define GDTIOCTL_OSVERS (GDTIOCTL_MASK | 3) /* get OS version */
14 #define GDTIOCTL_HDRLIST (GDTIOCTL_MASK | 4) /* get host drive list */
15 #define GDTIOCTL_CTRCNT (GDTIOCTL_MASK | 5) /* get controller count */
16 #define GDTIOCTL_LOCKDRV (GDTIOCTL_MASK | 6) /* lock host drive */
17 #define GDTIOCTL_LOCKCHN (GDTIOCTL_MASK | 7) /* lock channel */
18 #define GDTIOCTL_EVENT (GDTIOCTL_MASK | 8) /* read controller events */
19 #define GDTIOCTL_SCSI (GDTIOCTL_MASK | 9) /* SCSI command */
20 #define GDTIOCTL_RESET_BUS (GDTIOCTL_MASK |10) /* reset SCSI bus */
21 #define GDTIOCTL_RESCAN (GDTIOCTL_MASK |11) /* rescan host drives */
22 #define GDTIOCTL_RESET_DRV (GDTIOCTL_MASK |12) /* reset (remote) drv. res. */
23
24 #define GDTIOCTL_MAGIC 0xaffe0004
25 #define EVENT_SIZE 294
26 #define GDTH_MAXSG 32 /* max. s/g elements */
27
28 #define MAX_LDRIVES 255 /* max. log. drive count */
29 #ifdef GDTH_IOCTL_PROC
30 #define MAX_HDRIVES 100 /* max. host drive count */
31 #else
32 #define MAX_HDRIVES MAX_LDRIVES /* max. host drive count */
33 #endif
34
35 /* typedefs */
36 #ifdef __KERNEL__
37 typedef u32 ulong32;
38 typedef u64 ulong64;
39 #endif
40
41 #define PACKED __attribute__((packed))
42
43 /* scatter/gather element */
44 typedef struct {
45 ulong32 sg_ptr; /* address */
46 ulong32 sg_len; /* length */
47 } PACKED gdth_sg_str;
48
49 /* scatter/gather element - 64bit addresses */
50 typedef struct {
51 ulong64 sg_ptr; /* address */
52 ulong32 sg_len; /* length */
53 } PACKED gdth_sg64_str;
54
55 /* command structure */
56 typedef struct {
57 ulong32 BoardNode; /* board node (always 0) */
58 ulong32 CommandIndex; /* command number */
59 ushort OpCode; /* the command (READ,..) */
60 union {
61 struct {
62 ushort DeviceNo; /* number of cache drive */
63 ulong32 BlockNo; /* block number */
64 ulong32 BlockCnt; /* block count */
65 ulong32 DestAddr; /* dest. addr. (if s/g: -1) */
66 ulong32 sg_canz; /* s/g element count */
67 gdth_sg_str sg_lst[GDTH_MAXSG]; /* s/g list */
68 } PACKED cache; /* cache service cmd. str. */
69 struct {
70 ushort DeviceNo; /* number of cache drive */
71 ulong64 BlockNo; /* block number */
72 ulong32 BlockCnt; /* block count */
73 ulong64 DestAddr; /* dest. addr. (if s/g: -1) */
74 ulong32 sg_canz; /* s/g element count */
75 gdth_sg64_str sg_lst[GDTH_MAXSG]; /* s/g list */
76 } PACKED cache64; /* cache service cmd. str. */
77 struct {
78 ushort param_size; /* size of p_param buffer */
79 ulong32 subfunc; /* IOCTL function */
80 ulong32 channel; /* device */
81 ulong64 p_param; /* buffer */
82 } PACKED ioctl; /* IOCTL command structure */
83 struct {
84 ushort reserved;
85 union {
86 struct {
87 ulong32 msg_handle; /* message handle */
88 ulong64 msg_addr; /* message buffer address */
89 } PACKED msg;
90 unchar data[12]; /* buffer for rtc data, ... */
91 } su;
92 } PACKED screen; /* screen service cmd. str. */
93 struct {
94 ushort reserved;
95 ulong32 direction; /* data direction */
96 ulong32 mdisc_time; /* disc. time (0: no timeout)*/
97 ulong32 mcon_time; /* connect time(0: no to.) */
98 ulong32 sdata; /* dest. addr. (if s/g: -1) */
99 ulong32 sdlen; /* data length (bytes) */
100 ulong32 clen; /* SCSI cmd. length(6,10,12) */
101 unchar cmd[12]; /* SCSI command */
102 unchar target; /* target ID */
103 unchar lun; /* LUN */
104 unchar bus; /* SCSI bus number */
105 unchar priority; /* only 0 used */
106 ulong32 sense_len; /* sense data length */
107 ulong32 sense_data; /* sense data addr. */
108 ulong32 link_p; /* linked cmds (not supp.) */
109 ulong32 sg_ranz; /* s/g element count */
110 gdth_sg_str sg_lst[GDTH_MAXSG]; /* s/g list */
111 } PACKED raw; /* raw service cmd. struct. */
112 struct {
113 ushort reserved;
114 ulong32 direction; /* data direction */
115 ulong32 mdisc_time; /* disc. time (0: no timeout)*/
116 ulong32 mcon_time; /* connect time(0: no to.) */
117 ulong64 sdata; /* dest. addr. (if s/g: -1) */
118 ulong32 sdlen; /* data length (bytes) */
119 ulong32 clen; /* SCSI cmd. length(6,..,16) */
120 unchar cmd[16]; /* SCSI command */
121 unchar target; /* target ID */
122 unchar lun; /* LUN */
123 unchar bus; /* SCSI bus number */
124 unchar priority; /* only 0 used */
125 ulong32 sense_len; /* sense data length */
126 ulong64 sense_data; /* sense data addr. */
127 ulong32 sg_ranz; /* s/g element count */
128 gdth_sg64_str sg_lst[GDTH_MAXSG]; /* s/g list */
129 } PACKED raw64; /* raw service cmd. struct. */
130 } u;
131 /* additional variables */
132 unchar Service; /* controller service */
133 unchar reserved;
134 ushort Status; /* command result */
135 ulong32 Info; /* additional information */
136 void *RequestBuffer; /* request buffer */
137 } PACKED gdth_cmd_str;
138
139 /* controller event structure */
140 #define ES_ASYNC 1
141 #define ES_DRIVER 2
142 #define ES_TEST 3
143 #define ES_SYNC 4
144 typedef struct {
145 ushort size; /* size of structure */
146 union {
147 char stream[16];
148 struct {
149 ushort ionode;
150 ushort service;
151 ulong32 index;
152 } PACKED driver;
153 struct {
154 ushort ionode;
155 ushort service;
156 ushort status;
157 ulong32 info;
158 unchar scsi_coord[3];
159 } PACKED async;
160 struct {
161 ushort ionode;
162 ushort service;
163 ushort status;
164 ulong32 info;
165 ushort hostdrive;
166 unchar scsi_coord[3];
167 unchar sense_key;
168 } PACKED sync;
169 struct {
170 ulong32 l1, l2, l3, l4;
171 } PACKED test;
172 } eu;
173 ulong32 severity;
174 unchar event_string[256];
175 } PACKED gdth_evt_data;
176
177 typedef struct {
178 ulong32 first_stamp;
179 ulong32 last_stamp;
180 ushort same_count;
181 ushort event_source;
182 ushort event_idx;
183 unchar application;
184 unchar reserved;
185 gdth_evt_data event_data;
186 } PACKED gdth_evt_str;
187
188
189 #ifdef GDTH_IOCTL_PROC
190 /* IOCTL structure (write) */
191 typedef struct {
192 ulong32 magic; /* IOCTL magic */
193 ushort ioctl; /* IOCTL */
194 ushort ionode; /* controller number */
195 ushort service; /* controller service */
196 ushort timeout; /* timeout */
197 union {
198 struct {
199 unchar command[512]; /* controller command */
200 unchar data[1]; /* add. data */
201 } general;
202 struct {
203 unchar lock; /* lock/unlock */
204 unchar drive_cnt; /* drive count */
205 ushort drives[MAX_HDRIVES];/* drives */
206 } lockdrv;
207 struct {
208 unchar lock; /* lock/unlock */
209 unchar channel; /* channel */
210 } lockchn;
211 struct {
212 int erase; /* erase event ? */
213 int handle;
214 unchar evt[EVENT_SIZE]; /* event structure */
215 } event;
216 struct {
217 unchar bus; /* SCSI bus */
218 unchar target; /* target ID */
219 unchar lun; /* LUN */
220 unchar cmd_len; /* command length */
221 unchar cmd[12]; /* SCSI command */
222 } scsi;
223 struct {
224 ushort hdr_no; /* host drive number */
225 unchar flag; /* old meth./add/remove */
226 } rescan;
227 } iu;
228 } gdth_iowr_str;
229
230 /* IOCTL structure (read) */
231 typedef struct {
232 ulong32 size; /* buffer size */
233 ulong32 status; /* IOCTL error code */
234 union {
235 struct {
236 unchar data[1]; /* data */
237 } general;
238 struct {
239 ushort version; /* driver version */
240 } drvers;
241 struct {
242 unchar type; /* controller type */
243 ushort info; /* slot etc. */
244 ushort oem_id; /* OEM ID */
245 ushort bios_ver; /* not used */
246 ushort access; /* not used */
247 ushort ext_type; /* extended type */
248 ushort device_id; /* device ID */
249 ushort sub_device_id; /* sub device ID */
250 } ctrtype;
251 struct {
252 unchar version; /* OS version */
253 unchar subversion; /* OS subversion */
254 ushort revision; /* revision */
255 } osvers;
256 struct {
257 ushort count; /* controller count */
258 } ctrcnt;
259 struct {
260 int handle;
261 unchar evt[EVENT_SIZE]; /* event structure */
262 } event;
263 struct {
264 unchar bus; /* SCSI bus, 0xff: invalid */
265 unchar target; /* target ID */
266 unchar lun; /* LUN */
267 unchar cluster_type; /* cluster properties */
268 } hdr_list[MAX_HDRIVES]; /* index is host drive number */
269 } iu;
270 } gdth_iord_str;
271 #endif
272
273 /* GDTIOCTL_GENERAL */
274 typedef struct {
275 ushort ionode; /* controller number */
276 ushort timeout; /* timeout */
277 ulong32 info; /* error info */
278 ushort status; /* status */
279 ulong data_len; /* data buffer size */
280 ulong sense_len; /* sense buffer size */
281 gdth_cmd_str command; /* command */
282 } gdth_ioctl_general;
283
284 /* GDTIOCTL_LOCKDRV */
285 typedef struct {
286 ushort ionode; /* controller number */
287 unchar lock; /* lock/unlock */
288 unchar drive_cnt; /* drive count */
289 ushort drives[MAX_HDRIVES]; /* drives */
290 } gdth_ioctl_lockdrv;
291
292 /* GDTIOCTL_LOCKCHN */
293 typedef struct {
294 ushort ionode; /* controller number */
295 unchar lock; /* lock/unlock */
296 unchar channel; /* channel */
297 } gdth_ioctl_lockchn;
298
299 /* GDTIOCTL_OSVERS */
300 typedef struct {
301 unchar version; /* OS version */
302 unchar subversion; /* OS subversion */
303 ushort revision; /* revision */
304 } gdth_ioctl_osvers;
305
306 /* GDTIOCTL_CTRTYPE */
307 typedef struct {
308 ushort ionode; /* controller number */
309 unchar type; /* controller type */
310 ushort info; /* slot etc. */
311 ushort oem_id; /* OEM ID */
312 ushort bios_ver; /* not used */
313 ushort access; /* not used */
314 ushort ext_type; /* extended type */
315 ushort device_id; /* device ID */
316 ushort sub_device_id; /* sub device ID */
317 } gdth_ioctl_ctrtype;
318
319 /* GDTIOCTL_EVENT */
320 typedef struct {
321 ushort ionode;
322 int erase; /* erase event? */
323 int handle; /* event handle */
324 gdth_evt_str event;
325 } gdth_ioctl_event;
326
327 /* GDTIOCTL_RESCAN/GDTIOCTL_HDRLIST */
328 typedef struct {
329 ushort ionode; /* controller number */
330 unchar flag; /* add/remove */
331 ushort hdr_no; /* drive no. */
332 struct {
333 unchar bus; /* SCSI bus */
334 unchar target; /* target ID */
335 unchar lun; /* LUN */
336 unchar cluster_type; /* cluster properties */
337 } hdr_list[MAX_HDRIVES]; /* index is host drive number */
338 } gdth_ioctl_rescan;
339
340 /* GDTIOCTL_RESET_BUS/GDTIOCTL_RESET_DRV */
341 typedef struct {
342 ushort ionode; /* controller number */
343 ushort number; /* bus/host drive number */
344 ushort status; /* status */
345 } gdth_ioctl_reset;
346
347 #endif