summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/controller/xhci.c
diff options
context:
space:
mode:
authordim <dim@FreeBSD.org>2015-02-02 20:18:47 +0000
committerdim <dim@FreeBSD.org>2015-02-02 20:18:47 +0000
commit8dc847406524920db5b69acab7d3f942c5ea65d3 (patch)
treeea2cc467314a8ce8270c4ebfdce7e4b5c9363c24 /sys/dev/usb/controller/xhci.c
parentbcd1c03c73ca4eef3dfd13843ff1597c4fed712c (diff)
parent54f475a481803dda7e9fcd95edd11d0c5f9a2bf1 (diff)
downloadFreeBSD-src-8dc847406524920db5b69acab7d3f942c5ea65d3.zip
FreeBSD-src-8dc847406524920db5b69acab7d3f942c5ea65d3.tar.gz
Merge ^/head r278005 through r278109.
Diffstat (limited to 'sys/dev/usb/controller/xhci.c')
-rw-r--r--sys/dev/usb/controller/xhci.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/sys/dev/usb/controller/xhci.c b/sys/dev/usb/controller/xhci.c
index 8650444..e9b72a3 100644
--- a/sys/dev/usb/controller/xhci.c
+++ b/sys/dev/usb/controller/xhci.c
@@ -1866,6 +1866,15 @@ restart:
XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_DATA_STAGE);
if (temp->direction == UE_DIR_IN)
dword |= XHCI_TRB_3_DIR_IN | XHCI_TRB_3_ISP_BIT;
+ /*
+ * Section 3.2.9 in the XHCI
+ * specification about control
+ * transfers says that we should use a
+ * normal-TRB if there are more TRBs
+ * extending the data-stage
+ * TRB. Update the "trb_type".
+ */
+ temp->trb_type = XHCI_TRB_TYPE_NORMAL;
break;
case XHCI_TRB_TYPE_STATUS_STAGE:
dword = XHCI_TRB_3_CHAIN_BIT | XHCI_TRB_3_CYCLE_BIT |
@@ -2106,7 +2115,8 @@ xhci_setup_generic_chain(struct usb_xfer *xfer)
mult = 1;
temp.isoc_delta = 0;
temp.isoc_frame = 0;
- temp.trb_type = XHCI_TRB_TYPE_DATA_STAGE;
+ temp.trb_type = xfer->flags_int.control_did_data ?
+ XHCI_TRB_TYPE_NORMAL : XHCI_TRB_TYPE_DATA_STAGE;
} else {
x = 0;
mult = 1;
OpenPOWER on IntegriCloud