summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/usb/controller/xhci.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/sys/dev/usb/controller/xhci.c b/sys/dev/usb/controller/xhci.c
index 2b0ad00..6a4d894 100644
--- a/sys/dev/usb/controller/xhci.c
+++ b/sys/dev/usb/controller/xhci.c
@@ -2252,7 +2252,14 @@ xhci_configure_mask(struct usb_device *udev, uint32_t mask, uint8_t drop)
xhci_ctx_set_le32(sc, &pinp->ctx_input.dwInCtx0, mask);
xhci_ctx_set_le32(sc, &pinp->ctx_input.dwInCtx1, 0);
} else {
- xhci_ctx_set_le32(sc, &pinp->ctx_input.dwInCtx0, 0);
+ /*
+ * Some hardware requires that we drop the endpoint
+ * context before adding it again:
+ */
+ xhci_ctx_set_le32(sc, &pinp->ctx_input.dwInCtx0,
+ mask & XHCI_INCTX_NON_CTRL_MASK);
+
+ /* Add new endpoint context */
xhci_ctx_set_le32(sc, &pinp->ctx_input.dwInCtx1, mask);
/* find most significant set bit */
OpenPOWER on IntegriCloud