[USBEHCI] [USBOHCI]

- Do not queue a work item twice 

svn path=/trunk/; revision=55594
This commit is contained in:
Johannes Anderwald
2012-02-14 19:04:23 +00:00
parent 5ca21de331
commit 65666555ca
2 changed files with 35 additions and 25 deletions
+20 -14
View 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;
}
+15 -11
View 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