ReactOS 0.4.17-dev-1281-g065abb3
hc.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS xHCI Host Controller Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Controller FDO, power, recovery and the UCX controller callbacks
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#include "xhcidrv.h"
9#include <ntstrsafe.h>
10#include <acpiioct.h>
11
12#define NDEBUG
13#include <debug.h>
14
15/* GUIDs kept local so the driver needs no GUID library */
17 { 0x496b8280, 0x6f25, 0x11d0, { 0xbe, 0xaf, 0x08, 0x00, 0x2b, 0xe2, 0x09, 0x2f } };
19 { 0xb38290e5, 0x3cd0, 0x4f9d, { 0x99, 0x37, 0xf5, 0xfe, 0x2b, 0x44, 0xd4, 0x7a } };
21 { 0x9d7debbc, 0xc85d, 0x11d1, { 0x9e, 0xb4, 0x00, 0x60, 0x08, 0xc3, 0xa1, 0x9a } };
23 { 0x3abf6f2d, 0x71c4, 0x462a, { 0x8a, 0x92, 0x1e, 0x68, 0x61, 0xe6, 0xaf, 0x27 } };
25 { 0xf5ceeb23, 0xad90, 0x458c, { 0x97, 0x9a, 0xd5, 0x9b, 0x3a, 0xd6, 0x88, 0x4f } };
27 { 0x09051e1f, 0x0dc9, 0x4e6b, { 0x8b, 0x12, 0x96, 0x0c, 0xbd, 0x81, 0xaa, 0x8f } };
29 { 0x755c630d, 0xc8a0, 0x4765, { 0x94, 0x6f, 0x90, 0xcc, 0x70, 0x38, 0x56, 0xa4 } };
31 { 0xf4563183, 0xd66e, 0x42bd, { 0xbd, 0x53, 0x1a, 0xc7, 0xb0, 0x4c, 0xd5, 0x9d } };
33 { 0x9c8a8a27, 0x15f9, 0x42e3, { 0xa3, 0x56, 0xcd, 0xa6, 0xae, 0x97, 0xa8, 0xc8 } };
35 { 0x09b76d52, 0x0a6d, 0x4e4f, { 0xa9, 0x11, 0xd0, 0x36, 0xd1, 0x92, 0x94, 0x97 } };
36static const GUID XhciGuidDsm =
37 { 0xac340cb7, 0xe901, 0x45bf, { 0xb7, 0xe6, 0x2b, 0x34, 0xec, 0x93, 0x1e, 0x23 } };
38
39/* Recovery action bits */
40#define XHCI_RECOVER_NONE 0x00
41#define XHCI_RECOVER_INTERNAL_RESET 0x01
42#define XHCI_RECOVER_RESET 0x02
43#define XHCI_RECOVER_NO_RESTART 0x04
44#define XHCI_RECOVER_GONE 0x08
45#define XHCI_RECOVER_GONE_PNP 0x10
46#define XHCI_RECOVER_REPORT_FAILED 0x20
47
48/* Recovery reasons reported with a controller reset */
49#define XHCI_REASON_NO_LIVE_DUMP 0x0000
50#define XHCI_REASON_HOST_SYSTEM_ERROR 0x1001
51#define XHCI_REASON_HOST_CONTROLLER_ERROR 0x1002
52#define XHCI_REASON_RESET_FAILED 0x1007
53#define XHCI_REASON_RESTART_FAILED 0x1008
54#define XHCI_REASON_STOP_FAILED 0x100B
55#define XHCI_REASON_NOT_SUPPORTED 0x100C
56#define XHCI_REASON_REMOVED 0x100D
57#define XHCI_REASON_OLD_FIRMWARE 0x100F
58#define XHCI_REASON_START_FAILED 0x101C
59#define XHCI_REASON_TEST_RESET 0x103F
60
61/* Hardware verifier conditions raised here */
62#define XHCI_VERIFY_FIRMWARE_OUTDATED 0x00000001
63#define XHCI_VERIFY_HSE 0x00000002
64#define XHCI_VERIFY_HCE 0x00000004
65#define XHCI_VERIFY_STOP_TIMEOUT 0x00000008
66#define XHCI_VERIFY_RESET_TIMEOUT 0x00000010
67#define XHCI_VERIFY_START_TIMEOUT 0x00000020
68#define XHCI_VERIFY_ALL_ONES 0x00000040
69#define XHCI_VERIFY_SAVE_RESTORE 0x00400000
70
71#define XHCI_WATCHDOG_PERIOD_MS 5000
72#define XHCI_WATCHDOG_TOLERANCE_MS 1000
73#define XHCI_RESET_LIMIT 10
74#define XHCI_RESET_WINDOW_TICKS 60
75#define XHCI_IDLE_TIMEOUT_LONG_MS 5000
76#define XHCI_IDLE_TIMEOUT_SHORT_MS 1
77#define XHCI_PAD_BUFFER_SIZE 512
78#define XHCI_ACPI_PARENT_ID 0x7FFFFFFF
79
80#define XHCI_BUGCHECK_USB3_DRIVER 0x144
81#define XHCI_TEST_RESET_IOCTL 0x00220FB7
82#define XHCI_DEVICE_USED_BY_DEBUGGER 0x02000000
83
84#define XHCI_ACPI_GET_DEVICE_INFORMATION \
85 CTL_CODE(FILE_DEVICE_ACPI, 10, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
86
89{
108
109typedef
113 _In_ PCWSTR Category,
115
117typedef struct _XHCI_FDO_CONTEXT
118{
121
124{
127
129WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(XhciController, XhciGetControllerContext)
131
132static EVT_WDF_DEVICE_PREPARE_HARDWARE XhciEvtDevicePrepareHardware;
133static EVT_WDF_DEVICE_RELEASE_HARDWARE XhciEvtDeviceReleaseHardware;
134static EVT_WDF_DEVICE_D0_ENTRY XhciEvtDeviceD0Entry;
135static EVT_WDF_DEVICE_D0_ENTRY_POST_INTERRUPTS_ENABLED XhciEvtDeviceD0EntryPostInterruptsEnabled;
136static EVT_WDF_DEVICE_D0_EXIT_PRE_INTERRUPTS_DISABLED XhciEvtDeviceD0ExitPreInterruptsDisabled;
137static EVT_WDF_DEVICE_D0_EXIT XhciEvtDeviceD0Exit;
138static EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT XhciEvtDeviceSelfManagedIoInit;
139static EVT_WDF_DEVICE_SELF_MANAGED_IO_CLEANUP XhciEvtDeviceSelfManagedIoCleanup;
140static EVT_WDF_DEVICE_USAGE_NOTIFICATION XhciEvtDeviceUsageNotification;
141static EVT_WDF_DEVICE_ARM_WAKE_FROM_S0 XhciEvtDeviceArmWakeFromS0;
142static EVT_WDF_DEVICE_DISARM_WAKE_FROM_S0 XhciEvtDeviceDisarmWakeFromS0;
143static EVT_WDF_DEVICE_WAKE_FROM_S0_TRIGGERED XhciEvtDeviceWakeFromS0Triggered;
144static EVT_WDF_DEVICE_ARM_WAKE_FROM_SX XhciEvtDeviceArmWakeFromSx;
145static EVT_WDF_DEVICE_DISARM_WAKE_FROM_SX XhciEvtDeviceDisarmWakeFromSx;
146static EVT_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS XhciEvtDeviceFilterRemoveResourceRequirements;
147static EVT_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS XhciEvtDeviceFilterAddResourceRequirements;
148static EVT_WDF_DEVICE_REMOVE_ADDED_RESOURCES XhciEvtDeviceRemoveAddedResources;
149static EVT_WDFDEVICE_WDM_IRP_PREPROCESS XhciEvtPreprocessSetPower;
150static EVT_WDFDEVICE_WDM_IRP_PREPROCESS XhciEvtPreprocessInternalIoctl;
151static EVT_WDF_OBJECT_CONTEXT_CLEANUP XhciEvtFdoCleanup;
152static EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL XhciEvtIoDeviceControl;
153static EVT_WDF_TIMER XhciEvtWatchdog;
154static EVT_WDF_WORKITEM XhciEvtRecoveryWork;
155static EVT_WDF_WORKITEM XhciEvtIdleTimeoutWork;
156static EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY XhciEvtControllerQueryUsbCapability;
157static EVT_UCX_CONTROLLER_GET_CURRENT_FRAMENUMBER XhciEvtControllerGetCurrentFrameNumber;
158static EVT_UCX_CONTROLLER_RESET XhciEvtControllerReset;
159
160static
162NTAPI
164 _In_ UCXCONTROLLER UcxController);
165
166/* Object lookup **************************************************************/
167
169XhciController::FromDevice(
170 _In_ WDFDEVICE Device)
171{
172 return XhciGetFdoContext(Device)->Controller;
173}
174
177 _In_ UCXCONTROLLER UcxController)
178{
179 return XhciGetControllerContext(UcxController);
180}
181
182VOID
184 _In_ XhciErrata Bit)
185{
186 if (Bit != XhciErrata::RegSplit64BitAccess && Bit != XhciErrata::IntPrimaryOnly)
187 DPRINT1("Errata bit %lu set after population\n", static_cast<ULONG>(Bit));
188
189 m_Errata |= XhciErrataBit(Bit);
190}
191
194{
195 if (!m_Registers.IsMapped() || m_Gone)
196 {
197 DPRINT("Controller %p not accessible\n", this);
198 return FALSE;
199 }
200
201 return TRUE;
202}
203
204/* Device identity ************************************************************/
205
206static
208NTAPI
210 _In_ WDFDEVICE Device,
212{
214 PBUS_INTERFACE_STANDARD Bus = &Id->PciInterface;
217 ULONG Value;
218 UCHAR Bytes[3];
219 ULONG Index;
221
222 /* QUIRK: a missing bus number is only reported */
223 Status = WdfDeviceQueryProperty(Device, DevicePropertyBusNumber, sizeof(Id->PciBus), &Id->PciBus, &Length);
224 if (!NT_SUCCESS(Status))
225 DPRINT1("Bus number query failed 0x%lx\n", Status);
226
227 Status = WdfDeviceQueryProperty(Device, DevicePropertyAddress, sizeof(Address), &Address, &Length);
228 if (!NT_SUCCESS(Status))
229 {
230 DPRINT1("Bus address query failed 0x%lx\n", Status);
231 return Status;
232 }
233 Id->PciDevice = Address >> 16;
234 Id->PciFunction = Address & 0xFFFF;
235
236 Status = WdfFdoQueryForInterface(Device, &XhciGuidBusInterfaceStandard, (PINTERFACE)Bus,
237 sizeof(*Bus), 1, NULL);
238 if (!NT_SUCCESS(Status))
239 {
240 DPRINT1("PCI bus interface query failed 0x%lx\n", Status);
241 RtlZeroMemory(Bus, sizeof(*Bus));
242 return Status;
243 }
244
245 if (Bus->GetBusData(Bus->Context, PCI_WHICHSPACE_CONFIG, &Config, 0, sizeof(Config)) != sizeof(Config))
246 {
247 DPRINT1("PCI config space read came back short\n");
248 return STATUS_UNSUCCESSFUL;
249 }
250
251 Id->PciVendorId = Config.VendorID;
252 Id->PciDeviceId = Config.DeviceID;
253 Id->PciRevisionId = Config.RevisionID;
254 Id->PciSubsystemVendorId = Config.u.type0.SubVendorID;
255 Id->PciSubsystemId = Config.u.type0.SubSystemID;
256
257 /* VIA keeps its firmware version in config space */
258 if (Id->PciVendorId == 0x1106 && Id->PciDeviceId == 0x3432)
259 {
260 for (Index = 0; Index < RTL_NUMBER_OF(Bytes); Index++)
261 {
262 if (Bus->GetBusData(Bus->Context, PCI_WHICHSPACE_CONFIG, &Bytes[Index], 0x261 + Index, 1) != 1)
263 {
264 DPRINT1("VIA firmware version read failed\n");
265 return STATUS_SUCCESS;
266 }
267 }
268 Id->FirmwareVersion = ((ULONG)Bytes[2] << 16) | ((ULONG)Bytes[1] << 8) | Bytes[0];
269 }
270 else if (Id->PciVendorId == 0x1106 && (Id->PciDeviceId == 0x3483 || Id->PciDeviceId == 0x9201))
271 {
272 if (Bus->GetBusData(Bus->Context, PCI_WHICHSPACE_CONFIG, &Value, 0x50, sizeof(Value)) == sizeof(Value))
273 Id->FirmwareVersion = Value;
274 else
275 DPRINT1("VIA firmware version read failed\n");
276 }
277
278 return STATUS_SUCCESS;
279}
280
282static
283VOID
284NTAPI
289{
290 ULONG Index;
291
292 /* Clamp the copy to the 5 byte field */
295
297}
298
299static
301NTAPI
303 _In_ WDFDEVICE Device,
305{
309 WDFIOTARGET Target = WdfDeviceGetIoTarget(Device);
310 const CHAR* Strings;
312 ULONG Size;
313 ULONG VendorOffset;
317
318 Id->PciVendorId = XHCI_ACPI_PARENT_ID;
319 Id->PciDeviceId = XHCI_ACPI_PARENT_ID;
320
321 RtlZeroMemory(&Header, sizeof(Header));
323 Status = WdfIoTargetSendIoctlSynchronously(Target, NULL, XHCI_ACPI_GET_DEVICE_INFORMATION,
324 NULL, &Output, NULL, &Returned);
326 {
327 /* QUIRK: a success here leaves the identity empty and is passed on as is */
328 DPRINT1("ACPI device information size query returned 0x%lx\n", Status);
329 return Status;
330 }
331
332 Size = Header.Size;
333 if (Size < sizeof(Header))
334 {
335 DPRINT1("ACPI device information size %lu too small\n", Size);
337 }
338
340 if (Info == NULL)
341 {
342 DPRINT1("No memory for %lu bytes of ACPI device information\n", Size);
344 }
345
347 Status = WdfIoTargetSendIoctlSynchronously(Target, NULL, XHCI_ACPI_GET_DEVICE_INFORMATION,
348 NULL, &Output, NULL, &Returned);
349 if (!NT_SUCCESS(Status))
350 {
351 DPRINT1("ACPI device information query failed 0x%lx\n", Status);
353 return Status;
354 }
355
356 RtlStringCbPrintfA(Id->AcpiRevisionId, sizeof(Id->AcpiRevisionId), "%04X", Info->HardwareRevision);
357
358 Strings = (const CHAR*)Info;
359 VendorOffset = Info->VendorIdStringOffset;
360 DeviceOffset = Info->DeviceIdStringOffset;
361 Length = Info->VendorStringLength;
362 if (VendorOffset > Size || Length > Size - VendorOffset)
363 VendorOffset = 0;
364
365 if (VendorOffset == 0)
366 {
367 RtlStringCbCopyA(Id->AcpiVendorId, sizeof(Id->AcpiVendorId), "UKWN");
368 RtlStringCbCopyA(Id->AcpiDeviceId, sizeof(Id->AcpiDeviceId), "FFFF");
369 }
370 else if (DeviceOffset == 0 || DeviceOffset < VendorOffset || DeviceOffset > VendorOffset + Length)
371 {
372 XhciCopyAcpiId(Id->AcpiVendorId, Strings + VendorOffset, Length);
373 RtlStringCbCopyA(Id->AcpiDeviceId, sizeof(Id->AcpiDeviceId), "FFFF");
374 }
375 else
376 {
377 XhciCopyAcpiId(Id->AcpiVendorId, Strings + VendorOffset, DeviceOffset - VendorOffset);
378 XhciCopyAcpiId(Id->AcpiDeviceId, Strings + DeviceOffset, VendorOffset + Length - DeviceOffset);
379 }
380
382 return STATUS_SUCCESS;
383}
384
385static
387NTAPI
389 _In_ WDFDEVICE Device,
391{
392 WCHAR Enumerator[8];
395
396 RtlZeroMemory(Id, sizeof(*Id));
397 Id->FirmwareVersion = XHCI_FIRMWARE_UNKNOWN;
399
400 Status = IoGetDeviceProperty(WdfDeviceWdmGetPhysicalDevice(Device), DevicePropertyEnumeratorName,
401 sizeof(Enumerator), Enumerator, &Length);
402 if (!NT_SUCCESS(Status))
403 {
404 DPRINT1("Enumerator name query failed 0x%lx, assuming PCI\n", Status);
405 }
406 else if (_wcsicmp(Enumerator, L"ACPI") == 0)
407 {
409 }
410 else if (_wcsicmp(Enumerator, L"URS") == 0)
411 {
412 /* ReactOS has no USB role switch enumerator */
414 DPRINT1("Controllers below the role switch enumerator are not supported\n");
416 }
417
418 if (Id->ParentBus == UcxControllerParentBusTypeAcpi)
420 else
422
423 if (!NT_SUCCESS(Status))
424 DPRINT1("Controller identity unavailable 0x%lx\n", Status);
425
426 return Status;
427}
428
429/* Errata *********************************************************************/
430
431VOID
433 _In_ BOOLEAN AtAddDevice)
434{
435 static const PCWSTR Providers[] = { L"USBXHCI", L"USBXHCI2" };
437 PULONG64 Words[] = { &m_Errata, &m_ErrataWord2 };
438 WCHAR Keys[7][96];
439 ULONG KeyCount;
441 BOOLEAN Any = FALSE;
442 BOOLEAN Pci = (m_Identity.ParentBus != UcxControllerParentBusTypeAcpi);
444 ULONG Index;
445
446 if (Query == NULL)
447 return;
448
449 /* Keys go from the broadest match to the most specific one */
450 RtlStringCchCopyW(Keys[0], RTL_NUMBER_OF(Keys[0]), L"USBXHCI:ALL");
451 if (Pci)
452 {
453 RtlStringCchPrintfW(Keys[1], RTL_NUMBER_OF(Keys[1]), L"USBXHCI:PCI\\VEN_%04X",
454 m_Identity.PciVendorId);
455 RtlStringCchPrintfW(Keys[2], RTL_NUMBER_OF(Keys[2]), L"%s&DEV_%04X",
456 Keys[1], m_Identity.PciDeviceId);
457 RtlStringCchPrintfW(Keys[3], RTL_NUMBER_OF(Keys[3]), L"%s&REV_%02X",
458 Keys[2], m_Identity.PciRevisionId);
459 }
460 else
461 {
462 RtlStringCchPrintfW(Keys[1], RTL_NUMBER_OF(Keys[1]), L"USBXHCI:ACPI\\VEN_%S",
463 m_Identity.AcpiVendorId);
464 RtlStringCchPrintfW(Keys[2], RTL_NUMBER_OF(Keys[2]), L"%s&DEV_%S",
465 Keys[1], m_Identity.AcpiDeviceId);
466 RtlStringCchPrintfW(Keys[3], RTL_NUMBER_OF(Keys[3]), L"%s&REV_%S",
467 Keys[2], m_Identity.AcpiRevisionId);
468 }
469 KeyCount = 4;
470
471 if (m_Identity.FirmwareVersion != XHCI_FIRMWARE_UNKNOWN)
472 {
473 RtlStringCchPrintfW(Keys[KeyCount], RTL_NUMBER_OF(Keys[KeyCount]), L"%s&%I64X",
474 Keys[3], m_Identity.FirmwareVersion);
475 KeyCount++;
476 }
477
478 if (Pci)
479 {
480 RtlStringCchPrintfW(Keys[KeyCount], RTL_NUMBER_OF(Keys[KeyCount]), L"%s&SUBSYS_%04X%04X",
481 Keys[2], m_Identity.PciSubsystemId, m_Identity.PciSubsystemVendorId);
482 RtlStringCchPrintfW(Keys[KeyCount + 1], RTL_NUMBER_OF(Keys[KeyCount + 1]), L"%s&REV_%02X",
483 Keys[KeyCount], m_Identity.PciRevisionId);
484 KeyCount += 2;
485 }
486
487 for (Provider = 0; Provider < RTL_NUMBER_OF(Providers); Provider++)
488 {
489 for (Index = 0; Index < KeyCount; Index++)
490 {
491 Flags = 0;
492 if (!NT_SUCCESS(Query(Keys[Index], Providers[Provider], &Flags)))
493 continue;
494
495 DPRINT("Errata word %lu 0x%I64x from %S\n", Provider + 1, Flags, Keys[Index]);
496 *Words[Provider] |= Flags;
497
498 /* The catch all key does not identify this controller */
499 if (Index != 0)
500 Any = TRUE;
501 }
502 }
503
504 if (!Any)
505 DPRINT("No errata database entry for this controller\n");
506
507 if (HasErrata(XhciErrata::HostRefuseToStart))
508 {
509 /* Skip recovery at AddDevice; that device is about to be deleted */
510 if (!AtAddDevice)
512 }
513 else if (HasErrata(XhciErrata::HostStaleFirmware))
514 {
515 DPRINT1("Controller firmware 0x%I64x is outdated\n", m_Identity.FirmwareVersion);
516 VerifierCheck(XHCI_VERIFY_FIRMWARE_OUTDATED);
518 }
519}
520
521VOID
523{
524 DECLARE_CONST_UNICODE_STRING(ValueName, L"UseStrictBiosHandoff");
525 WDFKEY Keys[2] = { NULL, NULL };
526 ULONG Value;
527 ULONG Index;
529
530 Status = WdfDriverOpenParametersRegistryKey(WdfGetDriver(), KEY_READ, WDF_NO_OBJECT_ATTRIBUTES, &Keys[0]);
531 if (!NT_SUCCESS(Status))
532 {
533 DPRINT1("Driver parameters key open failed 0x%lx\n", Status);
534 Keys[0] = NULL;
535 }
536
538 if (!NT_SUCCESS(Status))
539 {
540 DPRINT1("Device hardware key open failed 0x%lx\n", Status);
541 Keys[1] = NULL;
542 }
543
544 for (Index = 0; Index < RTL_NUMBER_OF(Keys); Index++)
545 {
546 if (Keys[Index] == NULL)
547 continue;
548
549 if (NT_SUCCESS(WdfRegistryQueryULong(Keys[Index], &ValueName, &Value)))
550 {
551 if (Value == 0)
552 m_Errata &= ~XhciErrataBit(XhciErrata::BootStrictBiosRelease);
553 else if (Value == 1)
554 m_Errata |= XhciErrataBit(XhciErrata::BootStrictBiosRelease);
555 }
556
557 WdfRegistryClose(Keys[Index]);
558 }
559}
560
561VOID
563{
566
567 m_InternalFlags = 0;
568
569 if (Vendor == 0x1B73 && Device == 0x1100 && m_Identity.PciRevisionId == 0x10)
571 else if (Vendor == 0x1B73 && Device == 0x1009)
573 else if (Vendor == 0x1B6F && Device == 0x7023)
575 else if (Vendor == 0x1B21 && Device >= 0x1040 && Device <= 0x1042)
577}
578
579VOID
581{
582 m_Errata = XhciErrataBit(XhciErrata::BootTolerateBiosHold);
583 m_ErrataWord2 = 0;
587
588 DPRINT1("Controller %04lx:%04lx rev %02x errata 0x%I64x 0x%I64x internal 0x%I64x\n",
591}
592
593/* Hardware verifier **********************************************************/
594
595VOID
597{
598 WCHAR Ids[3][24];
599 WCHAR Path[160];
600 UNICODE_STRING PathString;
602 PCWSTR Version = (m_Registers.VersionMajor() == 0) ? L"xHCI96" : L"xHCI10";
603 ULONG64 Flags = 0;
605 ULONG Type;
606 WDFKEY Key;
607 ULONG Index;
609
611 {
616 }
617 else
618 {
623 }
624 RtlStringCchCopyW(Ids[2], RTL_NUMBER_OF(Ids[2]), L"global");
625
627 {
629 L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\usb\\HardwareVerifier\\%s\\%s",
630 Ids[Index], Version);
631 RtlInitUnicodeString(&PathString, Path);
632
634 if (!NT_SUCCESS(Status))
635 continue;
636
639 }
640
641 if (!NT_SUCCESS(Status))
642 {
644 DPRINT1("Hardware verifier settings read failed 0x%lx\n", Status);
645 Flags = 0;
646 }
647
649}
650
651VOID
652XhciController::VerifierCheck(
654{
655 DPRINT1("Controller %p hardware verifier condition 0x%lx\n", this, Flag);
656}
657
658/* ACPI methods ***************************************************************/
659
660static
661VOID
662NTAPI
664 _In_ WDFDEVICE Device,
665 _In_reads_bytes_(InputSize) PVOID Input,
666 _In_ ULONG InputSize)
667{
672
673 RtlZeroMemory(&Output, sizeof(Output));
676
677 Status = WdfIoTargetSendIoctlSynchronously(WdfDeviceGetIoTarget(Device), NULL, IOCTL_ACPI_EVAL_METHOD,
679 if (!NT_SUCCESS(Status))
680 DPRINT("ACPI method evaluation failed 0x%lx\n", Status);
681 else if (Output.Signature != ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE)
682 DPRINT("ACPI method returned signature 0x%lx\n", Output.Signature);
683}
684
685VOID
688{
691 ULONG Size;
692 ULONG Index;
693
694 Size = sizeof(ACPI_EVAL_INPUT_BUFFER_COMPLEX) + sizeof(GUID) - sizeof(ULONG) +
695 3 * sizeof(ACPI_METHOD_ARGUMENT);
696
698 if (Input == NULL)
699 {
700 DPRINT1("No memory for the _DSM(%lu) call\n", Function);
701 return;
702 }
703
705 Input->MethodNameAsUlong = 'MSD_';
706 Input->Size = Size;
707 Input->ArgumentCount = 4;
708
709 /* UUID, then the function value, then two reserved zeros */
710 Argument = &Input->Argument[0];
712 for (Index = 0; Index < 3; Index++)
713 {
716 }
717
720}
721
722VOID
724{
726
727 RtlZeroMemory(&Input, sizeof(Input));
729 Input.MethodNameAsUlong = 'IMRP';
730
732}
733
734/* S0 idle and wake ***********************************************************/
735
736VOID
738 _In_ ULONG Milliseconds)
739{
742
744 Settings.UserControlOfIdleSettings = IdleAllowUserControl;
745 Settings.IdleTimeout = Milliseconds;
747
748 Status = WdfDeviceAssignS0IdleSettings(m_Device, &Settings);
749 if (!NT_SUCCESS(Status))
750 {
751 /* QUIRK: a failure downgrades the idle status after the fact */
752 DPRINT("Idle timeout %lu ms refused 0x%lx\n", Milliseconds, Status);
754 return;
755 }
756
757 m_LastIdleTimeout = Milliseconds;
758}
759
760VOID
762{
766
767 if (HasErrata(XhciErrata::PwrStayInD0))
768 {
769 DPRINT1("S0 idle disabled by errata\n");
771 return;
772 }
773
774 if (HasErrata(XhciErrata::AcpiDsmAllowD3Cold))
775 EvaluateDsm(3);
776
777 RtlZeroMemory(&D3Cold, sizeof(D3Cold));
778 Status = WdfFdoQueryForInterface(m_Device, &XhciGuidD3ColdSupport, (PINTERFACE)&D3Cold,
779 sizeof(D3Cold), D3COLD_SUPPORT_INTERFACE_VERSION, NULL);
780 if (!NT_SUCCESS(Status))
781 {
782 DPRINT("No D3cold interface 0x%lx, S0 idle off\n", Status);
784 return;
785 }
786
787 if (D3Cold.GetIdleWakeInfo != NULL)
788 {
790 if (!NT_SUCCESS(Status))
791 {
792 DPRINT1("Idle wake information query failed 0x%lx\n", Status);
794 }
795 }
796
797 if (D3Cold.InterfaceDereference != NULL)
798 D3Cold.InterfaceDereference(D3Cold.Context);
799
801 {
802 DPRINT("Controller cannot wake from a Dx state in S0, S0 idle off\n");
804 return;
805 }
806
809
810 /* ReactOS has no runtime power framework */
811 DPRINT("Power framework registration skipped\n");
812}
813
814VOID
815XhciController::OnRootHubD0Entry()
816{
819}
820
821VOID
823{
825}
826
827VOID
828XhciController::NotifyPortConnectState(
829 _In_ BOOLEAN AnyConnected)
830{
831 /* Only meaningful with a power framework handle, which ReactOS never gives */
832 DPRINT("Port connect state %u not reported, no power framework\n", AnyConnected);
833}
834
835VOID
837 _In_ BOOLEAN Arm)
838{
839 m_WaitWakeQueued = Arm;
840
841 if (!Arm && HasErrata(XhciErrata::PortHoldWakeMaskAwake))
842 return;
843
845}
846
847/* AddDevice ******************************************************************/
848
851{
852 WDF_TIMER_CONFIG TimerConfig;
853 WDF_WORKITEM_CONFIG WorkConfig;
856
859 TimerConfig.AutomaticSerialization = FALSE;
860
861 /* The UCXCONTROLLER is passive; every watchdog step is fine at DISPATCH */
863 Attributes.ParentObject = m_Ucx;
864 Attributes.ExecutionLevel = WdfExecutionLevelDispatch;
865
866 Status = WdfTimerCreate(&TimerConfig, &Attributes, &m_Watchdog);
867 if (!NT_SUCCESS(Status))
868 {
869 DPRINT1("Watchdog timer creation failed 0x%lx\n", Status);
870 return Status;
871 }
872 XhciGetObjectContext(m_Watchdog)->Controller = this;
873
875 WorkConfig.AutomaticSerialization = FALSE;
877 Attributes.ParentObject = m_Ucx;
878
879 Status = WdfWorkItemCreate(&WorkConfig, &Attributes, &m_IdleItem);
880 if (!NT_SUCCESS(Status))
881 {
882 DPRINT1("Idle timeout work item creation failed 0x%lx\n", Status);
883 return Status;
884 }
885 XhciGetObjectContext(m_IdleItem)->Controller = this;
886
888 WorkConfig.AutomaticSerialization = FALSE;
889
890 Status = WdfWorkItemCreate(&WorkConfig, &Attributes, &m_RecoveryItem);
891 if (!NT_SUCCESS(Status))
892 {
893 DPRINT1("Recovery work item creation failed 0x%lx\n", Status);
894 return Status;
895 }
896 XhciGetObjectContext(m_RecoveryItem)->Controller = this;
897
901 return STATUS_SUCCESS;
902}
903
906 _In_ WDFDEVICE Device,
907 _In_ UCXCONTROLLER Ucx,
909{
910 WDF_IO_QUEUE_CONFIG QueueConfig;
913
915 m_WdmDevice = WdfDeviceWdmGetDeviceObject(Device);
916 m_Ucx = Ucx;
923
925 {
929 m_Identity.PciBus = 0;
932 }
933 else
934 {
938 }
939
941 if (!NT_SUCCESS(Status))
942 return Status;
943
945 if (HasErrata(XhciErrata::HostRefuseToStart))
946 {
947 DPRINT1("Controller is marked as not supported\n");
949 }
950
953 Status = WdfIoQueueCreate(m_Device, &QueueConfig, WDF_NO_OBJECT_ATTRIBUTES, WDF_NO_HANDLE);
954 if (!NT_SUCCESS(Status))
955 {
956 DPRINT1("Default queue creation failed 0x%lx\n", Status);
957 return Status;
958 }
959
960 Status = m_Buffers.Create(this);
961 if (!NT_SUCCESS(Status))
962 {
963 DPRINT1("Common buffer creation failed 0x%lx\n", Status);
964 return Status;
965 }
966
968 if (!NT_SUCCESS(Status))
969 {
970 DPRINT1("Interrupter creation failed 0x%lx\n", Status);
971 return Status;
972 }
973
974 Status = m_Slots.Create(this);
975 if (!NT_SUCCESS(Status))
976 {
977 DPRINT1("Device slot table creation failed 0x%lx\n", Status);
978 return Status;
979 }
980
981 Status = m_Commands.Create(this);
982 if (!NT_SUCCESS(Status))
983 {
984 DPRINT1("Command ring creation failed 0x%lx\n", Status);
985 return Status;
986 }
987
988 if (HasErrata(XhciErrata::IntelPchBandwidthCap))
989 DPRINT1("Panther Point command filter not implemented, endpoint limit not enforced\n");
990
991 Status = m_RootHub.Create(this);
992 if (!NT_SUCCESS(Status))
993 {
994 DPRINT1("Root hub creation failed 0x%lx\n", Status);
995 return Status;
996 }
997
998 DPRINT("Controller capability WMI block not provided\n");
999
1001
1003 WakeSettings.Enabled = WdfFalse;
1005 WakeSettings.IndicateChildWakeOnParentWake = TRUE;
1007 Status = WdfDeviceAssignSxWakeSettings(m_Device, &WakeSettings);
1008 if (!NT_SUCCESS(Status))
1009 DPRINT1("Sx wake settings refused 0x%lx\n", Status);
1010
1011 return STATUS_SUCCESS;
1012}
1013
1014static
1016NTAPI
1020 _Out_ WDFDEVICE* Device)
1021{
1022 /* SDDL_DEVOBJ_SYS_ALL_ADM_RWX_WORLD_RW_RES_R: SYSTEM all, Administrators read/write/execute,
1023 * Everyone read/write, restricted code read only */
1024 DECLARE_CONST_UNICODE_STRING(Sddl, L"D:P(A;;GA;;;SY)(A;;GRGWGX;;;BA)(A;;GRGW;;;WD)(A;;GR;;;RC)");
1025 WCHAR Buffer[32];
1027 PNP_BUS_INFORMATION BusInfo;
1030
1031 for (Instance = 0;; Instance++)
1032 {
1033 RtlStringCchPrintfW(Buffer, RTL_NUMBER_OF(Buffer), L"\\Device\\USBFDO-%lu", Instance);
1035
1036 Status = WdfDeviceInitAssignName(DeviceInit, &Name);
1037 if (!NT_SUCCESS(Status))
1038 {
1039 DPRINT1("Assigning the FDO name failed 0x%lx\n", Status);
1040 return Status;
1041 }
1042
1043 Status = WdfDeviceInitAssignSDDLString(DeviceInit, &Sddl);
1044 if (!NT_SUCCESS(Status))
1045 {
1046 DPRINT1("Assigning the FDO security failed 0x%lx\n", Status);
1047 return Status;
1048 }
1049
1050 Status = WdfDeviceCreate(&DeviceInit, Attributes, Device);
1052 {
1053 DPRINT1("FDO name %wZ taken, trying the next one\n", &Name);
1054 continue;
1055 }
1056
1057 if (!NT_SUCCESS(Status))
1058 {
1059 DPRINT1("WdfDeviceCreate failed 0x%lx\n", Status);
1060 return Status;
1061 }
1062
1063 break;
1064 }
1065
1070
1071 /* User mode tools open \\.\HCDn */
1072 RtlStringCchPrintfW(Buffer, RTL_NUMBER_OF(Buffer), L"\\DosDevices\\HCD%lu", Instance);
1074 Status = WdfDeviceCreateSymbolicLink(*Device, &Name);
1075 if (!NT_SUCCESS(Status))
1076 {
1077 DPRINT1("Symbolic link %wZ failed 0x%lx\n", &Name, Status);
1078 return Status;
1079 }
1080
1082 BusInfo.LegacyBusType = PNPBus;
1083 BusInfo.BusNumber = 0;
1084 WdfDeviceSetBusInformationForChildren(*Device, &BusInfo);
1085
1086 /* QUIRK: UCX registers this interface again */
1087 Status = WdfDeviceCreateDeviceInterface(*Device, &XhciGuidHostControllerInterface, NULL);
1088 if (!NT_SUCCESS(Status))
1089 DPRINT1("Host controller interface registration failed 0x%lx\n", Status);
1090
1091 return Status;
1092}
1093
1095NTAPI
1097 _In_ WDFDRIVER Driver,
1099{
1102 WDF_FDO_EVENT_CALLBACKS FdoCallbacks;
1107 UCXCONTROLLER Ucx;
1108 WDFDEVICE Device;
1109 UCHAR SetPower = IRP_MN_SET_POWER;
1111
1113 PAGED_CODE();
1114
1115 Status = UcxInitializeDeviceInit(DeviceInit);
1116 if (!NT_SUCCESS(Status))
1117 {
1118 DPRINT1("UcxInitializeDeviceInit failed 0x%lx\n", Status);
1119 return Status;
1120 }
1121
1122 /* Requests UCX forwards into the transfer queues are built by this device, so they get this context */
1124 WdfDeviceInitSetRequestAttributes(DeviceInit, &Attributes);
1125
1136 WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &PnpPower);
1137
1144 WdfDeviceInitSetPowerPolicyEventCallbacks(DeviceInit, &PowerPolicy);
1145
1146 WDF_FDO_EVENT_CALLBACKS_INIT(&FdoCallbacks);
1150 WdfFdoInitSetEventCallbacks(DeviceInit, &FdoCallbacks);
1151
1152 WdfDeviceInitSetReleaseHardwareOrderOnFailure(DeviceInit, WdfReleaseHardwareOrderOnFailureAfterDescendants);
1153
1154 Status = WdfDeviceInitAssignWdmIrpPreprocessCallback(DeviceInit, XhciEvtPreprocessSetPower,
1155 IRP_MJ_POWER, &SetPower, 1);
1156 if (!NT_SUCCESS(Status))
1157 {
1158 DPRINT1("Power IRP preprocess registration failed 0x%lx\n", Status);
1159 return Status;
1160 }
1161
1162 if (XhciDriver.TestMode)
1163 {
1164 Status = WdfDeviceInitAssignWdmIrpPreprocessCallback(DeviceInit, XhciEvtPreprocessInternalIoctl,
1166 if (!NT_SUCCESS(Status))
1167 {
1168 DPRINT1("Internal IOCTL preprocess registration failed 0x%lx\n", Status);
1169 return Status;
1170 }
1171 }
1172
1174 Attributes.EvtCleanupCallback = XhciEvtFdoCleanup;
1175
1177 if (!NT_SUCCESS(Status))
1178 return Status;
1179
1181 if (!NT_SUCCESS(Status))
1182 goto Fail;
1183
1185 Config.EvtControllerUsbDeviceAdd = XhciEvtControllerUsbDeviceAdd;
1186 Config.EvtControllerGetCurrentFrameNumber = XhciEvtControllerGetCurrentFrameNumber;
1187 Config.EvtControllerReset = XhciEvtControllerReset;
1188 Config.EvtControllerQueryUsbCapability = XhciEvtControllerQueryUsbCapability;
1190
1192 {
1193 UCX_CONTROLLER_CONFIG_SET_ACPI_INFO(&Config, Identity.AcpiVendorId, Identity.AcpiDeviceId,
1194 Identity.AcpiRevisionId);
1195 }
1196 else
1197 {
1199 Identity.PciRevisionId, Identity.PciBus,
1200 Identity.PciDevice, Identity.PciFunction);
1201 }
1202
1204 Status = UcxControllerCreate(Device, &Config, &Attributes, &Ucx);
1205 if (!NT_SUCCESS(Status))
1206 {
1207 DPRINT1("UcxControllerCreate failed 0x%lx\n", Status);
1208 goto Fail;
1209 }
1210
1211 Controller = new (XhciGetControllerContext(Ucx)) XhciController();
1212
1213 /* From here the FDO cleanup owns the PCI interface reference */
1214 XhciGetFdoContext(Device)->Controller = Controller;
1215
1216 Status = Controller->Initialize(Device, Ucx, &Identity);
1217 if (!NT_SUCCESS(Status))
1218 DPRINT1("Controller setup failed 0x%lx\n", Status);
1219
1220 return Status;
1221
1222Fail:
1223 if (Identity.PciInterface.InterfaceDereference != NULL)
1224 Identity.PciInterface.InterfaceDereference(Identity.PciInterface.Context);
1225 return Status;
1226}
1227
1228VOID
1230{
1232
1233 if (Bus->InterfaceDereference != NULL)
1234 Bus->InterfaceDereference(Bus->Context);
1235
1236 RtlZeroMemory(Bus, sizeof(*Bus));
1237}
1238
1239static
1240VOID
1241NTAPI
1244{
1245 XhciController* Controller = XhciGetFdoContext((WDFDEVICE)Object)->Controller;
1246
1247 if (Controller != NULL)
1249}
1250
1251/* PrepareHardware and ReleaseHardware ****************************************/
1252
1255 _In_ WDFCMRESLIST Raw,
1256 _In_ WDFCMRESLIST Translated)
1257{
1259
1260 Status = m_Registers.Prepare(this, Translated);
1261 if (!NT_SUCCESS(Status))
1262 {
1263 DPRINT1("Register prepare failed 0x%lx\n", Status);
1264 goto Fail;
1265 }
1266
1268 if (!NT_SUCCESS(Status))
1269 {
1270 DPRINT1("Common buffer prepare failed 0x%lx\n", Status);
1271 goto Fail;
1272 }
1273
1274 Status = m_Interrupters.Prepare(Raw, Translated);
1275 if (!NT_SUCCESS(Status))
1276 {
1277 DPRINT1("Interrupter prepare failed 0x%lx\n", Status);
1278 goto Fail;
1279 }
1280
1282 if (!NT_SUCCESS(Status))
1283 {
1284 DPRINT1("Device slot prepare failed 0x%lx\n", Status);
1285 goto Fail;
1286 }
1287
1289 if (!NT_SUCCESS(Status))
1290 {
1291 DPRINT1("Command ring prepare failed 0x%lx\n", Status);
1292 goto Fail;
1293 }
1294
1296 if (!NT_SUCCESS(Status))
1297 {
1298 DPRINT1("Root hub prepare failed 0x%lx\n", Status);
1299 goto Fail;
1300 }
1301
1302 return STATUS_SUCCESS;
1303
1304Fail:
1305 /* Keeps PnP from restarting a controller that cannot start */
1306 DPRINT1("Controller %p failed to prepare hardware 0x%lx\n", this, Status);
1308 return Status;
1309}
1310
1311VOID
1313{
1314 /* D0 exit did not run when D0 entry failed */
1315 WdfWorkItemFlush(m_RecoveryItem);
1316 WdfWorkItemFlush(m_IdleItem);
1317
1320 m_Slots.Release();
1324}
1325
1326/* D0 entry *******************************************************************/
1327
1330 _In_ BOOLEAN Restore)
1331{
1333
1334 if (Restore)
1335 {
1338 }
1339
1340 Status = m_Interrupters.D0Entry(Restore);
1341 if (!NT_SUCCESS(Status))
1342 {
1343 DPRINT1("Interrupter D0 entry failed 0x%lx\n", Status);
1344 return Status;
1345 }
1346
1347 m_Slots.D0Entry();
1348
1350 if (!NT_SUCCESS(Status))
1351 DPRINT1("Command ring D0 entry failed 0x%lx\n", Status);
1352
1353 return Status;
1354}
1355
1359{
1362 BOOLEAN WasReset = FALSE;
1363 BOOLEAN AllOnes = FALSE;
1364 BOOLEAN Restore;
1366
1368 {
1369 DPRINT1("Controller registers read all ones at D0 entry\n");
1370 AllOnes = TRUE;
1372 goto Exit;
1373 }
1374
1375 if (FromHibernate)
1376 {
1377 /* Without a crash dump stack the firmware owned the controller during resume */
1379 if (!NT_SUCCESS(Status))
1380 {
1381 DPRINT1("BIOS handoff on hibernate resume failed 0x%lx\n", Status);
1382 goto Exit;
1383 }
1384
1386
1388 if (!NT_SUCCESS(Status))
1389 {
1390 DPRINT1("Reset on hibernate resume failed 0x%lx\n", Status);
1391 goto Exit;
1392 }
1393 WasReset = TRUE;
1394 }
1395
1398
1399 if (HasErrata(XhciErrata::AcpiDsmHsicSuspendDetach))
1400 EvaluateDsm(5);
1401
1402 Restore = !HasErrata(XhciErrata::PwrSkipSaveRestore) &&
1403 !m_SaveFailed &&
1405 !FromHibernate;
1406
1407 Status = RunD0Pass(Restore);
1408 if (!NT_SUCCESS(Status))
1409 goto Exit;
1410
1411 if (PreviousState != WdfPowerDeviceD3Final && !FromHibernate)
1412 {
1413 if (Restore)
1414 {
1416 if (!NT_SUCCESS(Status))
1417 {
1418 DPRINT1("Controller state restore failed 0x%lx\n", Status);
1420 VerifierCheck(XHCI_VERIFY_SAVE_RESTORE);
1421 }
1422 }
1423
1424 if (!Restore || !NT_SUCCESS(Status))
1425 {
1427
1429 if (!NT_SUCCESS(Status))
1430 {
1431 DPRINT1("Controller reset at D0 entry failed 0x%lx\n", Status);
1432 goto Exit;
1433 }
1434 WasReset = TRUE;
1435
1437 if (!NT_SUCCESS(Status))
1438 goto Exit;
1439 }
1440 }
1441
1445
1446 if (WasReset)
1447 {
1449 UcxControllerResetComplete(m_Ucx, &ResetInfo);
1450 }
1451
1453
1454Exit:
1455 if (NT_SUCCESS(Status))
1456 {
1458 {
1460
1463 }
1464
1465 return STATUS_SUCCESS;
1466 }
1467
1469 if (AllOnes)
1470 {
1471 SetGone(TRUE);
1472 }
1473 else
1474 {
1476 SetGone(FALSE);
1477 }
1478
1479 return Status;
1480}
1481
1484{
1486
1488 if (!NT_SUCCESS(Status))
1489 return Status;
1490
1492 return STATUS_SUCCESS;
1493}
1494
1495static
1496VOID
1497NTAPI
1500{
1502}
1503
1505static
1506BOOLEAN
1507NTAPI
1510 _In_ ULONG Type,
1512{
1515
1516 RtlZeroMemory(&Command, sizeof(Command));
1517 Command.Trb.Dword[3] = Type << XHCI_TRB_TYPE_SHIFT;
1519 Command.Context = Controller;
1520 Command.Internal = TRUE;
1521
1522 Status = Controller->m_Commands.SubmitAndWait(&Command);
1524 {
1525 DPRINT1("Firmware version command %lu failed, status 0x%lx code %lu\n",
1526 Type, Status, static_cast<ULONG>(Command.Code));
1527 *Parameter = 0;
1528 return FALSE;
1529 }
1530
1531 *Parameter = Command.Completion.Dword[2] & 0x00FFFFFF;
1532 return TRUE;
1533}
1534
1535VOID
1537{
1539 BOOLEAN Renesas = Pci && (m_Identity.PciVendorId == 0x1033 || m_Identity.PciVendorId == 0x1912);
1540 BOOLEAN Asmedia = Pci && m_Identity.PciVendorId == 0x1B21;
1541 BOOLEAN Nvidia;
1544
1545 Nvidia = !Pci && _strnicmp(m_Identity.AcpiVendorId, "NVDA", 4) == 0;
1546 if (!Renesas && !Asmedia && !Nvidia)
1547 return;
1548
1550
1551 if (Asmedia)
1552 {
1553 if (!XhciSendFirmwareCommand(this, static_cast<ULONG>(XhciTrbType::VendorFirmwareVersionAltSetup), &Parameter))
1554 return;
1555
1557 if (!XhciSendFirmwareCommand(this, static_cast<ULONG>(XhciTrbType::VendorFirmwareVersionAlt), &Parameter))
1558 return;
1559
1561 }
1562 else
1563 {
1564 if (!XhciSendFirmwareCommand(this, static_cast<ULONG>(XhciTrbType::VendorFirmwareVersion), &Parameter))
1565 return;
1566
1568 }
1569
1570 DPRINT1("Controller firmware version 0x%I64x\n", m_Identity.FirmwareVersion);
1571}
1572
1576{
1578
1580 if (!NT_SUCCESS(Status))
1581 {
1582 DPRINT1("Controller start failed 0x%lx\n", Status);
1583 return Status;
1584 }
1585
1588
1591
1592 if (HasErrata(XhciErrata::HostRefuseToStart))
1593 {
1594 DPRINT1("Controller is marked as not supported\n");
1595 return STATUS_NOT_SUPPORTED;
1596 }
1597
1598 return STATUS_SUCCESS;
1599}
1600
1601/* D0 exit ********************************************************************/
1602
1603VOID
1605{
1606 if (HasErrata(XhciErrata::AcpiNotifyBeforeIntOff))
1607 EvaluatePrmi();
1608
1610}
1611
1612VOID
1615{
1616 POWER_ACTION Action = WdfDeviceGetSystemPowerAction(m_Device);
1617 BOOLEAN Save;
1619
1621
1622 m_Buffers.D0Exit();
1623 m_RootHub.D0Exit();
1624
1625 WdfTimerStop(m_Watchdog, TRUE);
1627 if (!NT_SUCCESS(Status))
1628 DPRINT1("Controller stop at D0 exit failed 0x%lx\n", Status);
1629
1631
1632 Save = !HasErrata(XhciErrata::PwrSkipSaveRestore) &&
1633 !m_SaveFailed &&
1636 if (Save)
1637 {
1639 if (!NT_SUCCESS(Status))
1640 {
1641 /* QUIRK: one failure turns save and restore off for good */
1642 DPRINT("Controller state save failed 0x%lx\n", Status);
1644 VerifierCheck(XHCI_VERIFY_SAVE_RESTORE);
1645 }
1646
1649
1650 if (HasErrata(XhciErrata::AcpiDsmHsicSuspendDetach))
1651 EvaluateDsm(6);
1652 }
1653
1654 if (HasErrata(XhciErrata::PwrResetBeforeShutdown) && Action == PowerActionShutdownReset)
1655 {
1657 if (!NT_SUCCESS(Status))
1658 DPRINT("Reset before restart failed 0x%lx\n", Status);
1659 }
1660
1661 WdfWorkItemFlush(m_RecoveryItem);
1662 WdfWorkItemFlush(m_IdleItem);
1663}
1664
1665/* Self managed I/O and usage *************************************************/
1666
1667VOID
1669{
1670 PDEVICE_OBJECT Pdo = WdfDeviceWdmGetPhysicalDevice(m_Device);
1671
1672 if (Pdo->Flags & XHCI_DEVICE_USED_BY_DEBUGGER)
1673 DPRINT1("Controller shared with the kernel debugger; low power epoch tracking unavailable\n");
1674
1675 DPRINT("Friendly name not set\n");
1676
1679
1680 if (HasErrata(XhciErrata::XferPacketAlignChunks) && m_SplitPadBuffer == NULL)
1681 {
1683 if (m_SplitPadBuffer == NULL)
1684 DPRINT1("No split transfer pad buffer, transfers run without it\n");
1685 }
1686}
1687
1688VOID
1690{
1691 DECLARE_CONST_UNICODE_STRING(RestoreName, L"HCRestoreStateFailureCount");
1692 DECLARE_CONST_UNICODE_STRING(RecoveryName, L"HCRecoveryCount");
1693 PCUNICODE_STRING Names[2] = { &RestoreName, &RecoveryName };
1695 WDFKEY Key;
1696 ULONG Value;
1697 ULONG Index;
1699
1702 if (!NT_SUCCESS(Status))
1703 {
1704 DPRINT1("Device key open for the recovery counters failed 0x%lx\n", Status);
1705 return;
1706 }
1707
1708 for (Index = 0; Index < RTL_NUMBER_OF(Names); Index++)
1709 {
1710 if (!NT_SUCCESS(WdfRegistryQueryULong(Key, Names[Index], &Value)))
1711 Value = 0;
1712
1713 Status = WdfRegistryAssignULong(Key, Names[Index], Value + Counts[Index]);
1714 if (!NT_SUCCESS(Status))
1715 DPRINT1("Writing %wZ failed 0x%lx\n", Names[Index], Status);
1716 }
1717
1719}
1720
1721VOID
1723{
1724 if (m_SplitPadBuffer != NULL)
1725 {
1728 }
1729
1731}
1732
1733VOID
1736 _In_ BOOLEAN InPath)
1737{
1738 /* No pageable code in this driver, so there is nothing to lock down */
1739 if (InPath)
1740 m_SpecialFiles |= 1UL << Type;
1741 else
1742 m_SpecialFiles &= ~(1UL << Type);
1743}
1744
1745VOID
1748{
1749 SYSTEM_POWER_STATE_CONTEXT Context = Stack->Parameters.Power.SystemPowerStateContext;
1750
1751 switch (Stack->Parameters.Power.State.SystemState)
1752 {
1753 case PowerSystemWorking:
1754 m_SystemAction = (Context.CurrentSystemState == PowerSystemHibernate) ?
1756 break;
1757
1761 m_SystemAction = (Context.EffectiveSystemState == PowerSystemHibernate) ?
1763 break;
1764
1767 break;
1768
1770 m_SystemAction = (Context.EffectiveSystemState == PowerSystemHibernate) ?
1772 break;
1773
1774 default:
1775 DPRINT1("Unexpected system power state %d\n", Stack->Parameters.Power.State.SystemState);
1776 break;
1777 }
1778}
1779
1780/* Frame number ***************************************************************/
1781
1782ULONG64
1784{
1786
1788 return (ULONG64)Ticks.QuadPart * m_TimeIncrement / 10000;
1789}
1790
1791/* Snapshot layout: bits 20:0 are frame bits 31:11, bits 63:21 the time in ms of frame xxx000 */
1792static
1793LONG64
1794NTAPI
1796 _In_ ULONG Frame,
1798{
1799 ULONG64 Base = Now - (Frame & 0x7FF);
1800
1801 return (LONG64)((Base << 21) | ((Frame >> 11) & 0x1FFFFF));
1802}
1803
1804VOID
1806{
1809}
1810
1811ULONG
1812XhciController::GetFrameNumber(
1814{
1815 ULONG64 Now = NowMs();
1818 ULONG Estimate;
1819 ULONG Result;
1820 ULONG Low;
1821
1823 return 0;
1824
1825 Estimate = (ULONG)((Snapshot & 0x1FFFFF) << 11) + (ULONG)(Now - (Snapshot >> 21));
1826
1827 /* MFINDEX is meaningless outside D0, so run on the clock and leave the snapshot alone */
1829 return Estimate;
1830
1832 Result = (Estimate & ~0x7FFUL) | Hardware;
1833 Low = Estimate & 0x7FF;
1834
1835 /* The estimate decides the high bits; correct when it sits across a wrap */
1836 if (Low < Hardware && Hardware - Low > 0x400)
1837 Result -= 0x800;
1838 else if (Low >= Hardware && Low - Hardware > 0x400)
1839 Result += 0x800;
1840
1842 return Result;
1843}
1844
1845/* Watchdog *******************************************************************/
1846
1847VOID
1849{
1850 ULONG Usbsts;
1851
1852 if (!IsAccessible())
1853 return;
1854
1856 if (Usbsts == MAXULONG)
1857 {
1858 DPRINT1("Watchdog read all ones, controller gone\n");
1859 SetGone(TRUE);
1860 return;
1861 }
1862
1863 /* QUIRK: neither error is cleared here, so each tick reports it again */
1864 if (Usbsts & XHCI_USBSTS_HSE)
1865 {
1866 DPRINT1("Host System Error, USBSTS 0x%08lx\n", Usbsts);
1867 VerifierCheck(XHCI_VERIFY_HSE);
1869 return;
1870 }
1871
1872 if (Usbsts & XHCI_USBSTS_HCE)
1873 {
1874 DPRINT1("Host Controller Error, USBSTS 0x%08lx\n", Usbsts);
1875 VerifierCheck(XHCI_VERIFY_HCE);
1877 return;
1878 }
1879
1881 {
1884 }
1885
1887}
1888
1889/* Recovery *******************************************************************/
1890
1891VOID
1892XhciController::RaiseControllerFault(
1895{
1896 ULONG Actions;
1897
1898 switch (Action)
1899 {
1900 case XhciRecovery::Ignore:
1901 Actions = 0;
1902 break;
1903 case XhciRecovery::ResetHost:
1904 Actions = XHCI_RECOVER_RESET;
1905 break;
1906 case XhciRecovery::InternalReset:
1908 break;
1909 case XhciRecovery::Gone:
1910 DPRINT1("Controller gone, reason 0x%lx\n", Reason);
1911 SetGone(TRUE);
1912 return;
1913 case XhciRecovery::Disable:
1914 case XhciRecovery::HoldStopped:
1915 default:
1916 Actions = XHCI_RECOVER_NO_RESTART;
1917 break;
1918 }
1919
1920 QueueRecovery(Actions, Reason);
1921}
1922
1923VOID
1925{
1926 SetGone(TRUE);
1927}
1928
1929VOID
1930XhciController::SetGone(
1931 _In_ BOOLEAN ReportToPnp)
1932{
1933 if (ReportToPnp && !m_Gone)
1934 {
1935 DPRINT1("Controller %p registers read all ones, marking it gone\n", this);
1936 VerifierCheck(XHCI_VERIFY_ALL_ONES);
1937 }
1938
1939 m_Gone = TRUE;
1940
1941 if (ReportToPnp)
1943 else
1944 QueueRecovery(XHCI_RECOVER_GONE, XHCI_REASON_REMOVED);
1945}
1946
1947VOID
1948XhciController::QueueRecovery(
1949 _In_ ULONG Actions,
1951{
1952 KIRQL Irql;
1953
1954 if (m_SpecialFiles & ((1UL << WdfSpecialFilePaging) | (1UL << WdfSpecialFileBoot)))
1955 {
1956 BootRecovery(Actions);
1957 return;
1958 }
1959
1960 if (Reason != 0)
1961 DPRINT1("Controller %p recovery 0x%lx requested, reason 0x%lx\n", this, Actions, Reason);
1962
1964 m_RecoveryActions |= Actions;
1966
1968}
1969
1970VOID
1972 _In_ ULONG Actions)
1973{
1974 static LONG InlineResets;
1975
1976 /* The branches are exclusive even when several bits are set */
1978 {
1979 KeBugCheckEx(XHCI_BUGCHECK_USB3_DRIVER, 2, (ULONG_PTR)WdfDeviceWdmGetPhysicalDevice(m_Device), 3, 0);
1980 }
1981 else if (Actions & XHCI_RECOVER_INTERNAL_RESET)
1982 {
1984 {
1985 UcxControllerNeedsReset(m_Ucx);
1986 return;
1987 }
1988
1989 /* QUIRK: one counter shared by every controller */
1990 if (InterlockedIncrement(&InlineResets) != 1)
1991 DPRINT1("Boot path internal resets overlap\n");
1992 InternalReset();
1993 InterlockedDecrement(&InlineResets);
1994 }
1995 else if (Actions & XHCI_RECOVER_RESET)
1996 {
1997 UcxControllerNeedsReset(m_Ucx);
1998 }
1999 else
2000 {
2001 DPRINT1("Boot path recovery 0x%lx has no handler\n", Actions);
2002 }
2003}
2004
2005VOID
2006XhciController::DisableController()
2007{
2009 USHORT Command = 0;
2010
2011 SetGone(FALSE);
2012
2013 /* Turns off bus mastering and MMIO decode */
2015 Bus->SetBusData(Bus->Context, PCI_WHICHSPACE_CONFIG, &Command, 4, sizeof(Command));
2016 else
2017 DPRINT1("Controller is not on PCI, cannot disable it\n");
2018
2020 KeFlushQueuedDpcs();
2021}
2022
2023VOID
2025 _In_ ULONG Actions)
2026{
2028
2030 {
2031 DPRINT1("Controller reset %ld times in 5 minutes, giving up\n", m_ResetCount);
2032 Actions |= XHCI_RECOVER_NO_RESTART;
2033 }
2034
2035 while (Actions != 0)
2036 {
2037 if (Actions & (XHCI_RECOVER_GONE | XHCI_RECOVER_GONE_PNP))
2038 {
2039 if (!m_GoneHandled)
2040 {
2043 KeFlushQueuedDpcs();
2047 KeFlushQueuedDpcs();
2048 UcxControllerSetFailed(m_Ucx);
2049
2050 if (Actions & XHCI_RECOVER_GONE)
2051 WdfDeviceSetFailed(m_Device, WdfDeviceFailedNoRestart);
2052 }
2053
2054 if ((Actions & XHCI_RECOVER_GONE_PNP) && !m_PnpToldRemoved)
2055 {
2057 State.Removed = WdfTrue;
2058 WdfDeviceSetDeviceState(m_Device, &State);
2060 }
2061
2064 }
2065 else if (Actions & XHCI_RECOVER_NO_RESTART)
2066 {
2067 DisableController();
2068 WdfDeviceSetFailed(m_Device, WdfDeviceFailedNoRestart);
2070 }
2071 else if (Actions & XHCI_RECOVER_INTERNAL_RESET)
2072 {
2073 InternalReset();
2074 Actions &= ~XHCI_RECOVER_INTERNAL_RESET;
2075 }
2076 else if (Actions & XHCI_RECOVER_RESET)
2077 {
2078 UcxControllerNeedsReset(m_Ucx);
2079 Actions &= ~XHCI_RECOVER_RESET;
2080 }
2081 else if (Actions & XHCI_RECOVER_REPORT_FAILED)
2082 {
2083 WdfDeviceSetFailed(m_Device, WdfDeviceFailedNoRestart);
2084 Actions &= ~XHCI_RECOVER_REPORT_FAILED;
2085 }
2086 else
2087 {
2088 DPRINT1("Recovery actions 0x%lx not understood\n", Actions);
2089 break;
2090 }
2091 }
2092}
2093
2094VOID
2096{
2097 ULONG Actions;
2098 KIRQL Irql;
2099
2101
2103 Actions = m_RecoveryActions;
2106
2107 RunRecovery(Actions);
2108
2110}
2111
2112VOID
2114{
2115 NTSTATUS StopStatus;
2116 NTSTATUS ResetStatus = STATUS_SUCCESS;
2118
2119 /* QUIRK: overlap is only reported */
2121 DPRINT1("Controller %p internal reset entered twice\n", this);
2122
2125
2126 WdfTimerStop(m_Watchdog, TRUE);
2128 m_Slots.PreReset();
2129
2130 KeFlushQueuedDpcs();
2131 StopStatus = m_Registers.Stop();
2132 KeFlushQueuedDpcs();
2133
2134 if (!NT_SUCCESS(StopStatus))
2135 {
2136 DPRINT1("Stop before internal reset failed 0x%lx\n", StopStatus);
2137 DisableController();
2138 }
2139 else
2140 {
2141 ResetStatus = m_Registers.ResetController(TRUE);
2142 }
2143
2146 m_Slots.PostReset();
2148
2149 if (!NT_SUCCESS(StopStatus))
2150 {
2151 VerifierCheck(XHCI_VERIFY_STOP_TIMEOUT);
2153 Status = StopStatus;
2154 }
2155 else
2156 {
2158
2159 if (!NT_SUCCESS(ResetStatus))
2160 {
2161 DPRINT1("Internal reset failed 0x%lx\n", ResetStatus);
2162 VerifierCheck(XHCI_VERIFY_RESET_TIMEOUT);
2164 Status = ResetStatus;
2165 }
2166 else
2167 {
2169 if (!NT_SUCCESS(Status))
2170 {
2171 DPRINT1("Start after internal reset failed 0x%lx\n", Status);
2172 VerifierCheck(XHCI_VERIFY_START_TIMEOUT);
2174 }
2175 }
2176 }
2177
2178 if (NT_SUCCESS(Status))
2179 {
2181 }
2182 else
2183 {
2184 DPRINT1("Controller %p internal reset ended with 0x%lx\n", this, Status);
2186 UcxControllerSetFailed(m_Ucx);
2187 }
2188
2190}
2191
2192VOID
2194{
2196
2197 if (IsAccessible())
2198 InternalReset();
2199 else
2200 DPRINT1("UCX reset of an inaccessible controller skipped\n");
2201
2202 /* QUIRK: reported even after a failed reset; SetFailed already told UCX */
2204 UcxControllerResetComplete(m_Ucx, &Info);
2205}
2206
2207/* UCX capability query *******************************************************/
2208
2211 _In_ const GUID* Capability,
2215{
2216 ULONG Hcc2;
2217
2218 *ResultLength = 0;
2219
2220 if (IsEqualGUID(*Capability, XhciGuidChainedMdls))
2221 return HasErrata(XhciErrata::XferFlattenMdlChain) ? STATUS_NOT_SUPPORTED : STATUS_SUCCESS;
2222
2223 if (IsEqualGUID(*Capability, XhciGuidStaticStreams))
2224 {
2225 *ResultLength = sizeof(USHORT);
2226 if (OutputBufferLength < sizeof(USHORT))
2227 {
2228 DPRINT1("Stream capability buffer of %lu bytes too small\n", OutputBufferLength);
2230 }
2231 if (OutputBuffer == NULL)
2232 {
2233 DPRINT1("Stream capability buffer missing\n");
2235 }
2236
2238 return STATUS_SUCCESS;
2239 }
2240
2241 if (IsEqualGUID(*Capability, XhciGuidFunctionSuspend) ||
2243 {
2244 return STATUS_SUCCESS;
2245 }
2246
2248 return HasErrata(XhciErrata::XferFlushTtOnAbort) ? STATUS_SUCCESS : STATUS_NOT_SUPPORTED;
2249
2250 if (IsEqualGUID(*Capability, XhciGuidHighBandwidthIsoch))
2251 {
2252 *ResultLength = sizeof(ULONG);
2253 if (OutputBufferLength < sizeof(ULONG))
2254 {
2255 DPRINT1("Isoch capability buffer of %lu bytes too small\n", OutputBufferLength);
2257 }
2258 if (OutputBuffer == NULL)
2259 {
2260 DPRINT1("Isoch capability buffer missing\n");
2262 }
2263
2264 Hcc2 = m_Registers.Hccparams2();
2265 if (!(Hcc2 & XHCI_HCC2_LEC))
2266 return STATUS_NOT_SUPPORTED;
2267
2268 *(PULONG)OutputBuffer = (Hcc2 & XHCI_HCC2_ETC) ? 32 : 4;
2269 return STATUS_SUCCESS;
2270 }
2271
2273}
2274
2275/* KMDF callbacks *************************************************************/
2276
2277static
2279NTAPI
2281 _In_ WDFDEVICE Device,
2282 _In_ WDFCMRESLIST ResourcesRaw,
2283 _In_ WDFCMRESLIST ResourcesTranslated)
2284{
2286}
2287
2288static
2290NTAPI
2292 _In_ WDFDEVICE Device,
2293 _In_ WDFCMRESLIST ResourcesTranslated)
2294{
2296
2298 return STATUS_SUCCESS;
2299}
2300
2301static
2303NTAPI
2305 _In_ WDFDEVICE Device,
2307{
2309}
2310
2311static
2313NTAPI
2315 _In_ WDFDEVICE Device,
2317{
2319}
2320
2321static
2323NTAPI
2325 _In_ WDFDEVICE Device,
2327{
2329
2331 return STATUS_SUCCESS;
2332}
2333
2334static
2336NTAPI
2338 _In_ WDFDEVICE Device,
2340{
2342 return STATUS_SUCCESS;
2343}
2344
2345static
2347NTAPI
2349 _In_ WDFDEVICE Device)
2350{
2352 return STATUS_SUCCESS;
2353}
2354
2355static
2356VOID
2357NTAPI
2359 _In_ WDFDEVICE Device)
2360{
2362}
2363
2364static
2365VOID
2366NTAPI
2368 _In_ WDFDEVICE Device,
2371{
2373}
2374
2375static
2377NTAPI
2379 _In_ WDFDEVICE Device)
2380{
2382 return STATUS_SUCCESS;
2383}
2384
2385static
2386VOID
2387NTAPI
2389 _In_ WDFDEVICE Device)
2390{
2392}
2393
2394static
2395VOID
2396NTAPI
2398 _In_ WDFDEVICE Device)
2399{
2401}
2402
2403static
2405NTAPI
2407 _In_ WDFDEVICE Device)
2408{
2410 return STATUS_SUCCESS;
2411}
2412
2413static
2414VOID
2415NTAPI
2417 _In_ WDFDEVICE Device)
2418{
2420}
2421
2422static
2424NTAPI
2426 _In_ WDFDEVICE Device,
2427 _In_ WDFIORESREQLIST IoResourceRequirementsList)
2428{
2430
2431 if (Controller == NULL)
2432 return STATUS_SUCCESS;
2433
2434 return Controller->m_Interrupters.FilterResourceRequirements(IoResourceRequirementsList);
2435}
2436
2437static
2439NTAPI
2441 _In_ WDFDEVICE Device,
2442 _In_ WDFIORESREQLIST IoResourceRequirementsList)
2443{
2445
2446 if (Controller == NULL)
2447 return STATUS_SUCCESS;
2448
2449 return Controller->m_Interrupters.AffinitizeResourceRequirements(IoResourceRequirementsList);
2450}
2451
2452static
2454NTAPI
2456 _In_ WDFDEVICE Device,
2457 _In_ WDFCMRESLIST ResourcesRaw,
2458 _In_ WDFCMRESLIST ResourcesTranslated)
2459{
2463
2464 return STATUS_SUCCESS;
2465}
2466
2467static
2469NTAPI
2471 _In_ WDFDEVICE Device,
2473{
2477
2478 if (Controller != NULL && Stack->Parameters.Power.Type == SystemPowerState)
2479 Controller->TrackSystemPowerIrp(Stack);
2480
2483 if (!NT_SUCCESS(Status))
2484 DPRINT1("Set power IRP dispatch returned 0x%lx\n", Status);
2485
2486 return Status;
2487}
2488
2489static
2491NTAPI
2493 _In_ WDFDEVICE Device,
2495{
2498
2499 if (Controller != NULL && Stack->Parameters.DeviceIoControl.IoControlCode == XHCI_TEST_RESET_IOCTL)
2500 {
2502 Irp->IoStatus.Status = STATUS_SUCCESS;
2504 return STATUS_SUCCESS;
2505 }
2506
2509}
2510
2511static
2512VOID
2513NTAPI
2515 _In_ WDFQUEUE Queue,
2516 _In_ WDFREQUEST Request,
2517 _In_ size_t OutputBufferLength,
2518 _In_ size_t InputBufferLength,
2520{
2521 WDFDEVICE Device = WdfIoQueueGetDevice(Queue);
2522
2524 return;
2525
2526 if (WdfRequestGetRequestorMode(Request) != UserMode)
2527 {
2528 DPRINT1("Kernel mode IOCTL 0x%lx on the controller FDO\n", IoControlCode);
2529 WdfRequestComplete(Request, STATUS_INVALID_PARAMETER);
2530 return;
2531 }
2532
2533 DPRINT1("Unsupported user IOCTL 0x%lx\n", IoControlCode);
2534 WdfRequestComplete(Request, STATUS_INVALID_DEVICE_REQUEST);
2535}
2536
2537static
2538VOID
2539NTAPI
2541 _In_ WDFTIMER Timer)
2542{
2543 XhciGetObjectContext(Timer)->Controller->WatchdogTick();
2544}
2545
2546static
2547VOID
2548NTAPI
2550 _In_ WDFWORKITEM WorkItem)
2551{
2552 XhciGetObjectContext(WorkItem)->Controller->RecoveryWorker();
2553}
2554
2555static
2556VOID
2557NTAPI
2559 _In_ WDFWORKITEM WorkItem)
2560{
2561 XhciGetObjectContext(WorkItem)->Controller->IdleTimeoutWorker();
2562}
2563
2564/* UCX controller callbacks ***************************************************/
2565
2566static
2568NTAPI
2570 _In_ UCXCONTROLLER UcxController,
2575{
2578}
2579
2580static
2582NTAPI
2584 _In_ UCXCONTROLLER UcxController,
2586{
2587 /* Outside D0 this returns the clock based estimate, since UCX caches the value */
2588 *FrameNumber = XhciController::FromUcx(UcxController)->GetFrameNumber(1);
2589 return STATUS_SUCCESS;
2590}
2591
2592static
2593VOID
2594NTAPI
2596 _In_ UCXCONTROLLER UcxController)
2597{
2599}
2600
2601static
2603NTAPI
2605 _In_ UCXCONTROLLER UcxController)
2606{
2608 return STATUS_SUCCESS;
2609}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define PAGED_CODE()
DWORD Id
static COUNTS Counts
Definition: ObType.cpp:60
PWSTR Names[]
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
Type
Definition: Type.h:7
struct _ACPI_EVAL_INPUT_BUFFER_COMPLEX * PACPI_EVAL_INPUT_BUFFER_COMPLEX
#define ACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATURE
Definition: acpiioct.h:15
ACPI_METHOD_ARGUMENT UNALIGNED * PACPI_METHOD_ARGUMENT
Definition: acpiioct.h:80
#define ACPI_METHOD_NEXT_ARGUMENT(Argument)
Definition: acpiioct.h:159
#define ACPI_EVAL_INPUT_BUFFER_SIGNATURE
Definition: acpiioct.h:12
#define ACPI_METHOD_SET_ARGUMENT_INTEGER(MethodArgument, IntData)
Definition: acpiioct.h:164
#define ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE
Definition: acpiioct.h:16
#define ACPI_METHOD_SET_ARGUMENT_BUFFER(Argument, BuffData, BuffLength)
Definition: acpiioct.h:174
#define IOCTL_ACPI_EVAL_METHOD
Definition: acpiioct.h:194
struct _ACPI_EVAL_INPUT_BUFFER_COMPLEX ACPI_EVAL_INPUT_BUFFER_COMPLEX
unsigned char BOOLEAN
Definition: actypes.h:127
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedExchange
Definition: armddk.h:54
#define InterlockedDecrement
Definition: armddk.h:52
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
DECLSPEC_NORETURN VOID NTAPI KeBugCheckEx(IN ULONG BugCheckCode, IN ULONG_PTR BugCheckParameter1, IN ULONG_PTR BugCheckParameter2, IN ULONG_PTR BugCheckParameter3, IN ULONG_PTR BugCheckParameter4)
Definition: debug.c:485
_In_ BOOLEAN _In_ BOOLEAN SetIdleTimeout
Definition: cdrom.h:1429
_In_ CDROM_SCAN_FOR_SPECIAL_INFO _In_ PCDROM_SCAN_FOR_SPECIAL_HANDLER Function
Definition: cdrom.h:1156
WdfDeviceWdmDispatchPreprocessedIrp(Device, Irp)
WdfDeviceSetSpecialFileSupport(Device, WdfSpecialFilePaging, TRUE)
Definition: bufpool.h:45
Definition: Header.h:9
VOID PreReset()
Definition: cmdring.cpp:732
VOID PostInterruptsEntry()
Definition: cmdring.cpp:254
VOID PostResetSuccess()
Definition: cmdring.cpp:762
VOID FailAll()
Definition: cmdring.cpp:807
VOID Release()
Definition: cmdring.cpp:174
NTSTATUS Prepare()
Definition: cmdring.cpp:144
NTSTATUS D0Entry()
Definition: cmdring.cpp:247
VOID OnHostLost()
Definition: cmdring.cpp:813
NTSTATUS Create(_In_ XhciController *Controller)
Definition: cmdring.cpp:95
VOID PostReset()
Definition: cmdring.cpp:743
NTSTATUS Create(_In_ XhciController *Controller)
NTSTATUS Prepare()
VOID Rebalance()
Definition: dmapool.cpp:655
XhciSlotTable m_Slots
Definition: hc.h:93
VOID InternalReset()
Definition: hc.cpp:2113
LONG64 m_FrameSnapshot
Definition: hc.h:265
ULONG64 NowMs() const
Definition: hc.cpp:1783
WDF_POWER_DEVICE_STATE m_PowerState
Definition: hc.h:117
KSPIN_LOCK m_RecoveryLock
Definition: hc.h:281
BOOLEAN m_PnpToldRemoved
Definition: hc.h:285
@ FixFrescoShadow
Definition: hc.h:105
@ FixAsmediaResetDelay
Definition: hc.h:109
@ FixEtronClear
Definition: hc.h:108
@ FixFrescoControl
Definition: hc.h:106
@ FixEtronSet
Definition: hc.h:107
VOID WatchdogTick()
Definition: hc.cpp:1848
NTSTATUS Initialize(_In_ WDFDEVICE Device, _In_ UCXCONTROLLER Ucx, _In_ const XhciIdentity *Identity)
Definition: hc.cpp:905
NTSTATUS D0EntryPostInterruptsEnabled(_In_ WDF_POWER_DEVICE_STATE PreviousState)
Definition: hc.cpp:1574
NTSTATUS PrepareHardware(_In_ WDFCMRESLIST Raw, _In_ WDFCMRESLIST Translated)
Definition: hc.cpp:1254
VOID UsageNotification(_In_ WDF_SPECIAL_FILE_TYPE Type, _In_ BOOLEAN InPath)
Definition: hc.cpp:1734
VOID QueryErrataDatabase(_In_ BOOLEAN AtAddDevice)
Definition: hc.cpp:432
VOID IdleTimeoutWorker()
Definition: hc.cpp:822
static XhciController * FromDevice(_In_ WDFDEVICE Device)
Definition: hc.cpp:169
VOID RecoveryWorker()
Definition: hc.cpp:2095
XhciCommonBuffer m_Buffers
Definition: hc.h:92
BOOLEAN HasErrata(_In_ XhciErrata Bit) const
Definition: hc.h:58
VOID EvaluatePrmi()
Definition: hc.cpp:723
XhciInterrupters m_Interrupters
Definition: hc.h:94
VOID SelfManagedIoCleanup()
Definition: hc.cpp:1722
IdleStatus m_IdleStatus
Definition: hc.h:273
PDEVICE_OBJECT m_WdmDevice
Definition: hc.h:86
ULONG m_RecoveryActions
Definition: hc.h:282
NTSTATUS RunD0Pass(_In_ BOOLEAN Restore)
Definition: hc.cpp:1329
ULONG m_RestoreFailures
Definition: hc.h:268
WDFDEVICE m_Device
Definition: hc.h:85
VOID SetIdleTimeout(_In_ ULONG Milliseconds)
Definition: hc.cpp:737
XhciCommandRing m_Commands
Definition: hc.h:95
_In_ ULONG Reason
Definition: hc.h:83
NTSTATUS QueryUsbCapability(_In_ const GUID *Capability, _In_ ULONG OutputBufferLength, _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, _Out_ PULONG ResultLength)
Definition: hc.cpp:2210
VOID BootRecovery(_In_ ULONG Actions)
Definition: hc.cpp:1971
ULONG m_LastIdleTimeout
Definition: hc.h:274
WDFTIMER m_Watchdog
Definition: hc.h:276
XhciIdentity m_Identity
Definition: hc.h:100
VOID SetPortWake(_In_ BOOLEAN Arm)
Definition: hc.cpp:836
BOOLEAN m_SaveFailed
Definition: hc.h:263
BOOLEAN m_TestMode
Definition: hc.h:204
VOID SelfManagedIoInit()
Definition: hc.cpp:1668
ULONG64 m_InternalFlags
Definition: hc.h:111
BOOLEAN IsAccessible() const
Definition: hc.cpp:193
VOID PopulateErrata()
Definition: hc.cpp:580
UCXCONTROLLER m_Ucx
Definition: hc.h:87
ULONG64 m_Errata
Definition: hc.h:88
VOID ConfigureS0Idle()
Definition: hc.cpp:761
BOOLEAN m_ReservedIoArmed
Definition: hc.h:114
VOID SetInternalFlags()
Definition: hc.cpp:562
VOID RunFirmwareCommands()
Definition: hc.cpp:1536
VOID EvaluateDsm(_In_ ULONG Function)
Definition: hc.cpp:686
VOID TrackSystemPowerIrp(_In_ PIO_STACK_LOCATION Stack)
Definition: hc.cpp:1746
XhciRootHub m_RootHub
Definition: hc.h:96
VOID ReadRegistryErrata()
Definition: hc.cpp:522
BOOLEAN m_FrameSnapshotReady
Definition: hc.h:264
WDFWORKITEM m_IdleItem
Definition: hc.h:278
VOID RunRecovery(_In_ ULONG Actions)
Definition: hc.cpp:2024
LONG m_ResetLock
Definition: hc.h:272
ULONG m_SpecialFiles
Definition: hc.h:267
VOID SetErrata(_In_ XhciErrata Bit)
Definition: hc.cpp:183
XhciRegisters m_Registers
Definition: hc.h:91
XhciDmaBuffer * m_SplitPadBuffer
Definition: hc.h:134
VOID UpdateRegistryCounters()
Definition: hc.cpp:1689
SystemAction m_SystemAction
Definition: hc.h:131
BOOLEAN m_Gone
Definition: hc.h:262
ULONG m_RecoveryCount
Definition: hc.h:269
KMUTEX m_RecoveryMutex
Definition: hc.h:283
VOID ReadVerifierFlags()
Definition: hc.cpp:596
VOID InitFrameSnapshot()
Definition: hc.cpp:1805
NTSTATUS StartController()
Definition: hc.cpp:1483
static XhciController * FromUcx(_In_ UCXCONTROLLER UcxController)
Definition: hc.cpp:176
VOID D0ExitPreInterruptsDisabled()
Definition: hc.cpp:1604
VOID MarkGone()
Definition: hc.cpp:1924
VOID FdoCleanup()
Definition: hc.cpp:1229
WDFWORKITEM m_RecoveryItem
Definition: hc.h:277
NTSTATUS CreateWdfObjects()
Definition: hc.cpp:850
VOID D0Exit(_In_ WDF_POWER_DEVICE_STATE TargetState)
Definition: hc.cpp:1613
BOOLEAN m_GoneHandled
Definition: hc.h:284
VOID ReleaseHardware()
Definition: hc.cpp:1312
NTSTATUS D0Entry(_In_ WDF_POWER_DEVICE_STATE PreviousState)
Definition: hc.cpp:1357
ULONG m_VerifierFlags
Definition: hc.h:261
BOOLEAN m_WaitWakeQueued
Definition: hc.h:203
ULONG64 m_ErrataWord2
Definition: hc.h:89
LONG m_ResetCount
Definition: hc.h:270
LONG m_ResetInterval
Definition: hc.h:271
VOID UcxReset()
Definition: hc.cpp:2193
ULONG m_TimeIncrement
Definition: hc.h:266
VOID PostReset()
Definition: intr.cpp:1386
VOID D0Exit()
Definition: intr.cpp:1380
NTSTATUS Create(_In_ XhciController *Controller)
Definition: intr.cpp:831
NTSTATUS Prepare(_In_ WDFCMRESLIST Raw, _In_ WDFCMRESLIST Translated)
Definition: intr.cpp:1104
VOID D0ExitPreInterruptsDisabled()
Definition: intr.cpp:1347
NTSTATUS D0Entry(_In_ BOOLEAN StatePreserved)
Definition: intr.cpp:1326
VOID Release()
Definition: intr.cpp:1296
NTSTATUS Stop()
Definition: mmio.cpp:775
ULONG ReadOperational32(_In_ ULONG Offset) const
Definition: mmio.cpp:431
ULONG ReadCapability32(_In_ ULONG Offset) const
Definition: mmio.cpp:421
VOID SaveVendorBits()
Definition: mmio.cpp:1019
NTSTATUS RestoreState()
Definition: mmio.cpp:984
NTSTATUS Reset()
Definition: mmio.cpp:800
UCHAR VersionMajor() const
Definition: mmio.cpp:615
NTSTATUS Run()
Definition: mmio.cpp:868
NTSTATUS ResetController(_In_ BOOLEAN AllowRunning)
Definition: mmio.cpp:806
VOID RestoreVendorBits()
Definition: mmio.cpp:1035
NTSTATUS Prepare(_In_ XhciController *Controller, _In_ WDFCMRESLIST Translated)
Definition: mmio.cpp:92
VOID ProgramSsicPortUnused(_In_ BOOLEAN PowerDown)
Definition: mmio.cpp:1004
NTSTATUS SaveState()
Definition: mmio.cpp:968
ULONG SupportedStreams() const
Definition: mmio.cpp:585
VOID Release()
Definition: mmio.cpp:126
ULONG CurrentFrame(_In_ ULONG Increment) const
Definition: mmio.cpp:679
VOID ApplyD0Workarounds()
Definition: mmio.cpp:1052
ULONG Hccparams2() const
Definition: mmio.cpp:603
BOOLEAN IsMapped() const
Definition: mmio.cpp:633
NTSTATUS BiosHandoff()
Definition: mmio.cpp:712
NTSTATUS Prepare()
Definition: rootports.cpp:314
VOID Release()
Definition: rootports.cpp:404
VOID SignalPortChange()
Definition: rootports.cpp:956
VOID SetWakeEnables(_In_ BOOLEAN Arm)
Definition: rootports.cpp:936
VOID D0Entry()
Definition: rootports.cpp:844
VOID PostReset()
Definition: rootports.cpp:914
VOID D0Exit()
Definition: rootports.cpp:877
VOID OnHostLost()
Definition: rootports.cpp:921
VOID PostInterruptsEntry()
Definition: rootports.cpp:867
NTSTATUS Create(_In_ XhciController *Controller)
Definition: rootports.cpp:186
VOID D0Entry()
Definition: slots.cpp:161
NTSTATUS Create(_In_ XhciController *Controller)
Definition: slots.cpp:17
VOID OnHostLost()
Definition: slots.cpp:247
VOID DiscardState()
Definition: slots.cpp:183
VOID DisableAll()
Definition: slots.cpp:199
NTSTATUS Prepare()
_Out_ PKIRQL Irql
Definition: csq.h:179
UINT Depth
Definition: d3d12.idl:4644
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42
Walk Base
Definition: desccheck.cpp:2270
LPWSTR Name
Definition: desk.c:124
_In_ ULONG Attributes
Definition: dispmprt.h:1077
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG _In_ PVOID Argument
Definition: dispmprt.h:1288
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
Definition: dispmprt.h:245
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
static GLfloat Identity[16]
Definition: matrix.c:127
#define NTSTATUS
Definition: precomp.h:19
#define _strnicmp(_String1, _String2, _MaxCount)
Definition: compat.h:23
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:164
LARGE_INTEGER Ticks
Definition: driver.cpp:132
#define L(x)
Definition: resources.c:13
int Fail
Definition: ehthrow.cxx:24
return WdfRegistryQueryValue(Key, &ValueName, sizeof(*Value), Value, NULL, NULL)
return WdfRegistryOpenKey(NULL, &KeyName, Access, WDF_NO_OBJECT_ATTRIBUTES, Key)
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
#define NonPagedPool
Definition: env_spec_w32.h:307
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
#define XHCI_REASON_NO_LIVE_DUMP
Definition: epctx.cpp:40
WdfRegistryClose(HardwareKey)
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG Increment
Definition: CrNtStubs.h:46
Status
Definition: gdiplustypes.h:24
static EVT_WDF_DEVICE_WAKE_FROM_S0_TRIGGERED XhciEvtDeviceWakeFromS0Triggered
Definition: hc.cpp:143
static const GUID XhciGuidBusTypeUsb
Definition: hc.cpp:20
static const GUID XhciGuidStaticStreams
Definition: hc.cpp:26
#define XHCI_TEST_RESET_IOCTL
Definition: hc.cpp:81
#define XHCI_IDLE_TIMEOUT_SHORT_MS
Definition: hc.cpp:76
static EVT_WDF_DEVICE_ARM_WAKE_FROM_S0 XhciEvtDeviceArmWakeFromS0
Definition: hc.cpp:141
static EVT_WDF_WORKITEM XhciEvtRecoveryWork
Definition: hc.cpp:154
static VOID NTAPI XhciEvaluateAcpiMethod(_In_ WDFDEVICE Device, _In_reads_bytes_(InputSize) PVOID Input, _In_ ULONG InputSize)
Definition: hc.cpp:663
#define XHCI_RECOVER_NO_RESTART
Definition: hc.cpp:43
static EVT_WDF_DEVICE_D0_ENTRY_POST_INTERRUPTS_ENABLED XhciEvtDeviceD0EntryPostInterruptsEnabled
Definition: hc.cpp:135
#define XHCI_RECOVER_INTERNAL_RESET
Definition: hc.cpp:41
static EVT_UCX_CONTROLLER_GET_CURRENT_FRAMENUMBER XhciEvtControllerGetCurrentFrameNumber
Definition: hc.cpp:157
#define XHCI_REASON_START_FAILED
Definition: hc.cpp:58
static EVT_WDF_DEVICE_SELF_MANAGED_IO_CLEANUP XhciEvtDeviceSelfManagedIoCleanup
Definition: hc.cpp:139
static EVT_WDF_DEVICE_USAGE_NOTIFICATION XhciEvtDeviceUsageNotification
Definition: hc.cpp:140
static EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL XhciEvtIoDeviceControl
Definition: hc.cpp:152
static const GUID XhciGuidSelectiveSuspend
Definition: hc.cpp:28
static NTSTATUS NTAPI XhciQueryPciIdentity(_In_ WDFDEVICE Device, _Inout_ XhciIdentity *Id)
Definition: hc.cpp:209
#define XHCI_RECOVER_GONE_PNP
Definition: hc.cpp:45
static EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY XhciEvtControllerQueryUsbCapability
Definition: hc.cpp:156
NTSTATUS(NTAPI * PFN_XHCI_QUERY_DEVICE_FLAGS)(_In_ PCWSTR DeviceKey, _In_ PCWSTR Category, _Out_ PULONG64 Flags)
Definition: hc.cpp:111
static NTSTATUS NTAPI XhciQueryIdentity(_In_ WDFDEVICE Device, _Out_ XhciIdentity *Id)
Definition: hc.cpp:388
#define XHCI_DEVICE_USED_BY_DEBUGGER
Definition: hc.cpp:82
static const GUID XhciGuidBusInterfaceStandard
Definition: hc.cpp:16
struct _XHCI_OBJECT_CONTEXT XHCI_OBJECT_CONTEXT
static const GUID XhciGuidHostControllerInterface
Definition: hc.cpp:22
#define XHCI_VERIFY_HSE
Definition: hc.cpp:63
#define XHCI_ACPI_GET_DEVICE_INFORMATION
Definition: hc.cpp:84
#define XHCI_IDLE_TIMEOUT_LONG_MS
Definition: hc.cpp:75
#define XHCI_RECOVER_RESET
Definition: hc.cpp:42
static VOID NTAPI XhciFirmwareCommandDone(_In_ XhciCommand *Command)
Definition: hc.cpp:1498
static EVT_WDFDEVICE_WDM_IRP_PREPROCESS XhciEvtPreprocessInternalIoctl
Definition: hc.cpp:150
#define XHCI_REASON_RESTART_FAILED
Definition: hc.cpp:53
#define XHCI_REASON_REMOVED
Definition: hc.cpp:56
struct _XHCI_OBJECT_CONTEXT * PXHCI_OBJECT_CONTEXT
static EVT_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS XhciEvtDeviceFilterAddResourceRequirements
Definition: hc.cpp:147
static VOID NTAPI XhciCopyAcpiId(_Out_writes_(MAX_VENDOR_ID_STRING_LENGTH) PCHAR Destination, _In_reads_(Length) const CHAR *Source, _In_ ULONG Length)
Definition: hc.cpp:285
static EVT_WDF_DEVICE_DISARM_WAKE_FROM_S0 XhciEvtDeviceDisarmWakeFromS0
Definition: hc.cpp:142
#define XHCI_ACPI_PARENT_ID
Definition: hc.cpp:78
#define XHCI_REASON_RESET_FAILED
Definition: hc.cpp:52
#define XHCI_RESET_WINDOW_TICKS
Definition: hc.cpp:74
static const GUID XhciGuidHighBandwidthIsoch
Definition: hc.cpp:32
#define XHCI_REASON_OLD_FIRMWARE
Definition: hc.cpp:57
static EVT_WDF_OBJECT_CONTEXT_CLEANUP XhciEvtFdoCleanup
Definition: hc.cpp:151
static EVT_WDF_DEVICE_PREPARE_HARDWARE XhciEvtDevicePrepareHardware
Definition: hc.cpp:132
#define XHCI_REASON_NOT_SUPPORTED
Definition: hc.cpp:55
static EVT_WDFDEVICE_WDM_IRP_PREPROCESS XhciEvtPreprocessSetPower
Definition: hc.cpp:149
#define XHCI_RESET_LIMIT
Definition: hc.cpp:73
#define XHCI_RECOVER_REPORT_FAILED
Definition: hc.cpp:46
#define XHCI_REASON_STOP_FAILED
Definition: hc.cpp:54
static NTSTATUS NTAPI XhciQueryAcpiIdentity(_In_ WDFDEVICE Device, _Inout_ XhciIdentity *Id)
Definition: hc.cpp:302
static EVT_WDF_DEVICE_D0_EXIT_PRE_INTERRUPTS_DISABLED XhciEvtDeviceD0ExitPreInterruptsDisabled
Definition: hc.cpp:136
static EVT_WDF_WORKITEM XhciEvtIdleTimeoutWork
Definition: hc.cpp:155
#define XHCI_PAD_BUFFER_SIZE
Definition: hc.cpp:77
#define XHCI_VERIFY_FIRMWARE_OUTDATED
Definition: hc.cpp:62
struct _XHCI_FDO_CONTEXT XHCI_FDO_CONTEXT
#define XHCI_VERIFY_START_TIMEOUT
Definition: hc.cpp:67
static LONG64 NTAPI XhciPackFrameSnapshot(_In_ ULONG Frame, _In_ ULONG64 Now)
Definition: hc.cpp:1795
struct _XHCI_ACPI_DEVICE_INFO * PXHCI_ACPI_DEVICE_INFO
#define XHCI_VERIFY_SAVE_RESTORE
Definition: hc.cpp:69
static EVT_WDF_DEVICE_REMOVE_ADDED_RESOURCES XhciEvtDeviceRemoveAddedResources
Definition: hc.cpp:148
#define XHCI_REASON_TEST_RESET
Definition: hc.cpp:59
static EVT_WDF_DEVICE_RELEASE_HARDWARE XhciEvtDeviceReleaseHardware
Definition: hc.cpp:133
static EVT_WDF_DEVICE_ARM_WAKE_FROM_SX XhciEvtDeviceArmWakeFromSx
Definition: hc.cpp:144
static EVT_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS XhciEvtDeviceFilterRemoveResourceRequirements
Definition: hc.cpp:146
static BOOLEAN NTAPI XhciSendFirmwareCommand(_In_ XhciController *Controller, _In_ ULONG Type, _Out_ PULONG Parameter)
Definition: hc.cpp:1508
static EVT_UCX_CONTROLLER_RESET XhciEvtControllerReset
Definition: hc.cpp:158
#define XHCI_RECOVER_NONE
Definition: hc.cpp:40
static const GUID XhciGuidDsm
Definition: hc.cpp:36
#define XHCI_BUGCHECK_USB3_DRIVER
Definition: hc.cpp:80
#define XHCI_WATCHDOG_TOLERANCE_MS
Definition: hc.cpp:72
#define XHCI_RECOVER_GONE
Definition: hc.cpp:44
static NTSTATUS NTAPI XhciCreateFdo(_Inout_ PWDFDEVICE_INIT DeviceInit, _In_ PWDF_OBJECT_ATTRIBUTES Attributes, _Out_ WDFDEVICE *Device)
Definition: hc.cpp:1017
static EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT XhciEvtDeviceSelfManagedIoInit
Definition: hc.cpp:138
static const GUID XhciGuidChainedMdls
Definition: hc.cpp:24
static const GUID XhciGuidClearTtBufferOnCancel
Definition: hc.cpp:34
struct _XHCI_ACPI_DEVICE_INFO XHCI_ACPI_DEVICE_INFO
#define XHCI_REASON_HOST_SYSTEM_ERROR
Definition: hc.cpp:50
#define XHCI_REASON_HOST_CONTROLLER_ERROR
Definition: hc.cpp:51
#define XHCI_VERIFY_HCE
Definition: hc.cpp:64
static EVT_WDF_DEVICE_D0_EXIT XhciEvtDeviceD0Exit
Definition: hc.cpp:137
#define XHCI_WATCHDOG_PERIOD_MS
Definition: hc.cpp:71
#define XHCI_VERIFY_STOP_TIMEOUT
Definition: hc.cpp:65
static EVT_WDF_DEVICE_DISARM_WAKE_FROM_SX XhciEvtDeviceDisarmWakeFromSx
Definition: hc.cpp:145
#define XHCI_VERIFY_ALL_ONES
Definition: hc.cpp:68
static EVT_WDF_TIMER XhciEvtWatchdog
Definition: hc.cpp:153
static const GUID XhciGuidD3ColdSupport
Definition: hc.cpp:18
struct _XHCI_FDO_CONTEXT * PXHCI_FDO_CONTEXT
static EVT_WDF_DEVICE_D0_ENTRY XhciEvtDeviceD0Entry
Definition: hc.cpp:134
#define XHCI_VERIFY_RESET_TIMEOUT
Definition: hc.cpp:66
static const GUID XhciGuidFunctionSuspend
Definition: hc.cpp:30
static NTSTATUS NTAPI XhciEvtControllerEnableForwardProgress(_In_ UCXCONTROLLER UcxController)
Definition: hc.cpp:2604
XhciRecovery
Definition: hc.h:12
#define XHCI_FIRMWARE_UNKNOWN
Definition: hc.h:21
XhciDriverData XhciDriver
Definition: xhcientry.cpp:23
_In_ const HubIdStrings * Ids
ULONG Returned
_In_ ACCESS_MASK _Out_ WDFKEY _Out_ WDFKEY * DeviceKey
return WdfDeviceOpenRegistryKey(Child->m_Pdo->m_Device, PLUGPLAY_REGKEY_DEVICE, Access, WDF_NO_OBJECT_ATTRIBUTES, Key)
UNICODE_STRING Path
WdfWorkItemEnqueue(WorkItem)
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
Definition: hubucx.h:258
_In_opt_ PVOID _In_ PUCXHUB_WORKITEM WorkItem
Definition: hubucx.h:227
_In_ UCXUSBDEVICE _In_ PDEVICE_OBJECT Pdo
Definition: hubucx.h:280
_In_ const GUID _In_ ULONG _In_opt_ PFN_WDF_WMI_INSTANCE_QUERY_INSTANCE Query
Definition: hubwmi.cpp:114
#define InterlockedCompareExchange64
Definition: interlocked.h:129
#define InterlockedExchange64
Definition: interlocked.h:186
_In_ PIRP Irp
Definition: kse.h:79
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
_In_ UINT Bytes
Definition: mmcopy.h:9
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
unsigned __int64 ULONG64
Definition: imports.h:198
unsigned __int64 * PULONG64
Definition: imports.h:198
PVOID PVOID PWCHAR PVOID USHORT PULONG Reason
Definition: env.c:47
static PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
Definition: precomp.h:45
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3169
#define KernelMode
Definition: asm.h:38
#define UserMode
Definition: asm.h:39
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:3051
#define _In_reads_bytes_(s)
Definition: no_sal2.h:170
#define _In_reads_(s)
Definition: no_sal2.h:168
#define _Inout_
Definition: no_sal2.h:162
#define _Out_writes_bytes_opt_(s)
Definition: no_sal2.h:228
#define _Out_writes_(s)
Definition: no_sal2.h:176
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define KEY_READ
Definition: nt_native.h:1026
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define KEY_WRITE
Definition: nt_native.h:1034
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define ANSI_NULL
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
#define IoCompleteRequest
Definition: irp.c:1272
ULONG NTAPI KeQueryTimeIncrement(VOID)
Definition: clock.c:151
VOID NTAPI KeInitializeMutex(IN PKMUTEX Mutex, IN ULONG Level)
Definition: mutex.c:67
LONG NTAPI KeReleaseMutex(IN PKMUTEX Mutex, IN BOOLEAN Wait)
Definition: mutex.c:189
@ PowerSystemSleeping1
Definition: ntpoapi.h:37
@ PowerSystemSleeping2
Definition: ntpoapi.h:38
@ PowerSystemSleeping3
Definition: ntpoapi.h:39
@ PowerSystemShutdown
Definition: ntpoapi.h:41
@ PowerSystemWorking
Definition: ntpoapi.h:36
@ PowerSystemHibernate
Definition: ntpoapi.h:40
POWER_ACTION
Definition: ntpoapi.h:122
@ PowerActionShutdownReset
Definition: ntpoapi.h:128
#define STATUS_ACPI_INVALID_DATA
Definition: ntstatus.h:1662
NTSTRSAFEAPI RtlStringCchCopyW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _In_ NTSTRSAFE_PCWSTR pszSrc)
Definition: ntstrsafe.h:127
NTSTRSAFEVAPI RtlStringCbPrintfA(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,...)
Definition: ntstrsafe.h:1148
NTSTRSAFEVAPI RtlStringCchPrintfW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:1110
NTSTRSAFEAPI RtlStringCbCopyA(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cbDest, _In_ NTSTRSAFE_PCSTR pszSrc)
Definition: ntstrsafe.h:156
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
char CHAR
Definition: pedump.c:57
static WCHAR Address[46]
Definition: ping.c:68
NTSTATUS NTAPI IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_REGISTRY_PROPERTY DeviceProperty, IN ULONG BufferLength, OUT PVOID PropertyBuffer, OUT PULONG ResultLength)
Definition: pnpmgr.c:1382
_In_ ULONG _In_ WDFMEMORY Input
Definition: portacpi.cpp:109
WDF_MEMORY_DESCRIPTOR_INIT_HANDLE & InputDescriptor
Definition: portacpi.cpp:116
WDF_MEMORY_DESCRIPTOR OutputDescriptor
Definition: portacpi.cpp:114
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
@ PNPBus
Definition: restypes.h:137
@ Raw
Definition: sacdrv.h:279
#define KeQueryTickCount(CurrentCount)
Definition: ke.h:43
struct tm * Now
Definition: output.c:19
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
#define DPRINT
Definition: sndvol32.h:73
static void Exit(void)
Definition: sock.c:1330
@ Low
Definition: strmini.h:380
Definition: shell.h:41
Definition: xml2sdb.h:103
PVOID QueryDeviceFlags
Definition: hc.h:292
BOOLEAN TestMode
Definition: hc.h:293
UCHAR PciRevisionId
Definition: hc.h:29
ULONG PciDeviceId
Definition: hc.h:28
CHAR AcpiRevisionId[MAX_REVISION_ID_STRING_LENGTH]
Definition: hc.h:37
ULONG PciFunction
Definition: hc.h:34
CHAR AcpiDeviceId[MAX_DEVICE_ID_STRING_LENGTH]
Definition: hc.h:36
BUS_INTERFACE_STANDARD PciInterface
Definition: hc.h:43
ULONG PciVendorId
Definition: hc.h:27
CHAR AcpiVendorId[MAX_VENDOR_ID_STRING_LENGTH]
Definition: hc.h:35
ULONG64 FirmwareVersion
Definition: hc.h:40
ULONG PciDevice
Definition: hc.h:33
UCX_CONTROLLER_PARENT_BUS_TYPE ParentBus
Definition: hc.h:26
ULONG PciBus
Definition: hc.h:32
PGET_SET_DEVICE_DATA SetBusData
Definition: iotypes.h:915
PGET_SET_DEVICE_DATA GetBusData
Definition: iotypes.h:916
PINTERFACE_DEREFERENCE InterfaceDereference
Definition: iotypes.h:912
PINTERFACE_DEREFERENCE InterfaceDereference
Definition: iotypes.h:7573
PGET_IDLE_WAKE_INFO GetIdleWakeInfo
Definition: iotypes.h:7575
INTERFACE_TYPE LegacyBusType
Definition: cmtypes.h:366
WDF_POWER_POLICY_SX_WAKE_USER_CONTROL UserControlOfWakeSettings
Definition: wdfdevice.h:1401
PFN_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS EvtDeviceFilterAddResourceRequirements
Definition: wdffdo.h:91
PFN_WDF_DEVICE_REMOVE_ADDED_RESOURCES EvtDeviceRemoveAddedResources
Definition: wdffdo.h:95
PFN_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS EvtDeviceFilterRemoveResourceRequirements
Definition: wdffdo.h:93
PFN_WDF_IO_QUEUE_IO_DEVICE_CONTROL EvtIoDeviceControl
Definition: wdfio.h:405
PFN_WDF_DEVICE_D0_ENTRY EvtDeviceD0Entry
Definition: wdfdevice.h:1164
PFN_WDF_DEVICE_SELF_MANAGED_IO_INIT EvtDeviceSelfManagedIoInit
Definition: wdfdevice.h:1172
PFN_WDF_DEVICE_D0_EXIT EvtDeviceD0Exit
Definition: wdfdevice.h:1166
PFN_WDF_DEVICE_USAGE_NOTIFICATION EvtDeviceUsageNotification
Definition: wdfdevice.h:1178
PFN_WDF_DEVICE_PREPARE_HARDWARE EvtDevicePrepareHardware
Definition: wdfdevice.h:1168
PFN_WDF_DEVICE_D0_ENTRY_POST_INTERRUPTS_ENABLED EvtDeviceD0EntryPostInterruptsEnabled
Definition: wdfdevice.h:1165
PFN_WDF_DEVICE_SELF_MANAGED_IO_CLEANUP EvtDeviceSelfManagedIoCleanup
Definition: wdfdevice.h:1170
PFN_WDF_DEVICE_D0_EXIT_PRE_INTERRUPTS_DISABLED EvtDeviceD0ExitPreInterruptsDisabled
Definition: wdfdevice.h:1167
PFN_WDF_DEVICE_RELEASE_HARDWARE EvtDeviceReleaseHardware
Definition: wdfdevice.h:1169
PFN_WDF_DEVICE_ARM_WAKE_FROM_S0 EvtDeviceArmWakeFromS0
Definition: wdfdevice.h:1189
PFN_WDF_DEVICE_DISARM_WAKE_FROM_S0 EvtDeviceDisarmWakeFromS0
Definition: wdfdevice.h:1190
PFN_WDF_DEVICE_WAKE_FROM_S0_TRIGGERED EvtDeviceWakeFromS0Triggered
Definition: wdfdevice.h:1191
PFN_WDF_DEVICE_ARM_WAKE_FROM_SX EvtDeviceArmWakeFromSx
Definition: wdfdevice.h:1193
PFN_WDF_DEVICE_DISARM_WAKE_FROM_SX EvtDeviceDisarmWakeFromSx
Definition: wdfdevice.h:1194
ULONG TolerableDelay
Definition: wdftimer.h:95
BOOLEAN AutomaticSerialization
Definition: wdftimer.h:90
BOOLEAN AutomaticSerialization
Definition: wdfworkitem.h:79
USHORT SubSystemStringLength
Definition: hc.cpp:98
USHORT InstanceIdOffset
Definition: hc.cpp:101
USHORT BaseClassCode
Definition: hc.cpp:102
USHORT VendorStringLength
Definition: hc.cpp:95
USHORT HardwareRevision
Definition: hc.cpp:103
USHORT SubSystemIdStringOffset
Definition: hc.cpp:97
USHORT SubDeviceIdStringOffset
Definition: hc.cpp:99
USHORT SubClassCode
Definition: hc.cpp:106
USHORT VendorIdStringOffset
Definition: hc.cpp:94
UCHAR ProgrammingInterface
Definition: hc.cpp:104
USHORT DeviceIdStringOffset
Definition: hc.cpp:96
USHORT InstanceIdLength
Definition: hc.cpp:100
XhciController * Controller
Definition: hc.cpp:119
XhciController * Controller
Definition: hc.cpp:125
#define MAXULONG
Definition: typedefs.h:251
uint32_t * PULONG
Definition: typedefs.h:59
const uint16_t * PCWSTR
Definition: typedefs.h:57
int64_t LONG64
Definition: typedefs.h:68
unsigned char UCHAR
Definition: typedefs.h:53
#define NTAPI
Definition: typedefs.h:36
PVOID HANDLE
Definition: typedefs.h:73
uint16_t * PUSHORT
Definition: typedefs.h:56
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint32_t ULONG
Definition: typedefs.h:59
char * PCHAR
Definition: typedefs.h:51
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
_Out_ PULONG FrameNumber
Definition: ucxcontroller.h:94
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXCONTROLLER * Controller
_In_ PGUID _In_ ULONG _Out_ PULONG ResultLength
Definition: ucxcontroller.h:83
#define MAX_VENDOR_ID_STRING_LENGTH
Definition: ucxcontroller.h:33
@ UcxControllerParentBusTypePci
Definition: ucxcontroller.h:17
@ UcxControllerParentBusTypeAcpi
Definition: ucxcontroller.h:18
FORCEINLINE VOID NTAPI UCX_CONTROLLER_CONFIG_INIT(_Out_ PUCX_CONTROLLER_CONFIG Config, _In_ LPCSTR DeviceDescription)
@ UcxControllerStateLost
Definition: ucxcontroller.h:24
_In_ PGUID CapabilityType
Definition: ucxcontroller.h:80
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG Config
FORCEINLINE VOID NTAPI UCX_CONTROLLER_RESET_COMPLETE_INFO_INIT(_Out_ PUCX_CONTROLLER_RESET_COMPLETE_INFO UcxControllerResetCompleteInfo, _In_ UCX_CONTROLLER_STATE UcxControllerState, _In_ BOOLEAN UcxCoordinated)
FORCEINLINE VOID NTAPI UCX_CONTROLLER_CONFIG_SET_PCI_INFO(_Inout_ PUCX_CONTROLLER_CONFIG Config, _In_ ULONG VendorId, _In_ ULONG DeviceId, _In_ USHORT RevisionId, _In_ ULONG BusNumber, _In_ ULONG DeviceNumber, _In_ ULONG FunctionNumber)
FORCEINLINE VOID NTAPI UCX_CONTROLLER_CONFIG_SET_ACPI_INFO(_Inout_ PUCX_CONTROLLER_CONFIG Config, _In_reads_(MAX_VENDOR_ID_STRING_LENGTH) PSTR VendorId, _In_reads_(MAX_DEVICE_ID_STRING_LENGTH) PSTR DeviceId, _In_reads_(MAX_REVISION_ID_STRING_LENGTH) PSTR RevisionId)
_In_ PGUID _In_ ULONG OutputBufferLength
Definition: ucxcontroller.h:81
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
#define STATUS_INVALID_DEVICE_REQUEST
Definition: udferr_usr.h:138
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_OBJECT_NAME_COLLISION
Definition: udferr_usr.h:150
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define STATUS_OBJECT_NAME_NOT_FOUND
Definition: udferr_usr.h:149
LONGLONG QuadPart
Definition: typedefs.h:114
PUSB_ROOT_HUB_NAME Output
Definition: userreq.cpp:699
static int Save(const char **args)
Definition: vfdcmd.c:1851
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ PWDFDEVICE_INIT DeviceInit
Definition: wdfcontrol.h:113
_Must_inspect_result_ _In_ WDFDRIVER Driver
Definition: wdfcontrol.h:83
#define DECLARE_CONST_UNICODE_STRING(_variablename, _string)
Definition: wdfcore.h:161
FORCEINLINE LONGLONG WDF_REL_TIMEOUT_IN_MS(_In_ ULONGLONG Time)
Definition: wdfcore.h:80
@ WakeDoNotAllowUserControl
Definition: wdfdevice.h:417
_In_ WDF_POWER_DEVICE_STATE PreviousState
Definition: wdfdevice.h:829
FORCEINLINE VOID WDF_DEVICE_STATE_INIT(_Out_ PWDF_DEVICE_STATE PnpDeviceState)
Definition: wdfdevice.h:1496
@ WdfPowerDeviceD3Final
Definition: wdfdevice.h:427
@ WdfPowerDeviceD0
Definition: wdfdevice.h:423
enum _WDF_SPECIAL_FILE_TYPE WDF_SPECIAL_FILE_TYPE
@ WdfReleaseHardwareOrderOnFailureAfterDescendants
Definition: wdfdevice.h:476
enum _WDF_POWER_DEVICE_STATE WDF_POWER_DEVICE_STATE
_In_ WDFCMRESLIST _In_ WDFCMRESLIST ResourcesTranslated
Definition: wdfdevice.h:891
_In_ WDF_SPECIAL_FILE_TYPE _In_ BOOLEAN IsInNotificationPath
Definition: wdfdevice.h:1027
FORCEINLINE VOID WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(_Out_ PWDF_DEVICE_POWER_POLICY_IDLE_SETTINGS Settings, _In_ WDF_POWER_POLICY_S0_IDLE_CAPABILITIES IdleCaps)
Definition: wdfdevice.h:1349
_In_ WDF_SPECIAL_FILE_TYPE NotificationType
Definition: wdfdevice.h:1024
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_POWER_POLICY_IDLE_SETTINGS Settings
Definition: wdfdevice.h:2601
@ WdfDeviceFailedNoRestart
Definition: wdfdevice.h:470
@ WdfSpecialFileBoot
Definition: wdfdevice.h:445
@ WdfSpecialFileHibernation
Definition: wdfdevice.h:443
@ WdfSpecialFileDump
Definition: wdfdevice.h:444
@ WdfSpecialFilePaging
Definition: wdfdevice.h:442
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
Definition: wdfdevice.h:2231
FORCEINLINE VOID WDF_PNPPOWER_EVENT_CALLBACKS_INIT(_Out_ PWDF_PNPPOWER_EVENT_CALLBACKS Callbacks)
Definition: wdfdevice.h:1214
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_In_ WDF_POWER_DEVICE_STATE TargetState
Definition: wdfdevice.h:859
@ IdleAllowUserControl
Definition: wdfdevice.h:408
_In_ WDFCMRESLIST ResourcesRaw
Definition: wdfdevice.h:888
@ SystemManagedIdleTimeoutWithHint
Definition: wdfdevice.h:1245
FORCEINLINE VOID WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(_Out_ PWDF_DEVICE_POWER_POLICY_WAKE_SETTINGS Settings)
Definition: wdfdevice.h:1437
FORCEINLINE VOID WDF_POWER_POLICY_EVENT_CALLBACKS_INIT(_Out_ PWDF_POWER_POLICY_EVENT_CALLBACKS Callbacks)
Definition: wdfdevice.h:1203
@ IdleCanWakeFromS0
Definition: wdfdevice.h:401
FORCEINLINE WDFDRIVER WdfGetDriver(VOID)
Definition: wdfdriver.h:194
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469
FORCEINLINE VOID WDF_FDO_EVENT_CALLBACKS_INIT(_Out_ PWDF_FDO_EVENT_CALLBACKS Callbacks)
Definition: wdffdo.h:101
FORCEINLINE VOID WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(_Out_ PWDF_IO_QUEUE_CONFIG Config, _In_ WDF_IO_QUEUE_DISPATCH_TYPE DispatchType)
Definition: wdfio.h:443
@ WdfIoQueueDispatchSequential
Definition: wdfio.h:78
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
Definition: wdfiotarget.h:863
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
Definition: wdfiotarget.h:510
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG DeviceOffset
Definition: wdfiotarget.h:865
FORCEINLINE VOID WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(_Out_ PWDF_MEMORY_DESCRIPTOR Descriptor, _In_ PVOID Buffer, _In_ ULONG BufferLength)
Definition: wdfmemory.h:102
#define WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(_attributes, _contexttype)
Definition: wdfobject.h:170
@ WdfExecutionLevelDispatch
Definition: wdfobject.h:55
#define WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(_contexttype, _castingfunction)
Definition: wdfobject.h:350
_In_ WDFIORESREQLIST IoResourceRequirementsList
Definition: wdfpdo.h:78
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:243
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639
FORCEINLINE VOID WDF_TIMER_CONFIG_INIT_PERIODIC(_Out_ PWDF_TIMER_CONFIG Config, _In_ PFN_WDF_TIMER EvtTimerFunc, _In_ LONG Period)
Definition: wdftimer.h:126
@ WdfTrue
Definition: wdftypes.h:88
@ WdfFalse
Definition: wdftypes.h:87
#define WDF_NO_HANDLE
Definition: wdftypes.h:107
#define WDF_NO_OBJECT_ATTRIBUTES
Definition: wdftypes.h:105
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_WMI_INSTANCE_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_opt_ WDFWMIINSTANCE * Instance
Definition: wdfwmi.h:481
FORCEINLINE VOID WDF_WORKITEM_CONFIG_INIT(_Out_ PWDF_WORKITEM_CONFIG Config, _In_ PFN_WDF_WORKITEM EvtWorkItemFunc)
Definition: wdfworkitem.h:85
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
#define PLUGPLAY_REGKEY_DEVICE
Definition: iofuncs.h:2812
enum _DEVICE_WAKE_DEPTH DEVICE_WAKE_DEPTH
#define PCI_WHICHSPACE_CONFIG
Definition: iotypes.h:3659
#define IO_NO_INCREMENT
Definition: iotypes.h:598
@ DevicePropertyAddress
Definition: iotypes.h:1211
@ DevicePropertyEnumeratorName
Definition: iotypes.h:1210
@ DevicePropertyBusNumber
Definition: iotypes.h:1209
#define IRP_MN_SET_POWER
#define D3COLD_SUPPORT_INTERFACE_VERSION
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
@ DeviceWakeDepthD0
Definition: iotypes.h:7496
@ DeviceWakeDepthNotWakeable
Definition: iotypes.h:7495
#define IRP_MJ_POWER
_In_ SYSTEM_POWER_STATE SystemPowerState
Definition: iotypes.h:7535
@ Executive
Definition: ketypes.h:467
_Inout_opt_ PVOID Parameter
Definition: rtltypes.h:336
EVT_WDF_DRIVER_DEVICE_ADD XhciEvtDeviceAdd
Definition: xhcidrv.h:41
EVT_UCX_CONTROLLER_USBDEVICE_ADD XhciEvtControllerUsbDeviceAdd
Definition: xhcidrv.h:44
FORCEINLINE ULONG64 NTAPI XhciErrataBit(_In_ XhciErrata Bit)
Definition: xhcierrata.h:90
XhciErrata
Definition: xhcierrata.h:15
#define XHCI_TRB_TYPE_SHIFT
Definition: xhcihw.h:23
#define XHCI_USBSTS_HCE
Definition: xhcihw.h:409
#define XHCI_OP_USBSTS
Definition: xhcihw.h:382
#define XHCI_USBSTS_HSE
Definition: xhcihw.h:402
#define XHCI_HCC2_ETC
Definition: xhcihw.h:378
#define XHCI_HCC2_LEC
Definition: xhcihw.h:377
#define XHCI_CAP_LENGTH_VERSION
Definition: xhcihw.h:335
#define XHCI_TAG_CONTROLLER
Definition: xhciutil.h:12