1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
/*-
* Copyright (c) 2006 IronPort Systems
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#if defined(__amd64__) /* Assume amd64 wants 32 bit Linux */
struct iovec32 {
u_int32_t iov_base;
int iov_len;
};
#endif
#define MFIQ_FREE 0
#define MFIQ_BIO 1
#define MFIQ_READY 2
#define MFIQ_BUSY 3
#define MFIQ_COUNT 4
struct mfi_qstat {
uint32_t q_length;
uint32_t q_max;
};
union mfi_statrequest {
uint32_t ms_item;
struct mfi_qstat ms_qstat;
};
#define MAX_SPACE_FOR_SENSE_PTR 32
union mfi_sense_ptr {
uint8_t sense_ptr_data[MAX_SPACE_FOR_SENSE_PTR];
void *user_space;
struct {
uint32_t low;
uint32_t high;
} addr;
} __packed;
#define MAX_IOCTL_SGE 16
struct mfi_ioc_packet {
uint16_t mfi_adapter_no;
uint16_t mfi_pad1;
uint32_t mfi_sgl_off;
uint32_t mfi_sge_count;
uint32_t mfi_sense_off;
uint32_t mfi_sense_len;
union {
uint8_t raw[128];
struct mfi_frame_header hdr;
} mfi_frame;
struct iovec mfi_sgl[MAX_IOCTL_SGE];
} __packed;
#ifdef __amd64__
struct mfi_ioc_packet32 {
uint16_t mfi_adapter_no;
uint16_t mfi_pad1;
uint32_t mfi_sgl_off;
uint32_t mfi_sge_count;
uint32_t mfi_sense_off;
uint32_t mfi_sense_len;
union {
uint8_t raw[128];
struct mfi_frame_header hdr;
} mfi_frame;
struct iovec32 mfi_sgl[MAX_IOCTL_SGE];
} __packed;
#endif
struct mfi_ioc_aen {
uint16_t aen_adapter_no;
uint16_t aen_pad1;
uint32_t aen_seq_num;
uint32_t aen_class_locale;
} __packed;
#define MFI_CMD _IOWR('M', 1, struct mfi_ioc_packet)
#ifdef __amd64__
#define MFI_CMD32 _IOWR('M', 1, struct mfi_ioc_packet32)
#endif
#define MFI_SET_AEN _IOW('M', 3, struct mfi_ioc_aen)
#define MAX_LINUX_IOCTL_SGE 16
struct mfi_linux_ioc_packet {
uint16_t lioc_adapter_no;
uint16_t lioc_pad1;
uint32_t lioc_sgl_off;
uint32_t lioc_sge_count;
uint32_t lioc_sense_off;
uint32_t lioc_sense_len;
union {
uint8_t raw[128];
struct mfi_frame_header hdr;
} lioc_frame;
#if defined(__amd64__) /* Assume amd64 wants 32 bit Linux */
struct iovec32 lioc_sgl[MAX_LINUX_IOCTL_SGE];
#else
struct iovec lioc_sgl[MAX_LINUX_IOCTL_SGE];
#endif
} __packed;
struct mfi_ioc_passthru {
struct mfi_dcmd_frame ioc_frame;
uint32_t buf_size;
uint8_t *buf;
} __packed;
#ifdef __amd64__
struct mfi_ioc_passthru32 {
struct mfi_dcmd_frame ioc_frame;
uint32_t buf_size;
uint32_t buf;
} __packed;
#endif
#define MFIIO_STATS _IOWR('Q', 101, union mfi_statrequest)
#define MFIIO_PASSTHRU _IOWR('C', 102, struct mfi_ioc_passthru)
#ifdef __amd64__
#define MFIIO_PASSTHRU32 _IOWR('C', 102, struct mfi_ioc_passthru32)
#endif
struct mfi_linux_ioc_aen {
uint16_t laen_adapter_no;
uint16_t laen_pad1;
uint32_t laen_seq_num;
uint32_t laen_class_locale;
} __packed;
struct mfi_query_disk {
uint8_t array_id;
uint8_t present;
uint8_t open;
uint8_t reserved; /* reserved for future use */
char devname[SPECNAMELEN + 1];
} __packed;
#define MFIIO_QUERY_DISK _IOWR('Q', 102, struct mfi_query_disk)
/*
* Create a second set so the FreeBSD native ioctl doesn't
* conflict in FreeBSD ioctl handler. Translate in mfi_linux.c.
*/
#define MFI_LINUX_CMD 0xc1144d01
#define MFI_LINUX_SET_AEN 0x400c4d03
#define MFI_LINUX_CMD_2 0xc1144d02
#define MFI_LINUX_SET_AEN_2 0x400c4d04
|