Re: [REGRESSION] usb controller fails to initialize on intel s1200btl
"Rafael J. Wysocki (Intel)" <[email protected]> Fri, 31 Jul 2026 16:11:15 +0200
| Newsgroups | org.kernel.vger.linux-usb,dev.linux.lists.regressions,org.kernel.vger.linux-acpi |
|---|---|
| Message-ID | <CAJZ5v0g4ctzLpEro2Mu7EbSo8RNmYUCM6+J2p_ExCXseQAx13Q@mail.gmail.com> |
On Fri, Jul 31, 2026 at 3:41 PM Rafael J. Wysocki (Intel) <[email protected]> wrote: > > On Fri, Jul 31, 2026 at 3:06 PM Julian Silver <[email protected]> wrote: > > > > On 2026-07-31 19:58:32, Rafael J. Wysocki (Intel) wrote: > > > Please boot with "intel_idle.states_off=16" in the kernel command line > > > and see if the problem is still there. If this doesn't help, please > > > also try "intel_idle.states_off=24". > > > > "intel_idle.states_off=16" does not help. "intel_idle.states_off=24" works. > > Note that the test is performed on vanilla kernel v7.2-rc5(without the patch). > > Yes, that's what I meant, thanks! > > The kernel command line switch that works causes idle states 3 and 4 > (C3 and C6) to be disabled by default. These CPU idle states allow > the processor to enter package idle states (PC2 or deeper), so what > (most likely) happens is that the package idle states on this platform > somehow interfere with EHCI probing (causing the latter time out). It > is basically a platform issue that was previously hidden. > > Note that you can re-enable idle states disabled by default by doing (as root) > > # echo 0 | tee /sys/devices/system/cpu/cpu*/cpuidle/state[3-4]/disable > > Before the commit in question EHCI was probed before the intel_idle > initialization and so package idle states were not used at that time > and before, but that was only due to the initialization ordering based > on driver name (so fragile anyway). > > I'm not sure how to address this cleanly because moving the intel_idle > initialization back to the device_initcall() level won't guarantee the > working initialization ordering (for instance, if ehci-pci is a > module), but let me send you one more debug patch. The attached patch (on top of the current mainline) should prevent cpuidle governors from requesting idle states deeper than C1E when intel_idle is used until all of the device_initcall()s are done. Please see if this helps.
intel-idle-pm-qos.patch
(text/x-patch, 1.3 KB)
---
drivers/idle/intel_idle.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
--- a/drivers/idle/intel_idle.c
+++ b/drivers/idle/intel_idle.c
@@ -53,6 +53,7 @@
#include <linux/notifier.h>
#include <linux/cpu.h>
#include <linux/moduleparam.h>
+#include <linux/pm_qos.h>
#include <linux/sysfs.h>
#include <asm/cpuid/api.h>
#include <asm/cpu_device_id.h>
@@ -2822,12 +2823,17 @@ error:
pr_info("Failed to adjust C-states with data from 'intel_idle.table'\n");
}
+#define INTEL_IDLE_INIT_QOS 20
+static struct pm_qos_request qos_req __initdata;
+
static int __init intel_idle_init(void)
{
const struct x86_cpu_id *id;
unsigned int eax, ebx, ecx;
int retval;
+ cpu_latency_qos_add_request(&qos_req, INTEL_IDLE_INIT_QOS);
+
/* Do not load intel_idle at all for now if idle= is passed */
if (boot_option_idle_override != IDLE_NO_OVERRIDE)
return -ENODEV;
@@ -2922,6 +2928,13 @@ init_driver_fail:
}
subsys_initcall_sync(intel_idle_init);
+static int __init intel_idle_init_complete(void)
+{
+ cpu_latency_qos_remove_request(&qos_req);
+ return 0;
+}
+device_initcall_sync(intel_idle_init_complete);
+
/*
* We are not really modular, but we used to support that. Meaning we also
* support "intel_idle.max_cstate=..." at boot and also a read-only export of