6b2dd0f
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
bc092b9
From: Vladimir Serbinenko <phcoder@gmail.com>
bc092b9
Date: Tue, 9 May 2017 14:27:52 +0200
31cddd6
Subject: [PATCH] at_keyboard: Fix falco chromebook case.
bc092b9
bc092b9
EC is slow, so we need few delays for it to toggle the bits correctly.
bc092b9
bc092b9
Command to enable clock and keyboard were not sent.
bc092b9
---
bc092b9
 grub-core/term/at_keyboard.c | 23 ++++++++++++++---------
bc092b9
 include/grub/at_keyboard.h   |  2 ++
bc092b9
 2 files changed, 16 insertions(+), 9 deletions(-)
bc092b9
bc092b9
diff --git a/grub-core/term/at_keyboard.c b/grub-core/term/at_keyboard.c
ec4acbb
index 3ab4e205f40..f0a986eb176 100644
bc092b9
--- a/grub-core/term/at_keyboard.c
bc092b9
+++ b/grub-core/term/at_keyboard.c
bc092b9
@@ -40,6 +40,8 @@ grub_keyboard_controller_init (void);
bc092b9
 static void
bc092b9
 keyboard_controller_wait_until_ready (void)
bc092b9
 {
bc092b9
+  /* 50 us would be enough but our current time resolution is 1ms.  */
bc092b9
+  grub_millisleep (1);
bc092b9
   while (! KEYBOARD_COMMAND_ISREADY (grub_inb (KEYBOARD_REG_STATUS)));
bc092b9
 }
bc092b9
 
bc092b9
@@ -50,10 +52,11 @@ wait_ack (void)
bc092b9
   grub_uint8_t ack;
bc092b9
 
bc092b9
   endtime = grub_get_time_ms () + 20;
bc092b9
-  do
bc092b9
+  do {
bc092b9
+    keyboard_controller_wait_until_ready ();
bc092b9
     ack = grub_inb (KEYBOARD_REG_DATA);
bc092b9
-  while (ack != GRUB_AT_ACK && ack != GRUB_AT_NACK
bc092b9
-	 && grub_get_time_ms () < endtime);
bc092b9
+  } while (ack != GRUB_AT_ACK && ack != GRUB_AT_NACK
bc092b9
+	   && grub_get_time_ms () < endtime);
bc092b9
   return ack;
bc092b9
 }
bc092b9
 
bc092b9
@@ -135,12 +138,10 @@ query_mode (void)
bc092b9
   if (!e)
bc092b9
     return 0;
bc092b9
 
bc092b9
-  keyboard_controller_wait_until_ready ();
bc092b9
-
bc092b9
-  do
bc092b9
+  do {
bc092b9
+    keyboard_controller_wait_until_ready ();
bc092b9
     ret = grub_inb (KEYBOARD_REG_DATA);
bc092b9
-  while (ret == GRUB_AT_ACK);
bc092b9
-
bc092b9
+  } while (ret == GRUB_AT_ACK);
bc092b9
   /* QEMU translates the set even in no-translate mode.  */
bc092b9
   if (ret == 0x43 || ret == 1)
bc092b9
     return 1;
bc092b9
@@ -169,7 +170,11 @@ set_scancodes (void)
bc092b9
 #else
bc092b9
 
bc092b9
   grub_keyboard_controller_write (grub_keyboard_controller_orig
bc092b9
-				  & ~KEYBOARD_AT_TRANSLATE);
bc092b9
+				  & ~KEYBOARD_AT_TRANSLATE
bc092b9
+				  & ~KEYBOARD_AT_DISABLE);
bc092b9
+
bc092b9
+  keyboard_controller_wait_until_ready ();
bc092b9
+  grub_outb (KEYBOARD_COMMAND_ENABLE, KEYBOARD_REG_DATA);
bc092b9
 
bc092b9
   write_mode (2);
bc092b9
   ps2_state.current_set = query_mode ();
bc092b9
diff --git a/include/grub/at_keyboard.h b/include/grub/at_keyboard.h
ec4acbb
index b031523eb7d..bcb4d9ba78f 100644
bc092b9
--- a/include/grub/at_keyboard.h
bc092b9
+++ b/include/grub/at_keyboard.h
bc092b9
@@ -23,9 +23,11 @@
bc092b9
 #define KEYBOARD_COMMAND_ISREADY(x)	!((x) & 0x02)
bc092b9
 #define KEYBOARD_COMMAND_READ		0x20
bc092b9
 #define KEYBOARD_COMMAND_WRITE		0x60
bc092b9
+#define KEYBOARD_COMMAND_ENABLE		0xf4
bc092b9
 #define KEYBOARD_COMMAND_REBOOT		0xfe
bc092b9
 
bc092b9
 #define KEYBOARD_AT_TRANSLATE		0x40
bc092b9
+#define KEYBOARD_AT_DISABLE		0x10
bc092b9
 
bc092b9
 #define KEYBOARD_ISMAKE(x)	!((x) & 0x80)
bc092b9
 #define KEYBOARD_ISREADY(x)	((x) & 0x01)