svn commit: r348853 - stable/10/sys/dev/usb/controller
Hans Petter Selasky
hselasky at FreeBSD.org
Mon Jun 10 13:17:40 UTC 2019
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)
More information about the svn-src-stable-10
mailing list