gPXE: [a20] Send a null command to the KBC after changing A20 syslinux-3.70-pre27
authorH. Peter Anvin <hpa@zytor.com>
Fri, 27 Jun 2008 19:56:10 +0000 (12:56 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Fri, 27 Jun 2008 20:05:19 +0000 (13:05 -0700)
Send a null command, specifically "pulse outputs" with no outputs
selected, to the KBC after changing A20.  This was apparently done by
DOS, presumably as a synchronization hack, and the authors of the UHCI
spec thought it was inherent.  Therefore, there are systems out there
(e.g. HP DL360 G5) which will stop responsing to "legacy USB" unless
they see the null command, 0xFF, written to port 0x64 at the end of
the A20 toggling sequence.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
gpxe/src/arch/i386/firmware/pcbios/gateA20.c

index 2caac89..a14e341 100644 (file)
@@ -12,6 +12,7 @@
 
 #define KC_CMD_WIN     0xd0            /* read  output port */
 #define KC_CMD_WOUT    0xd1            /* write output port */
+#define KC_CMD_NULL    0xff            /* null command ("pulse nothing") */
 #define KB_SET_A20     0xdf            /* enable A20,
                                           enable output buffer full interrupt
                                           enable data line
@@ -130,6 +131,8 @@ void gateA20_set ( void ) {
                        empty_8042();
                        outb ( KB_SET_A20, K_RDWR );
                        empty_8042();
+                       outb ( KC_CMD_NULL, K_CMD );
+                       empty_8042();
                        if ( gateA20_is_set ( A20_KBC_RETRIES ) ) {
                                DBG ( "Enabled gate A20 using "
                                      "keyboard controller\n" );