From: Greg Kroah-Hartman Date: Tue, 3 Apr 2018 17:47:50 +0000 (+0200) Subject: 4.9-stable patches X-Git-Tag: v3.18.103~24 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d451d34905349df58d21d3d143f1f43d59345429;p=thirdparty%2Fkernel%2Fstable-queue.git 4.9-stable patches added patches: usb-dwc2-improve-gadget-state-disconnection-handling.patch --- diff --git a/queue-4.9/series b/queue-4.9/series index 5ca85a62a27..c50ff870f99 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -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 index 00000000000..1d26d830e5c --- /dev/null +++ b/queue-4.9/usb-dwc2-improve-gadget-state-disconnection-handling.patch @@ -0,0 +1,79 @@ +From d2471d4a24dfbff5e463d382e2c6fec7d7e25a09 Mon Sep 17 00:00:00 2001 +From: John Stultz +Date: Mon, 23 Oct 2017 14:32:48 -0700 +Subject: usb: dwc2: Improve gadget state disconnection handling + +From: John Stultz + +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 +Cc: Guodong Xu +Cc: Amit Pundir +Cc: YongQin Liu +Cc: John Youn +Cc: Minas Harutyunyan +Cc: Douglas Anderson +Cc: Chen Yu +Cc: Felipe Balbi +Cc: Greg Kroah-Hartman +Cc: linux-usb@vger.kernel.org +Acked-by: Minas Harutyunyan +Tested-by: Minas Harutyunyan +Signed-off-by: John Stultz +Signed-off-by: Felipe Balbi +Cc: Ben Hutchings +Signed-off-by: Greg Kroah-Hartman + +--- + 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);