ReactOS 0.4.17-dev-1281-g065abb3
xferring.h
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS xHCI Host Controller Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Transfer ring object shared by the control, bulk and isoch transfer types
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#pragma once
9
10class XhciController;
11class XhciUsbDevice;
12class XhciEndpoint;
13
15#define XHCI_URB_NO_PROCESSOR MAXULONG
16
18enum class XhciMapState : LONG
19{
20 Halted = 0,
21 Halting = 1,
22 PausedFill = 2,
23 Filling = 3,
25};
26
29{
30public:
32 static NTSTATUS
36 _In_ ULONG StreamId,
37 _Out_ XhciTransferRing** Ring);
38
39 static XhciTransferRing*
41 _In_ WDFQUEUE Queue);
42
43 WDFQUEUE Queue() const;
44
47
49 VOID
50 Disable(
52
55 EnableForwardProgress(
57
60
61 ULONG64 SegmentBase() const;
62 ULONG64 EnqueuePointer() const;
63
66
67 /* Endpoint machine actions fanned out by the endpoint */
77 BOOLEAN HasQueuedWork() const;
78
82 _In_ const XHCI_TRB* Event);
83
85 static BOOLEAN
88 _In_ const XHCI_TRB* Event);
89
93 _In_ const XHCI_TRB* Event) const;
94
95 /* Helpers for the control and bulk type modules */
96
101 _In_ BOOLEAN Async);
102
108
110 VOID
113 _In_ BOOLEAN ToHead);
114
117 VOID
120
124 _In_ BOOLEAN FromAny,
125 _In_ XhciMapState From,
126 _In_ XhciMapState To);
127
129 VOID
131 _Out_ PXHCI_TRB Trb,
132 _In_ BOOLEAN FirstOfTd,
133 _In_ BOOLEAN InDataStage) const;
134
135 ULONG
137 _In_ ULONG Bytes) const;
138
140 ULONG
141 TdSize(
143 _In_ ULONG BytesMappedSoFar,
144 _In_ BOOLEAN LastTrbOfTd) const;
145
148
150 VOID
152 _In_ ULONG ProcessorIndex);
153
155 static ULONG
157 _In_ PURB Urb);
158
161
162 static USBD_STATUS
164 _In_ ULONG CompletionCode);
165 static NTSTATUS
168
169 /* Common ring state; the type modules read and write it under the rules of each field */
175 WDFQUEUE m_Queue;
178 volatile LONG m_MapState;
182
187
195
196 union
197 {
202
203 /* Implementation state of the common ring; the type modules do not touch these */
204 VOID Cleanup();
206 VOID GrowSegments();
207
208 BOOLEAN IsControl() const;
210 BOOLEAN IsIsoch() const;
211
213 VOID WaitForMappingIdle();
214
215 VOID MakeLive();
217
219 static XhciTransferRing*
223 _In_ ULONG Dci);
225
233 WDFWORKITEM m_GrowthItem;
234};
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
Definition: acpixf.h:732
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
Definition: bufpool.h:45
XhciDmaBuffer * BorrowBounceBuffer()
Definition: xferring.cpp:1014
static XhciTransferRing * FromQueue(_In_ WDFQUEUE Queue)
Definition: xferring.cpp:308
BOOLEAN HasQueuedWork() const
Definition: xferring.cpp:775
XhciMapState ChangeMapState(_In_ BOOLEAN FromAny, _In_ XhciMapState From, _In_ XhciMapState To)
Definition: xferring.cpp:1048
VOID AllowReclaimOnCancel()
Definition: xferring.cpp:730
XhciIsochRing Isoch
Definition: xferring.h:200
static XhciTransferRing * ReferenceLiveRing(_In_ XhciController *Controller, _In_ const XhciUsbDevice *Device, _In_ ULONG Dci)
Definition: xferring.cpp:419
ULONG m_InterrupterTarget
Definition: xferring.h:179
_IRQL_requires_(PASSIVE_LEVEL) VOID GrowSegments()
BOOLEAN IsControl() const
Definition: xferring.cpp:321
static ULONG UrbProcessorIndex(_In_ PURB Urb)
Definition: xferring.cpp:1168
WDFDPC m_CompletionDpc
Definition: xferring.h:176
KSPIN_LOCK m_Lock
Definition: xferring.h:177
WDFQUEUE m_Queue
Definition: xferring.h:175
ULONG64 DequeuePointerValue() const
Definition: xferring.cpp:670
_IRQL_requires_max_(DISPATCH_LEVEL) VOID WaitForMappingIdle()
static NTSTATUS NtStatusFromUsbdStatus(_In_ USBD_STATUS UsbdStatus)
Definition: xferring.cpp:1237
XhciController * m_Controller
Definition: xferring.h:170
BOOLEAN OnTransferEvent(_In_ const XHCI_TRB *Event)
Definition: xferring.cpp:787
ULONG64 EnqueuePointer() const
Definition: xferring.cpp:664
ULONG m_DoubleBufferSize
Definition: xferring.h:184
static NTSTATUS Create(_In_ XhciEndpoint *Endpoint, _In_ WDFOBJECT Parent, _In_ ULONG StreamId, _Out_ XhciTransferRing **Ring)
VOID ReturnBounceBuffer(_In_ XhciDmaBuffer *Buffer)
Definition: xferring.cpp:1039
BOOLEAN IsIsoch() const
Definition: xferring.cpp:334
LIST_ENTRY m_LiveLink
Definition: xferring.h:226
ULONG m_LastIndex
Definition: xferring.h:191
VOID ConsumePendingEvents()
Definition: xferring.cpp:741
ULONG m_MapRegisterCount
Definition: xferring.h:186
ULONG m_EnqueueIndex
Definition: xferring.h:190
WDFWORKITEM m_GrowthItem
Definition: xferring.h:233
VOID OnClientPipeReset()
Definition: xferring.cpp:714
ULONG TdSize(_In_ ULONG PacketCount, _In_ ULONG BytesMappedSoFar, _In_ BOOLEAN LastTrbOfTd) const
Definition: xferring.cpp:1126
VOID ReturnSegments(_Inout_ PLIST_ENTRY List, _In_ BOOLEAN ToHead)
Definition: xferring.cpp:989
_IRQL_requires_max_(DISPATCH_LEVEL) VOID Disable(_In_ BOOLEAN FreeResources)
ULONG64 SegmentBase() const
Definition: xferring.cpp:658
ULONG m_StreamId
Definition: xferring.h:173
NTSTATUS TakeSegments(_In_ ULONG Count, _Inout_ PLIST_ENTRY List)
Definition: xferring.cpp:950
PMDL m_ReservedMdl
Definition: xferring.h:181
VOID SuspendRingFill()
Definition: xferring.cpp:695
VOID DereferenceLive()
Definition: xferring.cpp:453
BOOLEAN m_Live
Definition: xferring.h:228
XhciBulkRing Bulk
Definition: xferring.h:199
ULONG m_GrowthWanted
Definition: xferring.h:232
BOOLEAN m_DoorbellRung
Definition: xferring.h:180
BOOLEAN IsLikelyDuplicate(_In_ const XHCI_TRB *Event) const
Definition: xferring.cpp:843
XhciUsbDevice * m_Device
Definition: xferring.h:171
ULONG PacketCount(_In_ ULONG Bytes) const
Definition: xferring.cpp:1113
union XhciTransferRing::@1691 m_Type
BOOLEAN m_ForwardProgressQueue
Definition: xferring.h:231
ULONG m_SegmentSize
Definition: xferring.h:183
NTSTATUS EnsureFreeSegments(_In_ ULONG Count, _In_ BOOLEAN Async)
Definition: xferring.cpp:853
BOOLEAN DoorbellRungSinceFill() const
Definition: xferring.cpp:763
XhciControlRing Control
Definition: xferring.h:198
LIST_ENTRY m_FreeSegments
Definition: xferring.h:193
LIST_ENTRY m_DoubleBuffers
Definition: xferring.h:194
VOID InitializeRing()
Definition: xferring.cpp:648
PXHCI_TRB m_Trbs
Definition: xferring.h:189
VOID OnPipeHalted()
Definition: xferring.cpp:706
WDFQUEUE Queue() const
Definition: xferring.cpp:315
BOOLEAN m_GrowthQueued
Definition: xferring.h:230
static USBD_STATUS UsbdStatusFromCompletionCode(_In_ ULONG CompletionCode)
Definition: xferring.cpp:1184
VOID ResumeRingFill()
Definition: xferring.cpp:684
VOID StoppedEventReceived()
Definition: xferring.cpp:722
VOID RecoverTransfers()
Definition: xferring.cpp:752
_IRQL_requires_max_(DISPATCH_LEVEL) NTSTATUS Enable()
XhciDmaBuffer * m_Segment
Definition: xferring.h:188
BOOLEAN IsBulkOrInterrupt() const
Definition: xferring.cpp:327
volatile LONG m_MapState
Definition: xferring.h:178
XhciEndpoint * m_Endpoint
Definition: xferring.h:172
ULONG m_MaxStageSize
Definition: xferring.h:185
VOID UpdateInterrupterTarget()
Definition: xferring.cpp:1147
BOOLEAN m_TypeReady
Definition: xferring.h:229
static BOOLEAN OnUntargetedTransferEvent(_In_ XhciController *Controller, _In_ const XHCI_TRB *Event)
Definition: xferring.cpp:803
VOID BuildLinkTrb(_Out_ PXHCI_TRB Trb, _In_ BOOLEAN FirstOfTd, _In_ BOOLEAN InDataStage) const
Definition: xferring.cpp:1090
_IRQL_requires_(PASSIVE_LEVEL) NTSTATUS EnableForwardProgress(_In_ ULONG MaxTransferSize)
volatile LONG m_EventUsers
Definition: xferring.h:227
ULONG m_TransferType
Definition: xferring.h:174
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
ULONG KSPIN_LOCK
Definition: env_spec_w32.h:72
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
Definition: hubucx.h:258
_In_ UCXHUB_DEVICE_CONTEXT _In_ UCXENDPOINT Endpoint
Definition: hubucx.h:238
_In_ UINT Bytes
Definition: mmcopy.h:9
unsigned __int64 ULONG64
Definition: imports.h:198
#define _Inout_
Definition: no_sal2.h:162
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:142
long LONG
Definition: pedump.c:60
_In_ ULONG MaxTransferSize
Definition: pipe.h:72
Definition: typedefs.h:120
Definition: usb.h:565
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXCONTROLLER * Controller
LONG USBD_STATUS
Definition: usb.h:172
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
Definition: usbdlib.h:333
USHORT Count
Definition: userreq.cpp:200
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
Definition: wdfdevice.h:2231
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
_In_ NTSTATUS _In_ USBD_STATUS UsbdStatus
Definition: wdfusb.h:403
static VOID FreeResources(VOID)
Definition: welcome.c:710
XhciMapState
Definition: xferring.h:19