From 70a31fcb3f1238e92279cdc023b83ba3a3042cff Mon Sep 17 00:00:00 2001 Message-Id: <70a31fcb3f1238e92279cdc023b83ba3a3042cff.1346162949.git.crobinso@redhat.com> In-Reply-To: <90a59d545ad6759c105b0bfcfca70f574482584f.1346162949.git.crobinso@redhat.com> References: <90a59d545ad6759c105b0bfcfca70f574482584f.1346162949.git.crobinso@redhat.com> From: Hans de Goede Date: Tue, 19 Jul 2011 10:56:19 +0200 Subject: [PATCH 111/114] usb-redir: Add flow control support Signed-off-by: Hans de Goede Signed-off-by: Cole Robinson --- hw/usb/redirect.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c index ecb2cd4..1460515 100644 --- a/hw/usb/redirect.c +++ b/hw/usb/redirect.c @@ -236,12 +236,22 @@ static int usbredir_read(void *priv, uint8_t *data, int count) static int usbredir_write(void *priv, uint8_t *data, int count) { USBRedirDevice *dev = priv; + int r; - if (!dev->cs->opened) { + if (!dev->cs->opened || dev->cs->write_blocked) { return 0; } - return qemu_chr_fe_write(dev->cs, data, count); + r = qemu_chr_fe_write(dev->cs, data, count); + + if (r < 0) { + if (dev->cs->write_blocked) { + return 0; + } + return -1; + } + + return r; } /* @@ -892,10 +902,22 @@ static void usbredir_chardev_event(void *opaque, int event) } } +static void usbredir_chardev_write_unblocked(void *opaque) +{ + USBRedirDevice *dev = opaque; + + if (dev->parser == NULL) { + /* usbredir_open_close_bh hasn't handled the open event yet */ + return; + } + usbredirparser_do_write(dev->parser); +} + static const QemuChrHandlers usbredir_chr_handlers = { .fd_can_read = usbredir_chardev_can_read, .fd_read = usbredir_chardev_read, .fd_event = usbredir_chardev_event, + .fd_write_unblocked = usbredir_chardev_write_unblocked, }; /* -- 1.7.11.2