genode/repos/libports/src/lib/qemu-usb/patches/xhci_state.patch

43 lines
1.1 KiB
Diff

diff --git a/src/lib/qemu/hw/usb/hcd-xhci.c b/src/lib/qemu/hw/usb/hcd-xhci.c
index c673bed..cd930da 100644
--- a/src/lib/qemu/hw/usb/hcd-xhci.c
+++ b/src/lib/qemu/hw/usb/hcd-xhci.c
@@ -486,6 +486,8 @@ struct XHCIState {
#define TYPE_XHCI "nec-usb-xhci"
+#ifndef __cplusplus
+
#define XHCI(obj) \
OBJECT_CHECK(XHCIState, (obj), TYPE_XHCI)
@@ -1349,6 +1351,14 @@ static void xhci_set_ep_state(XHCIState *xhci, XHCIEPContext *epctx,
static void xhci_ep_kick_timer(void *opaque)
{
XHCIEPContext *epctx = opaque;
+
+ /*
+ * We might have blocked in the entry lock, while the endpoint was stopped
+ * by another thread
+ */
+ if (epctx->state == CC_STOPPED)
+ return;
+
xhci_kick_ep(epctx->xhci, epctx->slotid, epctx->epid, 0);
}
@@ -2361,6 +2371,7 @@ static TRBCCode xhci_address_slot(XHCIState *xhci, unsigned int slotid,
if (bsr) {
slot_ctx[3] = SLOT_DEFAULT << SLOT_STATE_SHIFT;
+ usb_device_reset(dev);
} else {
USBPacket p;
uint8_t buf[1];
@@ -3914,3 +3925,5 @@ static void xhci_register_types(void)
}
type_init(xhci_register_types)
+
+#endif /* __cplusplus */