Author: hselasky
Date: Mon Jun 10 13:17:39 2019
New Revision: 348853
URL: https://svnweb.freebsd.org/changeset/base/348853

Log:
  MFC r348604:
  In xhci(4) there is no stream ID in the completion TRB.
  Instead iterate all the stream IDs in stream mode to find
  the matching USB transfer.
  
  Sponsored by: Mellanox Technologies

Modified:
  stable/10/sys/dev/usb/controller/xhci.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/usb/controller/xhci.c
==============================================================================
--- stable/10/sys/dev/usb/controller/xhci.c     Mon Jun 10 13:16:49 2019        
(r348852)
+++ stable/10/sys/dev/usb/controller/xhci.c     Mon Jun 10 13:17:39 2019        
(r348853)
@@ -895,7 +895,7 @@ xhci_check_transfer(struct xhci_softc *sc, struct xhci
        uint64_t td_event;
        uint32_t temp;
        uint32_t remainder;
-       uint16_t stream_id;
+       uint16_t stream_id = 0;
        uint16_t i;
        uint8_t status;
        uint8_t halted;
@@ -908,7 +908,6 @@ xhci_check_transfer(struct xhci_softc *sc, struct xhci
 
        remainder = XHCI_TRB_2_REM_GET(temp);
        status = XHCI_TRB_2_ERROR_GET(temp);
-       stream_id = XHCI_TRB_2_STREAM_GET(temp);
 
        temp = le32toh(trb->dwTrb3);
        epno = XHCI_TRB_3_EP_GET(temp);
@@ -918,8 +917,8 @@ xhci_check_transfer(struct xhci_softc *sc, struct xhci
        halted = (status != XHCI_TRB_ERROR_SHORT_PKT &&
            status != XHCI_TRB_ERROR_SUCCESS);
 
-       DPRINTF("slot=%u epno=%u stream=%u remainder=%u status=%u\n",
-           index, epno, stream_id, remainder, status);
+       DPRINTF("slot=%u epno=%u remainder=%u status=%u\n",
+           index, epno, remainder, status);
 
        if (index > sc->sc_noslot) {
                DPRINTF("Invalid slot.\n");
@@ -933,18 +932,19 @@ xhci_check_transfer(struct xhci_softc *sc, struct xhci
 
        pepext = &sc->sc_hw.devs[index].endp[epno];
 
-       if (pepext->trb_ep_mode != USB_EP_MODE_STREAMS) {
-               stream_id = 0;
-               DPRINTF("stream_id=0\n");
-       } else if (stream_id >= XHCI_MAX_STREAMS) {
-               DPRINTF("Invalid stream ID.\n");
-               return;
-       }
-
        /* try to find the USB transfer that generated the event */
-       for (i = 0; i != (XHCI_MAX_TRANSFERS - 1); i++) {
+       for (i = 0;; i++) {
                struct usb_xfer *xfer;
                struct xhci_td *td;
+
+               if (i == (XHCI_MAX_TRANSFERS - 1)) {
+                       if (pepext->trb_ep_mode != USB_EP_MODE_STREAMS ||
+                           stream_id == (XHCI_MAX_STREAMS - 1))
+                               break;
+                       stream_id++;
+                       i = 0;
+                       DPRINTFN(5, "stream_id=%u\n", stream_id);
+               }
 
                xfer = pepext->xfer[i + (XHCI_MAX_TRANSFERS * stream_id)];
                if (xfer == NULL)
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to