]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
HID: intel-ish-ipc: Remove redundant ready check after timeout function
authorZhang Lixu <lixu.zhang@intel.com>
Thu, 21 Aug 2025 02:06:09 +0000 (10:06 +0800)
committerJiri Kosina <jkosina@suse.com>
Fri, 12 Sep 2025 15:22:41 +0000 (17:22 +0200)
timed_wait_for_timeout() internally checks for ish_is_input_ready() and
ishtp_fw_is_ready() based on the provided parameters. If
timed_wait_for_timeout() returns 0, it indicates the status is ready. In
rare cases, another thread may send a message immediately after
timed_wait_for_timeout() returns, causing a subsequent ish_is_input_ready()
check to fail. Since the return value of timed_wait_for_timeout() is
sufficient to determine readiness, the additional ready check is
unnecessary and may introduce issues.

This patch removes the redundant check and relies solely on the return
value of timed_wait_for_timeout().

Fixes: ae02e5d40d5f ("HID: intel-ish-hid: ipc layer")
Signed-off-by: Zhang Lixu <lixu.zhang@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/ipc.c

index 4c861119e97aa0dae16b0dae3e23be6bec0e46ef..3ddaa2cd39d555f08a546c4ba42dd2d02cf8bdb1 100644 (file)
@@ -498,6 +498,7 @@ static int ish_fw_reset_handler(struct ishtp_device *dev)
 {
        uint32_t        reset_id;
        unsigned long   flags;
+       int ret;
 
        /* Read reset ID */
        reset_id = ish_reg_read(dev, IPC_REG_ISH2HOST_MSG) & 0xFFFF;
@@ -510,12 +511,11 @@ static int ish_fw_reset_handler(struct ishtp_device *dev)
        /* ISHTP notification in IPC_RESET */
        ishtp_reset_handler(dev);
 
-       if (!ish_is_input_ready(dev))
-               timed_wait_for_timeout(dev, WAIT_FOR_INPUT_RDY,
-                       TIME_SLICE_FOR_INPUT_RDY_MS, TIMEOUT_FOR_INPUT_RDY_MS);
-
+       ret = timed_wait_for_timeout(dev, WAIT_FOR_INPUT_RDY,
+                                    TIME_SLICE_FOR_INPUT_RDY_MS,
+                                    TIMEOUT_FOR_INPUT_RDY_MS);
        /* ISH FW is dead */
-       if (!ish_is_input_ready(dev))
+       if (ret)
                return  -EPIPE;
 
        /* Send clock sync at once after reset */
@@ -531,9 +531,10 @@ static int ish_fw_reset_handler(struct ishtp_device *dev)
                         sizeof(uint32_t));
 
        /* Wait for ISH FW'es ILUP and ISHTP_READY */
-       timed_wait_for_timeout(dev, WAIT_FOR_FW_RDY,
-                       TIME_SLICE_FOR_FW_RDY_MS, TIMEOUT_FOR_FW_RDY_MS);
-       if (!ishtp_fw_is_ready(dev)) {
+       ret = timed_wait_for_timeout(dev, WAIT_FOR_FW_RDY,
+                                    TIME_SLICE_FOR_FW_RDY_MS,
+                                    TIMEOUT_FOR_FW_RDY_MS);
+       if (ret) {
                /* ISH FW is dead */
                uint32_t        ish_status;