Index: drivers/input/i8042prt/pnp.c =================================================================== --- drivers/input/i8042prt/pnp.c (revision 53899) +++ drivers/input/i8042prt/pnp.c (working copy) @@ -381,16 +381,6 @@ if (!i8042ChangeMode(DeviceExtension, FlagsToDisable, FlagsToEnable)) return STATUS_UNSUCCESSFUL; - /* Reset the mouse (if any) to start the detection */ - if (DeviceExtension->Flags & MOUSE_PRESENT) - { - KIRQL Irql; - - Irql = KeAcquireInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt); - i8042IsrWritePort(DeviceExtension, MOU_CMD_RESET, CTRL_WRITE_MOUSE); - KeReleaseInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt, Irql); - } - return STATUS_SUCCESS; } @@ -401,6 +391,7 @@ NTSTATUS Status; UCHAR FlagsToDisable = 0; UCHAR FlagsToEnable = 0; + KIRQL Irql; if (DeviceExtension->DataPort == 0) { @@ -434,6 +425,25 @@ INFO_(I8042PRT, "Keyboard present: %s\n", DeviceExtension->Flags & KEYBOARD_PRESENT ? "YES" : "NO"); INFO_(I8042PRT, "Mouse present : %s\n", DeviceExtension->Flags & MOUSE_PRESENT ? "YES" : "NO"); + + TRACE_(I8042PRT, "Enabling i8042 interrupts\n"); + if (DeviceExtension->Flags & KEYBOARD_PRESENT) + { + FlagsToDisable |= CCB_KBD_DISAB; + FlagsToEnable |= CCB_KBD_INT_ENAB; + } + if (DeviceExtension->Flags & MOUSE_PRESENT) + { + FlagsToDisable |= CCB_MOUSE_DISAB; + FlagsToEnable |= CCB_MOUSE_INT_ENAB; + } + + Status = EnableInterrupts(DeviceExtension, FlagsToDisable, FlagsToEnable); + if (!NT_SUCCESS(Status)) + { + DeviceExtension->Flags &= ~(KEYBOARD_PRESENT | MOUSE_PRESENT); + return Status; + } } /* Connect interrupts */ @@ -447,8 +457,6 @@ if (NT_SUCCESS(Status)) { DeviceExtension->Flags |= KEYBOARD_INITIALIZED; - FlagsToDisable |= CCB_KBD_DISAB; - FlagsToEnable |= CCB_KBD_INT_ENAB; } } @@ -462,16 +470,14 @@ if (NT_SUCCESS(Status)) { DeviceExtension->Flags |= MOUSE_INITIALIZED; - FlagsToDisable |= CCB_MOUSE_DISAB; - FlagsToEnable |= CCB_MOUSE_INT_ENAB; } + + /* Start the mouse */ + Irql = KeAcquireInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt); + i8042IsrWritePort(DeviceExtension, MOU_CMD_RESET, CTRL_WRITE_MOUSE); + KeReleaseInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt, Irql); } - if (FlagsToEnable) - Status = EnableInterrupts(DeviceExtension, FlagsToDisable, FlagsToEnable); - else - Status = STATUS_SUCCESS; - return Status; }