]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 3 Apr 2018 17:47:50 +0000 (19:47 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 3 Apr 2018 17:47:50 +0000 (19:47 +0200)
added patches:
usb-dwc2-improve-gadget-state-disconnection-handling.patch

queue-4.9/series
queue-4.9/usb-dwc2-improve-gadget-state-disconnection-handling.patch [new file with mode: 0644]

index 5ca85a62a279ce717954b59ec2eadce8cebeca2b..c50ff870f99bb1baf930e26aba56b9131b7db735 100644 (file)
@@ -46,3 +46,4 @@ netfilter-x_tables-add-and-use-xt_check_proc_name.patch
 bluetooth-fix-missing-encryption-refresh-on-security-request.patch
 llist-clang-introduce-member_address_is_nonnull.patch
 scsi-virtio_scsi-always-read-vpd-pages-for-multiqueue-too.patch
+usb-dwc2-improve-gadget-state-disconnection-handling.patch
diff --git a/queue-4.9/usb-dwc2-improve-gadget-state-disconnection-handling.patch b/queue-4.9/usb-dwc2-improve-gadget-state-disconnection-handling.patch
new file mode 100644 (file)
index 0000000..1d26d83
--- /dev/null
@@ -0,0 +1,79 @@
+From d2471d4a24dfbff5e463d382e2c6fec7d7e25a09 Mon Sep 17 00:00:00 2001
+From: John Stultz <john.stultz@linaro.org>
+Date: Mon, 23 Oct 2017 14:32:48 -0700
+Subject: usb: dwc2: Improve gadget state disconnection handling
+
+From: John Stultz <john.stultz@linaro.org>
+
+commit d2471d4a24dfbff5e463d382e2c6fec7d7e25a09 upstream.
+
+In the earlier commit dad3f793f20f ("usb: dwc2: Make sure we
+disconnect the gadget state"), I was trying to fix up the
+fact that we somehow weren't disconnecting the gadget state,
+so that when the OTG port was plugged in the second time we
+would get warnings about the state tracking being wrong.
+
+(This seems to be due to a quirk of the HiKey board where
+we do not ever get any otg interrupts, particularly the session
+end detected signal. Instead we only see status change
+interrupt.)
+
+The fix there was somewhat simple, as it just made sure to
+call dwc2_hsotg_disconnect() before we connected things up
+in OTG mode, ensuring the state handling didn't throw errors.
+
+But in looking at a different issue I was seeing with UDC
+state handling, I realized that it would be much better
+to call dwc2_hsotg_disconnect when we get the state change
+signal moving to host mode.
+
+Thus, this patch removes the earlier disconnect call I added
+and moves it (and the needed locking) to the host mode
+transition.
+
+Cc: Wei Xu <xuwei5@hisilicon.com>
+Cc: Guodong Xu <guodong.xu@linaro.org>
+Cc: Amit Pundir <amit.pundir@linaro.org>
+Cc: YongQin Liu <yongqin.liu@linaro.org>
+Cc: John Youn <johnyoun@synopsys.com>
+Cc: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
+Cc: Douglas Anderson <dianders@chromium.org>
+Cc: Chen Yu <chenyu56@huawei.com>
+Cc: Felipe Balbi <felipe.balbi@linux.intel.com>
+Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cc: linux-usb@vger.kernel.org
+Acked-by: Minas Harutyunyan <hminas@synopsys.com>
+Tested-by: Minas Harutyunyan <hminas@synopsys.com>
+Signed-off-by: John Stultz <john.stultz@linaro.org>
+Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
+Cc: Ben Hutchings <ben.hutchings@codethink.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/usb/dwc2/hcd.c |    7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+--- a/drivers/usb/dwc2/hcd.c
++++ b/drivers/usb/dwc2/hcd.c
+@@ -3220,7 +3220,6 @@ static void dwc2_conn_id_status_change(s
+               dwc2_core_init(hsotg, false);
+               dwc2_enable_global_interrupts(hsotg);
+               spin_lock_irqsave(&hsotg->lock, flags);
+-              dwc2_hsotg_disconnect(hsotg);
+               dwc2_hsotg_core_init_disconnected(hsotg, false);
+               spin_unlock_irqrestore(&hsotg->lock, flags);
+               dwc2_hsotg_core_connect(hsotg);
+@@ -3238,8 +3237,12 @@ static void dwc2_conn_id_status_change(s
+               if (count > 250)
+                       dev_err(hsotg->dev,
+                               "Connection id status change timed out\n");
+-              hsotg->op_state = OTG_STATE_A_HOST;
++              spin_lock_irqsave(&hsotg->lock, flags);
++              dwc2_hsotg_disconnect(hsotg);
++              spin_unlock_irqrestore(&hsotg->lock, flags);
++
++              hsotg->op_state = OTG_STATE_A_HOST;
+               /* Initialize the Core for Host mode */
+               dwc2_core_init(hsotg, false);
+               dwc2_enable_global_interrupts(hsotg);