xref: /freebsd/sys/dev/mfi/mfi_ioctl.h (revision 685dc743dc3b5645e34836464128e1c0558b404b)
12e21a3efSScott Long /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3718cf2ccSPedro F. Giffuni  *
42e21a3efSScott Long  * Copyright (c) 2006 IronPort Systems
52e21a3efSScott Long  * All rights reserved.
62e21a3efSScott Long  *
72e21a3efSScott Long  * Redistribution and use in source and binary forms, with or without
82e21a3efSScott Long  * modification, are permitted provided that the following conditions
92e21a3efSScott Long  * are met:
102e21a3efSScott Long  * 1. Redistributions of source code must retain the above copyright
112e21a3efSScott Long  *    notice, this list of conditions and the following disclaimer.
122e21a3efSScott Long  * 2. Redistributions in binary form must reproduce the above copyright
132e21a3efSScott Long  *    notice, this list of conditions and the following disclaimer in the
142e21a3efSScott Long  *    documentation and/or other materials provided with the distribution.
152e21a3efSScott Long  *
162e21a3efSScott Long  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
172e21a3efSScott Long  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
182e21a3efSScott Long  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
192e21a3efSScott Long  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
202e21a3efSScott Long  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
212e21a3efSScott Long  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
222e21a3efSScott Long  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
232e21a3efSScott Long  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
242e21a3efSScott Long  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
252e21a3efSScott Long  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
262e21a3efSScott Long  * SUCH DAMAGE.
272e21a3efSScott Long  */
282e21a3efSScott Long 
292e21a3efSScott Long #include <sys/cdefs.h>
30763fae79SScott Long #include <dev/mfi/mfireg.h>
31763fae79SScott Long 
32c2be47f2SDoug Ambrisko struct iovec32 {
33c2be47f2SDoug Ambrisko 	u_int32_t	iov_base;
34c2be47f2SDoug Ambrisko 	int		iov_len;
35c2be47f2SDoug Ambrisko };
36c2be47f2SDoug Ambrisko 
372e21a3efSScott Long #define MFIQ_FREE	0
382e21a3efSScott Long #define MFIQ_BIO	1
392e21a3efSScott Long #define MFIQ_READY	2
402e21a3efSScott Long #define MFIQ_BUSY	3
412e21a3efSScott Long #define MFIQ_COUNT	4
422e21a3efSScott Long 
432e21a3efSScott Long struct mfi_qstat {
442e21a3efSScott Long 	uint32_t	q_length;
452e21a3efSScott Long 	uint32_t	q_max;
462e21a3efSScott Long };
472e21a3efSScott Long 
482e21a3efSScott Long union mfi_statrequest {
492e21a3efSScott Long 	uint32_t		ms_item;
502e21a3efSScott Long 	struct mfi_qstat	ms_qstat;
512e21a3efSScott Long };
522e21a3efSScott Long 
53fa1e6ef4SDoug Ambrisko #define MAX_SPACE_FOR_SENSE_PTR		32
54fa1e6ef4SDoug Ambrisko union mfi_sense_ptr {
55fa1e6ef4SDoug Ambrisko 	uint8_t		sense_ptr_data[MAX_SPACE_FOR_SENSE_PTR];
56fa1e6ef4SDoug Ambrisko 	void 		*user_space;
57fa1e6ef4SDoug Ambrisko 	struct {
58fa1e6ef4SDoug Ambrisko 		uint32_t	low;
59fa1e6ef4SDoug Ambrisko 		uint32_t	high;
60fa1e6ef4SDoug Ambrisko 	} addr;
61fa1e6ef4SDoug Ambrisko } __packed;
62fa1e6ef4SDoug Ambrisko 
63c2be47f2SDoug Ambrisko #define MAX_IOCTL_SGE	16
64c2be47f2SDoug Ambrisko 
65c2be47f2SDoug Ambrisko struct mfi_ioc_packet {
66812819c7SDoug Ambrisko 	uint16_t	mfi_adapter_no;
67812819c7SDoug Ambrisko 	uint16_t	mfi_pad1;
68812819c7SDoug Ambrisko 	uint32_t	mfi_sgl_off;
69812819c7SDoug Ambrisko 	uint32_t	mfi_sge_count;
70812819c7SDoug Ambrisko 	uint32_t	mfi_sense_off;
71812819c7SDoug Ambrisko 	uint32_t	mfi_sense_len;
72c2be47f2SDoug Ambrisko 	union {
73c2be47f2SDoug Ambrisko 		uint8_t raw[128];
74c2be47f2SDoug Ambrisko 		struct mfi_frame_header hdr;
75812819c7SDoug Ambrisko 	} mfi_frame;
76c2be47f2SDoug Ambrisko 
77812819c7SDoug Ambrisko 	struct iovec mfi_sgl[MAX_IOCTL_SGE];
78c2be47f2SDoug Ambrisko } __packed;
79c2be47f2SDoug Ambrisko 
80a6ba0fd6SDoug Ambrisko #ifdef COMPAT_FREEBSD32
8146fb79eaSDoug Ambrisko struct mfi_ioc_packet32 {
8246fb79eaSDoug Ambrisko 	uint16_t	mfi_adapter_no;
8346fb79eaSDoug Ambrisko 	uint16_t	mfi_pad1;
8446fb79eaSDoug Ambrisko 	uint32_t	mfi_sgl_off;
8546fb79eaSDoug Ambrisko 	uint32_t	mfi_sge_count;
8646fb79eaSDoug Ambrisko 	uint32_t	mfi_sense_off;
8746fb79eaSDoug Ambrisko 	uint32_t	mfi_sense_len;
8846fb79eaSDoug Ambrisko 	union {
8946fb79eaSDoug Ambrisko 		uint8_t raw[128];
9046fb79eaSDoug Ambrisko 		struct mfi_frame_header hdr;
9146fb79eaSDoug Ambrisko 	} mfi_frame;
9246fb79eaSDoug Ambrisko 
9346fb79eaSDoug Ambrisko 	struct iovec32 mfi_sgl[MAX_IOCTL_SGE];
9446fb79eaSDoug Ambrisko } __packed;
9546fb79eaSDoug Ambrisko #endif
9646fb79eaSDoug Ambrisko 
97c2be47f2SDoug Ambrisko struct mfi_ioc_aen {
98c2be47f2SDoug Ambrisko 	uint16_t	aen_adapter_no;
99c2be47f2SDoug Ambrisko 	uint16_t	aen_pad1;
100c2be47f2SDoug Ambrisko 	uint32_t	aen_seq_num;
101c2be47f2SDoug Ambrisko 	uint32_t	aen_class_locale;
102c2be47f2SDoug Ambrisko } __packed;
103c2be47f2SDoug Ambrisko 
104c2be47f2SDoug Ambrisko #define MFI_CMD		_IOWR('M', 1, struct mfi_ioc_packet)
105a6ba0fd6SDoug Ambrisko #ifdef COMPAT_FREEBSD32
10646fb79eaSDoug Ambrisko #define MFI_CMD32	_IOWR('M', 1, struct mfi_ioc_packet32)
10746fb79eaSDoug Ambrisko #endif
108c2be47f2SDoug Ambrisko #define MFI_SET_AEN	_IOW('M', 3, struct mfi_ioc_aen)
109c2be47f2SDoug Ambrisko 
110741367d5SDoug Ambrisko #define MAX_LINUX_IOCTL_SGE	16
111741367d5SDoug Ambrisko 
112741367d5SDoug Ambrisko struct mfi_linux_ioc_packet {
113741367d5SDoug Ambrisko 	uint16_t	lioc_adapter_no;
114741367d5SDoug Ambrisko 	uint16_t	lioc_pad1;
115741367d5SDoug Ambrisko 	uint32_t	lioc_sgl_off;
116741367d5SDoug Ambrisko 	uint32_t	lioc_sge_count;
117741367d5SDoug Ambrisko 	uint32_t	lioc_sense_off;
118741367d5SDoug Ambrisko 	uint32_t	lioc_sense_len;
119741367d5SDoug Ambrisko 	union {
120741367d5SDoug Ambrisko 		uint8_t raw[128];
121741367d5SDoug Ambrisko 		struct mfi_frame_header hdr;
122741367d5SDoug Ambrisko 	} lioc_frame;
123741367d5SDoug Ambrisko 
124c2be47f2SDoug Ambrisko #if defined(__amd64__) /* Assume amd64 wants 32 bit Linux */
125c2be47f2SDoug Ambrisko 	struct iovec32 lioc_sgl[MAX_LINUX_IOCTL_SGE];
126c2be47f2SDoug Ambrisko #else
127741367d5SDoug Ambrisko 	struct iovec lioc_sgl[MAX_LINUX_IOCTL_SGE];
128c2be47f2SDoug Ambrisko #endif
129741367d5SDoug Ambrisko } __packed;
130741367d5SDoug Ambrisko 
1310929b669SScott Long struct mfi_ioc_passthru {
1320929b669SScott Long 	struct mfi_dcmd_frame	ioc_frame;
1330929b669SScott Long 	uint32_t		buf_size;
1340929b669SScott Long 	uint8_t			*buf;
1350929b669SScott Long } __packed;
1360929b669SScott Long 
137a6ba0fd6SDoug Ambrisko #ifdef COMPAT_FREEBSD32
1380929b669SScott Long struct mfi_ioc_passthru32 {
1390929b669SScott Long 	struct mfi_dcmd_frame	ioc_frame;
1400929b669SScott Long 	uint32_t		buf_size;
1410929b669SScott Long 	uint32_t		buf;
1420929b669SScott Long } __packed;
1430929b669SScott Long #endif
1440929b669SScott Long 
1452e21a3efSScott Long #define MFIIO_STATS	_IOWR('Q', 101, union mfi_statrequest)
1460929b669SScott Long #define MFIIO_PASSTHRU	_IOWR('C', 102, struct mfi_ioc_passthru)
147a6ba0fd6SDoug Ambrisko #ifdef COMPAT_FREEBSD32
1480929b669SScott Long #define MFIIO_PASSTHRU32	_IOWR('C', 102, struct mfi_ioc_passthru32)
1490929b669SScott Long #endif
1502e21a3efSScott Long 
151741367d5SDoug Ambrisko struct mfi_linux_ioc_aen {
152741367d5SDoug Ambrisko 	uint16_t	laen_adapter_no;
153741367d5SDoug Ambrisko 	uint16_t	laen_pad1;
154741367d5SDoug Ambrisko 	uint32_t	laen_seq_num;
155741367d5SDoug Ambrisko 	uint32_t	laen_class_locale;
156741367d5SDoug Ambrisko } __packed;
157c2be47f2SDoug Ambrisko 
158ddfae47bSScott Long struct mfi_query_disk {
159ddfae47bSScott Long 	uint8_t	array_id;
160ddfae47bSScott Long 	uint8_t	present;
161ddfae47bSScott Long 	uint8_t	open;
162ddfae47bSScott Long 	uint8_t reserved;	/* reserved for future use */
163ddfae47bSScott Long 	char	devname[SPECNAMELEN + 1];
164ddfae47bSScott Long } __packed;
165ddfae47bSScott Long 
166ddfae47bSScott Long #define MFIIO_QUERY_DISK	_IOWR('Q', 102, struct mfi_query_disk)
167ddfae47bSScott Long 
168c2be47f2SDoug Ambrisko /*
169c2be47f2SDoug Ambrisko  * Create a second set so the FreeBSD native ioctl doesn't
170c2be47f2SDoug Ambrisko  * conflict in FreeBSD ioctl handler.  Translate in mfi_linux.c.
171c2be47f2SDoug Ambrisko  */
172c2be47f2SDoug Ambrisko #define MFI_LINUX_CMD		0xc1144d01
173c2be47f2SDoug Ambrisko #define MFI_LINUX_SET_AEN	0x400c4d03
174c2be47f2SDoug Ambrisko #define MFI_LINUX_CMD_2		0xc1144d02
175c2be47f2SDoug Ambrisko #define MFI_LINUX_SET_AEN_2	0x400c4d04
176