[ros-diffs] [cgutman] 55170: [USBOHCI] - Don't turn off interrupts before setting the OHCI_OWNERSHIP_CHANGE_REQUEST bit because it prevents the SMM driver from receiving the interrupt that tells it to give up ...

cgutman at svn.reactos.org cgutman at svn.reactos.org
Wed Jan 25 06:35:01 UTC 2012


Author: cgutman
Date: Wed Jan 25 06:35:00 2012
New Revision: 55170

URL: http://svn.reactos.org/svn/reactos?rev=55170&view=rev
Log:
[USBOHCI]
- Don't turn off interrupts before setting the OHCI_OWNERSHIP_CHANGE_REQUEST bit because it prevents the SMM driver from receiving the interrupt that tells it to give up ownership of the host controller
- This fix should be merged to Haiku also which has the same bug

Modified:
    branches/usb-bringup-trunk/drivers/usb/usbohci/hardware.cpp

Modified: branches/usb-bringup-trunk/drivers/usb/usbohci/hardware.cpp
URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/usbohci/hardware.cpp?rev=55170&r1=55169&r2=55170&view=diff
==============================================================================
--- branches/usb-bringup-trunk/drivers/usb/usbohci/hardware.cpp [iso-8859-1] (original)
+++ branches/usb-bringup-trunk/drivers/usb/usbohci/hardware.cpp [iso-8859-1] Wed Jan 25 06:35:00 2012
@@ -884,11 +884,6 @@
     ULONG Index, FrameInterval;
 
     //
-    // first turn off all interrupts
-    //
-    WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_INTERRUPT_DISABLE_OFFSET), OHCI_ALL_INTERRUPTS);
-
-    //
     // check context
     //
     Control = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_CONTROL_OFFSET));
@@ -931,18 +926,17 @@
         if (Control & OHCI_INTERRUPT_ROUTING)
         {
             DPRINT1("SMM not responding\n");
-            //
-            // some controllers also depend on this
-            //
-            WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_CONTROL_OFFSET), OHCI_HC_FUNCTIONAL_STATE_RESET);
-
-            //
-            // wait a bit
-            //
-            KeStallExecutionProcessor(100);
         }
-    }
-
+        else
+        {
+            DPRINT1("SMM has given up ownership\n");
+        }
+    }
+
+    //
+    // turn off interrupts
+    //
+    WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_INTERRUPT_DISABLE_OFFSET), OHCI_ALL_INTERRUPTS);
 
     //
     // have a break




More information about the Ros-diffs mailing list