|
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 |
|