|
|
1.1 root 1: #ifndef _GDTH_H
2: #define _GDTH_H
3:
4: /*
5: * Header file for the GDT ISA/EISA/PCI Disk Array Controller driver for Linux
6: *
7: * gdth.h Copyright (C) 1995-98 ICP vortex Computersysteme GmbH, Achim Leubner
8: * See gdth.c for further informations and
9: * below for supported controller types
10: *
11: * <[email protected]>
12: *
13: * $Id: gdth.h,v 1.1 1999/04/26 05:54:37 tb Exp $
14: */
15:
16: #include <linux/version.h>
17: #include <linux/types.h>
18:
19: #ifndef NULL
20: #define NULL 0
21: #endif
22: #ifndef TRUE
23: #define TRUE 1
24: #endif
25: #ifndef FALSE
26: #define FALSE 0
27: #endif
28:
29: /* defines, macros */
30:
31: /* driver version */
32: #define GDTH_VERSION_STR "1.07"
33: #define GDTH_VERSION 1
34: #define GDTH_SUBVERSION 7
35:
36: /* protocol version */
37: #define PROTOCOL_VERSION 1
38:
39: /* controller classes */
40: #define GDT_ISA 0x01 /* ISA controller */
41: #define GDT_EISA 0x02 /* EISA controller */
42: #define GDT_PCI 0x03 /* PCI controller */
43: #define GDT_PCINEW 0x04 /* new PCI controller */
44: #define GDT_PCIMPR 0x05 /* PCI MPR controller */
45: /* GDT_EISA, controller subtypes EISA */
46: #define GDT3_ID 0x0130941c /* GDT3000/3020 */
47: #define GDT3A_ID 0x0230941c /* GDT3000A/3020A/3050A */
48: #define GDT3B_ID 0x0330941c /* GDT3000B/3010A */
49: /* GDT_ISA */
50: #define GDT2_ID 0x0120941c /* GDT2000/2020 */
51: /* vendor ID, device IDs (PCI) */
52: /* these defines should already exist in <linux/pci.h> */
53: #ifndef PCI_VENDOR_ID_VORTEX
54: #define PCI_VENDOR_ID_VORTEX 0x1119 /* PCI controller vendor ID */
55: #endif
56: #ifndef PCI_DEVICE_ID_VORTEX_GDT60x0
57: /* GDT_PCI */
58: #define PCI_DEVICE_ID_VORTEX_GDT60x0 0 /* GDT6000/6020/6050 */
59: #define PCI_DEVICE_ID_VORTEX_GDT6000B 1 /* GDT6000B/6010 */
60: /* GDT_PCINEW */
61: #define PCI_DEVICE_ID_VORTEX_GDT6x10 2 /* GDT6110/6510 */
62: #define PCI_DEVICE_ID_VORTEX_GDT6x20 3 /* GDT6120/6520 */
63: #define PCI_DEVICE_ID_VORTEX_GDT6530 4 /* GDT6530 */
64: #define PCI_DEVICE_ID_VORTEX_GDT6550 5 /* GDT6550 */
65: /* GDT_PCINEW, wide/ultra SCSI controllers */
66: #define PCI_DEVICE_ID_VORTEX_GDT6x17 6 /* GDT6117/6517 */
67: #define PCI_DEVICE_ID_VORTEX_GDT6x27 7 /* GDT6127/6527 */
68: #define PCI_DEVICE_ID_VORTEX_GDT6537 8 /* GDT6537 */
69: #define PCI_DEVICE_ID_VORTEX_GDT6557 9 /* GDT6557/6557-ECC */
70: /* GDT_PCINEW, wide SCSI controllers */
71: #define PCI_DEVICE_ID_VORTEX_GDT6x15 10 /* GDT6115/6515 */
72: #define PCI_DEVICE_ID_VORTEX_GDT6x25 11 /* GDT6125/6525 */
73: #define PCI_DEVICE_ID_VORTEX_GDT6535 12 /* GDT6535 */
74: #define PCI_DEVICE_ID_VORTEX_GDT6555 13 /* GDT6555/6555-ECC */
75: #endif
76:
77: #ifndef PCI_DEVICE_ID_VORTEX_GDT6x17RP
78: /* GDT_MPR, RP series, wide/ultra SCSI */
79: #define PCI_DEVICE_ID_VORTEX_GDT6x17RP 0x100 /* GDT6117RP/GDT6517RP */
80: #define PCI_DEVICE_ID_VORTEX_GDT6x27RP 0x101 /* GDT6127RP/GDT6527RP */
81: #define PCI_DEVICE_ID_VORTEX_GDT6537RP 0x102 /* GDT6537RP */
82: #define PCI_DEVICE_ID_VORTEX_GDT6557RP 0x103 /* GDT6557RP */
83: /* GDT_MPR, RP series, narrow/ultra SCSI */
84: #define PCI_DEVICE_ID_VORTEX_GDT6x11RP 0x104 /* GDT6111RP/GDT6511RP */
85: #define PCI_DEVICE_ID_VORTEX_GDT6x21RP 0x105 /* GDT6121RP/GDT6521RP */
86: /* GDT_MPR, RP1 series, wide/ultra SCSI */
87: #define PCI_DEVICE_ID_VORTEX_GDT6x17RP1 0x110 /* GDT6117RP1/GDT6517RP1 */
88: #define PCI_DEVICE_ID_VORTEX_GDT6x27RP1 0x111 /* GDT6127RP1/GDT6527RP1 */
89: #define PCI_DEVICE_ID_VORTEX_GDT6537RP1 0x112 /* GDT6537RP1 */
90: #define PCI_DEVICE_ID_VORTEX_GDT6557RP1 0x113 /* GDT6557RP1 */
91: /* GDT_MPR, RP1 series, narrow/ultra SCSI */
92: #define PCI_DEVICE_ID_VORTEX_GDT6x11RP1 0x114 /* GDT6111RP1/GDT6511RP1 */
93: #define PCI_DEVICE_ID_VORTEX_GDT6x21RP1 0x115 /* GDT6121RP1/GDT6521RP1 */
94: /* GDT_MPR, RP2 series, wide/ultra SCSI */
95: #define PCI_DEVICE_ID_VORTEX_GDT6x17RP2 0x120 /* GDT6117RP2/GDT6517RP2 */
96: #define PCI_DEVICE_ID_VORTEX_GDT6x27RP2 0x121 /* GDT6127RP2/GDT6527RP2 */
97: #define PCI_DEVICE_ID_VORTEX_GDT6537RP2 0x122 /* GDT6537RP2 */
98: #define PCI_DEVICE_ID_VORTEX_GDT6557RP2 0x123 /* GDT6557RP2 */
99: /* GDT_MPR, RP2 series, narrow/ultra SCSI */
100: #define PCI_DEVICE_ID_VORTEX_GDT6x11RP2 0x124 /* GDT6111RP2/GDT6511RP2 */
101: #define PCI_DEVICE_ID_VORTEX_GDT6x21RP2 0x125 /* GDT6121RP2/GDT6521RP2 */
102: #endif
103:
104: #ifndef PCI_DEVICE_ID_VORTEX_GDT6519RD
105: /* GDT_MPR, Fibre Channel */
106: #define PCI_DEVICE_ID_VORTEX_GDT6519RD 0x210 /* GDT6519RD */
107: #define PCI_DEVICE_ID_VORTEX_GDT6529RD 0x211 /* GDT6529RD */
108: #endif
109:
110: #ifndef PCI_DEVICE_ID_VORTEX_GDTMAXRP
111: /* GDT_MPR, last device ID */
112: #define PCI_DEVICE_ID_VORTEX_GDTMAXRP 0x2ff
113: #endif
114:
115: /* limits */
116: #define GDTH_SCRATCH 4096 /* 4KB scratch buffer */
117: #define GDTH_MAXCMDS 124
118: #define GDTH_MAXC_P_L 16 /* max. cmds per lun */
119: #define MAXOFFSETS 128
120: #define MAXHA 8
121: #define MAXID 16
122: #define MAXLUN 8
123: #define MAXBUS 6
124: #define MAX_HDRIVES 35 /* max. host drive count */
125: #define MAX_EVENTS 100 /* event buffer count */
126: #define MAXCYLS 1024
127: #define HEADS 64
128: #define SECS 32 /* mapping 64*32 */
129: #define MEDHEADS 127
130: #define MEDSECS 63 /* mapping 127*63 */
131: #define BIGHEADS 255
132: #define BIGSECS 63 /* mapping 255*63 */
133:
134: /* special command ptr. */
135: #define UNUSED_CMND ((Scsi_Cmnd *)-1)
136: #define INTERNAL_CMND ((Scsi_Cmnd *)-2)
137: #define SCREEN_CMND ((Scsi_Cmnd *)-3)
138: #define SPECIAL_SCP(p) (p==UNUSED_CMND || p==INTERNAL_CMND || p==SCREEN_CMND)
139:
140: /* device types */
141: #define EMPTY_DTYP 0
142: #define CACHE_DTYP 1
143: #define RAW_DTYP 2
144: #define SIOP_DTYP 3 /* the SCSI processor */
145:
146: /* controller services */
147: #define SCSIRAWSERVICE 3
148: #define CACHESERVICE 9
149: #define SCREENSERVICE 11
150:
151: /* screenservice defines */
152: #define MSG_INV_HANDLE -1 /* special message handle */
153: #define MSGLEN 16 /* size of message text */
154: #define MSG_SIZE 34 /* size of message structure */
155: #define MSG_REQUEST 0 /* async. event: message */
156:
157: /* cacheservice defines */
158: #define SECTOR_SIZE 0x200 /* always 512 bytes per sector */
159:
160: /* DPMEM constants */
161: #define DPMEM_MAGIC 0xC0FFEE11
162: #define IC_HEADER_BYTES 48
163: #define IC_QUEUE_BYTES 4
164: #define DPMEM_COMMAND_OFFSET IC_HEADER_BYTES+IC_QUEUE_BYTES*MAXOFFSETS
165:
166: /* service commands */
167: #define GDT_INIT 0 /* service initialization */
168: #define GDT_READ 1 /* read command */
169: #define GDT_WRITE 2 /* write command */
170: #define GDT_INFO 3 /* information about devices */
171: #define GDT_FLUSH 4 /* flush dirty cache buffers */
172: #define GDT_IOCTL 5 /* ioctl command */
173: #define GDT_DEVTYPE 9 /* additional information */
174: #define GDT_MOUNT 10 /* mount cache device */
175: #define GDT_UNMOUNT 11 /* unmount cache device */
176: #define GDT_SET_FEAT 12 /* set feat. (scatter/gather) */
177: #define GDT_GET_FEAT 13 /* get features */
178: #define GDT_RESERVE 14 /* reserve dev. to raw service */
179: #define GDT_WRITE_THR 16 /* write through */
180: #define GDT_EXT_INFO 18 /* extended info */
181: #define GDT_RESET 19 /* controller reset */
182:
183: /* IOCTL command defines */
184: #define SCSI_CHAN_CNT 5 /* subfunctions */
185: #define GET_IOCHAN_DESC 0x5e
186: #define L_CTRL_PATTERN 0x20000000L
187: #define CACHE_INFO 4
188: #define CACHE_CONFIG 5
189: #define BOARD_INFO 0x28
190: #define IO_CHANNEL 0x00020000L /* channels */
191: #define INVALID_CHANNEL 0x0000ffffL
192:
193: /* IOCTLs */
194: #define GDTIOCTL_MASK ('J'<<8)
195: #define GDTIOCTL_GENERAL (GDTIOCTL_MASK | 0) /* general IOCTL */
196: #define GDTIOCTL_DRVERS (GDTIOCTL_MASK | 1) /* get driver version */
197: #define GDTIOCTL_CTRTYPE (GDTIOCTL_MASK | 2) /* get controller type */
198: #define GDTIOCTL_CTRCNT (GDTIOCTL_MASK | 5) /* get controller count */
199: #define GDTIOCTL_LOCKDRV (GDTIOCTL_MASK | 6) /* lock host drive */
200: #define GDTIOCTL_LOCKCHN (GDTIOCTL_MASK | 7) /* lock channel */
201: #define GDTIOCTL_EVENT (GDTIOCTL_MASK | 8) /* read controller events */
202:
203: /* service errors */
204: #define S_OK 1 /* no error */
205: #define S_BSY 7 /* controller busy */
206: #define S_RAW_SCSI 12 /* raw serv.: target error */
207: #define S_RAW_ILL 0xff /* raw serv.: illegal */
208:
209: /* timeout values */
210: #define INIT_RETRIES 10000 /* 10000 * 1ms = 10s */
211: #define INIT_TIMEOUT 100000 /* 1000 * 1ms = 1s */
212: #define POLL_TIMEOUT 10000 /* 10000 * 1ms = 10s */
213:
214: /* priorities */
215: #define DEFAULT_PRI 0x20
216: #define IOCTL_PRI 0x10
217:
218: /* data directions */
219: #define DATA_IN 0x01000000L /* data from target */
220: #define DATA_OUT 0x00000000L /* data to target */
221:
222: /* BMIC registers (EISA controllers) */
223: #define ID0REG 0x0c80 /* board ID */
224: #define EINTENABREG 0x0c89 /* interrupt enable */
225: #define SEMA0REG 0x0c8a /* command semaphore */
226: #define SEMA1REG 0x0c8b /* status semaphore */
227: #define LDOORREG 0x0c8d /* local doorbell */
228: #define EDENABREG 0x0c8e /* EISA system doorbell enable */
229: #define EDOORREG 0x0c8f /* EISA system doorbell */
230: #define MAILBOXREG 0x0c90 /* mailbox reg. (16 bytes) */
231: #define EISAREG 0x0cc0 /* EISA configuration */
232:
233: /* other defines */
234: #define LINUX_OS 8 /* used for cache optim. */
235: #define SCATTER_GATHER 1 /* s/g feature */
236: #define GDTH_MAXSG 32 /* max. s/g elements */
237: #define SECS32 0x1f /* round capacity */
238: #define BIOS_ID_OFFS 0x10 /* offset contr. ID in ISABIOS */
239: #define LOCALBOARD 0 /* board node always 0 */
240: #define ASYNCINDEX 0 /* cmd index async. event */
241: #define SPEZINDEX 1 /* cmd index unknown service */
242: #define GDT_WR_THROUGH 0x100 /* WRITE_THROUGH supported */
243:
244: /* typedefs */
245:
246: #pragma pack(1)
247:
248: typedef struct {
249: char buffer[GDTH_SCRATCH]; /* scratch buffer */
250: } gdth_scratch_str;
251:
252: /* screenservice message */
253: typedef struct {
254: ulong msg_handle; /* message handle */
255: ulong msg_len; /* size of message */
256: ulong msg_alen; /* answer length */
257: unchar msg_answer; /* answer flag */
258: unchar msg_ext; /* more messages */
259: unchar msg_reserved[2];
260: char msg_text[MSGLEN+2]; /* the message text */
261: } gdth_msg_str;
262:
263: /* get channel count IOCTL */
264: typedef struct {
265: ulong channel_no; /* number of channel */
266: ulong drive_cnt; /* number of drives */
267: unchar siop_id; /* SCSI processor ID */
268: unchar siop_state; /* SCSI processor state */
269: } gdth_getch_str;
270:
271: /* get raw channel count IOCTL (NEW!) */
272: typedef struct {
273: ulong version; /* version of information (-1UL: newest) */
274: unchar list_entries; /* list entry count */
275: unchar first_chan; /* first channel number */
276: unchar last_chan; /* last channel number */
277: unchar chan_count; /* (R) channel count */
278: ulong list_offset; /* offset of list[0] */
279: struct {
280: unchar proc_id; /* processor id */
281: unchar proc_defect; /* defect ? */
282: unchar reserved[2];
283: } list[MAXBUS];
284: } gdth_iochan_str;
285:
286: /* cache info/config IOCTL */
287: typedef struct {
288: ulong version; /* firmware version */
289: ushort state; /* cache state (on/off) */
290: ushort strategy; /* cache strategy */
291: ushort write_back; /* write back state (on/off) */
292: ushort block_size; /* cache block size */
293: } gdth_cpar_str;
294:
295: typedef struct {
296: ulong csize; /* cache size */
297: ulong read_cnt; /* read/write counter */
298: ulong write_cnt;
299: ulong tr_hits; /* hits */
300: ulong sec_hits;
301: ulong sec_miss; /* misses */
302: } gdth_cstat_str;
303:
304: typedef struct {
305: gdth_cpar_str cpar;
306: gdth_cstat_str cstat;
307: } gdth_cinfo_str;
308:
309: /* board info IOCTL */
310: typedef struct {
311: ulong ser_no; /* serial no. */
312: unchar oem_id[2]; /* OEM ID */
313: ushort ep_flags; /* eprom flags */
314: ulong proc_id; /* processor ID */
315: ulong memsize; /* memory size (bytes) */
316: unchar mem_banks; /* memory banks */
317: unchar chan_type; /* channel type */
318: unchar chan_count; /* channel count */
319: unchar rdongle_pres; /* dongle present? */
320: ulong epr_fw_ver; /* (eprom) firmware version */
321: ulong upd_fw_ver; /* (update) firmware version */
322: ulong upd_revision; /* update revision */
323: char type_string[16]; /* controller name */
324: char raid_string[16]; /* RAID firmware name */
325: unchar update_pres; /* update present? */
326: unchar xor_pres; /* XOR engine present? */
327: unchar prom_type; /* ROM type (eprom/flash eprom) */
328: unchar prom_count; /* number of ROM devices */
329: ulong dup_pres; /* duplexing module present? */
330: ulong chan_pres; /* number of expansion channels */
331: ulong mem_pres; /* memory expansion installed? */
332: unchar ft_bus_system; /* fault bus supported? */
333: unchar subtype_valid; /* board_subtype valid? */
334: unchar board_subtype; /* controller subtype/hardware level */
335: unchar ramparity_pres; /* RAM parity check hardware present? */
336: } gdth_binfo_str;
337:
338: /* scatter/gather element */
339: typedef struct {
340: ulong sg_ptr; /* address */
341: ulong sg_len; /* length */
342: } gdth_sg_str;
343:
344: /* command structure */
345: typedef struct {
346: ulong BoardNode; /* board node (always 0) */
347: ulong CommandIndex; /* command number */
348: ushort OpCode; /* the command (READ,..) */
349: union {
350: struct {
351: ushort DeviceNo; /* number of cache drive */
352: ulong BlockNo; /* block number */
353: ulong BlockCnt; /* block count */
354: ulong DestAddr; /* dest. addr. (if s/g: -1) */
355: ulong sg_canz; /* s/g element count */
356: gdth_sg_str sg_lst[GDTH_MAXSG]; /* s/g list */
357: } cache; /* cache service cmd. str. */
358: struct {
359: ushort param_size; /* size of p_param buffer */
360: ulong subfunc; /* IOCTL function */
361: ulong channel; /* device */
362: ulong p_param; /* buffer */
363: } ioctl; /* IOCTL command structure */
364: struct {
365: ushort reserved;
366: ulong msg_handle; /* message handle */
367: ulong msg_addr; /* message buffer address */
368: } screen; /* screen service cmd. str. */
369: struct {
370: ushort reserved;
371: ulong direction; /* data direction */
372: ulong mdisc_time; /* disc. time (0: no timeout)*/
373: ulong mcon_time; /* connect time(0: no to.) */
374: ulong sdata; /* dest. addr. (if s/g: -1) */
375: ulong sdlen; /* data length (bytes) */
376: ulong clen; /* SCSI cmd. length(6,10,12) */
377: unchar cmd[12]; /* SCSI command */
378: unchar target; /* target ID */
379: unchar lun; /* LUN */
380: unchar bus; /* SCSI bus number */
381: unchar priority; /* only 0 used */
382: ulong sense_len; /* sense data length */
383: ulong sense_data; /* sense data addr. */
384: struct raw *link_p; /* linked cmds (not supp.) */
385: ulong sg_ranz; /* s/g element count */
386: gdth_sg_str sg_lst[GDTH_MAXSG]; /* s/g list */
387: } raw; /* raw service cmd. struct. */
388: } u;
389: /* additional variables */
390: unchar Service; /* controller service */
391: ushort Status; /* command result */
392: ulong Info; /* additional information */
393: Scsi_Cmnd *RequestBuffer; /* request buffer */
394: } gdth_cmd_str;
395:
396: /* controller event structure */
397: #define ES_ASYNC 1
398: #define ES_DRIVER 2
399: #define ES_TEST 3
400: #define ES_SYNC 4
401: typedef struct {
402: ushort size; /* size of structure */
403: union {
404: char stream[16];
405: struct {
406: ushort ionode;
407: ushort service;
408: ulong index;
409: } driver;
410: struct {
411: ushort ionode;
412: ushort service;
413: ushort status;
414: ulong info;
415: unchar scsi_coord[3];
416: } async;
417: struct {
418: ushort ionode;
419: ushort service;
420: ushort status;
421: ulong info;
422: ushort hostdrive;
423: unchar scsi_coord[3];
424: unchar sense_key;
425: } sync;
426: struct {
427: ulong l1, l2, l3, l4;
428: } test;
429: } eu;
430: } gdth_evt_data;
431:
432: typedef struct {
433: ulong first_stamp;
434: ulong last_stamp;
435: ushort same_count;
436: ushort event_source;
437: ushort event_idx;
438: unchar application;
439: unchar reserved;
440: gdth_evt_data event_data;
441: } gdth_evt_str;
442:
443:
444: /* DPRAM structures */
445:
446: /* interface area ISA/PCI */
447: typedef struct {
448: unchar S_Cmd_Indx; /* special command */
449: unchar volatile S_Status; /* status special command */
450: ushort reserved1;
451: ulong S_Info[4]; /* add. info special command */
452: unchar volatile Sema0; /* command semaphore */
453: unchar reserved2[3];
454: unchar Cmd_Index; /* command number */
455: unchar reserved3[3];
456: ushort volatile Status; /* command status */
457: ushort Service; /* service(for async.events) */
458: ulong Info[2]; /* additional info */
459: struct {
460: ushort offset; /* command offs. in the DPRAM*/
461: ushort serv_id; /* service */
462: } comm_queue[MAXOFFSETS]; /* command queue */
463: ulong bios_reserved[2];
464: unchar gdt_dpr_cmd[1]; /* commands */
465: } gdt_dpr_if;
466:
467: /* SRAM structure PCI controllers */
468: typedef struct {
469: ulong magic; /* controller ID from BIOS */
470: ushort need_deinit; /* switch betw. BIOS/driver */
471: unchar switch_support; /* see need_deinit */
472: unchar padding[9];
473: unchar os_used[16]; /* OS code per service */
474: unchar unused[28];
475: unchar fw_magic; /* contr. ID from firmware */
476: } gdt_pci_sram;
477:
478: /* SRAM structure EISA controllers (but NOT GDT3000/3020) */
479: typedef struct {
480: unchar os_used[16]; /* OS code per service */
481: ushort need_deinit; /* switch betw. BIOS/driver */
482: unchar switch_support; /* see need_deinit */
483: unchar padding;
484: } gdt_eisa_sram;
485:
486:
487: /* DPRAM ISA controllers */
488: typedef struct {
489: union {
490: struct {
491: unchar bios_used[0x3c00-32]; /* 15KB - 32Bytes BIOS */
492: ulong magic; /* controller (EISA) ID */
493: ushort need_deinit; /* switch betw. BIOS/driver */
494: unchar switch_support; /* see need_deinit */
495: unchar padding[9];
496: unchar os_used[16]; /* OS code per service */
497: } dp_sram;
498: unchar bios_area[0x4000]; /* 16KB reserved for BIOS */
499: } bu;
500: union {
501: gdt_dpr_if ic; /* interface area */
502: unchar if_area[0x3000]; /* 12KB for interface */
503: } u;
504: struct {
505: unchar memlock; /* write protection DPRAM */
506: unchar event; /* release event */
507: unchar irqen; /* board interrupts enable */
508: unchar irqdel; /* acknowledge board int. */
509: unchar volatile Sema1; /* status semaphore */
510: unchar rq; /* IRQ/DRQ configuration */
511: } io;
512: } gdt2_dpram_str;
513:
514: /* DPRAM PCI controllers */
515: typedef struct {
516: union {
517: gdt_dpr_if ic; /* interface area */
518: unchar if_area[0xff0-sizeof(gdt_pci_sram)];
519: } u;
520: gdt_pci_sram gdt6sr; /* SRAM structure */
521: struct {
522: unchar unused0[1];
523: unchar volatile Sema1; /* command semaphore */
524: unchar unused1[3];
525: unchar irqen; /* board interrupts enable */
526: unchar unused2[2];
527: unchar event; /* release event */
528: unchar unused3[3];
529: unchar irqdel; /* acknowledge board int. */
530: unchar unused4[3];
531: } io;
532: } gdt6_dpram_str;
533:
534: /* PLX register structure (new PCI controllers) */
535: typedef struct {
536: unchar cfg_reg; /* DPRAM cfg.(2:below 1MB,0:anywhere)*/
537: unchar unused1[0x3f];
538: unchar volatile sema0_reg; /* command semaphore */
539: unchar volatile sema1_reg; /* status semaphore */
540: unchar unused2[2];
541: ushort volatile status; /* command status */
542: ushort service; /* service */
543: ulong info[2]; /* additional info */
544: unchar unused3[0x10];
545: unchar ldoor_reg; /* PCI to local doorbell */
546: unchar unused4[3];
547: unchar volatile edoor_reg; /* local to PCI doorbell */
548: unchar unused5[3];
549: unchar control0; /* control0 register(unused) */
550: unchar control1; /* board interrupts enable */
551: unchar unused6[0x16];
552: } gdt6c_plx_regs;
553:
554: /* DPRAM new PCI controllers */
555: typedef struct {
556: union {
557: gdt_dpr_if ic; /* interface area */
558: unchar if_area[0x4000-sizeof(gdt_pci_sram)];
559: } u;
560: gdt_pci_sram gdt6sr; /* SRAM structure */
561: } gdt6c_dpram_str;
562:
563: /* i960 register structure (PCI MPR controllers) */
564: typedef struct {
565: unchar unused1[16];
566: unchar volatile sema0_reg; /* command semaphore */
567: unchar unused2;
568: unchar volatile sema1_reg; /* status semaphore */
569: unchar unused3;
570: ushort volatile status; /* command status */
571: ushort service; /* service */
572: ulong info[2]; /* additional info */
573: unchar ldoor_reg; /* PCI to local doorbell */
574: unchar unused4[11];
575: unchar volatile edoor_reg; /* local to PCI doorbell */
576: unchar unused5[7];
577: unchar edoor_en_reg; /* board interrupts enable */
578: unchar unused6[27];
579: ulong unused7[1004]; /* size: 4 KB */
580: } gdt6m_i960_regs;
581:
582: /* DPRAM PCI MPR controllers */
583: typedef struct {
584: gdt6m_i960_regs i960r; /* 4KB i960 registers */
585: union {
586: gdt_dpr_if ic; /* interface area */
587: unchar if_area[0x3000-sizeof(gdt_pci_sram)];
588: } u;
589: gdt_pci_sram gdt6sr; /* SRAM structure */
590: } gdt6m_dpram_str;
591:
592:
593: /* PCI resources */
594: typedef struct {
595: ushort device_id; /* device ID (0,..,9) */
596: unchar bus; /* PCI bus */
597: unchar device_fn; /* PCI device/function no. */
598: ulong dpmem; /* DPRAM address */
599: ulong io; /* IO address */
600: ulong io_mm; /* IO address mem. mapped */
601: ulong bios; /* BIOS address */
602: unchar irq; /* IRQ */
603: } gdth_pci_str;
604:
605:
606: /* controller information structure */
607: typedef struct {
608: unchar bus_cnt; /* SCSI bus count */
609: unchar type; /* controller class */
610: ushort raw_feat; /* feat. raw service (s/g,..) */
611: ulong stype; /* controller subtype */
612: ushort cache_feat; /* feat. cache serv. (s/g,..) */
613: ushort bmic; /* BMIC address (EISA) */
614: void *brd; /* DPRAM address */
615: ulong brd_phys; /* slot number/BIOS address */
616: gdt6c_plx_regs *plx; /* PLX regs (new PCI contr.) */
617: gdth_cmd_str *pccb; /* address command structure */
618: gdth_scratch_str *pscratch;
619: unchar irq; /* IRQ */
620: unchar drq; /* DRQ (ISA controllers) */
621: ushort status; /* command status */
622: ulong info;
623: ulong info2; /* additional info */
624: Scsi_Cmnd *req_first; /* top of request queue */
625: struct {
626: unchar type; /* device type */
627: unchar heads; /* mapping */
628: unchar secs;
629: unchar lock; /* drive locked ? (hot plug) */
630: ushort hostdrive; /* host drive number */
631: ushort devtype; /* further information */
632: ulong size; /* capacity */
633: } id[MAXBUS][MAXID];
634: ushort cmd_cnt; /* command count in DPRAM */
635: ushort cmd_len; /* length of actual command */
636: ushort cmd_offs_dpmem; /* actual offset in DPRAM */
637: ushort ic_all_size; /* sizeof DPRAM interf. area */
638: unchar reserved;
639: unchar mode; /* information from /proc */
640: ushort param_size;
641: gdth_cpar_str cpar; /* controller cache par. */
642: char ctr_name[16]; /* controller name */
643: } gdth_ha_str;
644:
645: /* structure for scsi_register(), SCSI bus != 0 */
646: typedef struct {
647: ushort hanum;
648: ushort busnum;
649: } gdth_num_str;
650:
651: /* structure for scsi_register() */
652: typedef struct {
653: gdth_num_str numext; /* must be the first element */
654: gdth_ha_str haext;
655: gdth_cmd_str cmdext;
656: gdth_scratch_str dmaext;
657: } gdth_ext_str;
658:
659:
660: /* INQUIRY data format */
661: typedef struct {
662: unchar type_qual;
663: unchar modif_rmb;
664: unchar version;
665: unchar resp_aenc;
666: unchar add_length;
667: unchar reserved1;
668: unchar reserved2;
669: unchar misc;
670: unchar vendor[8];
671: unchar product[16];
672: unchar revision[4];
673: } gdth_inq_data;
674:
675: /* READ_CAPACITY data format */
676: typedef struct {
677: ulong last_block_no;
678: ulong block_length;
679: } gdth_rdcap_data;
680:
681: /* REQUEST_SENSE data format */
682: typedef struct {
683: unchar errorcode;
684: unchar segno;
685: unchar key;
686: ulong info;
687: unchar add_length;
688: ulong cmd_info;
689: unchar adsc;
690: unchar adsq;
691: unchar fruc;
692: unchar key_spec[3];
693: } gdth_sense_data;
694:
695: /* MODE_SENSE data format */
696: typedef struct {
697: struct {
698: unchar data_length;
699: unchar med_type;
700: unchar dev_par;
701: unchar bd_length;
702: } hd;
703: struct {
704: unchar dens_code;
705: unchar block_count[3];
706: unchar reserved;
707: unchar block_length[3];
708: } bd;
709: } gdth_modep_data;
710:
711: /* stack frame */
712: typedef struct {
713: ulong b[10]; /* 32 bit compiler ! */
714: } gdth_stackframe;
715:
716: #pragma pack()
717:
718:
719: /* data structure for reserve drives */
720: typedef struct {
721: unchar hanum;
722: unchar bus;
723: unchar id;
724: } gdth_reserve_str;
725:
726:
727: /* function prototyping */
728:
729: int gdth_detect(Scsi_Host_Template *);
730: int gdth_release(struct Scsi_Host *);
731: int gdth_command(Scsi_Cmnd *);
732: int gdth_queuecommand(Scsi_Cmnd *,void (*done)(Scsi_Cmnd *));
733: int gdth_abort(Scsi_Cmnd *);
734: #if LINUX_VERSION_CODE >= 0x010346
735: int gdth_reset(Scsi_Cmnd *, unsigned int reset_flags);
736: #else
737: int gdth_reset(Scsi_Cmnd *);
738: #endif
739: const char *gdth_info(struct Scsi_Host *);
740:
741: #if LINUX_VERSION_CODE >= 0x02015F
742: int gdth_bios_param(Disk *,kdev_t,int *);
743: extern struct proc_dir_entry proc_scsi_gdth;
744: int gdth_proc_info(char *,char **,off_t,int,int,int);
745: int gdth_eh_abort(Scsi_Cmnd *scp);
746: int gdth_eh_device_reset(Scsi_Cmnd *scp);
747: int gdth_eh_bus_reset(Scsi_Cmnd *scp);
748: int gdth_eh_host_reset(Scsi_Cmnd *scp);
749: #define GDTH { proc_dir: &proc_scsi_gdth, \
750: proc_info: gdth_proc_info, \
751: name: "GDT SCSI Disk Array Controller",\
752: detect: gdth_detect, \
753: release: gdth_release, \
754: info: gdth_info, \
755: command: gdth_command, \
756: queuecommand: gdth_queuecommand, \
757: eh_abort_handler: gdth_eh_abort, \
758: eh_device_reset_handler: gdth_eh_device_reset, \
759: eh_bus_reset_handler: gdth_eh_bus_reset, \
760: eh_host_reset_handler: gdth_eh_host_reset, \
761: abort: gdth_abort, \
762: reset: gdth_reset, \
763: bios_param: gdth_bios_param, \
764: can_queue: GDTH_MAXCMDS, \
765: this_id: -1, \
766: sg_tablesize: GDTH_MAXSG, \
767: cmd_per_lun: GDTH_MAXC_P_L, \
768: present: 0, \
769: unchecked_isa_dma: 1, \
770: use_clustering: ENABLE_CLUSTERING, \
771: use_new_eh_code: 1 /* use new error code */ }
772: #elif LINUX_VERSION_CODE >= 0x010300
773: int gdth_bios_param(Disk *,kdev_t,int *);
774: extern struct proc_dir_entry proc_scsi_gdth;
775: int gdth_proc_info(char *,char **,off_t,int,int,int);
776: #define GDTH { NULL, NULL, \
777: &proc_scsi_gdth, \
778: gdth_proc_info, \
779: "GDT SCSI Disk Array Controller", \
780: gdth_detect, \
781: gdth_release, \
782: gdth_info, \
783: gdth_command, \
784: gdth_queuecommand, \
785: gdth_abort, \
786: gdth_reset, \
787: NULL, \
788: gdth_bios_param, \
789: GDTH_MAXCMDS, \
790: -1, \
791: GDTH_MAXSG, \
792: GDTH_MAXC_P_L, \
793: 0, \
794: 1, \
795: ENABLE_CLUSTERING}
796: #else
797: int gdth_bios_param(Disk *,int,int *);
798: #define GDTH { NULL, NULL, \
799: "GDT SCSI Disk Array Controller", \
800: gdth_detect, \
801: gdth_release, \
802: gdth_info, \
803: gdth_command, \
804: gdth_queuecommand, \
805: gdth_abort, \
806: gdth_reset, \
807: NULL, \
808: gdth_bios_param, \
809: GDTH_MAXCMDS, \
810: -1, \
811: GDTH_MAXSG, \
812: GDTH_MAXC_P_L, \
813: 0, \
814: 1, \
815: ENABLE_CLUSTERING}
816: #endif
817:
818: #endif
819:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.