Author: cgutman
Date: Fri Sep 30 23:01:45 2011
New Revision: 53911

URL: http://svn.reactos.org/svn/reactos?rev=53911&view=rev
Log:
[I8042PRT]
- Enable all interrupts at the same time to avoid a condition where the 
controller stops responding to KBD_READ_MODE on some systems
- See bug #6271 for details

Modified:
    trunk/reactos/drivers/input/i8042prt/pnp.c

Modified: trunk/reactos/drivers/input/i8042prt/pnp.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/input/i8042prt/pnp.c?rev=53911&r1=53910&r2=53911&view=diff
==============================================================================
--- trunk/reactos/drivers/input/i8042prt/pnp.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/input/i8042prt/pnp.c [iso-8859-1] Fri Sep 30 23:01:45 
2011
@@ -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,15 +470,13 @@
         if (NT_SUCCESS(Status))
         {
             DeviceExtension->Flags |= MOUSE_INITIALIZED;
-            FlagsToDisable |= CCB_MOUSE_DISAB;
-            FlagsToEnable |= CCB_MOUSE_INT_ENAB;
-        }
-    }
-
-    if (FlagsToEnable)
-        Status = EnableInterrupts(DeviceExtension, FlagsToDisable, 
FlagsToEnable);
-    else
-        Status = STATUS_SUCCESS;
+        }
+
+        /* Start the mouse */
+        Irql = 
KeAcquireInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt);
+        i8042IsrWritePort(DeviceExtension, MOU_CMD_RESET, CTRL_WRITE_MOUSE);
+        KeReleaseInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt, 
Irql);
+    }
 
     return Status;
 }


Reply via email to