git: 473c925e4359 - stable/12 - xhci(4): Only drop BULK and INTERRUPT endpoints to reset data toggle.

From: Hans Petter Selasky <hselasky_at_FreeBSD.org>
Date: Wed, 04 May 2022 07:29:25 UTC
The branch stable/12 has been updated by hselasky:

URL: https://cgit.FreeBSD.org/src/commit/?id=473c925e4359f79224374911cdeb1477bf1ef939

commit 473c925e4359f79224374911cdeb1477bf1ef939
Author:     Hans Petter Selasky <hselasky@FreeBSD.org>
AuthorDate: 2022-05-03 16:09:17 +0000
Commit:     Hans Petter Selasky <hselasky@FreeBSD.org>
CommitDate: 2022-05-04 07:28:41 +0000

    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)
---
 sys/dev/usb/controller/xhci.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/sys/dev/usb/controller/xhci.c b/sys/dev/usb/controller/xhci.c
index 3642b228b5c9..c2c111525e81 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 "