summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Jones <marcj303@gmail.com>2009-09-29 19:12:23 +0000
committerMyles Watson <mylesgw@gmail.com>2009-09-29 19:12:23 +0000
commite59f2e1f338e8e424437e6a2bfac83cc493c164e (patch)
tree8a39d3c42491e83404a3052ce6c031cc7ef1b8d5
parent120bff83ff0c135c6248242416bbff2e61051d41 (diff)
downloadcoreboot-e59f2e1f338e8e424437e6a2bfac83cc493c164e.tar.xz
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
-rw-r--r--src/pc80/keyboard.c44
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;
+ }
}