Author: cgutman
Date: Mon Jan 30 22:45:16 2012
New Revision: 55339
URL:
http://svn.reactos.org/svn/reactos?rev=55339&view=rev
Log:
[USBHUB]
- Missed a fix from last commit
- Wait for the device status change work item to complete
- The USB stack is now properly constructed for USB booting
Modified:
branches/usb-bringup-trunk/drivers/usb/usbhub_new/fdo.c
branches/usb-bringup-trunk/drivers/usb/usbhub_new/usbhub.h
Modified: branches/usb-bringup-trunk/drivers/usb/usbhub_new/fdo.c
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/u…
==============================================================================
--- branches/usb-bringup-trunk/drivers/usb/usbhub_new/fdo.c [iso-8859-1] (original)
+++ branches/usb-bringup-trunk/drivers/usb/usbhub_new/fdo.c [iso-8859-1] Mon Jan 30
22:45:16 2012
@@ -260,8 +260,6 @@
PORT_STATUS_CHANGE PortStatus;
LONG PortId;
- static LONG failsafe = 0;
-
DPRINT1("Entered DeviceStatusChangeThread, Context %x\n", Context);
WorkItemData = (PWORK_ITEM_DATA)Context;
@@ -408,20 +406,7 @@
}
}
- //
- // FIXME: Still in testing
- //
- failsafe++;
- if (failsafe > 100)
- {
- DPRINT1("SCE completed over 100 times but no action has been taken to clear
the Change of any ports.\n");
- //
- // Return and dont send any more SCE Requests
- //
- return;
- }
-
- ExFreePool(WorkItemData);
+ KeSetEvent(&WorkItemData->Event, IO_NO_INCREMENT, FALSE);
//
// Send another SCE Request
@@ -460,6 +445,7 @@
return STATUS_INSUFFICIENT_RESOURCES;
}
WorkItemData->Context = RealDeviceObject;
+ KeInitializeEvent(&WorkItemData->Event, NotificationEvent, FALSE);
DPRINT1("Initialize work item\n");
ExInitializeWorkItem(&WorkItemData->WorkItem, DeviceStatusChangeThread,
(PVOID)WorkItemData);
@@ -467,6 +453,16 @@
// Queue the work item to handle initializing the device
//
ExQueueWorkItem(&WorkItemData->WorkItem, DelayedWorkQueue);
+
+ //
+ // Wait for the work item
+ //
+ KeWaitForSingleObject(&WorkItemData->Event,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+ ExFreePool(WorkItemData);
//
// Return more processing required so the IO Manger doesnât try to mess with IRP
just freed
@@ -1823,6 +1819,11 @@
}
else
{
+ //
+ // Send the first SCE Request
+ //
+ QueryStatusChangeEndpoint(DeviceObject);
+
//
// reset ports
//
@@ -1848,11 +1849,6 @@
}
}
}
-
- //
- // Send the first SCE Request
- //
- QueryStatusChangeEndpoint(DeviceObject);
}
ExFreePool(Urb);
Modified: branches/usb-bringup-trunk/drivers/usb/usbhub_new/usbhub.h
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/u…
==============================================================================
--- branches/usb-bringup-trunk/drivers/usb/usbhub_new/usbhub.h [iso-8859-1] (original)
+++ branches/usb-bringup-trunk/drivers/usb/usbhub_new/usbhub.h [iso-8859-1] Mon Jan 30
22:45:16 2012
@@ -44,6 +44,7 @@
typedef struct _WORK_ITEM_DATA
{
WORK_QUEUE_ITEM WorkItem;
+ KEVENT Event;
PVOID Context;
} WORK_ITEM_DATA, *PWORK_ITEM_DATA;