Overview of stream transfer requirement: * A transfer will have a set of TRBs of the same stream ID. * A transfer is started with a stream ID in START_TRANSFER command. * A new stream will only start when the previous completes. Overview of stream events: * A "prime" from host indicates that its endpoints are active (buffers prepared and ready to receive/transmit data). The controller automatically initiates stream if it sees this. * A "NoStream" rejection event indicates that the host isn't ready. Host will put the endpoint back to idle state. Device may need to reinitiate the stream to start transfer again. * A Stream Found event means host accepted device initiated stream. Nothing needs to be done from driver. To initiate a stream, the driver will issue START_TRANSFER command with a stream ID. To reinitiate the stream, the driver must issue END_TRANSFER and restart the transfer with START_TRANSFER command with the same stream ID. This implementation handles device-initated streams (e.g. UASP driver). It also handles some hosts' quirky behavior where they only prime each endpoint once. Prerequisite: This series requires DWC_usb32 patch series https://patchwork.kernel.org/project/linux-usb/list/?series=269641 [PATCH 1/2] usb: dwc3: Add support for DWC_usb32 IP [PATCH 2/2] usb: dwc3: Get MDWIDTH for DWC_usb32 Changes in v2: - Update cover letter - Split handling of stream and of transfer completion into smaller patches - Reword usb_request->is_last to strictly use for streams - Enforce transfer completion handling to only for stream capable endpoints Thinh Nguyen (11): usb: gadget: Introduce usb_request->is_last usb: gadget: f_tcm: Inform last stream request usb: dwc3: gadget: Continue to process pending requests usb: dwc3: gadget: Check for in-progress END_TRANSFER usb: dwc3: gadget: Refactor TRB completion handler usb: dwc3: gadget: Enable XferComplete event usb: dwc3: gadget: Handle XferComplete for streams usb: dwc3: gadget: Wait for transfer completion usb: dwc3: gadget: Don't prepare beyond a transfer usb: dwc3: gadget: Handle stream transfers usb: dwc3: gadget: Use SET_EP_PRIME for NoStream drivers/usb/dwc3/core.h | 12 ++ drivers/usb/dwc3/debug.h | 2 + drivers/usb/dwc3/gadget.c | 225 +++++++++++++++++++++++++++++++----- drivers/usb/gadget/function/f_tcm.c | 3 + include/linux/usb/gadget.h | 3 + 5 files changed, 215 insertions(+), 30 deletions(-) -- 2.11.0