Index: drivers/input/i8042prt/pnp.c =================================================================== --- drivers/input/i8042prt/pnp.c (revision 74227) +++ drivers/input/i8042prt/pnp.c (working copy) @@ -303,7 +303,9 @@ return Status; } - if (DirqlMax == PortDeviceExtension->KeyboardInterrupt.Dirql) +/* Or do we want to revert to pre-r30000: + unconditional "PortDeviceExtension->HighestDIRQLInterrupt = DirqlMax;"? */ + if (PortDeviceExtension->KeyboardInterrupt.Dirql > PortDeviceExtension->HighestDIRQLInterrupt->Irql) PortDeviceExtension->HighestDIRQLInterrupt = PortDeviceExtension->KeyboardInterrupt.Object; PortDeviceExtension->Flags |= KEYBOARD_INITIALIZED; return STATUS_SUCCESS; @@ -350,26 +352,16 @@ if (!NT_SUCCESS(Status)) { WARN_(I8042PRT, "IoConnectInterrupt() failed with status 0x%08x\n", Status); - goto cleanup; + return Status; } - if (DirqlMax == PortDeviceExtension->MouseInterrupt.Dirql) +/* Or do we want to revert to pre-r30000: + unconditional "PortDeviceExtension->HighestDIRQLInterrupt = DirqlMax;"? */ + if (NULL != PortDeviceExtension->HighestDIRQLInterrupt && PortDeviceExtension->MouseInterrupt.Dirql > PortDeviceExtension->HighestDIRQLInterrupt->Irql) PortDeviceExtension->HighestDIRQLInterrupt = PortDeviceExtension->MouseInterrupt.Object; - PortDeviceExtension->Flags |= MOUSE_INITIALIZED; - Status = STATUS_SUCCESS; -cleanup: - if (!NT_SUCCESS(Status)) - { - PortDeviceExtension->Flags &= ~MOUSE_INITIALIZED; - if (PortDeviceExtension->MouseInterrupt.Object) - { - IoDisconnectInterrupt(PortDeviceExtension->MouseInterrupt.Object); - PortDeviceExtension->HighestDIRQLInterrupt = PortDeviceExtension->KeyboardInterrupt.Object; - } - } - return Status; + return STATUS_SUCCESS; // return Status; } static NTSTATUS @@ -386,6 +378,7 @@ return STATUS_SUCCESS; } +/* Nit: Would you accept s/DeviceExtension/PortDeviceExtension/g so we use same name everywhere (all files)? */ static NTSTATUS StartProcedure( IN PPORT_DEVICE_EXTENSION DeviceExtension) @@ -443,6 +436,9 @@ } } +// I assume this ASSERT would be true, hence unneeded, isn't it? + ASSERT(DeviceExtension->HighestDIRQLInterrupt == 0); + /* Connect interrupts */ if (DeviceExtension->Flags & KEYBOARD_PRESENT && DeviceExtension->Flags & KEYBOARD_CONNECTED && @@ -471,22 +467,29 @@ if (NT_SUCCESS(Status)) { DeviceExtension->Flags |= MOUSE_INITIALIZED; + +/* Or do we actually want to reset even when uninitialized? (See r53911 and older.) + Then, instead of moving code here, + the 2 SpinLock lines would need "if (DeviceExtension->HighestDIRQLInterrupt)" and/or MOUSE_INITIALIZED... */ + /* HACK: the mouse has already been reset in i8042DetectMouse. This second + reset prevents some touchpads/mice from working (Dell D531, D600). + See CORE-6901 */ + if (!(i8042HwFlags & FL_INITHACK)) + { + /* Start the mouse */ + Irql = KeAcquireInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt); + i8042IsrWritePort(DeviceExtension, MOU_CMD_RESET, CTRL_WRITE_MOUSE); + KeReleaseInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt, Irql); + } + else + { + WARN_(I8042PRT, "Skip mouse reset, because FL_INITHACK hardware is detected.\n"); + } } else { WARN_(I8042PRT, "i8042ConnectMouseInterrupt failed: %lx\n", Status); } - - /* Start the mouse */ - Irql = KeAcquireInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt); - /* HACK: the mouse has already been reset in i8042DetectMouse. This second - reset prevents some touchpads/mice from working (Dell D531, D600). - See CORE-6901 */ - if (!(i8042HwFlags & FL_INITHACK)) - { - i8042IsrWritePort(DeviceExtension, MOU_CMD_RESET, CTRL_WRITE_MOUSE); - } - KeReleaseInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt, Irql); } return Status;