ReactOS 0.4.17-dev-1281-g065abb3
hc.cpp File Reference
#include "xhcidrv.h"
#include <ntstrsafe.h>
#include <acpiioct.h>
#include <debug.h>
Include dependency graph for hc.cpp:

Go to the source code of this file.

Classes

struct  _XHCI_ACPI_DEVICE_INFO
 
struct  _XHCI_FDO_CONTEXT
 
struct  _XHCI_OBJECT_CONTEXT
 

Macros

#define NDEBUG
 
#define XHCI_RECOVER_NONE   0x00
 
#define XHCI_RECOVER_INTERNAL_RESET   0x01
 
#define XHCI_RECOVER_RESET   0x02
 
#define XHCI_RECOVER_NO_RESTART   0x04
 
#define XHCI_RECOVER_GONE   0x08
 
#define XHCI_RECOVER_GONE_PNP   0x10
 
#define XHCI_RECOVER_REPORT_FAILED   0x20
 
#define XHCI_REASON_NO_LIVE_DUMP   0x0000
 
#define XHCI_REASON_HOST_SYSTEM_ERROR   0x1001
 
#define XHCI_REASON_HOST_CONTROLLER_ERROR   0x1002
 
#define XHCI_REASON_RESET_FAILED   0x1007
 
#define XHCI_REASON_RESTART_FAILED   0x1008
 
#define XHCI_REASON_STOP_FAILED   0x100B
 
#define XHCI_REASON_NOT_SUPPORTED   0x100C
 
#define XHCI_REASON_REMOVED   0x100D
 
#define XHCI_REASON_OLD_FIRMWARE   0x100F
 
#define XHCI_REASON_START_FAILED   0x101C
 
#define XHCI_REASON_TEST_RESET   0x103F
 
#define XHCI_VERIFY_FIRMWARE_OUTDATED   0x00000001
 
#define XHCI_VERIFY_HSE   0x00000002
 
#define XHCI_VERIFY_HCE   0x00000004
 
#define XHCI_VERIFY_STOP_TIMEOUT   0x00000008
 
#define XHCI_VERIFY_RESET_TIMEOUT   0x00000010
 
#define XHCI_VERIFY_START_TIMEOUT   0x00000020
 
#define XHCI_VERIFY_ALL_ONES   0x00000040
 
#define XHCI_VERIFY_SAVE_RESTORE   0x00400000
 
#define XHCI_WATCHDOG_PERIOD_MS   5000
 
#define XHCI_WATCHDOG_TOLERANCE_MS   1000
 
#define XHCI_RESET_LIMIT   10
 
#define XHCI_RESET_WINDOW_TICKS   60
 
#define XHCI_IDLE_TIMEOUT_LONG_MS   5000
 
#define XHCI_IDLE_TIMEOUT_SHORT_MS   1
 
#define XHCI_PAD_BUFFER_SIZE   512
 
#define XHCI_ACPI_PARENT_ID   0x7FFFFFFF
 
#define XHCI_BUGCHECK_USB3_DRIVER   0x144
 
#define XHCI_TEST_RESET_IOCTL   0x00220FB7
 
#define XHCI_DEVICE_USED_BY_DEBUGGER   0x02000000
 
#define XHCI_ACPI_GET_DEVICE_INFORMATION    CTL_CODE(FILE_DEVICE_ACPI, 10, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 

Typedefs

typedef struct _XHCI_ACPI_DEVICE_INFO XHCI_ACPI_DEVICE_INFO
 
typedef struct _XHCI_ACPI_DEVICE_INFO * PXHCI_ACPI_DEVICE_INFO
 
typedef NTSTATUS(NTAPI * PFN_XHCI_QUERY_DEVICE_FLAGS) (_In_ PCWSTR DeviceKey, _In_ PCWSTR Category, _Out_ PULONG64 Flags)
 
typedef struct _XHCI_FDO_CONTEXT XHCI_FDO_CONTEXT
 
typedef struct _XHCI_FDO_CONTEXT * PXHCI_FDO_CONTEXT
 
typedef struct _XHCI_OBJECT_CONTEXT XHCI_OBJECT_CONTEXT
 
typedef struct _XHCI_OBJECT_CONTEXT * PXHCI_OBJECT_CONTEXT
 

Functions

static NTSTATUS NTAPI XhciEvtControllerEnableForwardProgress (_In_ UCXCONTROLLER UcxController)
 
static NTSTATUS NTAPI XhciQueryPciIdentity (_In_ WDFDEVICE Device, _Inout_ XhciIdentity *Id)
 
static VOID NTAPI XhciCopyAcpiId (_Out_writes_(MAX_VENDOR_ID_STRING_LENGTH) PCHAR Destination, _In_reads_(Length) const CHAR *Source, _In_ ULONG Length)
 
static NTSTATUS NTAPI XhciQueryAcpiIdentity (_In_ WDFDEVICE Device, _Inout_ XhciIdentity *Id)
 
static NTSTATUS NTAPI XhciQueryIdentity (_In_ WDFDEVICE Device, _Out_ XhciIdentity *Id)
 
static VOID NTAPI XhciEvaluateAcpiMethod (_In_ WDFDEVICE Device, _In_reads_bytes_(InputSize) PVOID Input, _In_ ULONG InputSize)
 
static NTSTATUS NTAPI XhciCreateFdo (_Inout_ PWDFDEVICE_INIT DeviceInit, _In_ PWDF_OBJECT_ATTRIBUTES Attributes, _Out_ WDFDEVICE *Device)
 
NTSTATUS NTAPI XhciEvtDeviceAdd (_In_ WDFDRIVER Driver, _Inout_ PWDFDEVICE_INIT DeviceInit)
 
static VOID NTAPI XhciEvtFdoCleanup (_In_ WDFOBJECT Object)
 
static VOID NTAPI XhciFirmwareCommandDone (_In_ XhciCommand *Command)
 
static BOOLEAN NTAPI XhciSendFirmwareCommand (_In_ XhciController *Controller, _In_ ULONG Type, _Out_ PULONG Parameter)
 
static LONG64 NTAPI XhciPackFrameSnapshot (_In_ ULONG Frame, _In_ ULONG64 Now)
 
static NTSTATUS NTAPI XhciEvtDevicePrepareHardware (_In_ WDFDEVICE Device, _In_ WDFCMRESLIST ResourcesRaw, _In_ WDFCMRESLIST ResourcesTranslated)
 
static NTSTATUS NTAPI XhciEvtDeviceReleaseHardware (_In_ WDFDEVICE Device, _In_ WDFCMRESLIST ResourcesTranslated)
 
static NTSTATUS NTAPI XhciEvtDeviceD0Entry (_In_ WDFDEVICE Device, _In_ WDF_POWER_DEVICE_STATE PreviousState)
 
static NTSTATUS NTAPI XhciEvtDeviceD0EntryPostInterruptsEnabled (_In_ WDFDEVICE Device, _In_ WDF_POWER_DEVICE_STATE PreviousState)
 
static NTSTATUS NTAPI XhciEvtDeviceD0ExitPreInterruptsDisabled (_In_ WDFDEVICE Device, _In_ WDF_POWER_DEVICE_STATE TargetState)
 
static NTSTATUS NTAPI XhciEvtDeviceD0Exit (_In_ WDFDEVICE Device, _In_ WDF_POWER_DEVICE_STATE TargetState)
 
static NTSTATUS NTAPI XhciEvtDeviceSelfManagedIoInit (_In_ WDFDEVICE Device)
 
static VOID NTAPI XhciEvtDeviceSelfManagedIoCleanup (_In_ WDFDEVICE Device)
 
static VOID NTAPI XhciEvtDeviceUsageNotification (_In_ WDFDEVICE Device, _In_ WDF_SPECIAL_FILE_TYPE NotificationType, _In_ BOOLEAN IsInNotificationPath)
 
static NTSTATUS NTAPI XhciEvtDeviceArmWakeFromS0 (_In_ WDFDEVICE Device)
 
static VOID NTAPI XhciEvtDeviceDisarmWakeFromS0 (_In_ WDFDEVICE Device)
 
static VOID NTAPI XhciEvtDeviceWakeFromS0Triggered (_In_ WDFDEVICE Device)
 
static NTSTATUS NTAPI XhciEvtDeviceArmWakeFromSx (_In_ WDFDEVICE Device)
 
static VOID NTAPI XhciEvtDeviceDisarmWakeFromSx (_In_ WDFDEVICE Device)
 
static NTSTATUS NTAPI XhciEvtDeviceFilterRemoveResourceRequirements (_In_ WDFDEVICE Device, _In_ WDFIORESREQLIST IoResourceRequirementsList)
 
static NTSTATUS NTAPI XhciEvtDeviceFilterAddResourceRequirements (_In_ WDFDEVICE Device, _In_ WDFIORESREQLIST IoResourceRequirementsList)
 
static NTSTATUS NTAPI XhciEvtDeviceRemoveAddedResources (_In_ WDFDEVICE Device, _In_ WDFCMRESLIST ResourcesRaw, _In_ WDFCMRESLIST ResourcesTranslated)
 
static NTSTATUS NTAPI XhciEvtPreprocessSetPower (_In_ WDFDEVICE Device, _Inout_ PIRP Irp)
 
static NTSTATUS NTAPI XhciEvtPreprocessInternalIoctl (_In_ WDFDEVICE Device, _Inout_ PIRP Irp)
 
static VOID NTAPI XhciEvtIoDeviceControl (_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, _In_ size_t OutputBufferLength, _In_ size_t InputBufferLength, _In_ ULONG IoControlCode)
 
static VOID NTAPI XhciEvtWatchdog (_In_ WDFTIMER Timer)
 
static VOID NTAPI XhciEvtRecoveryWork (_In_ WDFWORKITEM WorkItem)
 
static VOID NTAPI XhciEvtIdleTimeoutWork (_In_ WDFWORKITEM WorkItem)
 
static NTSTATUS NTAPI XhciEvtControllerQueryUsbCapability (_In_ UCXCONTROLLER UcxController, _In_ PGUID CapabilityType, _In_ ULONG OutputBufferLength, _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, _Out_ PULONG ResultLength)
 
static NTSTATUS NTAPI XhciEvtControllerGetCurrentFrameNumber (_In_ UCXCONTROLLER UcxController, _Out_ PULONG FrameNumber)
 
static VOID NTAPI XhciEvtControllerReset (_In_ UCXCONTROLLER UcxController)
 

Variables

static const GUID XhciGuidBusInterfaceStandard
 
static const GUID XhciGuidD3ColdSupport
 
static const GUID XhciGuidBusTypeUsb
 
static const GUID XhciGuidHostControllerInterface
 
static const GUID XhciGuidChainedMdls
 
static const GUID XhciGuidStaticStreams
 
static const GUID XhciGuidSelectiveSuspend
 
static const GUID XhciGuidFunctionSuspend
 
static const GUID XhciGuidHighBandwidthIsoch
 
static const GUID XhciGuidClearTtBufferOnCancel
 
static const GUID XhciGuidDsm
 
static EVT_WDF_DEVICE_PREPARE_HARDWARE XhciEvtDevicePrepareHardware
 
static EVT_WDF_DEVICE_RELEASE_HARDWARE XhciEvtDeviceReleaseHardware
 
static EVT_WDF_DEVICE_D0_ENTRY XhciEvtDeviceD0Entry
 
static EVT_WDF_DEVICE_D0_ENTRY_POST_INTERRUPTS_ENABLED XhciEvtDeviceD0EntryPostInterruptsEnabled
 
static EVT_WDF_DEVICE_D0_EXIT_PRE_INTERRUPTS_DISABLED XhciEvtDeviceD0ExitPreInterruptsDisabled
 
static EVT_WDF_DEVICE_D0_EXIT XhciEvtDeviceD0Exit
 
static EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT XhciEvtDeviceSelfManagedIoInit
 
static EVT_WDF_DEVICE_SELF_MANAGED_IO_CLEANUP XhciEvtDeviceSelfManagedIoCleanup
 
static EVT_WDF_DEVICE_USAGE_NOTIFICATION XhciEvtDeviceUsageNotification
 
static EVT_WDF_DEVICE_ARM_WAKE_FROM_S0 XhciEvtDeviceArmWakeFromS0
 
static EVT_WDF_DEVICE_DISARM_WAKE_FROM_S0 XhciEvtDeviceDisarmWakeFromS0
 
static EVT_WDF_DEVICE_WAKE_FROM_S0_TRIGGERED XhciEvtDeviceWakeFromS0Triggered
 
static EVT_WDF_DEVICE_ARM_WAKE_FROM_SX XhciEvtDeviceArmWakeFromSx
 
static EVT_WDF_DEVICE_DISARM_WAKE_FROM_SX XhciEvtDeviceDisarmWakeFromSx
 
static EVT_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS XhciEvtDeviceFilterRemoveResourceRequirements
 
static EVT_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS XhciEvtDeviceFilterAddResourceRequirements
 
static EVT_WDF_DEVICE_REMOVE_ADDED_RESOURCES XhciEvtDeviceRemoveAddedResources
 
static EVT_WDFDEVICE_WDM_IRP_PREPROCESS XhciEvtPreprocessSetPower
 
static EVT_WDFDEVICE_WDM_IRP_PREPROCESS XhciEvtPreprocessInternalIoctl
 
static EVT_WDF_OBJECT_CONTEXT_CLEANUP XhciEvtFdoCleanup
 
static EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL XhciEvtIoDeviceControl
 
static EVT_WDF_TIMER XhciEvtWatchdog
 
static EVT_WDF_WORKITEM XhciEvtRecoveryWork
 
static EVT_WDF_WORKITEM XhciEvtIdleTimeoutWork
 
static EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY XhciEvtControllerQueryUsbCapability
 
static EVT_UCX_CONTROLLER_GET_CURRENT_FRAMENUMBER XhciEvtControllerGetCurrentFrameNumber
 
static EVT_UCX_CONTROLLER_RESET XhciEvtControllerReset
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 12 of file hc.cpp.

◆ XHCI_ACPI_GET_DEVICE_INFORMATION

#define XHCI_ACPI_GET_DEVICE_INFORMATION    CTL_CODE(FILE_DEVICE_ACPI, 10, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)

Definition at line 84 of file hc.cpp.

◆ XHCI_ACPI_PARENT_ID

#define XHCI_ACPI_PARENT_ID   0x7FFFFFFF

Definition at line 78 of file hc.cpp.

◆ XHCI_BUGCHECK_USB3_DRIVER

#define XHCI_BUGCHECK_USB3_DRIVER   0x144

Definition at line 80 of file hc.cpp.

◆ XHCI_DEVICE_USED_BY_DEBUGGER

#define XHCI_DEVICE_USED_BY_DEBUGGER   0x02000000

Definition at line 82 of file hc.cpp.

◆ XHCI_IDLE_TIMEOUT_LONG_MS

#define XHCI_IDLE_TIMEOUT_LONG_MS   5000

Definition at line 75 of file hc.cpp.

◆ XHCI_IDLE_TIMEOUT_SHORT_MS

#define XHCI_IDLE_TIMEOUT_SHORT_MS   1

Definition at line 76 of file hc.cpp.

◆ XHCI_PAD_BUFFER_SIZE

#define XHCI_PAD_BUFFER_SIZE   512

Definition at line 77 of file hc.cpp.

◆ XHCI_REASON_HOST_CONTROLLER_ERROR

#define XHCI_REASON_HOST_CONTROLLER_ERROR   0x1002

Definition at line 51 of file hc.cpp.

◆ XHCI_REASON_HOST_SYSTEM_ERROR

#define XHCI_REASON_HOST_SYSTEM_ERROR   0x1001

Definition at line 50 of file hc.cpp.

◆ XHCI_REASON_NO_LIVE_DUMP

#define XHCI_REASON_NO_LIVE_DUMP   0x0000

Definition at line 49 of file hc.cpp.

◆ XHCI_REASON_NOT_SUPPORTED

#define XHCI_REASON_NOT_SUPPORTED   0x100C

Definition at line 55 of file hc.cpp.

◆ XHCI_REASON_OLD_FIRMWARE

#define XHCI_REASON_OLD_FIRMWARE   0x100F

Definition at line 57 of file hc.cpp.

◆ XHCI_REASON_REMOVED

#define XHCI_REASON_REMOVED   0x100D

Definition at line 56 of file hc.cpp.

◆ XHCI_REASON_RESET_FAILED

#define XHCI_REASON_RESET_FAILED   0x1007

Definition at line 52 of file hc.cpp.

◆ XHCI_REASON_RESTART_FAILED

#define XHCI_REASON_RESTART_FAILED   0x1008

Definition at line 53 of file hc.cpp.

◆ XHCI_REASON_START_FAILED

#define XHCI_REASON_START_FAILED   0x101C

Definition at line 58 of file hc.cpp.

◆ XHCI_REASON_STOP_FAILED

#define XHCI_REASON_STOP_FAILED   0x100B

Definition at line 54 of file hc.cpp.

◆ XHCI_REASON_TEST_RESET

#define XHCI_REASON_TEST_RESET   0x103F

Definition at line 59 of file hc.cpp.

◆ XHCI_RECOVER_GONE

#define XHCI_RECOVER_GONE   0x08

Definition at line 44 of file hc.cpp.

◆ XHCI_RECOVER_GONE_PNP

#define XHCI_RECOVER_GONE_PNP   0x10

Definition at line 45 of file hc.cpp.

◆ XHCI_RECOVER_INTERNAL_RESET

#define XHCI_RECOVER_INTERNAL_RESET   0x01

Definition at line 41 of file hc.cpp.

◆ XHCI_RECOVER_NO_RESTART

#define XHCI_RECOVER_NO_RESTART   0x04

Definition at line 43 of file hc.cpp.

◆ XHCI_RECOVER_NONE

#define XHCI_RECOVER_NONE   0x00

Definition at line 40 of file hc.cpp.

◆ XHCI_RECOVER_REPORT_FAILED

#define XHCI_RECOVER_REPORT_FAILED   0x20

Definition at line 46 of file hc.cpp.

◆ XHCI_RECOVER_RESET

#define XHCI_RECOVER_RESET   0x02

Definition at line 42 of file hc.cpp.

◆ XHCI_RESET_LIMIT

#define XHCI_RESET_LIMIT   10

Definition at line 73 of file hc.cpp.

◆ XHCI_RESET_WINDOW_TICKS

#define XHCI_RESET_WINDOW_TICKS   60

Definition at line 74 of file hc.cpp.

◆ XHCI_TEST_RESET_IOCTL

#define XHCI_TEST_RESET_IOCTL   0x00220FB7

Definition at line 81 of file hc.cpp.

◆ XHCI_VERIFY_ALL_ONES

#define XHCI_VERIFY_ALL_ONES   0x00000040

Definition at line 68 of file hc.cpp.

◆ XHCI_VERIFY_FIRMWARE_OUTDATED

#define XHCI_VERIFY_FIRMWARE_OUTDATED   0x00000001

Definition at line 62 of file hc.cpp.

◆ XHCI_VERIFY_HCE

#define XHCI_VERIFY_HCE   0x00000004

Definition at line 64 of file hc.cpp.

◆ XHCI_VERIFY_HSE

#define XHCI_VERIFY_HSE   0x00000002

Definition at line 63 of file hc.cpp.

◆ XHCI_VERIFY_RESET_TIMEOUT

#define XHCI_VERIFY_RESET_TIMEOUT   0x00000010

Definition at line 66 of file hc.cpp.

◆ XHCI_VERIFY_SAVE_RESTORE

#define XHCI_VERIFY_SAVE_RESTORE   0x00400000

Definition at line 69 of file hc.cpp.

◆ XHCI_VERIFY_START_TIMEOUT

#define XHCI_VERIFY_START_TIMEOUT   0x00000020

Definition at line 67 of file hc.cpp.

◆ XHCI_VERIFY_STOP_TIMEOUT

#define XHCI_VERIFY_STOP_TIMEOUT   0x00000008

Definition at line 65 of file hc.cpp.

◆ XHCI_WATCHDOG_PERIOD_MS

#define XHCI_WATCHDOG_PERIOD_MS   5000

Definition at line 71 of file hc.cpp.

◆ XHCI_WATCHDOG_TOLERANCE_MS

#define XHCI_WATCHDOG_TOLERANCE_MS   1000

Definition at line 72 of file hc.cpp.

Typedef Documentation

◆ PFN_XHCI_QUERY_DEVICE_FLAGS

typedef NTSTATUS(NTAPI * PFN_XHCI_QUERY_DEVICE_FLAGS) (_In_ PCWSTR DeviceKey, _In_ PCWSTR Category, _Out_ PULONG64 Flags)

Definition at line 110 of file hc.cpp.

◆ PXHCI_ACPI_DEVICE_INFO

◆ PXHCI_FDO_CONTEXT

◆ PXHCI_OBJECT_CONTEXT

◆ XHCI_ACPI_DEVICE_INFO

Output of the ACPI device information IOCTL (public WDK acpiioct.h layout).

◆ XHCI_FDO_CONTEXT

FDO context; the controller pointer is NULL until AddDevice finished.

◆ XHCI_OBJECT_CONTEXT

Context of the watchdog timer and the work items.

Function Documentation

◆ XhciCopyAcpiId()

static VOID NTAPI XhciCopyAcpiId ( _Out_writes_(MAX_VENDOR_ID_STRING_LENGTH) PCHAR  Destination,
_In_reads_(Length) const CHAR *  Source,
_In_ ULONG  Length 
)
static

Copies Length bytes, stopping at a NUL, into a 5 byte id field.

Definition at line 285 of file hc.cpp.

289{
290 ULONG Index;
291
292 /* Clamp the copy to the 5 byte field */
295
297}
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3169
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:3051
#define ANSI_NULL
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
uint32_t ULONG
Definition: typedefs.h:59
#define MAX_VENDOR_ID_STRING_LENGTH
Definition: ucxcontroller.h:33
_In_ WDFCOLLECTION _In_ ULONG Index

Referenced by XhciQueryAcpiIdentity().

◆ XhciCreateFdo()

static NTSTATUS NTAPI XhciCreateFdo ( _Inout_ PWDFDEVICE_INIT  DeviceInit,
_In_ PWDF_OBJECT_ATTRIBUTES  Attributes,
_Out_ WDFDEVICE *  Device 
)
static

Definition at line 1017 of file hc.cpp.

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}
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
WdfDeviceSetSpecialFileSupport(Device, WdfSpecialFilePaging, TRUE)
Definition: bufpool.h:45
LPWSTR Name
Definition: desk.c:124
_In_ ULONG Attributes
Definition: dispmprt.h:1077
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define L(x)
Definition: resources.c:13
Status
Definition: gdiplustypes.h:24
static const GUID XhciGuidBusTypeUsb
Definition: hc.cpp:20
static const GUID XhciGuidHostControllerInterface
Definition: hc.cpp:22
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
Definition: hubucx.h:258
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
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
short WCHAR
Definition: pedump.c:58
@ PNPBus
Definition: restypes.h:137
INTERFACE_TYPE LegacyBusType
Definition: cmtypes.h:366
#define STATUS_OBJECT_NAME_COLLISION
Definition: udferr_usr.h:150
_In_ PWDFDEVICE_INIT DeviceInit
Definition: wdfcontrol.h:113
#define DECLARE_CONST_UNICODE_STRING(_variablename, _string)
Definition: wdfcore.h:161
@ 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_ PWDF_WMI_INSTANCE_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_opt_ WDFWMIINSTANCE * Instance
Definition: wdfwmi.h:481

Referenced by XhciEvtDeviceAdd().

◆ XhciEvaluateAcpiMethod()

static VOID NTAPI XhciEvaluateAcpiMethod ( _In_ WDFDEVICE  Device,
_In_reads_bytes_(InputSize) PVOID  Input,
_In_ ULONG  InputSize 
)
static

Definition at line 663 of file hc.cpp.

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}
#define ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE
Definition: acpiioct.h:16
#define IOCTL_ACPI_EVAL_METHOD
Definition: acpiioct.h:194
_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 DPRINT
Definition: sndvol32.h:73
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
PUSB_ROOT_HUB_NAME Output
Definition: userreq.cpp:699
FORCEINLINE VOID WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(_Out_ PWDF_MEMORY_DESCRIPTOR Descriptor, _In_ PVOID Buffer, _In_ ULONG BufferLength)
Definition: wdfmemory.h:102

Referenced by XhciController::EvaluateDsm(), and XhciController::EvaluatePrmi().

◆ XhciEvtControllerEnableForwardProgress()

static NTSTATUS NTAPI XhciEvtControllerEnableForwardProgress ( _In_ UCXCONTROLLER  UcxController)
static

Definition at line 2604 of file hc.cpp.

2606{
2608 return STATUS_SUCCESS;
2609}
BOOLEAN m_ReservedIoArmed
Definition: hc.h:114
static XhciController * FromUcx(_In_ UCXCONTROLLER UcxController)
Definition: hc.cpp:176
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtControllerGetCurrentFrameNumber()

static NTSTATUS NTAPI XhciEvtControllerGetCurrentFrameNumber ( _In_ UCXCONTROLLER  UcxController,
_Out_ PULONG  FrameNumber 
)
static

Definition at line 2583 of file hc.cpp.

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}
_Out_ PULONG FrameNumber
Definition: ucxcontroller.h:94

◆ XhciEvtControllerQueryUsbCapability()

static NTSTATUS NTAPI XhciEvtControllerQueryUsbCapability ( _In_ UCXCONTROLLER  UcxController,
_In_ PGUID  CapabilityType,
_In_ ULONG  OutputBufferLength,
_Out_writes_bytes_opt_(OutputBufferLength) PVOID  OutputBuffer,
_Out_ PULONG  ResultLength 
)
static

Definition at line 2569 of file hc.cpp.

2575{
2578}
NTSTATUS QueryUsbCapability(_In_ const GUID *Capability, _In_ ULONG OutputBufferLength, _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, _Out_ PULONG ResultLength)
Definition: hc.cpp:2210
_In_ PGUID _In_ ULONG _Out_ PULONG ResultLength
Definition: ucxcontroller.h:83
_In_ PGUID CapabilityType
Definition: ucxcontroller.h:80
_In_ PGUID _In_ ULONG OutputBufferLength
Definition: ucxcontroller.h:81
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
Definition: wdfiotarget.h:863

◆ XhciEvtControllerReset()

static VOID NTAPI XhciEvtControllerReset ( _In_ UCXCONTROLLER  UcxController)
static

Definition at line 2595 of file hc.cpp.

2597{
2599}
VOID UcxReset()
Definition: hc.cpp:2193

◆ XhciEvtDeviceAdd()

NTSTATUS NTAPI XhciEvtDeviceAdd ( _In_ WDFDRIVER  Driver,
_Inout_ PWDFDEVICE_INIT  DeviceInit 
)

Definition at line 1096 of file hc.cpp.

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}
#define PAGED_CODE()
static GLfloat Identity[16]
Definition: matrix.c:127
int Fail
Definition: ehthrow.cxx:24
static EVT_WDF_DEVICE_WAKE_FROM_S0_TRIGGERED XhciEvtDeviceWakeFromS0Triggered
Definition: hc.cpp:143
static EVT_WDF_DEVICE_ARM_WAKE_FROM_S0 XhciEvtDeviceArmWakeFromS0
Definition: hc.cpp:141
static EVT_WDF_DEVICE_D0_ENTRY_POST_INTERRUPTS_ENABLED XhciEvtDeviceD0EntryPostInterruptsEnabled
Definition: hc.cpp:135
static EVT_UCX_CONTROLLER_GET_CURRENT_FRAMENUMBER XhciEvtControllerGetCurrentFrameNumber
Definition: hc.cpp:157
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_UCX_CONTROLLER_QUERY_USB_CAPABILITY XhciEvtControllerQueryUsbCapability
Definition: hc.cpp:156
static NTSTATUS NTAPI XhciQueryIdentity(_In_ WDFDEVICE Device, _Out_ XhciIdentity *Id)
Definition: hc.cpp:388
static EVT_WDFDEVICE_WDM_IRP_PREPROCESS XhciEvtPreprocessInternalIoctl
Definition: hc.cpp:150
static EVT_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS XhciEvtDeviceFilterAddResourceRequirements
Definition: hc.cpp:147
static EVT_WDF_DEVICE_DISARM_WAKE_FROM_S0 XhciEvtDeviceDisarmWakeFromS0
Definition: hc.cpp:142
static EVT_WDF_OBJECT_CONTEXT_CLEANUP XhciEvtFdoCleanup
Definition: hc.cpp:151
static EVT_WDF_DEVICE_PREPARE_HARDWARE XhciEvtDevicePrepareHardware
Definition: hc.cpp:132
static EVT_WDFDEVICE_WDM_IRP_PREPROCESS XhciEvtPreprocessSetPower
Definition: hc.cpp:149
static EVT_WDF_DEVICE_D0_EXIT_PRE_INTERRUPTS_DISABLED XhciEvtDeviceD0ExitPreInterruptsDisabled
Definition: hc.cpp:136
static EVT_WDF_DEVICE_REMOVE_ADDED_RESOURCES XhciEvtDeviceRemoveAddedResources
Definition: hc.cpp:148
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 EVT_UCX_CONTROLLER_RESET XhciEvtControllerReset
Definition: hc.cpp:158
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 EVT_WDF_DEVICE_D0_EXIT XhciEvtDeviceD0Exit
Definition: hc.cpp:137
static EVT_WDF_DEVICE_DISARM_WAKE_FROM_SX XhciEvtDeviceDisarmWakeFromSx
Definition: hc.cpp:145
static EVT_WDF_DEVICE_D0_ENTRY XhciEvtDeviceD0Entry
Definition: hc.cpp:134
static NTSTATUS NTAPI XhciEvtControllerEnableForwardProgress(_In_ UCXCONTROLLER UcxController)
Definition: hc.cpp:2604
XhciDriverData XhciDriver
Definition: xhcientry.cpp:23
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
BOOLEAN TestMode
Definition: hc.h:293
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_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
unsigned char UCHAR
Definition: typedefs.h:53
PVOID HANDLE
Definition: typedefs.h:73
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXCONTROLLER * Controller
@ UcxControllerParentBusTypeAcpi
Definition: ucxcontroller.h:18
FORCEINLINE VOID NTAPI UCX_CONTROLLER_CONFIG_INIT(_Out_ PUCX_CONTROLLER_CONFIG Config, _In_ LPCSTR DeviceDescription)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG Config
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)
_Must_inspect_result_ _In_ WDFDRIVER Driver
Definition: wdfcontrol.h:83
@ WdfReleaseHardwareOrderOnFailureAfterDescendants
Definition: wdfdevice.h:476
FORCEINLINE VOID WDF_PNPPOWER_EVENT_CALLBACKS_INIT(_Out_ PWDF_PNPPOWER_EVENT_CALLBACKS Callbacks)
Definition: wdfdevice.h:1214
FORCEINLINE VOID WDF_POWER_POLICY_EVENT_CALLBACKS_INIT(_Out_ PWDF_POWER_POLICY_EVENT_CALLBACKS Callbacks)
Definition: wdfdevice.h:1203
FORCEINLINE VOID WDF_FDO_EVENT_CALLBACKS_INIT(_Out_ PWDF_FDO_EVENT_CALLBACKS Callbacks)
Definition: wdffdo.h:101
#define WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(_attributes, _contexttype)
Definition: wdfobject.h:170
#define IRP_MN_SET_POWER
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
#define IRP_MJ_POWER
EVT_UCX_CONTROLLER_USBDEVICE_ADD XhciEvtControllerUsbDeviceAdd
Definition: xhcidrv.h:44

◆ XhciEvtDeviceArmWakeFromS0()

static NTSTATUS NTAPI XhciEvtDeviceArmWakeFromS0 ( _In_ WDFDEVICE  Device)
static

Definition at line 2378 of file hc.cpp.

2380{
2382 return STATUS_SUCCESS;
2383}
static XhciController * FromDevice(_In_ WDFDEVICE Device)
Definition: hc.cpp:169
VOID SetPortWake(_In_ BOOLEAN Arm)
Definition: hc.cpp:836

◆ XhciEvtDeviceArmWakeFromSx()

static NTSTATUS NTAPI XhciEvtDeviceArmWakeFromSx ( _In_ WDFDEVICE  Device)
static

Definition at line 2406 of file hc.cpp.

2408{
2410 return STATUS_SUCCESS;
2411}
BOOLEAN m_WaitWakeQueued
Definition: hc.h:203

◆ XhciEvtDeviceD0Entry()

static NTSTATUS NTAPI XhciEvtDeviceD0Entry ( _In_ WDFDEVICE  Device,
_In_ WDF_POWER_DEVICE_STATE  PreviousState 
)
static

Definition at line 2304 of file hc.cpp.

2307{
2309}
NTSTATUS D0Entry(_In_ WDF_POWER_DEVICE_STATE PreviousState)
Definition: hc.cpp:1357
_In_ WDF_POWER_DEVICE_STATE PreviousState
Definition: wdfdevice.h:829

◆ XhciEvtDeviceD0EntryPostInterruptsEnabled()

static NTSTATUS NTAPI XhciEvtDeviceD0EntryPostInterruptsEnabled ( _In_ WDFDEVICE  Device,
_In_ WDF_POWER_DEVICE_STATE  PreviousState 
)
static

Definition at line 2314 of file hc.cpp.

2317{
2319}
NTSTATUS D0EntryPostInterruptsEnabled(_In_ WDF_POWER_DEVICE_STATE PreviousState)
Definition: hc.cpp:1574

◆ XhciEvtDeviceD0Exit()

static NTSTATUS NTAPI XhciEvtDeviceD0Exit ( _In_ WDFDEVICE  Device,
_In_ WDF_POWER_DEVICE_STATE  TargetState 
)
static

Definition at line 2337 of file hc.cpp.

2340{
2342 return STATUS_SUCCESS;
2343}
VOID D0Exit(_In_ WDF_POWER_DEVICE_STATE TargetState)
Definition: hc.cpp:1613
_In_ WDF_POWER_DEVICE_STATE TargetState
Definition: wdfdevice.h:859

◆ XhciEvtDeviceD0ExitPreInterruptsDisabled()

static NTSTATUS NTAPI XhciEvtDeviceD0ExitPreInterruptsDisabled ( _In_ WDFDEVICE  Device,
_In_ WDF_POWER_DEVICE_STATE  TargetState 
)
static

Definition at line 2324 of file hc.cpp.

◆ XhciEvtDeviceDisarmWakeFromS0()

static VOID NTAPI XhciEvtDeviceDisarmWakeFromS0 ( _In_ WDFDEVICE  Device)
static

Definition at line 2388 of file hc.cpp.

2390{
2392}
#define FALSE
Definition: types.h:117

◆ XhciEvtDeviceDisarmWakeFromSx()

static VOID NTAPI XhciEvtDeviceDisarmWakeFromSx ( _In_ WDFDEVICE  Device)
static

Definition at line 2416 of file hc.cpp.

◆ XhciEvtDeviceFilterAddResourceRequirements()

static NTSTATUS NTAPI XhciEvtDeviceFilterAddResourceRequirements ( _In_ WDFDEVICE  Device,
_In_ WDFIORESREQLIST  IoResourceRequirementsList 
)
static

Definition at line 2440 of file hc.cpp.

2443{
2445
2446 if (Controller == NULL)
2447 return STATUS_SUCCESS;
2448
2449 return Controller->m_Interrupters.AffinitizeResourceRequirements(IoResourceRequirementsList);
2450}
_In_ WDFIORESREQLIST IoResourceRequirementsList
Definition: wdfpdo.h:78

◆ XhciEvtDeviceFilterRemoveResourceRequirements()

static NTSTATUS NTAPI XhciEvtDeviceFilterRemoveResourceRequirements ( _In_ WDFDEVICE  Device,
_In_ WDFIORESREQLIST  IoResourceRequirementsList 
)
static

Definition at line 2425 of file hc.cpp.

2428{
2430
2431 if (Controller == NULL)
2432 return STATUS_SUCCESS;
2433
2434 return Controller->m_Interrupters.FilterResourceRequirements(IoResourceRequirementsList);
2435}

◆ XhciEvtDevicePrepareHardware()

static NTSTATUS NTAPI XhciEvtDevicePrepareHardware ( _In_ WDFDEVICE  Device,
_In_ WDFCMRESLIST  ResourcesRaw,
_In_ WDFCMRESLIST  ResourcesTranslated 
)
static

Definition at line 2280 of file hc.cpp.

2284{
2286}
NTSTATUS PrepareHardware(_In_ WDFCMRESLIST Raw, _In_ WDFCMRESLIST Translated)
Definition: hc.cpp:1254
_In_ WDFCMRESLIST _In_ WDFCMRESLIST ResourcesTranslated
Definition: wdfdevice.h:891
_In_ WDFCMRESLIST ResourcesRaw
Definition: wdfdevice.h:888

◆ XhciEvtDeviceReleaseHardware()

static NTSTATUS NTAPI XhciEvtDeviceReleaseHardware ( _In_ WDFDEVICE  Device,
_In_ WDFCMRESLIST  ResourcesTranslated 
)
static

Definition at line 2291 of file hc.cpp.

◆ XhciEvtDeviceRemoveAddedResources()

static NTSTATUS NTAPI XhciEvtDeviceRemoveAddedResources ( _In_ WDFDEVICE  Device,
_In_ WDFCMRESLIST  ResourcesRaw,
_In_ WDFCMRESLIST  ResourcesTranslated 
)
static

Definition at line 2455 of file hc.cpp.

◆ XhciEvtDeviceSelfManagedIoCleanup()

static VOID NTAPI XhciEvtDeviceSelfManagedIoCleanup ( _In_ WDFDEVICE  Device)
static

Definition at line 2358 of file hc.cpp.

2360{
2362}
VOID SelfManagedIoCleanup()
Definition: hc.cpp:1722

◆ XhciEvtDeviceSelfManagedIoInit()

static NTSTATUS NTAPI XhciEvtDeviceSelfManagedIoInit ( _In_ WDFDEVICE  Device)
static

Definition at line 2348 of file hc.cpp.

2350{
2352 return STATUS_SUCCESS;
2353}
VOID SelfManagedIoInit()
Definition: hc.cpp:1668

◆ XhciEvtDeviceUsageNotification()

static VOID NTAPI XhciEvtDeviceUsageNotification ( _In_ WDFDEVICE  Device,
_In_ WDF_SPECIAL_FILE_TYPE  NotificationType,
_In_ BOOLEAN  IsInNotificationPath 
)
static

Definition at line 2367 of file hc.cpp.

2371{
2373}
VOID UsageNotification(_In_ WDF_SPECIAL_FILE_TYPE Type, _In_ BOOLEAN InPath)
Definition: hc.cpp:1734
_In_ WDF_SPECIAL_FILE_TYPE _In_ BOOLEAN IsInNotificationPath
Definition: wdfdevice.h:1027
_In_ WDF_SPECIAL_FILE_TYPE NotificationType
Definition: wdfdevice.h:1024

◆ XhciEvtDeviceWakeFromS0Triggered()

static VOID NTAPI XhciEvtDeviceWakeFromS0Triggered ( _In_ WDFDEVICE  Device)
static

Definition at line 2397 of file hc.cpp.

2399{
2401}
XhciRootHub m_RootHub
Definition: hc.h:96
VOID SignalPortChange()
Definition: rootports.cpp:956

◆ XhciEvtFdoCleanup()

static VOID NTAPI XhciEvtFdoCleanup ( _In_ WDFOBJECT  Object)
static

Definition at line 1242 of file hc.cpp.

1244{
1245 XhciController* Controller = XhciGetFdoContext((WDFDEVICE)Object)->Controller;
1246
1247 if (Controller != NULL)
1249}
VOID FdoCleanup()
Definition: hc.cpp:1229
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object

◆ XhciEvtIdleTimeoutWork()

static VOID NTAPI XhciEvtIdleTimeoutWork ( _In_ WDFWORKITEM  WorkItem)
static

Definition at line 2558 of file hc.cpp.

2560{
2561 XhciGetObjectContext(WorkItem)->Controller->IdleTimeoutWorker();
2562}
_In_opt_ PVOID _In_ PUCXHUB_WORKITEM WorkItem
Definition: hubucx.h:227

◆ XhciEvtIoDeviceControl()

static VOID NTAPI XhciEvtIoDeviceControl ( _In_ WDFQUEUE  Queue,
_In_ WDFREQUEST  Request,
_In_ size_t  OutputBufferLength,
_In_ size_t  InputBufferLength,
_In_ ULONG  IoControlCode 
)
static

Definition at line 2514 of file hc.cpp.

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}
#define UserMode
Definition: asm.h:39
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
_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
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
Definition: wdfdevice.h:2231

◆ XhciEvtPreprocessInternalIoctl()

static NTSTATUS NTAPI XhciEvtPreprocessInternalIoctl ( _In_ WDFDEVICE  Device,
_Inout_ PIRP  Irp 
)
static

Definition at line 2492 of file hc.cpp.

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}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
WdfDeviceWdmDispatchPreprocessedIrp(Device, Irp)
#define XHCI_TEST_RESET_IOCTL
Definition: hc.cpp:81
#define XHCI_REASON_TEST_RESET
Definition: hc.cpp:59
_In_ PIRP Irp
Definition: kse.h:79
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
#define IoCompleteRequest
Definition: irp.c:1272
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639
#define IO_NO_INCREMENT
Definition: iotypes.h:598

◆ XhciEvtPreprocessSetPower()

static NTSTATUS NTAPI XhciEvtPreprocessSetPower ( _In_ WDFDEVICE  Device,
_Inout_ PIRP  Irp 
)
static

Definition at line 2470 of file hc.cpp.

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}
_In_ SYSTEM_POWER_STATE SystemPowerState
Definition: iotypes.h:7535

◆ XhciEvtRecoveryWork()

static VOID NTAPI XhciEvtRecoveryWork ( _In_ WDFWORKITEM  WorkItem)
static

Definition at line 2549 of file hc.cpp.

2551{
2552 XhciGetObjectContext(WorkItem)->Controller->RecoveryWorker();
2553}

◆ XhciEvtWatchdog()

static VOID NTAPI XhciEvtWatchdog ( _In_ WDFTIMER  Timer)
static

Definition at line 2540 of file hc.cpp.

2542{
2543 XhciGetObjectContext(Timer)->Controller->WatchdogTick();
2544}

◆ XhciFirmwareCommandDone()

static VOID NTAPI XhciFirmwareCommandDone ( _In_ XhciCommand *  Command)
static

Definition at line 1498 of file hc.cpp.

1500{
1502}
Definition: shell.h:41

Referenced by XhciSendFirmwareCommand().

◆ XhciPackFrameSnapshot()

static LONG64 NTAPI XhciPackFrameSnapshot ( _In_ ULONG  Frame,
_In_ ULONG64  Now 
)
static

Definition at line 1795 of file hc.cpp.

1798{
1799 ULONG64 Base = Now - (Frame & 0x7FF);
1800
1801 return (LONG64)((Base << 21) | ((Frame >> 11) & 0x1FFFFF));
1802}
Walk Base
Definition: desccheck.cpp:2270
unsigned __int64 ULONG64
Definition: imports.h:198
struct tm * Now
Definition: output.c:19
int64_t LONG64
Definition: typedefs.h:68

Referenced by XhciController::InitFrameSnapshot().

◆ XhciQueryAcpiIdentity()

static NTSTATUS NTAPI XhciQueryAcpiIdentity ( _In_ WDFDEVICE  Device,
_Inout_ XhciIdentity *  Id 
)
static

Definition at line 302 of file hc.cpp.

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}
DWORD Id
Definition: Header.h:9
#define NonPagedPool
Definition: env_spec_w32.h:307
#define XHCI_ACPI_GET_DEVICE_INFORMATION
Definition: hc.cpp:84
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
#define XHCI_ACPI_PARENT_ID
Definition: hc.cpp:78
struct _XHCI_ACPI_DEVICE_INFO * PXHCI_ACPI_DEVICE_INFO
ULONG Returned
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
static PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
Definition: precomp.h:45
#define STATUS_ACPI_INVALID_DATA
Definition: ntstatus.h:1662
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
NTSTRSAFEAPI RtlStringCbCopyA(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cbDest, _In_ NTSTRSAFE_PCSTR pszSrc)
Definition: ntstrsafe.h:156
char CHAR
Definition: pedump.c:57
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_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_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG DeviceOffset
Definition: wdfiotarget.h:865
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306
#define XHCI_TAG_CONTROLLER
Definition: xhciutil.h:12

Referenced by XhciQueryIdentity().

◆ XhciQueryIdentity()

static NTSTATUS NTAPI XhciQueryIdentity ( _In_ WDFDEVICE  Device,
_Out_ XhciIdentity *  Id 
)
static

Definition at line 388 of file hc.cpp.

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}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:164
static NTSTATUS NTAPI XhciQueryPciIdentity(_In_ WDFDEVICE Device, _Inout_ XhciIdentity *Id)
Definition: hc.cpp:209
static NTSTATUS NTAPI XhciQueryAcpiIdentity(_In_ WDFDEVICE Device, _Inout_ XhciIdentity *Id)
Definition: hc.cpp:302
#define XHCI_FIRMWARE_UNKNOWN
Definition: hc.h:21
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
@ UcxControllerParentBusTypePci
Definition: ucxcontroller.h:17
@ DevicePropertyEnumeratorName
Definition: iotypes.h:1210

Referenced by XhciEvtDeviceAdd().

◆ XhciQueryPciIdentity()

static NTSTATUS NTAPI XhciQueryPciIdentity ( _In_ WDFDEVICE  Device,
_Inout_ XhciIdentity *  Id 
)
static

Definition at line 209 of file hc.cpp.

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}
static const GUID XhciGuidBusInterfaceStandard
Definition: hc.cpp:16
_In_ UINT Bytes
Definition: mmcopy.h:9
static WCHAR Address[46]
Definition: ping.c:68
PVOID Context
Definition: miniport.h:123
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
#define PCI_WHICHSPACE_CONFIG
Definition: iotypes.h:3659
@ DevicePropertyAddress
Definition: iotypes.h:1211
@ DevicePropertyBusNumber
Definition: iotypes.h:1209

Referenced by XhciQueryIdentity().

◆ XhciSendFirmwareCommand()

static BOOLEAN NTAPI XhciSendFirmwareCommand ( _In_ XhciController *  Controller,
_In_ ULONG  Type,
_Out_ PULONG  Parameter 
)
static

Sends one vendor firmware query; TRUE with the completion parameter on success.

Definition at line 1508 of file hc.cpp.

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}
Type
Definition: Type.h:7
static VOID NTAPI XhciFirmwareCommandDone(_In_ XhciCommand *Command)
Definition: hc.cpp:1498
_Inout_opt_ PVOID Parameter
Definition: rtltypes.h:336
#define XHCI_TRB_TYPE_SHIFT
Definition: xhcihw.h:23

Referenced by XhciController::RunFirmwareCommands().

Variable Documentation

◆ XhciEvtControllerGetCurrentFrameNumber

EVT_UCX_CONTROLLER_GET_CURRENT_FRAMENUMBER XhciEvtControllerGetCurrentFrameNumber
static

Definition at line 157 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtControllerQueryUsbCapability

EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY XhciEvtControllerQueryUsbCapability
static

Definition at line 156 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtControllerReset

EVT_UCX_CONTROLLER_RESET XhciEvtControllerReset
static

Definition at line 158 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDeviceArmWakeFromS0

EVT_WDF_DEVICE_ARM_WAKE_FROM_S0 XhciEvtDeviceArmWakeFromS0
static

Definition at line 141 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDeviceArmWakeFromSx

EVT_WDF_DEVICE_ARM_WAKE_FROM_SX XhciEvtDeviceArmWakeFromSx
static

Definition at line 144 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDeviceD0Entry

EVT_WDF_DEVICE_D0_ENTRY XhciEvtDeviceD0Entry
static

Definition at line 134 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDeviceD0EntryPostInterruptsEnabled

EVT_WDF_DEVICE_D0_ENTRY_POST_INTERRUPTS_ENABLED XhciEvtDeviceD0EntryPostInterruptsEnabled
static

Definition at line 135 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDeviceD0Exit

EVT_WDF_DEVICE_D0_EXIT XhciEvtDeviceD0Exit
static

Definition at line 137 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDeviceD0ExitPreInterruptsDisabled

EVT_WDF_DEVICE_D0_EXIT_PRE_INTERRUPTS_DISABLED XhciEvtDeviceD0ExitPreInterruptsDisabled
static

Definition at line 136 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDeviceDisarmWakeFromS0

EVT_WDF_DEVICE_DISARM_WAKE_FROM_S0 XhciEvtDeviceDisarmWakeFromS0
static

Definition at line 142 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDeviceDisarmWakeFromSx

EVT_WDF_DEVICE_DISARM_WAKE_FROM_SX XhciEvtDeviceDisarmWakeFromSx
static

Definition at line 145 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDeviceFilterAddResourceRequirements

EVT_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS XhciEvtDeviceFilterAddResourceRequirements
static

Definition at line 147 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDeviceFilterRemoveResourceRequirements

EVT_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS XhciEvtDeviceFilterRemoveResourceRequirements
static

Definition at line 146 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDevicePrepareHardware

EVT_WDF_DEVICE_PREPARE_HARDWARE XhciEvtDevicePrepareHardware
static

Definition at line 132 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDeviceReleaseHardware

EVT_WDF_DEVICE_RELEASE_HARDWARE XhciEvtDeviceReleaseHardware
static

Definition at line 133 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDeviceRemoveAddedResources

EVT_WDF_DEVICE_REMOVE_ADDED_RESOURCES XhciEvtDeviceRemoveAddedResources
static

Definition at line 148 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDeviceSelfManagedIoCleanup

EVT_WDF_DEVICE_SELF_MANAGED_IO_CLEANUP XhciEvtDeviceSelfManagedIoCleanup
static

Definition at line 139 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDeviceSelfManagedIoInit

EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT XhciEvtDeviceSelfManagedIoInit
static

Definition at line 138 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDeviceUsageNotification

EVT_WDF_DEVICE_USAGE_NOTIFICATION XhciEvtDeviceUsageNotification
static

Definition at line 140 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtDeviceWakeFromS0Triggered

EVT_WDF_DEVICE_WAKE_FROM_S0_TRIGGERED XhciEvtDeviceWakeFromS0Triggered
static

Definition at line 143 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtFdoCleanup

EVT_WDF_OBJECT_CONTEXT_CLEANUP XhciEvtFdoCleanup
static

Definition at line 151 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtIdleTimeoutWork

EVT_WDF_WORKITEM XhciEvtIdleTimeoutWork
static

Definition at line 155 of file hc.cpp.

Referenced by XhciController::CreateWdfObjects().

◆ XhciEvtIoDeviceControl

EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL XhciEvtIoDeviceControl
static

Definition at line 152 of file hc.cpp.

Referenced by XhciController::Initialize().

◆ XhciEvtPreprocessInternalIoctl

EVT_WDFDEVICE_WDM_IRP_PREPROCESS XhciEvtPreprocessInternalIoctl
static

Definition at line 150 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtPreprocessSetPower

EVT_WDFDEVICE_WDM_IRP_PREPROCESS XhciEvtPreprocessSetPower
static

Definition at line 149 of file hc.cpp.

Referenced by XhciEvtDeviceAdd().

◆ XhciEvtRecoveryWork

EVT_WDF_WORKITEM XhciEvtRecoveryWork
static

Definition at line 154 of file hc.cpp.

Referenced by XhciController::CreateWdfObjects().

◆ XhciEvtWatchdog

EVT_WDF_TIMER XhciEvtWatchdog
static

Definition at line 153 of file hc.cpp.

Referenced by XhciController::CreateWdfObjects().

◆ XhciGuidBusInterfaceStandard

const GUID XhciGuidBusInterfaceStandard
static
Initial value:
=
{ 0x496b8280, 0x6f25, 0x11d0, { 0xbe, 0xaf, 0x08, 0x00, 0x2b, 0xe2, 0x09, 0x2f } }

Definition at line 16 of file hc.cpp.

Referenced by XhciQueryPciIdentity().

◆ XhciGuidBusTypeUsb

const GUID XhciGuidBusTypeUsb
static
Initial value:
=
{ 0x9d7debbc, 0xc85d, 0x11d1, { 0x9e, 0xb4, 0x00, 0x60, 0x08, 0xc3, 0xa1, 0x9a } }

Definition at line 20 of file hc.cpp.

Referenced by XhciCreateFdo().

◆ XhciGuidChainedMdls

const GUID XhciGuidChainedMdls
static
Initial value:
=
{ 0xf5ceeb23, 0xad90, 0x458c, { 0x97, 0x9a, 0xd5, 0x9b, 0x3a, 0xd6, 0x88, 0x4f } }

Definition at line 24 of file hc.cpp.

Referenced by XhciController::QueryUsbCapability().

◆ XhciGuidClearTtBufferOnCancel

const GUID XhciGuidClearTtBufferOnCancel
static
Initial value:
=
{ 0x09b76d52, 0x0a6d, 0x4e4f, { 0xa9, 0x11, 0xd0, 0x36, 0xd1, 0x92, 0x94, 0x97 } }

Definition at line 34 of file hc.cpp.

Referenced by XhciController::QueryUsbCapability().

◆ XhciGuidD3ColdSupport

const GUID XhciGuidD3ColdSupport
static
Initial value:
=
{ 0xb38290e5, 0x3cd0, 0x4f9d, { 0x99, 0x37, 0xf5, 0xfe, 0x2b, 0x44, 0xd4, 0x7a } }

Definition at line 18 of file hc.cpp.

Referenced by XhciController::ConfigureS0Idle().

◆ XhciGuidDsm

const GUID XhciGuidDsm
static
Initial value:
=
{ 0xac340cb7, 0xe901, 0x45bf, { 0xb7, 0xe6, 0x2b, 0x34, 0xec, 0x93, 0x1e, 0x23 } }

Definition at line 36 of file hc.cpp.

Referenced by XhciController::EvaluateDsm().

◆ XhciGuidFunctionSuspend

const GUID XhciGuidFunctionSuspend
static
Initial value:
=
{ 0xf4563183, 0xd66e, 0x42bd, { 0xbd, 0x53, 0x1a, 0xc7, 0xb0, 0x4c, 0xd5, 0x9d } }

Definition at line 30 of file hc.cpp.

Referenced by XhciController::QueryUsbCapability().

◆ XhciGuidHighBandwidthIsoch

const GUID XhciGuidHighBandwidthIsoch
static
Initial value:
=
{ 0x9c8a8a27, 0x15f9, 0x42e3, { 0xa3, 0x56, 0xcd, 0xa6, 0xae, 0x97, 0xa8, 0xc8 } }

Definition at line 32 of file hc.cpp.

Referenced by XhciController::QueryUsbCapability().

◆ XhciGuidHostControllerInterface

const GUID XhciGuidHostControllerInterface
static
Initial value:
=
{ 0x3abf6f2d, 0x71c4, 0x462a, { 0x8a, 0x92, 0x1e, 0x68, 0x61, 0xe6, 0xaf, 0x27 } }

Definition at line 22 of file hc.cpp.

Referenced by XhciCreateFdo().

◆ XhciGuidSelectiveSuspend

const GUID XhciGuidSelectiveSuspend
static
Initial value:
=
{ 0x755c630d, 0xc8a0, 0x4765, { 0x94, 0x6f, 0x90, 0xcc, 0x70, 0x38, 0x56, 0xa4 } }

Definition at line 28 of file hc.cpp.

Referenced by XhciController::QueryUsbCapability().

◆ XhciGuidStaticStreams

const GUID XhciGuidStaticStreams
static
Initial value:
=
{ 0x09051e1f, 0x0dc9, 0x4e6b, { 0x8b, 0x12, 0x96, 0x0c, 0xbd, 0x81, 0xaa, 0x8f } }

Definition at line 26 of file hc.cpp.

Referenced by XhciController::QueryUsbCapability().