aboutsummaryrefslogtreecommitdiff
path: root/hw/usb-hub.c
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2011-10-13 12:52:47 +0200
committerGerd Hoffmann <kraxel@redhat.com>2011-10-13 13:16:34 +0200
commit80cf7cf74f29a219e02b50f27c12b1c792ebf99b (patch)
tree8ae039df6b1465d8a3911ff6b6813f276629895f /hw/usb-hub.c
parent3a3286bf0be8582854b3d451700ae38849b83b7c (diff)
usb-hub: don't trigger assert on packet completion.
Calling usb_packet_complete() recursively when passing up the completion event up the chain for devices connected via usb hub will trigger an assert. So don't do that, make the usb hub emulation call the upstream completion callback directly instead. Based on a patch from Stefan Hajnoczi <stefanha@gmail.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'hw/usb-hub.c')
-rw-r--r--hw/usb-hub.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/hw/usb-hub.c b/hw/usb-hub.c
index 39382c7386..09c65160c2 100644
--- a/hw/usb-hub.c
+++ b/hw/usb-hub.c
@@ -207,10 +207,14 @@ static void usb_hub_complete(USBPort *port, USBPacket *packet)
/*
* Just pass it along upstream for now.
*
- * If we ever inplement usb 2.0 split transactions this will
+ * If we ever implement usb 2.0 split transactions this will
* become a little more complicated ...
+ *
+ * Can't use usb_packet_complete() here because packet->owner is
+ * cleared already, go call the ->complete() callback directly
+ * instead.
*/
- usb_packet_complete(&s->dev, packet);
+ s->dev.port->ops->complete(s->dev.port, packet);
}
static void usb_hub_handle_reset(USBDevice *dev)