15#define UCX_KB(x) ((x) * 1024UL)
16#define UCX_MB(x) ((x) * 1024UL * 1024UL)
72 if (
Init->Companion.bmAttributes.Isochronous.SspCompanion)
73 return 1024 *
Init->IsochCompanion.dwBytesPerInterval;
75 return 1024 *
Init->Companion.wBytesPerInterval;
79 MaxPacket =
Init->Descriptor.wMaxPacketSize;
81 PacketBytes = (MaxPacket & 0x7FF) * (((MaxPacket >> 11) & 0x3) + 1);
83 PacketBytes = MaxPacket;
94 return UcxGetEndpointContext(
Handle);
110 Target->OkToCancelTransfers =
Callbacks->EvtEndpointOkToCancelTransfers;
112 Target->StaticStreamsEnable =
Callbacks->EvtEndpointStaticStreamsEnable;
113 Target->StaticStreamsDisable =
Callbacks->EvtEndpointStaticStreamsDisable;
114 Target->EnableForwardProgress = (PFN_UCX_HCD_ENDPOINT_ENABLE_FORWARD_PROGRESS)
Callbacks->Reserved1;
119 Target->GetIsochTransferPathDelays =
Callbacks->EvtEndpointGetIsochTransferPathDelays;
138 Target->OkToCancelTransfers =
Callbacks->EvtEndpointOkToCancelTransfers;
139 Target->EnableForwardProgress = (PFN_UCX_HCD_ENDPOINT_ENABLE_FORWARD_PROGRESS)
Callbacks->Reserved1;
160 if (
Init->TransferType != UcxTransferType::Control)
163 if (
Init->TransferType == UcxTransferType::Isochronous)
180 Init->TransferType != UcxTransferType::Interrupt &&
181 Init->TransferType != UcxTransferType::Isochronous &&
228 if (
Init->CreateMachine)
238 if (
Init->Kind == UcxEndpointKind::Default)
248 if (
Device->m_Disconnected)
255 Context->m_Controller->m_ChildEndpointCount++;
271 if (
Device->m_StalePipeIoAllowed)
279 DPRINT(
"Endpoint %p address 0x%x created on UsbDevice %p\n",
292UcxEndpoint::EvtDestroy(
342 DPRINT1(
"Endpoint %p HCD asked to cancel transfers again during a TT clear\n",
m_Handle);
350 TtHub->m_HubClearTtBuffer(
TtHub->m_HubContext,
373 UCXSSTREAMS Streams =
NULL;
410 if (
Init->Kind == UcxEndpointKind::Default)
431 DPRINT1(
"UsbDevice %p HCD endpoint add set no endpoint %p or no queue\n",
Device->m_Handle,
Init->Created);
459 Init.Kind = UcxEndpointKind::Default;
460 Init.TransferType = UcxTransferType::Control;
476 UcxTransferType::Control,
477 UcxTransferType::Isochronous,
478 UcxTransferType::Bulk,
479 UcxTransferType::Interrupt
485 Init.Kind = (
Descriptor->wMaxPacketSize == 0) ? UcxEndpointKind::ZeroBandwidth : UcxEndpointKind::Generic;
494 if (
Init.TransferType == UcxTransferType::Isochronous &&
495 Companion->bmAttributes.Isochronous.SspCompanion)
499 sizeof(
Init.IsochCompanion));
517 Post(EpEvent::Delete);
526 return UcxGetStaticStreamsContext(
Handle);
584 DPRINT1(
"Streams %p stream info set outside the add callback\n",
m_Handle);
589 if (StreamInfo->Size !=
sizeof(*StreamInfo))
591 DPRINT1(
"Streams %p stream info has bad size %lu\n",
m_Handle, StreamInfo->Size);
602 DPRINT1(
"Streams %p bad stream info at call %lu, stream ID %lu, queue %p\n",
603 m_Handle,
Index, StreamInfo->StreamId, StreamInfo->WdfQueue);
614 Entry->Streams =
this;
615 Entry->StreamId = StreamInfo->StreamId;
616 Entry->Pipe.Queue = StreamInfo->WdfQueue;
618 Entry->Pipe.TransferType = UcxTransferType::Bulk;
619 Entry->Pipe.Kind = UcxEndpointKind::Generic;
628UcxStaticStreams::EvtDestroy(
730 Irp->IoStatus.Information = 0;
812 WdfIoQueueStart(
Controller->m_TreePurgeQueue);
830 if (!
Device->m_StalePipeIoAllowed)
889 Replaced = Candidate;
899 Parked = !
Device->m_PendingDelete;
904 if (Replaced !=
NULL)
905 Replaced->
Post(EpEvent::StaleReplaced);
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define InterlockedDecrement
const struct winhelp_callbacks Callbacks
VOID AckControllerReset()
VOID FinishStreamsOpenRequest(_In_ BOOLEAN ForceFailure)
VOID FinishStreamsCloseRequest()
BOOLEAN DeviceAllowsStart()
VOID ForwardResetRequest()
VOID ParkStreamsDisableRequest()
BOOLEAN DeviceDisconnected()
VOID ForwardStreamsDisableRequest()
VOID FinishEndpointResetRequest()
VOID RejectStreamsEnableRequest()
BOOLEAN DeviceDeprogrammed()
VOID DereferenceEndpoint()
VOID ForwardStreamsEnableRequest()
VOID DeleteStaleEndpoint()
BOOLEAN ClientHoldsHandle()
VOID CompleteHubOperation()
BOOLEAN m_ClearTtBufferOnAsyncCancel
KSPIN_LOCK m_TopologyLock
VOID PrepareForResetOperationDone()
BOOLEAN m_DriverVerifierEnabled
WDFQUEUE m_PendDuringResetQueue
UcxController * m_Controller
UCXSSTREAMS GetStaticStreamsReferenced(_In_ PVOID Tag)
VOID SetWdfIoQueue(_In_ WDFQUEUE Queue)
static EVT_WDF_OBJECT_CONTEXT_DESTROY EvtDestroy
USB_ENDPOINT_DESCRIPTOR m_Descriptor
UcxEndpointCallbacks m_Callbacks
LIST_ENTRY m_ControllerResetLink
static UcxEndpoint * FromHandle(_In_ UCXENDPOINT Handle)
BOOLEAN Post(_In_ EpEvent Event)
static NTSTATUS CreateThroughHcd(_In_ UcxUsbDevice *Device, _Inout_ UcxEndpointInit *Init, _In_ ULONG MaxPacketSize, _In_opt_ PUSB_ENDPOINT_DESCRIPTOR Descriptor, _In_ ULONG DescriptorBufferLength, _In_opt_ PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR Companion, _Out_ UCXENDPOINT *Endpoint)
UcxStaticStreams * m_Streams
LIST_ENTRY m_TreePurgeLink
static _Must_inspect_result_ NTSTATUS Create(_In_ UCXUSBDEVICE UsbDevice, _Inout_ PUCXENDPOINT_INIT *EndpointInit, _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes, _Out_ UCXENDPOINT *Endpoint)
IO_CSQ_IRP_CONTEXT m_AbortCsqContext
LIST_ENTRY m_DisconnectLink
VOID Initialize(_In_ UcxUsbDevice *Device, _In_ const UcxEndpointInit *Init)
LIST_ENTRY m_TrackingLink
LIST_ENTRY m_OperationLink
static _Must_inspect_result_ NTSTATUS CreateDefaultFromHub(_In_ UCXUSBDEVICE UsbDevice, _In_ ULONG MaxPacketSize, _Out_ UCXENDPOINT *Endpoint)
static _Must_inspect_result_ NTSTATUS CreateFromHub(_In_ UCXUSBDEVICE UsbDevice, _In_ PUSB_ENDPOINT_DESCRIPTOR Descriptor, _In_ ULONG DescriptorBufferLength, _In_opt_ PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR Companion, _Out_ UCXENDPOINT *Endpoint)
BOOLEAN m_ClientHoldsHandle
VOID NeedToCancelTransfers()
BOOLEAN m_ClearTtOnCancel
static VOID InitSetDefaultEventCallbacks(_Inout_ PUCXENDPOINT_INIT Init, _In_ PUCX_DEFAULT_ENDPOINT_EVENT_CALLBACKS Callbacks)
static VOID InitSetEventCallbacks(_Inout_ PUCXENDPOINT_INIT Init, _In_ PUCX_ENDPOINT_EVENT_CALLBACKS Callbacks)
static UcxStaticStreams * FromHandle(_In_ UCXSSTREAMS Handle)
static EVT_WDF_OBJECT_CONTEXT_DESTROY EvtDestroy
UcxStaticStreamsInit * m_Init
VOID SetStreamInfo(_In_ PSTREAM_INFO StreamInfo)
static _Must_inspect_result_ NTSTATUS Create(_In_ UCXENDPOINT Endpoint, _Inout_ PUCXSSTREAMS_INIT *Init, _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes, _Out_ UCXSSTREAMS *StaticStreams)
VOID CompleteHubOperation()
BOOLEAN m_DeprogrammedByControllerReset
BOOLEAN AllowsEndpointStart() const
UCXHUB_DEVICE_CONTEXT m_HubDeviceContext
VOID NTAPI UcxCompleteHeldUrbIrp(_In_ PIRP Irp)
VOID NTAPI UcxCompleteUrbAtDispatch(_In_ PIRP Irp, _In_ PURB Urb, _In_ NTSTATUS Status, _In_ USBD_STATUS UsbdStatus)
NTKERNELAPI PIRP NTAPI IoCsqRemoveIrp(_Inout_ PIO_CSQ Csq, _Inout_ PIO_CSQ_IRP_CONTEXT Context)
Remove anb IRP from the queue.
#define NT_SUCCESS(StatCode)
InitializeListHead & UcxDriver
ULONG NTAPI UcxComputeMaxTransferSize(_In_ USB_DEVICE_SPEED Speed, _In_ USHORT BcdUsb, _In_ const UcxEndpointInit *Init)
static const ULONG UcxMaxTransferTable[4][5]
static VOID NTAPI UcxUntrackEndpoint(_In_ UcxEndpoint *Endpoint)
static ULONG NTAPI UcxSpeedRow(_In_ USB_DEVICE_SPEED Speed)
static BOOLEAN NTAPI UcxIsSlowSpeed(_In_ USB_DEVICE_SPEED Speed)
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define InsertHeadList(ListHead, Entry)
_In_ UCXUSBDEVICE UsbDevice
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
_Must_inspect_result_ _In_ UCXUSBDEVICE _In_ ULONG MaxPacketSize
_Must_inspect_result_ _In_ UCXUSBDEVICE _In_ ULONG _In_opt_ PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR Companion
_In_ UCXHUB_DEVICE_CONTEXT _In_ UCXENDPOINT Endpoint
_Must_inspect_result_ _In_ UCXUSBDEVICE _In_ ULONG DescriptorBufferLength
HRESULT Reset([in] ID3D12CommandAllocator *allocator)
#define InterlockedCompareExchange
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
#define _Must_inspect_result_
#define IoCompleteRequest
#define STATUS_INTERNAL_ERROR
ULONG NTAPI UcxComputeMaxTransferSize(_In_ USB_DEVICE_SPEED Speed, _In_ USHORT BcdUsb, _In_ const UcxEndpointInit *Init)
PFN_UCX_ENDPOINT_PURGE Purge
PFN_UCX_ENDPOINT_STATIC_STREAMS_ENABLE StaticStreamsEnable
PFN_UCX_ENDPOINT_ABORT Abort
PFN_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS OkToCancelTransfers
PFN_UCX_ENDPOINT_RESET Reset
PFN_UCX_ENDPOINT_STATIC_STREAMS_DISABLE StaticStreamsDisable
PFN_UCX_ENDPOINT_START Start
UcxTransferType TransferType
ULONG MaximumTransferSize
ULONG IsochPeriodMicroframes
struct _IO_STACK_LOCATION::@5100::@5139 Others
union _IO_STACK_LOCATION::@1823 Parameters
struct _LIST_ENTRY * Flink
USB_DEVICE_PORT_PATH PortPath
PFN_UCX_USBDEVICE_ENDPOINT_ADD EvtUsbDeviceEndpointAdd
PFN_UCX_USBDEVICE_DEFAULT_ENDPOINT_ADD EvtUsbDeviceDefaultEndpointAdd
PFN_WDF_OBJECT_CONTEXT_DESTROY EvtDestroyCallback
size_t ContextSizeOverride
#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
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
_Must_inspect_result_ _In_ UCXENDPOINT _In_ PVOID Tag
_Must_inspect_result_ _In_ UCXUSBDEVICE _Inout_ PUCXENDPOINT_INIT * EndpointInit
WDF_EXTERN_C_START struct _STREAM_INFO * PSTREAM_INFO
_Must_inspect_result_ _In_ UCXENDPOINT _Inout_ PUCXSSTREAMS_INIT _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXSSTREAMS * StaticStreams
_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 UcxVerifierBreak(_In_ BOOLEAN Verifying)
FORCEINLINE VOID NTAPI UcxClearListEntry(_Out_ PLIST_ENTRY Entry)
#define STATUS_DEVICE_NOT_CONNECTED
#define STATUS_NO_SUCH_DEVICE
#define STATUS_INVALID_DEVICE_STATE
#define USB_ENDPOINT_TYPE_MASK
#define USB_ENDPOINT_DIRECTION_IN(x)
enum _USB_DEVICE_SPEED USB_DEVICE_SPEED
#define USBD_STATUS_SUCCESS
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
#define WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(_attributes, _contexttype)
#define WdfObjectReference(Handle)
#define WdfObjectReferenceWithTag(Handle, Tag)
#define WdfObjectDereference(Handle)
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor