49 return &Ring->m_Type.Control;
146 Ring->BuildLinkTrb(&
Link, FirstOfTd, InDataStage);
151 Ring->m_Trbs[Ring->m_EnqueueIndex] =
Link;
153 Ring->m_EnqueueIndex = 0;
170 Trb->Dword[3] = (Trb->Dword[3] & ~XHCI_TRB_CYCLE) | Cycle;
171 Ring->m_Trbs[Ring->m_EnqueueIndex] = *Trb;
172 Ring->m_EnqueueIndex++;
202 Self->
m_ImmediateAllowed = !Ring->m_Controller->HasErrata(XhciErrata::XferNoInlineData) &&
211 DPRINT1(
"Control ring %p: no timeout timer, status 0x%lx\n", Ring,
Status);
221 DPRINT1(
"Control ring %p: no DPC for requests canceled in the queue, status 0x%lx\n",
248 if (
State == XhciMapState::PausedFill)
250 else if (
State == XhciMapState::Filling ||
State == XhciMapState::Halting)
251 DPRINT1(
"Control ring %p disabled in map state %ld\n", Ring,
static_cast<LONG>(
State));
274 if (Trbs > Ring->m_LastIndex + 1)
275 DPRINT1(
"Control ring %p: %lu TRBs for a forward progress transfer exceed the segment\n", Ring, Trbs);
278 Ring->m_DoubleBufferSize = 0;
321 Transfer->Mechanism = XhciControlMechanism::NoData;
322 Transfer->BytesTotal =
Urb->UrbControlTransfer.TransferBufferLength;
324 Transfer->CancelState = XhciControlCancel::Idle;
325 Transfer->TimeoutState = XhciControlTimeout::Idle;
327 Transfer->CompletionCode =
static_cast<ULONG>(XhciCompletionCode::Invalid);
330 Transfer->Initialized =
TRUE;
333 Urb->UrbControlTransfer.TransferBufferLength = 0;
356 Transfer = &
Data->Control;
371 Self->CompleteHeld();
395 if (Transfer->DoubleBuffer !=
NULL)
398 Transfer->DoubleBuffer =
NULL;
401 if (Transfer->SgList !=
NULL)
405 Adapter->
DmaOperations->PutScatterGatherList(Adapter, Transfer->SgList, !Transfer->DataIn);
407 Transfer->SgList =
NULL;
414 else if (Transfer->Mdl !=
NULL && Transfer->Mdl != Transfer->Urb->UrbControlTransfer.TransferBufferMDL)
419 Transfer->Mdl =
NULL;
420 Transfer->SystemBuffer =
NULL;
421 Transfer->Mechanism = XhciControlMechanism::NoData;
430 PMDL UrbMdl =
Urb->TransferBufferMDL;
443 Mechanism = XhciControlMechanism::Immediate;
447 Mechanism = XhciControlMechanism::Dma;
449 if ((UrbMdl ==
NULL || UrbMdl->Next ==
NULL) && Bytes <= Ring->m_DoubleBufferSize)
452 if (Transfer->DoubleBuffer !=
NULL)
453 Mechanism = XhciControlMechanism::DoubleBuffer;
457 Transfer->Mechanism = Mechanism;
459 if (Mechanism != XhciControlMechanism::Dma)
461 Transfer->SystemBuffer =
Urb->TransferBuffer;
462 if (Transfer->SystemBuffer ==
NULL && UrbMdl !=
NULL)
465 if (Transfer->SystemBuffer ==
NULL)
467 DPRINT1(
"Control request %p: no system address for its buffer\n", Transfer->Request);
471 else if (UrbMdl !=
NULL)
473 Transfer->Mdl = UrbMdl;
485 DPRINT1(
"Control request %p: no MDL for %lu bytes\n", Transfer->Request,
Bytes);
500 DPRINT1(
"Control request %p: %lu bytes is more than 64 KB\n", Transfer->Request,
Bytes);
506 DPRINT1(
"Control request %p: %lu bytes is more than the DMA stage size %lu\n",
515 DPRINT1(
"Control request %p: stage sized buffer %p is not page aligned\n",
516 Transfer->Request, Transfer->SystemBuffer);
520 if (Mechanism == XhciControlMechanism::Dma && Transfer->Mdl->Next !=
NULL)
522 DPRINT1(
"Control request %p: chained MDLs are not supported\n", Transfer->Request);
543 if (
Urb->UrbHeader.Function == URB_FUNCTION_CONTROL_TRANSFER_EX &&
544 Urb->UrbControlTransferEx.Timeout != 0)
547 if (Transfer->TimeoutState == XhciControlTimeout::Idle ||
548 Transfer->TimeoutState == XhciControlTimeout::Armed)
550 Transfer->TimeoutState = XhciControlTimeout::Armed;
558 if (Transfer->Mechanism != XhciControlMechanism::Dma)
570 Transfer->BytesTotal,
579 DPRINT1(
"Control request %p: scatter gather list not built, status 0x%lx\n",
580 Transfer->Request,
Status);
585 Transfer->Status =
Status;
653 volatile UCHAR* CycleByte;
667 if (
Controller->HasErrata(XhciErrata::RingKeepTdInOneSegment) &&
674 while (
Next != XhciCtlStep::Done)
682 Step == XhciCtlStep::MoreData ||
683 Step == XhciCtlStep::DataEventData ||
684 Step == XhciCtlStep::StatusEventData);
694 case XhciCtlStep::Setup:
696 if (Transfer->BytesTotal == 0)
705 Next = Transfer->BytesTotal ? XhciCtlStep::FirstData : XhciCtlStep::Status;
709 case XhciCtlStep::FirstData:
710 case XhciCtlStep::MoreData:
712 if (Step == XhciCtlStep::FirstData)
715 if (Transfer->DataIn)
726 if (Transfer->Mechanism == XhciControlMechanism::Immediate)
730 Chunk = Transfer->BytesTotal;
733 else if (Transfer->Mechanism == XhciControlMechanism::DoubleBuffer)
735 if (!Transfer->DataIn)
738 Transfer->SystemBuffer,
739 Transfer->BytesTotal);
742 Address = Transfer->DoubleBuffer->LogicalAddress.QuadPart;
745 Chunk = Transfer->BytesTotal;
757 DirOnNormal = Transfer->DataIn;
775 LastData = (Element >=
SgList->NumberOfElements);
785 Next = XhciCtlStep::DataEventData;
789 Next = XhciCtlStep::MoreData;
794 case XhciCtlStep::DataEventData:
795 case XhciCtlStep::StatusEventData:
798 if (Step == XhciCtlStep::StatusEventData)
805 Next = (Step == XhciCtlStep::DataEventData) ? XhciCtlStep::Status : XhciCtlStep::Done;
809 case XhciCtlStep::Status:
813 if (!Transfer->DataIn)
815 Next = XhciCtlStep::StatusEventData;
821 Next = XhciCtlStep::Done;
830 Transfer->FirstIndex = FirstSlot;
840 if (Transfer->TagArmed)
842 Tag->Transfer = Transfer;
843 Transfer->TagIndex =
Tag->Index;
844 Transfer->TagArmed =
TRUE;
846 Transfer->TdCount = TdCount;
863 CycleByte =
reinterpret_cast<volatile UCHAR*
>(&Ring->
m_Trbs[FirstSlot]) + 12;
898 WDFREQUEST
Request = Transfer->Request;
924 Status = Transfer->Status;
926 Urb->UrbControlTransfer.TransferBufferLength = Transfer->BytesTransferred;
928 DPRINT(
"Control request %p done, status 0x%lx, URB status 0x%lx, %lu of %lu bytes\n",
933 ReleaseResources(Transfer);
934 Transfer->Initialized =
FALSE;
961 if (!WdfTimerStop(m_Timer,
FALSE))
997 Pending = (Transfer->TimeoutState == XhciControlTimeout::Armed);
999 Pending = (Transfer->CancelState == XhciControlCancel::Armed);
1015 Lost = (Transfer->TimeoutState == XhciControlTimeout::TimerRoutinePending);
1017 Lost = (Transfer->CancelState == XhciControlCancel::CancelRoutinePending);
1025 Transfer->TimeoutState = XhciControlTimeout::Expired;
1027 Transfer->CancelState = XhciControlCancel::Done;
1057 if (Transfer ==
NULL)
1060 DPRINT(
"Control request %p timed out\n", Transfer->
Request);
1076 DPRINT1(
"Control request %p canceled on the queue has no driver context\n",
Request);
1081 Transfer = &XhciGetRequestData(
Request)->Control;
1112 Self->Finish(Transfer);
1156 Ring->m_DoorbellRung =
FALSE;
1163 DPRINT1(
"Control ring %p: mapping started in map state %ld\n", Ring, Ring->m_MapState);
1166 if (Transfer ==
NULL)
1170 else if (Transfer->
CancelState == XhciControlCancel::Done ||
1217 Ring->m_Endpoint->OnMappingStopped();
1254 Ring->m_Endpoint->OnExpectedEventsProcessed();
1274 Ring->m_Endpoint->OnTransfersReclaimed();
1298 return Ring->m_Type.Control.m_Current !=
NULL;
1303XhciControlRing::EventTag*
1309 EventTag*
Tag =
reinterpret_cast<EventTag*
>(
Address);
1361 DPRINT1(
"Control Event Data value 0x%I64x names no live transfer, dropped\n",
1366 DPRINT1(
"Control ring %p: Event Data value 0x%I64x is not one of its own, dropped\n",
1392 Transfer =
Tag->Transfer;
1397 DPRINT1(
"Control ring %p: stale Event Data event, code %lu, dropped\n", Ring,
Code);
1403 DPRINT1(
"Control ring %p: event for slot %lu endpoint %lu, ring is slot %lu endpoint %lu\n",
1409 DPRINT1(
"Control ring %p: %lu bytes reported for a %lu byte request\n",
1417 CopyIn(Transfer,
Bytes);
1434 else if (
Code ==
static_cast<ULONG>(XhciCompletionCode::StoppedShortPacket))
1454 if (Transfer->
CancelState != XhciControlCancel::Done &&
1511 *SkippedTds = Transfer->TdCount;
1516 for (Visited = 0; Visited <= Ring->
m_LastIndex; Visited++)
1524 if (
Type ==
static_cast<ULONG>(XhciTrbType::Link) && !Match &&
Index != Transfer->EndIndex)
1530 if (
Type ==
static_cast<ULONG>(XhciTrbType::Normal) ||
Type ==
static_cast<ULONG>(XhciTrbType::DataStage))
1536 else if (
Code == XhciCompletionCode::StoppedShortPacket)
1538 *
Bytes = EventLength;
1540 else if (
Code == XhciCompletionCode::Stopped ||
1541 Code == XhciCompletionCode::DataBufferError ||
1542 Code == XhciCompletionCode::BabbleDetected ||
1543 Code == XhciCompletionCode::StallError ||
1544 Code == XhciCompletionCode::UsbTransactionError ||
1545 Code == XhciCompletionCode::SplitTransactionError)
1548 if (EventLength <=
Length)
1552 else if (
Type ==
static_cast<ULONG>(XhciTrbType::EventData) && !Match)
1562 if (
Index == Transfer->EndIndex)
1592 if (Transfer ==
NULL)
1595 DPRINT(
"Control ring %p: event code %lu with no request held\n", Ring,
Code);
1604 if (Pointer >=
Base && Pointer < Base + Ring->m_SegmentSize)
1606 if (
Controller->HasErrata(XhciErrata::EvtDiscardRepeatedEd0))
1608 DPRINT1(
"Control ring %p: TRB 0x%I64x is outside the request, likely a duplicate, dropped\n",
1613 DPRINT1(
"Control ring %p: TRB 0x%I64x is outside the request, likely a duplicate, resetting\n",
1620 DPRINT1(
"Control ring %p: TRB 0x%I64x is not on the ring, resetting\n", Ring, Pointer);
1636 CopyIn(Transfer,
Bytes);
1652 else if (
Code ==
static_cast<ULONG>(XhciCompletionCode::StoppedShortPacket))
1666 DPRINT1(
"Control ring %p: unexpected code %lu for TRB 0x%I64x\n", Ring,
Code, Pointer);
#define InterlockedExchange
PDMA_ADAPTER DmaAdapter() const
static EventTag * TagFromEvent(_In_opt_ XhciTransferRing *Ring, _In_ const XHCI_TRB *Event)
BOOLEAN m_CanceledDpcRunning
static VOID Enable(_In_ XhciTransferRing *Ring)
static VOID RecoverTransfers(_In_ XhciTransferRing *Ring)
XhciTransferRing * m_Ring
static BOOLEAN HasQueuedWork(_In_ const XhciTransferRing *Ring)
BOOLEAN m_ReclaimOnCancelAllowed
static BOOLEAN OnTransferEvent(_In_opt_ XhciTransferRing *Ring, _In_ XhciController *Controller, _In_ const XHCI_TRB *Event)
BOOLEAN OnEventDataEvent(_In_ EventTag *Tag, _In_ const XHCI_TRB *Event)
EventTag m_Tags[TagCount]
static const ULONG TagCount
WDFDPC m_CanceledOnQueueDpc
static VOID Disable(_In_ XhciTransferRing *Ring)
static BOOLEAN DoorbellRungSinceFill(_In_ const XhciTransferRing *Ring)
static EVT_WDF_DPC EvtCanceledOnQueueDpc
VOID BuildControlTd(_Inout_ XhciControlTransfer *Transfer)
static EVT_WDF_REQUEST_CANCEL EvtRequestCancel
VOID Abort(_Inout_ XhciControlTransfer *Transfer, _In_ BOOLEAN FromTimer)
VOID ReleaseResources(_Inout_ XhciControlTransfer *Transfer)
static EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtIoCanceledOnQueue
static EVT_WDF_IO_QUEUE_IO_DEFAULT EvtIoDefault
static NTSTATUS Initialize(_In_ XhciTransferRing *Ring)
VOID WriteTd(_Inout_ XhciControlTransfer *Transfer)
static EVT_WDF_TIMER EvtTimeout
static VOID SuspendRingFill(_In_ XhciTransferRing *Ring)
VOID InitTransfer(_Out_ XhciControlTransfer *Transfer, _In_ WDFREQUEST Request)
BOOLEAN LocateTrb(_In_ const XhciControlTransfer *Transfer, _In_ const XHCI_TRB *Event, _Out_ PULONG Bytes, _Out_ PULONG SkippedTds) const
BOOLEAN m_ReclaimAndAcknowledge
XhciControlTransfer * m_Current
static DRIVER_LIST_CONTROL EvtDmaReady
static VOID ResumeRingFill(_In_ XhciTransferRing *Ring)
volatile LONG m_ReservedMdlBusy
LIST_ENTRY m_CanceledOnQueue
BOOLEAN m_ImmediateAllowed
BOOLEAN m_AcknowledgeExpectedEvents
static VOID Cleanup(_In_ XhciTransferRing *Ring)
static EVT_WDF_DPC EvtCompletionDpc
static NTSTATUS EnableForwardProgress(_In_ XhciTransferRing *Ring, _In_ ULONG MaxTransferSize)
BOOLEAN OnTrbEvent(_In_ const XHCI_TRB *Event)
static VOID AllowReclaimOnCancel(_In_ XhciTransferRing *Ring)
static VOID ConsumePendingEvents(_In_ XhciTransferRing *Ring)
NTSTATUS PrepareTransfer(_Inout_ XhciControlTransfer *Transfer)
XhciCommonBuffer m_Buffers
PDEVICE_OBJECT m_WdmDevice
VOID OnTransferCanceled()
VOID OnHaltedCompletionCode(_In_ ULONG CompletionCode, _In_ BOOLEAN TransferFound)
VOID OnExpectedEventsProcessed()
BOOLEAN ShouldDropStoppedEvent() const
VOID OnTransfersReclaimed()
XhciDmaBuffer * BorrowBounceBuffer()
static XhciTransferRing * FromQueue(_In_ WDFQUEUE Queue)
ULONG m_InterrupterTarget
static ULONG UrbProcessorIndex(_In_ PURB Urb)
static NTSTATUS NtStatusFromUsbdStatus(_In_ USBD_STATUS UsbdStatus)
XhciController * m_Controller
ULONG64 EnqueuePointer() const
VOID ReturnBounceBuffer(_In_ XhciDmaBuffer *Buffer)
ULONG TdSize(_In_ ULONG PacketCount, _In_ ULONG BytesMappedSoFar, _In_ BOOLEAN LastTrbOfTd) const
ULONG64 SegmentBase() const
ULONG PacketCount(_In_ ULONG Bytes) const
static USBD_STATUS UsbdStatusFromCompletionCode(_In_ ULONG CompletionCode)
XhciEndpoint * m_Endpoint
VOID UpdateInterrupterTarget()
#define _Requires_lock_held_(lock)
static const ULONG XhciCtlMaxTrbLength
static const ULONG XhciCtlImmediateBytes
static const ULONG XhciCtlWorstCaseTd
static const ULONG_PTR XhciCtlValueFlagBits
static const ULONG XhciCtlReasonDuplicateEvent
static XhciControlRing *NTAPI XhciCtlOf(_In_ XhciTransferRing *Ring)
static const ULONG XhciCtlTagSignature
static BOOLEAN NTAPI XhciCtlIsHaltCode(_In_ ULONG Code)
static const ULONG XhciCtlShortDataStageTrb
static XhciMapState NTAPI XhciCtlMapState(_In_ const XhciTransferRing *Ring)
static VOID NTAPI XhciCtlPut(_Inout_ XhciTransferRing *Ring, _Inout_ PXHCI_TRB Trb, _In_ BOOLEAN FirstOfTd)
static const ULONG XhciCtlReasonBadTrbPointer
static VOID NTAPI XhciCtlSetMapState(_Inout_ XhciTransferRing *Ring, _In_ XhciMapState State)
static VOID NTAPI XhciCtlWrap(_Inout_ XhciTransferRing *Ring, _In_ BOOLEAN FirstOfTd, _In_ BOOLEAN InDataStage)
static const ULONG XhciCtlSetupBytes
static const ULONG_PTR XhciCtlStatusStageFlag
static const ULONG XhciCtlMaxTransfer
static USBD_STATUS NTAPI XhciCtlUsbdStatusFromNt(_In_ NTSTATUS Status)
static ULONG NTAPI XhciCtlTrbType(_In_ enum XhciTrbType Type)
static BOOLEAN NTAPI XhciCtlIsStopCode(_In_ ULONG Code)
#define STATUS_NOT_SUPPORTED
_In_ HANDLE _In_ CONST PDXGKMDT_OPM_GET_INFO_PARAMETERS Parameters
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
#define NT_SUCCESS(StatCode)
#define InsertTailList(ListHead, Entry)
#define IsListEmpty(ListHead)
#define KeRaiseIrql(irql, oldIrql)
#define KeReleaseSpinLock(sl, irql)
#define KeLowerIrql(oldIrql)
#define KeAcquireSpinLock(sl, irql)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
#define USB3_URB_RESERVED_RESOURCES
#define InterlockedCompareExchange
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
VOID NTAPI MmBuildMdlForNonPagedPool(IN PMDL Mdl)
ULONG const BOOLEAN const _Out_ PBOOLEAN Writable
_Out_writes_bytes_to_opt_ AbsoluteSecurityDescriptorSize PSECURITY_DESCRIPTOR _Inout_ PULONG _Out_writes_bytes_to_opt_ DaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ SaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ OwnerSize PSID Owner
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG Offset
_In_ ULONG _In_ ULONG _In_ ULONG Length
_In_ ULONG MaxTransferSize
FORCEINLINE VOID KeMemoryBarrier(VOID)
#define KeAcquireSpinLockAtDpcLevel(SpinLock)
#define KeReleaseSpinLockFromDpcLevel(SpinLock)
PACPI_METHOD_ARGUMENT Next
XhciControlCancel CancelState
XhciControlTimeout TimeoutState
PSCATTER_GATHER_LIST SgList
struct _DMA_OPERATIONS * DmaOperations
#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
#define STATUS_INVALID_DEVICE_STATE
#define STATUS_INSUFFICIENT_RESOURCES
#define USB_ENDPOINT_TYPE_CONTROL
#define USBD_STATUS_CANCELED
#define USBD_TRANSFER_DIRECTION_IN
#define USBD_STATUS_NOT_SUPPORTED
#define USBD_STATUS_INSUFFICIENT_RESOURCES
#define USBD_STATUS_INVALID_PARAMETER
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
_In_ WDFCOLLECTION _In_ ULONG Index
FORCEINLINE LONGLONG WDF_REL_TIMEOUT_IN_MS(_In_ ULONGLONG Time)
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
_In_ UCHAR _In_ UCHAR _In_ ULONG Code
WDF_EXTERN_C_START typedef _In_ WDFDEVICE _In_ WDFCONTEXT _In_ WDF_DMA_DIRECTION _In_ PSCATTER_GATHER_LIST SgList
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
FORCEINLINE VOID WDF_DPC_CONFIG_INIT(_Out_ PWDF_DPC_CONFIG Config, _In_ PFN_WDF_DPC EvtDpcFunc)
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
FORCEINLINE VOID WDF_REQUEST_PARAMETERS_INIT(_Out_ PWDF_REQUEST_PARAMETERS Parameters)
_In_ WDFREQUEST _In_ PFN_WDF_REQUEST_CANCEL EvtRequestCancel
FORCEINLINE VOID WDF_TIMER_CONFIG_INIT(_Out_ PWDF_TIMER_CONFIG Config, _In_ PFN_WDF_TIMER EvtTimerFunc)
_In_ NTSTATUS _In_ USBD_STATUS UsbdStatus
NTKERNELAPI VOID NTAPI WRITE_REGISTER_UCHAR(IN PUCHAR Register, IN UCHAR Value)
struct _SCATTER_GATHER_LIST * PSCATTER_GATHER_LIST
_In_ struct _IRP _In_ struct _SCATTER_GATHER_LIST * ScatterGather
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
#define MmGetMdlVirtualAddress(_Mdl)
#define MmInitializeMdl(_MemoryDescriptorList, _BaseVa, _Length)
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)
#define XHCI_TRB_LENGTH_MASK
#define XHCI_TRB_TRT_SHIFT
#define XHCI_TRB_ENDPOINT_MASK
#define XHCI_TRB_TYPE_SHIFT
FORCEINLINE ULONG64 NTAPI XhciTrbPointer(_In_ const XHCI_TRB *Trb)
#define XHCI_TRANSFER_EVENT_ED
#define XHCI_LINK_TOGGLE_CYCLE
#define XHCI_TRB_TD_SIZE_SHIFT
#define XHCI_TRB_ENDPOINT_SHIFT
#define XHCI_TRB_INTERRUPTER_MASK
#define XHCI_TRB_INTERRUPTER_SHIFT
#define XHCI_TRANSFER_EVENT_LENGTH_MASK
FORCEINLINE ULONG NTAPI XhciTrbCompletionCode(_In_ const XHCI_TRB *Trb)
#define XHCI_TRB_TRT_NO_DATA
FORCEINLINE ULONG NTAPI XhciTrbSlotId(_In_ const XHCI_TRB *Trb)
FORCEINLINE VOID NTAPI XhciClearListEntry(_Out_ PLIST_ENTRY Entry)