1*536094dcSKashyap D Desai /* 2*536094dcSKashyap D Desai * Copyright (c) 2014, LSI Corp. 3*536094dcSKashyap D Desai * All rights reserved. 4*536094dcSKashyap D Desai * Author: Kashyap Desai, Sibananda Sahu 5*536094dcSKashyap D Desai * Support: freebsdraid@lsi.com 6*536094dcSKashyap D Desai * 7*536094dcSKashyap D Desai * Redistribution and use in source and binary forms, with or without 8*536094dcSKashyap D Desai * modification, are permitted provided that the following conditions 9*536094dcSKashyap D Desai * are met: 10*536094dcSKashyap D Desai * 11*536094dcSKashyap D Desai * 1. Redistributions of source code must retain the above copyright 12*536094dcSKashyap D Desai * notice, this list of conditions and the following disclaimer. 13*536094dcSKashyap D Desai * 2. Redistributions in binary form must reproduce the above copyright 14*536094dcSKashyap D Desai * notice, this list of conditions and the following disclaimer in 15*536094dcSKashyap D Desai * the documentation and/or other materials provided with the 16*536094dcSKashyap D Desai * distribution. 17*536094dcSKashyap D Desai * 3. Neither the name of the <ORGANIZATION> nor the names of its 18*536094dcSKashyap D Desai * contributors may be used to endorse or promote products derived 19*536094dcSKashyap D Desai * from this software without specific prior written permission. 20*536094dcSKashyap D Desai * 21*536094dcSKashyap D Desai * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22*536094dcSKashyap D Desai * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23*536094dcSKashyap D Desai * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 24*536094dcSKashyap D Desai * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 25*536094dcSKashyap D Desai * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26*536094dcSKashyap D Desai * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 27*536094dcSKashyap D Desai * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28*536094dcSKashyap D Desai * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 29*536094dcSKashyap D Desai * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30*536094dcSKashyap D Desai * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 31*536094dcSKashyap D Desai * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 32*536094dcSKashyap D Desai * POSSIBILITY OF SUCH DAMAGE. 33*536094dcSKashyap D Desai * 34*536094dcSKashyap D Desai * The views and conclusions contained in the software and documentation 35*536094dcSKashyap D Desai * are those of the authors and should not be interpreted as representing 36*536094dcSKashyap D Desai * official policies,either expressed or implied, of the FreeBSD Project. 37*536094dcSKashyap D Desai * 38*536094dcSKashyap D Desai * Send feedback to: <megaraidfbsd@lsi.com> 39*536094dcSKashyap D Desai * Mail to: LSI Corporation, 1621 Barber Lane, Milpitas, CA 95035 40*536094dcSKashyap D Desai * ATTN: MegaRaid FreeBSD 41*536094dcSKashyap D Desai * 42*536094dcSKashyap D Desai */ 43*536094dcSKashyap D Desai 44*536094dcSKashyap D Desai #include <sys/cdefs.h> 45*536094dcSKashyap D Desai <!-- $FreeBSD$ --> 46*536094dcSKashyap D Desai 47*536094dcSKashyap D Desai #include <sys/param.h> 48*536094dcSKashyap D Desai #include <sys/systm.h> 49*536094dcSKashyap D Desai 50*536094dcSKashyap D Desai #if (__FreeBSD_version > 900000) 51*536094dcSKashyap D Desai #include <sys/capability.h> 52*536094dcSKashyap D Desai #endif 53*536094dcSKashyap D Desai 54*536094dcSKashyap D Desai #include <sys/conf.h> 55*536094dcSKashyap D Desai #include <sys/kernel.h> 56*536094dcSKashyap D Desai #include <sys/module.h> 57*536094dcSKashyap D Desai #include <sys/file.h> 58*536094dcSKashyap D Desai #include <sys/proc.h> 59*536094dcSKashyap D Desai #include <machine/bus.h> 60*536094dcSKashyap D Desai 61*536094dcSKashyap D Desai #if defined(__amd64__) /* Assume amd64 wants 32 bit Linux */ 62*536094dcSKashyap D Desai #include <machine/../linux32/linux.h> 63*536094dcSKashyap D Desai #include <machine/../linux32/linux32_proto.h> 64*536094dcSKashyap D Desai #else 65*536094dcSKashyap D Desai #include <machine/../linux/linux.h> 66*536094dcSKashyap D Desai #include <machine/../linux/linux_proto.h> 67*536094dcSKashyap D Desai #endif 68*536094dcSKashyap D Desai #include <compat/linux/linux_ioctl.h> 69*536094dcSKashyap D Desai #include <compat/linux/linux_util.h> 70*536094dcSKashyap D Desai 71*536094dcSKashyap D Desai #include <dev/mrsas/mrsas.h> 72*536094dcSKashyap D Desai #include <dev/mrsas/mrsas_ioctl.h> 73*536094dcSKashyap D Desai 74*536094dcSKashyap D Desai /* There are multiple ioctl number ranges that need to be handled */ 75*536094dcSKashyap D Desai #define MRSAS_LINUX_IOCTL_MIN 0x4d00 76*536094dcSKashyap D Desai #define MRSAS_LINUX_IOCTL_MAX 0x4d01 77*536094dcSKashyap D Desai 78*536094dcSKashyap D Desai static linux_ioctl_function_t mrsas_linux_ioctl; 79*536094dcSKashyap D Desai static struct linux_ioctl_handler mrsas_linux_handler = {mrsas_linux_ioctl, 80*536094dcSKashyap D Desai MRSAS_LINUX_IOCTL_MIN, 81*536094dcSKashyap D Desai MRSAS_LINUX_IOCTL_MAX}; 82*536094dcSKashyap D Desai 83*536094dcSKashyap D Desai SYSINIT (mrsas_register, SI_SUB_KLD, SI_ORDER_MIDDLE, 84*536094dcSKashyap D Desai linux_ioctl_register_handler, &mrsas_linux_handler); 85*536094dcSKashyap D Desai SYSUNINIT(mrsas_unregister, SI_SUB_KLD, SI_ORDER_MIDDLE, 86*536094dcSKashyap D Desai linux_ioctl_unregister_handler, &mrsas_linux_handler); 87*536094dcSKashyap D Desai 88*536094dcSKashyap D Desai static struct linux_device_handler mrsas_device_handler = 89*536094dcSKashyap D Desai { "mrsas", "megaraid_sas", "mrsas0", "megaraid_sas_ioctl_node", -1, 0, 1}; 90*536094dcSKashyap D Desai 91*536094dcSKashyap D Desai SYSINIT (mrsas_register2, SI_SUB_KLD, SI_ORDER_MIDDLE, 92*536094dcSKashyap D Desai linux_device_register_handler, &mrsas_device_handler); 93*536094dcSKashyap D Desai SYSUNINIT(mrsas_unregister2, SI_SUB_KLD, SI_ORDER_MIDDLE, 94*536094dcSKashyap D Desai linux_device_unregister_handler, &mrsas_device_handler); 95*536094dcSKashyap D Desai 96*536094dcSKashyap D Desai static int 97*536094dcSKashyap D Desai mrsas_linux_modevent(module_t mod __unused, int cmd __unused, void *data __unused) 98*536094dcSKashyap D Desai { 99*536094dcSKashyap D Desai return (0); 100*536094dcSKashyap D Desai } 101*536094dcSKashyap D Desai 102*536094dcSKashyap D Desai static int 103*536094dcSKashyap D Desai mrsas_linux_ioctl(struct thread *p, struct linux_ioctl_args *args) 104*536094dcSKashyap D Desai { 105*536094dcSKashyap D Desai #if (__FreeBSD_version >= 1000000) 106*536094dcSKashyap D Desai cap_rights_t rights; 107*536094dcSKashyap D Desai #endif 108*536094dcSKashyap D Desai struct file *fp; 109*536094dcSKashyap D Desai int error; 110*536094dcSKashyap D Desai u_long cmd = args->cmd; 111*536094dcSKashyap D Desai 112*536094dcSKashyap D Desai if (cmd != MRSAS_LINUX_CMD32){ 113*536094dcSKashyap D Desai error = ENOTSUP; 114*536094dcSKashyap D Desai goto END; 115*536094dcSKashyap D Desai } 116*536094dcSKashyap D Desai 117*536094dcSKashyap D Desai #if (__FreeBSD_version >= 1000000) 118*536094dcSKashyap D Desai error = fget(p, args->fd, cap_rights_init(&rights, CAP_IOCTL), &fp); 119*536094dcSKashyap D Desai #elif (__FreeBSD_version <= 900000) 120*536094dcSKashyap D Desai error = fget(p, args->fd, &fp); 121*536094dcSKashyap D Desai #else /* For FreeBSD version greater than 9.0.0 but less than 10.0.0 */ 122*536094dcSKashyap D Desai error = fget(p, args->fd, CAP_IOCTL, &fp); 123*536094dcSKashyap D Desai #endif 124*536094dcSKashyap D Desai if (error != 0) 125*536094dcSKashyap D Desai goto END; 126*536094dcSKashyap D Desai 127*536094dcSKashyap D Desai error = fo_ioctl(fp, cmd, (caddr_t)args->arg, p->td_ucred, p); 128*536094dcSKashyap D Desai fdrop(fp, p); 129*536094dcSKashyap D Desai END: 130*536094dcSKashyap D Desai return (error); 131*536094dcSKashyap D Desai } 132*536094dcSKashyap D Desai 133*536094dcSKashyap D Desai DEV_MODULE(mrsas_linux, mrsas_linux_modevent, NULL); 134*536094dcSKashyap D Desai MODULE_DEPEND(mrsas, linux, 1, 1, 1); 135