xref: /freebsd/sys/dev/mrsas/mrsas_linux.c (revision 536094dc79eb98d023bcfce564fc3cdc00787090)
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