diff options
author | Marc Jones <marcj303@gmail.com> | 2009-09-29 19:12:23 +0000 |
---|---|---|
committer | Myles Watson <mylesgw@gmail.com> | 2009-09-29 19:12:23 +0000 |
commit | e59f2e1f338e8e424437e6a2bfac83cc493c164e (patch) | |
tree | 8a39d3c42491e83404a3052ce6c031cc7ef1b8d5 /src | |
parent | 120bff83ff0c135c6248242416bbff2e61051d41 (diff) |
A keyboard controller fix to stop the code from waiting for a code that never
comes. Boot tested on SimNOW (fixes the hang there), and Tyan s2895.
Signed-off-by: Marc Jones <marcj303@gmail.com>
Acked-by: Myles Watson <mylesgw@gmail.com>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4689 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'src')
-rw-r--r-- | src/pc80/keyboard.c | 44 |
1 files changed, 16 insertions, 28 deletions
diff --git a/src/pc80/keyboard.c b/src/pc80/keyboard.c index d0187e9154..1b6aa4b837 100644 --- a/src/pc80/keyboard.c +++ b/src/pc80/keyboard.c @@ -97,7 +97,6 @@ static u8 send_keyboard(u8 command) static void pc_keyboard_init(struct pc_keyboard *keyboard) { u8 regval; - u8 resend; printk_debug("Keyboard init...\n"); /* clean up any junk that might have been in the kbc */ @@ -118,21 +117,14 @@ static void pc_keyboard_init(struct pc_keyboard *keyboard) } /* Enable keyboard interface - No IRQ */ - resend = 10; - regval = 0; - do { - if (!kbc_input_buffer_empty()) return; - outb(0x60, 0x64); - if (!kbc_input_buffer_empty()) return; - outb(0x20, 0x60); /* send cmd: enable keyboard */ - if (kbc_output_buffer_full()) { - regval = inb(0x60); - } else { - printk_info("Timeout while enabling keyboard. (No keyboard present?)\n"); - regval = inb(0x60); /* Better than 0 ? */ - } - --resend; - } while (regval == 0xFE && resend > 0); + if (!kbc_input_buffer_empty()) return; + outb(0x60, 0x64); + if (!kbc_input_buffer_empty()) return; + outb(0x20, 0x60); /* send cmd: enable keyboard */ + if (!kbc_input_buffer_empty()) { + printk_info("Timeout while enabling keyboard\n"); + return; + } /* clean up any junk that might have been in the keyboard */ if (!kbc_cleanup_buffers()) return; @@ -187,18 +179,14 @@ static void pc_keyboard_init(struct pc_keyboard *keyboard) } /* All is well - enable keyboard interface */ - resend = 10; - regval = 0; - do { - if (!kbc_input_buffer_empty()) return; - outb(0x60, 0x64); - if (!kbc_input_buffer_empty()) return; - outb(0x61, 0x60); /* send cmd: enable keyboard and IRQ 1 */ - if (kbc_output_buffer_full()) { - regval = inb(0x60); - } - --resend; - } while (regval == 0xFE && resend > 0); + if (!kbc_input_buffer_empty()) return; + outb(0x60, 0x64); + if (!kbc_input_buffer_empty()) return; + outb(0x61, 0x60); /* send cmd: enable keyboard and IRQ 1 */ + if (!kbc_input_buffer_empty()) { + printk_err("Timeout during final keyboard enable\n"); + return; + } } |