[Midnightbsd-cvs] src [12248] trunk/sys/dev/usb/controller/xhci.c: In xhci(4) there is no stream ID in the completion TRB.
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Sat Aug 10 10:43:18 EDT 2019
Revision: 12248
http://svnweb.midnightbsd.org/src/?rev=12248
Author: laffer1
Date: 2019-08-10 10:43:17 -0400 (Sat, 10 Aug 2019)
Log Message:
-----------
In xhci(4) there is no stream ID in the completion TRB. instead interate all the stream idds in stream mode to find the matching USB transfer.
Modified Paths:
--------------
trunk/sys/dev/usb/controller/xhci.c
Modified: trunk/sys/dev/usb/controller/xhci.c
===================================================================
--- trunk/sys/dev/usb/controller/xhci.c 2019-08-09 02:58:28 UTC (rev 12247)
+++ trunk/sys/dev/usb/controller/xhci.c 2019-08-10 14:43:17 UTC (rev 12248)
@@ -1,5 +1,5 @@
/* $MidnightBSD$ */
-/* $FreeBSD: stable/10/sys/dev/usb/controller/xhci.c 333203 2018-05-03 07:38:45Z hselasky $ */
+/* $FreeBSD: stable/10/sys/dev/usb/controller/xhci.c 348853 2019-06-10 13:17:39Z hselasky $ */
/*-
* Copyright (c) 2010 Hans Petter Selasky. All rights reserved.
*
@@ -896,7 +896,7 @@
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;
@@ -909,7 +909,6 @@
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);
@@ -919,8 +918,8 @@
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");
@@ -934,19 +933,20 @@
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)
continue;
More information about the Midnightbsd-cvs
mailing list