1 /* $NetBSD: linux_fdio.c,v 1.12 2007/12/20 23:02:54 dsl Exp $ */
4 * Copyright (c) 2000 Wasabi Systems, Inc.
7 * Written by Frank van der Linden for Wasabi Systems, Inc.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed for the NetBSD Project by
20 * Wasabi Systems, Inc.
21 * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22 * or promote products derived from this software without specific prior
25 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
38 #include <sys/cdefs.h>
39 __KERNEL_RCSID(0, "$NetBSD: linux_fdio.c,v 1.12 2007/12/20 23:02:54 dsl Exp $");
41 #include <sys/param.h>
42 #include <sys/systm.h>
43 #include <sys/ioctl.h>
45 #include <sys/filedesc.h>
46 #include <sys/mount.h>
48 #include <sys/disklabel.h>
52 #include <sys/syscallargs.h>
54 #include <dev/isa/fdreg.h>
56 #include <compat/linux/common/linux_types.h>
57 #include <compat/linux/common/linux_ioctl.h>
58 #include <compat/linux/common/linux_signal.h>
59 #include <compat/linux/common/linux_util.h>
60 #include <compat/linux/common/linux_fdio.h>
61 #include <compat/linux/common/linux_ipc.h>
62 #include <compat/linux/common/linux_sem.h>
64 #include <compat/linux/linux_syscallargs.h>
67 linux_ioctl_fdio(struct lwp
*l
, const struct linux_sys_ioctl_args
*uap
,
72 int (*ioctlf
)(file_t
*, u_long
, void *);
74 struct fdformat_parms fparams
;
75 struct linux_floppy_struct lflop
;
76 struct linux_floppy_drive_struct ldrive
;
78 com
= (u_long
)SCARG(uap
, data
);
80 if ((fp
= fd_getfile(SCARG(uap
, fd
))) == NULL
)
83 com
= SCARG(uap
, com
);
84 ioctlf
= fp
->f_ops
->fo_ioctl
;
86 retval
[0] = error
= 0;
93 /* whatever you say */
95 case LINUX_FDPOLLDRVSTAT
:
97 * Just fill in some innocent defaults.
99 memset(&ldrive
, 0, sizeof ldrive
);
102 ldrive
.maxtrack
= ldrive
.track
= 1;
103 ldrive
.flags
= LINUX_FD_DISK_WRITABLE
;
104 error
= copyout(&ldrive
, SCARG(uap
, data
), sizeof ldrive
);
107 error
= ioctlf(fp
, FDIOCGETFORMAT
, &fparams
);
110 lflop
.size
= fparams
.ncyl
* fparams
.nspt
* fparams
.ntrk
;
111 lflop
.sect
= fparams
.nspt
;
112 lflop
.head
= fparams
.ntrk
;
113 lflop
.track
= fparams
.ncyl
;
114 lflop
.stretch
= fparams
.stepspercyl
== 2 ? 1 : 0;
115 lflop
.fmt_gap
= fparams
.gaplen
;
117 * XXXX Use knowledge of floppy for these fields.
118 * FDIOCGETFORMAT does not provide enough information.
119 * It would be better to have FDIOCGETFORMAT return more
122 switch (fparams
.xfer_rate
) {
126 lflop
.rate
= FDC_500KBPS
;
131 lflop
.rate
= FDC_300KBPS
;
136 lflop
.rate
= FDC_250KBPS
;
139 error
= copyout(&lflop
, SCARG(uap
, data
), sizeof lflop
);
143 * Should use FDIOCSETFORMAT here, iff its interface
150 case LINUX_FDSETEMSGTRESH
:
152 case LINUX_FDSETMAXERRS
:
153 case LINUX_FDGETMAXERRS
:
154 case LINUX_FDGETDRVTYP
:
155 case LINUX_FDSETDRVPRM
:
156 case LINUX_FDGETDRVPRM
:
157 case LINUX_FDGETDRVSTAT
:
159 case LINUX_FDGETFDCSTAT
:
160 case LINUX_FDWERRORCLR
:
161 case LINUX_FDWERRORGET
:
168 fd_putfile(SCARG(uap
, fd
));