Hi,

> I looked through the QEMU hcd-uhci.c code, and I think QEMU is buggy
> here.  QEMU keeps a mapping of queues that are indexed by the usb
> device address and endpoint (see uhci_queue_new() ).  When the usb
> device has address 0, it creates an entry in this mapping and the
> entry remains even after the device is given a new address.  Later,
> when the next device also has address 0, QEMU attempts to use that
> mapping even though the 0 address now corresponds with a different
> device.

Nice spotting.  Does the attached patch help?

cheers,
  Gerd

>From 42568e8e4812df944abcac27adefdf518ae1361e Mon Sep 17 00:00:00 2001
From: Gerd Hoffmann <kra...@redhat.com>
Date: Tue, 4 Feb 2014 09:57:36 +0100
Subject: [PATCH] uhci: don't cache queues for addr 0 control transfers.

Signed-off-by: Gerd Hoffmann <kra...@redhat.com>
---
 hw/usb/hcd-uhci.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c
index 238d1d2..11ebb9f 100644
--- a/hw/usb/hcd-uhci.c
+++ b/hw/usb/hcd-uhci.c
@@ -253,6 +253,10 @@ static bool uhci_queue_verify(UHCIQueue *queue, uint32_t qh_addr, UHCI_TD *td,
 {
     UHCIAsync *first = QTAILQ_FIRST(&queue->asyncs);
 
+    if (queue->ep->nr == 0 && queue->ep->dev->addr == 0 &&
+        queue->ep->dev->setup_state == 0 /* SETUP_STATE_IDLE */)
+        return false;
+
     return queue->qh_addr == qh_addr &&
            queue->token == uhci_queue_token(td) &&
            (queuing || !(td->ctrl & TD_CTRL_ACTIVE) || first == NULL ||
-- 
1.8.3.1

_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
http://www.seabios.org/mailman/listinfo/seabios

Reply via email to