Blame 0011-usb-redir-Add-flow-control-support.patch

Justin M. Forbes 5e10b1
From 2b797647b4a85a765bfdd8f4539d1fa10daad4fa Mon Sep 17 00:00:00 2001
Hans de Goede 3f1f29
From: Hans de Goede <hdegoede@redhat.com>
Hans de Goede 3f1f29
Date: Tue, 19 Jul 2011 10:56:19 +0200
Justin M. Forbes 5e10b1
Subject: [PATCH 11/13] usb-redir: Add flow control support
Hans de Goede 3f1f29
Hans de Goede 3f1f29
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Hans de Goede 3f1f29
---
Hans de Goede 3f1f29
 usb-redir.c |   28 +++++++++++++++++++++++++++-
Hans de Goede 3f1f29
 1 files changed, 27 insertions(+), 1 deletions(-)
Hans de Goede 3f1f29
Hans de Goede 3f1f29
diff --git a/usb-redir.c b/usb-redir.c
Hans de Goede 3f1f29
index e2b5a2c..6932beb 100644
Hans de Goede 3f1f29
--- a/usb-redir.c
Hans de Goede 3f1f29
+++ b/usb-redir.c
Hans de Goede 3f1f29
@@ -224,8 +224,22 @@ static int usbredir_read(void *priv, uint8_t *data, int count)
Hans de Goede 3f1f29
 static int usbredir_write(void *priv, uint8_t *data, int count)
Hans de Goede 3f1f29
 {
Hans de Goede 3f1f29
     USBRedirDevice *dev = priv;
Hans de Goede 3f1f29
+    int r;
Hans de Goede 3f1f29
 
Hans de Goede 3f1f29
-    return qemu_chr_write(dev->cs, data, count);
Hans de Goede 3f1f29
+    if (dev->cs->write_blocked) {
Hans de Goede 3f1f29
+        return 0;
Hans de Goede 3f1f29
+    }
Hans de Goede 3f1f29
+
Hans de Goede 3f1f29
+    r = qemu_chr_write(dev->cs, data, count);
Hans de Goede 3f1f29
+
Hans de Goede 3f1f29
+    if (r < 0) {
Hans de Goede 3f1f29
+        if (dev->cs->write_blocked) {
Hans de Goede 3f1f29
+            return 0;
Hans de Goede 3f1f29
+        }
Hans de Goede 3f1f29
+        return -1;
Hans de Goede 3f1f29
+    }
Hans de Goede 3f1f29
+
Hans de Goede 3f1f29
+    return r;
Hans de Goede 3f1f29
 }
Hans de Goede 3f1f29
 
Hans de Goede 3f1f29
 /*
Hans de Goede 3f1f29
@@ -782,10 +796,22 @@ static void usbredir_chardev_event(void *opaque, int event)
Hans de Goede 3f1f29
     }
Hans de Goede 3f1f29
 }
Hans de Goede 3f1f29
 
Hans de Goede 3f1f29
+static void usbredir_chardev_write_unblocked(void *opaque)
Hans de Goede 3f1f29
+{
Hans de Goede 3f1f29
+    USBRedirDevice *dev = opaque;
Hans de Goede 3f1f29
+
Hans de Goede 3f1f29
+    if (dev->parser == NULL) {
Hans de Goede 3f1f29
+        /* usbredir_open_close_bh hasn't handled the open event yet */
Hans de Goede 3f1f29
+        return;
Hans de Goede 3f1f29
+    }
Hans de Goede 3f1f29
+    usbredirparser_do_write(dev->parser);
Hans de Goede 3f1f29
+}
Hans de Goede 3f1f29
+
Hans de Goede 3f1f29
 static const QemuChrHandlers usbredir_chr_handlers = {
Hans de Goede 3f1f29
     .fd_can_read = usbredir_chardev_can_read,
Hans de Goede 3f1f29
     .fd_read = usbredir_chardev_read,
Hans de Goede 3f1f29
     .fd_event = usbredir_chardev_event,
Hans de Goede 3f1f29
+    .fd_write_unblocked = usbredir_chardev_write_unblocked,
Hans de Goede 3f1f29
 };
Hans de Goede 3f1f29
 
Hans de Goede 3f1f29
 /*
Hans de Goede 3f1f29
-- 
Hans de Goede 3f1f29
1.7.5.1
Hans de Goede 3f1f29