From 0f36c087487a152fa74867156a7d49ed688a12cd Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 2 Jun 2008 11:20:34 +0100 Subject: [PATCH] CHR_IOCTL_SERIAL_{GET,SET}_TIOCM Remaining fragments of xen-unstable c/s 16537:bf21e00155b7dd76653c5340099ecedac7a7de08 [QEMU-DM] Modem control line & msl/mcr register support. This patch enables handling of the modem/flow control lines of a serial port when the backend for the virtual port is a physical serial port. During initialization, it tries to load the msr with the detected status from the real port (this is consistent with physical uart, which starts with its msr values set according to the status of the modem status lines). If the ioctl returns -ENOTSUP, then the code assumes the backend is not a real serial port and will disable any further attempts to manipulate or read the physical port's line status. It's tries to be as "correct" as possible in its msr/msl handling, with the exception of modem line status change interrupts. A real 16550 uart apparently have a delay time of 250ns between when a modem status line changes and the IRQ line goes high. In this patch, an "idle" port is polled for line status changes only if the guest has enabled UART_IER_MSI is enabled, and only polled every 10 ms. Signed-off-by: Trolle Selander --- qemu-char.h | 3 +++ vl.c | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/qemu-char.h b/qemu-char.h index 29de03df..41936bc9 100644 --- a/qemu-char.h +++ b/qemu-char.h @@ -28,6 +28,9 @@ typedef struct { #define CHR_IOCTL_PP_EPP_WRITE_ADDR 10 #define CHR_IOCTL_PP_EPP_WRITE 11 +#define CHR_IOCTL_SERIAL_SET_TIOCM 12 +#define CHR_IOCTL_SERIAL_GET_TIOCM 13 + typedef void IOEventHandler(void *opaque, int event); struct CharDriverState { diff --git a/vl.c b/vl.c index 6e437a4d..2057917c 100644 --- a/vl.c +++ b/vl.c @@ -2445,6 +2445,16 @@ static int tty_serial_ioctl(CharDriverState *chr, int cmd, void *arg) tcsendbreak(s->fd_in, 1); } break; + case CHR_IOCTL_SERIAL_GET_TIOCM: + { + ioctl(s->fd_in, TIOCMGET, arg); + } + break; + case CHR_IOCTL_SERIAL_SET_TIOCM: + { + ioctl(s->fd_in, TIOCMSET, arg); + } + break; default: return -ENOTSUP; } -- 2.39.5