5544c1b
From 48dbbecb0b010ff1c6a64a3a18a7272cce314bf8 Mon Sep 17 00:00:00 2001
93b7e38
From: Hans de Goede <hdegoede@redhat.com>
5544c1b
Date: Wed, 12 Sep 2012 15:08:40 +0200
5544c1b
Subject: [PATCH] uhci: Don't queue up packets after one with the SPD flag set
93b7e38
93b7e38
Don't queue up packets after a packet with the SPD (short packet detect)
93b7e38
flag set. Since we won't know if the packet will actually be short until it
93b7e38
has completed, and if it is short we should stop the queue.
93b7e38
93b7e38
This fixes a miniature photoframe emulating a USB cdrom with the windows
93b7e38
software for it not working.
93b7e38
93b7e38
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
5544c1b
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
5544c1b
(cherry picked from commit 72a04d0c178f01908d74539230d9de64ffc6da19)
5544c1b
5544c1b
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
93b7e38
---
93b7e38
 hw/usb/hcd-uhci.c | 5 ++++-
93b7e38
 1 file changed, 4 insertions(+), 1 deletion(-)
93b7e38
93b7e38
diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c
93b7e38
index c7c8786..cdc8bc3 100644
93b7e38
--- a/hw/usb/hcd-uhci.c
93b7e38
+++ b/hw/usb/hcd-uhci.c
93b7e38
@@ -1000,6 +1000,9 @@ static void uhci_fill_queue(UHCIState *s, UHCI_TD *td)
93b7e38
         }
93b7e38
         assert(ret == TD_RESULT_ASYNC_START);
93b7e38
         assert(int_mask == 0);
93b7e38
+        if (ptd.ctrl & TD_CTRL_SPD) {
93b7e38
+            break;
93b7e38
+        }
93b7e38
         plink = ptd.link;
93b7e38
     }
93b7e38
 }
93b7e38
@@ -1097,7 +1100,7 @@ static void uhci_process_frame(UHCIState *s)
93b7e38
 
93b7e38
         case TD_RESULT_ASYNC_START:
93b7e38
             trace_usb_uhci_td_async(curr_qh & ~0xf, link & ~0xf);
93b7e38
-            if (is_valid(td.link)) {
93b7e38
+            if (is_valid(td.link) && !(td.ctrl & TD_CTRL_SPD)) {
93b7e38
                 uhci_fill_queue(s, &td);
93b7e38
             }
93b7e38
             link = curr_qh ? qh.link : td.link;
93b7e38
-- 
5544c1b
1.7.12.1
93b7e38