ReactOS 0.4.17-dev-1281-g065abb3
bulkio.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: Bulk and interrupt transfer ring type
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#pragma once
9
10class XhciController;
12struct XhciBulkTransfer;
13
16{
17 NoData,
20 Dma
21};
22
25{
26 Idle,
27 Armed,
29 Done
30};
31
36struct DECLSPEC_ALIGN(8) XhciBulkStage
37{
39 ULONG Generation;
40 BOOLEAN InUse;
41 BOOLEAN OnHardware;
42 BOOLEAN FreeMdl;
43 XhciTransferRing* Ring;
44 XhciBulkTransfer* Transfer;
45 LIST_ENTRY FreeSegments;
46 LIST_ENTRY UsedSegments;
47 ULONG Size;
48 PMDL Mdl;
52 ULONG BurstTrbBudget;
53 ULONG TrbsReserved;
54 ULONG TrbsWritten;
55 XhciDmaBuffer* FirstSegment;
56 ULONG FirstIndex;
57 XhciDmaBuffer* LastSegment;
58 ULONG EndIndex;
59};
60
63{
70 WDFREQUEST Request;
83 XhciBulkStage* Stage;
84};
85
88{
89public:
90 static NTSTATUS
93 static VOID
94 Enable(
96 static VOID
97 Disable(
99
101 static VOID
103 _In_ XhciTransferRing* Ring);
104
105 static NTSTATUS
109 static VOID
110 Cleanup(
111 _In_ XhciTransferRing* Ring);
112
113 static EVT_WDF_IO_QUEUE_STATE ReadyNotification;
114 static EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtIoCanceledOnQueue;
115 static EVT_WDF_DPC EvtCompletionDpc;
116
117 static VOID
119 _In_ XhciTransferRing* Ring);
120 static VOID
122 _In_ XhciTransferRing* Ring);
123 static VOID
125 _In_ XhciTransferRing* Ring);
126 static VOID
128 _In_ XhciTransferRing* Ring);
129 static VOID
131 _In_ XhciTransferRing* Ring);
132 static VOID
134 _In_ XhciTransferRing* Ring);
135 static VOID
137 _In_ XhciTransferRing* Ring);
138 static BOOLEAN
140 _In_ const XhciTransferRing* Ring);
141 static BOOLEAN
143 _In_ const XhciTransferRing* Ring);
144 static BOOLEAN
146 _In_ const XhciTransferRing* Ring,
147 _In_ const XHCI_TRB* Event);
148
150 static BOOLEAN
154 _In_ const XHCI_TRB* Event);
155
157 static VOID
161
162private:
164 static const ULONG StageSlots = 6;
165
166 enum class Outcome : ULONG
167 {
168 Ready,
169 Completed,
171 WaitDma,
172 Failed
173 };
174
175 static EVT_WDF_REQUEST_CANCEL EvtRequestCancel;
176 static DRIVER_LIST_CONTROL DmaCallback;
177
178 static VOID
180 _In_ XhciTransferRing* Ring);
181 static VOID
182 FillLoop(
183 _In_ XhciTransferRing* Ring);
184 static VOID
185 KickFill(
186 _In_ XhciTransferRing* Ring);
187 static XhciBulkStage*
189 _In_ XhciTransferRing* Ring);
190 static XhciBulkStage*
193 _Inout_ XhciBulkTransfer* Transfer);
194 static VOID
197 _Inout_ XhciBulkStage* Stage);
198 static VOID
201 _Inout_ XhciBulkStage* Stage);
202
203 static VOID
206 _Inout_ XhciBulkTransfer* Transfer,
207 _In_ WDFREQUEST Request);
208 static VOID
211 _Inout_ XhciBulkTransfer* Transfer);
212 static NTSTATUS
215 _Inout_ XhciBulkTransfer* Transfer);
216 static VOID
217 DropMdl(
219 _Inout_ XhciBulkTransfer* Transfer);
220 static VOID
223 _Inout_ XhciBulkTransfer* Transfer);
224
225 static Outcome
228 _Inout_ XhciBulkStage* Stage);
229 static NTSTATUS
232 _Inout_ XhciBulkStage* Stage);
233 static VOID
234 SizeStage(
236 _Inout_ XhciBulkStage* Stage);
237 static VOID
240 _Inout_ XhciBulkStage* Stage);
241 static BOOLEAN
244 _In_ const XhciBulkStage* Stage,
245 _Out_ PULONG Segments);
246 static BOOLEAN
248 _In_ XhciTransferRing* Ring);
249 static Outcome
250 FailStage(
252 _Inout_ XhciBulkStage* Stage);
253 static Outcome
256 _Inout_ XhciBulkStage* Stage);
257 static BOOLEAN
258 BuildTd(
260 _Inout_ XhciBulkStage* Stage);
261 static BOOLEAN
264 _Inout_ XhciBulkStage* Stage,
265 _In_ BOOLEAN FirstOfTd);
266 static VOID
267 UndoTd(
269 _Inout_ XhciBulkStage* Stage);
270
271 static VOID
274 _Inout_ XhciBulkTransfer* Transfer,
276 _In_ BOOLEAN FinishCanceled);
277 static VOID
280 _Inout_ XhciBulkTransfer* Transfer,
282 static VOID
286 static VOID
288 _In_ XhciTransferRing* Ring);
289 static BOOLEAN
291 _In_ const XhciTransferRing* Ring);
292
293 static BOOLEAN
294 Ed1Event(
296 _In_ const XHCI_TRB* Event);
297 static BOOLEAN
298 Ed0Event(
300 _In_ const XHCI_TRB* Event);
301 static BOOLEAN
303 _In_ const XhciTransferRing* Ring,
304 _In_ const XhciBulkStage* Stage,
306 static BOOLEAN
308 _In_ const XhciTransferRing* Ring,
310 _Outptr_result_maybenull_ XhciBulkStage** Stage,
311 _Out_ PULONG Skipped);
312 static VOID
315 _Inout_ XhciBulkStage* Stage,
318 static VOID
321 _Inout_opt_ XhciBulkStage* Stage,
324 _In_ ULONG Skipped);
325 static BOOLEAN
327 _In_ const XhciTransferRing* Ring,
329 _Out_ PBOOLEAN PointsToNoOp);
330 static VOID
333 _In_ const XHCI_TRB* Event);
334 static VOID
336 _In_ XhciTransferRing* Ring);
337 static VOID
340 _In_ ULONG Flag);
341
342 /* Guarded by the ring lock unless noted */
350 volatile LONG m_FillAgain;
357 XhciBulkStage m_Stages[StageSlots];
358};
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
XhciBulkMechanism
Definition: bulkio.h:16
XhciBulkCancel
Definition: bulkio.h:25
Definition: bufpool.h:45
static BOOLEAN BuildTd(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkStage *Stage)
Definition: bulkio.cpp:1736
static VOID DropMdl(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkTransfer *Transfer)
Definition: bulkio.cpp:1276
static VOID FreeTransferResources(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkTransfer *Transfer)
Definition: bulkio.cpp:1297
static NTSTATUS EnableForwardProgress(_In_ XhciTransferRing *Ring, _In_ ULONG MaxTransferSize)
Definition: bulkio.cpp:466
static VOID RecoverTransfers(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:724
static VOID EstimateTrbs(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkStage *Stage)
Definition: bulkio.cpp:1502
BOOLEAN m_ImmediateData
Definition: bulkio.h:343
static VOID ResumeRingFill(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:606
static VOID StreamStopOrHaltOnce(_In_ XhciTransferRing *Ring, _In_ ULONG Flag)
Definition: bulkio.cpp:646
static VOID InitTransfer(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkTransfer *Transfer, _In_ WDFREQUEST Request)
Definition: bulkio.cpp:1139
LIST_ENTRY m_Completion
Definition: bulkio.h:356
static EVT_WDF_DPC EvtCompletionDpc
Definition: bulkio.h:115
static BOOLEAN Ed0Event(_In_ XhciTransferRing *Ring, _In_ const XHCI_TRB *Event)
Definition: bulkio.cpp:2431
static VOID KickFill(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:919
static BOOLEAN DoorbellRungSinceFill(_In_ const XhciTransferRing *Ring)
Definition: bulkio.cpp:740
static VOID Ed0Mismatch(_In_ XhciTransferRing *Ring, _In_ const XHCI_TRB *Event)
static XhciBulkStage * NextTdSlot(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:929
static BOOLEAN OnTransferEvent(_In_opt_ XhciTransferRing *Ring, _In_ XhciController *Controller, _In_ const XHCI_TRB *Event)
Definition: bulkio.cpp:779
static VOID Complete(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkTransfer *Transfer, _In_ USBD_STATUS Default)
static BOOLEAN OwnsRequests(_In_ const XhciTransferRing *Ring)
static const ULONG StageSlots
Definition: bulkio.h:164
static VOID StoppedEvent(_In_ XhciTransferRing *Ring, _Inout_opt_ XhciBulkStage *Stage, _In_ ULONG Code, _In_ ULONG Bytes, _In_ ULONG Skipped)
static EVT_WDF_IO_QUEUE_STATE ReadyNotification
Definition: bulkio.h:113
static VOID CompleteAfterUncancel(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkTransfer *Transfer, _In_ USBD_STATUS Default, _In_ BOOLEAN FinishCanceled)
static BOOLEAN EstimateSegments(_In_ XhciTransferRing *Ring, _In_ const XhciBulkStage *Stage, _Out_ PULONG Segments)
Definition: bulkio.cpp:1588
static VOID SegmentsArrived(_In_ XhciTransferRing *Ring, _In_ NTSTATUS Status)
Definition: bulkio.cpp:799
ULONG m_Flags
Definition: bulkio.h:345
static VOID StreamStopOrHalt(_In_ XhciTransferRing *Ring)
static EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtIoCanceledOnQueue
Definition: bulkio.h:114
volatile LONG m_FillAgain
Definition: bulkio.h:350
static BOOLEAN IsLikelyDuplicate(_In_ const XhciTransferRing *Ring, _In_ const XHCI_TRB *Event)
Definition: bulkio.cpp:762
static VOID QueueCompletionDpc(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:2213
static NTSTATUS ArrangeBuffer(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkTransfer *Transfer)
Definition: bulkio.cpp:1207
volatile LONG m_FillWanted
Definition: bulkio.h:351
static VOID CompleteBatch(_In_ XhciTransferRing *Ring, _Inout_ PLIST_ENTRY Batch)
Definition: bulkio.cpp:2096
static VOID SizeStage(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkStage *Stage)
Definition: bulkio.cpp:1446
static BOOLEAN HasQueuedWork(_In_ const XhciTransferRing *Ring)
Definition: bulkio.cpp:747
static Outcome EncodeStage(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkStage *Stage)
Definition: bulkio.cpp:1661
LIST_ENTRY m_Pending
Definition: bulkio.h:354
static VOID ConsumePendingEvents(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:705
static VOID HaltedEvent(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkStage *Stage, _In_ ULONG Code, _In_ ULONG Bytes)
Definition: bulkio.cpp:2541
static VOID FillLoop(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:868
ULONG m_OutstandingEvents
Definition: bulkio.h:348
static DRIVER_LIST_CONTROL DmaCallback
Definition: bulkio.h:176
LIST_ENTRY m_WaitingForCancel
Definition: bulkio.h:355
static BOOLEAN Ed1Event(_In_ XhciTransferRing *Ring, _In_ const XHCI_TRB *Event)
Definition: bulkio.cpp:2317
volatile LONG m_ForwardProgressBusy
Definition: bulkio.h:353
volatile LONG m_SegmentWait
Definition: bulkio.h:352
static VOID PutScatterGather(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkStage *Stage)
static VOID SuspendRingFill(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:632
static Outcome FailStage(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkStage *Stage)
Definition: bulkio.cpp:1632
static VOID OnPipeHalted(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:666
static VOID UndoTd(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkStage *Stage)
Definition: bulkio.cpp:1975
static Outcome PrimeStage(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkStage *Stage)
Definition: bulkio.cpp:1317
static BOOLEAN ParkOnSegments(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:1382
static VOID ChooseMechanism(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkTransfer *Transfer)
Definition: bulkio.cpp:1177
ULONG m_MaxPendingStages
Definition: bulkio.h:346
static BOOLEAN LikelyDuplicate(_In_ const XhciTransferRing *Ring, _In_ ULONG64 Address, _Out_ PBOOLEAN PointsToNoOp)
static VOID AllowReclaimOnCancel(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:680
static BOOLEAN IsLiveStage(_In_ const XhciTransferRing *Ring, _In_ const XhciBulkStage *Stage, _In_ ULONG64 EventData)
static XhciBulkStage * AcquireStage(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkTransfer *Transfer)
static EVT_WDF_REQUEST_CANCEL EvtRequestCancel
Definition: bulkio.h:175
static BOOLEAN LookupStage(_In_ const XhciTransferRing *Ring, _In_ ULONG64 Address, _Outptr_result_maybenull_ XhciBulkStage **Stage, _Out_ PULONG Skipped)
static VOID BuildTdsFromQueue(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:842
ULONG m_PendingStages
Definition: bulkio.h:347
static NTSTATUS AcquireStageMdl(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkStage *Stage)
Definition: bulkio.cpp:1397
static VOID StoppedEventReceived(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:673
XhciBulkStage m_Stages[StageSlots]
Definition: bulkio.h:357
static BOOLEAN InsertLink(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkStage *Stage, _In_ BOOLEAN FirstOfTd)
Definition: bulkio.cpp:1936
ULONG m_SegmentWaits
Definition: bulkio.h:349
static VOID ReleaseParkedMapping(_In_ XhciTransferRing *Ring)
Definition: bulkio.cpp:443
BOOLEAN m_DpcRunning
Definition: bulkio.h:344
static VOID ReleaseStage(_In_ XhciTransferRing *Ring, _Inout_ XhciBulkStage *Stage)
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
#define DECLSPEC_ALIGN(x)
Definition: corecrt.h:141
static const WCHAR Signature[]
Definition: parser.c:141
static const WCHAR Cleanup[]
Definition: register.c:80
Status
Definition: gdiplustypes.h:24
_In_ UINT Bytes
Definition: mmcopy.h:9
unsigned __int64 ULONG64
Definition: imports.h:198
#define _Inout_
Definition: no_sal2.h:162
#define _Outptr_result_maybenull_
Definition: no_sal2.h:266
#define _Inout_opt_
Definition: no_sal2.h:216
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:142
long LONG
Definition: pedump.c:60
static WCHAR Address[46]
Definition: ping.c:68
_In_ ULONG MaxTransferSize
Definition: pipe.h:72
@ Batch
Definition: ntsecapi.h:291
Definition: xml2sdb.h:103
BOOLEAN UsesReservedMdl
Definition: bulkio.h:67
ULONG TdsRetired
Definition: bulkio.h:81
WDFREQUEST Request
Definition: bulkio.h:70
XhciTransferRing * Ring
Definition: bulkio.h:72
BOOLEAN MappedOnce
Definition: bulkio.h:66
XhciBulkStage * Stage
Definition: bulkio.h:83
XhciBulkMechanism Mechanism
Definition: bulkio.h:68
XhciBulkCancel CancelState
Definition: bulkio.h:69
ULONG BytesQueued
Definition: bulkio.h:80
PUCHAR Buffer
Definition: bulkio.h:76
ULONG TdsQueued
Definition: bulkio.h:82
struct _URB_BULK_OR_INTERRUPT_TRANSFER * Urb
Definition: bulkio.h:71
XhciDmaBuffer * DoubleBuffer
Definition: bulkio.h:77
ULONG Initialized
Definition: bulkio.h:65
ULONG BytesTransferred
Definition: bulkio.h:79
ULONG BytesTotal
Definition: bulkio.h:78
ULONG CompletionCode
Definition: bulkio.h:73
NTSTATUS Status
Definition: bulkio.h:74
LIST_ENTRY Link
Definition: bulkio.h:64
Definition: typedefs.h:120
uint32_t * PULONG
Definition: typedefs.h:59
unsigned char UCHAR
Definition: typedefs.h:53
unsigned char * PBOOLEAN
Definition: typedefs.h:53
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
_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
LONG USBD_STATUS
Definition: usb.h:172
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_In_ UCHAR _In_ UCHAR _In_ ULONG Code
Definition: wdfdevice.h:1707
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
struct _SCATTER_GATHER_LIST * PSCATTER_GATHER_LIST
Definition: iotypes.h:2219
static void Initialize()
Definition: xlate.c:212