dcavalca / rpms / qemu

Forked from rpms/qemu 11 months ago
Clone

Blame 0103-usb-redir-Pre-fill-our-isoc-input-buffer-before-send.patch

Justin M. Forbes d4cdad
From 577aff1f1df0a41fd5e21f5ff2b470c36565211b Mon Sep 17 00:00:00 2001
Justin M. Forbes d4cdad
From: Hans de Goede <hdegoede@redhat.com>
Justin M. Forbes d4cdad
Date: Mon, 19 Dec 2011 14:55:15 +0100
Justin M. Forbes d4cdad
Subject: [PATCH 103/118] usb-redir: Pre-fill our isoc input buffer before
Justin M. Forbes d4cdad
 sending pkts to the host
Justin M. Forbes d4cdad
Justin M. Forbes d4cdad
This is something which should have been done from the first version of
Justin M. Forbes d4cdad
usb-redir, but wasn't.
Justin M. Forbes d4cdad
Justin M. Forbes d4cdad
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Justin M. Forbes d4cdad
---
Justin M. Forbes d4cdad
 usb-redir.c |   16 ++++++++++++++++
Justin M. Forbes d4cdad
 1 files changed, 16 insertions(+), 0 deletions(-)
Justin M. Forbes d4cdad
Justin M. Forbes d4cdad
diff --git a/usb-redir.c b/usb-redir.c
Justin M. Forbes d4cdad
index ab2c8fa..17ea7a7 100644
Justin M. Forbes d4cdad
--- a/usb-redir.c
Justin M. Forbes d4cdad
+++ b/usb-redir.c
Justin M. Forbes d4cdad
@@ -60,7 +60,9 @@ struct endp_data {
Justin M. Forbes d4cdad
     uint8_t iso_error; /* For reporting iso errors to the HC */
Justin M. Forbes d4cdad
     uint8_t interrupt_started;
Justin M. Forbes d4cdad
     uint8_t interrupt_error;
Justin M. Forbes d4cdad
+    uint8_t bufpq_prefilled;
Justin M. Forbes d4cdad
     QTAILQ_HEAD(, buf_packet) bufpq;
Justin M. Forbes d4cdad
+    int bufpq_size;
Justin M. Forbes d4cdad
     int bufpq_target_size;
Justin M. Forbes d4cdad
 };
Justin M. Forbes d4cdad
Justin M. Forbes d4cdad
@@ -296,6 +298,7 @@ static struct buf_packet *bufp_alloc(USBRedirDevice *dev,
Justin M. Forbes d4cdad
     bufp->len    = len;
Justin M. Forbes d4cdad
     bufp->status = status;
Justin M. Forbes d4cdad
     QTAILQ_INSERT_TAIL(&dev->endpoint[EP2I(ep)].bufpq, bufp, next);
Justin M. Forbes d4cdad
+    dev->endpoint[EP2I(ep)].bufpq_size++;
Justin M. Forbes d4cdad
     return bufp;
Justin M. Forbes d4cdad
 }
Justin M. Forbes d4cdad
Justin M. Forbes d4cdad
@@ -303,6 +306,7 @@ static void bufp_free(USBRedirDevice *dev, struct buf_packet *bufp,
Justin M. Forbes d4cdad
     uint8_t ep)
Justin M. Forbes d4cdad
 {
Justin M. Forbes d4cdad
     QTAILQ_REMOVE(&dev->endpoint[EP2I(ep)].bufpq, bufp, next);
Justin M. Forbes d4cdad
+    dev->endpoint[EP2I(ep)].bufpq_size--;
Justin M. Forbes d4cdad
     free(bufp->data);
Justin M. Forbes d4cdad
     g_free(bufp);
Justin M. Forbes d4cdad
 }
Justin M. Forbes d4cdad
@@ -373,14 +377,26 @@ static int usbredir_handle_iso_data(USBRedirDevice *dev, USBPacket *p,
Justin M. Forbes d4cdad
         usbredirparser_do_write(dev->parser);
Justin M. Forbes d4cdad
         DPRINTF("iso stream started ep %02X\n", ep);
Justin M. Forbes d4cdad
         dev->endpoint[EP2I(ep)].iso_started = 1;
Justin M. Forbes d4cdad
+        dev->endpoint[EP2I(ep)].bufpq_prefilled = 0;
Justin M. Forbes d4cdad
     }
Justin M. Forbes d4cdad
Justin M. Forbes d4cdad
     if (ep & USB_DIR_IN) {
Justin M. Forbes d4cdad
         struct buf_packet *isop;
Justin M. Forbes d4cdad
Justin M. Forbes d4cdad
+        if (dev->endpoint[EP2I(ep)].iso_started &&
Justin M. Forbes d4cdad
+                !dev->endpoint[EP2I(ep)].bufpq_prefilled) {
Justin M. Forbes d4cdad
+            if (dev->endpoint[EP2I(ep)].bufpq_size <
Justin M. Forbes d4cdad
+                    dev->endpoint[EP2I(ep)].bufpq_target_size) {
Justin M. Forbes d4cdad
+                return usbredir_handle_status(dev, 0, 0);
Justin M. Forbes d4cdad
+            }
Justin M. Forbes d4cdad
+            dev->endpoint[EP2I(ep)].bufpq_prefilled = 1;
Justin M. Forbes d4cdad
+        }
Justin M. Forbes d4cdad
+
Justin M. Forbes d4cdad
         isop = QTAILQ_FIRST(&dev->endpoint[EP2I(ep)].bufpq);
Justin M. Forbes d4cdad
         if (isop == NULL) {
Justin M. Forbes d4cdad
             DPRINTF2("iso-token-in ep %02X, no isop\n", ep);
Justin M. Forbes d4cdad
+            /* Re-fill the buffer */
Justin M. Forbes d4cdad
+            dev->endpoint[EP2I(ep)].bufpq_prefilled = 0;
Justin M. Forbes d4cdad
             /* Check iso_error for stream errors, otherwise its an underrun */
Justin M. Forbes d4cdad
             status = dev->endpoint[EP2I(ep)].iso_error;
Justin M. Forbes d4cdad
             dev->endpoint[EP2I(ep)].iso_error = 0;
Justin M. Forbes d4cdad
-- 
Justin M. Forbes d4cdad
1.7.7.5
Justin M. Forbes d4cdad