lkml.org 
[lkml]   [2022]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 243/339] usb: dwc3: gadget: Only End Transfer for ep0 data phase
    Date
    From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>

    [ Upstream commit ace17b6ee4f92ab0375d12a1b42494f8590a96b6 ]

    The driver shouldn't be able to issue End Transfer to the control
    endpoint at anytime. Typically we should only do so in error cases such
    as invalid/unexpected direction of Data Phase as described in the
    control transfer flow of the programming guide. It _may_ end started
    data phase during controller deinitialization from soft disconnect or
    driver removal. However, that should not happen because the driver
    should be maintained in EP0_SETUP_PHASE during driver tear-down. On
    soft-connect, the controller should be reset from a soft-reset and there
    should be no issue starting the control endpoint.

    Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
    Link: https://lore.kernel.org/r/3c6643678863a26702e4115e9e19d7d94a30d49c.1650593829.git.Thinh.Nguyen@synopsys.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/usb/dwc3/gadget.c | 11 +++++++++++
    1 file changed, 11 insertions(+)

    diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
    index 6936d8ce8981..bf2eaa09d73c 100644
    --- a/drivers/usb/dwc3/gadget.c
    +++ b/drivers/usb/dwc3/gadget.c
    @@ -3685,6 +3685,17 @@ static void dwc3_reset_gadget(struct dwc3 *dwc)
    void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force,
    bool interrupt)
    {
    + struct dwc3 *dwc = dep->dwc;
    +
    + /*
    + * Only issue End Transfer command to the control endpoint of a started
    + * Data Phase. Typically we should only do so in error cases such as
    + * invalid/unexpected direction as described in the control transfer
    + * flow of the programming guide.
    + */
    + if (dep->number <= 1 && dwc->ep0state != EP0_DATA_PHASE)
    + return;
    +
    if (!(dep->flags & DWC3_EP_TRANSFER_STARTED) ||
    (dep->flags & DWC3_EP_DELAY_STOP) ||
    (dep->flags & DWC3_EP_END_TRANSFER_PENDING))
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-06-13 16:03    [W:4.035 / U:0.192 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site