1 int megaraid_io_interface(int device
, int target
, struct scsi_cmnd_io
*, int);
10 /*======================================================
11 * PERC2/3/4 Passthrough SCSI Command Interface
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)
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'
26 #define MEGA_MBOXCMD_PASSTHRU 0x03
28 #define MAX_REQ_SENSE_LEN 0x20
29 #define MAX_CDB_LEN 10
36 uint8_t islogical
: 1;
42 uint8_t cdb
[MAX_CDB_LEN
];
45 uint8_t reqsensearea
[MAX_REQ_SENSE_LEN
];
46 uint8_t numsgelements
;
48 uint32_t dataxferaddr
;
50 } __attribute__((packed
)) mega_passthru
;
64 } __attribute__((packed
)) megacmd_t
;
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.
78 typedef char assert_sizeof_ptr_t
[sizeof(ptr_t
) == 8 ? 1 : -1];
92 } __attribute__((packed
)) fcs
;
93 } __attribute__((packed
)) ui
;
98 } __attribute__((packed
));
100 /*===================================================
101 * PERC5/6 Passthrough SCSI Command Interface
104 * drivers/scsi/megaraid/megaraid_sas.h
105 *===================================================*/
106 #define MEGASAS_MAGIC 'M'
107 #define MEGASAS_IOC_FIRMWARE _IOWR(MEGASAS_MAGIC, 1, struct megasas_iocpacket)
109 #define MFI_CMD_PD_SCSI_IO 0x04
110 #define MFI_CMD_DCMD 0x05
111 #define MFI_FRAME_SGL64 0x02
112 #define MFI_STAT_OK 0x00
113 #define MFI_DCMD_PD_GET_LIST 0x02010000
115 * Number of mailbox bytes in DCMD message frame
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
124 #define MAX_SYS_PDS 240
126 struct megasas_sge32
{
131 } __attribute__ ((packed
));
133 struct megasas_sge64
{
138 } __attribute__ ((packed
));
142 struct megasas_sge32 sge32
[1];
143 struct megasas_sge64 sge64
[1];
145 } __attribute__ ((packed
));
147 struct megasas_header
{
150 u8 sense_len
; /*01h */
151 u8 cmd_status
; /*02h */
152 u8 scsi_status
; /*03h */
154 u8 target_id
; /*04h */
157 u8 sge_count
; /*07h */
159 u32 context
; /*08h */
163 u16 timeout
; /*12h */
164 u32 data_xferlen
; /*14h */
166 } __attribute__ ((packed
));
168 struct megasas_pthru_frame
{
171 u8 sense_len
; /*01h */
172 u8 cmd_status
; /*02h */
173 u8 scsi_status
; /*03h */
175 u8 target_id
; /*04h */
178 u8 sge_count
; /*07h */
180 u32 context
; /*08h */
184 u16 timeout
; /*12h */
185 u32 data_xfer_len
; /*14h */
187 u32 sense_buf_phys_addr_lo
; /*18h */
188 u32 sense_buf_phys_addr_hi
; /*1Ch */
191 union megasas_sgl sgl
; /*30h */
193 } __attribute__ ((packed
));
195 struct megasas_dcmd_frame
{
198 u8 reserved_0
; /*01h */
199 u8 cmd_status
; /*02h */
200 u8 reserved_1
[4]; /*03h */
201 u8 sge_count
; /*07h */
203 u32 context
; /*08h */
207 u16 timeout
; /*12h */
209 u32 data_xfer_len
; /*14h */
218 union megasas_sgl sgl
; /*28h */
220 } __attribute__ ((packed
));
222 struct megasas_iocpacket
{
231 struct megasas_header hdr
;
232 struct megasas_pthru_frame pthru
;
233 struct megasas_dcmd_frame dcmd
;
236 struct iovec sgl
[MAX_IOCTL_SGE
];
237 } __attribute__ ((packed
));
239 struct megasas_pd_address
{
244 u8 scsi_dev_type
; /* 0 = disk */
245 u8 connect_port_bitmap
;
247 } __attribute__ ((packed
));
249 struct megasas_pd_list
{
252 struct megasas_pd_address addr
[MAX_SYS_PDS
];
253 } __attribute__ ((packed
));