Commit dfbd535d authored by Zhang Lixu's avatar Zhang Lixu Committed by Jiri Kosina
Browse files

HID: intel-ish-hid: Increase ISHTP resume ack timeout to 300ms



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: default avatarZhang Lixu <lixu.zhang@intel.com>
Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@intel.com>
Acked-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.com>
parent a7fc15ed
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -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
+3 −0
Original line number Diff line number Diff line
@@ -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");
	}
}

+0 −3
Original line number Diff line number Diff line
@@ -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,
+3 −0
Original line number Diff line number Diff line
@@ -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,