From d1c2395c8be0ce4c8a40d077b73c5c9ebf0eb134 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Wed, 31 Jul 2013 18:21:24 +0000 Subject: [PATCH] [LIBUSB] - Perform intialization of root hub in a worker thread - Should help ReactOS to continue booting when an usb controller causes hangs svn path=/trunk/; revision=59605 --- reactos/lib/drivers/libusb/hub_controller.cpp | 47 ++++++++++++++++++- reactos/lib/drivers/libusb/libusb.h | 8 ++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/reactos/lib/drivers/libusb/hub_controller.cpp b/reactos/lib/drivers/libusb/hub_controller.cpp index 62c1f3762d9..eef9b72855e 100644 --- a/reactos/lib/drivers/libusb/hub_controller.cpp +++ b/reactos/lib/drivers/libusb/hub_controller.cpp @@ -3351,6 +3351,31 @@ USBHI_Initialize20Hub( return STATUS_SUCCESS; } + +WORKER_THREAD_ROUTINE InitRootHub; + +VOID +NTAPI +InitRootHub(IN PVOID Context) +{ + PINIT_ROOT_HUB_CONTEXT WorkItem; + + // + // get context + // + WorkItem = (PINIT_ROOT_HUB_CONTEXT)Context; + + // + // perform callback + // + WorkItem->CallbackRoutine(WorkItem->CallbackContext); + + // + // free contextg + // + ExFreePoolWithTag(Context, TAG_USBLIB); +} + NTSTATUS USB_BUSIFFN USBHI_RootHubInitNotification( @@ -3359,6 +3384,7 @@ USBHI_RootHubInitNotification( PRH_INIT_CALLBACK CallbackRoutine) { CHubController * Controller; + PINIT_ROOT_HUB_CONTEXT WorkItem; DPRINT("USBHI_RootHubInitNotification %p \n", CallbackContext); @@ -3374,9 +3400,26 @@ USBHI_RootHubInitNotification( Controller->SetNotification(CallbackContext, CallbackRoutine); // - // FIXME: determine when to perform callback + // Create and initialize work item data // - CallbackRoutine(CallbackContext); + WorkItem = (PINIT_ROOT_HUB_CONTEXT)ExAllocatePoolWithTag(NonPagedPool, sizeof(INIT_ROOT_HUB_CONTEXT), TAG_USBLIB); + if (!WorkItem) + { + DPRINT1("Failed to allocate memory!n"); + return STATUS_INSUFFICIENT_RESOURCES; + } + + // + // init context + // + WorkItem->CallbackRoutine = CallbackRoutine; + WorkItem->CallbackContext = CallbackContext; + + // + // Queue the work item to handle initializing the device + // + ExInitializeWorkItem(&WorkItem->WorkItem, InitRootHub, (PVOID)WorkItem); + ExQueueWorkItem(&WorkItem->WorkItem, DelayedWorkQueue); // // done diff --git a/reactos/lib/drivers/libusb/libusb.h b/reactos/lib/drivers/libusb/libusb.h index 568157fcc7c..1fd96b17f38 100644 --- a/reactos/lib/drivers/libusb/libusb.h +++ b/reactos/lib/drivers/libusb/libusb.h @@ -52,6 +52,14 @@ typedef struct PDISPATCHIRP Dispatcher; // dispatches the code }COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION; + +typedef struct _WORK_ITEM_DATA +{ + WORK_QUEUE_ITEM WorkItem; // work item + PVOID CallbackContext; // callback context + PRH_INIT_CALLBACK CallbackRoutine; // callback routine +} INIT_ROOT_HUB_CONTEXT, *PINIT_ROOT_HUB_CONTEXT; + // // tag for allocations //