Index: drivers/usb/usbhub/fdo.c =================================================================== --- drivers/usb/usbhub/fdo.c (revision 70555) +++ drivers/usb/usbhub/fdo.c (working copy) @@ -12,7 +12,7 @@ #include -#define NDEBUG +//#define NDEBUG #include NTSTATUS @@ -1116,7 +1116,9 @@ HubDeviceExtension->ChildDeviceObject[Index] = NULL; /* Invalidate device relations for the root hub */ + DPRINT("USBHUB: IoInvalidateDeviceRelations\n"); IoInvalidateDeviceRelations(HubDeviceExtension->RootHubPhysicalDeviceObject, BusRelations); + DPRINT("USBHUB: IoInvalidateDeviceRelations end \n"); /* The rest of the removal process takes place in IRP_MN_REMOVE_DEVICE handling for the PDO */ return STATUS_SUCCESS; @@ -1337,10 +1339,14 @@ goto Cleanup; } + DPRINT("USBHUB: CreateDeviceIds return status %x\n", Status); + HubDeviceExtension->ChildDeviceObject[ChildDeviceCount] = NewChildDeviceObject; HubDeviceExtension->InstanceCount++; + DPRINT("USBHUB: HubDeviceExtension->InstanceCount %x\n", HubDeviceExtension->InstanceCount); IoInvalidateDeviceRelations(RootHubDeviceObject, BusRelations); + DPRINT("USBHUB: IoInvalidateDeviceRelations end \n"); return STATUS_SUCCESS; Cleanup: Index: drivers/usb/usbhub/pdo.c =================================================================== --- drivers/usb/usbhub/pdo.c (revision 70555) +++ drivers/usb/usbhub/pdo.c (working copy) @@ -13,7 +13,7 @@ #include -#define NDEBUG +//#define NDEBUG #include #define IO_METHOD_FROM_CTL_CODE(ctlCode) (ctlCode&0x00000003) @@ -291,8 +291,17 @@ case URB_FUNCTION_VENDOR_DEVICE: DPRINT("URB_FUNCTION_VENDOR_DEVICE\n"); break; + case URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL: + DPRINT("URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL\n"); + break; + case URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT: //0x24 + DPRINT("URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT\n"); + break; + case URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE: //0x28 + DPRINT("URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE\n"); + break; default: - DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_URB Function %x NOT IMPLEMENTED\n", Urb->UrbHeader.Function); + DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_URB Unknown Function %x\n", Urb->UrbHeader.Function); break; } Urb->UrbHeader.UsbdDeviceHandle = ChildDeviceExtension->UsbDeviceHandle; @@ -687,7 +696,9 @@ if (bFound) { /* invalidate device relations */ + DPRINT("USBHUB: IoInvalidateDeviceRelations\n"); IoInvalidateDeviceRelations(ParentDevice, BusRelations); + DPRINT("USBHUB: IoInvalidateDeviceRelations end \n"); } return STATUS_SUCCESS; Index: drivers/usb/usbohci/hardware.cpp =================================================================== --- drivers/usb/usbohci/hardware.cpp (revision 70555) +++ drivers/usb/usbohci/hardware.cpp (working copy) @@ -470,37 +470,63 @@ ULONG NewControl, WaitInMs; LARGE_INTEGER Timeout; BOOLEAN Again = FALSE; + ULONG OldFrameInterval = 0; + ULONG NewFrameInterval = 0; - // + // check context - // Control = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_CONTROL_OFFSET)); + DPRINT("Controller First State %x\n", Control); //Save this NewControl = Control & OHCI_REMOTE_WAKEUP_CONNECTED; + //Save FrameInterval + OldFrameInterval = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_FRAME_INTERVAL_OFFSET)); + DPRINT("Old FrameInterval %x\n", OldFrameInterval); + + //Check if BIOS ownership if ((Control & OHCI_INTERRUPT_ROUTING)) { // // change ownership // + + if ( READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_INTERRUPT_ENABLE_OFFSET)) == 0) + { + //HcInterruptEnable.MIE == 0 + WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_CONTROL_OFFSET), 0); + DPRINT("BIOS ownership and (HcInterruptEnable.MIE == 0) !\n"); + goto Label1; + } + + //HcInterruptEnable.MIE (MasterInterruptEnable) set + WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_INTERRUPT_ENABLE_OFFSET), OHCI_MASTER_INTERRUPT_ENABLE); + + //HcCommandStatus.OwnershipChangeRequest set WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_COMMAND_STATUS_OFFSET), OHCI_OWNERSHIP_CHANGE_REQUEST); - for(Index = 0; Index < 100; Index++) + + //HcInterruptDisable.RHSC - Disable interrupt generation due to Root Hub Status Change. + WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_INTERRUPT_DISABLE_OFFSET), OHCI_ROOT_HUB_STATUS_CHANGE); + + // wait time is 5 sec + for (Index = 0; Index < 500000; Index++) { - // - // wait a bit - // - KeStallExecutionProcessor(100); + // wait a 10 microseconds + KeStallExecutionProcessor(10); - // // check control - // Control = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_CONTROL_OFFSET)); - if (!(Control & OHCI_INTERRUPT_ROUTING)) + if ( !(Control & OHCI_INTERRUPT_ROUTING) ) { - // - // acquired ownership - // + DPRINT("Controller acquired ownership\n"); + + //HcInterruptStatus clear + WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_INTERRUPT_STATUS_OFFSET), 0xFFFFFFFF); + + //HcInterruptDisable.MIE - Disable interrupt generation. + WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_INTERRUPT_DISABLE_OFFSET), OHCI_MASTER_INTERRUPT_ENABLE); + break; } } @@ -518,10 +544,9 @@ } } - // +Label1: + // read contents of control register - // - Control = (READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_CONTROL_OFFSET)) & OHCI_HC_FUNCTIONAL_STATE_MASK); DPRINT("Controller State %x\n", Control); @@ -532,15 +557,15 @@ WaitInMs = 50; break; + case OHCI_HC_FUNCTIONAL_STATE_OPERATIONAL: + WaitInMs = 0; + break; + case OHCI_HC_FUNCTIONAL_STATE_SUSPEND: case OHCI_HC_FUNCTIONAL_STATE_RESUME: NewControl |= OHCI_HC_FUNCTIONAL_STATE_RESUME; WaitInMs = 10; break; - - default: - WaitInMs = 0; - break; } retry: @@ -569,66 +594,99 @@ } } - // - // now reset controller - // - WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_COMMAND_STATUS_OFFSET), OHCI_HOST_CONTROLLER_RESET); - - // - // reset time is 10ms - // - for(Index = 0; Index < 100; Index++) + // if state not operational then reset controller + if (Control != OHCI_HC_FUNCTIONAL_STATE_OPERATIONAL) { - // - // wait a bit - // - KeStallExecutionProcessor(10); + WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_COMMAND_STATUS_OFFSET), OHCI_HOST_CONTROLLER_RESET); - // - // read command status - // - Reset = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_COMMAND_STATUS_OFFSET)); + // reset time is 10ms + for (Index = 0; Index < 100; Index++) + { + // + // wait a bit + // + KeStallExecutionProcessor(10); - // - // was reset bit cleared - // - if ((Reset & OHCI_HOST_CONTROLLER_RESET) == 0) + // + // read command status + // + Reset = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_COMMAND_STATUS_OFFSET)); + + // + // was reset bit cleared + // + if ((Reset & OHCI_HOST_CONTROLLER_RESET) == 0) + { + // + // controller completed reset + // + break; + } + } + + if ((Reset & OHCI_HOST_CONTROLLER_RESET)) { // - // controller completed reset + // failed to reset controller // - break; + return STATUS_UNSUCCESSFUL; } } - if ((Reset & OHCI_HOST_CONTROLLER_RESET)) + if (OldFrameInterval) { - // - // failed to reset controller - // - return STATUS_UNSUCCESSFUL; + //restore FrameInterval + FrameInterval = OldFrameInterval; } + else + { + // get frame interval + FrameInterval = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_FRAME_INTERVAL_OFFSET)); + } - // - // get frame interval - // - FrameInterval = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_FRAME_INTERVAL_OFFSET)); m_IntervalValue = OHCI_GET_INTERVAL_VALUE(FrameInterval); + DPRINT("FrameInterval %x IntervalValue %x\n", FrameInterval, m_IntervalValue); FrameInterval = ((FrameInterval & OHCI_FRAME_INTERVAL_TOGGLE) ^ OHCI_FRAME_INTERVAL_TOGGLE); - - DPRINT("FrameInterval %x IntervalValue %x\n", FrameInterval, m_IntervalValue); FrameInterval |= OHCI_FSMPS(m_IntervalValue) | m_IntervalValue; DPRINT("Computed FrameInterval %x\n", FrameInterval); - // - // write frame interval - // + // write FrameInterval WRITE_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_FRAME_INTERVAL_OFFSET), FrameInterval); - FrameInterval = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_FRAME_INTERVAL_OFFSET)); - DPRINT("Read FrameInterval %x\n", FrameInterval); + // wait time is 5 sec + for (Index = 0; Index < 500000; Index++) + { + // wait a 10 microseconds + KeStallExecutionProcessor(10); + // read FrameInterval + NewFrameInterval = READ_REGISTER_ULONG((PULONG)((PUCHAR)m_Base + OHCI_FRAME_INTERVAL_OFFSET)); + + if (NewFrameInterval == FrameInterval) + break; + } + + DPRINT("NewFrameInterval %x, FrameInterval %x\n", NewFrameInterval, FrameInterval); + + if (NewFrameInterval != FrameInterval) + { + // failed to write frame interval + if (Again) return STATUS_UNSUCCESSFUL; + + if (!Again) + { + DPRINT1("Failed to write FrameInterval\n"); + Again = TRUE; + goto retry; + } + else + { + DPRINT1("Second reset and failed to write FrameInterval\n"); + return STATUS_UNSUCCESSFUL; + } + } + // // 90 % periodic // Index: lib/drivers/libusb/hcd_controller.cpp =================================================================== --- lib/drivers/libusb/hcd_controller.cpp (revision 70555) +++ lib/drivers/libusb/hcd_controller.cpp (working copy) @@ -10,7 +10,7 @@ #include "libusb.h" -#define NDEBUG +//#define NDEBUG #include class CHCDController : public IHCDController, @@ -415,12 +415,19 @@ // start the hardware // Status = m_Hardware->PnpStart(RawResourceList, TranslatedResourceList); + + if (NT_SUCCESS(Status)) + { + // + // enable symbolic link + // + Status = SetSymbolicLink(TRUE); + } } - - // - // enable symbolic link - // - Status = SetSymbolicLink(TRUE); + else + { + Status = STATUS_UNSUCCESSFUL; + } } DPRINT("[%s] HandlePnp IRP_MN_START FDO: Status %x\n", m_USBType ,Status); Index: ntoskrnl/io/iomgr/iomgr.c =================================================================== --- ntoskrnl/io/iomgr/iomgr.c (revision 70555) +++ ntoskrnl/io/iomgr/iomgr.c (working copy) @@ -474,6 +474,8 @@ CHAR Buffer[256]; ANSI_STRING NtBootPath, RootString; + DPRINT1("IoInitSystem: LoaderBlock 0x%p\n", LoaderBlock); + /* Initialize empty NT Boot Path */ RtlInitEmptyAnsiString(&NtBootPath, Buffer, sizeof(Buffer)); @@ -530,6 +532,7 @@ /* Initialize PnP manager */ IopInitializePlugPlayServices(); + DPRINT1("IopInitializePlugPlayServices: end\n"); /* Initialize SHIM engine */ ApphelpCacheInitialize(); @@ -539,16 +542,29 @@ /* Initialize HAL Root Bus Driver */ HalInitPnpDriver(); + DPRINT1("HalInitPnpDriver: end\n"); /* Make loader block available for the whole kernel */ IopLoaderBlock = LoaderBlock; /* Load boot start drivers */ + DPRINT1("IopInitializeBootDrivers\n"); IopInitializeBootDrivers(); + DPRINT1("IopInitializeBootDrivers: end\n"); /* Call back drivers that asked for */ + DPRINT1("IopReinitializeBootDrivers\n"); IopReinitializeBootDrivers(); + DPRINT1("IopReinitializeBootDrivers: end\n"); + { + LARGE_INTEGER Timeout; + Timeout.QuadPart = 5000; + DPRINT1("Waiting %lu milliseconds for port reset\n", Timeout.LowPart); + Timeout.QuadPart *= -10000; // convert to 100 ns units (absolute) + KeDelayExecutionThread(KernelMode, FALSE, &Timeout); // perform the wait + } + /* Check if this was a ramdisk boot */ if (!_strnicmp(LoaderBlock->ArcBootDeviceName, "ramdisk(0)", 10)) { @@ -575,7 +591,9 @@ } /* Initialize PnP root relations */ + DPRINT1("IopEnumerateDevice\n"); IopEnumerateDevice(IopRootDeviceNode->PhysicalDeviceObject); + DPRINT1("IopEnumerateDevice: end\n"); #ifndef _WINKD_ /* Read KDB Data */ @@ -586,14 +604,20 @@ #endif /* Load services for devices found by PnP manager */ + DPRINT1("IopInitializePnpServices\n"); IopInitializePnpServices(IopRootDeviceNode); + DPRINT1("IopInitializePnpServices: end\n"); /* Load system start drivers */ + DPRINT1("IopInitializeSystemDrivers\n"); IopInitializeSystemDrivers(); PnpSystemInit = TRUE; + DPRINT1("IopInitializeSystemDrivers: end\n"); /* Reinitialize drivers that requested it */ + DPRINT1("IopReinitializeDrivers\n"); IopReinitializeDrivers(); + DPRINT1("IopReinitializeDrivers: end\n"); /* Convert SystemRoot from ARC to NT path */ Status = IopReassignSystemRoot(LoaderBlock, &NtBootPath); @@ -640,6 +664,8 @@ return FALSE; } + DPRINT1("IoInitSystem: Return success\n"); + /* Return success */ return TRUE; } Index: ntoskrnl/io/pnpmgr/pnpmgr.c =================================================================== --- ntoskrnl/io/pnpmgr/pnpmgr.c (revision 70555) +++ ntoskrnl/io/pnpmgr/pnpmgr.c (working copy) @@ -904,6 +904,8 @@ PINVALIDATE_DEVICE_RELATION_DATA Data; KIRQL OldIrql; + DPRINT1("IopDeviceRelationsWorker: Context - %x \n", Context); + KeAcquireSpinLock(&IopDeviceRelationsSpinLock, &OldIrql); while (!IsListEmpty(&IopDeviceRelationsRequestList)) { @@ -913,6 +915,8 @@ INVALIDATE_DEVICE_RELATION_DATA, RequestListEntry); + DPRINT1("IopDeviceRelationsWorker: Data->DeviceObject - %x \n", Data->DeviceObject); + IoSynchronousInvalidateDeviceRelations(Data->DeviceObject, Data->Type); @@ -922,6 +926,8 @@ } IopDeviceRelationsRequestInProgress = FALSE; KeReleaseSpinLock(&IopDeviceRelationsSpinLock, OldIrql); + + DPRINT1("IopDeviceRelationsWorker end\n"); } NTSTATUS @@ -2282,18 +2288,18 @@ NTSTATUS Status; ULONG i; - DPRINT("DeviceObject 0x%p\n", DeviceObject); + DPRINT1("IopEnumerateDevice: DeviceObject 0x%p\n", DeviceObject); if (DeviceNode->Flags & DNF_NEED_ENUMERATION_ONLY) { DeviceNode->Flags &= ~DNF_NEED_ENUMERATION_ONLY; - DPRINT("Sending GUID_DEVICE_ARRIVAL\n"); + DPRINT1("Sending GUID_DEVICE_ARRIVAL\n"); IopQueueTargetDeviceEvent(&GUID_DEVICE_ARRIVAL, &DeviceNode->InstancePath); } - DPRINT("Sending IRP_MN_QUERY_DEVICE_RELATIONS to device stack\n"); + DPRINT1("Sending IRP_MN_QUERY_DEVICE_RELATIONS to device stack\n"); Stack.Parameters.QueryDeviceRelations.Type = BusRelations; @@ -2304,7 +2310,7 @@ &Stack); if (!NT_SUCCESS(Status) || Status == STATUS_PENDING) { - DPRINT("IopInitiatePnpIrp() failed with status 0x%08lx\n", Status); + DPRINT1("IopInitiatePnpIrp() failed with status 0x%08lx\n", Status); return Status; } @@ -2320,11 +2326,11 @@ if (!DeviceRelations) { /* We're all done */ - DPRINT("No PDOs\n"); + DPRINT1("No PDOs\n"); return STATUS_SUCCESS; } - DPRINT("Got %u PDOs\n", DeviceRelations->Count); + DPRINT1("Got %u PDOs\n", DeviceRelations->Count); /* * Create device nodes for all discovered devices @@ -2379,7 +2385,7 @@ Status = IopTraverseDeviceTree(&Context); if (!NT_SUCCESS(Status)) { - DPRINT("IopTraverseDeviceTree() failed with status 0x%08lx\n", Status); + DPRINT1("IopTraverseDeviceTree() failed with status 0x%08lx\n", Status); return Status; } @@ -2395,7 +2401,7 @@ Status = IopTraverseDeviceTree(&Context); if (!NT_SUCCESS(Status)) { - DPRINT("IopTraverseDeviceTree() failed with status 0x%08lx\n", Status); + DPRINT1("IopTraverseDeviceTree() failed with status 0x%08lx\n", Status); return Status; } @@ -2405,11 +2411,11 @@ Status = IopInitializePnpServices(DeviceNode); if (!NT_SUCCESS(Status)) { - DPRINT("IopInitializePnpServices() failed with status 0x%08lx\n", Status); + DPRINT1("IopInitializePnpServices() failed with status 0x%08lx\n", Status); return Status; } - DPRINT("IopEnumerateDevice() finished\n"); + DPRINT1("IopEnumerateDevice() finished\n"); return STATUS_SUCCESS; } @@ -4696,6 +4702,8 @@ PINVALIDATE_DEVICE_RELATION_DATA Data; KIRQL OldIrql; + DPRINT1("IoInvalidateDeviceRelations: DeviceObject - %x \n", DeviceObject); + Data = ExAllocatePool(NonPagedPool, sizeof(INVALIDATE_DEVICE_RELATION_DATA)); if (!Data) return; @@ -4708,6 +4716,7 @@ InsertTailList(&IopDeviceRelationsRequestList, &Data->RequestListEntry); if (IopDeviceRelationsRequestInProgress) { + DPRINT1("IoInvalidateDeviceRelations: IopDeviceRelationsRequestInProgress is TRUE\n"); KeReleaseSpinLock(&IopDeviceRelationsSpinLock, OldIrql); return; } @@ -4719,6 +4728,8 @@ NULL); ExQueueWorkItem(&IopDeviceRelationsWorkItem, DelayedWorkQueue); + + DPRINT1("IoInvalidateDeviceRelations: to end\n"); } /* @@ -4730,21 +4741,33 @@ IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type) { + NTSTATUS Status=0; + PAGED_CODE(); + DPRINT1("IoSynchronousInvalidateDeviceRelations: DeviceObject - %x, Type - %x \n", DeviceObject, Type); + switch (Type) { case BusRelations: /* Enumerate the device */ + Status = IopEnumerateDevice(DeviceObject); + DPRINT1("IoSynchronousInvalidateDeviceRelations: IopEnumerateDevice return Status - %x \n", Status); return IopEnumerateDevice(DeviceObject); + case PowerRelations: /* Not handled yet */ + DPRINT1("IoSynchronousInvalidateDeviceRelations: PowerRelations Not handled yet\n"); return STATUS_NOT_IMPLEMENTED; + case TargetDeviceRelation: /* Nothing to do */ - return STATUS_SUCCESS; + DPRINT1("IoSynchronousInvalidateDeviceRelations: TargetDeviceRelation Nothing to do\n"); + return STATUS_SUCCESS; + default: /* Ejection relations are not supported */ + DPRINT1("IoSynchronousInvalidateDeviceRelations: Ejection relations are not supported\n"); return STATUS_NOT_SUPPORTED; } }