Linux 2.2.0
[davej-history.git] / drivers / scsi / megaraid.h
blobb020d1b7896e2e751ea45b0818ca81f3536ce396
1 #ifndef __MEGARAID_H__
2 #define __MEGARAID_H__
4 #include <linux/version.h>
6 #define IN_ISR 0x80000000L
7 #define NO_INTR 0x40000000L
8 #define IN_TIMEOUT 0x20000000L
9 #define PENDING 0x10000000L
10 #define BOARD_QUARTZ 0x08000000L
12 #define SCB_ACTIVE 0x1
13 #define SCB_WAITQ 0x2
14 #define SCB_ISSUED 0x4
16 #define SCB_FREE -1
17 #define SCB_RESET -2
18 #define SCB_ABORT -3
19 #define SCB_LOCKED -4
21 #define MEGA_CMD_TIMEOUT 10
23 #define MAX_SGLIST 20
24 #define MAX_COMMANDS 254
26 #define MAX_LOGICAL_DRIVES 8
27 #define MAX_CHANNEL 5
28 #define MAX_TARGET 15
29 #define MAX_PHYSICAL_DRIVES MAX_CHANNEL*MAX_TARGET
31 #define INQUIRY_DATA_SIZE 0x24
32 #define MAX_CDB_LEN 0x0A
33 #define MAX_REQ_SENSE_LEN 0x20
35 #define INTR_VALID 0x40
37 /* Mailbox commands */
38 #define MEGA_MBOXCMD_LREAD 0x01
39 #define MEGA_MBOXCMD_LWRITE 0x02
40 #define MEGA_MBOXCMD_PASSTHRU 0x03
41 #define MEGA_MBOXCMD_ADAPTERINQ 0x05
43 /* Offsets into Mailbox */
44 #define COMMAND_PORT 0x00
45 #define COMMAND_ID_PORT 0x01
46 #define SG_LIST_PORT0 0x08
47 #define SG_LIST_PORT1 0x09
48 #define SG_LIST_PORT2 0x0a
49 #define SG_LIST_PORT3 0x0b
50 #define SG_ELEMENT_PORT 0x0d
51 #define NO_FIRED_PORT 0x0f
53 /* I/O Port offsets */
54 #define I_CMD_PORT 0x00
55 #define I_ACK_PORT 0x00
56 #define I_TOGGLE_PORT 0x01
57 #define INTR_PORT 0x0a
59 #define MAILBOX_SIZE 70
60 #define MBOX_BUSY_PORT 0x00
61 #define MBOX_PORT0 0x04
62 #define MBOX_PORT1 0x05
63 #define MBOX_PORT2 0x06
64 #define MBOX_PORT3 0x07
65 #define ENABLE_MBOX_REGION 0x0B
67 /* I/O Port Values */
68 #define ISSUE_BYTE 0x10
69 #define ACK_BYTE 0x08
70 #define ENABLE_INTR_BYTE 0xc0
71 #define DISABLE_INTR_BYTE 0x00
72 #define VALID_INTR_BYTE 0x40
73 #define MBOX_BUSY_BYTE 0x10
74 #define ENABLE_MBOX_BYTE 0x00
76 /* Setup some port macros here */
77 #define WRITE_MAILBOX(base,offset,value) *(base+offset)=value
78 #define READ_MAILBOX(base,offset) *(base+offset)
80 #define WRITE_PORT(base,offset,value) outb_p(value,base+offset)
81 #define READ_PORT(base,offset) inb_p(base+offset)
83 #define ISSUE_COMMAND(base) WRITE_PORT(base,I_CMD_PORT,ISSUE_BYTE)
84 #define CLEAR_INTR(base) WRITE_PORT(base,I_ACK_PORT,ACK_BYTE)
85 #define ENABLE_INTR(base) WRITE_PORT(base,I_TOGGLE_PORT,ENABLE_INTR_BYTE)
86 #define DISABLE_INTR(base) WRITE_PORT(base,I_TOGGLE_PORT,DISABLE_INTR_BYTE)
88 /* Define AMI's PCI codes */
89 #undef PCI_VENDOR_ID_AMI
90 #undef PCI_DEVICE_ID_AMI_MEGARAID
92 #ifndef PCI_VENDOR_ID_AMI
93 #define PCI_VENDOR_ID_AMI 0x101E
94 #define PCI_DEVICE_ID_AMI_MEGARAID 0x9010
95 #endif
97 #define PCI_CONF_BASE_ADDR_OFFSET 0x10
98 #define PCI_CONF_IRQ_OFFSET 0x3c
100 #if LINUX_VERSION_CODE < 0x20100
101 #define MEGARAID \
102 { NULL, /* Next */\
103 NULL, /* Usage Count Pointer */\
104 NULL, /* /proc Directory Entry */\
105 megaraid_proc_info, /* /proc Info Function */\
106 "MegaRAID", /* Driver Name */\
107 megaraid_detect, /* Detect Host Adapter */\
108 megaraid_release, /* Release Host Adapter */\
109 megaraid_info, /* Driver Info Function */\
110 megaraid_command, /* Command Function */\
111 megaraid_queue, /* Queue Command Function */\
112 megaraid_abort, /* Abort Command Function */\
113 megaraid_reset, /* Reset Command Function */\
114 NULL, /* Slave Attach Function */\
115 megaraid_biosparam, /* Disk BIOS Parameters */\
116 1, /* # of cmds that can be\
117 outstanding at any time */\
118 7, /* HBA Target ID */\
119 MAX_SGLIST, /* Scatter/Gather Table Size */\
120 1, /* SCSI Commands per LUN */\
121 0, /* Present */\
122 0, /* Default Unchecked ISA DMA */\
123 ENABLE_CLUSTERING } /* Enable Clustering */
124 #else
125 #define MEGARAID \
127 name: "MegaRAID", /* Driver Name */\
128 proc_info: megaraid_proc_info, /* /proc driver info */\
129 detect: megaraid_detect, /* Detect Host Adapter */\
130 release: megaraid_release, /* Release Host Adapter */\
131 info: megaraid_info, /* Driver Info Function */\
132 command: megaraid_command, /* Command Function */\
133 queuecommand: megaraid_queue, /* Queue Command Function */\
134 abort: megaraid_abort, /* Abort Command Function */\
135 reset: megaraid_reset, /* Reset Command Function */\
136 bios_param: megaraid_biosparam, /* Disk BIOS Parameters */\
137 can_queue: 255, /* Can Queue */\
138 this_id: 7, /* HBA Target ID */\
139 sg_tablesize: MAX_SGLIST, /* Scatter/Gather Table Size */\
140 cmd_per_lun: 1, /* SCSI Commands per LUN */\
141 present: 0, /* Present */\
142 unchecked_isa_dma:0, /* Default Unchecked ISA DMA */\
143 use_clustering: ENABLE_CLUSTERING /* Enable Clustering */\
145 #endif
147 /* Structures */
148 typedef struct _mega_ADP_INFO
150 u_char MaxConcCmds;
151 u_char RbldRate;
152 u_char MaxTargPerChan;
153 u_char ChanPresent;
154 u_char FwVer[4];
155 u_short AgeOfFlash;
156 u_char ChipSet;
157 u_char DRAMSize;
158 u_char CacheFlushInterval;
159 u_char BiosVer[4];
160 u_char resvd[7];
161 } mega_ADP_INFO;
163 typedef struct _mega_LDRV_INFO
165 u_char NumLDrv;
166 u_char resvd[3];
167 u_long LDrvSize[MAX_LOGICAL_DRIVES];
168 u_char LDrvProp[MAX_LOGICAL_DRIVES];
169 u_char LDrvState[MAX_LOGICAL_DRIVES];
170 } mega_LDRV_INFO;
172 typedef struct _mega_PDRV_INFO
174 u_char PDrvState[MAX_PHYSICAL_DRIVES];
175 u_char resvd;
176 } mega_PDRV_INFO;
178 // RAID inquiry: Mailbox command 0x5
179 typedef struct _mega_RAIDINQ
181 mega_ADP_INFO AdpInfo;
182 mega_LDRV_INFO LogdrvInfo;
183 mega_PDRV_INFO PhysdrvInfo;
184 } mega_RAIDINQ;
186 // Passthrough command: Mailbox command 0x3
187 typedef struct mega_passthru
189 u_char timeout:3; /* 0=6sec/1=60sec/2=10min/3=3hrs */
190 u_char ars:1;
191 u_char reserved:3;
192 u_char islogical:1;
193 u_char logdrv; /* if islogical == 1 */
194 u_char channel; /* if islogical == 0 */
195 u_char target; /* if islogical == 0 */
196 u_char queuetag; /* unused */
197 u_char queueaction; /* unused */
198 u_char cdb[MAX_CDB_LEN];
199 u_char cdblen;
200 u_char reqsenselen;
201 u_char reqsensearea[MAX_REQ_SENSE_LEN];
202 u_char numsgelements;
203 u_char scsistatus;
204 u_long dataxferaddr;
205 u_long dataxferlen;
206 } mega_passthru;
208 typedef struct _mega_mailbox
210 /* 0x0 */ u_char cmd;
211 /* 0x1 */ u_char cmdid;
212 /* 0x2 */ u_short numsectors;
213 /* 0x4 */ u_long lba;
214 /* 0x8 */ u_long xferaddr;
215 /* 0xC */ u_char logdrv;
216 /* 0xD */ u_char numsgelements;
217 /* 0xE */ u_char resvd;
218 /* 0xF */ u_char busy;
219 /* 0x10*/ u_char numstatus;
220 /* 0x11*/ u_char status;
221 /* 0x12*/ u_char completed[46];
222 u_char mraid_poll;
223 u_char mraid_ack;
224 u_char pad[16];
225 } mega_mailbox;
227 typedef struct _mega_sglist
229 u_long address;
230 u_long length;
231 } mega_sglist;
233 /* Queued command data */
234 typedef struct _mega_scb mega_scb;
236 struct _mega_scb
238 int idx;
239 u_long flag;
240 Scsi_Cmnd *SCpnt;
241 u_char mboxData[16];
242 mega_passthru pthru;
243 mega_sglist *sgList;
244 mega_scb *next;
247 /* Per-controller data */
248 typedef struct _mega_host_config
250 u_char numldrv;
251 u_long flag;
252 u_long base;
254 struct tq_struct megaTq;
256 /* Host adapter parameters */
257 u_char fwVer[7];
258 u_char biosVer[7];
260 struct Scsi_Host *host;
262 /* The following must be DMA-able!! */
263 volatile mega_mailbox *mbox;
264 volatile mega_mailbox mailbox;
265 volatile u_char mega_buffer[2*1024L];
267 u_char max_cmds;
268 mega_scb scbList[MAX_COMMANDS];
269 } mega_host_config;
271 extern struct proc_dir_entry proc_scsi_megaraid;
273 const char *megaraid_info( struct Scsi_Host * );
274 int megaraid_detect( Scsi_Host_Template * );
275 int megaraid_release(struct Scsi_Host *);
276 int megaraid_command( Scsi_Cmnd * );
277 int megaraid_abort( Scsi_Cmnd * );
278 int megaraid_reset( Scsi_Cmnd *, unsigned int);
279 int megaraid_queue( Scsi_Cmnd *, void (*done)(Scsi_Cmnd *) );
280 int megaraid_biosparam( Disk *, kdev_t, int * );
281 int megaraid_proc_info( char *buffer, char **start, off_t offset,
282 int length, int hostno, int inout );
284 #endif