diff options
author | dim <dim@FreeBSD.org> | 2015-02-02 20:18:47 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2015-02-02 20:18:47 +0000 |
commit | 8dc847406524920db5b69acab7d3f942c5ea65d3 (patch) | |
tree | ea2cc467314a8ce8270c4ebfdce7e4b5c9363c24 /sys/dev/usb/controller/xhci.c | |
parent | bcd1c03c73ca4eef3dfd13843ff1597c4fed712c (diff) | |
parent | 54f475a481803dda7e9fcd95edd11d0c5f9a2bf1 (diff) | |
download | FreeBSD-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.c | 12 |
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; |