patch "usb: dwc2: gadget: Fix ISOC flow for elapsed frames" added to usb-linus
Subsystems (3)
This is a note to let you know that I've just added the patch titled
usb: dwc2: gadget: Fix ISOC flow for elapsed frames
to my usb git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
in the usb-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From 7ad4a0b1d46b2612f4429a72afd8f137d7efa9a9 Mon Sep 17 00:00:00 2001
From: Minas Harutyunyan <[email protected]>
Date: Thu, 4 Nov 2021 11:36:01 +0400
Subject: usb: dwc2: gadget: Fix ISOC flow for elapsed frames
Added updating of request frame number for elapsed frames, otherwise frame number will remain as previous use of request. This will allow function driver to correctly track frames in case of Missed ISOC occurs.
Added setting request actual length to 0 for elapsed frames. In Slave mode when pushing data to RxFIFO by dwords, request actual length incrementing accordingly. But before whole packet will be pushed into RxFIFO and send to host can occurs Missed ISOC and data will not send to host. So, in this case request actual length should be reset to 0.
--- drivers/usb/dwc2/gadget.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
drivers/usb/dwc2/gadget.c +14 -3
@@ -1198,6 +1198,8 @@ static void dwc2_hsotg_start_req(struct dwc2_hsotg *hsotg, } ctrl |=DXEPCTL_CNAK ; }else { + hs_req->req.frame_number = hs_ep->target_frame; + hs_req->req.actual =0 ;dwc2_hsotg_complete_request (hsotg, hs_ep, hs_req, -ENODATA );return ; }
@@ -2857,9 +2859,12 @@ static void dwc2_gadget_handle_ep_disabled(struct dwc2_hsotg_ep *hs_ep) do { hs_req = get_ep_head(hs_ep); - if (hs_req) + if (hs_req) { + hs_req->req.frame_number = hs_ep->target_frame; + hs_req->req.actual = 0; dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req, -ENODATA); + } dwc2_gadget_incr_frame_num(hs_ep); /* Update current frame number value. */ hsotg->frame_number = dwc2_hsotg_read_frameno(hsotg);
@@ -2912,8 +2917,11 @@ static void dwc2_gadget_handle_out_token_ep_disabled(struct dwc2_hsotg_ep *ep)while (dwc2_gadget_target_frame_elapsed (ep)) { hs_req =get_ep_head (ep); -if (hs_req) +if (hs_req) { + hs_req->req.frame_number = ep->target_frame; + hs_req->req.actual =0 ;dwc2_hsotg_complete_request (hsotg, ep, hs_req, -ENODATA ); + }dwc2_gadget_incr_frame_num (ep);/* Update current frame number value. */
@@ -3002,8 +3010,11 @@ static void dwc2_gadget_handle_nak(struct dwc2_hsotg_ep *hs_ep)while (dwc2_gadget_target_frame_elapsed (hs_ep)) { hs_req =get_ep_head (hs_ep); -if (hs_req) +if (hs_req) { + hs_req->req.frame_number = hs_ep->target_frame; + hs_req->req.actual =0 ;dwc2_hsotg_complete_request (hsotg, hs_ep, hs_req, -ENODATA ); + }dwc2_gadget_incr_frame_num (hs_ep);/* Update current frame number value. */
Signature · 1 line
2.34.0