1#ifndef _GDTH_IOCTL_H
2#define _GDTH_IOCTL_H
3
4/* gdth_ioctl.h
5 * $Id: gdth_ioctl.h,v 1.1.1.1 2007/08/03 18:52:56 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__
37typedef u32     ulong32;
38typedef u64     ulong64;
39#endif
40
41#define PACKED  __attribute__((packed))
42
43/* scatter/gather element */
44typedef struct {
45    ulong32     sg_ptr;                         /* address */
46    ulong32     sg_len;                         /* length */
47} PACKED gdth_sg_str;
48
49/* scatter/gather element - 64bit addresses */
50typedef struct {
51    ulong64     sg_ptr;                         /* address */
52    ulong32     sg_len;                         /* length */
53} PACKED gdth_sg64_str;
54
55/* command structure */
56typedef 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
144typedef 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
177typedef 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) */
191typedef 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) */
231typedef 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 */
274typedef 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 */
285typedef 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 */
293typedef struct {
294    ushort ionode;                              /* controller number */
295    unchar lock;                                /* lock/unlock */
296    unchar channel;                             /* channel */
297} gdth_ioctl_lockchn;
298
299/* GDTIOCTL_OSVERS */
300typedef struct {
301    unchar version;                             /* OS version */
302    unchar subversion;                          /* OS subversion */
303    ushort revision;                            /* revision */
304} gdth_ioctl_osvers;
305
306/* GDTIOCTL_CTRTYPE */
307typedef 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 */
320typedef 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 */
328typedef 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 */
341typedef struct {
342    ushort ionode;                              /* controller number */
343    ushort number;                              /* bus/host drive number */
344    ushort status;                              /* status */
345} gdth_ioctl_reset;
346
347#endif
348