From: Ian Jackson Date: Mon, 2 Jun 2008 10:20:34 +0000 (+0100) Subject: CHR_IOCTL_SERIAL_{GET,SET}_TIOCM X-Git-Tag: xen-3.3.0-rc1~131 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=0f36c087487a152fa74867156a7d49ed688a12cd;p=qemu-xen-unstable.git 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 --- diff --git a/qemu-char.h b/qemu-char.h index 29de03df58..41936bc9f0 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 6e437a4d83..2057917cd2 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; }