From: Michael Bideau Date: Wed, 2 Oct 2019 21:48:10 +0000 (+0200) Subject: at_keyboard: Fix unreliable key presses X-Git-Tag: grub-2.06-rc1~340 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=33203ca3484717712b54e199c46ae8a818374284;p=thirdparty%2Fgrub.git at_keyboard: Fix unreliable key presses This patch fixes an issue that prevented the at_keyboard module to work (for me). The cause was a bad/wrong return value in the grub_at_keyboard_getkey() function in grub-core/term/at_keyboard.c file at line 237. My symptoms were to have an unresponsive keyboard. Keys needed to be pressed 10x and more to effectively be printed sometimes generating multiple key presses (after 1 or 2 sec of no printing). It was very problematic when typing passphrase in early stage (with GRUB_ENABLE_CRYPTODISK). When switched to "console" terminal input keyboard worked perfectly. It also worked great with the GRUB 2.02 packaged by Debian (2.02+dfsg1-20). It was not an output issue but an input one. I've managed to analyze the issue and found that it came from the commit 216950a4e (at_keyboard: Split protocol from controller code.). Three lines where moved from the fetch_key() function in grub-core/term/at_keyboard.c file to the beginning of grub_at_keyboard_getkey() function (same file). However, returning -1 made sense when it happened in fetch_key() function but not anymore in grub_at_keyboard_getkey() function which should return GRUB_TERM_NO_KEY. I think it was just an incomplete cut-paste missing a small manual correction. Let's fix it. Note: Commit message updated by Daniel Kiper. Signed-off-by: Michael Bideau Reviewed-by: Daniel Kiper --- diff --git a/grub-core/term/at_keyboard.c b/grub-core/term/at_keyboard.c index f0a986eb1..597111077 100644 --- a/grub-core/term/at_keyboard.c +++ b/grub-core/term/at_keyboard.c @@ -234,7 +234,7 @@ grub_at_keyboard_getkey (struct grub_term_input *term __attribute__ ((unused))) return GRUB_TERM_NO_KEY; if (! KEYBOARD_ISREADY (grub_inb (KEYBOARD_REG_STATUS))) - return -1; + return GRUB_TERM_NO_KEY; at_key = grub_inb (KEYBOARD_REG_DATA); old_led = ps2_state.led_status;