16 L"D:P(A;;GA;;;SY)(A;;GRGWGX;;;BA)(A;;GRGW;;;WD)(A;;GR;;;RC)");
21#define UCX_ROOT_HUB_ID L"USB\\ROOT_HUB30"
27#define UCX_HWID_FULL_CHARS RTL_NUMBER_OF(UCX_ROOT_HUB_ID L"&VID0000&PID0000&REV0000")
28#define UCX_HWID_SHORT_CHARS RTL_NUMBER_OF(UCX_ROOT_HUB_ID L"&VID0000&PID0000")
29#define UCX_HWID_PLAIN_CHARS RTL_NUMBER_OF(UCX_ROOT_HUB_ID)
30#define UCX_HWID_BUFFER_CHARS ((UCX_HWID_FULL_CHARS + UCX_HWID_SHORT_CHARS + UCX_HWID_PLAIN_CHARS + 1) * sizeof(WCHAR))
141 WCHAR NameBuffer[64];
154 WdfDeviceSetBusInformationForChildren(
Fdo, &BusInfo);
156 Init = WdfPdoInitAllocate(
Fdo);
159 DPRINT1(
"Root hub PDO init allocation failed\n");
165 Status = WdfPdoInitAssignDeviceID(
Init, &DeviceId);
169 Status = WdfPdoInitAddHardwareID(
Init, &HardwareIds);
177 Status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
Init,
185 Status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
Init,
193 Status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
Init,
202 DPRINT1(
"Root hub PDO ID or preprocess setup failed 0x%lx\n",
Status);
203 WdfDeviceInitFree(
Init);
215 WdfDeviceInitSetPnpPowerEventCallbacks(
Init, &PnpPower);
220 WdfPdoInitSetEventCallbacks(
Init, &PdoCallbacks);
236 Status = WdfDeviceInitAssignSDDLString(
Init, &UcxRootHubPdoSddl);
249 WdfDeviceInitFree(
Init);
280 PdoContext = UcxGetRootHubPdoContext(
Pdo);
285 Status = WdfDeviceCreateDeviceInterface(
Pdo, &GUID_DEVINTERFACE_USB_HUB,
NULL);
288 DPRINT1(
"Root hub PDO %p hub interface create failed 0x%lx\n",
Pdo,
Status);
314 { { 0x3ab22e31, 0x8264, 0x4b4e, { 0x9a, 0xf5, 0xa8, 0xd2, 0xd8, 0xe3, 0x3e, 0x62 } }, 40 };
316 { { 0x3ab22e31, 0x8264, 0x4b4e, { 0x9a, 0xf5, 0xa8, 0xd2, 0xd8, 0xe3, 0x3e, 0x62 } }, 42 };
318 { { 0x3ab22e31, 0x8264, 0x4b4e, { 0x9a, 0xf5, 0xa8, 0xd2, 0xd8, 0xe3, 0x3e, 0x62 } }, 45 };
325UcxRootHubCopyPciProperties(
375 DPRINT1(
"Root hub PDO %p USB4 port attributes assign failed 0x%lx\n",
Pdo,
Status);
387 DPRINT1(
"Root hub PDO %p serial number assign failed 0x%lx\n",
Pdo,
Status);
422 Status = WdfDeviceRetrieveDeviceInterfaceString(
Device, &GUID_DEVINTERFACE_USB_HUB,
NULL,
Name);
431 Context->Controller->m_ClearTtBufferOnAsyncCancel =
Context->Controller->QueryClearTtBufferOnCancel();
440 UcxRootHubCopyPciProperties(
Context->Controller->m_Fdo,
Device);
527 if (!
State->LastTransferCanceled)
528 State->PortChangeGeneration++;
534 WakeNow = (
State->PortChangeGeneration !=
State->PortChangeGenerationProcessed);
554 DPRINT1(
"Root hub PDO %p wake arm failed, controller reset in progress\n",
Device);
661 Irp->IoStatus.Information = 0;
698 DPRINT1(
"Controller %p has no reset callback, failing async port reset\n",
Controller);
739 DPRINT1(
"Root hub PDO internal IOCTL 0x%lx not supported, IRP %p\n",
Code,
Irp);
803 RootHub->m_SystemPowerAction =
Stack->Parameters.Power.ShutdownType;
826 PVOID Payload =
Stack->Parameters.Others.Argument1;
832 if (
Irp->PendingReturned)
835 switch (
Stack->Parameters.DeviceIoControl.IoControlCode)
847 if (
Device->m_ResetFailedByControllerReset)
856 if (
Device->m_EndpointResetFailedByControllerReset)
858 Device->m_EndpointResetFailedByControllerReset =
FALSE;
884 if (
Irp->PendingReturned)
889 DPRINT1(
"Root hub PDO %p IOCTL 0x%lx failed by HCD 0x%lx\n",
900 Info->Info.Size =
sizeof(*Info);
901 RootHub->m_NumberOf20Ports =
Info->Info.NumberOf20Ports;
902 RootHub->m_NumberOf30Ports =
Info->Info.NumberOf30Ports;
904 DPRINT(
"Root hub %p has %lu USB 2 and %lu USB 3 ports\n",
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE ACPI_HANDLE ACPI_HANDLE *OutHandle ACPI_HANDLE *OutHandle void *Context void *Context ACPI_EVENT_HANDLER Handler UINT32 UINT32 ACPI_GPE_HANDLER void *Context UINT32 ACPI_NOTIFY_HANDLER void *Context ACPI_ADR_SPACE_TYPE ACPI_ADR_SPACE_HANDLER ACPI_ADR_SPACE_SETUP Setup
RtlInitEmptyUnicodeString(SymbolicLinkName, NULL, 0)
WdfDeviceWdmDispatchPreprocessedIrp(Device, Irp)
WdfPdoInitAllowForwardingRequestToParent(Init)
WdfDeviceSetSpecialFileSupport(Device, WdfSpecialFilePaging, TRUE)
UCX_CONTROLLER_CONFIG m_Config
DEVICE_CAPABILITIES m_HcCaps
NTSTATUS OnHcdResetDone(_In_ PIRP Irp)
WDF_DEVICE_PNP_CAPABILITIES m_PnpCaps
VOID BuildPowerCapabilities()
WDF_DEVICE_POWER_CAPABILITIES m_PowerCaps
UCX_ROOTHUB_CONFIG m_Config
POWER_ACTION m_SystemPowerAction
UcxController * m_Controller
NTSTATUS AddQueryInterfaces()
NTSTATUS NTAPI UcxProcessSubmitUrb(_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp)
#define STATUS_NOT_SUPPORTED
#define DEVPROP_TYPE_EMPTY
#define DEVPROP_TYPE_UINT32
#define NT_SUCCESS(StatCode)
#define RTL_CONSTANT_STRING(s)
#define _IRQL_requires_(irql)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
_Must_inspect_result_ _In_opt_ PVOID _In_opt_ PVOID InstanceId
_In_ const HubIdStrings * Ids
return RtlUnicodeStringPrintf(Name, L"uxd_port_%03u", PortNumber)
#define IOCTL_UCXHUB_RESET_PORT_ASYNC
#define IOCTL_UCXHUB_DEVICE_ENABLE
#define IOCTL_UCXHUB_DEVICE_ADDRESS
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
#define IOCTL_UCXHUB_ROOTHUB_GET_20PORT_INFO
#define IOCTL_UCXHUB_ROOTHUB_GET_30PORT_INFO
#define IOCTL_UCXHUB_ADDRESS0_OWNERSHIP_ACQUIRE
#define IOCTL_UCXHUB_DEVICE_TREE_PURGE_IO
#define IOCTL_UCXHUB_DEVICE_START_IO
#define IOCTL_UCXHUB_FREE_DUMP_DATA
#define IOCTL_UCXHUB_ENDPOINT_RESET
#define IOCTL_UCXHUB_DEVICE_UPDATE
#define IOCTL_UCXHUB_ROOTHUB_GET_INFO
#define IOCTL_UCXHUB_DEVICE_DISABLE
#define IOCTL_UCXHUB_DEVICE_RESET
_In_ UCXHUB_DEVICE_CONTEXT _In_ UCXENDPOINT Endpoint
#define IOCTL_UCXHUB_DEVICE_HUB_INFO
#define IOCTL_UCXHUB_DEFAULT_ENDPOINT_UPDATE
#define IOCTL_UCXHUB_QUERY_USB_CAPABILITY
#define IOCTL_UCXHUB_SET_FUNCTION_HANDLE_DATA
#define IOCTL_UCXHUB_GET_DUMP_DATA
#define IOCTL_UCXHUB_NOTIFY_FORWARD_PROGRESS
#define IOCTL_UCXHUB_ENDPOINTS_CONFIGURE
#define IOCTL_UCXHUB_DEVICE_PURGE_IO
#define IOCTL_UCXHUB_DEVICE_ABORT_IO
_In_ UCXUSBDEVICE _In_ PDEVICE_OBJECT Pdo
struct _UCXHUB_ROOTHUB_INFO * PUCXHUB_ROOTHUB_INFO
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
NTSTATUS NTAPI IoSetCompletionRoutineEx(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_COMPLETION_ROUTINE CompletionRoutine, IN PVOID Context, IN BOOLEAN InvokeOnSuccess, IN BOOLEAN InvokeOnError, IN BOOLEAN InvokeOnCancel)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
#define _In_reads_opt_(s)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define UNREFERENCED_PARAMETER(P)
#define DECLARE_GLOBAL_CONST_UNICODE_STRING(_var, _str)
#define IoSkipCurrentIrpStackLocation(Irp)
#define IoCopyCurrentIrpStackLocationToNext(Irp)
#define IoCompleteRequest
enum _SYSTEM_POWER_STATE SYSTEM_POWER_STATE
NTSTRSAFEVAPI RtlStringCchPrintfW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
#define IsEqualGUID(rguid1, rguid2)
EVT_WDFDEVICE_WDM_IRP_PREPROCESS UcxEvtRootHubPreprocessInternalIoctl
EVT_WDF_DEVICE_PREPARE_HARDWARE UcxEvtRootHubPrepareHardware
EVT_WDF_DEVICE_RELEASE_HARDWARE UcxEvtRootHubReleaseHardware
EVT_WDF_DEVICE_DISABLE_WAKE_AT_BUS UcxEvtRootHubDisableWakeAtBus
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL UcxEvtRootHubPdoIoDeviceControl
EVT_WDF_DEVICE_D0_ENTRY UcxEvtRootHubD0Entry
EVT_WDF_DEVICE_ENABLE_WAKE_AT_BUS UcxEvtRootHubEnableWakeAtBus
EVT_WDF_DEVICE_D0_EXIT UcxEvtRootHubD0Exit
EVT_WDFDEVICE_WDM_IRP_PREPROCESS UcxEvtRootHubPreprocessSetPower
EVT_WDFDEVICE_WDM_IRP_PREPROCESS UcxEvtRootHubPreprocessQueryInterface
static VOID NTAPI UcxSetCompletionRoutine(_In_ WDFDEVICE Device, _In_ PIRP Irp, _In_ PIO_COMPLETION_ROUTINE Routine, _In_ PVOID Context)
static const SIZE_T UcxHardwareIdSeparators[]
#define UCX_HWID_SHORT_CHARS
static const DEVPROPKEY UcxPciKeyUsb4PortAttributes
static NTSTATUS NTAPI UcxQueueAsyncPortReset(_In_ UcxController *Controller, _In_ PIRP Irp)
static const DEVPROPKEY UcxPciKeyParentSerialNumber
static WDFQUEUE NTAPI UcxRouteHubIoctl(_In_ UcxController *Controller, _In_ ULONG IoControlCode, _Out_ UcxStackSetup *Setup)
static const WCHAR UcxRootHubDeviceIdText[]
static IO_COMPLETION_ROUTINE UcxRootHubGetInfoCompletion
static VOID NTAPI UcxBuildRootHubHardwareIds(_In_ const UCX_CONTROLLER_CONFIG *Config, _Out_writes_(BufferChars) PWCHAR Buffer, _In_ SIZE_T BufferChars, _Out_ PUNICODE_STRING Ids)
#define UCX_HWID_FULL_CHARS
#define UCX_HWID_BUFFER_CHARS
static const DEVPROPKEY UcxPciKeySerialNumber
#define UCX_HWID_PLAIN_CHARS
static IO_COMPLETION_ROUTINE UcxDeviceMgmtCompletion
WDF_DEVICE_PROPERTY_DATA_INIT & Property
DEVPROPTYPE AttributesType
static NTSTATUS NTAPI UcxCompleteIrpWithStatus(_In_ PIRP Irp, _In_ NTSTATUS Status)
UcxController * Controller
union _IO_STACK_LOCATION::@1823 Parameters
struct _IO_STACK_LOCATION::@1823::@1824 DeviceIoControl
WDF_OBJECT_ATTRIBUTES WdfRequestAttributes
DEVICE_POWER_STATE DeviceWake
SYSTEM_POWER_STATE SystemWake
DEVICE_POWER_STATE DeviceState[PowerSystemMaximum]
PFN_WDF_IO_QUEUE_IO_DEVICE_CONTROL EvtIoDeviceControl
PFN_WDF_DEVICE_ENABLE_WAKE_AT_BUS EvtDeviceEnableWakeAtBus
PFN_WDF_DEVICE_DISABLE_WAKE_AT_BUS EvtDeviceDisableWakeAtBus
PFN_WDF_DEVICE_D0_ENTRY EvtDeviceD0Entry
PFN_WDF_DEVICE_D0_EXIT EvtDeviceD0Exit
PFN_WDF_DEVICE_PREPARE_HARDWARE EvtDevicePrepareHardware
PFN_WDF_DEVICE_RELEASE_HARDWARE EvtDeviceReleaseHardware
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXCONTROLLER * Controller
@ UcxControllerParentBusTypePci
@ UcxControllerParentBusTypeAcpi
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG Config
_In_ PGUID _In_ ULONG OutputBufferLength
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
_Must_inspect_result_ _In_ UCXCONTROLLER _In_ PUCX_ROOTHUB_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXROOTHUB * RootHub
#define STATUS_INVALID_DEVICE_REQUEST
#define STATUS_NO_SUCH_DEVICE
#define STATUS_UNSUCCESSFUL
#define STATUS_OBJECT_NAME_COLLISION
#define STATUS_INSUFFICIENT_RESOURCES
#define IOCTL_INTERNAL_USB_SUBMIT_URB
#define IOCTL_INTERNAL_USB_REGISTER_COMPOSITE_DEVICE
#define IOCTL_INTERNAL_USB_REQUEST_REMOTE_WAKE_NOTIFICATION
#define IOCTL_INTERNAL_USB_UNREGISTER_COMPOSITE_DEVICE
for(Attempt=0;Attempt< UCX_LEGACY_NAME_ATTEMPTS;Attempt++)
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ PDEVICE_OBJECT DeviceObject
FORCEINLINE VOID WDF_DEVICE_PNP_CAPABILITIES_INIT(_Out_ PWDF_DEVICE_PNP_CAPABILITIES Caps)
_In_ WDF_POWER_DEVICE_STATE PreviousState
@ WDF_DISPATCH_IRP_TO_IO_QUEUE_PREPROCESSED_IRP
enum _WDF_POWER_DEVICE_STATE WDF_POWER_DEVICE_STATE
_In_ WDFCMRESLIST _In_ WDFCMRESLIST ResourcesTranslated
@ WdfSpecialFileHibernation
FORCEINLINE VOID WDF_DEVICE_PROPERTY_DATA_INIT(_Out_ PWDF_DEVICE_PROPERTY_DATA PropertyData, _In_ const DEVPROPKEY *PropertyKey)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
FORCEINLINE VOID WDF_PNPPOWER_EVENT_CALLBACKS_INIT(_Out_ PWDF_PNPPOWER_EVENT_CALLBACKS Callbacks)
_In_ WDF_POWER_DEVICE_STATE TargetState
_In_ UCHAR _In_ UCHAR _In_ ULONG Code
FORCEINLINE VOID WDF_DEVICE_POWER_CAPABILITIES_INIT(_Out_ PWDF_DEVICE_POWER_CAPABILITIES Caps)
_In_ WDFCMRESLIST ResourcesRaw
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ WDF_DEVICE_POWER_STATE PowerState
_Must_inspect_result_ _In_ WDFDEVICE Fdo
FORCEINLINE VOID WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(_Out_ PWDF_IO_QUEUE_CONFIG Config, _In_ WDF_IO_QUEUE_DISPATCH_TYPE DispatchType)
@ WdfIoQueueDispatchParallel
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
#define WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(_attributes, _contexttype)
FORCEINLINE VOID WDF_PDO_EVENT_CALLBACKS_INIT(_Out_ PWDF_PDO_EVENT_CALLBACKS Callbacks)
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
#define WDF_NO_OBJECT_ATTRIBUTES
#define STATUS_CONTINUE_COMPLETION
#define IRP_MN_QUERY_INTERFACE
IO_COMPLETION_ROUTINE * PIO_COMPLETION_ROUTINE
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
_In_ SYSTEM_POWER_STATE SystemPowerState