]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 4.19
authorSasha Levin <sashal@kernel.org>
Sat, 18 Apr 2020 21:06:04 +0000 (17:06 -0400)
committerSasha Levin <sashal@kernel.org>
Sat, 18 Apr 2020 21:06:04 +0000 (17:06 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-4.19/series
queue-4.19/usb-dwc3-gadget-don-t-clear-flags-before-transfer-en.patch [new file with mode: 0644]
queue-4.19/usb-dwc3-gadget-don-t-enable-interrupt-when-disablin.patch [new file with mode: 0644]

index 9a45846c3e563b5b239bb8f59953945f2e96c197..aea2253d063f074ec757357219152bd4cfdc4d9c 100644 (file)
@@ -22,3 +22,5 @@ keys-fix-proc_keys_next-to-increase-position-index.patch
 tracing-fix-the-race-between-registering-snapshot-event-trigger-and-triggering-snapshot-operation.patch
 btrfs-check-commit-root-generation-in-should_ignore_root.patch
 mac80211_hwsim-use-kstrndup-in-place-of-kasprintf.patch
+usb-dwc3-gadget-don-t-enable-interrupt-when-disablin.patch
+usb-dwc3-gadget-don-t-clear-flags-before-transfer-en.patch
diff --git a/queue-4.19/usb-dwc3-gadget-don-t-clear-flags-before-transfer-en.patch b/queue-4.19/usb-dwc3-gadget-don-t-clear-flags-before-transfer-en.patch
new file mode 100644 (file)
index 0000000..e0cabe7
--- /dev/null
@@ -0,0 +1,40 @@
+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
+
diff --git a/queue-4.19/usb-dwc3-gadget-don-t-enable-interrupt-when-disablin.patch b/queue-4.19/usb-dwc3-gadget-don-t-enable-interrupt-when-disablin.patch
new file mode 100644 (file)
index 0000000..65f370c
--- /dev/null
@@ -0,0 +1,76 @@
+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(&params, 0, sizeof(params));
+       ret = dwc3_send_gadget_ep_cmd(dep, cmd, &params);
+-- 
+2.20.1
+