It returns -NODEV at the first selftest timeout, so the retry logic doesn't work. Move the return outside of the while loop to make it real retry 5 times before returns -ENODEV. BTW, the origin loop will retry 6 times, also fix this. Signed-off-by: AceLan Kao <acelan.kao@xxxxxxxxxxxxx> --- drivers/input/serio/i8042.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index 20ff2bed3917..3f6433a5c8e6 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c @@ -944,10 +944,9 @@ static int i8042_controller_selftest(void) */ do { - if (i8042_command(¶m, I8042_CMD_CTL_TEST)) { - pr_err("i8042 controller selftest timeout\n"); - return -ENODEV; - } + if (i8042_command(¶m, I8042_CMD_CTL_TEST)) + pr_err("i8042 controller selftest timeout (%d/5)\n", + i+1); if (param == I8042_RET_CTL_TEST) return 0; @@ -955,7 +954,9 @@ static int i8042_controller_selftest(void) dbg("i8042 controller selftest: %#x != %#x\n", param, I8042_RET_CTL_TEST); msleep(50); - } while (i++ < 5); + } while (++i < 5); + if (i == 5) + return -ENODEV; #ifdef CONFIG_X86 /* -- 2.17.1