Annotation of embedaddon/smartmontools/megaraid.h, revision 1.1.1.1
1.1 misho 1: int 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: /*======================================================
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)
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:
31: typedef struct
32: {
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;
50: } __attribute__((packed)) mega_passthru;
51:
52: typedef struct
53: {
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;
64: } __attribute__((packed)) megacmd_t;
65:
66: typedef union {
67: uint8_t *pointer;
68: uint8_t pad[8];
69: } ptr_t;
70:
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];
79:
80: struct uioctl_t
81: {
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;
98: } __attribute__((packed));
99:
100: /*===================================================
101: * PERC5/6 Passthrough SCSI Command Interface
102: *
103: * Contents from:
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)
108:
109: #define MFI_CMD_PD_SCSI_IO 0x04
110: #define MFI_FRAME_SGL64 0x02
111: #define MFI_FRAME_DIR_READ 0x10
112:
113: #define MAX_IOCTL_SGE 16
114:
115: struct megasas_sge32 {
116:
117: u32 phys_addr;
118: u32 length;
119:
120: } __attribute__ ((packed));
121:
122: struct megasas_sge64 {
123:
124: u64 phys_addr;
125: u32 length;
126:
127: } __attribute__ ((packed));
128:
129: union megasas_sgl {
130:
131: struct megasas_sge32 sge32[1];
132: struct megasas_sge64 sge64[1];
133:
134: } __attribute__ ((packed));
135:
136: struct megasas_header {
137:
138: u8 cmd; /*00h */
139: u8 sense_len; /*01h */
140: u8 cmd_status; /*02h */
141: u8 scsi_status; /*03h */
142:
143: u8 target_id; /*04h */
144: u8 lun; /*05h */
145: u8 cdb_len; /*06h */
146: u8 sge_count; /*07h */
147:
148: u32 context; /*08h */
149: u32 pad_0; /*0Ch */
150:
151: u16 flags; /*10h */
152: u16 timeout; /*12h */
153: u32 data_xferlen; /*14h */
154:
155: } __attribute__ ((packed));
156:
157: struct megasas_pthru_frame {
158:
159: u8 cmd; /*00h */
160: u8 sense_len; /*01h */
161: u8 cmd_status; /*02h */
162: u8 scsi_status; /*03h */
163:
164: u8 target_id; /*04h */
165: u8 lun; /*05h */
166: u8 cdb_len; /*06h */
167: u8 sge_count; /*07h */
168:
169: u32 context; /*08h */
170: u32 pad_0; /*0Ch */
171:
172: u16 flags; /*10h */
173: u16 timeout; /*12h */
174: u32 data_xfer_len; /*14h */
175:
176: u32 sense_buf_phys_addr_lo; /*18h */
177: u32 sense_buf_phys_addr_hi; /*1Ch */
178:
179: u8 cdb[16]; /*20h */
180: union megasas_sgl sgl; /*30h */
181:
182: } __attribute__ ((packed));
183:
184: struct megasas_dcmd_frame {
185:
186: u8 cmd; /*00h */
187: u8 reserved_0; /*01h */
188: u8 cmd_status; /*02h */
189: u8 reserved_1[4]; /*03h */
190: u8 sge_count; /*07h */
191:
192: u32 context; /*08h */
193: u32 pad_0; /*0Ch */
194:
195: u16 flags; /*10h */
196: u16 timeout; /*12h */
197:
198: u32 data_xfer_len; /*14h */
199: u32 opcode; /*18h */
200:
201: union { /*1Ch */
202: u8 b[12];
203: u16 s[6];
204: u32 w[3];
205: } mbox;
206:
207: union megasas_sgl sgl; /*28h */
208:
209: } __attribute__ ((packed));
210:
211: struct megasas_iocpacket {
212:
213: u16 host_no;
214: u16 __pad1;
215: u32 sgl_off;
216: u32 sge_count;
217: u32 sense_off;
218: u32 sense_len;
219: union {
220: u8 raw[128];
221: struct megasas_header hdr;
222: struct megasas_pthru_frame pthru;
223: } frame;
224:
225: struct iovec sgl[MAX_IOCTL_SGE];
226:
227: } __attribute__ ((packed));
228:
229: #undef u8
230: #undef u16
231: #undef u32
232: #undef u64
233:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>