--- /dev/null
+From 38b71e9c1439848ce6bca5dc4b859d5b788ae1ae Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 5 Mar 2020 13:23:49 -0800
+Subject: usb: dwc3: gadget: Don't clear flags before transfer ended
+
+From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
+
+[ Upstream commit a114c4ca64bd522aec1790c7e5c60c882f699d8f ]
+
+We track END_TRANSFER command completion. Don't clear transfer
+started/ended flag prematurely. Otherwise, we'd run into the problem
+with restarting transfer before END_TRANSFER command finishes.
+
+Fixes: 6d8a019614f3 ("usb: dwc3: gadget: check for Missed Isoc from event status")
+Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
+Signed-off-by: Felipe Balbi <balbi@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/dwc3/gadget.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
+index 019aee3a79568..8a4455d0af8b9 100644
+--- a/drivers/usb/dwc3/gadget.c
++++ b/drivers/usb/dwc3/gadget.c
+@@ -2366,10 +2366,8 @@ static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep,
+
+ dwc3_gadget_ep_cleanup_completed_requests(dep, event, status);
+
+- if (stop) {
++ if (stop)
+ dwc3_stop_active_transfer(dep, true, true);
+- dep->flags = DWC3_EP_ENABLED;
+- }
+
+ /*
+ * WORKAROUND: This is the 2nd half of U1/U2 -> U0 workaround.
+--
+2.20.1
+
--- /dev/null
+From 41f2ae3ba1ab7c14aec129207a269112961bd201 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 18 Apr 2020 12:11:16 -0400
+Subject: usb: dwc3: gadget: don't enable interrupt when disabling endpoint
+
+[ Upstream commit c5353b225df9b2d0cf881873eef6f680e43c9aa2 ]
+
+Since we're disabling the endpoint anyway, we don't worry about
+getting endpoint command completion interrupt.
+
+Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/dwc3/gadget.c | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
+index 7b8b463676ad6..019aee3a79568 100644
+--- a/drivers/usb/dwc3/gadget.c
++++ b/drivers/usb/dwc3/gadget.c
+@@ -688,12 +688,13 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, unsigned int action)
+ return 0;
+ }
+
+-static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force);
++static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force,
++ bool interrupt);
+ static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep)
+ {
+ struct dwc3_request *req;
+
+- dwc3_stop_active_transfer(dep, true);
++ dwc3_stop_active_transfer(dep, true, false);
+
+ /* - giveback all requests to gadget driver */
+ while (!list_empty(&dep->started_list)) {
+@@ -1416,7 +1417,7 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep,
+ }
+ if (r == req) {
+ /* wait until it is processed */
+- dwc3_stop_active_transfer(dep, true);
++ dwc3_stop_active_transfer(dep, true, true);
+
+ if (!r->trb)
+ goto out0;
+@@ -2366,7 +2367,7 @@ static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep,
+ dwc3_gadget_ep_cleanup_completed_requests(dep, event, status);
+
+ if (stop) {
+- dwc3_stop_active_transfer(dep, true);
++ dwc3_stop_active_transfer(dep, true, true);
+ dep->flags = DWC3_EP_ENABLED;
+ }
+
+@@ -2488,7 +2489,8 @@ static void dwc3_reset_gadget(struct dwc3 *dwc)
+ }
+ }
+
+-static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force)
++static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force,
++ bool interrupt)
+ {
+ struct dwc3 *dwc = dep->dwc;
+ struct dwc3_gadget_ep_cmd_params params;
+@@ -2532,7 +2534,7 @@ static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force)
+
+ cmd = DWC3_DEPCMD_ENDTRANSFER;
+ cmd |= force ? DWC3_DEPCMD_HIPRI_FORCERM : 0;
+- cmd |= DWC3_DEPCMD_CMDIOC;
++ cmd |= interrupt ? DWC3_DEPCMD_CMDIOC : 0;
+ cmd |= DWC3_DEPCMD_PARAM(dep->resource_index);
+ memset(¶ms, 0, sizeof(params));
+ ret = dwc3_send_gadget_ep_cmd(dep, cmd, ¶ms);
+--
+2.20.1
+