diff options
author | H. Peter Anvin <hpa@zytor.com> | 2008-06-27 13:23:00 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2008-06-27 13:29:01 -0700 |
commit | aa60d13fb04f6d5ce72e4da508a4048b934ebd24 (patch) | |
tree | 85f58c1735c71f41579d942e9fdb15d86b15e0ad /arch/x86/boot/a20.c | |
parent | 23deb06821442506615f34bd92ccd6a2422629d7 (diff) | |
download | op-kernel-dev-aa60d13fb04f6d5ce72e4da508a4048b934ebd24.zip op-kernel-dev-aa60d13fb04f6d5ce72e4da508a4048b934ebd24.tar.gz |
x86: setup: issue a null command after enabling A20 via KBC
Apparently, DOS and possibly other legacy operating systems issued a
null command to the keyboard controller after toggling A20,
specifically "pulse output pins" with no output pins specified. This
was presumably done for synchronization reasons. This has made it
into at least the UHCI spec, and it has been found to cause
compatibility problems when "legacy USB" is enabled (which it almost
always is) to not have this byte sent.
It is *NOT* clear if any of these compatibility problems has any
effect on Linux. However, for maximum compatibility, issue this null
command after togging A20 through the KBC.
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'arch/x86/boot/a20.c')
-rw-r--r-- | arch/x86/boot/a20.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/arch/x86/boot/a20.c b/arch/x86/boot/a20.c index 90943f8..ef6e142 100644 --- a/arch/x86/boot/a20.c +++ b/arch/x86/boot/a20.c @@ -1,7 +1,7 @@ /* -*- linux-c -*- ------------------------------------------------------- * * * Copyright (C) 1991, 1992 Linus Torvalds - * Copyright 2007 rPath, Inc. - All Rights Reserved + * Copyright 2007-2008 rPath, Inc. - All Rights Reserved * * This file is part of the Linux kernel, and is made available under * the terms of the GNU General Public License version 2. @@ -95,6 +95,9 @@ static void enable_a20_kbc(void) outb(0xdf, 0x60); /* A20 on */ empty_8042(); + + outb(0xff, 0x64); /* Null command, but UHCI wants it */ + empty_8042(); } static void enable_a20_fast(void) |