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 46*6f70040bSEd Maste #if (__FreeBSD_version >= 1001511) 47*6f70040bSEd Maste #include <sys/capsicum.h> 48*6f70040bSEd Maste #elif (__FreeBSD_version > 900000) 49*6f70040bSEd Maste #include <sys/capabilty.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> 70536094dcSKashyap D Desai #include <dev/mrsas/mrsas_ioctl.h> 71536094dcSKashyap D Desai 72536094dcSKashyap D Desai /* There are multiple ioctl number ranges that need to be handled */ 73536094dcSKashyap D Desai #define MRSAS_LINUX_IOCTL_MIN 0x4d00 74536094dcSKashyap D Desai #define MRSAS_LINUX_IOCTL_MAX 0x4d01 75536094dcSKashyap D Desai 76536094dcSKashyap D Desai static linux_ioctl_function_t mrsas_linux_ioctl; 77536094dcSKashyap D Desai static struct linux_ioctl_handler mrsas_linux_handler = {mrsas_linux_ioctl, 78536094dcSKashyap D Desai MRSAS_LINUX_IOCTL_MIN, 79536094dcSKashyap D Desai MRSAS_LINUX_IOCTL_MAX}; 80536094dcSKashyap D Desai 81536094dcSKashyap D Desai SYSINIT(mrsas_register, SI_SUB_KLD, SI_ORDER_MIDDLE, 82536094dcSKashyap D Desai linux_ioctl_register_handler, &mrsas_linux_handler); 83536094dcSKashyap D Desai SYSUNINIT(mrsas_unregister, SI_SUB_KLD, SI_ORDER_MIDDLE, 84536094dcSKashyap D Desai linux_ioctl_unregister_handler, &mrsas_linux_handler); 85536094dcSKashyap D Desai 86536094dcSKashyap D Desai static struct linux_device_handler mrsas_device_handler = 87536094dcSKashyap D Desai {"mrsas", "megaraid_sas", "mrsas0", "megaraid_sas_ioctl_node", -1, 0, 1}; 88536094dcSKashyap D Desai 89536094dcSKashyap D Desai SYSINIT(mrsas_register2, SI_SUB_KLD, SI_ORDER_MIDDLE, 90536094dcSKashyap D Desai linux_device_register_handler, &mrsas_device_handler); 91536094dcSKashyap D Desai SYSUNINIT(mrsas_unregister2, SI_SUB_KLD, SI_ORDER_MIDDLE, 92536094dcSKashyap D Desai linux_device_unregister_handler, &mrsas_device_handler); 93536094dcSKashyap D Desai 94536094dcSKashyap D Desai static int 95536094dcSKashyap D Desai mrsas_linux_modevent(module_t mod __unused, int cmd __unused, void *data __unused) 96536094dcSKashyap D Desai { 97536094dcSKashyap D Desai return (0); 98536094dcSKashyap D Desai } 99536094dcSKashyap D Desai 1008e727371SKashyap D Desai /* 1018e727371SKashyap D Desai * mrsas_linux_ioctl: linux emulator IOCtl commands entry point. 1028e727371SKashyap D Desai * 1038e727371SKashyap D Desai * This function is the entry point for IOCtls from linux binaries. 1048e727371SKashyap D Desai * It calls the mrsas_ioctl function for processing 1058e727371SKashyap D Desai * depending on the IOCTL command received. 1068e727371SKashyap D Desai */ 107536094dcSKashyap D Desai static int 108536094dcSKashyap D Desai mrsas_linux_ioctl(struct thread *p, struct linux_ioctl_args *args) 109536094dcSKashyap D Desai { 110536094dcSKashyap D Desai #if (__FreeBSD_version >= 1000000) 111536094dcSKashyap D Desai cap_rights_t rights; 1128e727371SKashyap D Desai 113536094dcSKashyap D Desai #endif 114536094dcSKashyap D Desai struct file *fp; 115536094dcSKashyap D Desai int error; 116536094dcSKashyap D Desai u_long cmd = args->cmd; 117536094dcSKashyap D Desai 118536094dcSKashyap D Desai if (cmd != MRSAS_LINUX_CMD32) { 119536094dcSKashyap D Desai error = ENOTSUP; 120536094dcSKashyap D Desai goto END; 121536094dcSKashyap D Desai } 122536094dcSKashyap D Desai #if (__FreeBSD_version >= 1000000) 123536094dcSKashyap D Desai error = fget(p, args->fd, cap_rights_init(&rights, CAP_IOCTL), &fp); 124536094dcSKashyap D Desai #elif (__FreeBSD_version <= 900000) 125536094dcSKashyap D Desai error = fget(p, args->fd, &fp); 1268e727371SKashyap D Desai #else /* For FreeBSD version greater than 1278e727371SKashyap D Desai * 9.0.0 but less than 10.0.0 */ 128536094dcSKashyap D Desai error = fget(p, args->fd, CAP_IOCTL, &fp); 129536094dcSKashyap D Desai #endif 130536094dcSKashyap D Desai if (error != 0) 131536094dcSKashyap D Desai goto END; 132536094dcSKashyap D Desai 133536094dcSKashyap D Desai error = fo_ioctl(fp, cmd, (caddr_t)args->arg, p->td_ucred, p); 134536094dcSKashyap D Desai fdrop(fp, p); 135536094dcSKashyap D Desai END: 136536094dcSKashyap D Desai return (error); 137536094dcSKashyap D Desai } 138536094dcSKashyap D Desai 139536094dcSKashyap D Desai DEV_MODULE(mrsas_linux, mrsas_linux_modevent, NULL); 140536094dcSKashyap D Desai MODULE_DEPEND(mrsas, linux, 1, 1, 1); 141