86 XhciRingContext(
Object)->Cleanup();
95 WDFQUEUE
Queue = (WDFQUEUE)WdfWorkItemGetParentObject(
WorkItem);
145 TransferType =
Endpoint->TransferType();
147 NoLinkInTd =
Controller->HasErrata(XhciErrata::RingKeepTdInOneSegment);
178 DPRINT1(
"Endpoint DCI %lu has transfer type %lu, no transfer ring for it\n",
190 DPRINT1(
"Queue for DCI %lu stream %lu not created, 0x%08lx\n",
225 DPRINT1(
"Ready notification for DCI %lu stream %lu not registered, 0x%08lx\n",
238 DPRINT1(
"Segment growth work item for DCI %lu stream %lu not created, 0x%08lx\n",
252 DPRINT1(
"Completion DPC for DCI %lu stream %lu not created, 0x%08lx\n",
278 DPRINT1(
"No initial segment for DCI %lu stream %lu, 0x%08lx\n",
292 DPRINT1(
"Type setup for DCI %lu stream %lu failed, 0x%08lx\n",
300 DPRINT(
"Ring %p for DCI %lu stream %lu type %lu, segment 0x%lx, stage max 0x%lx\n",
311 return XhciRingContext(
Queue);
360 DPRINT1(
"Ring for DCI %lu stream %lu still pooled %lu buffers at cleanup\n",
460XhciTransferRing::Enable()
466 DPRINT1(
"Ring for DCI %lu stream %lu has no segment to enable\n",
486XhciTransferRing::WaitForMappingIdle()
496 if (
State !=
static_cast<LONG>(XhciMapState::Filling) &&
497 State !=
static_cast<LONG>(XhciMapState::Halting))
504 DPRINT1(
"Ring for DCI %lu stream %lu still in map state %ld, disabling anyway\n",
509 static_cast<LONG>(XhciMapState::Halted),
510 static_cast<LONG>(XhciMapState::Halting)) ==
511 static_cast<LONG>(XhciMapState::Halting))
532XhciTransferRing::Disable(
544 WaitForMappingIdle();
555 Previous ==
static_cast<LONG>(XhciMapState::PausedFill));
585XhciTransferRing::EnableForwardProgress(
606 DPRINT1(
"Forward progress setup for DCI %lu stream %lu failed, 0x%08lx\n",
614 DPRINT1(
"No forward progress MDL of %lu bytes for DCI %lu stream %lu\n",
627 DPRINT1(
"Forward progress policy for DCI %lu stream %lu refused, 0x%08lx\n",
642 DPRINT(
"Forward progress on DCI %lu stream %lu for %lu bytes\n",
834 DPRINT1(
"Stale Event Data 0x%I64x for slot %lu DCI %lu type %lu, dropped\n",
872 Missing =
Count - Have;
906 DPRINT1(
"Ring for DCI %lu stream %lu could not get %lu segments, 0x%08lx\n",
913XhciTransferRing::GrowSegments()
939 DPRINT1(
"Ring for DCI %lu stream %lu could not grow by %lu segments, 0x%08lx\n",
981 DPRINT1(
"Ring for DCI %lu stream %lu lost its reserved segments\n",
1064 Changed = (Old ==
static_cast<LONG>(From));
1069 if (To == XhciMapState::Halted)
1072 else if (From == XhciMapState::Filling)
1075 ASSERT(Old ==
static_cast<LONG>(XhciMapState::Halting));
1078 static_cast<LONG>(XhciMapState::Halted),
1079 static_cast<LONG>(XhciMapState::Halting)) ==
1080 static_cast<LONG>(XhciMapState::Halting))
1105 else if (!FirstOfTd && InDataStage)
1122 return (
Bytes + MaxPacket - 1) / MaxPacket;
1138 Sent = BytesMappedSoFar / MaxPacket;
1143 return min(Remaining, 31);
1171 return *(
PULONG)&
Urb->UrbControlTransfer.hca;
1189 case XhciCompletionCode::Invalid:
1193 case XhciCompletionCode::Success:
1194 case XhciCompletionCode::ShortPacket:
1195 case XhciCompletionCode::Stopped:
1196 case XhciCompletionCode::StoppedShortPacket:
1199 case XhciCompletionCode::DataBufferError:
1202 case XhciCompletionCode::BabbleDetected:
1203 case XhciCompletionCode::IsochBufferOverrun:
1206 case XhciCompletionCode::StallError:
1209 case XhciCompletionCode::UsbTransactionError:
1210 case XhciCompletionCode::SplitTransactionError:
1213 case XhciCompletionCode::MissedService:
1216 case XhciCompletionCode::NoPingResponse:
1219 case XhciCompletionCode::StoppedLengthInvalid:
1222 case XhciCompletionCode::InvalidStreamType:
1225 case XhciCompletionCode::InvalidStreamId:
1230 DPRINT1(
"Unexpected completion code %lu reported as a transaction error\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 Parent
#define InterlockedIncrement
#define InterlockedExchange
#define InterlockedDecrement
static VOID Cleanup(_In_ XhciTransferRing *Ring)
static NTSTATUS EnableForwardProgress(_In_ XhciTransferRing *Ring, _In_ ULONG MaxTransferSize)
static VOID RecoverTransfers(_In_ XhciTransferRing *Ring)
static VOID ResumeRingFill(_In_ XhciTransferRing *Ring)
static NTSTATUS Initialize(_In_ XhciTransferRing *Ring)
static EVT_WDF_DPC EvtCompletionDpc
static BOOLEAN DoorbellRungSinceFill(_In_ const XhciTransferRing *Ring)
static BOOLEAN OnTransferEvent(_In_opt_ XhciTransferRing *Ring, _In_ XhciController *Controller, _In_ const XHCI_TRB *Event)
static EVT_WDF_IO_QUEUE_STATE ReadyNotification
static VOID SegmentsArrived(_In_ XhciTransferRing *Ring, _In_ NTSTATUS Status)
static EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtIoCanceledOnQueue
static BOOLEAN IsLikelyDuplicate(_In_ const XhciTransferRing *Ring, _In_ const XHCI_TRB *Event)
static VOID Enable(_In_ XhciTransferRing *Ring)
static BOOLEAN HasQueuedWork(_In_ const XhciTransferRing *Ring)
static VOID ConsumePendingEvents(_In_ XhciTransferRing *Ring)
static VOID Disable(_In_ XhciTransferRing *Ring)
static VOID SuspendRingFill(_In_ XhciTransferRing *Ring)
static VOID OnPipeHalted(_In_ XhciTransferRing *Ring)
static VOID AllowReclaimOnCancel(_In_ XhciTransferRing *Ring)
static VOID StoppedEventReceived(_In_ XhciTransferRing *Ring)
static VOID ReleaseParkedMapping(_In_ XhciTransferRing *Ring)
static VOID Enable(_In_ XhciTransferRing *Ring)
static VOID RecoverTransfers(_In_ XhciTransferRing *Ring)
static BOOLEAN HasQueuedWork(_In_ const XhciTransferRing *Ring)
static BOOLEAN OnTransferEvent(_In_opt_ XhciTransferRing *Ring, _In_ XhciController *Controller, _In_ const XHCI_TRB *Event)
static VOID Disable(_In_ XhciTransferRing *Ring)
static BOOLEAN DoorbellRungSinceFill(_In_ const XhciTransferRing *Ring)
static EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtIoCanceledOnQueue
static EVT_WDF_IO_QUEUE_IO_DEFAULT EvtIoDefault
static NTSTATUS Initialize(_In_ XhciTransferRing *Ring)
static VOID SuspendRingFill(_In_ XhciTransferRing *Ring)
static VOID ResumeRingFill(_In_ XhciTransferRing *Ring)
static VOID Cleanup(_In_ XhciTransferRing *Ring)
static EVT_WDF_DPC EvtCompletionDpc
static NTSTATUS EnableForwardProgress(_In_ XhciTransferRing *Ring, _In_ ULONG MaxTransferSize)
static VOID AllowReclaimOnCancel(_In_ XhciTransferRing *Ring)
static VOID ConsumePendingEvents(_In_ XhciTransferRing *Ring)
XhciCommonBuffer m_Buffers
BOOLEAN HasErrata(_In_ XhciErrata Bit) const
XhciInterrupters m_Interrupters
XhciRegisters m_Registers
USHORT MaxPacketSize() const
ULONG TargetForProcessor(_In_ ULONG ProcessorIndex) const
ULONG TargetForCurrentProcessor() const
static VOID AllowReclaimOnCancel(_In_ XhciTransferRing *Ring)
static VOID SuspendRingFill(_In_ XhciTransferRing *Ring)
static EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtIoCanceledOnQueue
static BOOLEAN OnTransferEvent(_In_ XhciTransferRing *Ring, _In_ const XHCI_TRB *Event)
static VOID ReleaseParkedMapping(_In_ XhciTransferRing *Ring)
static VOID Enable(_In_ XhciTransferRing *Ring)
static VOID RecoverTransfers(_In_ XhciTransferRing *Ring)
static EVT_WDF_DPC EvtCompletionDpc
static NTSTATUS Initialize(_In_ XhciTransferRing *Ring)
static BOOLEAN HasQueuedWork(_In_ const XhciTransferRing *Ring)
static VOID OnClientPipeReset(_In_ XhciTransferRing *Ring)
static VOID Disable(_In_ XhciTransferRing *Ring)
static VOID ConsumePendingEvents(_In_ XhciTransferRing *Ring)
static BOOLEAN DoorbellRungSinceFill(_In_ const XhciTransferRing *Ring)
static VOID Cleanup(_In_ XhciTransferRing *Ring)
static VOID SegmentsArrived(_In_ XhciTransferRing *Ring, _In_ NTSTATUS Status)
static EVT_WDF_IO_QUEUE_STATE ReadyNotification
static VOID ResumeRingFill(_In_ XhciTransferRing *Ring)
UCHAR VersionMajor() const
XhciDmaBuffer * BorrowBounceBuffer()
static XhciTransferRing * FromQueue(_In_ WDFQUEUE Queue)
BOOLEAN HasQueuedWork() const
XhciMapState ChangeMapState(_In_ BOOLEAN FromAny, _In_ XhciMapState From, _In_ XhciMapState To)
VOID AllowReclaimOnCancel()
static XhciTransferRing * ReferenceLiveRing(_In_ XhciController *Controller, _In_ const XhciUsbDevice *Device, _In_ ULONG Dci)
ULONG m_InterrupterTarget
BOOLEAN IsControl() const
static ULONG UrbProcessorIndex(_In_ PURB Urb)
ULONG64 DequeuePointerValue() const
static NTSTATUS NtStatusFromUsbdStatus(_In_ USBD_STATUS UsbdStatus)
XhciController * m_Controller
BOOLEAN OnTransferEvent(_In_ const XHCI_TRB *Event)
ULONG64 EnqueuePointer() const
static NTSTATUS Create(_In_ XhciEndpoint *Endpoint, _In_ WDFOBJECT Parent, _In_ ULONG StreamId, _Out_ XhciTransferRing **Ring)
VOID ReturnBounceBuffer(_In_ XhciDmaBuffer *Buffer)
VOID ConsumePendingEvents()
ULONG TdSize(_In_ ULONG PacketCount, _In_ ULONG BytesMappedSoFar, _In_ BOOLEAN LastTrbOfTd) const
VOID ReturnSegments(_Inout_ PLIST_ENTRY List, _In_ BOOLEAN ToHead)
ULONG64 SegmentBase() const
NTSTATUS TakeSegments(_In_ ULONG Count, _Inout_ PLIST_ENTRY List)
BOOLEAN IsLikelyDuplicate(_In_ const XHCI_TRB *Event) const
ULONG PacketCount(_In_ ULONG Bytes) const
BOOLEAN m_ForwardProgressQueue
NTSTATUS EnsureFreeSegments(_In_ ULONG Count, _In_ BOOLEAN Async)
BOOLEAN DoorbellRungSinceFill() const
LIST_ENTRY m_FreeSegments
LIST_ENTRY m_DoubleBuffers
static USBD_STATUS UsbdStatusFromCompletionCode(_In_ ULONG CompletionCode)
VOID StoppedEventReceived()
XhciDmaBuffer * m_Segment
BOOLEAN IsBulkOrInterrupt() const
XhciEndpoint * m_Endpoint
VOID UpdateInterrupterTarget()
static BOOLEAN OnUntargetedTransferEvent(_In_ XhciController *Controller, _In_ const XHCI_TRB *Event)
VOID BuildLinkTrb(_Out_ PXHCI_TRB Trb, _In_ BOOLEAN FirstOfTd, _In_ BOOLEAN InDataStage) const
volatile LONG m_EventUsers
#define STATUS_NOT_SUPPORTED
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
#define NT_SUCCESS(StatCode)
#define _IRQL_requires_max_(irql)
#define _IRQL_requires_(irql)
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define InsertHeadList(ListHead, Entry)
#define IsListEmpty(ListHead)
#define KeGetCurrentIrql()
#define RemoveTailList(ListHead)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
#define KeDelayExecutionThread(mode, foo, t)
#define KeInitializeSpinLock(sl)
#define USB3_URB_RESERVED_RESOURCES
WdfWorkItemEnqueue(WorkItem)
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
_In_opt_ PVOID _In_ PUCXHUB_WORKITEM WorkItem
_In_ UCXHUB_DEVICE_CONTEXT _In_ UCXENDPOINT Endpoint
#define InterlockedCompareExchange
static int Passive(const FTPCIPtr cip, struct sockaddr_in *saddr, int *weird)
#define KeStallExecutionProcessor(MicroSeconds)
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG MaxTransferSize
#define KeQueryInterruptTime()
FORCEINLINE VOID KeMemoryBarrier(VOID)
PHYSICAL_ADDRESS LogicalAddress
struct _IO_STACK_LOCATION::@5100::@5139 Others
union _IO_STACK_LOCATION::@1823 Parameters
struct _LIST_ENTRY * Flink
BOOLEAN AutomaticSerialization
PFN_WDF_IO_QUEUE_IO_DEFAULT EvtIoDefault
PFN_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtIoCanceledOnQueue
BOOLEAN AutomaticSerialization
#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
#define STATUS_INVALID_PARAMETER
#define STATUS_NO_SUCH_DEVICE
#define STATUS_UNSUCCESSFUL
#define STATUS_INVALID_DEVICE_STATE
#define STATUS_INSUFFICIENT_RESOURCES
#define USB_ENDPOINT_TYPE_INTERRUPT
#define USB_ENDPOINT_TYPE_CONTROL
#define USB_ENDPOINT_TYPE_ISOCHRONOUS
#define USB_ENDPOINT_TYPE_BULK
#define USBD_STATUS_DATA_BUFFER_ERROR
#define USBD_STATUS_DEVICE_GONE
#define USBD_STATUS_ISO_NOT_ACCESSED_BY_HW
#define USBD_STATUS_INVALID_STREAM_ID
#define USBD_STATUS_INVALID_PIPE_HANDLE
#define USBD_STATUS_CANCELED
#define USBD_STATUS_STALL_PID
#define USBD_STATUS_ISO_TD_ERROR
#define USBD_STATUS_SUCCESS
#define USBD_STATUS_INVALID_STREAM_TYPE
#define USBD_STATUS_NOT_SUPPORTED
#define USBD_STATUS_INSUFFICIENT_RESOURCES
#define USBD_STATUS_NO_PING_RESPONSE
#define USBD_STATUS_INVALID_PARAMETER
#define USBD_STATUS_PORT_OPERATION_PENDING
#define USBD_STATUS_XACT_ERROR
#define USBD_STATUS_INVALID_URB_FUNCTION
#define USBD_STATUS_BABBLE_DETECTED
#define USBD_STATUS_BAD_START_FRAME
#define USBD_STATUS(Status)
_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
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
FORCEINLINE VOID WDF_DPC_CONFIG_INIT(_Out_ PWDF_DPC_CONFIG Config, _In_ PFN_WDF_DPC EvtDpcFunc)
EVT_WDF_DPC * PFN_WDF_DPC
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY Policy
@ WdfIoForwardProgressActionUseReservedRequest
@ WdfIoForwardProgressActionFailRequest
FORCEINLINE VOID WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY_EXAMINE_INIT(_Out_ PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY Policy, _In_ ULONG TotalForwardProgressRequests, _In_ PFN_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS EvtIoWdmIrpForForwardProgress)
FORCEINLINE VOID WDF_IO_QUEUE_CONFIG_INIT(_Out_ PWDF_IO_QUEUE_CONFIG Config, _In_ WDF_IO_QUEUE_DISPATCH_TYPE DispatchType)
@ WdfIoQueueDispatchSequential
@ WdfIoQueueDispatchManual
enum _WDF_IO_FORWARD_PROGRESS_ACTION WDF_IO_FORWARD_PROGRESS_ACTION
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
#define WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(_attributes, _contexttype)
#define WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(_contexttype, _castingfunction)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_Must_inspect_result_ _In_ WDFCMRESLIST List
_In_ NTSTATUS _In_ USBD_STATUS UsbdStatus
_In_ WDF_WMI_PROVIDER_CONTROL Control
FORCEINLINE VOID WDF_WORKITEM_CONFIG_INIT(_Out_ PWDF_WORKITEM_CONFIG Config, _In_ PFN_WDF_WORKITEM EvtWorkItemFunc)
static VOID FreeResources(VOID)
_Inout_ PVOID _In_ ULONG SegmentSize
static EVT_WDF_OBJECT_CONTEXT_CLEANUP XhciRingQueueCleanup
static VOID NTAPI XhciRingPrependList(_Inout_ PLIST_ENTRY To, _Inout_ PLIST_ENTRY From)
static const ULONG XhciRingSegmentBytes
static EVT_WDF_WORKITEM XhciRingGrowthWorkItem
static LIST_ENTRY XhciLiveRings
static const ULONG XhciRingSingleSegmentStage
static const ULONG XhciRingDoubleBufferBytes
static EVT_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS XhciRingExamineForwardProgress
static const ULONG XhciRingIdleWaitUs
static ULONG NTAPI XhciRingCountList(_In_ const LIST_ENTRY *Head)
static KSPIN_LOCK XhciLiveRingLock
static const ULONG XhciRingWideSegmentBytes
static VOID NTAPI XhciRingAppendList(_Inout_ PLIST_ENTRY To, _Inout_ PLIST_ENTRY From)
static const USBD_STATUS XhciRingUsbdNotSet
static const ULONG XhciRingIdleWaitMs
#define XHCI_URB_NO_PROCESSOR
#define XHCI_SCT_PRIMARY_RING
#define XHCI_TRB_ENDPOINT_MASK
#define XHCI_TRB_TYPE_SHIFT
FORCEINLINE ULONG64 NTAPI XhciTrbPointer(_In_ const XHCI_TRB *Trb)
#define XHCI_TRB_ENDPOINT_SHIFT
#define XHCI_TRB_INTERRUPTER_MASK
struct _XHCI_TRB * PXHCI_TRB
#define XHCI_TRB_INTERRUPTER_SHIFT
#define XHCI_DEQUEUE_CYCLE
#define XHCI_DEQUEUE_SCT_SHIFT
#define XHCI_EVENT_DATA_TYPE_MASK
struct _XHCI_TRB XHCI_TRB
FORCEINLINE ULONG NTAPI XhciTrbSlotId(_In_ const XHCI_TRB *Trb)
FORCEINLINE LARGE_INTEGER NTAPI XhciRelativeMs(_In_ ULONG Milliseconds)
FORCEINLINE VOID NTAPI XhciClearListEntry(_Out_ PLIST_ENTRY Entry)