Skip to content

Commit 66aef6c

Browse files
P33Mpelwell
authored andcommitted
drivers: usb: xhci: set HID bit in streaming endpoint contexts
The xHC may commence Host Initiated Data Moves for streaming endpoints - see USB3.2 spec s8.12.1.4.2.4. However, this behaviour is typically counterproductive as the submission of UAS URBs in {Status, Data, Command} order and 1 outstanding IO per stream ID means the device never enters Move Data after a HIMD for Status or Data stages with the same stream ID. For OUT transfers this is especially inefficient as the host will start transmitting multiple bulk packets as a burst, all of which get NAKed by the device - wasting bandwidth. Also, some buggy UAS adapters don't properly handle the EP flow control state this creates - e.g. RTL9210. Set Host Initiated Data Move Disable to always defer stream selection to the device. xHC implementations may treat this field as "don't care, forced to 1" anyway - xHCI 1.2 s4.12.1. Signed-off-by: Jonathan Bell <[email protected]>
1 parent 3f11c40 commit 66aef6c

File tree

2 files changed

+10
-0
lines changed

2 files changed

+10
-0
lines changed

drivers/usb/host/xhci-mem.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,14 @@ void xhci_setup_streams_ep_input_ctx(struct xhci_hcd *xhci,
716716
ep_ctx->ep_info &= cpu_to_le32(~EP_MAXPSTREAMS_MASK);
717717
ep_ctx->ep_info |= cpu_to_le32(EP_MAXPSTREAMS(max_primary_streams)
718718
| EP_HAS_LSA);
719+
720+
/*
721+
* Set Host Initiated Data Move Disable to always defer stream
722+
* selection to the device. xHC implementations may treat this
723+
* field as "don't care, forced to 1" anyway - xHCI 1.2 s4.12.1.
724+
*/
725+
ep_ctx->ep_info2 |= EP_HID;
726+
719727
ep_ctx->deq = cpu_to_le64(stream_info->ctx_array_dma);
720728
}
721729

drivers/usb/host/xhci.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,8 @@ struct xhci_ep_ctx {
492492
#define CTX_TO_EP_MAXPSTREAMS(p) (((p) & EP_MAXPSTREAMS_MASK) >> 10)
493493
/* Endpoint is set up with a Linear Stream Array (vs. Secondary Stream Array) */
494494
#define EP_HAS_LSA (1 << 15)
495+
/* Host initiated data move disable in info2 */
496+
#define EP_HID (1 << 7)
495497
/* hosts with LEC=1 use bits 31:24 as ESIT high bits. */
496498
#define CTX_TO_MAX_ESIT_PAYLOAD_HI(p) (((p) >> 24) & 0xff)
497499

0 commit comments

Comments
 (0)