[USBEHCI] [USBOHCI]
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Tue, 14 Feb 2012 19:04:23 +0000 (19:04 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Tue, 14 Feb 2012 19:04:23 +0000 (19:04 +0000)
- Do not queue a work item twice

svn path=/trunk/; revision=55594

reactos/drivers/usb/usbehci/hardware.cpp
reactos/drivers/usb/usbohci/hardware.cpp

index ecc8951..8ee24e9 100644 (file)
@@ -1377,7 +1377,7 @@ EhciDefferedRoutine(
     IN PVOID SystemArgument2)
 {
     CUSBHardwareDevice *This;
-    ULONG CStatus, PortStatus, PortCount, i, ShouldRingDoorBell;
+    ULONG CStatus, PortStatus, PortCount, i, ShouldRingDoorBell, QueueSCEWorkItem;
     NTSTATUS Status = STATUS_SUCCESS;
     EHCI_USBCMD_CONTENT UsbCmd;
 
@@ -1462,10 +1462,10 @@ EhciDefferedRoutine(
     This->GetDeviceDetails(NULL, NULL, &PortCount, NULL);
     if (CStatus & EHCI_STS_PCD)
     {
+        QueueSCEWorkItem = FALSE;
         for (i = 0; i < PortCount; i++)
         {
             PortStatus = This->EHCI_READ_REGISTER_ULONG(EHCI_PORTSC + (4 * i));
-
             //
             // Device connected or removed
             //
@@ -1492,28 +1492,34 @@ EhciDefferedRoutine(
                             continue;
                         }
                     }
+
+                    //
+                    // work to do
+                    //
+                    QueueSCEWorkItem = TRUE;
                 }
                 else
                 {
                     DPRINT1("Device disconnected on port %d\n", i);
-                }
 
-                //
-                // is there a status change callback
-                //
-                if (This->m_SCECallBack != NULL)
-                {
                     //
-                    // queue work item for processing
+                    // work to do
                     //
-                    ExQueueWorkItem(&This->m_StatusChangeWorkItem, DelayedWorkQueue);
+                    QueueSCEWorkItem = TRUE;
                 }
-
-                //
-                // FIXME: This needs to be saved somewhere
-                //
             }
         }
+
+        //
+        // is there a status change callback and a high speed device connected / disconnected
+        //
+        if (QueueSCEWorkItem && This->m_SCECallBack != NULL)
+        {
+            //
+            // queue work item for processing
+            //
+            ExQueueWorkItem(&This->m_StatusChangeWorkItem, DelayedWorkQueue);
+        }
     }
     return;
 }
index 4bf6ccf..8b30b5c 100644 (file)
@@ -1589,7 +1589,7 @@ OhciDefferedRoutine(
 {
     CUSBHardwareDevice *This;
     ULONG CStatus, Index, PortStatus;
-    ULONG DoneHead;
+    ULONG DoneHead, QueueSCEWorkItem;
 
     //
     // get parameters
@@ -1612,6 +1612,7 @@ OhciDefferedRoutine(
         //
         // device connected, lets check which port
         //
+        QueueSCEWorkItem = FALSE;
         for(Index = 0; Index < This->m_NumberOfPorts; Index++)
         {
             //
@@ -1648,20 +1649,23 @@ OhciDefferedRoutine(
                 }
 
                 //
-                // is there a status change callback
+                // work to do
                 //
-                if (This->m_SCECallBack != NULL)
-                {
-                    //
-                    // queue work item for processing
-                    //
-                    ExQueueWorkItem(&This->m_StatusChangeWorkItem, DelayedWorkQueue);
-                }
+                QueueSCEWorkItem = TRUE;
             }
         }
-    }
-
 
+        //
+        // is there a status change callback and a device connected / disconnected
+        //
+        if (QueueSCEWorkItem && This->m_SCECallBack != NULL)
+        {
+            //
+            // queue work item for processing
+            //
+            ExQueueWorkItem(&This->m_StatusChangeWorkItem, DelayedWorkQueue);
+        }
+    }
 }
 
 VOID