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