[ros-diffs] [cgutman] 55189: [USBOHCI] - Properly dismiss the enable status changed interrupt to avoid an interrupt storm after a device is disconnected

cgutman at svn.reactos.org cgutman at svn.reactos.org
Thu Jan 26 01:46:08 UTC 2012


Author: cgutman
Date: Thu Jan 26 01:46:06 2012
New Revision: 55189

URL: http://svn.reactos.org/svn/reactos?rev=55189&view=rev
Log:
[USBOHCI]
- Properly dismiss the enable status changed interrupt to avoid an interrupt storm after a device is disconnected

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=55189&r1=55188&r2=55189&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] Thu Jan 26 01:46:06 2012
@@ -1125,9 +1125,9 @@
     if (Value & OHCI_RH_PORTSTATUS_PES)
         *PortStatus |= USB_PORT_STATUS_ENABLE;
 
-    // port enabled
+    // port disconnect or hardware error
     if (Value & OHCI_RH_PORTSTATUS_PESC)
-        *PortChange |= USB_PORT_STATUS_ENABLE;
+        *PortChange |= USB_PORT_STATUS_CONNECT;
 
     // port suspend
     if (Value & OHCI_RH_PORTSTATUS_PSS)
@@ -1211,7 +1211,6 @@
         //
         // sanity checks
         //
-        ASSERT((Value & OHCI_RH_PORTSTATUS_PRS) == 0);
         ASSERT((Value & OHCI_RH_PORTSTATUS_PRSC));
 
         //
@@ -1219,27 +1218,24 @@
         //
         WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_RH_PORT_STATUS(PortId)), OHCI_RH_PORTSTATUS_PRSC);
 
-
         //
         // sanity check
         //
         ASSERT((Value & OHCI_RH_PORTSTATUS_PES));
-
-        //
-        // re-enable root hub change
-        //
-        Value = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_INTERRUPT_ENABLE_OFFSET));
-        WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_INTERRUPT_ENABLE_OFFSET), Value | OHCI_ROOT_HUB_STATUS_CHANGE);
-
-    }
-
-    if (Status == C_PORT_CONNECTION)
-    {
-        //
-        // clear bit
-        //
-        WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_RH_PORT_STATUS(PortId)), OHCI_RH_PORTSTATUS_CSC);
-    }
+    }
+
+    if (Status == C_PORT_CONNECTION || Status == C_PORT_ENABLE)
+    {
+        //
+        // clear bits
+        //
+        WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_RH_PORT_STATUS(PortId)), OHCI_RH_PORTSTATUS_CSC | OHCI_RH_PORTSTATUS_PESC);
+    }
+
+    //
+    // re-enable root hub change
+    //
+    WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_INTERRUPT_ENABLE_OFFSET), OHCI_ROOT_HUB_STATUS_CHANGE);
 
     return STATUS_SUCCESS;
 }
@@ -1475,10 +1471,6 @@
     if (Status & OHCI_ROOT_HUB_STATUS_CHANGE) 
     {
         //
-        // new device has arrived
-        //
-
-        //
         // disable interrupt as it will fire untill the port has been reset
         //
         WRITE_REGISTER_ULONG((PULONG)((PUCHAR)This->m_Base + OHCI_INTERRUPT_DISABLE_OFFSET), OHCI_ROOT_HUB_STATUS_CHANGE);




More information about the Ros-diffs mailing list