]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 12 Aug 2025 13:31:43 +0000 (15:31 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 12 Aug 2025 13:31:43 +0000 (15:31 +0200)
added patches:
usb-hub-fix-flushing-and-scheduling-of-delayed-work-that-tunes-runtime-pm.patch

queue-5.4/series
queue-5.4/usb-hub-fix-flushing-and-scheduling-of-delayed-work-that-tunes-runtime-pm.patch [new file with mode: 0644]

index e86a46886b0c639b3b2946da89dffcee53806c93..1408b65db5350c660b25d5c52ad1de3a80ef324b 100644 (file)
@@ -52,6 +52,7 @@ net_sched-sch_sfq-use-a-temporary-work-area-for-validating-configuration.patch
 net_sched-sch_sfq-move-the-limit-validation.patch
 net_sched-sch_sfq-reject-invalid-perturb-period.patch
 usb-hub-fix-detection-of-high-tier-usb3-devices-behind-suspended-hubs.patch
+usb-hub-fix-flushing-and-scheduling-of-delayed-work-that-tunes-runtime-pm.patch
 regulator-core-fix-null-dereference-on-unbind-due-to.patch
 rdma-core-rate-limit-gid-cache-warning-messages.patch
 net-appletalk-fix-kerneldoc-warnings.patch
diff --git a/queue-5.4/usb-hub-fix-flushing-and-scheduling-of-delayed-work-that-tunes-runtime-pm.patch b/queue-5.4/usb-hub-fix-flushing-and-scheduling-of-delayed-work-that-tunes-runtime-pm.patch
new file mode 100644 (file)
index 0000000..3a94ad9
--- /dev/null
@@ -0,0 +1,64 @@
+From a49e1e2e785fb3621f2d748581881b23a364998a Mon Sep 17 00:00:00 2001
+From: Mathias Nyman <mathias.nyman@linux.intel.com>
+Date: Thu, 26 Jun 2025 16:01:02 +0300
+Subject: usb: hub: Fix flushing and scheduling of delayed work that tunes runtime pm
+
+From: Mathias Nyman <mathias.nyman@linux.intel.com>
+
+commit a49e1e2e785fb3621f2d748581881b23a364998a upstream.
+
+Delayed work to prevent USB3 hubs from runtime-suspending immediately
+after resume was added in commit 8f5b7e2bec1c ("usb: hub: fix detection
+of high tier USB3 devices behind suspended hubs").
+
+This delayed work needs be flushed if system suspends, or hub needs to
+be quiesced for other reasons right after resume. Not flushing it
+triggered issues on QC SC8280XP CRD board during suspend/resume testing.
+
+Fix it by flushing the delayed resume work in hub_quiesce()
+
+The delayed work item that allow hub runtime suspend is also scheduled
+just before calling autopm get. Alan pointed out there is a small risk
+that work is run before autopm get, which would call autopm put before
+get, and mess up the runtime pm usage order.
+Swap the order of work sheduling and calling autopm get to solve this.
+
+Cc: stable <stable@kernel.org>
+Fixes: 8f5b7e2bec1c ("usb: hub: fix detection of high tier USB3 devices behind suspended hubs")
+Reported-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
+Closes: https://lore.kernel.org/linux-usb/acaaa928-832c-48ca-b0ea-d202d5cd3d6c@oss.qualcomm.com
+Reported-by: Alan Stern <stern@rowland.harvard.edu>
+Closes: https://lore.kernel.org/linux-usb/c73fbead-66d7-497a-8fa1-75ea4761090a@rowland.harvard.edu
+Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
+Link: https://lore.kernel.org/r/20250626130102.3639861-2-mathias.nyman@linux.intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/core/hub.c |    6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+--- a/drivers/usb/core/hub.c
++++ b/drivers/usb/core/hub.c
+@@ -1315,11 +1315,12 @@ static void hub_activate(struct usb_hub
+       if (type == HUB_RESUME && hub_is_superspeed(hub->hdev)) {
+               /* give usb3 downstream links training time after hub resume */
++              usb_autopm_get_interface_no_resume(
++                      to_usb_interface(hub->intfdev));
++
+               INIT_DELAYED_WORK(&hub->init_work, hub_post_resume);
+               queue_delayed_work(system_power_efficient_wq, &hub->init_work,
+                                  msecs_to_jiffies(USB_SS_PORT_U0_WAKE_TIME));
+-              usb_autopm_get_interface_no_resume(
+-                      to_usb_interface(hub->intfdev));
+               return;
+       }
+@@ -1373,6 +1374,7 @@ static void hub_quiesce(struct usb_hub *
+       /* Stop hub_wq and related activity */
+       del_timer_sync(&hub->irq_urb_retry);
++      flush_delayed_work(&hub->init_work);
+       usb_kill_urb(hub->urb);
+       if (hub->has_indicators)
+               cancel_delayed_work_sync(&hub->leds);