aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2022-05-03 16:09:17 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2022-05-04 07:30:07 +0000
commita1ec8baee5dd0cb8e344ab0e2feafcf49f4a802a (patch)
tree87022a7dd16d1a7b40685e175b471084f195b752
parent683c36ae04abac55841271b3d9a65c0eb5b7155c (diff)
downloadsrc-a1ec8baee5dd0cb8e344ab0e2feafcf49f4a802a.tar.gz
src-a1ec8baee5dd0cb8e344ab0e2feafcf49f4a802a.zip
xhci(4): Only drop BULK and INTERRUPT endpoints to reset data toggle.
Only drop BULK and INTERRUPT endpoints, to reset the data toggle, because for other endpoint types this is not critical. Tested by: ehaupt@ PR: 262882 Sponsored by: NVIDIA Networking (cherry picked from commit e276d281503160ba3648bd394cde95736ee53329)
-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 f71062059653..17fcc3ee09cf 100644
--- a/sys/dev/usb/controller/xhci.c
+++ b/sys/dev/usb/controller/xhci.c
@@ -3932,9 +3932,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 "