2 * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/usb/usbehci/hub_controller.cpp
5 * PURPOSE: USB EHCI device driver.
7 * Michael Martin (michael.martin@reactos.org)
8 * Johannes Anderwald (johannes.anderwald@reactos.org)
14 class CHubController
: public IHubController
,
18 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
20 STDMETHODIMP_(ULONG
) AddRef()
22 InterlockedIncrement(&m_Ref
);
25 STDMETHODIMP_(ULONG
) Release()
27 InterlockedDecrement(&m_Ref
);
37 // IHubController interface functions
38 virtual NTSTATUS
Initialize(IN PDRIVER_OBJECT DriverObject
, IN PHCDCONTROLLER Controller
, IN PUSBHARDWAREDEVICE Device
, IN BOOLEAN IsRootHubDevice
, IN ULONG DeviceAddress
);
40 // IDispatchIrp interface functions
41 virtual NTSTATUS
HandlePnp(IN PDEVICE_OBJECT DeviceObject
, IN OUT PIRP Irp
);
42 virtual NTSTATUS
HandlePower(IN PDEVICE_OBJECT DeviceObject
, IN OUT PIRP Irp
);
43 virtual NTSTATUS
HandleDeviceControl(IN PDEVICE_OBJECT DeviceObject
, IN OUT PIRP Irp
);
46 NTSTATUS
HandleQueryInterface(PIO_STACK_LOCATION IoStack
);
47 NTSTATUS
SetDeviceInterface(BOOLEAN bEnable
);
48 NTSTATUS
CreatePDO(PDRIVER_OBJECT DriverObject
, PDEVICE_OBJECT
* OutDeviceObject
);
49 NTSTATUS
GetHubControllerDeviceObject(PDEVICE_OBJECT
* HubDeviceObject
);
50 PUSBHARDWAREDEVICE
GetUsbHardware();
51 ULONG
AcquireDeviceAddress();
52 VOID
ReleaseDeviceAddress(ULONG DeviceAddress
);
53 BOOLEAN
ValidateUsbDevice(PUSBDEVICE UsbDevice
);
54 NTSTATUS
AddUsbDevice(PUSBDEVICE UsbDevice
);
55 NTSTATUS
RemoveUsbDevice(PUSBDEVICE UsbDevice
);
56 VOID
SetNotification(PVOID CallbackContext
, PRH_INIT_CALLBACK CallbackRoutine
);
58 // constructor / destructor
59 CHubController(IUnknown
*OuterUnknown
){}
60 virtual ~CHubController(){}
64 PHCDCONTROLLER m_Controller
;
65 PUSBHARDWAREDEVICE m_Hardware
;
66 BOOLEAN m_IsRootHubDevice
;
67 ULONG m_DeviceAddress
;
68 ULONG m_PDODeviceNumber
;
69 BOOLEAN m_InterfaceEnabled
;
70 UNICODE_STRING m_HubDeviceInterfaceString
;
71 PDEVICE_OBJECT m_HubControllerDeviceObject
;
72 PDRIVER_OBJECT m_DriverObject
;
74 PVOID m_HubCallbackContext
;
75 PRH_INIT_CALLBACK m_HubCallbackRoutine
;
79 RTL_BITMAP m_DeviceAddressBitmap
;
80 PULONG m_DeviceAddressBitmapBuffer
;
81 LIST_ENTRY m_UsbDeviceList
;
88 }USBDEVICE_ENTRY
, *PUSBDEVICE_ENTRY
;
91 //----------------------------------------------------------------------------------------
94 CHubController::QueryInterface(
98 return STATUS_UNSUCCESSFUL
;
100 //----------------------------------------------------------------------------------------
102 CHubController::Initialize(
103 IN PDRIVER_OBJECT DriverObject
,
104 IN PHCDCONTROLLER Controller
,
105 IN PUSBHARDWAREDEVICE Device
,
106 IN BOOLEAN IsRootHubDevice
,
107 IN ULONG DeviceAddress
)
110 PCOMMON_DEVICE_EXTENSION DeviceExtension
;
112 DPRINT1("CHubController::Initialize\n");
115 // initialize members
117 m_Controller
= Controller
;
119 m_IsRootHubDevice
= IsRootHubDevice
;
120 m_DeviceAddress
= DeviceAddress
;
121 m_DriverObject
= DriverObject
;
122 KeInitializeSpinLock(&m_Lock
);
125 // allocate device address bitmap buffer
127 m_DeviceAddressBitmapBuffer
= (PULONG
)ExAllocatePoolWithTag(NonPagedPool
, 16, TAG_USBEHCI
);
128 if (!m_DeviceAddressBitmapBuffer
)
133 return STATUS_INSUFFICIENT_RESOURCES
;
137 // initialize device address bitmap
139 RtlInitializeBitMap(&m_DeviceAddressBitmap
, m_DeviceAddressBitmapBuffer
, 128);
140 RtlClearAllBits(&m_DeviceAddressBitmap
);
146 Status
= CreatePDO(m_DriverObject
, &m_HubControllerDeviceObject
);
147 if (!NT_SUCCESS(Status
))
150 // failed to create hub device object
156 // get device extension
158 DeviceExtension
= (PCOMMON_DEVICE_EXTENSION
)m_HubControllerDeviceObject
->DeviceExtension
;
161 // initialize device extension
163 DeviceExtension
->IsFDO
= FALSE
;
164 DeviceExtension
->IsHub
= TRUE
; //FIXME
165 DeviceExtension
->Dispatcher
= PDISPATCHIRP(this);
170 m_HubControllerDeviceObject
->Flags
&= ~DO_DEVICE_INITIALIZING
;
173 return STATUS_SUCCESS
;
176 //-----------------------------------------------------------------------------------------
178 CHubController::GetHubControllerDeviceObject(PDEVICE_OBJECT
* HubDeviceObject
)
181 // store controller object
183 *HubDeviceObject
= m_HubControllerDeviceObject
;
185 return STATUS_SUCCESS
;
187 //-----------------------------------------------------------------------------------------
189 CHubController::HandlePnp(
190 IN PDEVICE_OBJECT DeviceObject
,
193 PIO_STACK_LOCATION IoStack
;
194 PCOMMON_DEVICE_EXTENSION DeviceExtension
;
195 PDEVICE_CAPABILITIES DeviceCapabilities
;
196 PPNP_BUS_INFORMATION BusInformation
;
198 ULONG Index
= 0, Length
;
199 USHORT VendorID
, DeviceID
;
200 ULONG HiSpeed
, NumPorts
;
205 // get device extension
207 DeviceExtension
= (PCOMMON_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
212 ASSERT(DeviceExtension
->IsFDO
== FALSE
);
215 // get current stack location
217 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
219 switch(IoStack
->MinorFunction
)
221 case IRP_MN_START_DEVICE
:
223 DPRINT1("CHubController::HandlePnp IRP_MN_START_DEVICE\n");
225 // register device interface
227 Status
= SetDeviceInterface(TRUE
);
230 case IRP_MN_QUERY_ID
:
232 DPRINT1("CHubController::HandlePnp IRP_MN_QUERY_ID Type %x\n", IoStack
->Parameters
.QueryId
.IdType
);
234 if (IoStack
->Parameters
.QueryId
.IdType
== BusQueryDeviceID
)
241 Status
= m_Hardware
->GetDeviceDetails(&VendorID
, &DeviceID
, &NumPorts
, &HiSpeed
);
243 if (HiSpeed
== 0x200)
248 swprintf(Buffer
, L
"USB\\ROOT_HUB20");
255 swprintf(Buffer
, L
"USB\\ROOT_HUB");
258 DPRINT1("Name %S\n", Buffer
);
263 Length
= (wcslen(Buffer
) + 1);
268 DeviceName
= (LPWSTR
)ExAllocatePoolWithTag(PagedPool
, Length
* sizeof(WCHAR
), TAG_USBEHCI
);
275 Status
= STATUS_INSUFFICIENT_RESOURCES
;
282 wcscpy(DeviceName
, Buffer
);
287 Irp
->IoStatus
.Information
= (ULONG_PTR
)DeviceName
;
288 Status
= STATUS_SUCCESS
;
291 Status
= STATUS_UNSUCCESSFUL
;
296 if (IoStack
->Parameters
.QueryId
.IdType
== BusQueryHardwareIDs
)
303 Status
= m_Hardware
->GetDeviceDetails(&VendorID
, &DeviceID
, &NumPorts
, &HiSpeed
);
305 if (!NT_SUCCESS(Status
))
307 DPRINT1("CHubController::HandlePnp> failed to get hardware id %x\n", Status
);
312 if (HiSpeed
== 0x200)
317 Index
+= swprintf(&Buffer
[Index
], L
"USB\\ROOT_HUB20&VID%04x&PID%04x&REV0000", VendorID
, DeviceID
) + 1;
318 Index
+= swprintf(&Buffer
[Index
], L
"USB\\ROOT_HUB20&VID%04x&PID%04x", VendorID
, DeviceID
) + 1;
319 Index
+= swprintf(&Buffer
[Index
], L
"USB\\ROOT_HUB20") + 1;
326 Index
+= swprintf(&Buffer
[Index
], L
"USB\\ROOT_HUB&VID%04x&PID%04x&REV0000", VendorID
, DeviceID
) + 1;
327 Index
+= swprintf(&Buffer
[Index
], L
"USB\\ROOT_HUB&VID%04x&PID%04x", VendorID
, DeviceID
) + 1;
328 Index
+= swprintf(&Buffer
[Index
], L
"USB\\ROOT_HUB") + 1;
331 Buffer
[Index
] = UNICODE_NULL
;
335 DPRINT1("Name %S\n", Buffer
);
340 DeviceName
= (LPWSTR
)ExAllocatePoolWithTag(PagedPool
, Index
* sizeof(WCHAR
), TAG_USBEHCI
);
347 Status
= STATUS_INSUFFICIENT_RESOURCES
;
354 RtlMoveMemory(DeviceName
, Buffer
, Index
* sizeof(WCHAR
));
359 Irp
->IoStatus
.Information
= (ULONG_PTR
)DeviceName
;
360 Status
= STATUS_SUCCESS
;
364 Status
= STATUS_SUCCESS
;
367 case IRP_MN_QUERY_CAPABILITIES
:
369 DPRINT1("CHubController::HandlePnp IRP_MN_QUERY_CAPABILITIES\n");
371 DeviceCapabilities
= (PDEVICE_CAPABILITIES
)IoStack
->Parameters
.DeviceCapabilities
.Capabilities
;
373 DeviceCapabilities
->LockSupported
= FALSE
;
374 DeviceCapabilities
->EjectSupported
= FALSE
;
375 DeviceCapabilities
->Removable
= FALSE
;
376 DeviceCapabilities
->DockDevice
= FALSE
;
377 DeviceCapabilities
->UniqueID
= FALSE
;
378 DeviceCapabilities
->SilentInstall
= FALSE
;
379 DeviceCapabilities
->RawDeviceOK
= FALSE
;
380 DeviceCapabilities
->SurpriseRemovalOK
= FALSE
;
381 DeviceCapabilities
->Address
= 0;
382 DeviceCapabilities
->UINumber
= 0;
383 DeviceCapabilities
->DeviceD2
= 1;
386 DeviceCapabilities
->HardwareDisabled
= FALSE
;
387 DeviceCapabilities
->NoDisplayInUI
= FALSE
;
388 DeviceCapabilities
->DeviceState
[0] = PowerDeviceD0
;
389 for (Index
= 0; Index
< PowerSystemMaximum
; Index
++)
390 DeviceCapabilities
->DeviceState
[Index
] = PowerDeviceD3
;
391 DeviceCapabilities
->DeviceWake
= PowerDeviceUnspecified
;
392 DeviceCapabilities
->D1Latency
= 0;
393 DeviceCapabilities
->D2Latency
= 0;
394 DeviceCapabilities
->D3Latency
= 0;
396 Status
= STATUS_SUCCESS
;
399 case IRP_MN_QUERY_INTERFACE
:
401 DPRINT1("CHubController::HandlePnp IRP_MN_QUERY_INTERFACE\n");
404 // handle device interface requests
406 Status
= HandleQueryInterface(IoStack
);
409 case IRP_MN_REMOVE_DEVICE
:
411 DPRINT1("CHubController::HandlePnp IRP_MN_REMOVE_DEVICE\n");
414 // deactivate device interface for BUS PDO
416 SetDeviceInterface(FALSE
);
419 // complete the request first
421 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
422 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
427 IoDeleteDevice(m_HubControllerDeviceObject
);
432 m_HubControllerDeviceObject
= 0;
437 return STATUS_SUCCESS
;
439 case IRP_MN_QUERY_BUS_INFORMATION
:
441 DPRINT1("CHubController::HandlePnp IRP_MN_QUERY_BUS_INFORMATION\n");
444 // allocate buffer for bus information
446 BusInformation
= (PPNP_BUS_INFORMATION
)ExAllocatePool(PagedPool
, sizeof(PNP_BUS_INFORMATION
));
452 RtlMoveMemory(&BusInformation
->BusTypeGuid
, &GUID_BUS_TYPE_USB
, sizeof(GUID
));
457 BusInformation
->LegacyBusType
= PNPBus
;
458 BusInformation
->BusNumber
= 0;
460 Status
= STATUS_SUCCESS
;
461 Irp
->IoStatus
.Information
= (ULONG_PTR
)BusInformation
;
468 Status
= STATUS_INSUFFICIENT_RESOURCES
;
472 case IRP_MN_STOP_DEVICE
:
474 DPRINT1("CHubController::HandlePnp IRP_MN_STOP_DEVICE\n");
478 Status
= STATUS_SUCCESS
;
483 DPRINT1("CHubController::HandlePnp Unhandeled %x\n", IoStack
->MinorFunction
);
484 Status
= Irp
->IoStatus
.Status
;
492 Irp
->IoStatus
.Status
= Status
;
493 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
501 //-----------------------------------------------------------------------------------------
503 CHubController::HandlePower(
504 IN PDEVICE_OBJECT DeviceObject
,
508 Irp
->IoStatus
.Status
= STATUS_NOT_IMPLEMENTED
;
509 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
510 return STATUS_NOT_IMPLEMENTED
;
513 //-----------------------------------------------------------------------------------------
515 CHubController::HandleDeviceControl(
516 IN PDEVICE_OBJECT DeviceObject
,
519 PIO_STACK_LOCATION IoStack
;
520 PCOMMON_DEVICE_EXTENSION DeviceExtension
;
522 NTSTATUS Status
= STATUS_NOT_IMPLEMENTED
;
525 // get current stack location
527 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
530 // get device extension
532 DeviceExtension
= (PCOMMON_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
535 DPRINT1("HandleDeviceControl>Type: FDO %u IoCtl %x InputBufferLength %lu OutputBufferLength %lu\n",
536 DeviceExtension
->IsFDO
,
537 IoStack
->Parameters
.DeviceIoControl
.IoControlCode
,
538 IoStack
->Parameters
.DeviceIoControl
.InputBufferLength
,
539 IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
);
542 // determine which request should be performed
544 switch(IoStack
->Parameters
.DeviceIoControl
.IoControlCode
)
546 case IOCTL_INTERNAL_USB_SUBMIT_URB
:
551 Urb
= (PURB
)IoStack
->Parameters
.Others
.Argument1
;
554 DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_URB Function %x Length %lu Status %x Handle %p Flags %x UNIMPLEMENTED\n", Urb
->UrbHeader
.Function
, Urb
->UrbHeader
.Length
, Urb
->UrbHeader
.Status
, Urb
->UrbHeader
.UsbdDeviceHandle
, Urb
->UrbHeader
.UsbdFlags
);
559 Status
= STATUS_NOT_IMPLEMENTED
;
562 case IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE
:
564 DPRINT1("IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE\n");
566 if (IoStack
->Parameters
.Others
.Argument1
)
569 // store object as device handle
571 *(PVOID
*)IoStack
->Parameters
.Others
.Argument1
= (PVOID
)this;
572 Status
= STATUS_SUCCESS
;
577 // mis-behaving hub driver
579 Status
= STATUS_INVALID_DEVICE_REQUEST
;
587 case IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO
:
589 DPRINT1("IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO\n");
592 // this is the first request send, it delivers the PDO to the caller
594 if (IoStack
->Parameters
.Others
.Argument1
)
597 // store root hub pdo object
599 *(PVOID
*)IoStack
->Parameters
.Others
.Argument1
= DeviceObject
;
602 if (IoStack
->Parameters
.Others
.Argument2
)
605 // documentation claims to deliver the hcd controller object, although it is wrong
607 *(PVOID
*)IoStack
->Parameters
.Others
.Argument2
= DeviceObject
;
613 Status
= STATUS_SUCCESS
;
616 case IOCTL_INTERNAL_USB_GET_HUB_COUNT
:
618 DPRINT1("IOCTL_INTERNAL_USB_GET_HUB_COUNT\n");
621 // after IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO is delivered, the usbhub driver
622 // requests this ioctl to deliver the number of presents.
624 if (IoStack
->Parameters
.Others
.Argument1
)
627 // FIXME / verify: there is only one hub
629 *(PULONG
)IoStack
->Parameters
.Others
.Argument1
= 1;
635 Status
= STATUS_SUCCESS
;
636 Irp
->IoStatus
.Information
= sizeof(ULONG
);
641 Irp
->IoStatus
.Status
= Status
;
642 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
646 //-----------------------------------------------------------------------------------------
648 CHubController::GetUsbHardware()
653 //-----------------------------------------------------------------------------------------
655 CHubController::AcquireDeviceAddress()
661 // acquire device lock
663 KeAcquireSpinLock(&m_Lock
, &OldLevel
);
668 DeviceAddress
= RtlFindClearBits(&m_DeviceAddressBitmap
, 1, 0);
669 if (DeviceAddress
!= MAXULONG
)
674 RtlSetBit(&m_DeviceAddressBitmap
, DeviceAddress
);
677 // device addresses start from 0x1 - 0xFF
685 KeReleaseSpinLock(&m_Lock
, OldLevel
);
688 // return device address
690 return DeviceAddress
;
692 //-----------------------------------------------------------------------------------------
694 CHubController::ReleaseDeviceAddress(
700 // acquire device lock
702 KeAcquireSpinLock(&m_Lock
, &OldLevel
);
707 PC_ASSERT(DeviceAddress
!= 0);
710 // convert back to bit number
717 RtlClearBit(&m_DeviceAddressBitmap
, DeviceAddress
);
722 KeReleaseSpinLock(&m_Lock
, OldLevel
);
724 //-----------------------------------------------------------------------------------------
726 CHubController::RemoveUsbDevice(
727 PUSBDEVICE UsbDevice
)
729 PUSBDEVICE_ENTRY DeviceEntry
;
731 NTSTATUS Status
= STATUS_UNSUCCESSFUL
;
737 KeAcquireSpinLock(&m_Lock
, &OldLevel
);
740 // point to first entry
742 Entry
= m_UsbDeviceList
.Flink
;
745 // find matching entry
747 while(Entry
!= &m_UsbDeviceList
)
752 DeviceEntry
= (PUSBDEVICE_ENTRY
)CONTAINING_RECORD(Entry
, USBDEVICE_ENTRY
, Entry
);
755 // is it current entry
757 if (DeviceEntry
->Device
== UsbDevice
)
762 RemoveEntryList(Entry
);
767 ExFreePoolWithTag(DeviceEntry
, TAG_USBEHCI
);
772 Status
= STATUS_SUCCESS
;
779 Entry
= Entry
->Flink
;
785 KeReleaseSpinLock(&m_Lock
, OldLevel
);
792 //-----------------------------------------------------------------------------------------
794 CHubController::ValidateUsbDevice(PUSBDEVICE UsbDevice
)
796 PUSBDEVICE_ENTRY DeviceEntry
;
799 BOOLEAN Result
= FALSE
;
804 KeAcquireSpinLock(&m_Lock
, &OldLevel
);
807 // point to first entry
809 Entry
= m_UsbDeviceList
.Flink
;
812 // find matching entry
814 while(Entry
!= &m_UsbDeviceList
)
819 DeviceEntry
= (PUSBDEVICE_ENTRY
)CONTAINING_RECORD(Entry
, USBDEVICE_ENTRY
, Entry
);
822 // is it current entry
824 if (DeviceEntry
->Device
== UsbDevice
)
836 Entry
= Entry
->Flink
;
842 KeReleaseSpinLock(&m_Lock
, OldLevel
);
851 //-----------------------------------------------------------------------------------------
853 CHubController::AddUsbDevice(
854 PUSBDEVICE UsbDevice
)
856 PUSBDEVICE_ENTRY DeviceEntry
;
861 // allocate device entry
863 DeviceEntry
= (PUSBDEVICE_ENTRY
)ExAllocatePoolWithTag(NonPagedPool
, sizeof(USBDEVICE_ENTRY
), TAG_USBEHCI
);
869 return STATUS_INSUFFICIENT_RESOURCES
;
875 DeviceEntry
->Device
= UsbDevice
;
880 KeAcquireSpinLock(&m_Lock
, &OldLevel
);
885 InsertTailList(&m_UsbDeviceList
, &DeviceEntry
->Entry
);
890 KeReleaseSpinLock(&m_Lock
, OldLevel
);
895 return STATUS_SUCCESS
;
898 //-----------------------------------------------------------------------------------------
900 CHubController::SetNotification(
901 PVOID CallbackContext
,
902 PRH_INIT_CALLBACK CallbackRoutine
)
907 // acquire hub controller lock
909 KeAcquireSpinLock(&m_Lock
, &OldLevel
);
912 // now set the callback routine and context of the hub
914 m_HubCallbackContext
= CallbackContext
;
915 m_HubCallbackRoutine
= CallbackRoutine
;
918 // release hub controller lock
920 KeReleaseSpinLock(&m_Lock
, OldLevel
);
923 //=================================================================================================
925 // Generic Interface functions
929 USBI_InterfaceReference(
932 CHubController
* Controller
= (CHubController
*)BusContext
;
934 DPRINT1("USBH_InterfaceReference\n");
939 Controller
->AddRef();
944 USBI_InterfaceDereference(
947 CHubController
* Controller
= (CHubController
*)BusContext
;
949 DPRINT1("USBH_InterfaceDereference\n");
954 Controller
->Release();
956 //=================================================================================================
958 // USB Hub Interface functions
962 USBHI_CreateUsbDevice(
964 PUSB_DEVICE_HANDLE
*NewDevice
,
965 PUSB_DEVICE_HANDLE HubDeviceHandle
,
969 PUSBDEVICE NewUsbDevice
;
970 CHubController
* Controller
;
973 DPRINT1("USBHI_CreateUsbDevice\n");
976 // first get hub controller
978 Controller
= (CHubController
*)BusContext
;
983 PC_ASSERT(Controller
);
984 PC_ASSERT(BusContext
== HubDeviceHandle
);
987 // now allocate usb device
989 Status
= CreateUSBDevice(&NewUsbDevice
);
994 if (!NT_SUCCESS(Status
))
997 // release controller
999 Controller
->Release();
1000 DPRINT1("USBHI_CreateUsbDevice: failed to create usb device %x\n", Status
);
1005 // now initialize device
1007 Status
= NewUsbDevice
->Initialize(PHUBCONTROLLER(Controller
), Controller
->GetUsbHardware(),PVOID(Controller
), PortNumber
);
1010 // check for success
1012 if (!NT_SUCCESS(Status
))
1015 // release usb device
1017 NewUsbDevice
->Release();
1018 DPRINT1("USBHI_CreateUsbDevice: failed to initialize usb device %x\n", Status
);
1025 Status
= Controller
->AddUsbDevice(NewUsbDevice
);
1027 // check for success
1029 if (!NT_SUCCESS(Status
))
1032 // release usb device
1034 NewUsbDevice
->Release();
1036 DPRINT1("USBHI_CreateUsbDevice: failed to add usb device %x\n", Status
);
1043 *NewDevice
= NewUsbDevice
;
1048 return STATUS_SUCCESS
;
1053 USBHI_InitializeUsbDevice(
1055 PUSB_DEVICE_HANDLE DeviceHandle
)
1057 PUSBDEVICE UsbDevice
;
1058 CHubController
* Controller
;
1059 ULONG DeviceAddress
;
1063 DPRINT1("USBHI_InitializeUsbDevice\n");
1066 // first get controller
1068 Controller
= (CHubController
*)BusContext
;
1069 PC_ASSERT(Controller
);
1072 // get device object
1074 UsbDevice
= (PUSBDEVICE
)DeviceHandle
;
1075 PC_ASSERT(UsbDevice
);
1078 // validate device handle
1080 if (!Controller
->ValidateUsbDevice(UsbDevice
))
1082 DPRINT1("USBHI_InitializeUsbDevice invalid device handle %p\n", DeviceHandle
);
1085 // invalid device handle
1087 return STATUS_DEVICE_NOT_CONNECTED
;
1091 // now reserve an address
1093 DeviceAddress
= Controller
->AcquireDeviceAddress();
1096 // is the device address valid
1098 if (DeviceAddress
== MAXULONG
)
1101 // failed to get an device address from the device address pool
1103 DPRINT1("USBHI_InitializeUsbDevice failed to get device address\n");
1104 return STATUS_DEVICE_DATA_ERROR
;
1110 // now set the device address
1112 Status
= UsbDevice
->SetDeviceAddress(DeviceAddress
);
1114 if (NT_SUCCESS(Status
))
1117 }while(Index
++ < 3 );
1120 // check for failure
1122 if (!NT_SUCCESS(Status
))
1125 // failed to set device address
1127 DPRINT1("USBHI_InitializeUsbDevice failed to set address with %x\n", Status
);
1132 Controller
->ReleaseDeviceAddress(DeviceAddress
);
1137 return STATUS_DEVICE_DATA_ERROR
;
1143 return STATUS_SUCCESS
;
1148 USBHI_GetUsbDescriptors(
1150 PUSB_DEVICE_HANDLE DeviceHandle
,
1151 PUCHAR DeviceDescriptorBuffer
,
1152 PULONG DeviceDescriptorBufferLength
,
1153 PUCHAR ConfigDescriptorBuffer
,
1154 PULONG ConfigDescriptorBufferLength
)
1156 PUSBDEVICE UsbDevice
;
1157 CHubController
* Controller
;
1161 DPRINT1("USBHI_GetUsbDescriptors\n");
1166 PC_ASSERT(DeviceDescriptorBuffer
);
1167 PC_ASSERT(*DeviceDescriptorBufferLength
>= sizeof(USB_DEVICE_DESCRIPTOR
));
1170 // first get controller
1172 Controller
= (CHubController
*)BusContext
;
1173 PC_ASSERT(Controller
);
1177 // get device object
1179 UsbDevice
= (PUSBDEVICE
)DeviceHandle
;
1180 PC_ASSERT(UsbDevice
);
1183 // validate device handle
1185 if (!Controller
->ValidateUsbDevice(UsbDevice
))
1187 DPRINT1("USBHI_GetUsbDescriptors invalid device handle %p\n", DeviceHandle
);
1190 // invalid device handle
1192 return STATUS_DEVICE_NOT_CONNECTED
;
1196 // get device descriptor
1198 UsbDevice
->GetDeviceDescriptor((PUSB_DEVICE_DESCRIPTOR
)DeviceDescriptorBuffer
);
1201 // store result length
1203 *DeviceDescriptorBufferLength
= sizeof(USB_DEVICE_DESCRIPTOR
);
1208 Urb
= (PURB
)ExAllocatePoolWithTag(NonPagedPool
, sizeof(URB
), TAG_USBEHCI
);
1214 return STATUS_INSUFFICIENT_RESOURCES
;
1220 RtlZeroMemory(Urb
, sizeof(URB
));
1223 // initialize request
1225 Urb
->UrbHeader
.Function
= URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE
;
1226 Urb
->UrbHeader
.Length
= sizeof(_URB_CONTROL_DESCRIPTOR_REQUEST
);
1227 Urb
->UrbControlDescriptorRequest
.DescriptorType
= USB_CONFIGURATION_DESCRIPTOR_TYPE
;
1228 Urb
->UrbControlDescriptorRequest
.TransferBuffer
= ConfigDescriptorBuffer
;
1229 Urb
->UrbControlDescriptorRequest
.TransferBufferLength
= *ConfigDescriptorBufferLength
;
1234 Status
= UsbDevice
->SubmitUrb(Urb
);
1236 if (NT_SUCCESS(Status
))
1239 // TransferBufferLength holds the number of bytes transferred
1241 *ConfigDescriptorBufferLength
= Urb
->UrbControlDescriptorRequest
.TransferBufferLength
;
1247 ExFreePoolWithTag(Urb
, TAG_USBEHCI
);
1250 // complete the request
1257 USBHI_RemoveUsbDevice(
1259 PUSB_DEVICE_HANDLE DeviceHandle
,
1262 PUSBDEVICE UsbDevice
;
1263 CHubController
* Controller
;
1266 DPRINT1("USBHI_RemoveUsbDevice\n");
1269 // first get controller
1271 Controller
= (CHubController
*)BusContext
;
1272 PC_ASSERT(Controller
);
1275 // get device object
1277 UsbDevice
= (PUSBDEVICE
)DeviceHandle
;
1278 PC_ASSERT(UsbDevice
);
1281 // validate device handle
1283 if (!Controller
->ValidateUsbDevice(UsbDevice
))
1285 DPRINT1("USBHI_RemoveUsbDevice invalid device handle %p\n", DeviceHandle
);
1288 // invalid device handle
1290 return STATUS_DEVICE_NOT_CONNECTED
;
1294 // check if there were flags passed
1296 if (Flags
& USBD_KEEP_DEVICE_DATA
|| Flags
& USBD_MARK_DEVICE_BUSY
)
1299 // ignore flags for now
1301 return STATUS_SUCCESS
;
1307 Status
= Controller
->RemoveUsbDevice(UsbDevice
);
1308 if (!NT_SUCCESS(Status
))
1311 // invalid device handle
1313 DPRINT1("USBHI_RemoveUsbDevice Invalid device handle %p\n", UsbDevice
);
1315 return STATUS_DEVICE_NOT_CONNECTED
;
1319 // release usb device
1321 UsbDevice
->Release();
1326 return STATUS_SUCCESS
;
1331 USBHI_RestoreUsbDevice(
1333 PUSB_DEVICE_HANDLE OldDeviceHandle
,
1334 PUSB_DEVICE_HANDLE NewDeviceHandle
)
1337 return STATUS_NOT_IMPLEMENTED
;
1342 USBHI_GetPortHackFlags(
1347 return STATUS_NOT_IMPLEMENTED
;
1352 USBHI_QueryDeviceInformation(
1354 PUSB_DEVICE_HANDLE DeviceHandle
,
1355 PVOID DeviceInformationBuffer
,
1356 ULONG DeviceInformationBufferLength
,
1357 PULONG LengthReturned
)
1359 PUSB_DEVICE_INFORMATION_0 DeviceInfo
;
1360 PUSBDEVICE UsbDevice
;
1361 CHubController
* Controller
;
1364 DPRINT1("USBHI_QueryDeviceInformation\n");
1369 PC_ASSERT(DeviceInformationBufferLength
>= sizeof(USB_DEVICE_INFORMATION_0
));
1370 PC_ASSERT(DeviceInformationBuffer
);
1371 PC_ASSERT(LengthReturned
);
1374 // get controller object
1376 Controller
= (CHubController
*)BusContext
;
1377 PC_ASSERT(Controller
);
1380 // get device object
1382 UsbDevice
= (PUSBDEVICE
)DeviceHandle
;
1383 PC_ASSERT(UsbDevice
);
1386 // validate device handle
1388 if (!Controller
->ValidateUsbDevice(UsbDevice
))
1390 DPRINT1("USBHI_QueryDeviceInformation invalid device handle %p\n", DeviceHandle
);
1393 // invalid device handle
1395 return STATUS_DEVICE_NOT_CONNECTED
;
1399 // access information buffer
1401 DeviceInfo
= (PUSB_DEVICE_INFORMATION_0
)DeviceInformationBuffer
;
1404 // initialize with default values
1406 DeviceInfo
->InformationLevel
= 0;
1407 DeviceInfo
->ActualLength
= sizeof(USB_DEVICE_INFORMATION_0
);
1408 DeviceInfo
->PortNumber
= UsbDevice
->GetPort();
1409 DeviceInfo
->CurrentConfigurationValue
= UsbDevice
->GetConfigurationValue();
1410 DeviceInfo
->DeviceAddress
= 0; UsbDevice
->GetDeviceAddress();
1411 DeviceInfo
->HubAddress
= 0; //FIXME
1412 DeviceInfo
->DeviceSpeed
= UsbDevice
->GetSpeed();
1413 DeviceInfo
->DeviceType
= UsbDevice
->GetType();
1414 DeviceInfo
->NumberOfOpenPipes
= 0; //FIXME
1417 // get device descriptor
1419 UsbDevice
->GetDeviceDescriptor(&DeviceInfo
->DeviceDescriptor
);
1422 // FIXME return pipe information
1426 // store result length
1428 *LengthReturned
= sizeof(USB_DEVICE_INFORMATION_0
);
1430 return STATUS_SUCCESS
;
1435 USBHI_GetControllerInformation(
1437 PVOID ControllerInformationBuffer
,
1438 ULONG ControllerInformationBufferLength
,
1439 PULONG LengthReturned
)
1442 return STATUS_NOT_IMPLEMENTED
;
1447 USBHI_ControllerSelectiveSuspend(
1452 return STATUS_NOT_IMPLEMENTED
;
1457 USBHI_GetExtendedHubInformation(
1459 PDEVICE_OBJECT HubPhysicalDeviceObject
,
1460 PVOID HubInformationBuffer
,
1461 ULONG HubInformationBufferLength
,
1462 PULONG LengthReturned
)
1464 PUSB_EXTHUB_INFORMATION_0 HubInfo
;
1465 CHubController
* Controller
;
1466 PUSBHARDWAREDEVICE Hardware
;
1468 ULONG NumPort
, Dummy2
;
1472 DPRINT1("USBHI_GetExtendedHubInformation\n");
1477 PC_ASSERT(HubInformationBuffer
);
1478 PC_ASSERT(HubInformationBufferLength
== sizeof(USB_EXTHUB_INFORMATION_0
));
1479 PC_ASSERT(LengthReturned
);
1482 // get hub controller
1484 Controller
= (CHubController
*)BusContext
;
1485 PC_ASSERT(Controller
);
1488 // get usb hardware device
1490 Hardware
= Controller
->GetUsbHardware();
1493 // retrieve number of ports
1495 Status
= Hardware
->GetDeviceDetails(&Dummy1
, &Dummy1
, &NumPort
, &Dummy2
);
1496 if (!NT_SUCCESS(Status
))
1499 // failed to get hardware details, ouch ;)
1501 DPRINT1("USBHI_GetExtendedHubInformation failed to get hardware details with %x\n", Status
);
1506 // get hub information buffer
1508 HubInfo
= (PUSB_EXTHUB_INFORMATION_0
)HubInformationBuffer
;
1511 // initialize hub information
1513 HubInfo
->InformationLevel
= 0;
1518 HubInfo
->NumberOfPorts
= NumPort
;
1521 // initialize port information
1523 for(Index
= 0; Index
< NumPort
; Index
++)
1525 HubInfo
->Port
[Index
].PhysicalPortNumber
= Index
+ 1;
1526 HubInfo
->Port
[Index
].PortLabelNumber
= Index
+ 1;
1527 HubInfo
->Port
[Index
].VidOverride
= 0;
1528 HubInfo
->Port
[Index
].PidOverride
= 0;
1529 HubInfo
->Port
[Index
].PortAttributes
= USB_PORTATTR_SHARED_USB2
; //FIXME
1533 // store result length
1536 *LengthReturned
= FIELD_OFFSET(USB_EXTHUB_INFORMATION_0
, Port
[HubInfo
->NumberOfPorts
]);
1538 *LengthReturned
= FIELD_OFFSET(USB_EXTHUB_INFORMATION_0
, Port
) + sizeof(USB_EXTPORT_INFORMATION_0
) * HubInfo
->NumberOfPorts
;
1544 return STATUS_SUCCESS
;
1549 USBHI_GetRootHubSymbolicName(
1551 PVOID HubSymNameBuffer
,
1552 ULONG HubSymNameBufferLength
,
1553 PULONG HubSymNameActualLength
)
1556 return STATUS_NOT_IMPLEMENTED
;
1561 USBHI_GetDeviceBusContext(
1562 PVOID HubBusContext
,
1571 USBHI_Initialize20Hub(
1573 PUSB_DEVICE_HANDLE HubDeviceHandle
,
1577 return STATUS_NOT_IMPLEMENTED
;
1582 USBHI_RootHubInitNotification(
1584 PVOID CallbackContext
,
1585 PRH_INIT_CALLBACK CallbackRoutine
)
1587 CHubController
* Controller
;
1589 DPRINT1("USBHI_RootHubInitNotification\n");
1592 // get controller object
1594 Controller
= (CHubController
*)BusContext
;
1595 PC_ASSERT(Controller
);
1598 // set notification routine
1600 Controller
->SetNotification(CallbackContext
, CallbackRoutine
);
1605 return STATUS_SUCCESS
;
1610 USBHI_FlushTransfers(
1619 USBHI_SetDeviceHandleData(
1622 PDEVICE_OBJECT UsbDevicePdo
)
1624 PUSBDEVICE UsbDevice
;
1625 CHubController
* Controller
;
1630 Controller
= (CHubController
*)BusContext
;
1631 PC_ASSERT(Controller
);
1634 // get device handle
1636 UsbDevice
= (PUSBDEVICE
)DeviceHandle
;
1639 // validate device handle
1641 if (!Controller
->ValidateUsbDevice(UsbDevice
))
1643 DPRINT1("USBHI_SetDeviceHandleData DeviceHandle %p is invalid\n", DeviceHandle
);
1652 // set device handle data
1654 UsbDevice
->SetDeviceHandleData(UsbDevicePdo
);
1657 //=================================================================================================
1659 // USB Device Interface functions
1664 USBDI_GetUSBDIVersion(
1666 PUSBD_VERSION_INFORMATION VersionInformation
,
1667 PULONG HcdCapabilites
)
1669 CHubController
* Controller
;
1670 PUSBHARDWAREDEVICE Device
;
1671 ULONG Speed
, Dummy2
;
1674 DPRINT1("USBDI_GetUSBDIVersion\n");
1679 Controller
= (CHubController
*)BusContext
;
1684 Device
= Controller
->GetUsbHardware();
1687 if (VersionInformation
)
1690 // windows xp supported
1692 VersionInformation
->USBDI_Version
= 0x00000500;
1697 Device
->GetDeviceDetails(&Dummy1
, &Dummy1
, &Dummy2
, &Speed
);
1700 // store speed details
1702 VersionInformation
->Supported_USB_Version
= Speed
;
1706 // no flags supported
1708 *HcdCapabilites
= 0;
1715 PULONG CurrentFrame
)
1718 return STATUS_NOT_IMPLEMENTED
;
1723 USBDI_SubmitIsoOutUrb(
1728 return STATUS_NOT_IMPLEMENTED
;
1733 USBDI_QueryBusInformation(
1736 PVOID BusInformationBuffer
,
1737 PULONG BusInformationBufferLength
,
1738 PULONG BusInformationActualLength
)
1741 return STATUS_NOT_IMPLEMENTED
;
1746 USBDI_IsDeviceHighSpeed(
1749 CHubController
* Controller
;
1750 PUSBHARDWAREDEVICE Device
;
1751 ULONG Speed
, Dummy2
;
1754 DPRINT1("USBDI_IsDeviceHighSpeed\n");
1759 Controller
= (CHubController
*)BusContext
;
1764 Device
= Controller
->GetUsbHardware();
1770 Device
->GetDeviceDetails(&Dummy1
, &Dummy1
, &Dummy2
, &Speed
);
1773 // USB 2.0 equals 0x200
1775 return (Speed
== 0x200);
1788 return STATUS_NOT_IMPLEMENTED
;
1792 CHubController::HandleQueryInterface(
1793 PIO_STACK_LOCATION IoStack
)
1795 PUSB_BUS_INTERFACE_HUB_V5 InterfaceHub
;
1796 PUSB_BUS_INTERFACE_USBDI_V2 InterfaceDI
;
1797 UNICODE_STRING GuidBuffer
;
1800 if (IsEqualGUIDAligned(*IoStack
->Parameters
.QueryInterface
.InterfaceType
, USB_BUS_INTERFACE_HUB_GUID
))
1803 // get request parameters
1805 InterfaceHub
= (PUSB_BUS_INTERFACE_HUB_V5
)IoStack
->Parameters
.QueryInterface
.Interface
;
1806 InterfaceHub
->Version
= IoStack
->Parameters
.QueryInterface
.Version
;
1811 if (IoStack
->Parameters
.QueryInterface
.Version
>= 6)
1813 DPRINT1("USB_BUS_INTERFACE_HUB_GUID version %x not supported!\n", IoStack
->Parameters
.QueryInterface
.Version
);
1816 // version not supported
1818 return STATUS_NOT_SUPPORTED
;
1822 // Interface version 0
1824 if (IoStack
->Parameters
.QueryInterface
.Version
>= 0)
1826 InterfaceHub
->Size
= IoStack
->Parameters
.QueryInterface
.Size
;
1827 InterfaceHub
->BusContext
= PVOID(this);
1828 InterfaceHub
->InterfaceReference
= USBI_InterfaceReference
;
1829 InterfaceHub
->InterfaceDereference
= USBI_InterfaceDereference
;
1833 // Interface version 1
1835 if (IoStack
->Parameters
.QueryInterface
.Version
>= 1)
1837 InterfaceHub
->CreateUsbDevice
= USBHI_CreateUsbDevice
;
1838 InterfaceHub
->InitializeUsbDevice
= USBHI_InitializeUsbDevice
;
1839 InterfaceHub
->GetUsbDescriptors
= USBHI_GetUsbDescriptors
;
1840 InterfaceHub
->RemoveUsbDevice
= USBHI_RemoveUsbDevice
;
1841 InterfaceHub
->RestoreUsbDevice
= USBHI_RestoreUsbDevice
;
1842 InterfaceHub
->GetPortHackFlags
= USBHI_GetPortHackFlags
;
1843 InterfaceHub
->QueryDeviceInformation
= USBHI_QueryDeviceInformation
;
1847 // Interface version 2
1849 if (IoStack
->Parameters
.QueryInterface
.Version
>= 2)
1851 InterfaceHub
->GetControllerInformation
= USBHI_GetControllerInformation
;
1852 InterfaceHub
->ControllerSelectiveSuspend
= USBHI_ControllerSelectiveSuspend
;
1853 InterfaceHub
->GetExtendedHubInformation
= USBHI_GetExtendedHubInformation
;
1854 InterfaceHub
->GetRootHubSymbolicName
= USBHI_GetRootHubSymbolicName
;
1855 InterfaceHub
->GetDeviceBusContext
= USBHI_GetDeviceBusContext
;
1856 InterfaceHub
->Initialize20Hub
= USBHI_Initialize20Hub
;
1861 // Interface version 3
1863 if (IoStack
->Parameters
.QueryInterface
.Version
>= 3)
1865 InterfaceHub
->RootHubInitNotification
= USBHI_RootHubInitNotification
;
1869 // Interface version 4
1871 if (IoStack
->Parameters
.QueryInterface
.Version
>= 4)
1873 InterfaceHub
->FlushTransfers
= USBHI_FlushTransfers
;
1877 // Interface version 5
1879 if (IoStack
->Parameters
.QueryInterface
.Version
>= 5)
1881 InterfaceHub
->SetDeviceHandleData
= USBHI_SetDeviceHandleData
;
1885 // request completed
1887 return STATUS_SUCCESS
;
1889 else if (IsEqualGUIDAligned(*IoStack
->Parameters
.QueryInterface
.InterfaceType
, USB_BUS_INTERFACE_USBDI_GUID
))
1892 // get request parameters
1894 InterfaceDI
= (PUSB_BUS_INTERFACE_USBDI_V2
) IoStack
->Parameters
.QueryInterface
.Interface
;
1895 InterfaceDI
->Version
= IoStack
->Parameters
.QueryInterface
.Version
;
1900 if (IoStack
->Parameters
.QueryInterface
.Version
>= 3)
1902 DPRINT1("USB_BUS_INTERFACE_USBDI_GUID version %x not supported!\n", IoStack
->Parameters
.QueryInterface
.Version
);
1905 // version not supported
1907 return STATUS_NOT_SUPPORTED
;
1911 // interface version 0
1913 if (IoStack
->Parameters
.QueryInterface
.Version
>= 0)
1915 InterfaceDI
->Size
= IoStack
->Parameters
.QueryInterface
.Size
;
1916 InterfaceDI
->BusContext
= PVOID(this);
1917 InterfaceDI
->InterfaceReference
= USBI_InterfaceReference
;
1918 InterfaceDI
->InterfaceDereference
= USBI_InterfaceDereference
;
1919 InterfaceDI
->GetUSBDIVersion
= USBDI_GetUSBDIVersion
;
1920 InterfaceDI
->QueryBusTime
= USBDI_QueryBusTime
;
1921 InterfaceDI
->SubmitIsoOutUrb
= USBDI_SubmitIsoOutUrb
;
1922 InterfaceDI
->QueryBusInformation
= USBDI_QueryBusInformation
;
1926 // interface version 1
1928 if (IoStack
->Parameters
.QueryInterface
.Version
>= 1)
1930 InterfaceDI
->IsDeviceHighSpeed
= USBDI_IsDeviceHighSpeed
;
1934 // interface version 2
1936 if (IoStack
->Parameters
.QueryInterface
.Version
>= 2)
1938 InterfaceDI
->EnumLogEntry
= USBDI_EnumLogEntry
;
1942 // request completed
1944 return STATUS_SUCCESS
;
1949 // convert guid to string
1951 Status
= RtlStringFromGUID(*IoStack
->Parameters
.QueryInterface
.InterfaceType
, &GuidBuffer
);
1952 if (NT_SUCCESS(Status
))
1957 DPRINT1("HandleQueryInterface UNKNOWN INTERFACE GUID: %wZ Version %x\n", &GuidBuffer
, IoStack
->Parameters
.QueryInterface
.Version
);
1962 RtlFreeUnicodeString(&GuidBuffer
);
1965 return STATUS_NOT_SUPPORTED
;
1969 CHubController::SetDeviceInterface(
1972 NTSTATUS Status
= STATUS_SUCCESS
;
1977 // register device interface
1979 Status
= IoRegisterDeviceInterface(m_HubControllerDeviceObject
, &GUID_DEVINTERFACE_USB_HUB
, 0, &m_HubDeviceInterfaceString
);
1981 if (NT_SUCCESS(Status
))
1984 // now enable the device interface
1986 Status
= IoSetDeviceInterfaceState(&m_HubDeviceInterfaceString
, TRUE
);
1991 m_InterfaceEnabled
= TRUE
;
1994 else if (m_InterfaceEnabled
)
1997 // disable device interface
1999 Status
= IoSetDeviceInterfaceState(&m_HubDeviceInterfaceString
, FALSE
);
2001 if (NT_SUCCESS(Status
))
2004 // now delete interface string
2006 RtlFreeUnicodeString(&m_HubDeviceInterfaceString
);
2010 // disable interface
2012 m_InterfaceEnabled
= FALSE
;
2022 CHubController::CreatePDO(
2023 PDRIVER_OBJECT DriverObject
,
2024 PDEVICE_OBJECT
* OutDeviceObject
)
2026 WCHAR CharDeviceName
[64];
2028 ULONG UsbDeviceNumber
= 0;
2029 UNICODE_STRING DeviceName
;
2034 // construct device name
2036 swprintf(CharDeviceName
, L
"\\Device\\USBPDO-%d", UsbDeviceNumber
);
2039 // initialize device name
2041 RtlInitUnicodeString(&DeviceName
, CharDeviceName
);
2046 Status
= IoCreateDevice(DriverObject
,
2047 sizeof(COMMON_DEVICE_EXTENSION
),
2049 FILE_DEVICE_CONTROLLER
,
2054 /* check for success */
2055 if (NT_SUCCESS(Status
))
2059 // is there a device object with that same name
2061 if ((Status
== STATUS_OBJECT_NAME_EXISTS
) || (Status
== STATUS_OBJECT_NAME_COLLISION
))
2064 // Try the next name
2071 // bail out on other errors
2073 if (!NT_SUCCESS(Status
))
2075 DPRINT1("CreatePDO: Failed to create %wZ, Status %x\n", &DeviceName
, Status
);
2083 //m_PDODeviceNumber = UsbDeviceNumber;
2085 DPRINT1("CreateFDO: DeviceName %wZ\n", &DeviceName
);
2094 CreateHubController(
2095 PHUBCONTROLLER
*OutHcdController
)
2097 PHUBCONTROLLER This
;
2100 // allocate controller
2102 This
= new(NonPagedPool
, TAG_USBEHCI
) CHubController(0);
2106 // failed to allocate
2108 return STATUS_INSUFFICIENT_RESOURCES
;
2112 // add reference count
2119 *OutHcdController
= (PHUBCONTROLLER
)This
;
2124 return STATUS_SUCCESS
;