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
14 #define SCB_ISSUED 0x4
21 #define MEGA_CMD_TIMEOUT 10
24 #define MAX_COMMANDS 254
26 #define MAX_LOGICAL_DRIVES 8
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
68 #define ISSUE_BYTE 0x10
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
97 #define PCI_CONF_BASE_ADDR_OFFSET 0x10
98 #define PCI_CONF_IRQ_OFFSET 0x3c
100 #if LINUX_VERSION_CODE < 0x20100
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 */\
122 0, /* Default Unchecked ISA DMA */\
123 ENABLE_CLUSTERING } /* Enable Clustering */
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 */\
148 typedef struct _mega_ADP_INFO
152 u_char MaxTargPerChan
;
158 u_char CacheFlushInterval
;
163 typedef struct _mega_LDRV_INFO
167 u_long LDrvSize
[MAX_LOGICAL_DRIVES
];
168 u_char LDrvProp
[MAX_LOGICAL_DRIVES
];
169 u_char LDrvState
[MAX_LOGICAL_DRIVES
];
172 typedef struct _mega_PDRV_INFO
174 u_char PDrvState
[MAX_PHYSICAL_DRIVES
];
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
;
186 // Passthrough command: Mailbox command 0x3
187 typedef struct mega_passthru
189 u_char timeout
:3; /* 0=6sec/1=60sec/2=10min/3=3hrs */
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
];
201 u_char reqsensearea
[MAX_REQ_SENSE_LEN
];
202 u_char numsgelements
;
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];
227 typedef struct _mega_sglist
233 /* Queued command data */
234 typedef struct _mega_scb mega_scb
;
247 /* Per-controller data */
248 typedef struct _mega_host_config
254 struct tq_struct megaTq
;
256 /* Host adapter parameters */
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];
268 mega_scb scbList
[MAX_COMMANDS
];
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
);