aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/mfi/mfi_ioctl.h
blob: da62ad9d82a9f78f36108e167e3e027953e1c512 (plain) (blame)
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$");

#include <dev/mfi/mfireg.h>

struct iovec32 {
	u_int32_t	iov_base;
	int		iov_len;
};

#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 COMPAT_FREEBSD32
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 COMPAT_FREEBSD32
#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 COMPAT_FREEBSD32
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 COMPAT_FREEBSD32
#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