diff --git a/reactos/drivers/input/i8042prt/i8042prt.c b/reactos/drivers/input/i8042prt/i8042prt.c index 51f074c7e08..45890ac1e83 100644 --- a/reactos/drivers/input/i8042prt/i8042prt.c +++ b/reactos/drivers/input/i8042prt/i8042prt.c @@ -475,6 +475,17 @@ DriverEntry( ULONG i; NTSTATUS Status; + /* ROS Hack: ideally, we shouldn't have to initialize debug level this way, + but since the only way is to change it via KDBG, it's better to leave + it here too. */ +#if 0 + DbgSetDebugFilterState( + DPFLTR_I8042PRT_ID, + (1 << DPFLTR_ERROR_LEVEL) | (1 << DPFLTR_WARNING_LEVEL) | + (1 << DPFLTR_TRACE_LEVEL) /*| (1 << DPFLTR_INFO_LEVEL)*/ | DPFLTR_MASK, + TRUE); +#endif + Status = IoAllocateDriverObjectExtension( DriverObject, DriverObject, diff --git a/reactos/drivers/input/i8042prt/pnp.c b/reactos/drivers/input/i8042prt/pnp.c index e6f0e307c52..d92e0b5fe05 100644 --- a/reactos/drivers/input/i8042prt/pnp.c +++ b/reactos/drivers/input/i8042prt/pnp.c @@ -75,6 +75,7 @@ i8042BasicDetect( IN PPORT_DEVICE_EXTENSION DeviceExtension) { NTSTATUS Status; + ULONG ResendIterations; UCHAR Value = 0; /* Don't enable keyboard and mouse interrupts, disable keyboard/mouse */ @@ -83,23 +84,33 @@ i8042BasicDetect( i8042Flush(DeviceExtension); - if (!i8042Write(DeviceExtension, DeviceExtension->ControlPort, CTRL_SELF_TEST)) + ResendIterations = DeviceExtension->Settings.ResendIterations + 1; + while (ResendIterations--) { - WARN_(I8042PRT, "Writing CTRL_SELF_TEST command failed\n"); - return STATUS_IO_TIMEOUT; - } + if (!i8042Write(DeviceExtension, DeviceExtension->ControlPort, CTRL_SELF_TEST)) + { + WARN_(I8042PRT, "Writing CTRL_SELF_TEST command failed\n"); + return STATUS_IO_TIMEOUT; + } - Status = i8042ReadDataWait(DeviceExtension, &Value); - if (!NT_SUCCESS(Status)) - { - WARN_(I8042PRT, "Failed to read CTRL_SELF_TEST response, status 0x%08lx\n", Status); - return Status; - } + Status = i8042ReadDataWait(DeviceExtension, &Value); + if (!NT_SUCCESS(Status)) + { + WARN_(I8042PRT, "Failed to read CTRL_SELF_TEST response, status 0x%08lx\n", Status); + return Status; + } - if (Value != 0x55) - { - WARN_(I8042PRT, "Got 0x%02x instead of 0x55\n", Value); - return STATUS_IO_DEVICE_ERROR; + if (Value == KBD_RESEND) + { + TRACE_(I8042PRT, "Resending...\n", Value); + KeStallExecutionProcessor(50); + continue; + } + else if (Value != 0x55) + { + WARN_(I8042PRT, "Got 0x%02x instead of 0x55\n", Value); + return STATUS_IO_DEVICE_ERROR; + } } /* diff --git a/reactos/drivers/input/i8042prt/readwrite.c b/reactos/drivers/input/i8042prt/readwrite.c index bd281865349..a01017c6961 100644 --- a/reactos/drivers/input/i8042prt/readwrite.c +++ b/reactos/drivers/input/i8042prt/readwrite.c @@ -21,8 +21,16 @@ i8042Flush( { UCHAR Ignore; - while (NT_SUCCESS(i8042ReadData(DeviceExtension, KBD_OBF | MOU_OBF, &Ignore))) { - INFO_(I8042PRT, "Data flushed\n"); /* drop */ + /* Flush output buffer */ + while (NT_SUCCESS(i8042ReadData(DeviceExtension, KBD_OBF /* | MOU_OBF*/, &Ignore))) { + KeStallExecutionProcessor(50); + TRACE_(I8042PRT, "Output data flushed\n"); + } + + /* Flush input buffer */ + while (NT_SUCCESS(i8042ReadData(DeviceExtension, KBD_IBF, &Ignore))) { + KeStallExecutionProcessor(50); + TRACE_(I8042PRT, "Input data flushed\n"); } } @@ -189,20 +197,20 @@ i8042Write( IN PUCHAR addr, IN UCHAR data) { - ULONG ResendIterations; + ULONG Counter; ASSERT(addr); ASSERT(DeviceExtension->ControlPort != NULL); - ResendIterations = DeviceExtension->Settings.ResendIterations; + Counter = DeviceExtension->Settings.PollingIterations; while ((KBD_IBF & READ_PORT_UCHAR(DeviceExtension->ControlPort)) && - (ResendIterations--)) + (Counter--)) { KeStallExecutionProcessor(50); } - if (ResendIterations) + if (Counter) { WRITE_PORT_UCHAR(addr, data); INFO_(I8042PRT, "Sent 0x%x to port %p\n", data, addr);