bc092b9
From c4b8bec5fee4e30a165fd14a188cf3ab8eccd095 Mon Sep 17 00:00:00 2001
bc092b9
From: Vladimir Serbinenko <phcoder@gmail.com>
bc092b9
Date: Tue, 9 May 2017 14:27:52 +0200
6f1e3d5
Subject: [PATCH 036/198] 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
bc092b9
index 3ab4e205f..f0a986eb1 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
bc092b9
index b031523eb..bcb4d9ba7 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)
bc092b9
-- 
da63b36
2.14.3
bc092b9