lkml.org 
[lkml]   [2020]   [Feb]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 037/309] usb: dwc3: gadget: Check END_TRANSFER completion
    Date
    From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>

    commit c58d8bfc77a2c7f6ff6339b58c9fca7ae6f57e70 upstream.

    While the END_TRANSFER command is sent but not completed, any request
    dequeue during this time will cause the driver to issue the END_TRANSFER
    command. The driver needs to submit the command only once to stop the
    controller from processing further. The controller may take more time to
    process the same command multiple times unnecessarily. Let's add a flag
    DWC3_EP_END_TRANSFER_PENDING to check for this condition.

    Fixes: 3aec99154db3 ("usb: dwc3: gadget: remove DWC3_EP_END_TRANSFER_PENDING")
    Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
    Signed-off-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/usb/dwc3/core.h | 1 +
    drivers/usb/dwc3/ep0.c | 4 +++-
    drivers/usb/dwc3/gadget.c | 6 +++++-
    3 files changed, 9 insertions(+), 2 deletions(-)

    --- a/drivers/usb/dwc3/core.h
    +++ b/drivers/usb/dwc3/core.h
    @@ -688,6 +688,7 @@ struct dwc3_ep {
    #define DWC3_EP_STALL BIT(1)
    #define DWC3_EP_WEDGE BIT(2)
    #define DWC3_EP_TRANSFER_STARTED BIT(3)
    +#define DWC3_EP_END_TRANSFER_PENDING BIT(4)
    #define DWC3_EP_PENDING_REQUEST BIT(5)

    /* This last one is specific to EP0 */
    --- a/drivers/usb/dwc3/ep0.c
    +++ b/drivers/usb/dwc3/ep0.c
    @@ -1136,8 +1136,10 @@ void dwc3_ep0_interrupt(struct dwc3 *dwc
    case DWC3_DEPEVT_EPCMDCMPLT:
    cmd = DEPEVT_PARAMETER_CMD(event->parameters);

    - if (cmd == DWC3_DEPCMD_ENDTRANSFER)
    + if (cmd == DWC3_DEPCMD_ENDTRANSFER) {
    + dep->flags &= ~DWC3_EP_END_TRANSFER_PENDING;
    dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
    + }
    break;
    }
    }
    --- a/drivers/usb/dwc3/gadget.c
    +++ b/drivers/usb/dwc3/gadget.c
    @@ -2625,6 +2625,7 @@ static void dwc3_endpoint_interrupt(stru
    cmd = DEPEVT_PARAMETER_CMD(event->parameters);

    if (cmd == DWC3_DEPCMD_ENDTRANSFER) {
    + dep->flags &= ~DWC3_EP_END_TRANSFER_PENDING;
    dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
    dwc3_gadget_ep_cleanup_cancelled_requests(dep);
    }
    @@ -2683,7 +2684,8 @@ static void dwc3_stop_active_transfer(st
    u32 cmd;
    int ret;

    - if (!(dep->flags & DWC3_EP_TRANSFER_STARTED))
    + if (!(dep->flags & DWC3_EP_TRANSFER_STARTED) ||
    + (dep->flags & DWC3_EP_END_TRANSFER_PENDING))
    return;

    /*
    @@ -2728,6 +2730,8 @@ static void dwc3_stop_active_transfer(st

    if (!interrupt)
    dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
    + else
    + dep->flags |= DWC3_EP_END_TRANSFER_PENDING;

    if (dwc3_is_usb31(dwc) || dwc->revision < DWC3_REVISION_310A)
    udelay(100);

    \
     
     \ /
      Last update: 2020-02-10 14:26    [W:4.018 / U:0.784 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site