6 #define NDEBUG_USBPORT_CORE
9 IO_COMPLETION_ROUTINE USBPORT_FdoStartCompletion
;
13 USBPORT_FdoStartCompletion(IN PDEVICE_OBJECT DeviceObject
,
17 KeSetEvent((PKEVENT
)Context
, EVENT_INCREMENT
, FALSE
);
18 return STATUS_MORE_PROCESSING_REQUIRED
;
23 USBPORT_RegisterDeviceInterface(IN PDEVICE_OBJECT PdoDevice
,
24 IN PDEVICE_OBJECT DeviceObject
,
25 IN CONST GUID
*InterfaceClassGuid
,
28 PUSBPORT_RHDEVICE_EXTENSION DeviceExtension
;
29 PUNICODE_STRING SymbolicLinkName
;
32 DPRINT("USBPORT_RegisterDeviceInterface: Enable - %x\n", Enable
);
34 DeviceExtension
= DeviceObject
->DeviceExtension
;
35 SymbolicLinkName
= &DeviceExtension
->CommonExtension
.SymbolicLinkName
;
39 Status
= IoRegisterDeviceInterface(PdoDevice
,
44 if (NT_SUCCESS(Status
))
46 DeviceExtension
->CommonExtension
.IsInterfaceEnabled
= 1;
48 Status
= USBPORT_SetRegistryKeyValue(PdoDevice
,
52 SymbolicLinkName
->Buffer
,
53 SymbolicLinkName
->Length
);
55 if (NT_SUCCESS(Status
))
57 DPRINT("USBPORT_RegisterDeviceInterface: LinkName - %wZ\n",
58 &DeviceExtension
->CommonExtension
.SymbolicLinkName
);
60 Status
= IoSetDeviceInterfaceState(SymbolicLinkName
, TRUE
);
66 /* Disable device interface */
67 Status
= IoSetDeviceInterfaceState(SymbolicLinkName
, FALSE
);
69 if (NT_SUCCESS(Status
))
71 RtlFreeUnicodeString(SymbolicLinkName
);
72 DeviceExtension
->CommonExtension
.IsInterfaceEnabled
= 0; // Disabled interface
81 USBPORT_IsSelectiveSuspendEnabled(IN PDEVICE_OBJECT FdoDevice
)
83 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
86 DPRINT("USBPORT_IsSelectiveSuspendEnabled: ... \n");
88 FdoExtension
= FdoDevice
->DeviceExtension
;
90 USBPORT_GetRegistryKeyValueFullInfo(FdoDevice
,
91 FdoExtension
->CommonExtension
.LowerPdoDevice
,
93 L
"HcDisableSelectiveSuspend",
94 sizeof(L
"HcDisableSelectiveSuspend"),
98 return (Disabled
== 0);
103 USBPORT_GetConfigValue(IN PWSTR ValueName
,
106 IN ULONG ValueLength
,
108 IN PVOID EntryContext
)
110 NTSTATUS Status
= STATUS_SUCCESS
;
112 DPRINT("USBPORT_GetConfigValue \n");
114 if (ValueType
== REG_DWORD
)
116 *(PULONG
)EntryContext
= *(PULONG
)ValueData
;
120 Status
= STATUS_INVALID_PARAMETER
;
128 USBPORT_GetDefaultBIOSx(IN PDEVICE_OBJECT FdoDevice
,
130 IN PULONG DisableSelectiveSuspend
,
131 IN PULONG DisableCcDetect
,
132 IN PULONG IdleEpSupport
,
133 IN PULONG IdleEpSupportEx
,
136 RTL_QUERY_REGISTRY_TABLE QueryTable
[7];
138 DPRINT("USBPORT_GetDefaultBIOS_X: ... \n");
140 RtlZeroMemory(QueryTable
, sizeof(QueryTable
));
144 QueryTable
[0].QueryRoutine
= USBPORT_GetConfigValue
;
145 QueryTable
[0].Flags
= 0;
146 QueryTable
[0].Name
= L
"UsbBIOSx";
147 QueryTable
[0].EntryContext
= UsbBIOSx
;
148 QueryTable
[0].DefaultType
= REG_DWORD
;
149 QueryTable
[0].DefaultData
= UsbBIOSx
;
150 QueryTable
[0].DefaultLength
= sizeof(ULONG
);
152 QueryTable
[1].QueryRoutine
= USBPORT_GetConfigValue
;
153 QueryTable
[1].Flags
= 0;
154 QueryTable
[1].Name
= L
"DisableSelectiveSuspend";
155 QueryTable
[1].EntryContext
= DisableSelectiveSuspend
;
156 QueryTable
[1].DefaultType
= REG_DWORD
;
157 QueryTable
[1].DefaultData
= DisableSelectiveSuspend
;
158 QueryTable
[1].DefaultLength
= sizeof(ULONG
);
160 QueryTable
[2].QueryRoutine
= USBPORT_GetConfigValue
;
161 QueryTable
[2].Flags
= 0;
162 QueryTable
[2].Name
= L
"DisableCcDetect";
163 QueryTable
[2].EntryContext
= DisableCcDetect
;
164 QueryTable
[2].DefaultType
= REG_DWORD
;
165 QueryTable
[2].DefaultData
= DisableCcDetect
;
166 QueryTable
[2].DefaultLength
= sizeof(ULONG
);
168 QueryTable
[3].QueryRoutine
= USBPORT_GetConfigValue
;
169 QueryTable
[3].Flags
= 0;
170 QueryTable
[3].Name
= L
"EnIdleEndpointSupport";
171 QueryTable
[3].EntryContext
= IdleEpSupport
;
172 QueryTable
[3].DefaultType
= REG_DWORD
;
173 QueryTable
[3].DefaultData
= IdleEpSupport
;
174 QueryTable
[3].DefaultLength
= sizeof(ULONG
);
176 QueryTable
[4].QueryRoutine
= USBPORT_GetConfigValue
;
177 QueryTable
[4].Flags
= 0;
178 QueryTable
[4].Name
= L
"EnIdleEndpointSupportEx";
179 QueryTable
[4].EntryContext
= IdleEpSupportEx
;
180 QueryTable
[4].DefaultType
= REG_DWORD
;
181 QueryTable
[4].DefaultData
= IdleEpSupportEx
;
182 QueryTable
[4].DefaultLength
= sizeof(ULONG
);
184 QueryTable
[5].QueryRoutine
= USBPORT_GetConfigValue
;
185 QueryTable
[5].Flags
= 0;
186 QueryTable
[5].Name
= L
"EnSoftRetry";
187 QueryTable
[5].EntryContext
= SoftRetry
;
188 QueryTable
[5].DefaultType
= REG_DWORD
;
189 QueryTable
[5].DefaultData
= SoftRetry
;
190 QueryTable
[5].DefaultLength
= sizeof(ULONG
);
192 return RtlQueryRegistryValues(RTL_REGISTRY_SERVICES
,
201 USBPORT_IsCompanionController(IN PDEVICE_OBJECT DeviceObject
,
202 IN BOOLEAN
*IsCompanion
)
204 PDEVICE_OBJECT HighestDevice
;
207 PIO_STACK_LOCATION IoStack
;
208 PCI_DEVICE_PRESENT_INTERFACE PciInterface
= {0};
209 PCI_DEVICE_PRESENCE_PARAMETERS Parameters
= {0};
210 IO_STATUS_BLOCK IoStatusBlock
;
214 DPRINT("USBPORT_IsCompanionController: ... \n");
216 *IsCompanion
= FALSE
;
218 KeInitializeEvent(&Event
, SynchronizationEvent
, FALSE
);
220 HighestDevice
= IoGetAttachedDeviceReference(DeviceObject
);
222 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_PNP
,
232 Status
= STATUS_INSUFFICIENT_RESOURCES
;
233 ObDereferenceObject(HighestDevice
);
237 IoStack
= IoGetNextIrpStackLocation(Irp
);
239 Irp
->IoStatus
.Status
= STATUS_NOT_SUPPORTED
;
240 Irp
->IoStatus
.Information
= 0;
242 IoStack
->MinorFunction
= IRP_MN_QUERY_INTERFACE
;
244 IoStack
->Parameters
.QueryInterface
.InterfaceType
= &GUID_PCI_DEVICE_PRESENT_INTERFACE
;
245 IoStack
->Parameters
.QueryInterface
.Size
= sizeof(PCI_DEVICE_PRESENT_INTERFACE
);
246 IoStack
->Parameters
.QueryInterface
.Version
= 1;
247 IoStack
->Parameters
.QueryInterface
.Interface
= (PINTERFACE
)&PciInterface
;
248 IoStack
->Parameters
.QueryInterface
.InterfaceSpecificData
= 0;
250 Status
= IoCallDriver(HighestDevice
, Irp
);
252 if (Status
== STATUS_PENDING
)
254 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
255 Status
= IoStatusBlock
.Status
;
258 if (!NT_SUCCESS(Status
))
260 DPRINT1("USBPORT_IsCompanionController: query interface failed\\n");
261 ObDereferenceObject(HighestDevice
);
265 DPRINT("USBPORT_IsCompanionController: query interface succeeded\n");
267 if (PciInterface
.Size
< sizeof(PCI_DEVICE_PRESENT_INTERFACE
))
269 DPRINT1("USBPORT_IsCompanionController: old version\n");
270 ObDereferenceObject(HighestDevice
);
274 Parameters
.Size
= sizeof(PCI_DEVICE_PRESENT_INTERFACE
);
276 Parameters
.BaseClass
= PCI_CLASS_SERIAL_BUS_CTLR
;
277 Parameters
.SubClass
= PCI_SUBCLASS_SB_USB
;
278 Parameters
.ProgIf
= PCI_INTERFACE_USB_ID_EHCI
;
280 Parameters
.Flags
= PCI_USE_LOCAL_BUS
|
281 PCI_USE_LOCAL_DEVICE
|
282 PCI_USE_CLASS_SUBCLASS
|
285 IsPresent
= (PciInterface
.IsDevicePresentEx
)(PciInterface
.Context
,
290 DPRINT("USBPORT_IsCompanionController: Present EHCI controller for FDO - %p\n",
295 DPRINT("USBPORT_IsCompanionController: No EHCI controller for FDO - %p\n",
299 *IsCompanion
= IsPresent
;
301 (PciInterface
.InterfaceDereference
)(PciInterface
.Context
);
303 ObDereferenceObject(HighestDevice
);
310 USBPORT_QueryPciBusInterface(IN PDEVICE_OBJECT FdoDevice
)
312 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
313 PBUS_INTERFACE_STANDARD BusInterface
;
314 PIO_STACK_LOCATION IoStack
;
315 IO_STATUS_BLOCK IoStatusBlock
;
316 PDEVICE_OBJECT HighestDevice
;
321 DPRINT("USBPORT_QueryPciBusInterface: ... \n");
323 FdoExtension
= FdoDevice
->DeviceExtension
;
324 BusInterface
= &FdoExtension
->BusInterface
;
326 RtlZeroMemory(BusInterface
, sizeof(BUS_INTERFACE_STANDARD
));
327 KeInitializeEvent(&Event
, SynchronizationEvent
, FALSE
);
328 HighestDevice
= IoGetAttachedDeviceReference(FdoDevice
);
330 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_PNP
,
340 IoStack
= IoGetNextIrpStackLocation(Irp
);
342 Irp
->IoStatus
.Status
= STATUS_NOT_SUPPORTED
;
343 Irp
->IoStatus
.Information
= 0;
345 IoStack
->MinorFunction
= IRP_MN_QUERY_INTERFACE
;
347 IoStack
->Parameters
.QueryInterface
.InterfaceType
= &GUID_BUS_INTERFACE_STANDARD
;
348 IoStack
->Parameters
.QueryInterface
.Size
= sizeof(BUS_INTERFACE_STANDARD
);
349 IoStack
->Parameters
.QueryInterface
.Version
= 1;
350 IoStack
->Parameters
.QueryInterface
.Interface
= (PINTERFACE
)BusInterface
;
351 IoStack
->Parameters
.QueryInterface
.InterfaceSpecificData
= 0;
353 Status
= IoCallDriver(HighestDevice
, Irp
);
355 if (Status
== STATUS_PENDING
)
357 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
358 Status
= IoStatusBlock
.Status
;
363 Status
= STATUS_INSUFFICIENT_RESOURCES
;
366 ObDereferenceObject(HighestDevice
);
368 DPRINT("USBPORT_QueryPciBusInterface: return Status - %x\n", Status
);
375 USBPORT_QueryCapabilities(IN PDEVICE_OBJECT FdoDevice
,
376 IN PDEVICE_CAPABILITIES Capabilities
)
378 PUSBPORT_DEVICE_EXTENSION FdoExtention
;
381 PIO_STACK_LOCATION IoStack
;
384 DPRINT("USBPORT_QueryCapabilities: ... \n");
386 FdoExtention
= FdoDevice
->DeviceExtension
;
388 RtlZeroMemory(Capabilities
, sizeof(DEVICE_CAPABILITIES
));
390 Capabilities
->Size
= sizeof(DEVICE_CAPABILITIES
);
391 Capabilities
->Version
= 1;
392 Capabilities
->Address
= MAXULONG
;
393 Capabilities
->UINumber
= MAXULONG
;
395 Irp
= IoAllocateIrp(FdoExtention
->CommonExtension
.LowerDevice
->StackSize
,
400 DPRINT1("USBPORT_QueryCapabilities: No resources - IoAllocateIrp!\n");
401 return STATUS_INSUFFICIENT_RESOURCES
;
404 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
405 Irp
->IoStatus
.Status
= STATUS_NOT_SUPPORTED
;
407 IoStack
= IoGetNextIrpStackLocation(Irp
);
408 IoStack
->MajorFunction
= IRP_MJ_PNP
;
409 IoStack
->MinorFunction
= IRP_MN_QUERY_CAPABILITIES
;
411 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
413 IoSetCompletionRoutine(Irp
,
414 USBPORT_FdoStartCompletion
,
420 IoStack
->Parameters
.DeviceCapabilities
.Capabilities
= Capabilities
;
422 Status
= IoCallDriver(FdoExtention
->CommonExtension
.LowerDevice
, Irp
);
424 if (Status
== STATUS_PENDING
)
426 KeWaitForSingleObject(&Event
, Suspended
, KernelMode
, FALSE
, NULL
);
427 Status
= Irp
->IoStatus
.Status
;
430 if (NT_SUCCESS(Status
) && Capabilities
)
432 USBPORT_DumpingCapabilities(Capabilities
);
442 USBPORT_CreateLegacySymbolicLink(IN PDEVICE_OBJECT FdoDevice
)
444 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
445 WCHAR CharName
[255] = {0};
446 WCHAR CharDosName
[255] = {0};
447 UNICODE_STRING DeviceName
;
450 FdoExtension
= FdoDevice
->DeviceExtension
;
452 RtlStringCbPrintfW(CharName
,
454 L
"\\Device\\USBFDO-%d",
455 FdoExtension
->FdoNameNumber
);
457 RtlInitUnicodeString(&DeviceName
, CharName
);
459 RtlStringCbPrintfW(CharDosName
,
461 L
"\\DosDevices\\HCD%d",
462 FdoExtension
->FdoNameNumber
);
464 RtlInitUnicodeString(&FdoExtension
->DosDeviceSymbolicName
, CharDosName
);
466 DPRINT("USBPORT_CreateLegacySymbolicLink: DeviceName - %wZ, DosSymbolicName - %wZ\n",
468 &FdoExtension
->DosDeviceSymbolicName
);
470 Status
= IoCreateSymbolicLink(&FdoExtension
->DosDeviceSymbolicName
,
473 if (NT_SUCCESS(Status
))
475 FdoExtension
->Flags
|= USBPORT_FLAG_DOS_SYMBOLIC_NAME
;
483 USBPORT_StopDevice(IN PDEVICE_OBJECT FdoDevice
)
485 DPRINT1("USBPORT_StopDevice: UNIMPLEMENTED. FIXME\n");
487 return STATUS_SUCCESS
;
492 USBPORT_StartDevice(IN PDEVICE_OBJECT FdoDevice
,
493 IN PUSBPORT_RESOURCES UsbPortResources
)
495 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
496 PUSBPORT_REGISTRATION_PACKET Packet
;
498 PCI_COMMON_CONFIG PciConfig
;
500 DEVICE_DESCRIPTION DeviceDescription
;
501 PDMA_ADAPTER DmaAdapter
= NULL
;
502 ULONG MiniPortStatus
;
503 PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer
;
505 ULONG DisableSelectiveSuspend
= 0;
506 ULONG DisableCcDetect
= 0;
507 ULONG IdleEpSupport
= 0;
508 ULONG IdleEpSupportEx
= 0;
511 ULONG TotalBusBandwidth
= 0;
512 BOOLEAN IsCompanion
= FALSE
;
516 DPRINT("USBPORT_StartDevice: FdoDevice - %p, UsbPortResources - %p\n",
520 FdoExtension
= FdoDevice
->DeviceExtension
;
521 Packet
= &FdoExtension
->MiniPortInterface
->Packet
;
523 Status
= USBPORT_QueryPciBusInterface(FdoDevice
);
524 if (!NT_SUCCESS(Status
))
527 BytesRead
= (*FdoExtension
->BusInterface
.GetBusData
)(FdoExtension
->BusInterface
.Context
,
528 PCI_WHICHSPACE_CONFIG
,
531 PCI_COMMON_HDR_LENGTH
);
533 if (BytesRead
!= PCI_COMMON_HDR_LENGTH
)
535 DPRINT1("USBPORT_StartDevice: Failed to get pci config information!\n");
539 FdoExtension
->VendorID
= PciConfig
.VendorID
;
540 FdoExtension
->DeviceID
= PciConfig
.DeviceID
;
541 FdoExtension
->RevisionID
= PciConfig
.RevisionID
;
542 FdoExtension
->ProgIf
= PciConfig
.ProgIf
;
543 FdoExtension
->SubClass
= PciConfig
.SubClass
;
544 FdoExtension
->BaseClass
= PciConfig
.BaseClass
;
546 RtlZeroMemory(&DeviceDescription
, sizeof(DeviceDescription
));
548 DeviceDescription
.Version
= DEVICE_DESCRIPTION_VERSION
;
549 DeviceDescription
.Master
= TRUE
;
550 DeviceDescription
.ScatterGather
= TRUE
;
551 DeviceDescription
.Dma32BitAddresses
= TRUE
;
552 DeviceDescription
.InterfaceType
= PCIBus
;
553 DeviceDescription
.DmaWidth
= Width32Bits
;
554 DeviceDescription
.DmaSpeed
= Compatible
;
555 DeviceDescription
.MaximumLength
= MAXULONG
;
557 DmaAdapter
= IoGetDmaAdapter(FdoExtension
->CommonExtension
.LowerPdoDevice
,
559 &FdoExtension
->NumberMapRegs
);
561 FdoExtension
->DmaAdapter
= DmaAdapter
;
565 DPRINT1("USBPORT_StartDevice: Failed to get DmaAdapter!\n");
566 Status
= STATUS_INSUFFICIENT_RESOURCES
;
570 Status
= USBPORT_CreateWorkerThread(FdoDevice
);
571 if (!NT_SUCCESS(Status
))
574 Status
= USBPORT_QueryCapabilities(FdoDevice
, &FdoExtension
->Capabilities
);
575 if (!NT_SUCCESS(Status
))
578 FdoExtension
->PciDeviceNumber
= FdoExtension
->Capabilities
.Address
>> 16;
579 FdoExtension
->PciFunctionNumber
= FdoExtension
->Capabilities
.Address
& 0xFFFF;
581 Status
= IoGetDeviceProperty(FdoExtension
->CommonExtension
.LowerPdoDevice
,
582 DevicePropertyBusNumber
,
584 &FdoExtension
->BusNumber
,
587 if (!NT_SUCCESS(Status
))
590 KeInitializeSpinLock(&FdoExtension
->EndpointListSpinLock
);
591 KeInitializeSpinLock(&FdoExtension
->EpStateChangeSpinLock
);
592 KeInitializeSpinLock(&FdoExtension
->EndpointClosedSpinLock
);
593 KeInitializeSpinLock(&FdoExtension
->DeviceHandleSpinLock
);
594 KeInitializeSpinLock(&FdoExtension
->IdleIoCsqSpinLock
);
595 KeInitializeSpinLock(&FdoExtension
->BadRequestIoCsqSpinLock
);
596 KeInitializeSpinLock(&FdoExtension
->MapTransferSpinLock
);
597 KeInitializeSpinLock(&FdoExtension
->FlushTransferSpinLock
);
598 KeInitializeSpinLock(&FdoExtension
->FlushPendingTransferSpinLock
);
599 KeInitializeSpinLock(&FdoExtension
->DoneTransferSpinLock
);
600 KeInitializeSpinLock(&FdoExtension
->WorkerThreadEventSpinLock
);
601 KeInitializeSpinLock(&FdoExtension
->MiniportSpinLock
);
602 KeInitializeSpinLock(&FdoExtension
->TimerFlagsSpinLock
);
603 KeInitializeSpinLock(&FdoExtension
->PowerWakeSpinLock
);
604 KeInitializeSpinLock(&FdoExtension
->SetPowerD0SpinLock
);
605 KeInitializeSpinLock(&FdoExtension
->RootHubCallbackSpinLock
);
607 KeInitializeDpc(&FdoExtension
->IsrDpc
, USBPORT_IsrDpc
, FdoDevice
);
609 KeInitializeDpc(&FdoExtension
->TransferFlushDpc
,
610 USBPORT_TransferFlushDpc
,
613 KeInitializeDpc(&FdoExtension
->WorkerRequestDpc
,
614 USBPORT_WorkerRequestDpc
,
617 KeInitializeDpc(&FdoExtension
->HcWakeDpc
,
621 IoCsqInitialize(&FdoExtension
->IdleIoCsq
,
622 USBPORT_InsertIdleIrp
,
623 USBPORT_RemoveIdleIrp
,
624 USBPORT_PeekNextIdleIrp
,
625 USBPORT_AcquireIdleLock
,
626 USBPORT_ReleaseIdleLock
,
627 USBPORT_CompleteCanceledIdleIrp
);
629 IoCsqInitialize(&FdoExtension
->BadRequestIoCsq
,
630 USBPORT_InsertBadRequest
,
631 USBPORT_RemoveBadRequest
,
632 USBPORT_PeekNextBadRequest
,
633 USBPORT_AcquireBadRequestLock
,
634 USBPORT_ReleaseBadRequestLock
,
635 USBPORT_CompleteCanceledBadRequest
);
637 FdoExtension
->IsrDpcCounter
= -1;
638 FdoExtension
->IsrDpcHandlerCounter
= -1;
639 FdoExtension
->IdleLockCounter
= -1;
640 FdoExtension
->BadRequestLockCounter
= -1;
641 FdoExtension
->ChirpRootPortLock
= -1;
643 FdoExtension
->RHInitCallBackLock
= 0;
645 FdoExtension
->UsbAddressBitMap
[0] = 1;
646 FdoExtension
->UsbAddressBitMap
[1] = 0;
647 FdoExtension
->UsbAddressBitMap
[2] = 0;
648 FdoExtension
->UsbAddressBitMap
[3] = 0;
650 USBPORT_GetDefaultBIOSx(FdoDevice
,
651 &FdoExtension
->UsbBIOSx
,
652 &DisableSelectiveSuspend
,
658 if (DisableSelectiveSuspend
)
659 FdoExtension
->Flags
|= USBPORT_FLAG_BIOS_DISABLE_SS
;
661 if (!DisableSelectiveSuspend
&&
662 USBPORT_IsSelectiveSuspendEnabled(FdoDevice
))
664 FdoExtension
->Flags
|= USBPORT_FLAG_SELECTIVE_SUSPEND
;
667 MiniportFlags
= Packet
->MiniPortFlags
;
669 if (MiniportFlags
& USB_MINIPORT_FLAGS_POLLING
)
670 FdoExtension
->Flags
|= USBPORT_FLAG_HC_POLLING
;
672 if (MiniportFlags
& USB_MINIPORT_FLAGS_WAKE_SUPPORT
)
673 FdoExtension
->Flags
|= USBPORT_FLAG_HC_WAKE_SUPPORT
;
675 if (MiniportFlags
& USB_MINIPORT_FLAGS_DISABLE_SS
)
676 FdoExtension
->Flags
= (FdoExtension
->Flags
& ~USBPORT_FLAG_SELECTIVE_SUSPEND
) |
677 USBPORT_FLAG_BIOS_DISABLE_SS
;
679 USBPORT_SetRegistryKeyValue(FdoExtension
->CommonExtension
.LowerPdoDevice
,
682 L
"EnIdleEndpointSupport",
684 sizeof(IdleEpSupport
));
686 USBPORT_SetRegistryKeyValue(FdoExtension
->CommonExtension
.LowerPdoDevice
,
689 L
"EnIdleEndpointSupportEx",
691 sizeof(IdleEpSupportEx
));
693 USBPORT_SetRegistryKeyValue(FdoExtension
->CommonExtension
.LowerPdoDevice
,
700 USBPORT_GetRegistryKeyValueFullInfo(FdoDevice
,
701 FdoExtension
->CommonExtension
.LowerPdoDevice
,
703 L
"CommonBuffer2GBLimit",
704 sizeof(L
"CommonBuffer2GBLimit"),
708 FdoExtension
->CommonBufferLimit
= (Limit2GB
!= 0);
710 if (FdoExtension
->BaseClass
== PCI_CLASS_SERIAL_BUS_CTLR
&&
711 FdoExtension
->SubClass
== PCI_SUBCLASS_SB_USB
&&
712 FdoExtension
->ProgIf
< PCI_INTERFACE_USB_ID_EHCI
)
714 Status
= USBPORT_IsCompanionController(FdoDevice
, &IsCompanion
);
716 if (!NT_SUCCESS(Status
))
720 FdoExtension
->Flags
|= USBPORT_FLAG_COMPANION_HC
;
724 FdoExtension
->Flags
&= ~USBPORT_FLAG_COMPANION_HC
;
731 FdoExtension
->Flags
&= ~USBPORT_FLAG_COMPANION_HC
;
734 TotalBusBandwidth
= Packet
->MiniPortBusBandwidth
;
735 FdoExtension
->TotalBusBandwidth
= TotalBusBandwidth
;
737 USBPORT_GetRegistryKeyValueFullInfo(FdoDevice
,
738 FdoExtension
->CommonExtension
.LowerPdoDevice
,
740 L
"TotalBusBandwidth",
741 sizeof(L
"TotalBusBandwidth"),
743 sizeof(TotalBusBandwidth
));
745 if (TotalBusBandwidth
!= FdoExtension
->TotalBusBandwidth
)
747 FdoExtension
->TotalBusBandwidth
= TotalBusBandwidth
;
750 FdoExtension
->ActiveIrpTable
= ExAllocatePoolWithTag(NonPagedPool
,
751 sizeof(USBPORT_IRP_TABLE
),
754 if (!FdoExtension
->ActiveIrpTable
)
756 DPRINT1("USBPORT_StartDevice: Allocate ActiveIrpTable failed!\n");
760 RtlZeroMemory(FdoExtension
->ActiveIrpTable
, sizeof(USBPORT_IRP_TABLE
));
762 FdoExtension
->PendingIrpTable
= ExAllocatePoolWithTag(NonPagedPool
,
763 sizeof(USBPORT_IRP_TABLE
),
766 if (!FdoExtension
->PendingIrpTable
)
768 DPRINT1("USBPORT_StartDevice: Allocate PendingIrpTable failed!\n");
772 RtlZeroMemory(FdoExtension
->PendingIrpTable
, sizeof(USBPORT_IRP_TABLE
));
774 Status
= IoConnectInterrupt(&FdoExtension
->InterruptObject
,
775 USBPORT_InterruptService
,
778 UsbPortResources
->InterruptVector
,
779 UsbPortResources
->InterruptLevel
,
780 UsbPortResources
->InterruptLevel
,
781 UsbPortResources
->InterruptMode
,
782 UsbPortResources
->ShareVector
,
783 UsbPortResources
->InterruptAffinity
,
787 if (!NT_SUCCESS(Status
))
789 DPRINT1("USBPORT_StartDevice: IoConnectInterrupt failed!\n");
793 FdoExtension
->Flags
&= ~USBPORT_FLAG_INT_CONNECTED
;
795 if (Packet
->MiniPortExtensionSize
)
797 RtlZeroMemory(FdoExtension
->MiniPortExt
, Packet
->MiniPortExtensionSize
);
800 if (Packet
->MiniPortResourcesSize
)
802 HeaderBuffer
= USBPORT_AllocateCommonBuffer(FdoDevice
,
803 Packet
->MiniPortResourcesSize
);
807 DPRINT1("USBPORT_StartDevice: Failed to AllocateCommonBuffer!\n");
808 Status
= STATUS_INSUFFICIENT_RESOURCES
;
812 UsbPortResources
->StartVA
= (PVOID
)HeaderBuffer
->VirtualAddress
;
813 UsbPortResources
->StartPA
= (PVOID
)HeaderBuffer
->PhysicalAddress
;
815 FdoExtension
->MiniPortCommonBuffer
= HeaderBuffer
;
819 FdoExtension
->MiniPortCommonBuffer
= NULL
;
822 MiniPortStatus
= Packet
->StartController(FdoExtension
->MiniPortExt
,
825 if (UsbPortResources
->LegacySupport
)
827 FdoExtension
->Flags
|= USBPORT_FLAG_LEGACY_SUPPORT
;
835 USBPORT_SetRegistryKeyValue(FdoExtension
->CommonExtension
.LowerPdoDevice
,
838 L
"DetectedLegacyBIOS",
844 DPRINT1("USBPORT_StartDevice: Failed to Start MiniPort. MiniPortStatus - %x\n",
847 if (FdoExtension
->Flags
& USBPORT_FLAG_INT_CONNECTED
)
849 IoDisconnectInterrupt(FdoExtension
->InterruptObject
);
850 FdoExtension
->Flags
&= ~USBPORT_FLAG_INT_CONNECTED
;
853 if (FdoExtension
->MiniPortCommonBuffer
)
855 USBPORT_FreeCommonBuffer(FdoDevice
, FdoExtension
->MiniPortCommonBuffer
);
856 FdoExtension
->MiniPortCommonBuffer
= NULL
;
863 FdoExtension
->MiniPortFlags
|= USBPORT_MPFLAG_INTERRUPTS_ENABLED
;
864 USBPORT_MiniportInterrupts(FdoDevice
, TRUE
);
867 FdoExtension
->TimerValue
= 500;
868 USBPORT_StartTimer((PVOID
)FdoDevice
, 500);
870 Status
= USBPORT_RegisterDeviceInterface(FdoExtension
->CommonExtension
.LowerPdoDevice
,
872 &GUID_DEVINTERFACE_USB_HOST_CONTROLLER
,
875 if (!NT_SUCCESS(Status
))
877 DPRINT1("USBPORT_StartDevice: RegisterDeviceInterface failed!\n");
881 USBPORT_CreateLegacySymbolicLink(FdoDevice
);
883 FdoExtension
->Flags
|= USBPORT_FLAG_HC_STARTED
;
885 DPRINT("USBPORT_StartDevice: Exit Status - %p\n", Status
);
889 USBPORT_StopDevice(FdoDevice
);
891 DPRINT1("USBPORT_StartDevice: ExitWithError Status - %lx\n", Status
);
897 USBPORT_ParseResources(IN PDEVICE_OBJECT FdoDevice
,
899 IN PUSBPORT_RESOURCES UsbPortResources
)
901 PCM_RESOURCE_LIST AllocatedResourcesTranslated
;
902 PCM_PARTIAL_RESOURCE_LIST ResourceList
;
903 PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor
;
904 PCM_PARTIAL_RESOURCE_DESCRIPTOR PortDescriptor
= NULL
;
905 PCM_PARTIAL_RESOURCE_DESCRIPTOR MemoryDescriptor
= NULL
;
906 PCM_PARTIAL_RESOURCE_DESCRIPTOR InterruptDescriptor
= NULL
;
907 PIO_STACK_LOCATION IoStack
;
909 NTSTATUS Status
= STATUS_SUCCESS
;
911 DPRINT("USBPORT_ParseResources: ... \n");
913 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
914 AllocatedResourcesTranslated
= IoStack
->Parameters
.StartDevice
.AllocatedResourcesTranslated
;
916 if (AllocatedResourcesTranslated
)
918 RtlZeroMemory(UsbPortResources
, sizeof(USBPORT_RESOURCES
));
920 ResourceList
= &AllocatedResourcesTranslated
->List
[0].PartialResourceList
;
922 PartialDescriptor
= &ResourceList
->PartialDescriptors
[0];
924 for (ix
= 0; ix
< ResourceList
->Count
; ++ix
)
926 if (PartialDescriptor
->Type
== CmResourceTypePort
)
929 PortDescriptor
= PartialDescriptor
;
931 else if (PartialDescriptor
->Type
== CmResourceTypeInterrupt
)
933 if (!InterruptDescriptor
)
934 InterruptDescriptor
= PartialDescriptor
;
936 else if (PartialDescriptor
->Type
== CmResourceTypeMemory
)
938 if (!MemoryDescriptor
)
939 MemoryDescriptor
= PartialDescriptor
;
942 PartialDescriptor
+= 1;
947 if (PortDescriptor
->Flags
& CM_RESOURCE_PORT_IO
)
949 UsbPortResources
->ResourceBase
= (PVOID
)PortDescriptor
->u
.Port
.Start
.LowPart
;
953 UsbPortResources
->ResourceBase
= MmMapIoSpace(PortDescriptor
->u
.Port
.Start
,
954 PortDescriptor
->u
.Port
.Length
,
958 UsbPortResources
->IoSpaceLength
= PortDescriptor
->u
.Port
.Length
;
960 if (UsbPortResources
->ResourceBase
)
962 UsbPortResources
->ResourcesTypes
|= USBPORT_RESOURCES_PORT
;
966 Status
= STATUS_NONE_MAPPED
;
970 if (MemoryDescriptor
&& NT_SUCCESS(Status
))
972 UsbPortResources
->IoSpaceLength
= MemoryDescriptor
->u
.Memory
.Length
;
974 UsbPortResources
->ResourceBase
= MmMapIoSpace(MemoryDescriptor
->u
.Memory
.Start
,
975 MemoryDescriptor
->u
.Memory
.Length
,
978 if (UsbPortResources
->ResourceBase
)
980 UsbPortResources
->ResourcesTypes
|= USBPORT_RESOURCES_MEMORY
;
984 Status
= STATUS_NONE_MAPPED
;
988 if (InterruptDescriptor
&& NT_SUCCESS(Status
))
990 UsbPortResources
->ResourcesTypes
|= USBPORT_RESOURCES_INTERRUPT
;
992 UsbPortResources
->InterruptVector
= InterruptDescriptor
->u
.Interrupt
.Vector
;
993 UsbPortResources
->InterruptLevel
= InterruptDescriptor
->u
.Interrupt
.Level
;
994 UsbPortResources
->InterruptAffinity
= InterruptDescriptor
->u
.Interrupt
.Affinity
;
996 UsbPortResources
->ShareVector
= InterruptDescriptor
->ShareDisposition
==
997 CmResourceShareShared
;
999 UsbPortResources
->InterruptMode
= InterruptDescriptor
->Flags
==
1000 CM_RESOURCE_INTERRUPT_LATCHED
;
1005 Status
= STATUS_NONE_MAPPED
;
1013 USBPORT_CreatePdo(IN PDEVICE_OBJECT FdoDevice
,
1014 OUT PDEVICE_OBJECT
*RootHubPdo
)
1016 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
1017 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
1018 UNICODE_STRING DeviceName
;
1019 ULONG DeviceNumber
= 0;
1020 PDEVICE_OBJECT DeviceObject
= NULL
;
1021 WCHAR CharDeviceName
[64];
1022 NTSTATUS Status
= STATUS_SUCCESS
;
1024 DPRINT("USBPORT_CreatePdo: FdoDevice - %p, RootHubPdo - %p\n",
1028 FdoExtension
= FdoDevice
->DeviceExtension
;
1032 RtlStringCbPrintfW(CharDeviceName
,
1033 sizeof(CharDeviceName
),
1034 L
"\\Device\\USBPDO-%d",
1037 RtlInitUnicodeString(&DeviceName
, CharDeviceName
);
1039 DPRINT("USBPORT_CreatePdo: DeviceName - %wZ\n", &DeviceName
);
1041 Status
= IoCreateDevice(FdoExtension
->MiniPortInterface
->DriverObject
,
1042 sizeof(USBPORT_RHDEVICE_EXTENSION
),
1044 FILE_DEVICE_BUS_EXTENDER
,
1051 while (Status
== STATUS_OBJECT_NAME_COLLISION
);
1053 if (!NT_SUCCESS(Status
))
1056 DPRINT1("USBPORT_CreatePdo: Filed create HubPdo!\n");
1062 PdoExtension
= DeviceObject
->DeviceExtension
;
1064 RtlZeroMemory(PdoExtension
, sizeof(USBPORT_RHDEVICE_EXTENSION
));
1066 PdoExtension
->CommonExtension
.SelfDevice
= DeviceObject
;
1067 PdoExtension
->CommonExtension
.IsPDO
= TRUE
;
1069 PdoExtension
->FdoDevice
= FdoDevice
;
1070 PdoExtension
->PdoNameNumber
= DeviceNumber
;
1072 USBPORT_AdjustDeviceCapabilities(FdoDevice
, DeviceObject
);
1074 DeviceObject
->StackSize
= FdoDevice
->StackSize
;
1076 DeviceObject
->Flags
|= DO_POWER_PAGABLE
;
1077 DeviceObject
->Flags
&= ~DO_DEVICE_INITIALIZING
;
1081 Status
= STATUS_UNSUCCESSFUL
;
1084 if (!NT_SUCCESS(Status
))
1087 *RootHubPdo
= DeviceObject
;
1089 DPRINT("USBPORT_CreatePdo: HubPdo - %p\n", DeviceObject
);
1095 USBPORT_FdoPnP(IN PDEVICE_OBJECT FdoDevice
,
1098 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
1099 PUSBPORT_COMMON_DEVICE_EXTENSION FdoCommonExtension
;
1100 PUSBPORT_REGISTRATION_PACKET Packet
;
1101 PUSBPORT_RESOURCES UsbPortResources
;
1102 PIO_STACK_LOCATION IoStack
;
1106 DEVICE_RELATION_TYPE RelationType
;
1107 PDEVICE_RELATIONS DeviceRelations
;
1108 PDEVICE_OBJECT RootHubPdo
;
1110 FdoExtension
= FdoDevice
->DeviceExtension
;
1111 FdoCommonExtension
= &FdoExtension
->CommonExtension
;
1112 UsbPortResources
= &FdoExtension
->UsbPortResources
;
1113 Packet
= &FdoExtension
->MiniPortInterface
->Packet
;
1115 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
1116 Minor
= IoStack
->MinorFunction
;
1118 DPRINT("USBPORT_FdoPnP: FdoDevice - %p, Minor - %x\n", FdoDevice
, Minor
);
1120 RelationType
= IoStack
->Parameters
.QueryDeviceRelations
.Type
;
1124 case IRP_MN_START_DEVICE
:
1125 DPRINT("IRP_MN_START_DEVICE\n");
1127 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
1129 IoCopyCurrentIrpStackLocationToNext(Irp
);
1131 IoSetCompletionRoutine(Irp
,
1132 USBPORT_FdoStartCompletion
,
1138 Status
= IoCallDriver(FdoCommonExtension
->LowerDevice
,
1141 if (Status
== STATUS_PENDING
)
1143 KeWaitForSingleObject(&Event
,
1149 Status
= Irp
->IoStatus
.Status
;
1152 if (!NT_SUCCESS(Status
))
1157 Status
= USBPORT_ParseResources(FdoDevice
,
1161 if (!NT_SUCCESS(Status
))
1163 FdoCommonExtension
->PnpStateFlags
|= USBPORT_PNP_STATE_STOPPED
;
1167 Status
= USBPORT_StartDevice(FdoDevice
, UsbPortResources
);
1169 if (!NT_SUCCESS(Status
))
1171 FdoCommonExtension
->PnpStateFlags
|= USBPORT_PNP_STATE_STOPPED
;
1175 FdoCommonExtension
->PnpStateFlags
&= ~USBPORT_PNP_STATE_NOT_INIT
;
1176 FdoCommonExtension
->PnpStateFlags
|= USBPORT_PNP_STATE_STARTED
;
1178 FdoCommonExtension
->DevicePowerState
= PowerDeviceD0
;
1180 if (Packet
->MiniPortFlags
& USB_MINIPORT_FLAGS_USB2
)
1182 USBPORT_AddUSB2Fdo(FdoDevice
);
1186 USBPORT_AddUSB1Fdo(FdoDevice
);
1190 Irp
->IoStatus
.Status
= Status
;
1191 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
1194 case IRP_MN_QUERY_REMOVE_DEVICE
:
1195 DPRINT("IRP_MN_QUERY_REMOVE_DEVICE\n");
1196 if (Packet
->MiniPortFlags
& USB_MINIPORT_FLAGS_USB2
)
1198 DPRINT1("USBPORT_FdoPnP: Haction registry write FIXME\n");
1201 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
1204 case IRP_MN_REMOVE_DEVICE
:
1205 DPRINT("USBPORT_FdoPnP: IRP_MN_REMOVE_DEVICE\n");
1206 FdoCommonExtension
->PnpStateFlags
|= USBPORT_PNP_STATE_FAILED
;
1208 if (FdoCommonExtension
->PnpStateFlags
& USBPORT_PNP_STATE_STARTED
&&
1209 !(FdoCommonExtension
->PnpStateFlags
& USBPORT_PNP_STATE_NOT_INIT
))
1211 DPRINT1("USBPORT_FdoPnP: stop fdo FIXME\n");
1212 FdoCommonExtension
->PnpStateFlags
|= USBPORT_PNP_STATE_NOT_INIT
;
1215 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
1216 IoSkipCurrentIrpStackLocation(Irp
);
1217 Status
= IoCallDriver(FdoCommonExtension
->LowerDevice
, Irp
);
1219 IoDetachDevice(FdoCommonExtension
->LowerDevice
);
1221 RootHubPdo
= FdoExtension
->RootHubPdo
;
1223 IoDeleteDevice(FdoDevice
);
1227 IoDeleteDevice(RootHubPdo
);
1232 case IRP_MN_CANCEL_REMOVE_DEVICE
:
1233 DPRINT("IRP_MN_CANCEL_REMOVE_DEVICE\n");
1234 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
1237 case IRP_MN_STOP_DEVICE
:
1238 DPRINT("IRP_MN_STOP_DEVICE\n");
1239 if (FdoCommonExtension
->PnpStateFlags
& USBPORT_PNP_STATE_STARTED
)
1241 DPRINT1("USBPORT_FdoPnP: stop fdo FIXME\n");
1243 FdoCommonExtension
->PnpStateFlags
&= ~USBPORT_PNP_STATE_STARTED
;
1244 FdoCommonExtension
->PnpStateFlags
|= USBPORT_PNP_STATE_NOT_INIT
;
1247 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
1250 case IRP_MN_QUERY_STOP_DEVICE
:
1251 DPRINT("IRP_MN_QUERY_STOP_DEVICE\n");
1252 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
1255 case IRP_MN_CANCEL_STOP_DEVICE
:
1256 DPRINT("IRP_MN_CANCEL_STOP_DEVICE\n");
1257 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
1260 case IRP_MN_QUERY_DEVICE_RELATIONS
:
1261 DPRINT("IRP_MN_QUERY_DEVICE_RELATIONS\n");
1262 if (RelationType
== BusRelations
)
1264 DeviceRelations
= ExAllocatePoolWithTag(PagedPool
,
1265 sizeof(DEVICE_RELATIONS
),
1268 if (!DeviceRelations
)
1270 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1271 Irp
->IoStatus
.Status
= Status
;
1272 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
1276 DeviceRelations
->Count
= 0;
1277 DeviceRelations
->Objects
[0] = NULL
;
1279 if (!FdoExtension
->RootHubPdo
)
1281 Status
= USBPORT_CreatePdo(FdoDevice
,
1282 &FdoExtension
->RootHubPdo
);
1284 if (!NT_SUCCESS(Status
))
1286 ExFreePoolWithTag(DeviceRelations
, USB_PORT_TAG
);
1292 Status
= STATUS_SUCCESS
;
1295 DeviceRelations
->Count
= 1;
1296 DeviceRelations
->Objects
[0] = FdoExtension
->RootHubPdo
;
1298 ObReferenceObject(FdoExtension
->RootHubPdo
);
1299 Irp
->IoStatus
.Information
= (ULONG_PTR
)DeviceRelations
;
1303 if (RelationType
== RemovalRelations
)
1305 DPRINT1("USBPORT_FdoPnP: FIXME IRP_MN_QUERY_DEVICE_RELATIONS/RemovalRelations\n");
1311 Irp
->IoStatus
.Status
= Status
;
1314 case IRP_MN_QUERY_INTERFACE
:
1315 DPRINT("IRP_MN_QUERY_INTERFACE\n");
1318 case IRP_MN_QUERY_CAPABILITIES
:
1319 DPRINT("IRP_MN_QUERY_CAPABILITIES\n");
1322 case IRP_MN_QUERY_RESOURCES
:
1323 DPRINT("IRP_MN_QUERY_RESOURCES\n");
1326 case IRP_MN_QUERY_RESOURCE_REQUIREMENTS
:
1327 DPRINT("IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
1330 case IRP_MN_QUERY_DEVICE_TEXT
:
1331 DPRINT("IRP_MN_QUERY_DEVICE_TEXT\n");
1334 case IRP_MN_FILTER_RESOURCE_REQUIREMENTS
:
1335 DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
1338 case IRP_MN_READ_CONFIG
:
1339 DPRINT("IRP_MN_READ_CONFIG\n");
1342 case IRP_MN_WRITE_CONFIG
:
1343 DPRINT("IRP_MN_WRITE_CONFIG\n");
1347 DPRINT("IRP_MN_EJECT\n");
1350 case IRP_MN_SET_LOCK
:
1351 DPRINT("IRP_MN_SET_LOCK\n");
1354 case IRP_MN_QUERY_ID
:
1355 DPRINT("IRP_MN_QUERY_ID\n");
1358 case IRP_MN_QUERY_PNP_DEVICE_STATE
:
1359 DPRINT("IRP_MN_QUERY_PNP_DEVICE_STATE\n");
1362 case IRP_MN_QUERY_BUS_INFORMATION
:
1363 DPRINT("IRP_MN_QUERY_BUS_INFORMATION\n");
1366 case IRP_MN_DEVICE_USAGE_NOTIFICATION
:
1367 DPRINT("IRP_MN_DEVICE_USAGE_NOTIFICATION\n");
1370 case IRP_MN_SURPRISE_REMOVAL
:
1371 DPRINT1("IRP_MN_SURPRISE_REMOVAL\n");
1372 if (!(FdoCommonExtension
->PnpStateFlags
& USBPORT_PNP_STATE_FAILED
))
1374 USBPORT_InvalidateControllerHandler(FdoDevice
,
1375 USBPORT_INVALIDATE_CONTROLLER_SURPRISE_REMOVE
);
1380 DPRINT("unknown IRP_MN_???\n");
1382 /* forward irp to next device object */
1383 IoSkipCurrentIrpStackLocation(Irp
);
1387 return IoCallDriver(FdoCommonExtension
->LowerDevice
, Irp
);
1392 USBPORT_GetDeviceHwIds(IN PDEVICE_OBJECT FdoDevice
,
1395 IN USHORT RevisionID
)
1397 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
1398 PUSBPORT_REGISTRATION_PACKET Packet
;
1400 WCHAR Buffer
[300] = {0};
1402 size_t Remaining
= sizeof(Buffer
);
1405 FdoExtension
= FdoDevice
->DeviceExtension
;
1406 Packet
= &FdoExtension
->MiniPortInterface
->Packet
;
1408 DPRINT("USBPORT_GetDeviceHwIds: FdoDevice - %p, Packet->MiniPortFlags - %p\n",
1410 Packet
->MiniPortFlags
);
1412 if (Packet
->MiniPortFlags
& USB_MINIPORT_FLAGS_USB2
)
1414 RtlStringCbPrintfExW(Buffer
,
1419 L
"USB\\ROOT_HUB20&VID%04x&PID%04x&REV%04x",
1425 Remaining
-= sizeof(UNICODE_NULL
);
1427 RtlStringCbPrintfExW(EndBuffer
,
1432 L
"USB\\ROOT_HUB20&VID%04x&PID%04x",
1437 Remaining
-= sizeof(UNICODE_NULL
);
1439 RtlStringCbPrintfExW(EndBuffer
,
1444 L
"USB\\ROOT_HUB20");
1448 RtlStringCbPrintfExW(Buffer
,
1453 L
"USB\\ROOT_HUB&VID%04x&PID%04x&REV%04x",
1459 Remaining
-= sizeof(UNICODE_NULL
);
1461 RtlStringCbPrintfExW(EndBuffer
,
1466 L
"USB\\ROOT_HUB&VID%04x&PID%04x",
1471 Remaining
-= sizeof(UNICODE_NULL
);
1473 RtlStringCbPrintfExW(EndBuffer
,
1481 Length
= (sizeof(Buffer
) - Remaining
+ sizeof(UNICODE_NULL
));
1483 /* for debug only */
1486 DPRINT("Hardware IDs:\n");
1487 USBPORT_DumpingIDs(Buffer
);
1490 Id
= ExAllocatePoolWithTag(PagedPool
, Length
, USB_PORT_TAG
);
1495 RtlMoveMemory(Id
, Buffer
, Length
);
1502 USBPORT_PdoPnP(IN PDEVICE_OBJECT PdoDevice
,
1505 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
1506 PUSBPORT_COMMON_DEVICE_EXTENSION PdoCommonExtension
;
1507 PDEVICE_OBJECT FdoDevice
;
1508 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
1509 PIO_STACK_LOCATION IoStack
;
1512 PPNP_BUS_INFORMATION BusInformation
;
1513 PDEVICE_CAPABILITIES DeviceCapabilities
;
1515 PdoExtension
= PdoDevice
->DeviceExtension
;
1516 PdoCommonExtension
= &PdoExtension
->CommonExtension
;
1518 FdoDevice
= PdoExtension
->FdoDevice
;
1519 FdoExtension
= FdoDevice
->DeviceExtension
;
1521 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
1522 Minor
= IoStack
->MinorFunction
;
1524 Status
= Irp
->IoStatus
.Status
;
1526 DPRINT("USBPORT_PdoPnP: PdoDevice - %p, Minor - %x\n", PdoDevice
, Minor
);
1530 case IRP_MN_START_DEVICE
:
1531 DPRINT("IRP_MN_START_DEVICE\n");
1533 Status
= USBPORT_RootHubCreateDevice(FdoDevice
, PdoDevice
);
1535 if (NT_SUCCESS(Status
))
1537 Status
= USBPORT_RegisterDeviceInterface(PdoDevice
,
1539 &GUID_DEVINTERFACE_USB_HUB
,
1542 if (NT_SUCCESS(Status
))
1544 PdoCommonExtension
->DevicePowerState
= PowerDeviceD0
;
1545 PdoCommonExtension
->PnpStateFlags
= USBPORT_PNP_STATE_STARTED
;
1551 case IRP_MN_QUERY_REMOVE_DEVICE
:
1552 DPRINT("USBPORT_PdoPnP: IRP_MN_QUERY_REMOVE_DEVICE\n");
1553 Status
= STATUS_SUCCESS
;
1556 case IRP_MN_REMOVE_DEVICE
:
1557 DPRINT1("USBPORT_PdoPnP: IRP_MN_REMOVE_DEVICE UNIMPLEMENTED. FIXME. \n");
1558 //USBPORT_StopRootHub();
1559 Status
= STATUS_SUCCESS
;
1562 case IRP_MN_CANCEL_REMOVE_DEVICE
:
1563 DPRINT("IRP_MN_CANCEL_REMOVE_DEVICE\n");
1564 Status
= STATUS_SUCCESS
;
1567 case IRP_MN_STOP_DEVICE
:
1568 DPRINT1("USBPORT_PdoPnP: IRP_MN_STOP_DEVICE UNIMPLEMENTED. FIXME. \n");
1569 //USBPORT_StopRootHub();
1570 Status
= STATUS_SUCCESS
;
1573 case IRP_MN_QUERY_STOP_DEVICE
:
1574 DPRINT("IRP_MN_QUERY_STOP_DEVICE\n");
1575 Status
= STATUS_SUCCESS
;
1578 case IRP_MN_CANCEL_STOP_DEVICE
:
1579 DPRINT("IRP_MN_CANCEL_STOP_DEVICE\n");
1580 Status
= STATUS_SUCCESS
;
1583 case IRP_MN_QUERY_DEVICE_RELATIONS
:
1585 PDEVICE_RELATIONS DeviceRelations
;
1587 DPRINT("IRP_MN_QUERY_DEVICE_RELATIONS\n");
1588 if (IoStack
->Parameters
.QueryDeviceRelations
.Type
!= TargetDeviceRelation
)
1593 DeviceRelations
= ExAllocatePoolWithTag(PagedPool
,
1594 sizeof(DEVICE_RELATIONS
),
1597 if (!DeviceRelations
)
1599 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1600 Irp
->IoStatus
.Information
= 0;
1604 DeviceRelations
->Count
= 1;
1605 DeviceRelations
->Objects
[0] = PdoDevice
;
1607 ObReferenceObject(PdoDevice
);
1609 Status
= STATUS_SUCCESS
;
1610 Irp
->IoStatus
.Information
= (ULONG_PTR
)DeviceRelations
;
1614 case IRP_MN_QUERY_INTERFACE
:
1615 DPRINT("IRP_MN_QUERY_INTERFACE\n");
1616 Status
= USBPORT_PdoQueryInterface(FdoDevice
, PdoDevice
, Irp
);
1619 case IRP_MN_QUERY_CAPABILITIES
:
1620 DPRINT("IRP_MN_QUERY_CAPABILITIES\n");
1622 DeviceCapabilities
= IoStack
->Parameters
.DeviceCapabilities
.Capabilities
;
1624 RtlCopyMemory(DeviceCapabilities
,
1625 &PdoExtension
->Capabilities
,
1626 sizeof(DEVICE_CAPABILITIES
));
1628 Status
= STATUS_SUCCESS
;
1631 case IRP_MN_QUERY_RESOURCES
:
1632 DPRINT("USBPORT_PdoPnP: IRP_MN_QUERY_RESOURCES\n");
1635 case IRP_MN_QUERY_RESOURCE_REQUIREMENTS
:
1636 DPRINT("IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
1639 case IRP_MN_QUERY_DEVICE_TEXT
:
1640 DPRINT("IRP_MN_QUERY_DEVICE_TEXT\n");
1643 case IRP_MN_FILTER_RESOURCE_REQUIREMENTS
:
1644 DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
1647 case IRP_MN_READ_CONFIG
:
1648 DPRINT("IRP_MN_READ_CONFIG\n");
1652 case IRP_MN_WRITE_CONFIG
:
1653 DPRINT("IRP_MN_WRITE_CONFIG\n");
1658 DPRINT("IRP_MN_EJECT\n");
1662 case IRP_MN_SET_LOCK
:
1663 DPRINT("IRP_MN_SET_LOCK\n");
1667 case IRP_MN_QUERY_ID
:
1671 WCHAR Buffer
[64] = {0};
1674 Status
= STATUS_SUCCESS
;
1675 IdType
= IoStack
->Parameters
.QueryId
.IdType
;
1677 DPRINT("IRP_MN_QUERY_ID/Type %x\n", IdType
);
1679 if (IdType
== BusQueryDeviceID
)
1681 PUSBPORT_REGISTRATION_PACKET Packet
;
1682 Packet
= &FdoExtension
->MiniPortInterface
->Packet
;
1684 if (Packet
->MiniPortFlags
& USB_MINIPORT_FLAGS_USB2
)
1686 RtlStringCbPrintfW(Buffer
,
1688 L
"USB\\ROOT_HUB20");
1692 RtlStringCbPrintfW(Buffer
,
1697 Length
= (wcslen(Buffer
) + 1);
1699 Id
= ExAllocatePoolWithTag(PagedPool
,
1700 Length
* sizeof(WCHAR
),
1705 RtlZeroMemory(Id
, Length
* sizeof(WCHAR
));
1706 RtlStringCbCopyW(Id
, Length
* sizeof(WCHAR
), Buffer
);
1708 DPRINT("BusQueryDeviceID - %S, TotalLength - %hu\n",
1713 Irp
->IoStatus
.Information
= (ULONG_PTR
)Id
;
1717 if (IdType
== BusQueryHardwareIDs
)
1719 Id
= USBPORT_GetDeviceHwIds(FdoDevice
,
1720 FdoExtension
->VendorID
,
1721 FdoExtension
->DeviceID
,
1722 FdoExtension
->RevisionID
);
1724 Irp
->IoStatus
.Information
= (ULONG_PTR
)Id
;
1728 if (IdType
== BusQueryCompatibleIDs
||
1729 IdType
== BusQueryInstanceID
)
1731 Irp
->IoStatus
.Information
= 0;
1735 /* IdType == BusQueryDeviceSerialNumber */
1736 Status
= Irp
->IoStatus
.Status
;
1740 case IRP_MN_QUERY_PNP_DEVICE_STATE
:
1741 DPRINT("IRP_MN_QUERY_PNP_DEVICE_STATE\n");
1742 Status
= STATUS_SUCCESS
;
1745 case IRP_MN_QUERY_BUS_INFORMATION
:
1746 DPRINT("IRP_MN_QUERY_BUS_INFORMATION\n");
1748 /* Allocate buffer for bus information */
1749 BusInformation
= ExAllocatePoolWithTag(PagedPool
,
1750 sizeof(PNP_BUS_INFORMATION
),
1753 if (!BusInformation
)
1756 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1760 RtlZeroMemory(BusInformation
, sizeof(PNP_BUS_INFORMATION
));
1763 RtlMoveMemory(&BusInformation
->BusTypeGuid
,
1768 BusInformation
->LegacyBusType
= PNPBus
;
1769 BusInformation
->BusNumber
= 0;
1771 Status
= STATUS_SUCCESS
;
1772 Irp
->IoStatus
.Information
= (ULONG_PTR
)BusInformation
;
1775 case IRP_MN_DEVICE_USAGE_NOTIFICATION
:
1776 DPRINT("IRP_MN_DEVICE_USAGE_NOTIFICATION\n");
1779 case IRP_MN_SURPRISE_REMOVAL
:
1780 DPRINT("USBPORT_PdoPnP: IRP_MN_SURPRISE_REMOVAL\n");
1781 Status
= STATUS_SUCCESS
;
1785 DPRINT("unknown IRP_MN_???\n");
1789 Irp
->IoStatus
.Status
= Status
;
1790 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);