17 return UcxGetControllerContext(
Handle);
24 return UcxGetFdoContext(
Fdo)->Controller;
68 DPRINT1(
"Controller create rejected, only one dump callback given\n");
74 DPRINT1(
"Controller create rejected, HCD attributes name a parent\n");
81 FullConfig.
Size =
sizeof(FullConfig);
140 FdoObject = WdfDeviceWdmGetDeviceObject(
Fdo);
174 Status = WdfDeviceCreateDeviceInterface(
Fdo, &GUID_DEVINTERFACE_USB_HOST_CONTROLLER,
NULL);
177 DPRINT1(
"Controller %p host controller interface create failed 0x%lx\n",
this,
Status);
190 DPRINT1(
"Controller %p interface string create failed 0x%lx\n",
this,
Status);
194 Status = WdfDeviceRetrieveDeviceInterfaceString(
Fdo,
195 &GUID_DEVINTERFACE_USB_HOST_CONTROLLER,
200 DPRINT1(
"Controller %p interface name query failed 0x%lx\n",
this,
Status);
215 DPRINT1(
"Controller %p WMI registration failed 0x%lx\n",
this,
Status);
253 DPRINT1(
"Controller %p capabilities request create failed 0x%lx\n",
this,
Status);
271 Stack.Parameters.DeviceCapabilities.Capabilities = &
m_HcCaps;
283 DPRINT1(
"Controller %p query capabilities failed 0x%lx\n",
this,
Status);
332 Copy->MaximumLength = 0;
360 UcxGetControllerContext(
Object)->Destroy();
417 DPRINT1(
"Controller %p reports it needs a reset\n",
this);
430 DPRINT(
"Controller %p reset complete, state %d\n",
this,
Info->UcxControllerState);
444 DPRINT1(
"Controller %p marked failed by the HCD\n",
this);
463 DPRINT1(
"Controller %p ID strings already set\n",
this);
469 DPRINT1(
"Controller %p ID strings malformed\n",
this);
486 DPRINT1(
"Controller %p ID string copy failed 0x%lx\n",
this,
Status);
572 DPRINT1(
"Controller %p has no frame number callback\n",
this);
590 DPRINT1(
"Controller %p frame number query failed 0x%lx\n",
this,
Status);
619 (
PGUID)&GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL,
636 (
PGUID)&GUID_USB_CAPABILITY_STATIC_STREAMS,
674 DPRINT1(
"Controller %p stop idle failed 0x%lx\n",
this,
Status);
683 if (!
Context->PowerReferenceAcquired)
728UcxController::EnableForwardProgress(
731 PFN_UCX_HCD_ENABLE_FORWARD_PROGRESS HcdEnable;
745 if (HcdEnable !=
NULL)
751 DPRINT1(
"Controller %p HCD forward progress enable failed 0x%lx\n",
this,
Status);
757 Device = UcxUsbDevice::FromHandle(
Info->Device);
764 DPRINT1(
"Controller %p forward progress for device %p failed 0x%lx\n",
this,
Device,
Status);
789 DPRINT1(
"Controller %p system thread create failed 0x%lx\n",
this,
Status);
803 DPRINT1(
"Controller %p system thread reference failed 0x%lx\n",
this,
Status);
#define InterlockedIncrement
#define InterlockedDecrement
VOID Initialize(_In_ UcxController *Controller)
KMUTEX m_ForwardProgressMutex
PFN_UCX_HCD_ENABLE_FORWARD_PROGRESS HcdEnableForwardProgress() const
KEVENT m_ResetCompleteProcessed
static UcxController * FromFdo(_In_ WDFDEVICE Fdo)
VOID PostResetEvent(_In_ CrEvent Event)
NTSTATUS QueryHcCapabilities()
static _Must_inspect_result_ NTSTATUS Create(_In_ PUCX_DRIVER_GLOBALS Globals, _In_ WDFDEVICE Device, _In_ PUCX_CONTROLLER_CONFIG Config, _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes, _Out_ UCXCONTROLLER *Controller)
NTSTATUS StopIdle(_Inout_ PUCXHUB_STOP_IDLE_CONTEXT Context)
UNICODE_STRING m_ModelNumber
VOID NotifyTransportCharacteristicsChange(_In_ PUCX_CONTROLLER_TRANSPORT_CHARACTERISTICS Characteristics)
VOID GetInfo(_Out_ PVOID Info, _In_ BOOLEAN Grown)
LONG m_UsbdInterfaceCount
VOID ResumeIdle(_Inout_ PUCXHUB_STOP_IDLE_CONTEXT Context)
BOOLEAN m_WaitOnResetComplete
NTSTATUS Initialize(_In_ PUCX_DRIVER_GLOBALS Globals, _In_ WDFDEVICE Fdo, _In_ const UCX_CONTROLLER_CONFIG *Config)
BOOLEAN m_ResetInProgress
NTSTATUS SetIdStrings(_In_ PUNICODE_STRING Manufacturer, _In_ PUNICODE_STRING ModelName, _In_ PUNICODE_STRING ModelNumber)
VOID QueueOnWorkerThread(_In_ UcxWorkItem *WorkItem)
NTSTATUS StartWorkerThread()
ULONG m_ChildEndpointCount
UCX_CONTROLLER_CONFIG m_Config
static UcxController * FromHandle(_In_ UCXCONTROLLER Handle)
ControllerResetMachine m_ResetMachine
KSPIN_LOCK m_AbortPipeCsqLock
WDFREQUEST m_PendingTreePurge
BOOLEAN QueryStreamsSupported()
VOID MarkResetInProgress()
UNICODE_STRING m_ModelName
BOOLEAN m_ResetMachineReady
NTSTATUS GetCurrentFrameNumber(_Out_ PULONG FrameNumber)
UNICODE_STRING m_ManufacturerName
KSPIN_LOCK m_TopologyLock
VOID ResetComplete(_In_ PUCX_CONTROLLER_RESET_COMPLETE_INFO Info)
BOOLEAN m_HcdReservedIoReady
LONG m_PendingTreePurgeEndpoints
DEVICE_CAPABILITIES m_HcCaps
LONG m_DeviceContextsLost
static EVT_WDF_OBJECT_CONTEXT_DESTROY EvtDestroy
ULONG m_CachedFrameNumber
BOOLEAN m_DriverVerifierEnabled
VOID Address0Release(_In_ UCXUSBDEVICE Hub)
static KSTART_ROUTINE WorkerThreadRoutine
LIST_ENTRY m_DriverListEntry
KEVENT m_RootHubMayExitD0
BOOLEAN QueryClearTtBufferOnCancel()
WDFSTRING m_HostControllerInterfaceName
UcxWorkItem * m_ResetMachineWorkItem
UcxUsbDevice * Device() const
NTSTATUS EnableForwardProgress()
VOID DisconnectPort(_In_ ULONG PortNumber)
CLIPBOARD_GLOBALS Globals
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
NTKERNELAPI NTSTATUS NTAPI IoCsqInitialize(_Out_ PIO_CSQ Csq, _In_ PIO_CSQ_INSERT_IRP CsqInsertIrp, _In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp, _In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, _In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, _In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock, _In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp)
Set up a CSQ struct to initialize the queue.
#define STATUS_NOT_SUPPORTED
#define NT_SUCCESS(StatCode)
InitializeListHead & UcxDriver
#define _IRQL_requires_(irql)
LOGICAL NTAPI MmIsDriverVerifying(IN PDRIVER_OBJECT DriverObject)
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define IsListEmpty(ListHead)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeSetEvent(pEvt, foo, foo2)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
#define KeInitializeSpinLock(sl)
VOID NTAPI KeClearEvent(IN PKEVENT Event)
LONG NTAPI KeReadStateEvent(IN PKEVENT Event)
static BOOLEAN NTAPI UcxIsValidIdString(_In_opt_ PCUNICODE_STRING String)
static VOID NTAPI UcxFreeIdString(_Inout_ PUNICODE_STRING String)
static NTSTATUS NTAPI UcxCopyIdString(_In_ PCUNICODE_STRING Source, _Out_ PUNICODE_STRING Copy)
static BOOLEAN NTAPI UcxIsAcceptedConfigSize(_In_ ULONG Size)
IO_CSQ_REMOVE_IRP UcxCsqRemoveAbortIrp
IO_CSQ_COMPLETE_CANCELED_IRP UcxCsqCompleteCanceledAbortIrp
IO_CSQ_INSERT_IRP UcxCsqInsertAbortIrp
IO_CSQ_RELEASE_LOCK UcxCsqReleaseAbortLock
IO_CSQ_PEEK_NEXT_IRP UcxCsqPeekAbortIrp
#define UCX_CONFIG_SIZE_V3
#define UCX_CONFIG_SIZE_V4
#define UCX_CONFIG_SIZE_V1
IO_CSQ_ACQUIRE_LOCK UcxCsqAcquireAbortLock
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
struct _UCXHUB_CONTROLLER_INFO_V2 * PUCXHUB_CONTROLLER_INFO_V2
_In_opt_ PVOID _In_ PUCXHUB_WORKITEM WorkItem
#define UCXHUB_WORKITEM_NO_FLAGS
struct _UCXHUB_CONTROLLER_INFO * PUCXHUB_CONTROLLER_INFO
return WdfWmiInstanceCreate(Device, &Config, Attributes, Instance)
#define InterlockedCompareExchange
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
#define ExFreePoolWithTag(_P, _T)
#define InitializeObjectAttributes(p, n, a, r, s)
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
#define _Must_inspect_result_
#define THREAD_ALL_ACCESS
#define UNREFERENCED_PARAMETER(P)
VOID NTAPI KeInitializeMutex(IN PKMUTEX Mutex, IN ULONG Level)
LONG NTAPI KeReleaseMutex(IN PKMUTEX Mutex, IN BOOLEAN Wait)
NTSTATUS NTAPI PsTerminateSystemThread(IN NTSTATUS ExitStatus)
NTSTATUS NTAPI PsCreateSystemThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE ProcessHandle, IN PCLIENT_ID ClientId, IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext)
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
#define OBJ_KERNEL_HANDLE
UcxController * Controller
static PUCXHUB_WORKITEM Allocate(_In_ UcxController *Controller, _In_ PDEVICE_OBJECT DeviceObject, _In_ ULONG Flags)
UCX_CONTROLLER_ACPI_INFORMATION AcpiDeviceInfo
UCX_CONTROLLER_PCI_INFORMATION PciDeviceInfo
PFN_UCX_CONTROLLER_QUERY_USB_CAPABILITY EvtControllerQueryUsbCapability
PFN_UCX_CONTROLLER_GET_CURRENT_FRAMENUMBER EvtControllerGetCurrentFrameNumber
UCX_CONTROLLER_PARENT_BUS_TYPE ParentBusType
WDF_EXECUTION_LEVEL ExecutionLevel
PFN_WDF_OBJECT_CONTEXT_DESTROY EvtDestroyCallback
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXCONTROLLER * Controller
_In_ PGUID _In_ ULONG _Out_ PULONG ResultLength
@ UcxControllerParentBusTypePci
@ UcxControllerParentBusTypeAcpi
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
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
WDF_EXTERN_C_START struct _UCX_DRIVER_GLOBALS * PUCX_DRIVER_GLOBALS
_Must_inspect_result_ NTSTATUS NTAPI UcxCreateObjectWithTwoContexts(_In_ PWDF_OBJECT_ATTRIBUTES Primary, _In_opt_ PWDF_OBJECT_ATTRIBUTES Secondary, _Out_ WDFOBJECT *Object)
FORCEINLINE BOOLEAN NTAPI UcxIsListEntryLinked(_In_ const LIST_ENTRY *Entry)
FORCEINLINE VOID NTAPI UcxClearListEntry(_Out_ PLIST_ENTRY Entry)
#define STATUS_INVALID_PARAMETER
#define STATUS_INSUFFICIENT_RESOURCES
EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE UcxEvtWmiNodeInfoQueryInstance
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
#define WdfDeviceStopIdle(Device, WaitForD0)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
#define WdfDeviceResumeIdle(Device)
_Must_inspect_result_ _In_ WDFDEVICE Fdo
#define WdfObjectDereferenceWithTag(Handle, Tag)
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
#define WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(_attributes, _contexttype)
@ WdfExecutionLevelPassive
#define WdfObjectReferenceWithTag(Handle, Tag)
FORCEINLINE NTSTATUS WdfObjectAllocateContext(_In_ WDFOBJECT Handle, _In_ PWDF_OBJECT_ATTRIBUTES ContextAttributes, _Outptr_opt_ PVOID *Context)
_Must_inspect_result_ FORCEINLINE BOOLEAN WdfRequestSend(_In_ WDFREQUEST Request, _In_ WDFIOTARGET Target, _In_opt_ PWDF_REQUEST_SEND_OPTIONS Options)
_In_ WDFREQUEST _In_ PWDF_REQUEST_REUSE_PARAMS ReuseParams
FORCEINLINE VOID WDF_REQUEST_SEND_OPTIONS_INIT(_Out_ PWDF_REQUEST_SEND_OPTIONS Options, _In_ ULONG Flags)
@ WDF_REQUEST_SEND_OPTION_SYNCHRONOUS
@ WDF_REQUEST_REUSE_NO_FLAGS
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
FORCEINLINE VOID WDF_REQUEST_REUSE_PARAMS_INIT(_Out_ PWDF_REQUEST_REUSE_PARAMS Params, _In_ ULONG Flags, _In_ NTSTATUS Status)
WDF_EXTERN_C_START typedef _Must_inspect_result_ _In_opt_ PCUNICODE_STRING _In_opt_ PWDF_OBJECT_ATTRIBUTES StringAttributes
#define WDF_NO_OBJECT_ATTRIBUTES
FORCEINLINE VOID WDF_WMI_PROVIDER_CONFIG_INIT(_Out_ PWDF_WMI_PROVIDER_CONFIG Config, _In_ CONST GUID *Guid)
FORCEINLINE VOID WDF_WMI_INSTANCE_CONFIG_INIT_PROVIDER_CONFIG(_Out_ PWDF_WMI_INSTANCE_CONFIG Config, _In_ PWDF_WMI_PROVIDER_CONFIG ProviderConfig)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_WMI_INSTANCE_CONFIG InstanceConfig
#define IRP_MN_QUERY_CAPABILITIES
#define ObDereferenceObject