]> git.proxmox.com Git - mirror_smartmontools-debian.git/blame - megaraid.h
Enhance dh_clean to clean up better
[mirror_smartmontools-debian.git] / megaraid.h
CommitLineData
2127e193
GI
1int megaraid_io_interface(int device, int target, struct scsi_cmnd_io *, int);
2
3#undef u32
4
5#define u8 uint8_t
6#define u16 uint16_t
7#define u32 uint32_t
8#define u64 uint64_t
9
10/*======================================================
ee38a438
GI
11* PERC2/3/4 Passthrough SCSI Command Interface
12*
13* Contents from:
14* drivers/scsi/megaraid/megaraid_ioctl.h
15* drivers/scsi/megaraid/mbox_defs.h
16*======================================================*/
17#define MEGAIOC_MAGIC 'm'
18#define MEGAIOCCMD _IOWR(MEGAIOC_MAGIC, 0, struct uioctl_t)
2127e193
GI
19
20/* Following subopcode work for opcode == 0x82 */
21#define MKADAP(adapno) (MEGAIOC_MAGIC << 8 | adapno)
22#define MEGAIOC_QNADAP 'm'
23#define MEGAIOC_QDRVRVER 'e'
24#define MEGAIOC_QADAPINFO 'g'
25
26#define MEGA_MBOXCMD_PASSTHRU 0x03
27
28#define MAX_REQ_SENSE_LEN 0x20
29#define MAX_CDB_LEN 10
30
31typedef struct
32{
ee38a438
GI
33 uint8_t timeout : 3;
34 uint8_t ars : 1;
35 uint8_t reserved : 3;
36 uint8_t islogical : 1;
37 uint8_t logdrv;
38 uint8_t channel;
39 uint8_t target;
40 uint8_t queuetag;
41 uint8_t queueaction;
42 uint8_t cdb[MAX_CDB_LEN];
43 uint8_t cdblen;
44 uint8_t reqsenselen;
45 uint8_t reqsensearea[MAX_REQ_SENSE_LEN];
46 uint8_t numsgelements;
47 uint8_t scsistatus;
48 uint32_t dataxferaddr;
49 uint32_t dataxferlen;
2127e193
GI
50} __attribute__((packed)) mega_passthru;
51
52typedef struct
53{
ee38a438
GI
54 uint8_t cmd;
55 uint8_t cmdid;
56 uint8_t opcode;
57 uint8_t subopcode;
58 uint32_t lba;
59 uint32_t xferaddr;
60 uint8_t logdrv;
61 uint8_t resvd[3];
62 uint8_t numstatus;
63 uint8_t status;
2127e193
GI
64} __attribute__((packed)) megacmd_t;
65
e9583e0c 66typedef union {
ee38a438
GI
67 uint8_t *pointer;
68 uint8_t pad[8];
2127e193
GI
69} ptr_t;
70
e9583e0c
GI
71// The above definition assumes sizeof(void*) <= 8.
72// This assumption also exists in the linux megaraid device driver.
73// So define a macro to check expected size of ptr_t at compile time using
74// a dummy typedef. On size mismatch, compiler reports a negative array
75// size. If you see an error message of this form, it means that
76// you have an unexpected pointer size on your platform and can not
77// use megaraid support in smartmontools.
78typedef char assert_sizeof_ptr_t[sizeof(ptr_t) == 8 ? 1 : -1];
79
2127e193
GI
80struct uioctl_t
81{
ee38a438
GI
82 uint32_t inlen;
83 uint32_t outlen;
84 union {
85 uint8_t fca[16];
86 struct {
87 uint8_t opcode;
88 uint8_t subopcode;
89 uint16_t adapno;
90 ptr_t buffer;
91 uint32_t length;
92 } __attribute__((packed)) fcs;
93 } __attribute__((packed)) ui;
94
95 megacmd_t mbox;
96 mega_passthru pthru;
97 ptr_t data;
2127e193
GI
98} __attribute__((packed));
99
100/*===================================================
ee38a438
GI
101* PERC5/6 Passthrough SCSI Command Interface
102*
103* Contents from:
104* drivers/scsi/megaraid/megaraid_sas.h
105*===================================================*/
2127e193
GI
106#define MEGASAS_MAGIC 'M'
107#define MEGASAS_IOC_FIRMWARE _IOWR(MEGASAS_MAGIC, 1, struct megasas_iocpacket)
108
109#define MFI_CMD_PD_SCSI_IO 0x04
ee38a438 110#define MFI_CMD_DCMD 0x05
2127e193 111#define MFI_FRAME_SGL64 0x02
ee38a438
GI
112#define MFI_STAT_OK 0x00
113#define MFI_DCMD_PD_GET_LIST 0x02010000
114/*
115* Number of mailbox bytes in DCMD message frame
116*/
117#define MFI_MBOX_SIZE 12
118#define MAX_IOCTL_SGE 16
119#define MFI_FRAME_DIR_NONE 0x0000
120#define MFI_FRAME_DIR_WRITE 0x0008
121#define MFI_FRAME_DIR_READ 0x0010
122#define MFI_FRAME_DIR_BOTH 0x0018
123
124#define MAX_SYS_PDS 240
2127e193
GI
125
126struct megasas_sge32 {
ee38a438
GI
127
128 u32 phys_addr;
129 u32 length;
130
2127e193
GI
131} __attribute__ ((packed));
132
133struct megasas_sge64 {
ee38a438
GI
134
135 u64 phys_addr;
136 u32 length;
137
2127e193
GI
138} __attribute__ ((packed));
139
140union megasas_sgl {
ee38a438
GI
141
142 struct megasas_sge32 sge32[1];
143 struct megasas_sge64 sge64[1];
144
2127e193
GI
145} __attribute__ ((packed));
146
147struct megasas_header {
ee38a438
GI
148
149 u8 cmd; /*00h */
150 u8 sense_len; /*01h */
151 u8 cmd_status; /*02h */
152 u8 scsi_status; /*03h */
153
154 u8 target_id; /*04h */
155 u8 lun; /*05h */
156 u8 cdb_len; /*06h */
157 u8 sge_count; /*07h */
158
159 u32 context; /*08h */
160 u32 pad_0; /*0Ch */
161
162 u16 flags; /*10h */
163 u16 timeout; /*12h */
164 u32 data_xferlen; /*14h */
165
2127e193
GI
166} __attribute__ ((packed));
167
168struct megasas_pthru_frame {
ee38a438
GI
169
170 u8 cmd; /*00h */
171 u8 sense_len; /*01h */
172 u8 cmd_status; /*02h */
173 u8 scsi_status; /*03h */
174
175 u8 target_id; /*04h */
176 u8 lun; /*05h */
177 u8 cdb_len; /*06h */
178 u8 sge_count; /*07h */
179
180 u32 context; /*08h */
181 u32 pad_0; /*0Ch */
182
183 u16 flags; /*10h */
184 u16 timeout; /*12h */
185 u32 data_xfer_len; /*14h */
186
187 u32 sense_buf_phys_addr_lo; /*18h */
188 u32 sense_buf_phys_addr_hi; /*1Ch */
189
190 u8 cdb[16]; /*20h */
191 union megasas_sgl sgl; /*30h */
192
2127e193
GI
193} __attribute__ ((packed));
194
195struct megasas_dcmd_frame {
ee38a438
GI
196
197 u8 cmd; /*00h */
198 u8 reserved_0; /*01h */
199 u8 cmd_status; /*02h */
200 u8 reserved_1[4]; /*03h */
201 u8 sge_count; /*07h */
202
203 u32 context; /*08h */
204 u32 pad_0; /*0Ch */
205
206 u16 flags; /*10h */
207 u16 timeout; /*12h */
208
209 u32 data_xfer_len; /*14h */
210 u32 opcode; /*18h */
211
212 union { /*1Ch */
213 u8 b[12];
214 u16 s[6];
215 u32 w[3];
216 } mbox;
217
218 union megasas_sgl sgl; /*28h */
219
2127e193
GI
220} __attribute__ ((packed));
221
222struct megasas_iocpacket {
ee38a438
GI
223 u16 host_no;
224 u16 __pad1;
225 u32 sgl_off;
226 u32 sge_count;
227 u32 sense_off;
228 u32 sense_len;
229 union {
230 u8 raw[128];
231 struct megasas_header hdr;
232 struct megasas_pthru_frame pthru;
233 struct megasas_dcmd_frame dcmd;
234 } frame;
235
236 struct iovec sgl[MAX_IOCTL_SGE];
237} __attribute__ ((packed));
2127e193 238
ee38a438
GI
239struct megasas_pd_address {
240 u16 device_id;
241 u16 encl_device_id;
242 u8 encl_index;
243 u8 slot_number;
244 u8 scsi_dev_type; /* 0 = disk */
245 u8 connect_port_bitmap;
246 u64 sas_addr[2];
247} __attribute__ ((packed));
248
249struct megasas_pd_list {
250 u32 size;
251 u32 count;
252 struct megasas_pd_address addr[MAX_SYS_PDS];
2127e193
GI
253} __attribute__ ((packed));
254
255#undef u8
256#undef u16
257#undef u32
258#undef u64
259