mfi_ioctl.h revision 184897
1258945Sroberto/*-
2258945Sroberto * Copyright (c) 2006 IronPort Systems
3258945Sroberto * All rights reserved.
4258945Sroberto *
5258945Sroberto * Redistribution and use in source and binary forms, with or without
6258945Sroberto * modification, are permitted provided that the following conditions
7258945Sroberto * are met:
8258945Sroberto * 1. Redistributions of source code must retain the above copyright
9258945Sroberto *    notice, this list of conditions and the following disclaimer.
10258945Sroberto * 2. Redistributions in binary form must reproduce the above copyright
11258945Sroberto *    notice, this list of conditions and the following disclaimer in the
12258945Sroberto *    documentation and/or other materials provided with the distribution.
13258945Sroberto *
14258945Sroberto * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15258945Sroberto * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16258945Sroberto * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17258945Sroberto * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18258945Sroberto * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19258945Sroberto * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20258945Sroberto * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21258945Sroberto * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22258945Sroberto * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23258945Sroberto * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24258945Sroberto * SUCH DAMAGE.
25258945Sroberto */
26258945Sroberto
27258945Sroberto#include <sys/cdefs.h>
28258945Sroberto__FBSDID("$FreeBSD: head/sys/dev/mfi/mfi_ioctl.h 184897 2008-11-12 22:44:50Z ambrisko $");
29258945Sroberto
30258945Sroberto#if defined(__amd64__) /* Assume amd64 wants 32 bit Linux */
31258945Srobertostruct iovec32 {
32258945Sroberto	u_int32_t	iov_base;
33258945Sroberto	int		iov_len;
34258945Sroberto};
35258945Sroberto#endif
36258945Sroberto
37258945Sroberto#define MFIQ_FREE	0
38258945Sroberto#define MFIQ_BIO	1
39258945Sroberto#define MFIQ_READY	2
40258945Sroberto#define MFIQ_BUSY	3
41258945Sroberto#define MFIQ_COUNT	4
42258945Sroberto
43258945Srobertostruct mfi_qstat {
44258945Sroberto	uint32_t	q_length;
45258945Sroberto	uint32_t	q_max;
46258945Sroberto};
47258945Sroberto
48258945Srobertounion mfi_statrequest {
49258945Sroberto	uint32_t		ms_item;
50258945Sroberto	struct mfi_qstat	ms_qstat;
51258945Sroberto};
52258945Sroberto
53258945Sroberto#define MAX_SPACE_FOR_SENSE_PTR		32
54258945Srobertounion mfi_sense_ptr {
55258945Sroberto	uint8_t		sense_ptr_data[MAX_SPACE_FOR_SENSE_PTR];
56258945Sroberto	void 		*user_space;
57258945Sroberto	struct {
58258945Sroberto		uint32_t	low;
59258945Sroberto		uint32_t	high;
60258945Sroberto	} addr;
61258945Sroberto} __packed;
62258945Sroberto
63258945Sroberto#define MAX_IOCTL_SGE	16
64258945Sroberto
65258945Srobertostruct mfi_ioc_packet {
66258945Sroberto	uint16_t	mfi_adapter_no;
67258945Sroberto	uint16_t	mfi_pad1;
68258945Sroberto	uint32_t	mfi_sgl_off;
69258945Sroberto	uint32_t	mfi_sge_count;
70258945Sroberto	uint32_t	mfi_sense_off;
71258945Sroberto	uint32_t	mfi_sense_len;
72258945Sroberto	union {
73258945Sroberto		uint8_t raw[128];
74258945Sroberto		struct mfi_frame_header hdr;
75258945Sroberto	} mfi_frame;
76258945Sroberto
77258945Sroberto	struct iovec mfi_sgl[MAX_IOCTL_SGE];
78258945Sroberto} __packed;
79258945Sroberto
80258945Sroberto#ifdef __amd64__
81258945Srobertostruct mfi_ioc_packet32 {
82258945Sroberto	uint16_t	mfi_adapter_no;
83258945Sroberto	uint16_t	mfi_pad1;
84258945Sroberto	uint32_t	mfi_sgl_off;
85258945Sroberto	uint32_t	mfi_sge_count;
86258945Sroberto	uint32_t	mfi_sense_off;
87258945Sroberto	uint32_t	mfi_sense_len;
88258945Sroberto	union {
89258945Sroberto		uint8_t raw[128];
90258945Sroberto		struct mfi_frame_header hdr;
91258945Sroberto	} mfi_frame;
92258945Sroberto
93258945Sroberto	struct iovec32 mfi_sgl[MAX_IOCTL_SGE];
94258945Sroberto} __packed;
95258945Sroberto#endif
96258945Sroberto
97258945Srobertostruct mfi_ioc_aen {
98258945Sroberto	uint16_t	aen_adapter_no;
99258945Sroberto	uint16_t	aen_pad1;
100258945Sroberto	uint32_t	aen_seq_num;
101258945Sroberto	uint32_t	aen_class_locale;
102258945Sroberto} __packed;
103258945Sroberto
104258945Sroberto#define MFI_CMD		_IOWR('M', 1, struct mfi_ioc_packet)
105258945Sroberto#ifdef __amd64__
106258945Sroberto#define MFI_CMD32	_IOWR('M', 1, struct mfi_ioc_packet32)
107258945Sroberto#endif
108258945Sroberto#define MFI_SET_AEN	_IOW('M', 3, struct mfi_ioc_aen)
109258945Sroberto
110258945Sroberto#define MAX_LINUX_IOCTL_SGE	16
111258945Sroberto
112258945Srobertostruct mfi_linux_ioc_packet {
113258945Sroberto	uint16_t	lioc_adapter_no;
114258945Sroberto	uint16_t	lioc_pad1;
115258945Sroberto	uint32_t	lioc_sgl_off;
116258945Sroberto	uint32_t	lioc_sge_count;
117258945Sroberto	uint32_t	lioc_sense_off;
118258945Sroberto	uint32_t	lioc_sense_len;
119258945Sroberto	union {
120258945Sroberto		uint8_t raw[128];
121258945Sroberto		struct mfi_frame_header hdr;
122258945Sroberto	} lioc_frame;
123258945Sroberto
124258945Sroberto#if defined(__amd64__) /* Assume amd64 wants 32 bit Linux */
125258945Sroberto	struct iovec32 lioc_sgl[MAX_LINUX_IOCTL_SGE];
126258945Sroberto#else
127258945Sroberto	struct iovec lioc_sgl[MAX_LINUX_IOCTL_SGE];
128258945Sroberto#endif
129258945Sroberto} __packed;
130258945Sroberto
131258945Srobertostruct mfi_ioc_passthru {
132258945Sroberto	struct mfi_dcmd_frame	ioc_frame;
133258945Sroberto	uint32_t		buf_size;
134258945Sroberto	uint8_t			*buf;
135258945Sroberto} __packed;
136258945Sroberto
137258945Sroberto#ifdef __amd64__
138258945Srobertostruct mfi_ioc_passthru32 {
139258945Sroberto	struct mfi_dcmd_frame	ioc_frame;
140258945Sroberto	uint32_t		buf_size;
141258945Sroberto	uint32_t		buf;
142258945Sroberto} __packed;
143258945Sroberto#endif
144258945Sroberto
145258945Sroberto#define MFIIO_STATS	_IOWR('Q', 101, union mfi_statrequest)
146258945Sroberto#define MFIIO_PASSTHRU	_IOWR('C', 102, struct mfi_ioc_passthru)
147258945Sroberto#ifdef __amd64__
148258945Sroberto#define MFIIO_PASSTHRU32	_IOWR('C', 102, struct mfi_ioc_passthru32)
149258945Sroberto#endif
150258945Sroberto
151258945Srobertostruct mfi_linux_ioc_aen {
152258945Sroberto	uint16_t	laen_adapter_no;
153258945Sroberto	uint16_t	laen_pad1;
154258945Sroberto	uint32_t	laen_seq_num;
155258945Sroberto	uint32_t	laen_class_locale;
156258945Sroberto} __packed;
157258945Sroberto
158258945Srobertostruct mfi_query_disk {
159258945Sroberto	uint8_t	array_id;
160258945Sroberto	uint8_t	present;
161258945Sroberto	uint8_t	open;
162258945Sroberto	uint8_t reserved;	/* reserved for future use */
163258945Sroberto	char	devname[SPECNAMELEN + 1];
164258945Sroberto} __packed;
165258945Sroberto
166258945Sroberto#define MFIIO_QUERY_DISK	_IOWR('Q', 102, struct mfi_query_disk)
167258945Sroberto
168258945Sroberto/*
169258945Sroberto * Create a second set so the FreeBSD native ioctl doesn't
170258945Sroberto * conflict in FreeBSD ioctl handler.  Translate in mfi_linux.c.
171258945Sroberto */
172258945Sroberto#define MFI_LINUX_CMD		0xc1144d01
173258945Sroberto#define MFI_LINUX_SET_AEN	0x400c4d03
174258945Sroberto#define MFI_LINUX_CMD_2		0xc1144d02
175258945Sroberto#define MFI_LINUX_SET_AEN_2	0x400c4d04
176258945Sroberto