ReactOS 0.4.17-dev-1281-g065abb3
XhciTransferRing Class Reference

#include <xferring.h>

Collaboration diagram for XhciTransferRing:

Public Member Functions

WDFQUEUE Queue () const
 
 _IRQL_requires_max_ (DISPATCH_LEVEL) NTSTATUS Enable()
 
 _IRQL_requires_max_ (DISPATCH_LEVEL) VOID Disable(_In_ BOOLEAN FreeResources)
 
 _IRQL_requires_ (PASSIVE_LEVEL) NTSTATUS EnableForwardProgress(_In_ ULONG MaxTransferSize)
 
VOID InitializeRing ()
 
ULONG64 SegmentBase () const
 
ULONG64 EnqueuePointer () const
 
ULONG64 DequeuePointerValue () const
 
VOID ResumeRingFill ()
 
VOID SuspendRingFill ()
 
VOID OnPipeHalted ()
 
VOID OnClientPipeReset ()
 
VOID StoppedEventReceived ()
 
VOID AllowReclaimOnCancel ()
 
VOID ConsumePendingEvents ()
 
VOID RecoverTransfers ()
 
BOOLEAN DoorbellRungSinceFill () const
 
BOOLEAN HasQueuedWork () const
 
BOOLEAN OnTransferEvent (_In_ const XHCI_TRB *Event)
 
BOOLEAN IsLikelyDuplicate (_In_ const XHCI_TRB *Event) const
 
NTSTATUS EnsureFreeSegments (_In_ ULONG Count, _In_ BOOLEAN Async)
 
NTSTATUS TakeSegments (_In_ ULONG Count, _Inout_ PLIST_ENTRY List)
 
VOID ReturnSegments (_Inout_ PLIST_ENTRY List, _In_ BOOLEAN ToHead)
 
XhciDmaBuffer * BorrowBounceBuffer ()
 
VOID ReturnBounceBuffer (_In_ XhciDmaBuffer *Buffer)
 
XhciMapState ChangeMapState (_In_ BOOLEAN FromAny, _In_ XhciMapState From, _In_ XhciMapState To)
 
VOID BuildLinkTrb (_Out_ PXHCI_TRB Trb, _In_ BOOLEAN FirstOfTd, _In_ BOOLEAN InDataStage) const
 
ULONG PacketCount (_In_ ULONG Bytes) const
 
ULONG TdSize (_In_ ULONG PacketCount, _In_ ULONG BytesMappedSoFar, _In_ BOOLEAN LastTrbOfTd) const
 
VOID UpdateInterrupterTarget ()
 
VOID UpdateInterrupterTarget (_In_ ULONG ProcessorIndex)
 
VOID RingDoorbell ()
 
VOID Cleanup ()
 
 _IRQL_requires_ (PASSIVE_LEVEL) VOID GrowSegments()
 
BOOLEAN IsControl () const
 
BOOLEAN IsBulkOrInterrupt () const
 
BOOLEAN IsIsoch () const
 
 _IRQL_requires_max_ (DISPATCH_LEVEL) VOID WaitForMappingIdle()
 
VOID MakeLive ()
 
VOID RetireLive ()
 
VOID DereferenceLive ()
 

Static Public Member Functions

static NTSTATUS Create (_In_ XhciEndpoint *Endpoint, _In_ WDFOBJECT Parent, _In_ ULONG StreamId, _Out_ XhciTransferRing **Ring)
 
static XhciTransferRing * FromQueue (_In_ WDFQUEUE Queue)
 
static BOOLEAN OnUntargetedTransferEvent (_In_ XhciController *Controller, _In_ const XHCI_TRB *Event)
 
static ULONG UrbProcessorIndex (_In_ PURB Urb)
 
static USBD_STATUS UsbdStatusFromCompletionCode (_In_ ULONG CompletionCode)
 
static NTSTATUS NtStatusFromUsbdStatus (_In_ USBD_STATUS UsbdStatus)
 
static XhciTransferRing * ReferenceLiveRing (_In_ XhciController *Controller, _In_ const XhciUsbDevice *Device, _In_ ULONG Dci)
 

Public Attributes

XhciController * m_Controller
 
XhciUsbDevice * m_Device
 
XhciEndpoint * m_Endpoint
 
ULONG m_StreamId
 
ULONG m_TransferType
 
WDFQUEUE m_Queue
 
WDFDPC m_CompletionDpc
 
KSPIN_LOCK m_Lock
 
volatile LONG m_MapState
 
ULONG m_InterrupterTarget
 
BOOLEAN m_DoorbellRung
 
PMDL m_ReservedMdl
 
ULONG m_SegmentSize
 
ULONG m_DoubleBufferSize
 
ULONG m_MaxStageSize
 
ULONG m_MapRegisterCount
 
XhciDmaBuffer * m_Segment
 
PXHCI_TRB m_Trbs
 
ULONG m_EnqueueIndex
 
ULONG m_LastIndex
 
ULONG m_Cycle
 
LIST_ENTRY m_FreeSegments
 
LIST_ENTRY m_DoubleBuffers
 
union {
   XhciControlRing   Control
 
   XhciBulkRing   Bulk
 
   XhciIsochRing   Isoch
 
} m_Type
 
LIST_ENTRY m_LiveLink
 
volatile LONG m_EventUsers
 
BOOLEAN m_Live
 
BOOLEAN m_TypeReady
 
BOOLEAN m_GrowthQueued
 
BOOLEAN m_ForwardProgressQueue
 
ULONG m_GrowthWanted
 
WDFWORKITEM m_GrowthItem
 

Detailed Description

One transfer ring, stored as its WDFQUEUE context; the type specific state follows in m_Type.

Definition at line 28 of file xferring.h.

Member Function Documentation

◆ _IRQL_requires_() [1/2]

XhciTransferRing::_IRQL_requires_ ( PASSIVE_LEVEL  )

◆ _IRQL_requires_() [2/2]

XhciTransferRing::_IRQL_requires_ ( PASSIVE_LEVEL  )

◆ _IRQL_requires_max_() [1/3]

XhciTransferRing::_IRQL_requires_max_ ( DISPATCH_LEVEL  )

◆ _IRQL_requires_max_() [2/3]

XhciTransferRing::_IRQL_requires_max_ ( DISPATCH_LEVEL  )

◆ _IRQL_requires_max_() [3/3]

XhciTransferRing::_IRQL_requires_max_ ( DISPATCH_LEVEL  )

◆ AllowReclaimOnCancel()

VOID XhciTransferRing::AllowReclaimOnCancel ( )

Definition at line 730 of file xferring.cpp.

731{
732 if (IsControl())
734 else if (IsIsoch())
736 else
738}
static VOID AllowReclaimOnCancel(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:680
static VOID AllowReclaimOnCancel(_In_ XhciTransferRing *Ring)
Definition: ctrlxfer.cpp:1221
static VOID AllowReclaimOnCancel(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:702
BOOLEAN IsControl() const
Definition: xferring.cpp:321
BOOLEAN IsIsoch() const
Definition: xferring.cpp:334

Referenced by XhciEndpointMachine::NotifyRingsReclaimOnCancel().

◆ BorrowBounceBuffer()

XhciDmaBuffer * XhciTransferRing::BorrowBounceBuffer ( )

0x200 byte buffer from the double buffer cache, or a new one; NULL on failure.

Definition at line 1014 of file xferring.cpp.

1015{
1017
1018 /* Forward progress rings never double buffer */
1019 if (m_DoubleBufferSize == 0)
1020 return NULL;
1021
1022 {
1023 XhciSpinLockGuard Guard(&m_Lock);
1024
1026 {
1028 XhciClearListEntry(&Buffer->Link);
1029 }
1030 }
1031
1032 if (Buffer == NULL)
1034
1035 return Buffer;
1036}
Definition: bufpool.h:45
XhciCommonBuffer m_Buffers
Definition: hc.h:92
KSPIN_LOCK m_Lock
Definition: xferring.h:177
XhciController * m_Controller
Definition: xferring.h:170
ULONG m_DoubleBufferSize
Definition: xferring.h:184
LIST_ENTRY m_DoubleBuffers
Definition: xferring.h:194
#define NULL
Definition: types.h:112
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
#define RemoveHeadList(ListHead)
Definition: env_spec_w32.h:964
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
FORCEINLINE VOID NTAPI XhciClearListEntry(_Out_ PLIST_ENTRY Entry)
Definition: xhciutil.h:117

Referenced by XhciControlRing::PrepareTransfer().

◆ BuildLinkTrb()

VOID XhciTransferRing::BuildLinkTrb ( _Out_ PXHCI_TRB  Trb,
_In_ BOOLEAN  FirstOfTd,
_In_ BOOLEAN  InDataStage 
) const

Zeroed link TRB with type, cycle, chain and interrupter target set; the caller adds pointer and TC.

Definition at line 1090 of file xferring.cpp.

1094{
1095 ULONG Control;
1096
1097 RtlZeroMemory(Trb, sizeof(*Trb));
1098
1099 /* A TD's first TRB stays invalid until the whole TD is written */
1100 Control = static_cast<ULONG>(XhciTrbType::Link) << XHCI_TRB_TYPE_SHIFT;
1101 Control |= FirstOfTd ? (m_Cycle ^ 1) & XHCI_TRB_CYCLE : m_Cycle & XHCI_TRB_CYCLE;
1102
1103 if (m_Controller->HasErrata(XhciErrata::RingLinkTrbChain))
1105 else if (!FirstOfTd && InDataStage)
1107
1109 Trb->Dword[3] = Control;
1110}
BOOLEAN HasErrata(_In_ XhciErrata Bit) const
Definition: hc.h:58
ULONG m_InterrupterTarget
Definition: xferring.h:179
XhciControlRing Control
Definition: xferring.h:198
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG
Definition: typedefs.h:59
_In_ WDF_WMI_PROVIDER_CONTROL Control
Definition: wdfwmi.h:166
#define XHCI_TRB_TYPE_SHIFT
Definition: xhcihw.h:23
#define XHCI_TRB_INTERRUPTER_MASK
Definition: xhcihw.h:611
#define XHCI_TRB_INTERRUPTER_SHIFT
Definition: xhcihw.h:610
#define XHCI_TRB_CYCLE
Definition: xhcihw.h:22
#define XHCI_TRB_CHAIN
Definition: xhcihw.h:609

◆ ChangeMapState()

XhciMapState XhciTransferRing::ChangeMapState ( _In_ BOOLEAN  FromAny,
_In_ XhciMapState  From,
_In_ XhciMapState  To 
)

Interlocked map state change, unconditional when FromAny; returns the old state.

Definition at line 1048 of file xferring.cpp.

1052{
1053 LONG Old;
1054 BOOLEAN Changed;
1055
1056 if (FromAny)
1057 {
1058 Old = InterlockedExchange(&m_MapState, static_cast<LONG>(To));
1059 Changed = TRUE;
1060 }
1061 else
1062 {
1063 Old = InterlockedCompareExchange(&m_MapState, static_cast<LONG>(To), static_cast<LONG>(From));
1064 Changed = (Old == static_cast<LONG>(From));
1065 }
1066
1067 if (Changed)
1068 {
1069 if (To == XhciMapState::Halted)
1071 }
1072 else if (From == XhciMapState::Filling)
1073 {
1074 /* A stop arrived while this context was mapping; it acknowledges the stop itself */
1075 ASSERT(Old == static_cast<LONG>(XhciMapState::Halting));
1076
1078 static_cast<LONG>(XhciMapState::Halted),
1079 static_cast<LONG>(XhciMapState::Halting)) ==
1080 static_cast<LONG>(XhciMapState::Halting))
1081 {
1083 }
1084 }
1085
1086 return static_cast<XhciMapState>(Old);
1087}
unsigned char BOOLEAN
Definition: actypes.h:127
#define InterlockedExchange
Definition: armddk.h:54
VOID OnMappingStopped()
Definition: epctx.cpp:1237
volatile LONG m_MapState
Definition: xferring.h:178
XhciEndpoint * m_Endpoint
Definition: xferring.h:172
#define TRUE
Definition: types.h:120
#define InterlockedCompareExchange
Definition: interlocked.h:119
#define ASSERT(a)
Definition: mode.c:44
long LONG
Definition: pedump.c:60
XhciMapState
Definition: xferring.h:19

◆ Cleanup()

VOID XhciTransferRing::Cleanup ( )

Definition at line 340 of file xferring.cpp.

341{
342 LIST_ENTRY Leftover;
343
344 /* The queue failed before the ring was filled in */
345 if (m_Controller == NULL)
346 return;
347
348 RetireLive();
349
350 InitializeListHead(&Leftover);
351 {
353
356 }
357
358 if (!IsListEmpty(&Leftover))
359 {
360 DPRINT1("Ring for DCI %lu stream %lu still pooled %lu buffers at cleanup\n",
362 m_Controller->m_Buffers.FreeList(&Leftover);
363 }
364
365 if (m_Segment != NULL)
366 {
368 m_Segment = NULL;
369 m_Trbs = NULL;
370 }
371
372 if (m_ReservedMdl != NULL)
373 {
376 }
377
378 if (!m_TypeReady)
379 return;
380
382 if (IsControl())
384 else if (IsIsoch())
386 else
388}
#define DPRINT1
Definition: precomp.h:8
static VOID Cleanup(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:502
static VOID Cleanup(_In_ XhciTransferRing *Ring)
Definition: ctrlxfer.cpp:286
ULONG Dci() const
Definition: epctx.cpp:257
static VOID Cleanup(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:518
ULONG m_StreamId
Definition: xferring.h:173
PMDL m_ReservedMdl
Definition: xferring.h:181
LIST_ENTRY m_FreeSegments
Definition: xferring.h:193
PXHCI_TRB m_Trbs
Definition: xferring.h:189
XhciDmaBuffer * m_Segment
Definition: xferring.h:188
BOOLEAN m_TypeReady
Definition: xferring.h:229
#define FALSE
Definition: types.h:117
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define IoFreeMdl
Definition: fxmdl.h:89
Definition: typedefs.h:120
static ULONG NTAPI XhciRingCountList(_In_ const LIST_ENTRY *Head)
Definition: xferring.cpp:44
static VOID NTAPI XhciRingAppendList(_Inout_ PLIST_ENTRY To, _Inout_ PLIST_ENTRY From)
Definition: xferring.cpp:60

◆ ConsumePendingEvents()

VOID XhciTransferRing::ConsumePendingEvents ( )

Definition at line 741 of file xferring.cpp.

742{
743 if (IsControl())
745 else if (IsIsoch())
747 else
749}
static VOID ConsumePendingEvents(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:705
static VOID ConsumePendingEvents(_In_ XhciTransferRing *Ring)
Definition: ctrlxfer.cpp:1240
static VOID ConsumePendingEvents(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:726

Referenced by XhciEndpointMachine::NotifyRingsDrainEvents().

◆ Create()

static NTSTATUS XhciTransferRing::Create ( _In_ XhciEndpoint *  Endpoint,
_In_ WDFOBJECT  Parent,
_In_ ULONG  StreamId,
_Out_ XhciTransferRing **  Ring 
)
static

PASSIVE_LEVEL

Referenced by XhciEndpoint::Initialize().

◆ DequeuePointerValue()

ULONG64 XhciTransferRing::DequeuePointerValue ( ) const

Enqueue pointer with DCS, plus SCT 1 for a stream ring (context and Set TR Dequeue value).

Definition at line 670 of file xferring.cpp.

671{
673
674 if (m_Cycle & 1)
676
677 if (m_StreamId != 0)
679
680 return Value;
681}
ULONG64 EnqueuePointer() const
Definition: xferring.cpp:664
unsigned __int64 ULONG64
Definition: imports.h:198
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
#define XHCI_SCT_PRIMARY_RING
Definition: xhcihw.h:613
#define XHCI_DEQUEUE_CYCLE
Definition: xhcihw.h:593
#define XHCI_DEQUEUE_SCT_SHIFT
Definition: xhcihw.h:612

Referenced by XhciEndpoint::CloseStreams(), XhciEndpoint::ControlResetDone(), XhciEndpoint::DequeueAfterReset(), XhciEndpoint::DequeueAfterStop(), XhciEndpoint::EndpointDequeuePointer(), XhciEndpoint::OpenStreams(), XhciEndpointMachine::ReconfigureForReset(), and XhciEndpoint::ResetDropDone().

◆ DereferenceLive()

VOID XhciTransferRing::DereferenceLive ( )

Definition at line 453 of file xferring.cpp.

454{
456}
#define InterlockedDecrement
Definition: armddk.h:52
volatile LONG m_EventUsers
Definition: xferring.h:227

Referenced by OnUntargetedTransferEvent().

◆ DoorbellRungSinceFill()

BOOLEAN XhciTransferRing::DoorbellRungSinceFill ( ) const

Definition at line 763 of file xferring.cpp.

764{
765 if (IsControl())
767
768 if (IsIsoch())
770
772}
static BOOLEAN DoorbellRungSinceFill(_In_ const XhciTransferRing *Ring)
Definition: bulkio.cpp:740
static BOOLEAN DoorbellRungSinceFill(_In_ const XhciTransferRing *Ring)
Definition: ctrlxfer.cpp:1278
static BOOLEAN DoorbellRungSinceFill(_In_ const XhciTransferRing *Ring)
Definition: isoxfer.cpp:750

Referenced by XhciEndpointMachine::DoorbellRungSinceFill().

◆ EnqueuePointer()

ULONG64 XhciTransferRing::EnqueuePointer ( ) const

Definition at line 664 of file xferring.cpp.

665{
666 return SegmentBase() + (ULONG64)m_EnqueueIndex * sizeof(XHCI_TRB);
667}
ULONG m_EnqueueIndex
Definition: xferring.h:190
ULONG64 SegmentBase() const
Definition: xferring.cpp:658

Referenced by DequeuePointerValue(), XhciControlRing::LocateTrb(), and XhciEndpoint::StreamRingEmpty().

◆ EnsureFreeSegments()

NTSTATUS XhciTransferRing::EnsureFreeSegments ( _In_ ULONG  Count,
_In_ BOOLEAN  Async 
)

Makes sure the free pool holds Count segments; Async may return STATUS_PENDING.

Definition at line 853 of file xferring.cpp.

856{
857 LIST_ENTRY Taken;
858 ULONG Have;
859 ULONG Missing;
862
863 {
865
867 }
868
869 if (Have >= Count)
870 return STATUS_SUCCESS;
871
872 Missing = Count - Have;
873 InitializeListHead(&Taken);
874
875 Status = m_Controller->m_Buffers.AcquireList(m_SegmentSize, Missing, &Taken);
876 if (NT_SUCCESS(Status))
877 {
879
881 return STATUS_SUCCESS;
882 }
883
884 /* At PASSIVE_LEVEL the pool already grew synchronously, so the failure is final */
885 if (Async && m_GrowthItem != NULL && KeGetCurrentIrql() > PASSIVE_LEVEL)
886 {
887 {
889
890 if (m_GrowthWanted < Missing)
891 m_GrowthWanted = Missing;
892
893 if (!m_GrowthQueued)
894 {
896 Enqueue = TRUE;
897 }
898 }
899
900 if (Enqueue)
902
903 return STATUS_PENDING;
904 }
905
906 DPRINT1("Ring for DCI %lu stream %lu could not get %lu segments, 0x%08lx\n",
907 m_Endpoint->Dci(), m_StreamId, Missing, Status);
908 return Status;
909}
LONG NTSTATUS
Definition: precomp.h:26
WDFWORKITEM m_GrowthItem
Definition: xferring.h:233
ULONG m_GrowthWanted
Definition: xferring.h:232
ULONG m_SegmentSize
Definition: xferring.h:183
BOOLEAN m_GrowthQueued
Definition: xferring.h:230
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
pFxWorkItem Enqueue()
Status
Definition: gdiplustypes.h:24
WdfWorkItemEnqueue(WorkItem)
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_PENDING
Definition: telnetd.h:14
USHORT Count
Definition: userreq.cpp:200

Referenced by _IRQL_requires_(), and TakeSegments().

◆ FromQueue()

XhciTransferRing * XhciTransferRing::FromQueue ( _In_ WDFQUEUE  Queue)
static

Definition at line 308 of file xferring.cpp.

310{
311 return XhciRingContext(Queue);
312}
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
Definition: wdfdevice.h:2231

Referenced by XhciRingGrowthWorkItem().

◆ HasQueuedWork()

BOOLEAN XhciTransferRing::HasQueuedWork ( ) const

Definition at line 775 of file xferring.cpp.

776{
777 if (IsControl())
779
780 if (IsIsoch())
781 return XhciIsochRing::HasQueuedWork(this);
782
783 return XhciBulkRing::HasQueuedWork(this);
784}
static BOOLEAN HasQueuedWork(_In_ const XhciTransferRing *Ring)
Definition: bulkio.cpp:747
static BOOLEAN HasQueuedWork(_In_ const XhciTransferRing *Ring)
Definition: ctrlxfer.cpp:1295
static BOOLEAN HasQueuedWork(_In_ const XhciTransferRing *Ring)
Definition: isoxfer.cpp:757

◆ InitializeRing()

VOID XhciTransferRing::InitializeRing ( )

Zeroes the current segment and resets enqueue and cycle state.

Definition at line 648 of file xferring.cpp.

649{
652 m_EnqueueIndex = 0;
653 m_LastIndex = m_SegmentSize / sizeof(XHCI_TRB) - 1;
654 m_Cycle = 1;
655}
ULONG m_LastIndex
Definition: xferring.h:191
ULONG Size
Definition: dmapool.h:18
PVOID VirtualAddress
Definition: dmapool.h:16
struct _XHCI_TRB * PXHCI_TRB

Referenced by _IRQL_requires_max_(), XhciEndpoint::ControlResetDone(), XhciEndpoint::DequeueAfterStop(), XhciEndpointMachine::ReconfigureForReset(), and XhciEndpoint::ResetDropDone().

◆ IsBulkOrInterrupt()

BOOLEAN XhciTransferRing::IsBulkOrInterrupt ( ) const

Definition at line 327 of file xferring.cpp.

328{
331}
ULONG m_TransferType
Definition: xferring.h:174
#define USB_ENDPOINT_TYPE_INTERRUPT
Definition: usb100.h:65
#define USB_ENDPOINT_TYPE_BULK
Definition: usb100.h:64

Referenced by IsLikelyDuplicate(), OnPipeHalted(), OnTransferEvent(), OnUntargetedTransferEvent(), and StoppedEventReceived().

◆ IsControl()

◆ IsIsoch()

◆ IsLikelyDuplicate()

BOOLEAN XhciTransferRing::IsLikelyDuplicate ( _In_ const XHCI_TRB *  Event) const

Stream duplicate heuristic for ED = 0 events nobody claimed (bulk only).

Definition at line 843 of file xferring.cpp.

845{
846 if (IsBulkOrInterrupt())
848
849 return FALSE;
850}
static BOOLEAN IsLikelyDuplicate(_In_ const XhciTransferRing *Ring, _In_ const XHCI_TRB *Event)
Definition: bulkio.cpp:762
BOOLEAN IsBulkOrInterrupt() const
Definition: xferring.cpp:327
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287

Referenced by XhciEndpoint::OnTransferEvent().

◆ MakeLive()

VOID XhciTransferRing::MakeLive ( )

Definition at line 391 of file xferring.cpp.

392{
394
396 m_Live = TRUE;
397}
LIST_ENTRY m_LiveLink
Definition: xferring.h:226
BOOLEAN m_Live
Definition: xferring.h:228
#define InsertTailList(ListHead, Entry)
static LIST_ENTRY XhciLiveRings
Definition: xferring.cpp:39
static KSPIN_LOCK XhciLiveRingLock
Definition: xferring.cpp:38

Referenced by _IRQL_requires_().

◆ NtStatusFromUsbdStatus()

NTSTATUS XhciTransferRing::NtStatusFromUsbdStatus ( _In_ USBD_STATUS  UsbdStatus)
static

Definition at line 1237 of file xferring.cpp.

1239{
1240 switch (UsbdStatus)
1241 {
1244 return STATUS_SUCCESS;
1245
1248
1254
1256 return STATUS_NOT_SUPPORTED;
1257
1259 return STATUS_NO_SUCH_DEVICE;
1260
1262 return STATUS_CANCELLED;
1263
1264 default:
1265 return STATUS_UNSUCCESSFUL;
1266 }
1267}
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_NO_SUCH_DEVICE
Definition: udferr_usr.h:136
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define STATUS_CANCELLED
Definition: udferr_usr.h:170
#define USBD_STATUS_DEVICE_GONE
Definition: usb.h:222
#define USBD_STATUS_INVALID_PIPE_HANDLE
Definition: usb.h:205
#define USBD_STATUS_CANCELED
Definition: usb.h:225
#define USBD_STATUS_SUCCESS
Definition: usb.h:177
#define USBD_STATUS_NOT_SUPPORTED
Definition: usb.h:213
#define USBD_STATUS_INSUFFICIENT_RESOURCES
Definition: usb.h:215
#define USBD_STATUS_INVALID_PARAMETER
Definition: usb.h:203
#define USBD_STATUS_PORT_OPERATION_PENDING
Definition: usb.h:178
#define USBD_STATUS_INVALID_URB_FUNCTION
Definition: usb.h:202
#define USBD_STATUS_BAD_START_FRAME
Definition: usb.h:209
_In_ NTSTATUS _In_ USBD_STATUS UsbdStatus
Definition: wdfusb.h:403

Referenced by XhciIsochRing::Finalize().

◆ OnClientPipeReset()

VOID XhciTransferRing::OnClientPipeReset ( )

Definition at line 714 of file xferring.cpp.

715{
716 /* Only an isoch ring cares: its next ASAP URB starts a new stream */
717 if (IsIsoch())
719}
static VOID OnClientPipeReset(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:691

Referenced by XhciEndpointMachine::NotifyRingsClientReset().

◆ OnPipeHalted()

VOID XhciTransferRing::OnPipeHalted ( )

Definition at line 706 of file xferring.cpp.

707{
708 /* A halted control ring waits for its reset and an isoch ring never reports a halt */
709 if (IsBulkOrInterrupt())
711}
static VOID OnPipeHalted(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:666

Referenced by XhciEndpointMachine::NotifyRingsHalted().

◆ OnTransferEvent()

BOOLEAN XhciTransferRing::OnTransferEvent ( _In_ const XHCI_TRB *  Event)

TRUE when this ring recognized the event (the endpoint gave it to this ring).

Definition at line 787 of file xferring.cpp.

789{
790 if (IsControl())
792
793 if (IsBulkOrInterrupt())
795
796 if (IsIsoch())
798
799 return FALSE;
800}
static BOOLEAN OnTransferEvent(_In_opt_ XhciTransferRing *Ring, _In_ XhciController *Controller, _In_ const XHCI_TRB *Event)
Definition: bulkio.cpp:779
static BOOLEAN OnTransferEvent(_In_opt_ XhciTransferRing *Ring, _In_ XhciController *Controller, _In_ const XHCI_TRB *Event)
Definition: ctrlxfer.cpp:1338
static BOOLEAN OnTransferEvent(_In_ XhciTransferRing *Ring, _In_ const XHCI_TRB *Event)
Definition: isoxfer.cpp:772

Referenced by XhciEndpoint::OnTransferEvent(), and OnUntargetedTransferEvent().

◆ OnUntargetedTransferEvent()

BOOLEAN XhciTransferRing::OnUntargetedTransferEvent ( _In_ XhciController *  Controller,
_In_ const XHCI_TRB *  Event 
)
static

Interrupter fast path: finds the ring by slot and DCI; the type module then checks the Event Data value.

Definition at line 803 of file xferring.cpp.

806{
808 ULONG SlotId = XhciTrbSlotId(Event);
810 XhciTransferRing* Ring;
811 BOOLEAN SameType;
812
814 return FALSE;
815
816 /* Find the ring by slot and endpoint id so the type handler can check the pointer before using it */
818 static_cast<const XhciUsbDevice*>(Controller->m_Slots.LookupSlot(SlotId)),
819 Dci);
820 if (Ring == NULL)
821 return FALSE;
822
824 SameType = Ring->IsControl();
825 else
826 SameType = Ring->IsBulkOrInterrupt();
827
828 if (SameType)
829 {
830 Ring->OnTransferEvent(Event);
831 }
832 else
833 {
834 DPRINT1("Stale Event Data 0x%I64x for slot %lu DCI %lu type %lu, dropped\n",
835 XhciTrbPointer(Event), SlotId, Dci, Ring->m_TransferType);
836 }
837
838 Ring->DereferenceLive();
839 return TRUE;
840}
static XhciTransferRing * ReferenceLiveRing(_In_ XhciController *Controller, _In_ const XhciUsbDevice *Device, _In_ ULONG Dci)
Definition: xferring.cpp:419
BOOLEAN OnTransferEvent(_In_ const XHCI_TRB *Event)
Definition: xferring.cpp:787
VOID DereferenceLive()
Definition: xferring.cpp:453
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXCONTROLLER * Controller
_In_ UCHAR EndpointType
Definition: usbdlib.h:252
#define XHCI_TRB_ENDPOINT_MASK
Definition: xhcihw.h:27
FORCEINLINE ULONG64 NTAPI XhciTrbPointer(_In_ const XHCI_TRB *Trb)
Definition: xhcihw.h:60
#define XHCI_TRB_ENDPOINT_SHIFT
Definition: xhcihw.h:26
#define XHCI_EVENT_DATA_TYPE_MASK
Definition: xhcihw.h:324
FORCEINLINE ULONG NTAPI XhciTrbSlotId(_In_ const XHCI_TRB *Trb)
Definition: xhcihw.h:51

Referenced by XhciRouteTransferEvent().

◆ PacketCount()

ULONG XhciTransferRing::PacketCount ( _In_ ULONG  Bytes) const

Definition at line 1113 of file xferring.cpp.

1115{
1116 ULONG MaxPacket = m_Endpoint->MaxPacketSize();
1117
1118 /* xHCI 0.96 parts take no TD Size, so the count is not needed */
1119 if (m_Controller->m_Registers.VersionMajor() < 1 || MaxPacket == 0)
1120 return 0;
1121
1122 return (Bytes + MaxPacket - 1) / MaxPacket;
1123}
XhciRegisters m_Registers
Definition: hc.h:91
USHORT MaxPacketSize() const
Definition: epctx.cpp:275
UCHAR VersionMajor() const
Definition: mmio.cpp:615
_In_ UINT Bytes
Definition: mmcopy.h:9

Referenced by TdSize(), and XhciControlRing::WriteTd().

◆ Queue()

◆ RecoverTransfers()

VOID XhciTransferRing::RecoverTransfers ( )

Definition at line 752 of file xferring.cpp.

753{
754 if (IsControl())
756 else if (IsIsoch())
758 else
760}
static VOID RecoverTransfers(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:724
static VOID RecoverTransfers(_In_ XhciTransferRing *Ring)
Definition: ctrlxfer.cpp:1258
static VOID RecoverTransfers(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:734

Referenced by XhciEndpointMachine::NotifyRingsReclaim().

◆ ReferenceLiveRing()

XhciTransferRing * XhciTransferRing::ReferenceLiveRing ( _In_ XhciController *  Controller,
_In_ const XhciUsbDevice *  Device,
_In_ ULONG  Dci 
)
static

Finds the non stream ring of Device and Dci and takes an event reference on it.

Definition at line 419 of file xferring.cpp.

423{
427
429 {
431
432 if (Ring->m_Controller != Controller ||
433 Ring->m_Device != Device ||
434 Ring->m_Endpoint->Dci() != Dci)
435 {
436 continue;
437 }
438
439 /* The event does not say which stream it belongs to; the endpoint sorts that out */
440 if (Ring->m_StreamId != 0)
441 return NULL;
442
443 Found = Ring;
444 }
445
446 if (Found != NULL)
447 InterlockedIncrement(&Found->m_EventUsers);
448
449 return Found;
450}
#define InterlockedIncrement
Definition: armddk.h:53
return Found
Definition: dirsup.c:1270
XhciUsbDevice * m_Device
Definition: xferring.h:171
PLIST_ENTRY Entry
Definition: devhcd.cpp:1262
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
Definition: hubucx.h:258
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121

Referenced by OnUntargetedTransferEvent().

◆ ResumeRingFill()

VOID XhciTransferRing::ResumeRingFill ( )

Definition at line 684 of file xferring.cpp.

685{
686 if (IsControl())
688 else if (IsIsoch())
690 else
692}
static VOID ResumeRingFill(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:606
static VOID ResumeRingFill(_In_ XhciTransferRing *Ring)
Definition: ctrlxfer.cpp:1145
static VOID ResumeRingFill(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:636

Referenced by XhciEndpointMachine::ResumeRingFill().

◆ RetireLive()

VOID XhciTransferRing::RetireLive ( )

Definition at line 400 of file xferring.cpp.

401{
402 {
404
405 if (!m_Live)
406 return;
407
410 m_Live = FALSE;
411 }
412
413 /* Nobody can find the ring anymore; let an event handler already inside it finish */
414 while (InterlockedCompareExchange(&m_EventUsers, 0, 0) != 0)
416}
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define YieldProcessor
Definition: ke.h:48

Referenced by Cleanup().

◆ ReturnBounceBuffer()

VOID XhciTransferRing::ReturnBounceBuffer ( _In_ XhciDmaBuffer *  Buffer)

Definition at line 1039 of file xferring.cpp.

1041{
1042 XhciSpinLockGuard Guard(&m_Lock);
1043
1045}

Referenced by XhciControlRing::ReleaseResources().

◆ ReturnSegments()

VOID XhciTransferRing::ReturnSegments ( _Inout_ PLIST_ENTRY  List,
_In_ BOOLEAN  ToHead 
)

Returns segments to the pool; the caller holds m_Lock.

Definition at line 989 of file xferring.cpp.

992{
993 if (IsListEmpty(List))
994 return;
995
996 if (m_Controller->HasErrata(XhciErrata::RingClearNewSegments))
997 {
999
1000 for (Entry = List->Flink; Entry != List; Entry = Entry->Flink)
1001 {
1003 RtlZeroMemory(Segment->VirtualAddress, Segment->Size);
1004 }
1005 }
1006
1007 if (ToHead)
1009 else
1011}
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
_Inout_ PVOID Segment
Definition: exfuncs.h:1101
static VOID NTAPI XhciRingPrependList(_Inout_ PLIST_ENTRY To, _Inout_ PLIST_ENTRY From)
Definition: xferring.cpp:72

◆ RingDoorbell()

VOID XhciTransferRing::RingDoorbell ( )

Rings this ring's doorbell (DCI and stream id) and records that it was rung.

Definition at line 1175 of file xferring.cpp.

1176{
1177 /* The cycle bit flip must be visible before the controller is told to look */
1179 m_Device->RingDoorbell(m_Endpoint->Dci(), m_StreamId);
1180}
FORCEINLINE VOID KeMemoryBarrier(VOID)
Definition: ke.h:58

Referenced by XhciControlRing::WriteTd().

◆ SegmentBase()

ULONG64 XhciTransferRing::SegmentBase ( ) const

Definition at line 658 of file xferring.cpp.

659{
661}
PHYSICAL_ADDRESS LogicalAddress
Definition: dmapool.h:17
LONGLONG QuadPart
Definition: typedefs.h:114

Referenced by EnqueuePointer(), XhciControlRing::LocateTrb(), XhciControlRing::OnTrbEvent(), and XhciEndpoint::StreamRingEmpty().

◆ StoppedEventReceived()

VOID XhciTransferRing::StoppedEventReceived ( )

Definition at line 722 of file xferring.cpp.

723{
724 /* An isoch ring already tracks the stop through its own events */
725 if (IsBulkOrInterrupt())
727}
static VOID StoppedEventReceived(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:673

Referenced by XhciEndpointMachine::NotifyRingsStoppedEvent().

◆ SuspendRingFill()

VOID XhciTransferRing::SuspendRingFill ( )

Definition at line 695 of file xferring.cpp.

696{
697 if (IsControl())
699 else if (IsIsoch())
701 else
703}
static VOID SuspendRingFill(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:632
static VOID SuspendRingFill(_In_ XhciTransferRing *Ring)
Definition: ctrlxfer.cpp:1194
static VOID SuspendRingFill(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:661

Referenced by XhciEndpointMachine::SuspendRingFill().

◆ TakeSegments()

NTSTATUS XhciTransferRing::TakeSegments ( _In_ ULONG  Count,
_Inout_ PLIST_ENTRY  List 
)

Moves Count pool segments to the head of List. Same results as EnsureFreeSegments.

Definition at line 950 of file xferring.cpp.

953{
954 LIST_ENTRY Moved;
955 ULONG Index;
957
959 if (Status != STATUS_SUCCESS)
960 return Status;
961
962 InitializeListHead(&Moved);
963 {
965
967 {
969 }
970 else
971 {
972 for (Index = 0; Index < Count; Index++)
974
975 XhciRingPrependList(List, &Moved);
976 }
977 }
978
979 if (!NT_SUCCESS(Status))
980 {
981 DPRINT1("Ring for DCI %lu stream %lu lost its reserved segments\n",
983 }
984
985 return Status;
986}
NTSTATUS EnsureFreeSegments(_In_ ULONG Count, _In_ BOOLEAN Async)
Definition: xferring.cpp:853
_In_ WDFCOLLECTION _In_ ULONG Index

◆ TdSize()

ULONG XhciTransferRing::TdSize ( _In_ ULONG  PacketCount,
_In_ ULONG  BytesMappedSoFar,
_In_ BOOLEAN  LastTrbOfTd 
) const

TD Size field (xHCI 4.11.2.4) for a TRB, given bytes mapped so far including it.

Definition at line 1126 of file xferring.cpp.

1130{
1131 ULONG MaxPacket = m_Endpoint->MaxPacketSize();
1132 ULONG Sent;
1133 ULONG Remaining;
1134
1135 if (LastTrbOfTd || MaxPacket == 0 || m_Controller->m_Registers.VersionMajor() < 1)
1136 return 0;
1137
1138 Sent = BytesMappedSoFar / MaxPacket;
1139 if (Sent >= PacketCount)
1140 return 0;
1141
1142 Remaining = PacketCount - Sent;
1143 return min(Remaining, 31);
1144}
UINT Sent
Definition: arping.c:39
ULONG PacketCount(_In_ ULONG Bytes) const
Definition: xferring.cpp:1113
#define min(a, b)
Definition: monoChain.cc:55

Referenced by XhciControlRing::WriteTd().

◆ UpdateInterrupterTarget() [1/2]

VOID XhciTransferRing::UpdateInterrupterTarget ( )

Recomputes the 10 bit interrupter target for work issued on this processor.

Definition at line 1147 of file xferring.cpp.

1148{
1151}
XhciInterrupters m_Interrupters
Definition: hc.h:94
ULONG TargetForCurrentProcessor() const
Definition: intr.cpp:1413

Referenced by XhciControlRing::BuildControlTd(), and UpdateInterrupterTarget().

◆ UpdateInterrupterTarget() [2/2]

VOID XhciTransferRing::UpdateInterrupterTarget ( _In_ ULONG  ProcessorIndex)

Same, for the processor index UCX stamped into the URB; XHCI_URB_NO_PROCESSOR means the current one.

Definition at line 1154 of file xferring.cpp.

1156{
1157 if (ProcessorIndex == XHCI_URB_NO_PROCESSOR)
1158 {
1160 return;
1161 }
1162
1165}
ULONG TargetForProcessor(_In_ ULONG ProcessorIndex) const
Definition: intr.cpp:1419
VOID UpdateInterrupterTarget()
Definition: xferring.cpp:1147
#define XHCI_URB_NO_PROCESSOR
Definition: xferring.h:15

◆ UrbProcessorIndex()

ULONG XhciTransferRing::UrbProcessorIndex ( _In_ PURB  Urb)
static

Processor index UCX stamped into the first ULONG of the URB's HCD area.

Definition at line 1168 of file xferring.cpp.

1170{
1171 return *(PULONG)&Urb->UrbControlTransfer.hca;
1172}
uint32_t * PULONG
Definition: typedefs.h:59
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
Definition: usbdlib.h:333

Referenced by XhciControlRing::BuildControlTd(), XhciBulkRing::NextTdSlot(), and XhciIsochRing::NextTdSlot().

◆ UsbdStatusFromCompletionCode()

USBD_STATUS XhciTransferRing::UsbdStatusFromCompletionCode ( _In_ ULONG  CompletionCode)
static

Code 0 (no hardware result) gives the "not set" value 0xFFFFFFFF for the caller to replace.

Definition at line 1184 of file xferring.cpp.

1186{
1187 switch (static_cast<XhciCompletionCode>(CompletionCode))
1188 {
1189 case XhciCompletionCode::Invalid:
1190 return XhciRingUsbdNotSet;
1191
1192 /* QUIRK: short packets always succeed, USBD_SHORT_TRANSFER_OK is not consulted */
1193 case XhciCompletionCode::Success:
1194 case XhciCompletionCode::ShortPacket:
1195 case XhciCompletionCode::Stopped:
1196 case XhciCompletionCode::StoppedShortPacket:
1197 return USBD_STATUS_SUCCESS;
1198
1199 case XhciCompletionCode::DataBufferError:
1201
1202 case XhciCompletionCode::BabbleDetected:
1203 case XhciCompletionCode::IsochBufferOverrun:
1205
1206 case XhciCompletionCode::StallError:
1207 return USBD_STATUS_STALL_PID;
1208
1209 case XhciCompletionCode::UsbTransactionError:
1210 case XhciCompletionCode::SplitTransactionError:
1212
1213 case XhciCompletionCode::MissedService:
1215
1216 case XhciCompletionCode::NoPingResponse:
1218
1219 case XhciCompletionCode::StoppedLengthInvalid:
1221
1222 case XhciCompletionCode::InvalidStreamType:
1224
1225 case XhciCompletionCode::InvalidStreamId:
1227
1228 default:
1229 /* QUIRK: any other code is reported as a transaction error */
1230 DPRINT1("Unexpected completion code %lu reported as a transaction error\n",
1231 CompletionCode);
1233 }
1234}
#define USBD_STATUS_DATA_BUFFER_ERROR
Definition: usb.h:197
#define USBD_STATUS_ISO_NOT_ACCESSED_BY_HW
Definition: usb.h:226
#define USBD_STATUS_INVALID_STREAM_ID
Definition: usb.h:200
#define USBD_STATUS_STALL_PID
Definition: usb.h:183
#define USBD_STATUS_ISO_TD_ERROR
Definition: usb.h:227
#define USBD_STATUS_INVALID_STREAM_TYPE
Definition: usb.h:199
#define USBD_STATUS_NO_PING_RESPONSE
Definition: usb.h:198
#define USBD_STATUS_XACT_ERROR
Definition: usb.h:195
#define USBD_STATUS_BABBLE_DETECTED
Definition: usb.h:196
static const USBD_STATUS XhciRingUsbdNotSet
Definition: xferring.cpp:26
XhciCompletionCode
Definition: xhcihw.h:110

Referenced by XhciIsochRing::CompleteTd().

Member Data Documentation

◆ Bulk

XhciBulkRing XhciTransferRing::Bulk

Definition at line 199 of file xferring.h.

◆ Control

XhciControlRing XhciTransferRing::Control

Definition at line 198 of file xferring.h.

Referenced by BuildLinkTrb().

◆ Isoch

XhciIsochRing XhciTransferRing::Isoch

Definition at line 200 of file xferring.h.

◆ m_CompletionDpc

WDFDPC XhciTransferRing::m_CompletionDpc

Definition at line 176 of file xferring.h.

Referenced by _IRQL_requires_(), and XhciControlRing::QueueCompletion().

◆ m_Controller

◆ m_Cycle

ULONG XhciTransferRing::m_Cycle

Producer cycle state

Definition at line 192 of file xferring.h.

Referenced by _IRQL_requires_(), BuildLinkTrb(), DequeuePointerValue(), InitializeRing(), and XhciControlRing::WriteTd().

◆ m_Device

XhciUsbDevice* XhciTransferRing::m_Device

◆ m_DoorbellRung

BOOLEAN XhciTransferRing::m_DoorbellRung

Since the last ResumeRingFill

Definition at line 180 of file xferring.h.

Referenced by XhciControlRing::WriteTd().

◆ m_DoubleBuffers

LIST_ENTRY XhciTransferRing::m_DoubleBuffers

Definition at line 194 of file xferring.h.

Referenced by _IRQL_requires_(), BorrowBounceBuffer(), Cleanup(), and ReturnBounceBuffer().

◆ m_DoubleBufferSize

ULONG XhciTransferRing::m_DoubleBufferSize

Definition at line 184 of file xferring.h.

Referenced by _IRQL_requires_(), and BorrowBounceBuffer().

◆ m_Endpoint

◆ m_EnqueueIndex

ULONG XhciTransferRing::m_EnqueueIndex

◆ m_EventUsers

volatile LONG XhciTransferRing::m_EventUsers

Definition at line 227 of file xferring.h.

Referenced by DereferenceLive(), and RetireLive().

◆ m_ForwardProgressQueue

BOOLEAN XhciTransferRing::m_ForwardProgressQueue

Definition at line 231 of file xferring.h.

◆ m_FreeSegments

LIST_ENTRY XhciTransferRing::m_FreeSegments

◆ m_GrowthItem

WDFWORKITEM XhciTransferRing::m_GrowthItem

Definition at line 233 of file xferring.h.

Referenced by _IRQL_requires_(), and EnsureFreeSegments().

◆ m_GrowthQueued

BOOLEAN XhciTransferRing::m_GrowthQueued

Definition at line 230 of file xferring.h.

Referenced by EnsureFreeSegments().

◆ m_GrowthWanted

ULONG XhciTransferRing::m_GrowthWanted

Definition at line 232 of file xferring.h.

Referenced by EnsureFreeSegments().

◆ m_InterrupterTarget

ULONG XhciTransferRing::m_InterrupterTarget

Definition at line 179 of file xferring.h.

Referenced by BuildLinkTrb(), UpdateInterrupterTarget(), and XhciControlRing::WriteTd().

◆ m_LastIndex

ULONG XhciTransferRing::m_LastIndex

Segment size / 16 - 1

Definition at line 191 of file xferring.h.

Referenced by _IRQL_requires_(), InitializeRing(), XhciControlRing::LocateTrb(), and XhciControlRing::WriteTd().

◆ m_Live

BOOLEAN XhciTransferRing::m_Live

Definition at line 228 of file xferring.h.

Referenced by MakeLive(), and RetireLive().

◆ m_LiveLink

LIST_ENTRY XhciTransferRing::m_LiveLink

Definition at line 226 of file xferring.h.

Referenced by _IRQL_requires_(), MakeLive(), ReferenceLiveRing(), and RetireLive().

◆ m_Lock

◆ m_MapRegisterCount

ULONG XhciTransferRing::m_MapRegisterCount

Definition at line 186 of file xferring.h.

Referenced by _IRQL_requires_().

◆ m_MapState

volatile LONG XhciTransferRing::m_MapState

XhciMapState

Definition at line 178 of file xferring.h.

Referenced by _IRQL_requires_(), _IRQL_requires_max_(), and ChangeMapState().

◆ m_MaxStageSize

ULONG XhciTransferRing::m_MaxStageSize

Definition at line 185 of file xferring.h.

Referenced by _IRQL_requires_(), and XhciControlRing::PrepareTransfer().

◆ m_Queue

WDFQUEUE XhciTransferRing::m_Queue

Definition at line 175 of file xferring.h.

Referenced by _IRQL_requires_(), and Queue().

◆ m_ReservedMdl

PMDL XhciTransferRing::m_ReservedMdl

◆ m_Segment

XhciDmaBuffer* XhciTransferRing::m_Segment

Current segment

Definition at line 188 of file xferring.h.

Referenced by _IRQL_requires_(), _IRQL_requires_max_(), Cleanup(), InitializeRing(), and SegmentBase().

◆ m_SegmentSize

ULONG XhciTransferRing::m_SegmentSize

Definition at line 183 of file xferring.h.

Referenced by _IRQL_requires_(), EnsureFreeSegments(), and InitializeRing().

◆ m_StreamId

◆ m_TransferType

ULONG XhciTransferRing::m_TransferType

bmAttributes & 3

Definition at line 174 of file xferring.h.

Referenced by _IRQL_requires_(), IsBulkOrInterrupt(), IsControl(), IsIsoch(), and OnUntargetedTransferEvent().

◆ m_Trbs

PXHCI_TRB XhciTransferRing::m_Trbs

◆ 

union { ... } XhciTransferRing::m_Type

◆ m_TypeReady

BOOLEAN XhciTransferRing::m_TypeReady

Definition at line 229 of file xferring.h.

Referenced by _IRQL_requires_(), and Cleanup().


The documentation for this class was generated from the following files: