Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Nov 2000 23:05:02 -0600
From:      Stephen Hocking <shocking@houston.rr.com>
To:        Steve Reid <sreid@sea-to-sky.net>
Cc:        freebsd-multimedia@FreeBSD.ORG
Subject:   Re: XF86-4, Linux binaries, DRI? 
Message-ID:  <200011230505.eAN553G15445@bloop.craftncomp.com>
In-Reply-To: Message from Steve Reid <sreid@sea-to-sky.net>  of "Wed, 22 Nov 2000 15:53:18 PST." <20001122155318.A11020@grok> 

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multipart MIME message.

--==_Exmh_-15466650710
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

OK, I've been there and done that. I'm sending you my linux_ioctl.c and =

linux_ioctl.h which should help out. Bear in mind I'm running a system wh=
ich =

is currently pre_SMPng, so these may or may not work directly (i.e. may n=
eed =

some twiddling). They belong in /sys/compat/linux if you're running curre=
nt,
else /sys/i386/linux. Note that I'm running pre_SMPng current.
 =

 =

 	Stephen
 =



--==_Exmh_-15466650710
Content-Type: text/plain ; name="linux_ioctl.c"; charset=iso-8859-1
Content-Description: linux_ioctl.c
Content-Disposition: attachment; filename="linux_ioctl.c"
Content-Transfer-Encoding: quoted-printable

/*
 * Copyright (c) 1994-1995 S=F8ren Schmidt
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer
 *    in this position and unchanged.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the=

 *    documentation and/or other materials provided with the distribution=
=2E
 * 3. The name of the author may not be used to endorse or promote produc=
ts
 *    derived from this software withough specific prior written permissi=
on
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANT=
IES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED=
=2E
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, B=
UT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF U=
SE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE =
OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * $FreeBSD: src/sys/compat/linux/linux_ioctl.c,v 1.54 2000/08/22 01:28:3=
6 marcel Exp $
 */

#include <sys/param.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/proc.h>
#include <sys/cdio.h>
#include <sys/fcntl.h>
#include <sys/file.h>
#include <sys/filedesc.h>
#include <sys/filio.h>
#include <sys/linker_set.h>
#include <sys/malloc.h>
#include <sys/tty.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/if_dl.h>
#include <net/if_types.h>
#include <sys/sockio.h>
#include <sys/soundcard.h>
#include <sys/disklabel.h>

#include <machine/console.h>

#include <machine/../linux/linux.h>
#include <machine/../linux/linux_proto.h>
#include <compat/linux/linux_ioctl.h>
#include <compat/linux/linux_mib.h>
#include <compat/linux/linux_util.h>

#include <i386/linux/drm.h>
#include <i386/linux/mga_drm.h>
#include <i386/linux/i810_drm.h>
#include <i386/linux/r128_drm.h>

static linux_ioctl_function_t linux_ioctl_cdrom;
static linux_ioctl_function_t linux_ioctl_console;
static linux_ioctl_function_t linux_ioctl_disk;
static linux_ioctl_function_t linux_ioctl_socket;
static linux_ioctl_function_t linux_ioctl_sound;
static linux_ioctl_function_t linux_ioctl_termio;
static linux_ioctl_function_t linux_ioctl_drm;

static struct linux_ioctl_handler cdrom_handler =3D
{ linux_ioctl_cdrom, LINUX_IOCTL_CDROM_MIN, LINUX_IOCTL_CDROM_MAX };
static struct linux_ioctl_handler console_handler =3D
{ linux_ioctl_console, LINUX_IOCTL_CONSOLE_MIN, LINUX_IOCTL_CONSOLE_MAX }=
;
static struct linux_ioctl_handler disk_handler =3D
{ linux_ioctl_disk, LINUX_IOCTL_DISK_MIN, LINUX_IOCTL_DISK_MAX };
static struct linux_ioctl_handler socket_handler =3D
{ linux_ioctl_socket, LINUX_IOCTL_SOCKET_MIN, LINUX_IOCTL_SOCKET_MAX };
static struct linux_ioctl_handler sound_handler =3D
{ linux_ioctl_sound, LINUX_IOCTL_SOUND_MIN, LINUX_IOCTL_SOUND_MAX };
static struct linux_ioctl_handler termio_handler =3D
{ linux_ioctl_termio, LINUX_IOCTL_TERMIO_MIN, LINUX_IOCTL_TERMIO_MAX };
static struct linux_ioctl_handler drm_handler =3D
{ linux_ioctl_drm, LINUX_IOCTL_DRM_MIN, LINUX_IOCTL_DRM_MAX };

DATA_SET(linux_ioctl_handler_set, cdrom_handler);
DATA_SET(linux_ioctl_handler_set, console_handler);
DATA_SET(linux_ioctl_handler_set, disk_handler);
DATA_SET(linux_ioctl_handler_set, socket_handler);
DATA_SET(linux_ioctl_handler_set, sound_handler);
DATA_SET(linux_ioctl_handler_set, termio_handler);
DATA_SET(linux_ioctl_handler_set, drm_handler);

struct handler_element =

{
	TAILQ_ENTRY(handler_element) list;
	int	(*func)(struct proc *, struct linux_ioctl_args *);
	int	low, high, span;
};

static TAILQ_HEAD(, handler_element) handlers =3D
	TAILQ_HEAD_INITIALIZER(handlers);

static int
linux_ioctl_disk(struct proc *p, struct linux_ioctl_args *args)
{
	struct file *fp =3D p->p_fd->fd_ofiles[args->fd];
	int error;
	struct disklabel dl;

	switch (args->cmd & 0xffff) {
	case LINUX_BLKGETSIZE:
		error =3D fo_ioctl(fp, DIOCGDINFO, (caddr_t)&dl, p);
		if (error)
			return (error);
		return copyout(&(dl.d_secperunit), (caddr_t)args->arg, sizeof(dl.d_secp=
erunit));
		break;
	}
	return (ENOIOCTL);
}

/*
 * termio related ioctls
 */

struct linux_termio {
	unsigned short c_iflag;
	unsigned short c_oflag;
	unsigned short c_cflag;
	unsigned short c_lflag;
	unsigned char c_line;
	unsigned char c_cc[LINUX_NCC];
};

struct linux_termios {
	unsigned int c_iflag;
	unsigned int c_oflag;
	unsigned int c_cflag;
	unsigned int c_lflag;
	unsigned char c_line;
	unsigned char c_cc[LINUX_NCCS];
};

struct linux_winsize {
	unsigned short ws_row, ws_col;
	unsigned short ws_xpixel, ws_ypixel;
};

static struct speedtab sptab[] =3D {
	{ B0, LINUX_B0 }, { B50, LINUX_B50 },
	{ B75, LINUX_B75 }, { B110, LINUX_B110 },
	{ B134, LINUX_B134 }, { B150, LINUX_B150 },
	{ B200, LINUX_B200 }, { B300, LINUX_B300 },
	{ B600, LINUX_B600 }, { B1200, LINUX_B1200 },
	{ B1800, LINUX_B1800 }, { B2400, LINUX_B2400 },
	{ B4800, LINUX_B4800 }, { B9600, LINUX_B9600 },
	{ B19200, LINUX_B19200 }, { B38400, LINUX_B38400 },
	{ B57600, LINUX_B57600 }, { B115200, LINUX_B115200 },
	{-1, -1 }
};

struct linux_serial_struct {
	int	type;
	int	line;
	int	port;
	int	irq;
	int	flags;
	int	xmit_fifo_size;
	int	custom_divisor;
	int	baud_base;
	unsigned short close_delay;
	char	reserved_char[2];
	int	hub6;
	unsigned short closing_wait;
	unsigned short closing_wait2;
	int	reserved[4];
};

static int
linux_to_bsd_speed(int code, struct speedtab *table)
{
	for ( ; table->sp_code !=3D -1; table++)
		if (table->sp_code =3D=3D code)
			return (table->sp_speed);
	return -1;
}

static int
bsd_to_linux_speed(int speed, struct speedtab *table)
{
	for ( ; table->sp_speed !=3D -1; table++)
		if (table->sp_speed =3D=3D speed)
			return (table->sp_code);
	return -1;
}

static void
bsd_to_linux_termios(struct termios *bios, struct linux_termios *lios)
{
	int i;

#ifdef DEBUG
	printf("LINUX: BSD termios structure (input):\n");
	printf("i=3D%08x o=3D%08x c=3D%08x l=3D%08x ispeed=3D%d ospeed=3D%d\n",
	    bios->c_iflag, bios->c_oflag, bios->c_cflag, bios->c_lflag,
	    bios->c_ispeed, bios->c_ospeed);
	printf("c_cc ");
	for (i=3D0; i<NCCS; i++)
		printf("%02x ", bios->c_cc[i]);
	printf("\n");
#endif

	lios->c_iflag =3D 0;
	if (bios->c_iflag & IGNBRK)
		lios->c_iflag |=3D LINUX_IGNBRK;
	if (bios->c_iflag & BRKINT)
		lios->c_iflag |=3D LINUX_BRKINT;
	if (bios->c_iflag & IGNPAR)
		lios->c_iflag |=3D LINUX_IGNPAR;
	if (bios->c_iflag & PARMRK)
		lios->c_iflag |=3D LINUX_PARMRK;
	if (bios->c_iflag & INPCK)
		lios->c_iflag |=3D LINUX_INPCK;
	if (bios->c_iflag & ISTRIP)
		lios->c_iflag |=3D LINUX_ISTRIP;
	if (bios->c_iflag & INLCR)
		lios->c_iflag |=3D LINUX_INLCR;
	if (bios->c_iflag & IGNCR)
		lios->c_iflag |=3D LINUX_IGNCR;
	if (bios->c_iflag & ICRNL)
		lios->c_iflag |=3D LINUX_ICRNL;
	if (bios->c_iflag & IXON)
		lios->c_iflag |=3D LINUX_IXON;
	if (bios->c_iflag & IXANY)
		lios->c_iflag |=3D LINUX_IXANY;
	if (bios->c_iflag & IXOFF)
		lios->c_iflag |=3D LINUX_IXOFF;
	if (bios->c_iflag & IMAXBEL)
		lios->c_iflag |=3D LINUX_IMAXBEL;

	lios->c_oflag =3D 0;
	if (bios->c_oflag & OPOST)
		lios->c_oflag |=3D LINUX_OPOST;
	if (bios->c_oflag & ONLCR)
		lios->c_oflag |=3D LINUX_ONLCR;
	if (bios->c_oflag & OXTABS)
		lios->c_oflag |=3D LINUX_XTABS;

	lios->c_cflag =3D bsd_to_linux_speed(bios->c_ispeed, sptab);
	lios->c_cflag |=3D (bios->c_cflag & CSIZE) >> 4;
	if (bios->c_cflag & CSTOPB)
		lios->c_cflag |=3D LINUX_CSTOPB;
	if (bios->c_cflag & CREAD)
		lios->c_cflag |=3D LINUX_CREAD;
	if (bios->c_cflag & PARENB)
		lios->c_cflag |=3D LINUX_PARENB;
	if (bios->c_cflag & PARODD)
		lios->c_cflag |=3D LINUX_PARODD;
	if (bios->c_cflag & HUPCL)
		lios->c_cflag |=3D LINUX_HUPCL;
	if (bios->c_cflag & CLOCAL)
		lios->c_cflag |=3D LINUX_CLOCAL;
	if (bios->c_cflag & CRTSCTS)
		lios->c_cflag |=3D LINUX_CRTSCTS;

	lios->c_lflag =3D 0;
	if (bios->c_lflag & ISIG)
		lios->c_lflag |=3D LINUX_ISIG;
	if (bios->c_lflag & ICANON)
		lios->c_lflag |=3D LINUX_ICANON;
	if (bios->c_lflag & ECHO)
		lios->c_lflag |=3D LINUX_ECHO;
	if (bios->c_lflag & ECHOE)
		lios->c_lflag |=3D LINUX_ECHOE;
	if (bios->c_lflag & ECHOK)
		lios->c_lflag |=3D LINUX_ECHOK;
	if (bios->c_lflag & ECHONL)
		lios->c_lflag |=3D LINUX_ECHONL;
	if (bios->c_lflag & NOFLSH)
		lios->c_lflag |=3D LINUX_NOFLSH;
	if (bios->c_lflag & TOSTOP)
		lios->c_lflag |=3D LINUX_TOSTOP;
	if (bios->c_lflag & ECHOCTL)
		lios->c_lflag |=3D LINUX_ECHOCTL;
	if (bios->c_lflag & ECHOPRT)
		lios->c_lflag |=3D LINUX_ECHOPRT;
	if (bios->c_lflag & ECHOKE)
		lios->c_lflag |=3D LINUX_ECHOKE;
	if (bios->c_lflag & FLUSHO)
		lios->c_lflag |=3D LINUX_FLUSHO;
	if (bios->c_lflag & PENDIN)
		lios->c_lflag |=3D LINUX_PENDIN;
	if (bios->c_lflag & IEXTEN)
		lios->c_lflag |=3D LINUX_IEXTEN;

	for (i=3D0; i<LINUX_NCCS; i++)
		lios->c_cc[i] =3D LINUX_POSIX_VDISABLE;
	lios->c_cc[LINUX_VINTR] =3D bios->c_cc[VINTR];
	lios->c_cc[LINUX_VQUIT] =3D bios->c_cc[VQUIT];
	lios->c_cc[LINUX_VERASE] =3D bios->c_cc[VERASE];
	lios->c_cc[LINUX_VKILL] =3D bios->c_cc[VKILL];
	lios->c_cc[LINUX_VEOF] =3D bios->c_cc[VEOF];
	lios->c_cc[LINUX_VEOL] =3D bios->c_cc[VEOL];
	lios->c_cc[LINUX_VMIN] =3D bios->c_cc[VMIN];
	lios->c_cc[LINUX_VTIME] =3D bios->c_cc[VTIME];
	lios->c_cc[LINUX_VEOL2] =3D bios->c_cc[VEOL2];
	lios->c_cc[LINUX_VSUSP] =3D bios->c_cc[VSUSP];
	lios->c_cc[LINUX_VSTART] =3D bios->c_cc[VSTART];
	lios->c_cc[LINUX_VSTOP] =3D bios->c_cc[VSTOP];
	lios->c_cc[LINUX_VREPRINT] =3D bios->c_cc[VREPRINT];
	lios->c_cc[LINUX_VDISCARD] =3D bios->c_cc[VDISCARD];
	lios->c_cc[LINUX_VWERASE] =3D bios->c_cc[VWERASE];
	lios->c_cc[LINUX_VLNEXT] =3D bios->c_cc[VLNEXT];

	for (i=3D0; i<LINUX_NCCS; i++) {
		if (lios->c_cc[i] =3D=3D _POSIX_VDISABLE)
			lios->c_cc[i] =3D LINUX_POSIX_VDISABLE;
	}
	lios->c_line =3D 0;

#ifdef DEBUG
	printf("LINUX: LINUX termios structure (output):\n");
	printf("i=3D%08x o=3D%08x c=3D%08x l=3D%08x line=3D%d\n", lios->c_iflag,=

	    lios->c_oflag, lios->c_cflag, lios->c_lflag, (int)lios->c_line);
	printf("c_cc ");
	for (i=3D0; i<LINUX_NCCS; i++) =

		printf("%02x ", lios->c_cc[i]);
	printf("\n");
#endif
}

static void
linux_to_bsd_termios(struct linux_termios *lios, struct termios *bios)
{
	int i;

#ifdef DEBUG
	printf("LINUX: LINUX termios structure (input):\n");
	printf("i=3D%08x o=3D%08x c=3D%08x l=3D%08x line=3D%d\n", lios->c_iflag,=

	    lios->c_oflag, lios->c_cflag, lios->c_lflag, (int)lios->c_line);
	printf("c_cc ");
	for (i=3D0; i<LINUX_NCCS; i++)
		printf("%02x ", lios->c_cc[i]);
	printf("\n");
#endif

	bios->c_iflag =3D 0;
	if (lios->c_iflag & LINUX_IGNBRK)
		bios->c_iflag |=3D IGNBRK;
	if (lios->c_iflag & LINUX_BRKINT)
		bios->c_iflag |=3D BRKINT;
	if (lios->c_iflag & LINUX_IGNPAR)
		bios->c_iflag |=3D IGNPAR;
	if (lios->c_iflag & LINUX_PARMRK)
		bios->c_iflag |=3D PARMRK;
	if (lios->c_iflag & LINUX_INPCK)
		bios->c_iflag |=3D INPCK;
	if (lios->c_iflag & LINUX_ISTRIP)
		bios->c_iflag |=3D ISTRIP;
	if (lios->c_iflag & LINUX_INLCR)
		bios->c_iflag |=3D INLCR;
	if (lios->c_iflag & LINUX_IGNCR)
		bios->c_iflag |=3D IGNCR;
	if (lios->c_iflag & LINUX_ICRNL)
		bios->c_iflag |=3D ICRNL;
	if (lios->c_iflag & LINUX_IXON)
		bios->c_iflag |=3D IXON;
	if (lios->c_iflag & LINUX_IXANY)
		bios->c_iflag |=3D IXANY;
	if (lios->c_iflag & LINUX_IXOFF)
		bios->c_iflag |=3D IXOFF;
	if (lios->c_iflag & LINUX_IMAXBEL)
		bios->c_iflag |=3D IMAXBEL;

	bios->c_oflag =3D 0;
	if (lios->c_oflag & LINUX_OPOST)
		bios->c_oflag |=3D OPOST;
	if (lios->c_oflag & LINUX_ONLCR)
		bios->c_oflag |=3D ONLCR;
	if (lios->c_oflag & LINUX_XTABS)
		bios->c_oflag |=3D OXTABS;

	bios->c_cflag =3D (lios->c_cflag & LINUX_CSIZE) << 4;
	if (lios->c_cflag & LINUX_CSTOPB)
		bios->c_cflag |=3D CSTOPB;
	if (lios->c_cflag & LINUX_CREAD)
		bios->c_cflag |=3D CREAD;
	if (lios->c_cflag & LINUX_PARENB)
		bios->c_cflag |=3D PARENB;
	if (lios->c_cflag & LINUX_PARODD)
		bios->c_cflag |=3D PARODD;
	if (lios->c_cflag & LINUX_HUPCL)
		bios->c_cflag |=3D HUPCL;
	if (lios->c_cflag & LINUX_CLOCAL)
		bios->c_cflag |=3D CLOCAL;
	if (lios->c_cflag & LINUX_CRTSCTS)
		bios->c_cflag |=3D CRTSCTS;

	bios->c_lflag =3D 0;
	if (lios->c_lflag & LINUX_ISIG)
		bios->c_lflag |=3D ISIG;
	if (lios->c_lflag & LINUX_ICANON)
		bios->c_lflag |=3D ICANON;
	if (lios->c_lflag & LINUX_ECHO)
		bios->c_lflag |=3D ECHO;
	if (lios->c_lflag & LINUX_ECHOE)
		bios->c_lflag |=3D ECHOE;
	if (lios->c_lflag & LINUX_ECHOK)
		bios->c_lflag |=3D ECHOK;
	if (lios->c_lflag & LINUX_ECHONL)
		bios->c_lflag |=3D ECHONL;
	if (lios->c_lflag & LINUX_NOFLSH)
		bios->c_lflag |=3D NOFLSH;
	if (lios->c_lflag & LINUX_TOSTOP)
		bios->c_lflag |=3D TOSTOP;
	if (lios->c_lflag & LINUX_ECHOCTL)
		bios->c_lflag |=3D ECHOCTL;
	if (lios->c_lflag & LINUX_ECHOPRT)
		bios->c_lflag |=3D ECHOPRT;
	if (lios->c_lflag & LINUX_ECHOKE)
		bios->c_lflag |=3D ECHOKE;
	if (lios->c_lflag & LINUX_FLUSHO)
		bios->c_lflag |=3D FLUSHO;
	if (lios->c_lflag & LINUX_PENDIN)
		bios->c_lflag |=3D PENDIN;
	if (lios->c_lflag & LINUX_IEXTEN)
		bios->c_lflag |=3D IEXTEN;

	for (i=3D0; i<NCCS; i++)
		bios->c_cc[i] =3D _POSIX_VDISABLE;
	bios->c_cc[VINTR] =3D lios->c_cc[LINUX_VINTR];
	bios->c_cc[VQUIT] =3D lios->c_cc[LINUX_VQUIT];
	bios->c_cc[VERASE] =3D lios->c_cc[LINUX_VERASE];
	bios->c_cc[VKILL] =3D lios->c_cc[LINUX_VKILL];
	bios->c_cc[VEOF] =3D lios->c_cc[LINUX_VEOF];
	bios->c_cc[VEOL] =3D lios->c_cc[LINUX_VEOL];
	bios->c_cc[VMIN] =3D lios->c_cc[LINUX_VMIN];
	bios->c_cc[VTIME] =3D lios->c_cc[LINUX_VTIME];
	bios->c_cc[VEOL2] =3D lios->c_cc[LINUX_VEOL2];
	bios->c_cc[VSUSP] =3D lios->c_cc[LINUX_VSUSP];
	bios->c_cc[VSTART] =3D lios->c_cc[LINUX_VSTART];
	bios->c_cc[VSTOP] =3D lios->c_cc[LINUX_VSTOP];
	bios->c_cc[VREPRINT] =3D lios->c_cc[LINUX_VREPRINT];
	bios->c_cc[VDISCARD] =3D lios->c_cc[LINUX_VDISCARD];
	bios->c_cc[VWERASE] =3D lios->c_cc[LINUX_VWERASE];
	bios->c_cc[VLNEXT] =3D lios->c_cc[LINUX_VLNEXT];

	for (i=3D0; i<NCCS; i++) {
		if (bios->c_cc[i] =3D=3D LINUX_POSIX_VDISABLE)
			bios->c_cc[i] =3D _POSIX_VDISABLE;
	}

	bios->c_ispeed =3D bios->c_ospeed =3D
	    linux_to_bsd_speed(lios->c_cflag & LINUX_CBAUD, sptab);

#ifdef DEBUG
	printf("LINUX: BSD termios structure (output):\n");
	printf("i=3D%08x o=3D%08x c=3D%08x l=3D%08x ispeed=3D%d ospeed=3D%d\n",
	    bios->c_iflag, bios->c_oflag, bios->c_cflag, bios->c_lflag,
	    bios->c_ispeed, bios->c_ospeed);
	printf("c_cc ");
	for (i=3D0; i<NCCS; i++) =

		printf("%02x ", bios->c_cc[i]);
	printf("\n");
#endif
}

static void
bsd_to_linux_termio(struct termios *bios, struct linux_termio *lio)
{
	struct linux_termios lios;

	bsd_to_linux_termios(bios, &lios);
	lio->c_iflag =3D lios.c_iflag;
	lio->c_oflag =3D lios.c_oflag;
	lio->c_cflag =3D lios.c_cflag;
	lio->c_lflag =3D lios.c_lflag;
	lio->c_line  =3D lios.c_line;
	memcpy(lio->c_cc, lios.c_cc, LINUX_NCC);
}

static void
linux_to_bsd_termio(struct linux_termio *lio, struct termios *bios)
{
	struct linux_termios lios;
	int i;

	lios.c_iflag =3D lio->c_iflag;
	lios.c_oflag =3D lio->c_oflag;
	lios.c_cflag =3D lio->c_cflag;
	lios.c_lflag =3D lio->c_lflag;
	for (i=3DLINUX_NCC; i<LINUX_NCCS; i++)
		lios.c_cc[i] =3D LINUX_POSIX_VDISABLE;
	memcpy(lios.c_cc, lio->c_cc, LINUX_NCC);
	linux_to_bsd_termios(&lios, bios);
}

static int
linux_ioctl_termio(struct proc *p, struct linux_ioctl_args *args)
{
	struct termios bios;
	struct linux_termios lios;
	struct linux_termio lio;
	struct file *fp =3D p->p_fd->fd_ofiles[args->fd];
	int error;

	switch (args->cmd & 0xffff) {

	case LINUX_TCGETS:
		error =3D fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, p);
		if (error)
			return (error);
		bsd_to_linux_termios(&bios, &lios);
		return copyout(&lios, (caddr_t)args->arg, sizeof(lios));

	case LINUX_TCSETS:
		error =3D copyin((caddr_t)args->arg, &lios, sizeof(lios));
		if (error)
			return (error);
		linux_to_bsd_termios(&lios, &bios);
		return (fo_ioctl(fp, TIOCSETA, (caddr_t)&bios, p));

	case LINUX_TCSETSW:
		error =3D copyin((caddr_t)args->arg, &lios, sizeof(lios));
		if (error)
			return (error);
		linux_to_bsd_termios(&lios, &bios);
		return (fo_ioctl(fp, TIOCSETAW, (caddr_t)&bios, p));

	case LINUX_TCSETSF:
		error =3D copyin((caddr_t)args->arg, &lios, sizeof(lios));
		if (error)
			return (error);
		linux_to_bsd_termios(&lios, &bios);
		return (fo_ioctl(fp, TIOCSETAF, (caddr_t)&bios, p));

	case LINUX_TCGETA:
		error =3D fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, p);
		if (error)
			return (error);
		bsd_to_linux_termio(&bios, &lio);
		return (copyout(&lio, (caddr_t)args->arg, sizeof(lio)));

	case LINUX_TCSETA:
		error =3D copyin((caddr_t)args->arg, &lio, sizeof(lio));
		if (error)
			return (error);
		linux_to_bsd_termio(&lio, &bios);
		return (fo_ioctl(fp, TIOCSETA, (caddr_t)&bios, p));

	case LINUX_TCSETAW:
		error =3D copyin((caddr_t)args->arg, &lio, sizeof(lio));
		if (error)
			return (error);
		linux_to_bsd_termio(&lio, &bios);
		return (fo_ioctl(fp, TIOCSETAW, (caddr_t)&bios, p));

	case LINUX_TCSETAF:
		error =3D copyin((caddr_t)args->arg, &lio, sizeof(lio));
		if (error)
			return (error);
		linux_to_bsd_termio(&lio, &bios);
		return (fo_ioctl(fp, TIOCSETAF, (caddr_t)&bios, p));

	/* LINUX_TCSBRK */

	case LINUX_TCXONC: {
		switch (args->arg) {
		case LINUX_TCOOFF:
			args->cmd =3D TIOCSTOP;
			break;
		case LINUX_TCOON:
			args->cmd =3D TIOCSTART;
			break;
		case LINUX_TCIOFF:
		case LINUX_TCION: {
			int c;
			struct write_args wr;
			error =3D fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, p);
			if (error)
				return (error);
			c =3D (args->arg =3D=3D LINUX_TCIOFF) ? VSTOP : VSTART;
			c =3D bios.c_cc[c];
			if (c !=3D _POSIX_VDISABLE) {
				wr.fd =3D args->fd;
				wr.buf =3D &c;
				wr.nbyte =3D sizeof(c);
				return (write(p, &wr));
			} else
				return (0);
		}
		default:
			return (EINVAL);
		}
		args->arg =3D 0;
		return (ioctl(p, (struct ioctl_args *)args));
	}

	case LINUX_TCFLSH: {
		args->cmd =3D TIOCFLUSH;
		switch (args->arg) {
		case LINUX_TCIFLUSH:
			args->arg =3D FREAD;
			break;
		case LINUX_TCOFLUSH:
			args->arg =3D FWRITE;
			break;
		case LINUX_TCIOFLUSH:
			args->arg =3D FREAD | FWRITE;
			break;
		default:
			return (EINVAL);
		}
		return (ioctl(p, (struct ioctl_args *)args));
	}

	case LINUX_TIOCEXCL:
		args->cmd =3D TIOCEXCL;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_TIOCNXCL:
		args->cmd =3D TIOCNXCL;
		return (ioctl(p, (struct ioctl_args *)args));

	/* LINUX_TIOCSCTTY */

	case LINUX_TIOCGPGRP:
		args->cmd =3D TIOCGPGRP;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_TIOCSPGRP:
		args->cmd =3D TIOCSPGRP;
		return (ioctl(p, (struct ioctl_args *)args));

	/* LINUX_TIOCOUTQ */
	/* LINUX_TIOCSTI */

	case LINUX_TIOCGWINSZ:
		args->cmd =3D TIOCGWINSZ;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_TIOCSWINSZ:
		args->cmd =3D TIOCSWINSZ;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_TIOCMGET:
		args->cmd =3D TIOCMGET;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_TIOCMBIS:
		args->cmd =3D TIOCMBIS;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_TIOCMBIC:
		args->cmd =3D TIOCMBIC;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_TIOCMSET:
		args->cmd =3D TIOCMSET;
		return (ioctl(p, (struct ioctl_args *)args));

	/* TIOCGSOFTCAR */
	/* TIOCSSOFTCAR */

	case LINUX_FIONREAD: /* LINUX_TIOCINQ */
		args->cmd =3D FIONREAD;
		return (ioctl(p, (struct ioctl_args *)args));

	/* LINUX_TIOCLINUX */

	case LINUX_TIOCCONS:
		args->cmd =3D TIOCCONS;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_TIOCGSERIAL: {
		struct linux_serial_struct lss;
		lss.type =3D LINUX_PORT_16550A;
		lss.flags =3D 0;
		lss.close_delay =3D 0;
		return copyout(&lss, (caddr_t)args->arg, sizeof(lss));
	}

	case LINUX_TIOCSSERIAL: {
		struct linux_serial_struct lss;
		error =3D copyin((caddr_t)args->arg, &lss, sizeof(lss));
		if (error)
			return (error);
		/* XXX - It really helps to have an implementation that
		 * does nothing. NOT!
		 */
		return (0);
	}

	/* LINUX_TIOCPKT */

	case LINUX_FIONBIO:
		args->cmd =3D FIONBIO;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_TIOCNOTTY:
		args->cmd =3D TIOCNOTTY;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_TIOCSETD: {
		int line;
		switch (args->arg) {
		case LINUX_N_TTY:
			line =3D TTYDISC;
			break;
		case LINUX_N_SLIP:
			line =3D SLIPDISC;
			break;
		case LINUX_N_PPP:
			line =3D PPPDISC;
			break;
		default:
			return (EINVAL);
		}
		return (fo_ioctl(fp, TIOCSETD, (caddr_t)&line, p));
	}

	case LINUX_TIOCGETD: {
		int linux_line;
		int bsd_line =3D TTYDISC;
		error =3D fo_ioctl(fp, TIOCGETD, (caddr_t)&bsd_line, p);
		if (error)
			return (error);
		switch (bsd_line) {
		case TTYDISC:
			linux_line =3D LINUX_N_TTY;
			break;
		case SLIPDISC:
			linux_line =3D LINUX_N_SLIP;
			break;
		case PPPDISC:
			linux_line =3D LINUX_N_PPP;
			break;
		default:
			return (EINVAL);
		}
		return (copyout(&linux_line, (caddr_t)args->arg, sizeof(int)));
	}

	/* LINUX_TCSBRKP */
	/* LINUX_TIOCTTYGSTRUCT */

	case LINUX_FIONCLEX:
		args->cmd =3D FIONCLEX;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_FIOCLEX:
		args->cmd =3D FIOCLEX;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_FIOASYNC:
		args->cmd =3D FIOASYNC;
		return (ioctl(p, (struct ioctl_args *)args));

	/* LINUX_TIOCSERCONFIG */
	/* LINUX_TIOCSERGWILD */
	/* LINUX_TIOCSERSWILD */
	/* LINUX_TIOCGLCKTRMIOS */
	/* LINUX_TIOCSLCKTRMIOS */

	}

	return (ENOIOCTL);
}

/*
 * CDROM related ioctls
 */

struct linux_cdrom_msf
{
	u_char	cdmsf_min0;
	u_char	cdmsf_sec0;
	u_char	cdmsf_frame0;
	u_char	cdmsf_min1;
	u_char	cdmsf_sec1;
	u_char	cdmsf_frame1;
};

struct linux_cdrom_tochdr
{
	u_char	cdth_trk0;
	u_char	cdth_trk1;
};

union linux_cdrom_addr
{
	struct {
		u_char	minute;
		u_char	second;
		u_char	frame;
	} msf;
	int	lba;
};

struct linux_cdrom_tocentry
{
	u_char	cdte_track;     =

	u_char	cdte_adr:4;
	u_char	cdte_ctrl:4;
	u_char	cdte_format;    =

	union linux_cdrom_addr cdte_addr;
	u_char	cdte_datamode;  =

};

struct linux_cdrom_subchnl
{
	u_char	cdsc_format;
	u_char	cdsc_audiostatus;
	u_char	cdsc_adr:4;
	u_char	cdsc_ctrl:4;
	u_char	cdsc_trk;
	u_char	cdsc_ind;
	union linux_cdrom_addr cdsc_absaddr;
	union linux_cdrom_addr cdsc_reladdr;
};

static void
bsd_to_linux_msf_lba(u_char af, union msf_lba *bp, union linux_cdrom_addr=
 *lp)
{
	if (af =3D=3D CD_LBA_FORMAT)
		lp->lba =3D bp->lba;
	else {
		lp->msf.minute =3D bp->msf.minute;
		lp->msf.second =3D bp->msf.second;
		lp->msf.frame =3D bp->msf.frame;
	}
}

static void
set_linux_cdrom_addr(union linux_cdrom_addr *addr, int format, int lba)
{
	if (format =3D=3D LINUX_CDROM_MSF) {
		addr->msf.frame =3D lba % 75;
		lba /=3D 75;
		lba +=3D 2;
		addr->msf.second =3D lba % 60;
		addr->msf.minute =3D lba / 60;
	} else
		addr->lba =3D lba;
}

static int
linux_ioctl_cdrom(struct proc *p, struct linux_ioctl_args *args)
{
	struct file *fp =3D p->p_fd->fd_ofiles[args->fd];
	int error;

	switch (args->cmd & 0xffff) {

	case LINUX_CDROMPAUSE:
		args->cmd =3D CDIOCPAUSE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_CDROMRESUME:
		args->cmd =3D CDIOCRESUME;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_CDROMPLAYMSF:
		args->cmd =3D CDIOCPLAYMSF;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_CDROMPLAYTRKIND:
		args->cmd =3D CDIOCPLAYTRACKS;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_CDROMREADTOCHDR: {
		struct ioc_toc_header th;
		struct linux_cdrom_tochdr lth;
		error =3D fo_ioctl(fp, CDIOREADTOCHEADER, (caddr_t)&th, p);
		if (!error) {
			lth.cdth_trk0 =3D th.starting_track;
			lth.cdth_trk1 =3D th.ending_track;
			copyout(&lth, (caddr_t)args->arg, sizeof(lth));
		}
		return (error);
	}

	case LINUX_CDROMREADTOCENTRY: {
		struct linux_cdrom_tocentry lte, *ltep =3D
		    (struct linux_cdrom_tocentry *)args->arg;
		struct ioc_read_toc_single_entry irtse;
		irtse.address_format =3D ltep->cdte_format;
		irtse.track =3D ltep->cdte_track;
		error =3D fo_ioctl(fp, CDIOREADTOCENTRY, (caddr_t)&irtse, p);
		if (!error) {
			lte =3D *ltep;
			lte.cdte_ctrl =3D irtse.entry.control;
			lte.cdte_adr =3D irtse.entry.addr_type;
			bsd_to_linux_msf_lba(irtse.address_format,
			    &irtse.entry.addr, &lte.cdte_addr);
			copyout(&lte, (caddr_t)args->arg, sizeof(lte));
		}
		return (error);
	}

	case LINUX_CDROMSTOP:
		args->cmd =3D CDIOCSTOP;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_CDROMSTART:
		args->cmd =3D CDIOCSTART;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_CDROMEJECT:
		args->cmd =3D CDIOCEJECT;
		return (ioctl(p, (struct ioctl_args *)args));

	/* LINUX_CDROMVOLCTRL */

	case LINUX_CDROMSUBCHNL: {
		struct linux_cdrom_subchnl sc;
		struct ioc_read_subchannel bsdsc;
		struct cd_sub_channel_info *bsdinfo;
		caddr_t sg =3D stackgap_init();
		bsdinfo =3D (struct cd_sub_channel_info*)stackgap_alloc(&sg,
		    sizeof(struct cd_sub_channel_info));
		bsdsc.address_format =3D CD_LBA_FORMAT;
		bsdsc.data_format =3D CD_CURRENT_POSITION;
		bsdsc.track =3D 0;
		bsdsc.data_len =3D sizeof(struct cd_sub_channel_info);
		bsdsc.data =3D bsdinfo;
		error =3D fo_ioctl(fp, CDIOCREADSUBCHANNEL, (caddr_t)&bsdsc, p);
		if (error)
			return (error);
		error =3D copyin((caddr_t)args->arg, &sc,
		    sizeof(struct linux_cdrom_subchnl));
		if (error)
			return (error);
		sc.cdsc_audiostatus =3D bsdinfo->header.audio_status;
		sc.cdsc_adr =3D bsdinfo->what.position.addr_type;
		sc.cdsc_ctrl =3D bsdinfo->what.position.control;
		sc.cdsc_trk =3D bsdinfo->what.position.track_number;
		sc.cdsc_ind =3D bsdinfo->what.position.index_number;
		set_linux_cdrom_addr(&sc.cdsc_absaddr, sc.cdsc_format,
		    bsdinfo->what.position.absaddr.lba);
		set_linux_cdrom_addr(&sc.cdsc_reladdr, sc.cdsc_format,
		    bsdinfo->what.position.reladdr.lba);
		error =3D copyout(&sc, (caddr_t)args->arg,
		    sizeof(struct linux_cdrom_subchnl));
		return (error);
	}

	/* LINUX_CDROMREADMODE2 */
	/* LINUX_CDROMREADMODE1 */
	/* LINUX_CDROMREADAUDIO */
	/* LINUX_CDROMEJECT_SW */
	/* LINUX_CDROMMULTISESSION */
	/* LINUX_CDROM_GET_UPC */

	case LINUX_CDROMRESET:
		args->cmd =3D CDIOCRESET;
		return (ioctl(p, (struct ioctl_args *)args));

	/* LINUX_CDROMVOLREAD */
	/* LINUX_CDROMREADRAW */
	/* LINUX_CDROMREADCOOKED */
	/* LINUX_CDROMSEEK */
	/* LINUX_CDROMPLAYBLK */
	/* LINUX_CDROMREADALL */
	/* LINUX_CDROMCLOSETRAY */
	/* LINUX_CDROMLOADFROMSLOT */

	}

	return (ENOIOCTL);
}

/*
 * Sound related ioctls
 */

static unsigned dirbits[4] =3D { IOC_VOID, IOC_IN, IOC_OUT, IOC_INOUT };

#define	SETDIR(c)	(((c) & ~IOC_DIRMASK) | dirbits[args->cmd >> 30])

static int
linux_ioctl_sound(struct proc *p, struct linux_ioctl_args *args)
{

	switch (args->cmd & 0xffff) {

	case LINUX_SOUND_MIXER_WRITE_VOLUME:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_VOLUME);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_MIXER_WRITE_BASS:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_BASS);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_MIXER_WRITE_TREBLE:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_TREBLE);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_MIXER_WRITE_SYNTH:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_SYNTH);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_MIXER_WRITE_PCM:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_PCM);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_MIXER_WRITE_SPEAKER:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_SPEAKER);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_MIXER_WRITE_LINE:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_LINE);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_MIXER_WRITE_MIC:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_MIC);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_MIXER_WRITE_CD:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_CD);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_MIXER_WRITE_IMIX:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_IMIX);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_MIXER_WRITE_ALTPCM:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_ALTPCM);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_MIXER_WRITE_RECLEV:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_RECLEV);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_MIXER_WRITE_IGAIN:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_IGAIN);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_MIXER_WRITE_OGAIN:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_OGAIN);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_MIXER_WRITE_LINE1:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_LINE1);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_MIXER_WRITE_LINE2:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_LINE2);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_MIXER_WRITE_LINE3:
		args->cmd =3D SETDIR(SOUND_MIXER_WRITE_LINE3);
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_OSS_GETVERSION: {
		int version =3D linux_get_oss_version(p);
		return (copyout(&version, (caddr_t)args->arg, sizeof(int)));
	}

	case LINUX_SOUND_MIXER_READ_DEVMASK:
		args->cmd =3D SOUND_MIXER_READ_DEVMASK;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_RESET:
		args->cmd =3D SNDCTL_DSP_RESET;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_SYNC:
		args->cmd =3D SNDCTL_DSP_SYNC;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_SPEED:
		args->cmd =3D SNDCTL_DSP_SPEED;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_STEREO:
		args->cmd =3D SNDCTL_DSP_STEREO;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_GETBLKSIZE: /* LINUX_SNDCTL_DSP_SETBLKSIZE */
		args->cmd =3D SNDCTL_DSP_GETBLKSIZE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_SETFMT:
		args->cmd =3D SNDCTL_DSP_SETFMT;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_PCM_WRITE_CHANNELS:
		args->cmd =3D SOUND_PCM_WRITE_CHANNELS;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SOUND_PCM_WRITE_FILTER:
		args->cmd =3D SOUND_PCM_WRITE_FILTER;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_POST:
		args->cmd =3D SNDCTL_DSP_POST;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_SUBDIVIDE:
		args->cmd =3D SNDCTL_DSP_SUBDIVIDE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_SETFRAGMENT:
		args->cmd =3D SNDCTL_DSP_SETFRAGMENT;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_GETFMTS:
		args->cmd =3D SNDCTL_DSP_GETFMTS;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_GETOSPACE:
		args->cmd =3D SNDCTL_DSP_GETOSPACE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_GETISPACE:
		args->cmd =3D SNDCTL_DSP_GETISPACE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_NONBLOCK:
		args->cmd =3D SNDCTL_DSP_NONBLOCK;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_GETCAPS:
		args->cmd =3D SNDCTL_DSP_GETCAPS;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_SETTRIGGER: /* LINUX_SNDCTL_GETTRIGGER */
		args->cmd =3D SNDCTL_DSP_SETTRIGGER;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_GETIPTR:
		args->cmd =3D SNDCTL_DSP_GETIPTR;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_GETOPTR:
		args->cmd =3D SNDCTL_DSP_GETOPTR;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_DSP_GETODELAY:
		args->cmd =3D SNDCTL_DSP_GETODELAY;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_SEQ_RESET:
		args->cmd =3D SNDCTL_SEQ_RESET;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_SEQ_SYNC:
		args->cmd =3D SNDCTL_SEQ_SYNC;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_SYNTH_INFO:
		args->cmd =3D SNDCTL_SYNTH_INFO;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_SEQ_CTRLRATE:
		args->cmd =3D SNDCTL_SEQ_CTRLRATE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_SEQ_GETOUTCOUNT:
		args->cmd =3D SNDCTL_SEQ_GETOUTCOUNT;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_SEQ_GETINCOUNT:
		args->cmd =3D SNDCTL_SEQ_GETINCOUNT;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_SEQ_PERCMODE:
		args->cmd =3D SNDCTL_SEQ_PERCMODE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_FM_LOAD_INSTR:
		args->cmd =3D SNDCTL_FM_LOAD_INSTR;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_SEQ_TESTMIDI:
		args->cmd =3D SNDCTL_SEQ_TESTMIDI;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_SEQ_RESETSAMPLES:
		args->cmd =3D SNDCTL_SEQ_RESETSAMPLES;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_SEQ_NRSYNTHS:
		args->cmd =3D SNDCTL_SEQ_NRSYNTHS;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_SEQ_NRMIDIS:
		args->cmd =3D SNDCTL_SEQ_NRMIDIS;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_MIDI_INFO:
		args->cmd =3D SNDCTL_MIDI_INFO;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_SEQ_TRESHOLD:
		args->cmd =3D SNDCTL_SEQ_TRESHOLD;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SNDCTL_SYNTH_MEMAVL:
		args->cmd =3D SNDCTL_SYNTH_MEMAVL;
		return (ioctl(p, (struct ioctl_args *)args));

	}

	return (ENOIOCTL);
}

/*
 * Console related ioctls
 */

#define ISSIGVALID(sig)		((sig) > 0 && (sig) < NSIG)

static int
linux_ioctl_console(struct proc *p, struct linux_ioctl_args *args)
{
	struct file *fp =3D p->p_fd->fd_ofiles[args->fd];

	switch (args->cmd & 0xffff) {

	case LINUX_KIOCSOUND:
		args->cmd =3D KIOCSOUND;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_KDMKTONE:
		args->cmd =3D KDMKTONE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_KDGETLED:
		args->cmd =3D KDGETLED;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_KDSETLED:
		args->cmd =3D KDSETLED;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_KDSETMODE:
		args->cmd =3D KDSETMODE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_KDGETMODE:
		args->cmd =3D KDGETMODE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_KDGKBMODE:
		args->cmd =3D KDGKBMODE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_KDSKBMODE: {
		int kbdmode;
		switch (args->arg) {
		case LINUX_KBD_RAW:
			kbdmode =3D K_RAW;
			break;
		case LINUX_KBD_XLATE:
			kbdmode =3D K_XLATE;
			break;
		case LINUX_KBD_MEDIUMRAW:
			kbdmode =3D K_RAW;
			break;
		default:
			return (EINVAL);
		}
		return (fo_ioctl(fp, KDSKBMODE, (caddr_t)&kbdmode, p));
	}

	case LINUX_VT_OPENQRY:
		args->cmd =3D VT_OPENQRY;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_VT_GETMODE:
		args->cmd =3D VT_GETMODE;
		return  (ioctl(p, (struct ioctl_args *)args));

	case LINUX_VT_SETMODE: {
		struct vt_mode *mode;
		args->cmd =3D VT_SETMODE;
		mode =3D (struct vt_mode *)args->arg;
		if (!ISSIGVALID(mode->frsig) && ISSIGVALID(mode->acqsig))
			mode->frsig =3D mode->acqsig;
		return (ioctl(p, (struct ioctl_args *)args));
	}

	case LINUX_VT_GETSTATE:
		args->cmd =3D VT_GETACTIVE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_VT_RELDISP:
		args->cmd =3D VT_RELDISP;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_VT_ACTIVATE:
		args->cmd =3D VT_ACTIVATE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_VT_WAITACTIVE:
		args->cmd =3D VT_WAITACTIVE;
		return (ioctl(p, (struct ioctl_args *)args));

	}
	=

	return (ENOIOCTL);
}

/*
 * Socket related ioctls
 */

static int
linux_ioctl_socket(struct proc *p, struct linux_ioctl_args *args)
{

	switch (args->cmd & 0xffff) {

	case LINUX_FIOSETOWN:
		args->cmd =3D FIOSETOWN;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SIOCSPGRP:
		args->cmd =3D SIOCSPGRP;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_FIOGETOWN:
		args->cmd =3D FIOGETOWN;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SIOCGPGRP:
		args->cmd =3D SIOCGPGRP;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SIOCATMARK:
		args->cmd =3D SIOCATMARK;
		return (ioctl(p, (struct ioctl_args *)args));

	/* LINUX_SIOCGSTAMP */

	case LINUX_SIOCGIFCONF:
		args->cmd =3D OSIOCGIFCONF;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SIOCGIFFLAGS:
		args->cmd =3D SIOCGIFFLAGS;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SIOCGIFADDR:
		args->cmd =3D OSIOCGIFADDR;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SIOCGIFDSTADDR:
		args->cmd =3D OSIOCGIFDSTADDR;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SIOCGIFBRDADDR:
		args->cmd =3D OSIOCGIFBRDADDR;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SIOCGIFNETMASK:
		args->cmd =3D OSIOCGIFNETMASK;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SIOCGIFHWADDR: {
		int ifn;
		struct ifnet *ifp;
		struct ifaddr *ifa;
		struct sockaddr_dl *sdl;
		struct linux_ifreq *ifr =3D (struct linux_ifreq *)args->arg;

		/* Note that we don't actually respect the name in the ifreq
		 * structure, as Linux interface names are all different.
		 */
		for (ifn =3D 0; ifn < if_index; ifn++) {
			ifp =3D ifnet_addrs[ifn]->ifa_ifp;
			if (ifp->if_type =3D=3D IFT_ETHER) {
				ifa =3D TAILQ_FIRST(&ifp->if_addrhead);
				while (ifa) {
					sdl=3D(struct sockaddr_dl*)ifa->ifa_addr;
					if (sdl !=3D NULL &&
					    (sdl->sdl_family =3D=3D AF_LINK) &&
					    (sdl->sdl_type =3D=3D IFT_ETHER)) {
						return (copyout(LLADDR(sdl),
						    &ifr->ifr_hwaddr.sa_data,
						    LINUX_IFHWADDRLEN));
					}
					ifa =3D TAILQ_NEXT(ifa, ifa_link);
				}
			}
		}
		return (ENOENT);
	}

	case LINUX_SIOCADDMULTI:
		args->cmd =3D SIOCADDMULTI;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_SIOCDELMULTI:
		args->cmd =3D SIOCDELMULTI;
		return (ioctl(p, (struct ioctl_args *)args));

	}

	return (ENOIOCTL);
}

/*
 * linux drm ioctl's
 */

static int
linux_ioctl_drm(struct proc *p, struct linux_ioctl_args *args)
{
	switch (args->cmd & 0xffff) {

	case LINUX_DRM_IOCTL_VERSION:
		args->cmd =3D DRM_IOCTL_VERSION;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_GET_UNIQUE:
		args->cmd =3D DRM_IOCTL_GET_UNIQUE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_GET_MAGIC:
		args->cmd =3D DRM_IOCTL_GET_MAGIC;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_IRQ_BUSID:
		args->cmd =3D DRM_IOCTL_IRQ_BUSID;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_SET_UNIQUE:
		args->cmd =3D DRM_IOCTL_SET_UNIQUE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_AUTH_MAGIC:
		args->cmd =3D DRM_IOCTL_AUTH_MAGIC;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_BLOCK:
		args->cmd =3D DRM_IOCTL_BLOCK;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_UNBLOCK:
		args->cmd =3D DRM_IOCTL_UNBLOCK;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_CONTROL:
		args->cmd =3D DRM_IOCTL_CONTROL;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_ADD_MAP:
		args->cmd =3D DRM_IOCTL_ADD_MAP;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_ADD_BUFS:
		args->cmd =3D DRM_IOCTL_ADD_BUFS;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_MARK_BUFS:
		args->cmd =3D DRM_IOCTL_MARK_BUFS;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_INFO_BUFS:
		args->cmd =3D DRM_IOCTL_INFO_BUFS;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_MAP_BUFS:
		args->cmd =3D DRM_IOCTL_MAP_BUFS;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_FREE_BUFS:
		args->cmd =3D DRM_IOCTL_FREE_BUFS;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_ADD_CTX:
		args->cmd =3D DRM_IOCTL_ADD_CTX;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_RM_CTX:
		args->cmd =3D DRM_IOCTL_RM_CTX;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_MOD_CTX:
		args->cmd =3D DRM_IOCTL_MOD_CTX;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_GET_CTX:
		args->cmd =3D DRM_IOCTL_GET_CTX;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_SWITCH_CTX:
		args->cmd =3D DRM_IOCTL_SWITCH_CTX;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_NEW_CTX:
		args->cmd =3D DRM_IOCTL_NEW_CTX;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_RES_CTX:
		args->cmd =3D DRM_IOCTL_RES_CTX;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_ADD_DRAW:
		args->cmd =3D DRM_IOCTL_ADD_DRAW;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_RM_DRAW:
		args->cmd =3D DRM_IOCTL_RM_DRAW;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_DMA:
		args->cmd =3D DRM_IOCTL_DMA;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_LOCK:
		args->cmd =3D DRM_IOCTL_LOCK;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_UNLOCK:
		args->cmd =3D DRM_IOCTL_UNLOCK;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_FINISH:
		args->cmd =3D DRM_IOCTL_FINISH;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_AGP_ACQUIRE:
		args->cmd =3D DRM_IOCTL_AGP_ACQUIRE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_AGP_RELEASE:
		args->cmd =3D DRM_IOCTL_AGP_RELEASE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_AGP_ENABLE:
		args->cmd =3D DRM_IOCTL_AGP_ENABLE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_AGP_INFO:
		args->cmd =3D DRM_IOCTL_AGP_INFO;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_AGP_ALLOC:
		args->cmd =3D DRM_IOCTL_AGP_ALLOC;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_AGP_FREE:
		args->cmd =3D DRM_IOCTL_AGP_FREE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_AGP_BIND:
		args->cmd =3D DRM_IOCTL_AGP_BIND;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_AGP_UNBIND:
		args->cmd =3D DRM_IOCTL_AGP_UNBIND;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_MGA_INIT:
		args->cmd =3D DRM_IOCTL_MGA_INIT;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_MGA_SWAP:
		args->cmd =3D DRM_IOCTL_MGA_SWAP;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_MGA_CLEAR:
		args->cmd =3D DRM_IOCTL_MGA_CLEAR;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_MGA_ILOAD:
		args->cmd =3D DRM_IOCTL_MGA_ILOAD;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_MGA_VERTEX:
		args->cmd =3D DRM_IOCTL_MGA_VERTEX;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_MGA_FLUSH:
		args->cmd =3D DRM_IOCTL_MGA_FLUSH;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_MGA_INDICES:
		args->cmd =3D DRM_IOCTL_MGA_INDICES;
		return (ioctl(p, (struct ioctl_args *)args));

#if 0
	case LINUX_DRM_IOCTL_MGA_SOMETHING:
		args->cmd =3D DRM_IOCTL_MGA_SOMETHING;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_I810_INIT:
		args->cmd =3D DRM_IOCTL_I810_INIT;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_I810_VERTEX:
		args->cmd =3D DRM_IOCTL_I810_VERTEX;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_I810_CLEAR:
		args->cmd =3D DRM_IOCTL_I810_CLEAR;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_I810_FLUSH:
		args->cmd =3D DRM_IOCTL_I810_FLUSH;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_I810_GETAGE:
		args->cmd =3D DRM_IOCTL_I810_GETAGE;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_I810_GETBUF:
		args->cmd =3D DRM_IOCTL_I810_GETBUF;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_I810_SWAP:
		args->cmd =3D DRM_IOCTL_I810_SWAP;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_R128_INIT:
		args->cmd =3D DRM_IOCTL_R128_INIT;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_R128_RESET:
		args->cmd =3D DRM_IOCTL_R128_RESET;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_R128_FLUSH:
		args->cmd =3D DRM_IOCTL_R128_FLUSH;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_R128_CCEID:
		args->cmd =3D DRM_IOCTL_R128_CCEID;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_R128_PACKET:
		args->cmd =3D DRM_IOCTL_R128_PACKET;
		return (ioctl(p, (struct ioctl_args *)args));

	case LINUX_DRM_IOCTL_R128_VERTEX:
		args->cmd =3D DRM_IOCTL_R128_VERTEX;
		return (ioctl(p, (struct ioctl_args *)args));

#endif
	}
	return (ENOIOCTL);
}
/*
 * main ioctl syscall function
 */

int
linux_ioctl(struct proc *p, struct linux_ioctl_args *args)
{
	struct filedesc *fdp =3D p->p_fd;
	struct file *fp;
	struct handler_element *he;
	int error, cmd;

#ifdef DEBUG
	printf("Linux-emul(%ld): ioctl(%d, %04lx, *)\n", (long)p->p_pid,
	    args->fd, args->cmd);
#endif

	if ((unsigned)args->fd >=3D fdp->fd_nfiles)
		return (EBADF);

	fp =3D fdp->fd_ofiles[args->fd];
	if (fp =3D=3D NULL || (fp->f_flag & (FREAD|FWRITE)) =3D=3D 0)
		return (EBADF);

	/* Iterate over the ioctl handlers */
	cmd =3D args->cmd & 0xffff;
	TAILQ_FOREACH(he, &handlers, list) {
		if (cmd >=3D he->low && cmd <=3D he->high) {
			error =3D (*he->func)(p, args);
			if (error !=3D ENOIOCTL)
				return (error);
		}
	}

	printf("linux: 'ioctl' fd=3D%d, cmd=3D%x ('%c',%d) not implemented\n",
	    args->fd, (int)(args->cmd & 0xffff),
	    (int)(args->cmd & 0xff00) >> 8, (int)(args->cmd & 0xff));

	return (EINVAL);
}

int
linux_ioctl_register_handler(struct linux_ioctl_handler *h)
{
	struct handler_element *he, *cur;

	if (h =3D=3D NULL || h->func =3D=3D NULL)
		return (EINVAL);

	/*
	 * Reuse the element if the handler is already on the list, otherwise
	 * create a new element.
	 */
	TAILQ_FOREACH(he, &handlers, list) {
		if (he->func =3D=3D h->func)
			break;
	}
	if (he =3D=3D NULL) {
		MALLOC(he, struct handler_element *, sizeof(*he),
		    M_LINUX, M_WAITOK);
		he->func =3D h->func;
	} else
		TAILQ_REMOVE(&handlers, he, list);
	=

	/* Initialize range information. */
	he->low =3D h->low;
	he->high =3D h->high;
	he->span =3D h->high - h->low + 1;

	/* Add the element to the list, sorted on span. */
	TAILQ_FOREACH(cur, &handlers, list) {
		if (cur->span > he->span) {
			TAILQ_INSERT_BEFORE(cur, he, list);
			return (0);
		}
	}
	TAILQ_INSERT_TAIL(&handlers, he, list);

	return (0);
}

int
linux_ioctl_unregister_handler(struct linux_ioctl_handler *h)
{
	struct handler_element *he;

	if (h =3D=3D NULL || h->func =3D=3D NULL)
		return (EINVAL);

	TAILQ_FOREACH(he, &handlers, list) {
		if (he->func =3D=3D h->func) {
			TAILQ_REMOVE(&handlers, he, list);
			FREE(he, M_LINUX);
			return (0);
		}
	}

	return (EINVAL);
}

int
linux_ioctl_register_handlers(struct linker_set *s)
{
	int error, i;

	if (s =3D=3D NULL)
		return (EINVAL);

	for (i =3D 0; i < s->ls_length; i++) {
		error =3D linux_ioctl_register_handler(s->ls_items[i]);
		if (error)
			return (error);
	}

	return (0);
}

int
linux_ioctl_unregister_handlers(struct linker_set *s)
{
	int error, i;

	if (s =3D=3D NULL)
		return (EINVAL);

	for (i =3D 0; i < s->ls_length; i++) {
		error =3D linux_ioctl_unregister_handler(s->ls_items[i]);
		if (error)
			return (error);
	}

	return (0);
}

--==_Exmh_-15466650710
Content-Type: text/plain ; name="linux_ioctl.h"; charset=iso-8859-1
Content-Description: linux_ioctl.h
Content-Disposition: attachment; filename="linux_ioctl.h"
Content-Transfer-Encoding: quoted-printable

/*-
 * Copyright (c) 1999 Marcel Moolenaar
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer =

 *    in this position and unchanged.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the=

 *    documentation and/or other materials provided with the distribution=
=2E
 * 3. The name of the author may not be used to endorse or promote produc=
ts
 *    derived from this software without specific prior written permissio=
n.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANT=
IES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED=
=2E
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, B=
UT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF U=
SE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE =
OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * $FreeBSD: src/sys/compat/linux/linux_ioctl.h,v 1.4 2000/08/25 07:31:13=
 marcel Exp $
 */

#ifndef _LINUX_IOCTL_H_
#define	_LINUX_IOCTL_H_

/*
 * disk
 */
#define	LINUX_BLKROSET		0x125d
#define	LINUX_BLKROGET		0x125e
#define	LINUX_BLKRRPART		0x125f
#define	LINUX_BLKGETSIZE	0x1260
#define	LINUX_BLKFLSBUF		0x1261
#define	LINUX_BLKRASET		0x1262
#define	LINUX_BLKRAGET		0x1263
#define	LINUX_BLKFRASET		0x1264
#define	LINUX_BLKFRAGET		0x1265
#define	LINUX_BLKSECTSET	0x1266
#define	LINUX_BLKSECTGET	0x1267
#define	LINUX_BLKSSZGET		0x1268

#define	LINUX_IOCTL_DISK_MIN	LINUX_BLKROSET
#define	LINUX_IOCTL_DISK_MAX	LINUX_BLKSSZGET

/*
 * cdrom
 */
#define	LINUX_CDROMPAUSE	0x5301 =

#define	LINUX_CDROMRESUME	0x5302
#define	LINUX_CDROMPLAYMSF	0x5303
#define	LINUX_CDROMPLAYTRKIND	0x5304
#define	LINUX_CDROMREADTOCHDR	0x5305
#define	LINUX_CDROMREADTOCENTRY	0x5306
#define	LINUX_CDROMSTOP		0x5307
#define	LINUX_CDROMSTART	0x5308
#define	LINUX_CDROMEJECT	0x5309
#define	LINUX_CDROMVOLCTRL	0x530a
#define	LINUX_CDROMSUBCHNL	0x530b
#define	LINUX_CDROMREADMODE2	0x530c
#define	LINUX_CDROMREADMODE1	0x530d
#define	LINUX_CDROMREADAUDIO	0x530e
#define	LINUX_CDROMEJECT_SW	0x530f
#define	LINUX_CDROMMULTISESSION	0x5310
#define	LINUX_CDROM_GET_UPC	0x5311
#define	LINUX_CDROMRESET	0x5312
#define	LINUX_CDROMVOLREAD	0x5313
#define	LINUX_CDROMREADRAW	0x5314
#define	LINUX_CDROMREADCOOKED	0x5315
#define	LINUX_CDROMSEEK		0x5316
#define	LINUX_CDROMPLAYBLK	0x5317
#define	LINUX_CDROMREADALL	0x5318
#define	LINUX_CDROMCLOSETRAY	0x5319
#define	LINUX_CDROMLOADFROMSLOT	0x531a

#define	LINUX_IOCTL_CDROM_MIN	LINUX_CDROMPAUSE
#define	LINUX_IOCTL_CDROM_MAX	LINUX_CDROMLOADFROMSLOT

#define	LINUX_CDROM_LBA		0x01
#define	LINUX_CDROM_MSF		0x02

/*
 * console
 */
#define	LINUX_KIOCSOUND		0x4B2F
#define	LINUX_KDMKTONE		0x4B30
#define	LINUX_KDGETLED		0x4B31
#define	LINUX_KDSETLED		0x4B32
#define	LINUX_KDSETMODE		0x4B3A
#define	LINUX_KDGETMODE		0x4B3B
#define	LINUX_KDGKBMODE		0x4B44
#define	LINUX_KDSKBMODE		0x4B45
#define	LINUX_VT_OPENQRY	0x5600
#define	LINUX_VT_GETMODE	0x5601
#define	LINUX_VT_SETMODE	0x5602
#define	LINUX_VT_GETSTATE	0x5603
#define	LINUX_VT_RELDISP	0x5605
#define	LINUX_VT_ACTIVATE	0x5606  =

#define	LINUX_VT_WAITACTIVE	0x5607

#define	LINUX_IOCTL_CONSOLE_MIN	LINUX_KIOCSOUND
#define	LINUX_IOCTL_CONSOLE_MAX	LINUX_VT_WAITACTIVE

#define	LINUX_LED_SCR		0x01
#define	LINUX_LED_NUM		0x02
#define	LINUX_LED_CAP		0x04

#define	LINUX_KD_TEXT		0x0
#define	LINUX_KD_GRAPHICS	0x1
#define	LINUX_KD_TEXT0		0x2
#define	LINUX_KD_TEXT1		0x3

#define	LINUX_KBD_RAW		0
#define	LINUX_KBD_XLATE		1
#define	LINUX_KBD_MEDIUMRAW	2

/*
 * socket
 */
#define	LINUX_FIOSETOWN		0x8901
#define	LINUX_SIOCSPGRP		0x8902
#define	LINUX_FIOGETOWN		0x8903
#define	LINUX_SIOCGPGRP		0x8904
#define	LINUX_SIOCATMARK	0x8905
#define	LINUX_SIOCGSTAMP	0x8906
#define	LINUX_SIOCGIFCONF	0x8912
#define	LINUX_SIOCGIFFLAGS	0x8913
#define	LINUX_SIOCGIFADDR	0x8915
#define	LINUX_SIOCGIFDSTADDR	0x8917
#define	LINUX_SIOCGIFBRDADDR	0x8919
#define	LINUX_SIOCGIFNETMASK	0x891b
#define	LINUX_SIOCGIFHWADDR	0x8927
#define	LINUX_SIOCADDMULTI	0x8931
#define	LINUX_SIOCDELMULTI	0x8932

#define	LINUX_IOCTL_SOCKET_MIN	LINUX_FIOSETOWN
#define	LINUX_IOCTL_SOCKET_MAX	LINUX_SIOCDELMULTI

/*
 * sound
 */
#define	LINUX_SOUND_MIXER_WRITE_VOLUME	0x4d00
#define	LINUX_SOUND_MIXER_WRITE_BASS	0x4d01
#define	LINUX_SOUND_MIXER_WRITE_TREBLE	0x4d02
#define	LINUX_SOUND_MIXER_WRITE_SYNTH	0x4d03
#define	LINUX_SOUND_MIXER_WRITE_PCM	0x4d04
#define	LINUX_SOUND_MIXER_WRITE_SPEAKER	0x4d05
#define	LINUX_SOUND_MIXER_WRITE_LINE	0x4d06
#define	LINUX_SOUND_MIXER_WRITE_MIC	0x4d07
#define	LINUX_SOUND_MIXER_WRITE_CD	0x4d08
#define	LINUX_SOUND_MIXER_WRITE_IMIX	0x4d09
#define	LINUX_SOUND_MIXER_WRITE_ALTPCM	0x4d0A
#define	LINUX_SOUND_MIXER_WRITE_RECLEV	0x4d0B
#define	LINUX_SOUND_MIXER_WRITE_IGAIN	0x4d0C
#define	LINUX_SOUND_MIXER_WRITE_OGAIN	0x4d0D
#define	LINUX_SOUND_MIXER_WRITE_LINE1	0x4d0E
#define	LINUX_SOUND_MIXER_WRITE_LINE2	0x4d0F
#define	LINUX_SOUND_MIXER_WRITE_LINE3	0x4d10
#define	LINUX_OSS_GETVERSION		0x4d76
#define	LINUX_SOUND_MIXER_READ_DEVMASK	0x4dfe
#define	LINUX_SNDCTL_DSP_RESET		0x5000
#define	LINUX_SNDCTL_DSP_SYNC		0x5001
#define	LINUX_SNDCTL_DSP_SPEED		0x5002
#define	LINUX_SNDCTL_DSP_STEREO		0x5003
#define	LINUX_SNDCTL_DSP_GETBLKSIZE	0x5004
#define	LINUX_SNDCTL_DSP_SETBLKSIZE	LINUX_SNDCTL_DSP_GETBLKSIZE
#define	LINUX_SNDCTL_DSP_SETFMT		0x5005
#define	LINUX_SOUND_PCM_WRITE_CHANNELS	0x5006
#define	LINUX_SOUND_PCM_WRITE_FILTER	0x5007
#define	LINUX_SNDCTL_DSP_POST		0x5008
#define	LINUX_SNDCTL_DSP_SUBDIVIDE	0x5009
#define	LINUX_SNDCTL_DSP_SETFRAGMENT	0x500A
#define	LINUX_SNDCTL_DSP_GETFMTS	0x500B
#define	LINUX_SNDCTL_DSP_GETOSPACE	0x500C
#define	LINUX_SNDCTL_DSP_GETISPACE	0x500D
#define	LINUX_SNDCTL_DSP_NONBLOCK	0x500E
#define	LINUX_SNDCTL_DSP_GETCAPS	0x500F
#define	LINUX_SNDCTL_DSP_GETTRIGGER	0x5010
#define	LINUX_SNDCTL_DSP_SETTRIGGER	LINUX_SNDCTL_DSP_GETTRIGGER
#define	LINUX_SNDCTL_DSP_GETIPTR	0x5011
#define	LINUX_SNDCTL_DSP_GETOPTR	0x5012
#define	LINUX_SNDCTL_DSP_GETODELAY	0x5017
#define	LINUX_SNDCTL_SEQ_RESET		0x5100
#define	LINUX_SNDCTL_SEQ_SYNC		0x5101
#define	LINUX_SNDCTL_SYNTH_INFO		0x5102
#define	LINUX_SNDCTL_SEQ_CTRLRATE	0x5103
#define	LINUX_SNDCTL_SEQ_GETOUTCOUNT	0x5104
#define	LINUX_SNDCTL_SEQ_GETINCOUNT	0x5105
#define	LINUX_SNDCTL_SEQ_PERCMODE	0x5106
#define	LINUX_SNDCTL_FM_LOAD_INSTR	0x5107
#define	LINUX_SNDCTL_SEQ_TESTMIDI	0x5108
#define	LINUX_SNDCTL_SEQ_RESETSAMPLES	0x5109
#define	LINUX_SNDCTL_SEQ_NRSYNTHS	0x510A
#define	LINUX_SNDCTL_SEQ_NRMIDIS	0x510B
#define	LINUX_SNDCTL_MIDI_INFO		0x510C
#define	LINUX_SNDCTL_SEQ_TRESHOLD	0x510D
#define	LINUX_SNDCTL_SYNTH_MEMAVL	0x510E

#define	LINUX_IOCTL_SOUND_MIN	LINUX_SOUND_MIXER_WRITE_VOLUME
#define	LINUX_IOCTL_SOUND_MAX	LINUX_SNDCTL_SYNTH_MEMAVL

/*
 * termio
 */
#define	LINUX_TCGETS		0x5401
#define	LINUX_TCSETS		0x5402
#define	LINUX_TCSETSW		0x5403
#define	LINUX_TCSETSF		0x5404
#define	LINUX_TCGETA		0x5405
#define	LINUX_TCSETA		0x5406
#define	LINUX_TCSETAW		0x5407
#define	LINUX_TCSETAF		0x5408
#define	LINUX_TCSBRK		0x5409
#define	LINUX_TCXONC		0x540A
#define	LINUX_TCFLSH		0x540B
#define	LINUX_TIOCEXCL		0x540C
#define	LINUX_TIOCNXCL		0x540D
#define	LINUX_TIOCSCTTY		0x540E
#define	LINUX_TIOCGPGRP		0x540F
#define	LINUX_TIOCSPGRP		0x5410
#define	LINUX_TIOCOUTQ		0x5411
#define	LINUX_TIOCSTI		0x5412
#define	LINUX_TIOCGWINSZ	0x5413
#define	LINUX_TIOCSWINSZ	0x5414
#define	LINUX_TIOCMGET		0x5415
#define	LINUX_TIOCMBIS		0x5416
#define	LINUX_TIOCMBIC		0x5417
#define	LINUX_TIOCMSET		0x5418
#define	LINUX_TIOCGSOFTCAR	0x5419
#define	LINUX_TIOCSSOFTCAR	0x541A
#define	LINUX_FIONREAD		0x541B
#define	LINUX_TIOCINQ		FIONREAD
#define	LINUX_TIOCLINUX		0x541C
#define	LINUX_TIOCCONS		0x541D
#define	LINUX_TIOCGSERIAL	0x541E
#define	LINUX_TIOCSSERIAL	0x541F
#define	LINUX_TIOCPKT		0x5420
#define	LINUX_FIONBIO		0x5421
#define	LINUX_TIOCNOTTY		0x5422
#define	LINUX_TIOCSETD		0x5423
#define	LINUX_TIOCGETD		0x5424
#define	LINUX_TCSBRKP		0x5425
#define	LINUX_TIOCTTYGSTRUCT	0x5426
#define	LINUX_FIONCLEX		0x5450
#define	LINUX_FIOCLEX		0x5451
#define	LINUX_FIOASYNC		0x5452
#define	LINUX_TIOCSERCONFIG	0x5453
#define	LINUX_TIOCSERGWILD	0x5454
#define	LINUX_TIOCSERSWILD	0x5455
#define	LINUX_TIOCGLCKTRMIOS	0x5456
#define	LINUX_TIOCSLCKTRMIOS	0x5457

#define	LINUX_IOCTL_TERMIO_MIN	LINUX_TCGETS
#define	LINUX_IOCTL_TERMIO_MAX	LINUX_TIOCSLCKTRMIOS

/* arguments for tcflow() and LINUX_TCXONC */
#define	LINUX_TCOOFF		0
#define	LINUX_TCOON		1
#define	LINUX_TCIOFF		2
#define	LINUX_TCION		3

/* arguments for tcflush() and LINUX_TCFLSH */
#define	LINUX_TCIFLUSH		0
#define	LINUX_TCOFLUSH		1
#define	LINUX_TCIOFLUSH		2

/* line disciplines */
#define	LINUX_N_TTY		0
#define	LINUX_N_SLIP		1
#define	LINUX_N_MOUSE		2
#define	LINUX_N_PPP		3

/* Linux termio c_cc values */
#define	LINUX_VINTR		0
#define	LINUX_VQUIT		1
#define	LINUX_VERASE		2
#define	LINUX_VKILL		3
#define	LINUX_VEOF		4
#define	LINUX_VTIME		5
#define	LINUX_VMIN		6
#define	LINUX_VSWTC		7
#define	LINUX_NCC		8

/* Linux termios c_cc values */
#define	LINUX_VSTART		8
#define	LINUX_VSTOP		9
#define	LINUX_VSUSP 		10
#define	LINUX_VEOL		11
#define	LINUX_VREPRINT		12
#define	LINUX_VDISCARD		13
#define	LINUX_VWERASE		14
#define	LINUX_VLNEXT		15
#define	LINUX_VEOL2		16
#define	LINUX_NCCS		19

#define	LINUX_POSIX_VDISABLE	'\0'

/* Linux c_iflag masks */
#define	LINUX_IGNBRK		0x0000001
#define	LINUX_BRKINT		0x0000002
#define	LINUX_IGNPAR		0x0000004
#define	LINUX_PARMRK		0x0000008
#define	LINUX_INPCK		0x0000010
#define	LINUX_ISTRIP		0x0000020
#define	LINUX_INLCR		0x0000040
#define	LINUX_IGNCR		0x0000080
#define	LINUX_ICRNL		0x0000100
#define	LINUX_IUCLC		0x0000200
#define	LINUX_IXON		0x0000400
#define	LINUX_IXANY		0x0000800
#define	LINUX_IXOFF		0x0001000
#define	LINUX_IMAXBEL		0x0002000

/* Linux c_oflag masks */
#define	LINUX_OPOST		0x0000001
#define	LINUX_OLCUC		0x0000002
#define	LINUX_ONLCR		0x0000004
#define	LINUX_OCRNL		0x0000008
#define	LINUX_ONOCR		0x0000010
#define	LINUX_ONLRET		0x0000020
#define	LINUX_OFILL		0x0000040
#define	LINUX_OFDEL		0x0000080
#define	LINUX_NLDLY		0x0000100

#define	LINUX_NL0		0x0000000
#define	LINUX_NL1		0x0000100
#define	LINUX_CRDLY		0x0000600
#define	LINUX_CR0		0x0000000
#define	LINUX_CR1		0x0000200
#define	LINUX_CR2		0x0000400
#define	LINUX_CR3		0x0000600
#define	LINUX_TABDLY		0x0001800
#define	LINUX_TAB0		0x0000000
#define	LINUX_TAB1		0x0000800
#define	LINUX_TAB2		0x0001000
#define	LINUX_TAB3		0x0001800
#define	LINUX_XTABS		0x0001800
#define	LINUX_BSDLY		0x0002000
#define	LINUX_BS0		0x0000000
#define	LINUX_BS1		0x0002000
#define	LINUX_VTDLY		0x0004000
#define	LINUX_VT0		0x0000000
#define	LINUX_VT1		0x0004000
#define	LINUX_FFDLY		0x0008000
#define	LINUX_FF0		0x0000000
#define	LINUX_FF1		0x0008000

#define	LINUX_CBAUD		0x0000100f
#define	LINUX_B0		0x00000000
#define	LINUX_B50		0x00000001
#define	LINUX_B75		0x00000002
#define	LINUX_B110		0x00000003
#define	LINUX_B134		0x00000004
#define	LINUX_B150		0x00000005
#define	LINUX_B200		0x00000006
#define	LINUX_B300		0x00000007
#define	LINUX_B600		0x00000008
#define	LINUX_B1200		0x00000009
#define	LINUX_B1800		0x0000000a
#define	LINUX_B2400		0x0000000b
#define	LINUX_B4800		0x0000000c
#define	LINUX_B9600		0x0000000d
#define	LINUX_B19200		0x0000000e
#define	LINUX_B38400		0x0000000f
#define	LINUX_EXTA		LINUX_B19200
#define	LINUX_EXTB		LINUX_B38400
#define	LINUX_CBAUDEX		0x00001000
#define	LINUX_B57600		0x00001001
#define	LINUX_B115200		0x00001002

#define	LINUX_CSIZE		0x00000030
#define	LINUX_CS5		0x00000000
#define	LINUX_CS6		0x00000010
#define	LINUX_CS7		0x00000020
#define	LINUX_CS8		0x00000030
#define	LINUX_CSTOPB		0x00000040
#define	LINUX_CREAD		0x00000080
#define	LINUX_PARENB		0x00000100
#define	LINUX_PARODD		0x00000200
#define	LINUX_HUPCL		0x00000400
#define	LINUX_CLOCAL		0x00000800
#define	LINUX_CRTSCTS		0x80000000

/* Linux c_lflag masks */
#define	LINUX_ISIG		0x00000001
#define	LINUX_ICANON		0x00000002
#define	LINUX_XCASE		0x00000004
#define	LINUX_ECHO		0x00000008
#define	LINUX_ECHOE		0x00000010
#define	LINUX_ECHOK		0x00000020
#define	LINUX_ECHONL		0x00000040
#define	LINUX_NOFLSH		0x00000080
#define	LINUX_TOSTOP		0x00000100
#define	LINUX_ECHOCTL		0x00000200
#define	LINUX_ECHOPRT		0x00000400
#define	LINUX_ECHOKE		0x00000800
#define	LINUX_FLUSHO		0x00001000
#define	LINUX_PENDIN		0x00002000
#define	LINUX_IEXTEN		0x00008000

/* serial_struct values for TIOC[GS]SERIAL ioctls */
#define	LINUX_ASYNC_CLOSING_WAIT_INF  0
#define	LINUX_ASYNC_CLOSING_WAIT_NONE 65535

#define	LINUX_PORT_UNKNOWN	0
#define	LINUX_PORT_8250		1
#define	LINUX_PORT_16450	2
#define	LINUX_PORT_16550	3
#define	LINUX_PORT_16550A	4
#define	LINUX_PORT_CIRRUS	5
#define	LINUX_PORT_16650	6

#define	LINUX_PORT_MAX		6

#define	LINUX_ASYNC_HUP_NOTIFY		0x0001
#define	LINUX_ASYNC_FOURPORT		0x0002
#define	LINUX_ASYNC_SAK			0x0004
#define	LINUX_ASYNC_SPLIT_TERMIOS	0x0008
#define	LINUX_ASYNC_SPD_MASK		0x0030
#define	LINUX_ASYNC_SPD_HI		0x0010
#define	LINUX_ASYNC_SPD_VHI		0x0020
#define	LINUX_ASYNC_SPD_CUST		0x0030
#define	LINUX_ASYNC_SKIP_TEST		0x0040
#define	LINUX_ASYNC_AUTO_IRQ		0x0080
#define	LINUX_ASYNC_SESSION_LOCKOUT	0x0100
#define	LINUX_ASYNC_PGRP_LOCKOUT	0x0200
#define	LINUX_ASYNC_CALLOUT_NOHUP	0x0400
#define	LINUX_ASYNC_FLAGS		0x0FFF

/* XFree86 4.0.x DRI support */

#define	LINUX_DRM_IOCTL_VERSION      	0x6400
#define	LINUX_DRM_IOCTL_GET_UNIQUE   	0x6401
#define	LINUX_DRM_IOCTL_GET_MAGIC    	0x6402
#define	LINUX_DRM_IOCTL_IRQ_BUSID    	0x6403
#define	LINUX_DRM_IOCTL_SET_UNIQUE   	0x6410
#define	LINUX_DRM_IOCTL_AUTH_MAGIC   	0x6411
#define	LINUX_DRM_IOCTL_BLOCK        	0x6412
#define	LINUX_DRM_IOCTL_UNBLOCK      	0x6413
#define	LINUX_DRM_IOCTL_CONTROL      	0x6414
#define	LINUX_DRM_IOCTL_ADD_MAP      	0x6415
#define	LINUX_DRM_IOCTL_ADD_BUFS     	0x6416
#define	LINUX_DRM_IOCTL_MARK_BUFS    	0x6417
#define	LINUX_DRM_IOCTL_INFO_BUFS    	0x6418
#define	LINUX_DRM_IOCTL_MAP_BUFS     	0x6419
#define	LINUX_DRM_IOCTL_FREE_BUFS    	0x641a
#define	LINUX_DRM_IOCTL_ADD_CTX      	0x6420
#define	LINUX_DRM_IOCTL_RM_CTX       	0x6421
#define	LINUX_DRM_IOCTL_MOD_CTX      	0x6422
#define	LINUX_DRM_IOCTL_GET_CTX      	0x6423
#define	LINUX_DRM_IOCTL_SWITCH_CTX   	0x6424
#define	LINUX_DRM_IOCTL_NEW_CTX      	0x6425
#define	LINUX_DRM_IOCTL_RES_CTX      	0x6426
#define	LINUX_DRM_IOCTL_ADD_DRAW     	0x6427
#define	LINUX_DRM_IOCTL_RM_DRAW      	0x6428
#define	LINUX_DRM_IOCTL_DMA          	0x6429
#define	LINUX_DRM_IOCTL_LOCK         	0x642a
#define	LINUX_DRM_IOCTL_UNLOCK       	0x642b
#define	LINUX_DRM_IOCTL_FINISH       	0x642c
/* dri/agp ioctls */
#define	LINUX_DRM_IOCTL_AGP_ACQUIRE  	0x6430
#define	LINUX_DRM_IOCTL_AGP_RELEASE  	0x6431
#define	LINUX_DRM_IOCTL_AGP_ENABLE   	0x6432
#define	LINUX_DRM_IOCTL_AGP_INFO     	0x6433
#define	LINUX_DRM_IOCTL_AGP_ALLOC    	0x6434
#define	LINUX_DRM_IOCTL_AGP_FREE     	0x6435
#define	LINUX_DRM_IOCTL_AGP_BIND     	0x6436
#define	LINUX_DRM_IOCTL_AGP_UNBIND   	0x6437
/*	mga G400 specific ioctls */
#define LINUX_DRM_IOCTL_MGA_INIT	0x6440
#define	LINUX_DRM_IOCTL_MGA_SWAP	0x6441
#define	LINUX_DRM_IOCTL_MGA_CLEAR	0x6442
#define	LINUX_DRM_IOCTL_MGA_ILOAD	0x6443
#define	LINUX_DRM_IOCTL_MGA_VERTEX	0x6444
#define	LINUX_DRM_IOCTL_MGA_FLUSH	0x6445
#define	LINUX_DRM_IOCTL_MGA_INDICES	0x6446
#define	LINUX_DRM_IOCTL_MGA_SOMETHING	0x6447

/*	I810 specific ioctls */
#define	LINUX_DRM_IOCTL_I810_INIT	0x6440
#define	LINUX_DRM_IOCTL_I810_VERTEX	0x6441
#define	LINUX_DRM_IOCTL_I810_CLEAR	0x6442
#define	LINUX_DRM_IOCTL_I810_FLUSH	0x6443
#define	LINUX_DRM_IOCTL_I810_GETAGE	0x6444
#define	LINUX_DRM_IOCTL_I810_GETBUF	0x6445
#define	LINUX_DRM_IOCTL_I810_SWAP	0x6446

/*	Rage 128 specific ioctls */
#define	LINUX_DRM_IOCTL_R128_INIT	0x6440
#define	LINUX_DRM_IOCTL_R128_RESET	0x6441
#define	LINUX_DRM_IOCTL_R128_FLUSH	0x6442
#define	LINUX_DRM_IOCTL_R128_CCEID	0x6443
#define	LINUX_DRM_IOCTL_R128_PACKET	0x6444
#define	LINUX_DRM_IOCTL_R128_VERTEX	0x6445

/* card specific ioctls may increase the DRM_MAX */
#define  LINUX_IOCTL_DRM_MIN		LINUX_DRM_IOCTL_VERSION
#define  LINUX_IOCTL_DRM_MAX		LINUX_DRM_IOCTL_MGA_SOMETHING

#endif /* !_LINUX_IOCTL_H_ */

--==_Exmh_-15466650710
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

  The views expressed above are not those of PGS Tensor.

    "We've heard that a million monkeys at a million keyboards could prod=
uce
     the Complete Works of Shakespeare; now, thanks to the Internet, we k=
now
     this is not true."            Robert Wilensky, University of Califor=
nia

--==_Exmh_-15466650710--




To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-multimedia" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200011230505.eAN553G15445>