From 34ffe9a0423644b7635683e462cab573f97ff255 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Wed, 18 Jun 2008 09:05:33 -0700 Subject: [PATCH] TEST: issue a null command to the KBC as part of A20-flipping UHCI supposedly wants a null command (0FFh) sent to the KBC as part of the A20-flipping sequence. See if that works for us. --- core/bcopy32.inc | 18 ++++++++++++++++-- memdisk/memdisk16.asm | 18 ++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/core/bcopy32.inc b/core/bcopy32.inc index 8f36d64..4ebbe3c 100644 --- a/core/bcopy32.inc +++ b/core/bcopy32.inc @@ -413,7 +413,7 @@ a20_kbc: mov byte [cs:A20Type], A20_KBC ; Starting KBC command sequence - mov al,0D1h ; Command write + mov al,0D1h ; Write output port out 064h, al call empty_8042_uncond @@ -421,6 +421,13 @@ a20_kbc: out 060h, al call empty_8042_uncond + ; Apparently the UHCI spec assumes that A20 toggle + ; ends with a null command (assumed to be for sychronization?) + ; Put it here to see if it helps anything... + mov al,0FFh ; Null command + out 064h, al + call empty_8042_uncond + ; Verify that A20 actually is enabled. Do that by ; observing a word in low memory and the same word in ; the HMA until they are no longer coherent. Note that @@ -534,12 +541,19 @@ a20d_fast: ; a20d_kbc: call empty_8042_uncond + mov al,0D1h - out 064h, al ; Command write + out 064h, al ; Write output port call empty_8042_uncond + mov al,0DDh ; A20 off out 060h, al call empty_8042_uncond + + mov al,0FFh ; Null command/synchronization + out 064h, al + call empty_8042_uncond + ; Wait a bit for it to take effect a20d_snooze: push cx diff --git a/memdisk/memdisk16.asm b/memdisk/memdisk16.asm index 692ed8b..d73ddc5 100644 --- a/memdisk/memdisk16.asm +++ b/memdisk/memdisk16.asm @@ -294,7 +294,7 @@ a20_kbc: mov byte [A20Type], A20_KBC ; Starting KBC command sequence - mov al,0D1h ; Command write + mov al,0D1h ; Write output port out 064h, al call empty_8042_uncond @@ -302,6 +302,13 @@ a20_kbc: out 060h, al call empty_8042_uncond + ; Apparently the UHCI spec assumes that A20 toggle + ; ends with a null command (assumed to be for sychronization?) + ; Put it here to see if it helps anything... + mov al,0FFh ; Null command + out 064h, al + call empty_8042_uncond + ; Verify that A20 actually is enabled. Do that by ; observing a word in low memory and the same word in ; the HMA until they are no longer coherent. Note that @@ -424,12 +431,19 @@ a20d_fast: ; a20d_kbc: call empty_8042_uncond + mov al,0D1h - out 064h, al ; Command write + out 064h, al ; Write output port call empty_8042_uncond + mov al,0DDh ; A20 off out 060h, al call empty_8042_uncond + + mov al,0FFh ; Null command/synchronization + out 064h, al + call empty_8042_uncond + ; Wait a bit for it to take effect a20d_snooze: push cx -- 2.7.4