]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
HID: intel-ish-hid: Increase ISHTP resume ack timeout to 300ms
authorZhang Lixu <lixu.zhang@intel.com>
Wed, 23 Jul 2025 01:31:32 +0000 (09:31 +0800)
committerJiri Kosina <jkosina@suse.com>
Tue, 12 Aug 2025 12:49:14 +0000 (14:49 +0200)
During s2idle suspend/resume testing on some systems, occasional several
tens of seconds delays were observed in HID sensor resume handling. Trace
analysis revealed repeated "link not ready" timeout errors during
set/get_report operations, which were traced to the
hid_ishtp_cl_resume_handler() timing out while waiting for the ISHTP
resume acknowledgment. The previous timeout was set to 50ms, which proved
insufficient on affected machines.

Empirical measurements on failing systems showed that the time from ISH
resume initiation to receiving the ISHTP resume ack could be as long as
180ms. As a result, the 50ms timeout caused failures.

To address this, increase the wait timeout for ISHTP resume ack from 50ms
to 300ms, providing a safer margin for slower hardware. Additionally, add
error logging when a timeout occurs to aid future debugging and issue
triage. No functional changes are made beyond the timeout adjustment and
improved error reporting.

Signed-off-by: Zhang Lixu <lixu.zhang@intel.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
drivers/hid/intel-ish-hid/ipc/pci-ish.c
drivers/hid/intel-ish-hid/ishtp-hid-client.c
drivers/hid/intel-ish-hid/ishtp/bus.c
drivers/hid/intel-ish-hid/ishtp/ishtp-dev.h

index c57483224db6f39357cd066f123d9c187c6bcc1d..9d150ce234f25331081a6493d2fb41672b23c738 100644 (file)
@@ -264,9 +264,6 @@ static void ish_shutdown(struct pci_dev *pdev)
 
 static struct device __maybe_unused *ish_resume_device;
 
-/* 50ms to get resume response */
-#define WAIT_FOR_RESUME_ACK_MS         50
-
 /**
  * ish_resume_handler() - Work function to complete resume
  * @work:      work struct
index 6550ad5bfbb537823824b0af615da2ac39569b0e..d8c3c54a8c0f2a757717c08400fc24516f0296f6 100644 (file)
@@ -759,6 +759,9 @@ static void hid_ishtp_cl_resume_handler(struct work_struct *work)
        if (ishtp_wait_resume(ishtp_get_ishtp_device(hid_ishtp_cl))) {
                client_data->suspended = false;
                wake_up_interruptible(&client_data->ishtp_resume_wait);
+       } else {
+               hid_ishtp_trace(client_data, "hid client: wait for resume timed out");
+               dev_err(cl_data_to_dev(client_data), "wait for resume timed out");
        }
 }
 
index 5ac7d70a7c84353c4979bd6892aaba4021d07f68..93a0432e7058143df6fafd2981639878d5891a24 100644 (file)
@@ -852,9 +852,6 @@ EXPORT_SYMBOL(ishtp_device);
  */
 bool ishtp_wait_resume(struct ishtp_device *dev)
 {
-       /* 50ms to get resume response */
-       #define WAIT_FOR_RESUME_ACK_MS          50
-
        /* Waiting to get resume response */
        if (dev->resume_flag)
                wait_event_interruptible_timeout(dev->resume_wait,
index ec9f6e87aaf2339c1a0c642d3452fe3723e6e4ea..23db97ecf21cd903550c3cbd71f4b16183da0abb 100644 (file)
@@ -47,6 +47,9 @@
 
 #define        MAX_DMA_DELAY   20
 
+/* 300ms to get resume response */
+#define WAIT_FOR_RESUME_ACK_MS         300
+
 /* ISHTP device states */
 enum ishtp_dev_state {
        ISHTP_DEV_INITIALIZING = 0,