Blame 0315-ehci-Handle-USB_RET_PROCERR-in-ehci_fill_queue.patch

Hans de Goede c8dfc6
From 1599d0b01712fb16c3ad291b653a31f768f7f5ef Mon Sep 17 00:00:00 2001
Hans de Goede c8dfc6
From: Hans de Goede <hdegoede@redhat.com>
Hans de Goede c8dfc6
Date: Mon, 3 Sep 2012 11:35:58 +0200
Hans de Goede c8dfc6
Subject: [PATCH 315/366] ehci: Handle USB_RET_PROCERR in ehci_fill_queue
Hans de Goede c8dfc6
Hans de Goede c8dfc6
USB_RET_PROCERR can be triggered by the guest (by for example requesting more
Hans de Goede c8dfc6
then BUFFSIZE bytes), so don't assert on it.
Hans de Goede c8dfc6
Hans de Goede c8dfc6
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Hans de Goede c8dfc6
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Hans de Goede c8dfc6
---
Hans de Goede c8dfc6
 hw/usb/hcd-ehci.c | 9 ++++++---
Hans de Goede c8dfc6
 1 file changed, 6 insertions(+), 3 deletions(-)
Hans de Goede c8dfc6
Hans de Goede c8dfc6
diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c
Hans de Goede c8dfc6
index d87aca8..2534394 100644
Hans de Goede c8dfc6
--- a/hw/usb/hcd-ehci.c
Hans de Goede c8dfc6
+++ b/hw/usb/hcd-ehci.c
Hans de Goede c8dfc6
@@ -2076,7 +2076,7 @@ static int ehci_state_horizqh(EHCIQueue *q)
Hans de Goede c8dfc6
     return again;
Hans de Goede c8dfc6
 }
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
-static void ehci_fill_queue(EHCIPacket *p)
Hans de Goede c8dfc6
+static int ehci_fill_queue(EHCIPacket *p)
Hans de Goede c8dfc6
 {
Hans de Goede c8dfc6
     EHCIQueue *q = p->queue;
Hans de Goede c8dfc6
     EHCIqtd qtd = p->qtd;
Hans de Goede c8dfc6
@@ -2100,9 +2100,13 @@ static void ehci_fill_queue(EHCIPacket *p)
Hans de Goede c8dfc6
         p->qtdaddr = qtdaddr;
Hans de Goede c8dfc6
         p->qtd = qtd;
Hans de Goede c8dfc6
         p->usb_status = ehci_execute(p, "queue");
Hans de Goede c8dfc6
+        if (p->usb_status == USB_RET_PROCERR) {
Hans de Goede c8dfc6
+            break;
Hans de Goede c8dfc6
+        }
Hans de Goede c8dfc6
         assert(p->usb_status == USB_RET_ASYNC);
Hans de Goede c8dfc6
         p->async = EHCI_ASYNC_INFLIGHT;
Hans de Goede c8dfc6
     }
Hans de Goede c8dfc6
+    return p->usb_status;
Hans de Goede c8dfc6
 }
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
 static int ehci_state_execute(EHCIQueue *q)
Hans de Goede c8dfc6
@@ -2144,8 +2148,7 @@ static int ehci_state_execute(EHCIQueue *q)
Hans de Goede c8dfc6
         trace_usb_ehci_packet_action(p->queue, p, "async");
Hans de Goede c8dfc6
         p->async = EHCI_ASYNC_INFLIGHT;
Hans de Goede c8dfc6
         ehci_set_state(q->ehci, q->async, EST_HORIZONTALQH);
Hans de Goede c8dfc6
-        again = 1;
Hans de Goede c8dfc6
-        ehci_fill_queue(p);
Hans de Goede c8dfc6
+        again = (ehci_fill_queue(p) == USB_RET_PROCERR) ? -1 : 1;
Hans de Goede c8dfc6
         goto out;
Hans de Goede c8dfc6
     }
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
-- 
Hans de Goede c8dfc6
1.7.12
Hans de Goede c8dfc6