A keyboard controller fix to stop the code from waiting for a code that never
authorMarc Jones <marcj303@gmail.com>
Tue, 29 Sep 2009 19:12:23 +0000 (19:12 +0000)
committerMyles Watson <mylesgw@gmail.com>
Tue, 29 Sep 2009 19:12:23 +0000 (19:12 +0000)
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

src/pc80/keyboard.c

index d0187e915401ffa398f2ce9dbcc1accff788523e..1b6aa4b83712c1de213f5f1e57f2f1d7e4a5ee32 100644 (file)
@@ -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;
+       }
 }