summaryrefslogtreecommitdiffstats
path: root/sys/i386/linux
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1996-03-10 22:30:53 +0000
committerpeter <peter@FreeBSD.org>1996-03-10 22:30:53 +0000
commitc1675b084754e256319f785cbcf1445b51e10acc (patch)
tree416ff8e3674aa4fc3d27ecc7db6156e563938c9d /sys/i386/linux
parentf7d16bb60b381a2f1ae4e1d204eec150ec5dbb4a (diff)
downloadFreeBSD-src-c1675b084754e256319f785cbcf1445b51e10acc.zip
FreeBSD-src-c1675b084754e256319f785cbcf1445b51e10acc.tar.gz
Implement rudumentry support for the linux TIOC[SG]ETSERIAL ioctl's.
To complete this, some extra state has to be kept somewhere so that the B38400 flag in Linux can be correctly translated to/from either 38400, 57600 or 115200. Submitted by: Robert Sanders <rsanders@mindspring.com>
Diffstat (limited to 'sys/i386/linux')
-rw-r--r--sys/i386/linux/linux.h36
-rw-r--r--sys/i386/linux/linux_ioctl.c63
2 files changed, 97 insertions, 2 deletions
diff --git a/sys/i386/linux/linux.h b/sys/i386/linux/linux.h
index cf97265..8372f4a 100644
--- a/sys/i386/linux/linux.h
+++ b/sys/i386/linux/linux.h
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: linux.h,v 1.6 1996/03/03 19:07:49 peter Exp $
+ * $Id: linux.h,v 1.7 1996/03/10 08:42:47 sos Exp $
*/
#ifndef _I386_LINUX_LINUX_H_
@@ -215,6 +215,11 @@ struct trapframe;
#define LINUX_TIOCGLCKTRMIOS 0x5456
#define LINUX_TIOCSLCKTRMIOS 0x5457
+/* 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
@@ -488,4 +493,33 @@ struct trapframe;
#define LINUX_SIOCADDMULTI 0x8931
#define LINUX_SIOCDELMULTI 0x8932
+/* 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
+
+
#endif /* !_I386_LINUX_LINUX_H_ */
diff --git a/sys/i386/linux/linux_ioctl.c b/sys/i386/linux/linux_ioctl.c
index 1dea454..9c9c668 100644
--- a/sys/i386/linux/linux_ioctl.c
+++ b/sys/i386/linux/linux_ioctl.c
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: linux_ioctl.c,v 1.7 1996/03/03 19:07:50 peter Exp $
+ * $Id: linux_ioctl.c,v 1.8 1996/03/04 11:15:19 peter Exp $
*/
#include <sys/param.h>
@@ -82,6 +82,24 @@ static struct speedtab sptab[] = {
{ 57600, 4097 }, { 115200, 4098 }, {-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)
{
@@ -411,6 +429,23 @@ linux_to_bsd_termio(struct linux_termio *linux_termio,
linux_to_bsd_termios(&tmios, bsd_termios);
}
+static void
+linux_tiocgserial(struct file *fp, struct linux_serial_struct *lss)
+{
+ if (!fp || !lss)
+ return;
+
+ lss->type = LINUX_PORT_16550A;
+ lss->flags = 0;
+ lss->close_delay = 0;
+}
+
+static void
+linux_tiocsserial(struct file *fp, struct linux_serial_struct *lss)
+{
+ if (!fp || !lss)
+ return;
+}
int
linux_ioctl(struct proc *p, struct linux_ioctl_args *args, int *retval)
@@ -658,6 +693,32 @@ linux_ioctl(struct proc *p, struct linux_ioctl_args *args, int *retval)
case LINUX_SNDCTL_DSP_NONBLOCK:
args->cmd = SNDCTL_DSP_NONBLOCK;
return ioctl(p, (struct ioctl_args *)args, retval);
+
+ case LINUX_TIOCGSERIAL:
+ linux_tiocgserial(fp, (struct linux_serial_struct *)args->arg);
+ return 0;
+
+ case LINUX_TIOCSSERIAL:
+ linux_tiocsserial(fp, (struct linux_serial_struct *)args->arg);
+ return 0;
+
+ case LINUX_TCFLSH:
+ args->cmd = TIOCFLUSH;
+ switch (args->arg) {
+ case LINUX_TCIFLUSH:
+ args->arg = FREAD;
+ break;
+ case LINUX_TCOFLUSH:
+ args->arg = FWRITE;
+ break;
+ case LINUX_TCIOFLUSH:
+ args->arg = FREAD | FWRITE;
+ break;
+ default:
+ return EINVAL;
+ }
+ return ioctl(p, (struct ioctl_args *)args, retval);
+
}
uprintf("LINUX: 'ioctl' fd=%d, typ=0x%x(%c), num=0x%x not implemented\n",
args->fd, (args->cmd&0xffff00)>>8,
OpenPOWER on IntegriCloud