17 return UcxGetRootHubContext(
Handle);
70 DPRINT1(
"Root hub device context allocation failed 0x%lx\n",
Status);
87 DPRINT(
"Root hub %p created for controller %p\n",
Context, ControllerContext);
129 UCXENDPOINT EndpointHandle;
160 DPRINT1(
"Root hub %s queue forward progress setup failed 0x%lx\n",
Interrupt ?
"interrupt" :
"control",
Status);
165 Init.Kind =
Interrupt ? UcxEndpointKind::Generic : UcxEndpointKind::Default;
166 Init.TransferType =
Interrupt ? UcxTransferType::Interrupt : UcxTransferType::Control;
186 State->PortChangeGeneration = 1;
187 State->PortChangeGenerationProcessed = 0;
189 State->RootHub =
this;
198 UcxGetControlQueueContext(
Queue)->RootHub =
this;
209UcxRootHub::EvtCleanup(
233 DPRINT(
"Root hub %p port change\n",
this);
238 State->PortChangeGeneration++;
246 State->PortChangeGenerationProcessed =
State->PortChangeGeneration;
249 IndicateWake =
State->IndicateWakeEnabled;
270 DPRINT1(
"Root hub %p failing held status change transfer %p, controller resetting\n",
this,
Release);
293 DPRINT(
"Held status change transfer %p canceled\n",
Request);
325 State->PortChangeGeneration ==
State->PortChangeGenerationProcessed;
329 State->PortChangeGenerationProcessed =
State->PortChangeGeneration;
341 DPRINT1(
"Root hub %p could not hold status change transfer %p 0x%lx\n",
RootHub,
Request, HoldStatus);
342 WdfRequestComplete(
Request, HoldStatus);
349 if (!
RootHub->m_Controller->BlockReset())
357 RootHub->m_Controller->UnblockReset();
363#define UCX_RECIPIENT(Type) ((Type) & 0x03)
364#define UCX_REQUEST_TYPE(Type) (((Type) >> 5) & 0x03)
365#define UCX_DIRECTION_IN(Type) (((Type) & 0x80) != 0)
367#define UCX_RECIPIENT_DEVICE 0
368#define UCX_RECIPIENT_OTHER 3
369#define UCX_TYPE_STANDARD 0
370#define UCX_TYPE_CLASS 1
391 switch (
Setup->bRequest)
397 :
Config->EvtRootHubClearPortFeature;
404 :
Config->EvtRootHubGetPortStatus;
411 :
Config->EvtRootHubSetPortFeature;
445 if (!
RootHub->m_Controller->BlockReset())
462 RootHub->m_Controller->UnblockReset();
466 DPRINT1(
"Root hub %p has no callback for request 0x%x type 0x%x\n",
479 DPRINT(
"Root hub %p failing I/O for controller reset\n",
this);
494 DPRINT(
"Root hub %p resuming I/O\n",
this);
512 Flags->HostContextLost = 1;
517 DPRINT1(
"Root hub %p async reset IRP %p failed\n",
this,
Irp);
520 Irp->IoStatus.Information = 0;
531 Info->Info.Size =
sizeof(
Info->Info);
534 DPRINT(
"Root hub %p GetInfo request %p to HCD\n",
this,
Request);
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
#define InterlockedExchange
static UcxController * FromHandle(_In_ UCXCONTROLLER Handle)
KSPIN_LOCK m_TopologyLock
LONG m_DeviceContextsLost
VOID SetWdfIoQueue(_In_ WDFQUEUE Queue)
UcxEndpoint * m_ControlEndpoint
WDFQUEUE m_InterruptQueue
static UcxRootHub * FromHandle(_In_ UCXROOTHUB Handle)
VOID DispatchGetInfo(_In_ WDFREQUEST Request, _Inout_ PUCXHUB_ROOTHUB_INFO Info)
UcxInterruptQueueState * m_InterruptState
NTSTATUS Initialize(_In_ UcxController *Controller, _In_ PUCX_ROOTHUB_CONFIG Config)
static EVT_WDF_OBJECT_CONTEXT_CLEANUP EvtCleanup
UCX_ROOTHUB_CONFIG m_Config
UcxController * m_Controller
UcxEndpoint * m_InterruptEndpoint
VOID FinishPortResetRequest(_In_ BOOLEAN Succeeded)
NTSTATUS ReferenceSymbolicName(_Out_ WDFSTRING *Name)
static _Must_inspect_result_ NTSTATUS Create(_In_ UCXCONTROLLER Controller, _In_ PUCX_ROOTHUB_CONFIG Config, _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes, _Out_ UCXROOTHUB *RootHub)
NTSTATUS CreateEndpoint(_In_ BOOLEAN Interrupt)
VOID InitializeAsRootHub(_In_ UCXROOTHUB Handle, _In_ UcxController *Controller)
#define STATUS_NOT_SUPPORTED
_In_ ULONG _In_ ULONG _In_opt_ DXGKCB_MIRACAST_SEND_MESSAGE_CALLBACK Callback
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
#define NT_SUCCESS(StatCode)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeSetEvent(pEvt, foo, foo2)
#define KeInitializeSpinLock(sl)
VOID NTAPI KeClearEvent(IN PKEVENT Event)
_In_ UCXHUB_DEVICE_CONTEXT DeviceContext
union _UCXHUB_RESET_FLAGS * PUCXHUB_RESET_FLAGS
#define UCXHUB_URB_FLAG_PEND_INTERRUPT_TX
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
#define _Must_inspect_result_
#define UNREFERENCED_PARAMETER(P)
#define IoCompleteRequest
#define UCX_RECIPIENT(Type)
static BOOLEAN NTAPI UcxClassifyRootHubRequest(_In_ const UCX_ROOTHUB_CONFIG *Config, _In_ const USB_DEFAULT_PIPE_SETUP_PACKET *Setup, _Out_ PFN_UCX_ROOTHUB_CONTROL_URB *Callback)
#define UCX_RECIPIENT_DEVICE
#define UCX_TYPE_STANDARD
#define UCX_REQUEST_TYPE(Type)
#define UCX_DIRECTION_IN(Type)
#define UCX_RECIPIENT_OTHER
EVT_WDF_REQUEST_CANCEL UcxEvtRootHubHeldTransferCancel
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL UcxEvtRootHubControlTransfer
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL UcxEvtRootHubInterruptTransfer
KSPIN_LOCK PortChangeLock
USHORT PortChangeGeneration
USBD_PIPE_HANDLE Handle()
struct _IO_STACK_LOCATION::@5100::@5139 Others
union _IO_STACK_LOCATION::@1823 Parameters
ULONG NumberOfPresentedControlUrbCallbacks
PFN_UCX_ROOTHUB_GET_INFO EvtRootHubGetInfo
PFN_UCX_ROOTHUB_INTERRUPT_TX EvtRootHubInterruptTx
PFN_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL EvtIoInternalDeviceControl
struct _WDF_IO_QUEUE_CONFIG::@4710::@4711 Parallel
union _WDF_IO_QUEUE_CONFIG::@4710 Settings
PFN_WDF_OBJECT_CONTEXT_CLEANUP EvtCleanupCallback
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
_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
_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
EVT_UCX_ROOTHUB_CONTROL_URB * PFN_UCX_ROOTHUB_CONTROL_URB
_Must_inspect_result_ _In_ UCXCONTROLLER _In_ PUCX_ROOTHUB_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXROOTHUB * RootHub
_Must_inspect_result_ NTSTATUS NTAPI UcxCreateObjectWithTwoContexts(_In_ PWDF_OBJECT_ATTRIBUTES Primary, _In_opt_ PWDF_OBJECT_ATTRIBUTES Secondary, _Out_ WDFOBJECT *Object)
#define STATUS_NO_SUCH_DEVICE
#define STATUS_UNSUCCESSFUL
#define USB_REQUEST_GET_STATUS
#define USB_REQUEST_SET_FEATURE
#define USB_REQUEST_CLEAR_FEATURE
struct _USB_DEFAULT_PIPE_SETUP_PACKET * PUSB_DEFAULT_PIPE_SETUP_PACKET
#define USB_REQUEST_GET_PORT_ERR_COUNT
#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
BOOL InitPointer(PPDEV ppdev)
_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
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
_Must_inspect_result_ _Inout_ PWDFDEVICE_INIT _In_opt_ PWDF_OBJECT_ATTRIBUTES DeviceAttributes
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_INTERRUPT_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFINTERRUPT * Interrupt
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY Policy
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_IO_QUEUE_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES QueueAttributes
FORCEINLINE VOID WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY_DEFAULT_INIT(_Out_ PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY Policy, _In_ ULONG TotalForwardProgressRequests)
FORCEINLINE VOID WDF_IO_QUEUE_CONFIG_INIT(_Out_ PWDF_IO_QUEUE_CONFIG Config, _In_ WDF_IO_QUEUE_DISPATCH_TYPE DispatchType)
@ WdfIoQueueDispatchSequential
@ WdfIoQueueDispatchParallel
#define WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(_attributes, _contexttype)
#define WdfObjectReferenceWithTag(Handle, Tag)
FORCEINLINE NTSTATUS WdfObjectAllocateContext(_In_ WDFOBJECT Handle, _In_ PWDF_OBJECT_ATTRIBUTES ContextAttributes, _Outptr_opt_ PVOID *Context)