aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/usb/controller/xhci.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/usb/controller/xhci.c')
-rw-r--r--sys/dev/usb/controller/xhci.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/sys/dev/usb/controller/xhci.c b/sys/dev/usb/controller/xhci.c
index 72d1ff5e0ae5..e35a0a5d2407 100644
--- a/sys/dev/usb/controller/xhci.c
+++ b/sys/dev/usb/controller/xhci.c
@@ -3848,9 +3848,16 @@ xhci_configure_reset_endpoint(struct usb_xfer *xfer)
mask = (1U << epno);
- if (epno != 1 && drop != 0) {
+ /*
+ * So-called control and isochronous transfer types have
+ * predefined data toggles (USB 2.0) or sequence numbers (USB
+ * 3.0) and does not need to be dropped.
+ */
+ if (drop != 0 &&
+ (edesc->bmAttributes & UE_XFERTYPE) != UE_CONTROL &&
+ (edesc->bmAttributes & UE_XFERTYPE) != UE_ISOCHRONOUS) {
/* drop endpoint context to reset data toggle value, if any. */
- xhci_configure_mask(udev, mask, 1);
+ xhci_configure_mask(udev, mask, 1);
err = xhci_cmd_configure_ep(sc, buf_inp.physaddr, 0, index);
if (err != 0) {
DPRINTF("Could not drop "