30 return UcxUsbDevice::FromHandle((UCXUSBDEVICE)((
PURB)Arg1)->UrbHeader.UsbdDeviceHandle);
59 if (
Device->m_DeprogrammedByControllerReset)
63 DPRINT(
"UsbDevice %p IOCTL 0x%lx after a controller reset deprogrammed it\n",
69 DPRINT(
"UsbDevice %p enabled again after a controller reset\n",
Device->m_Handle);
119 DPRINT1(
"UsbDevice %p unexpected URB function 0x%x\n",
m_Handle,
Urb->UrbHeader.Function);
200 DPRINT1(
"Endpoint %p static streams open failed by controller reset\n",
Endpoint->m_Handle);
209 DPRINT1(
"UsbDevice %p unexpected URB function 0x%x during reset\n",
m_Handle,
Urb->UrbHeader.Function);
231 DPRINT1(
"UsbDevice %p endpoint reset failed by controller reset\n",
m_Handle);
277 DPRINT1(
"Parked request %p has unexpected URB function 0x%x\n",
Request,
Urb->UrbHeader.Function);
283 Device = UcxUsbDevice::FromHandle((UCXUSBDEVICE)
Urb->UrbHeader.UsbdDeviceHandle);
284 if (
Device->m_FailNextStreamClose)
337 WdfIoQueueStart(
Queue);
495 Endpoint->Post(EpEvent::HubTreePurge);
507 UCXENDPOINT* ToDisable =
Reset->EndpointsToDisable;
508 UCXENDPOINT DefaultEndpoint =
Reset->DefaultEndpoint;
525 UcxEndpoint::FromHandle(ToDisable[
Index])->
Post(EpEvent::HubDeviceReset);
527 UcxEndpoint::FromHandle(DefaultEndpoint)->
Post(EpEvent::HubDeviceReset);
537 UCXENDPOINT DefaultEndpoint =
Disable->DefaultEndpoint;
544 UcxEndpoint::FromHandle(DefaultEndpoint)->
Post(EpEvent::HubDisable);
554 UCXENDPOINT* ToDisable =
Configure->EndpointsToDisable;
562 DPRINT1(
"UsbDevice %p endpoints configure failed by controller reset\n",
m_Handle);
578 UcxEndpoint::FromHandle(ToDisable[
Index])->
Post(EpEvent::HubDisable);
591 if (
Update->Flags.UpdateAllowIoOnInvalidPipeHandles)
594 if (
Update->Flags.UpdateDeviceDescriptor)
630 Status = WdfRequestForwardToIoQueue(
Request,
Device->m_Controller->m_PendDuringResetQueue);
667 Irp->IoStatus.Information = 0;
723 UcxEndpoint::FromHandle(
Enable->DefaultEndpoint)->
Post(EpEvent::ConfigureDone);
737 UcxEndpoint::FromHandle(
Reset->DefaultEndpoint)->
Post(EpEvent::DeviceResetDone);
748 UCXENDPOINT* ToEnable =
Configure->EndpointsToEnable;
753 DPRINT1(
"UsbDevice %p HCD endpoints configure failed 0x%lx\n",
m_Handle,
Irp->IoStatus.Status);
767 UcxEndpoint::FromHandle(ToEnable[
Index])->
Post(EpEvent::ConfigureDone);
static T & Reset(T &sei, UINT flags=SEE_MASK_FLAG_NO_UI)
#define InterlockedDecrement
static UcxController * FromFdo(_In_ WDFDEVICE Fdo)
KSPIN_LOCK m_TopologyLock
VOID HandleHubReset(_In_ WDFREQUEST Request)
UcxEndpointCallbacks m_Callbacks
BOOLEAN Post(_In_ EpEvent Event)
VOID HandleClientStreamsDisable(_In_ WDFREQUEST Request)
VOID HandleClientStreamsEnable(_In_ WDFREQUEST Request)
PFN_UCX_OPERATION_DONE m_PendingOperationDone
UcxController * m_Controller
BOOLEAN m_EndpointResetFailedByControllerReset
VOID HandleHubStartIo(_In_ WDFREQUEST Request)
VOID HandleHubTreePurge(_In_ WDFREQUEST Request)
VOID HandleHubEndpointsConfigure(_In_ WDFREQUEST Request, _In_ BOOLEAN AfterReset)
VOID DispatchManagement(_In_ WDFREQUEST Request, _In_ ULONG IoControlCode)
BOOLEAN m_ChildrenMayLeavePurge
VOID HandleHubAbortIo(_In_ WDFREQUEST Request)
LIST_ENTRY m_EndpointList
VOID SendEndpointsConfigureToController()
UcxEndpoint * m_DefaultEndpoint
VOID WalkSubtree(_In_ PFN_UCX_DEVICE_VISITOR Visitor, _In_opt_ PVOID Context, _In_ BOOLEAN IncludeDisconnected)
NTSTATUS OnHcdEnableDone(_In_ PIRP Irp, _In_ PUSBDEVICE_ENABLE Enable)
VOID CompleteHubRequest()
VOID CompleteHubOperation()
BOOLEAN m_DeprogrammedByControllerReset
BOOLEAN m_ResetFailedByControllerReset
VOID CompleteEndpointsConfigureIrp()
VOID HandleHubReset(_In_ WDFREQUEST Request, _In_ BOOLEAN AfterReset)
VOID FanOutToEndpoints(_In_ EpEvent Event)
VOID(UcxUsbDevice::* PFN_UCX_OPERATION_DONE)()
VOID UpdateFromHub(_In_ WDFREQUEST Request)
BOOLEAN m_EndpointsMayLeavePurge
VOID StartOperation(_In_ PVOID Pending, _In_ PFN_UCX_OPERATION_DONE Done, _In_ LONG Count)
VOID FinishEndpointResetRequest()
VOID PendEndpointsConfigure()
VOID FailManagement(_In_ WDFREQUEST Request, _In_ ULONG IoControlCode)
NTSTATUS OnHcdEndpointsConfigureDone(_In_ PIRP Irp, _In_ PENDPOINTS_CONFIGURE Configure)
UcxUsbDeviceCallbacks m_Callbacks
VOID SendResetToController()
VOID SendDisableToController()
NTSTATUS OnHcdResetDone(_In_ PIRP Irp, _In_ PUSBDEVICE_RESET Reset)
VOID HandleHubDisable(_In_ WDFREQUEST Request, _In_ BOOLEAN AfterReset)
VOID HandleHubPurgeIo(_In_ WDFREQUEST Request, _In_ BOOLEAN OnSuspend)
LONG m_PendingOperationCount
UcxUsbDevice * m_ParentHub
static VOID NTAPI UcxParkDuringReset(_In_ UcxUsbDevice *Device, _In_ WDFREQUEST Request)
static VOID NTAPI UcxResumeIrpCompletion(_In_ PIRP Irp, _In_ NTSTATUS Status)
static UcxUsbDevice *NTAPI UcxDeviceFromManagementRequest(_In_ WDFREQUEST Request, _In_ ULONG IoControlCode)
static VOID NTAPI UcxTreePurgeVisitor(_In_ UcxUsbDevice *Device, _In_opt_ PVOID Context)
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL UcxEvtTreePurgeIoInternalDeviceControl
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL UcxEvtDeviceMgmtIoInternalDeviceControl
#define UCX_DEVICE_TYPE_HUB
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL UcxEvtPendDuringResetIoInternalDeviceControl
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
#define NT_SUCCESS(StatCode)
#define InsertTailList(ListHead, Entry)
#define IsListEmpty(ListHead)
#define KeQuerySystemTime(t)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
_In_ UCXUSBDEVICE UsbDevice
#define IOCTL_UCXHUB_DEVICE_ENABLE
#define IOCTL_UCXHUB_DEVICE_ADDRESS
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
#define IOCTL_UCXHUB_DEVICE_TREE_PURGE_IO
#define IOCTL_UCXHUB_DEVICE_START_IO
#define IOCTL_UCXHUB_ENDPOINT_RESET
#define IOCTL_UCXHUB_DEVICE_UPDATE
#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_ENDPOINTS_CONFIGURE
#define IOCTL_UCXHUB_DEVICE_PURGE_IO
#define IOCTL_UCXHUB_DEVICE_ABORT_IO
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
static LRESULT Configure(const CodecInfo *pi, HWND hWnd)
#define UNREFERENCED_PARAMETER(P)
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
#define IoCompleteRequest
#define STATUS_MORE_PROCESSING_REQUIRED
PFN_UCX_DEFAULT_ENDPOINT_UPDATE DefaultEndpointUpdate
UCX_USBDEVICE_EVENT_CALLBACKS Public
struct _LIST_ENTRY * Flink
PFN_UCX_USBDEVICE_ADDRESS EvtUsbDeviceAddress
PFN_UCX_USBDEVICE_DISABLE EvtUsbDeviceDisable
PFN_UCX_USBDEVICE_ENDPOINTS_CONFIGURE EvtUsbDeviceEndpointsConfigure
PFN_UCX_USBDEVICE_ENABLE EvtUsbDeviceEnable
PFN_UCX_USBDEVICE_UPDATE EvtUsbDeviceUpdate
PFN_UCX_USBDEVICE_SUSPEND EvtUsbDeviceSuspend
PFN_UCX_USBDEVICE_RESUME EvtUsbDeviceResume
PFN_UCX_USBDEVICE_HUB_INFO EvtUsbDeviceHubInfo
PFN_UCX_USBDEVICE_RESET EvtUsbDeviceReset
struct _LIST_ENTRY * PLIST_ENTRY
#define CONTAINING_RECORD(address, type, field)
_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
_In_ PGUID _In_ ULONG OutputBufferLength
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
struct _ENDPOINTS_CONFIGURE * PENDPOINTS_CONFIGURE
struct _USBDEVICE_DISABLE * PUSBDEVICE_DISABLE
struct _USBDEVICE_RESET * PUSBDEVICE_RESET
struct _USBDEVICE_UPDATE * PUSBDEVICE_UPDATE
FORCEINLINE VOID NTAPI UcxClearListEntry(_Out_ PLIST_ENTRY Entry)
#define STATUS_INVALID_DEVICE_REQUEST
#define STATUS_NO_SUCH_DEVICE
#define URB_FUNCTION_OPEN_STATIC_STREAMS
#define URB_FUNCTION_CLOSE_STATIC_STREAMS
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
#define IOCTL_INTERNAL_USB_SUBMIT_URB
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
#define WdfObjectReference(Handle)
#define WdfObjectDereference(Handle)