lkml.org 
[lkml]   [2021]   [Nov]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 007/179] usb: dwc2: gadget: Fix ISOC flow for elapsed frames
    Date
    From: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>

    commit 7ad4a0b1d46b2612f4429a72afd8f137d7efa9a9 upstream.

    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.

    Fixes: 91bb163e1e4f ("usb: dwc2: gadget: Fix ISOC flow for BDMA and Slave")
    Cc: stable <stable@vger.kernel.org>
    Reviewed-by: John Keeping <john@metanate.com>
    Signed-off-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Link: https://lore.kernel.org/r/c356baade6e9716d312d43df08d53ae557cb8037.1636011277.git.Minas.Harutyunyan@synopsys.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/usb/dwc2/gadget.c | 17 ++++++++++++++---
    1 file changed, 14 insertions(+), 3 deletions(-)

    --- a/drivers/usb/dwc2/gadget.c
    +++ b/drivers/usb/dwc2/gadget.c
    @@ -1198,6 +1198,8 @@ static void dwc2_hsotg_start_req(struct
    }
    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_disabl

    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

    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(struc

    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. */

    \
     
     \ /
      Last update: 2021-11-29 19:38    [W:4.090 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site