mvadkert / rpms / qemu

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