| From 928867e92a368d0b60dd212eb423cbbd97e3068f Mon Sep 17 00:00:00 2001 |
| From: Thinh Nguyen <Thinh.Nguyen@synopsys.com> |
| Date: Wed, 27 Nov 2019 13:10:54 -0800 |
| Subject: [PATCH] usb: dwc3: ep0: Clear started flag on completion |
| |
| commit 2d7b78f59e020b07fc6338eefe286f54ee2d6773 upstream. |
| |
| Clear ep0's DWC3_EP_TRANSFER_STARTED flag if the END_TRANSFER command is |
| completed. Otherwise, we can't start control transfer again after |
| END_TRANSFER. |
| |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Thinh Nguyen <thinhn@synopsys.com> |
| Signed-off-by: Felipe Balbi <balbi@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c |
| index 8efde178eef4..2fb02f877401 100644 |
| --- a/drivers/usb/dwc3/ep0.c |
| +++ b/drivers/usb/dwc3/ep0.c |
| @@ -1110,6 +1110,9 @@ static void dwc3_ep0_xfernotready(struct dwc3 *dwc, |
| void dwc3_ep0_interrupt(struct dwc3 *dwc, |
| const struct dwc3_event_depevt *event) |
| { |
| + struct dwc3_ep *dep = dwc->eps[event->endpoint_number]; |
| + u8 cmd; |
| + |
| switch (event->endpoint_event) { |
| case DWC3_DEPEVT_XFERCOMPLETE: |
| dwc3_ep0_xfer_complete(dwc, event); |
| @@ -1122,7 +1125,12 @@ void dwc3_ep0_interrupt(struct dwc3 *dwc, |
| case DWC3_DEPEVT_XFERINPROGRESS: |
| case DWC3_DEPEVT_RXTXFIFOEVT: |
| case DWC3_DEPEVT_STREAMEVT: |
| + break; |
| case DWC3_DEPEVT_EPCMDCMPLT: |
| + cmd = DEPEVT_PARAMETER_CMD(event->parameters); |
| + |
| + if (cmd == DWC3_DEPCMD_ENDTRANSFER) |
| + dep->flags &= ~DWC3_EP_TRANSFER_STARTED; |
| break; |
| } |
| } |
| -- |
| 2.7.4 |
| |