From: Sasha Levin Date: Sat, 18 Apr 2020 21:06:04 +0000 (-0400) Subject: Fixes for 4.19 X-Git-Tag: v4.19.117~20 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=70e49afcfed4ae1e299af3fd9cbbdfca5559aaf2;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 4.19 Signed-off-by: Sasha Levin --- diff --git a/queue-4.19/series b/queue-4.19/series index 9a45846c3e5..aea2253d063 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -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 index 00000000000..e0cabe73640 --- /dev/null +++ b/queue-4.19/usb-dwc3-gadget-don-t-clear-flags-before-transfer-en.patch @@ -0,0 +1,40 @@ +From 38b71e9c1439848ce6bca5dc4b859d5b788ae1ae Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 5 Mar 2020 13:23:49 -0800 +Subject: usb: dwc3: gadget: Don't clear flags before transfer ended + +From: Thinh Nguyen + +[ 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 +Signed-off-by: Felipe Balbi +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..65f370c805b --- /dev/null +++ b/queue-4.19/usb-dwc3-gadget-don-t-enable-interrupt-when-disablin.patch @@ -0,0 +1,76 @@ +From 41f2ae3ba1ab7c14aec129207a269112961bd201 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 +Signed-off-by: Sasha Levin +--- + 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 +