Index: keyboard.c =================================================================== --- keyboard.c (revision 17025) +++ keyboard.c (working copy) @@ -605,7 +605,7 @@ } Status = I8042ReadDataWait(DevExt, &Value); - if (Status != STATUS_SUCCESS) { + if (!NT_SUCCESS(Status)) { DPRINT1("No response after read i8042 mode\n"); return FALSE; } @@ -640,13 +640,13 @@ Status = I8042SynchWritePort(DevExt, 0, KBD_GET_ID, TRUE); } while (STATUS_TIMEOUT == Status && RetryCount--); - if (Status != STATUS_SUCCESS) { + if (!NT_SUCCESS(Status)) { DPRINT1("Can't write GET_ID (%x)\n", Status); return FALSE; } Status = I8042ReadDataWait(DevExt, &Value); - if (Status != STATUS_SUCCESS) { + if (!NT_SUCCESS(Status)) { DPRINT1("No response after GET_ID\n"); /* Could be an AT keyboard */ DevExt->KeyboardIsAT = TRUE; @@ -663,7 +663,7 @@ DPRINT("Keyboard ID: %x", Value); Status = I8042ReadDataWait(DevExt, &Value); - if (Status != STATUS_SUCCESS) { + if (!NT_SUCCESS(Status)) { DPRINT("Partial ID\n"); return FALSE; } @@ -672,12 +672,12 @@ detectsetleds: Status = I8042SynchWritePort(DevExt, 0, KBD_SET_LEDS, TRUE); - if (Status != STATUS_SUCCESS) { + if (!NT_SUCCESS(Status)) { DPRINT("Can't write SET_LEDS (%x)\n", Status); return FALSE; } Status = I8042SynchWritePort(DevExt, 0, 0, TRUE); - if (Status != STATUS_SUCCESS) { + if (!NT_SUCCESS(Status)) { DPRINT("Can't finish SET_LEDS (%x)\n", Status); return FALSE; } @@ -690,7 +690,7 @@ } Status = I8042ReadDataWait(DevExt, &Value); - if (Status != STATUS_SUCCESS) { + if (!NT_SUCCESS(Status)) { DPRINT1("No response after read i8042 mode\n"); return FALSE; } Index: i8042prt.h =================================================================== --- i8042prt.h (revision 17025) +++ i8042prt.h (working copy) @@ -387,6 +387,8 @@ BOOLEAN STDCALL I8042MouseEnable(PDEVICE_EXTENSION DevExt); BOOLEAN STDCALL I8042MouseDisable(PDEVICE_EXTENSION DevExt); +BOOLEAN STDCALL I8042DetectMouse(PDEVICE_EXTENSION DevExt); + /* ps2pp.c */ VOID I8042MouseHandlePs2pp(PDEVICE_EXTENSION DevExt, BYTE Input); Index: mouse.c =================================================================== --- mouse.c (revision 17025) +++ mouse.c (working copy) @@ -833,7 +833,7 @@ } Status = I8042ReadDataWait(DevExt, &Value); - if (Status != STATUS_SUCCESS) { + if (!NT_SUCCESS(Status)) { DPRINT1("No response after read i8042 mode\n"); return FALSE; } @@ -869,7 +869,7 @@ } Status = I8042ReadDataWait(DevExt, &Value); - if (Status != STATUS_SUCCESS) { + if (!NT_SUCCESS(Status)) { DPRINT1("No response after read i8042 mode\n"); return FALSE; } @@ -895,3 +895,45 @@ return TRUE; } + +BOOLEAN STDCALL I8042DetectMouse(PDEVICE_EXTENSION DevExt) +{ + NTSTATUS Status; + UCHAR Value; + UINT RetryCount = 10; + + DPRINT("Detecting mouse\n"); + + I8042MouseDisable(DevExt); + + do { + Status = I8042SynchWritePort(DevExt, 0, KBD_GET_ID, TRUE); + } while (STATUS_TIMEOUT == Status && RetryCount--); + + if (!NT_SUCCESS(Status)) { + DPRINT1("Can't write KBD_GET_ID (%x)\n", Status); + return FALSE; + } + + /* We're interested only in the second byte. */ + Status = I8042ReadDataWait(DevExt, &Value); + if (!NT_SUCCESS(Status)) { + DPRINT1("No response after KBD_GET_ID\n"); + return FALSE; + } + + Status = I8042ReadDataWait(DevExt, &Value); + if (!NT_SUCCESS(Status)) { + DPRINT1("No response after KBD_GET_ID\n"); + return FALSE; + } + + Value &= 0xf; + if (Value != 0 && Value != 3 && Value != 4) { + DPRINT("Bad ID: %x\n", Value); + return FALSE; + } + + return TRUE; +} + Index: registry.c =================================================================== --- registry.c (revision 17025) +++ registry.c (working copy) @@ -211,7 +211,7 @@ NULL, NULL); - if (Status != STATUS_SUCCESS) { + if (!NT_SUCCESS(Status)) { DPRINT1 ("Can't read registry: %x\n", Status); /* Actually, the defaults are not set when the function * fails, as would happen during setup, so you have to Index: i8042prt.c =================================================================== --- i8042prt.c (revision 17025) +++ i8042prt.c (working copy) @@ -153,7 +153,7 @@ if (WaitForAck) { Status = I8042ReadDataWait(DevExt, &Ack); - if (Status != STATUS_SUCCESS) + if (!NT_SUCCESS(Status)) return Status; if (Ack == KBD_ACK) return STATUS_SUCCESS; @@ -426,7 +426,7 @@ I8042SynchReadPort, I8042SynchWritePortKbd, FALSE); - if (Status != STATUS_SUCCESS) { + if (!NT_SUCCESS(Status)) { WorkItemData->Irp->IoStatus.Status = Status; goto hookworkitemdone; } @@ -514,8 +514,14 @@ UCHAR Value = 0; UINT Counter; + DevExt->MouseExists = FALSE; + DevExt->KeyboardExists = FALSE; + I8042Flush(); + if (!I8042Write(DevExt, I8042_DATA_PORT, 0x74)) + return STATUS_TIMEOUT; + if (!I8042Write(DevExt, I8042_CTRL_PORT, KBD_SELF_TEST)) return STATUS_TIMEOUT; @@ -525,37 +531,26 @@ Status = I8042ReadDataWait(DevExt, &Value); } while ((Counter--) && (STATUS_TIMEOUT == Status)); - if (Status != STATUS_SUCCESS) + if (!NT_SUCCESS(Status)) return Status; if (Value != 0x55) { DPRINT1("Got %x instead of 55\n", Value); return STATUS_IO_DEVICE_ERROR; } - if (!I8042Write(DevExt, I8042_CTRL_PORT, KBD_LINE_TEST)) - return STATUS_TIMEOUT; - Status = I8042ReadDataWait(DevExt, &Value); - if (Status != STATUS_SUCCESS) - return Status; - - if (Value == 0) { - DevExt->KeyboardExists = TRUE; - } else { - DevExt->KeyboardExists = FALSE; + if (I8042Write(DevExt, I8042_CTRL_PORT, KBD_LINE_TEST)) + { + Status = I8042ReadDataWait(DevExt, &Value); + if (NT_SUCCESS(Status) && Value == 0) + DevExt->KeyboardExists = TRUE; } - if (!I8042Write(DevExt, I8042_CTRL_PORT, MOUSE_LINE_TEST)) - return STATUS_TIMEOUT; - - Status = I8042ReadDataWait(DevExt, &Value); - if (Status != STATUS_SUCCESS) - return Status; - - if (Value == 0) { - DevExt->MouseExists = TRUE; - } else { - DevExt->MouseExists = FALSE; + if (I8042Write(DevExt, I8042_CTRL_PORT, MOUSE_LINE_TEST)) + { + Status = I8042ReadDataWait(DevExt, &Value); + if (NT_SUCCESS(Status) && Value == 0) + DevExt->MouseExists = TRUE; } return STATUS_SUCCESS; @@ -566,28 +561,36 @@ NTSTATUS Status; Status = I8042BasicDetect(DevExt); - if (Status != STATUS_SUCCESS) { + if (!NT_SUCCESS(Status)) { DPRINT1("Basic keyboard detection failed: %x\n", Status); return Status; } if (!DevExt->KeyboardExists) { - DPRINT("Keyboard not detected\n"); + DPRINT("Keyboard port not detected\n"); if (DevExt->Settings.Headless) /* Act as if it exists regardless */ DevExt->KeyboardExists = TRUE; } else { - DPRINT("Keyboard detected\n"); + DPRINT("Keyboard port detected\n"); DevExt->KeyboardExists = I8042DetectKeyboard(DevExt); } + if (DevExt->MouseExists) { + DPRINT("Mouse port detected\n"); + DevExt->MouseExists = I8042DetectMouse(DevExt); + } + if (DevExt->KeyboardExists) { + DPRINT("Keyboard detected\n"); I8042KeyboardEnable(DevExt); I8042KeyboardEnableInterrupt(DevExt); } - if (DevExt->MouseExists) + if (DevExt->MouseExists) { + DPRINT("Mouse detected\n"); I8042MouseEnable(DevExt); + } return STATUS_SUCCESS; }