From: Serge Gautherie Date: Fri, 24 Mar 2017 07:25:00 +0100 Subject: [I8042PRT] pnp.c: Better manage 'HighestDIRQLInterrupt', and more... (Improved from Trivalik's and hater's ideas.) CORE-12960 Index: reactos/drivers/input/i8042prt/pnp.c --- a/reactos/drivers/input/i8042prt/pnp.c +++ b/reactos/drivers/input/i8042prt/pnp.c @@ -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) PortDeviceExtension->HighestDIRQLInterrupt = PortDeviceExtension->KeyboardInterrupt.Object; PortDeviceExtension->Flags |= KEYBOARD_INITIALIZED; return STATUS_SUCCESS; @@ -350,15 +352,19 @@ if (!NT_SUCCESS(Status)) { WARN_(I8042PRT, "IoConnectInterrupt() failed with status 0x%08x\n", Status); - goto cleanup; + return Status; // goto cleanup; } - if (DirqlMax == PortDeviceExtension->MouseInterrupt.Dirql) +/* Or do we want to revert to pre-r30000: + unconditional "PortDeviceExtension->HighestDIRQLInterrupt = DirqlMax;"? */ + if (PortDeviceExtension->MouseInterrupt.Dirql > PortDeviceExtension->HighestDIRQLInterrupt) PortDeviceExtension->HighestDIRQLInterrupt = PortDeviceExtension->MouseInterrupt.Object; - PortDeviceExtension->Flags |= MOUSE_INITIALIZED; - Status = STATUS_SUCCESS; + // Status = STATUS_SUCCESS; +#if 0 +/* Added by r30000. But useless, isn't it? */ + cleanup: if (!NT_SUCCESS(Status)) { @@ -366,10 +372,13 @@ if (PortDeviceExtension->MouseInterrupt.Object) { IoDisconnectInterrupt(PortDeviceExtension->MouseInterrupt.Object); +/* This is even incorrect. */ PortDeviceExtension->HighestDIRQLInterrupt = PortDeviceExtension->KeyboardInterrupt.Object; } } - return Status; +#endif + + return STATUS_SUCCESS; // return Status; } static NTSTATUS @@ -386,6 +395,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 +453,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 +484,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;