1536094dcSKashyap D Desai /* 2ecea5be4SKashyap D Desai * Copyright (c) 2015, AVAGO Tech. All rights reserved. Author: Kashyap Desai, 38e727371SKashyap D Desai * Copyright (c) 2014, LSI Corp. All rights reserved. Author: Kashyap Desai, 4ecea5be4SKashyap D Desai * Sibananda Sahu Support: freebsdraid@avagotech.com 5536094dcSKashyap D Desai * 6536094dcSKashyap D Desai * Redistribution and use in source and binary forms, with or without 78e727371SKashyap D Desai * modification, are permitted provided that the following conditions are 88e727371SKashyap D Desai * met: 9536094dcSKashyap D Desai * 108e727371SKashyap D Desai * 1. Redistributions of source code must retain the above copyright notice, 118e727371SKashyap D Desai * this list of conditions and the following disclaimer. 2. Redistributions 128e727371SKashyap D Desai * in binary form must reproduce the above copyright notice, this list of 138e727371SKashyap D Desai * conditions and the following disclaimer in the documentation and/or other 148e727371SKashyap D Desai * materials provided with the distribution. 3. Neither the name of the 158e727371SKashyap D Desai * <ORGANIZATION> nor the names of its contributors may be used to endorse or 168e727371SKashyap D Desai * promote products derived from this software without specific prior written 178e727371SKashyap D Desai * permission. 18536094dcSKashyap D Desai * 198e727371SKashyap D Desai * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 208e727371SKashyap D Desai * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 218e727371SKashyap D Desai * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 228e727371SKashyap D Desai * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 238e727371SKashyap D Desai * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 248e727371SKashyap D Desai * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 258e727371SKashyap D Desai * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 268e727371SKashyap D Desai * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 278e727371SKashyap D Desai * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 288e727371SKashyap D Desai * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29536094dcSKashyap D Desai * POSSIBILITY OF SUCH DAMAGE. 30536094dcSKashyap D Desai * 318e727371SKashyap D Desai * The views and conclusions contained in the software and documentation are 328e727371SKashyap D Desai * those of the authors and should not be interpreted as representing 33536094dcSKashyap D Desai * official policies,either expressed or implied, of the FreeBSD Project. 34536094dcSKashyap D Desai * 35ecea5be4SKashyap D Desai * Send feedback to: <megaraidfbsd@avagotech.com> Mail to: AVAGO TECHNOLOGIES, 1621 368e727371SKashyap D Desai * Barber Lane, Milpitas, CA 95035 ATTN: MegaRaid FreeBSD 37536094dcSKashyap D Desai * 38536094dcSKashyap D Desai */ 39536094dcSKashyap D Desai 40536094dcSKashyap D Desai #include <sys/cdefs.h> 418e727371SKashyap D Desai __FBSDID("$FreeBSD$"); 42536094dcSKashyap D Desai 43536094dcSKashyap D Desai #include <sys/param.h> 44536094dcSKashyap D Desai #include <sys/systm.h> 45536094dcSKashyap D Desai 466f70040bSEd Maste #if (__FreeBSD_version >= 1001511) 476f70040bSEd Maste #include <sys/capsicum.h> 486f70040bSEd Maste #elif (__FreeBSD_version > 900000) 49cc8440a5SJung-uk Kim #include <sys/capability.h> 50536094dcSKashyap D Desai #endif 51536094dcSKashyap D Desai 52536094dcSKashyap D Desai #include <sys/conf.h> 53536094dcSKashyap D Desai #include <sys/kernel.h> 54536094dcSKashyap D Desai #include <sys/module.h> 55536094dcSKashyap D Desai #include <sys/file.h> 56536094dcSKashyap D Desai #include <sys/proc.h> 57536094dcSKashyap D Desai #include <machine/bus.h> 58536094dcSKashyap D Desai 59536094dcSKashyap D Desai #if defined(__amd64__) /* Assume amd64 wants 32 bit Linux */ 60536094dcSKashyap D Desai #include <machine/../linux32/linux.h> 61536094dcSKashyap D Desai #include <machine/../linux32/linux32_proto.h> 62536094dcSKashyap D Desai #else 63536094dcSKashyap D Desai #include <machine/../linux/linux.h> 64536094dcSKashyap D Desai #include <machine/../linux/linux_proto.h> 65536094dcSKashyap D Desai #endif 66536094dcSKashyap D Desai #include <compat/linux/linux_ioctl.h> 67536094dcSKashyap D Desai #include <compat/linux/linux_util.h> 68536094dcSKashyap D Desai 69536094dcSKashyap D Desai #include <dev/mrsas/mrsas.h> 706469bdcdSBrooks Davis #undef COMPAT_FREEBSD32 71536094dcSKashyap D Desai #include <dev/mrsas/mrsas_ioctl.h> 72536094dcSKashyap D Desai 73536094dcSKashyap D Desai /* There are multiple ioctl number ranges that need to be handled */ 74536094dcSKashyap D Desai #define MRSAS_LINUX_IOCTL_MIN 0x4d00 75536094dcSKashyap D Desai #define MRSAS_LINUX_IOCTL_MAX 0x4d01 76536094dcSKashyap D Desai 77536094dcSKashyap D Desai static linux_ioctl_function_t mrsas_linux_ioctl; 78536094dcSKashyap D Desai static struct linux_ioctl_handler mrsas_linux_handler = {mrsas_linux_ioctl, 79536094dcSKashyap D Desai MRSAS_LINUX_IOCTL_MIN, 80536094dcSKashyap D Desai MRSAS_LINUX_IOCTL_MAX}; 81536094dcSKashyap D Desai 82536094dcSKashyap D Desai SYSINIT(mrsas_register, SI_SUB_KLD, SI_ORDER_MIDDLE, 83536094dcSKashyap D Desai linux_ioctl_register_handler, &mrsas_linux_handler); 84536094dcSKashyap D Desai SYSUNINIT(mrsas_unregister, SI_SUB_KLD, SI_ORDER_MIDDLE, 85536094dcSKashyap D Desai linux_ioctl_unregister_handler, &mrsas_linux_handler); 86536094dcSKashyap D Desai 87536094dcSKashyap D Desai static struct linux_device_handler mrsas_device_handler = 88536094dcSKashyap D Desai {"mrsas", "megaraid_sas", "mrsas0", "megaraid_sas_ioctl_node", -1, 0, 1}; 89536094dcSKashyap D Desai 90536094dcSKashyap D Desai SYSINIT(mrsas_register2, SI_SUB_KLD, SI_ORDER_MIDDLE, 91536094dcSKashyap D Desai linux_device_register_handler, &mrsas_device_handler); 92536094dcSKashyap D Desai SYSUNINIT(mrsas_unregister2, SI_SUB_KLD, SI_ORDER_MIDDLE, 93536094dcSKashyap D Desai linux_device_unregister_handler, &mrsas_device_handler); 94536094dcSKashyap D Desai 95536094dcSKashyap D Desai static int 96536094dcSKashyap D Desai mrsas_linux_modevent(module_t mod __unused, int cmd __unused, void *data __unused) 97536094dcSKashyap D Desai { 98536094dcSKashyap D Desai return (0); 99536094dcSKashyap D Desai } 100536094dcSKashyap D Desai 1018e727371SKashyap D Desai /* 1028e727371SKashyap D Desai * mrsas_linux_ioctl: linux emulator IOCtl commands entry point. 1038e727371SKashyap D Desai * 1048e727371SKashyap D Desai * This function is the entry point for IOCtls from linux binaries. 1058e727371SKashyap D Desai * It calls the mrsas_ioctl function for processing 1068e727371SKashyap D Desai * depending on the IOCTL command received. 1078e727371SKashyap D Desai */ 108536094dcSKashyap D Desai static int 109536094dcSKashyap D Desai mrsas_linux_ioctl(struct thread *p, struct linux_ioctl_args *args) 110536094dcSKashyap D Desai { 111536094dcSKashyap D Desai #if (__FreeBSD_version >= 1000000) 112536094dcSKashyap D Desai cap_rights_t rights; 1138e727371SKashyap D Desai 114536094dcSKashyap D Desai #endif 115536094dcSKashyap D Desai struct file *fp; 116536094dcSKashyap D Desai int error; 117536094dcSKashyap D Desai u_long cmd = args->cmd; 118536094dcSKashyap D Desai 119536094dcSKashyap D Desai if (cmd != MRSAS_LINUX_CMD32) { 120536094dcSKashyap D Desai error = ENOTSUP; 121536094dcSKashyap D Desai goto END; 122536094dcSKashyap D Desai } 123536094dcSKashyap D Desai #if (__FreeBSD_version >= 1000000) 124*6b3a9a0fSMateusz Guzik error = fget(p, args->fd, cap_rights_init_one(&rights, CAP_IOCTL), &fp); 125536094dcSKashyap D Desai #elif (__FreeBSD_version <= 900000) 126536094dcSKashyap D Desai error = fget(p, args->fd, &fp); 1278e727371SKashyap D Desai #else /* For FreeBSD version greater than 1288e727371SKashyap D Desai * 9.0.0 but less than 10.0.0 */ 129536094dcSKashyap D Desai error = fget(p, args->fd, CAP_IOCTL, &fp); 130536094dcSKashyap D Desai #endif 131536094dcSKashyap D Desai if (error != 0) 132536094dcSKashyap D Desai goto END; 133536094dcSKashyap D Desai 134536094dcSKashyap D Desai error = fo_ioctl(fp, cmd, (caddr_t)args->arg, p->td_ucred, p); 135536094dcSKashyap D Desai fdrop(fp, p); 136536094dcSKashyap D Desai END: 137536094dcSKashyap D Desai return (error); 138536094dcSKashyap D Desai } 139536094dcSKashyap D Desai 140536094dcSKashyap D Desai DEV_MODULE(mrsas_linux, mrsas_linux_modevent, NULL); 141536094dcSKashyap D Desai MODULE_DEPEND(mrsas, linux, 1, 1, 1); 142