ReactOS 0.4.17-dev-1281-g065abb3
isoxfer.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: Isochronous transfer ring type
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#pragma once
9
10class XhciController;
13
16{
17 Idle,
18 Armed,
20 Done
21};
22
25{
45};
46
49{
50 static const ULONG StageSlots = 3;
51
57 WDFREQUEST Request;
76};
77
80{
81public:
82 static NTSTATUS
85 static VOID
86 Enable(
88 static VOID
89 Disable(
91
93 static VOID
96
97 static VOID
98 Cleanup(
100
101 static EVT_WDF_IO_QUEUE_STATE ReadyNotification;
102 static EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtIoCanceledOnQueue;
103 static EVT_WDF_DPC EvtCompletionDpc;
104
105 static VOID
107 _In_ XhciTransferRing* Ring);
108 static VOID
110 _In_ XhciTransferRing* Ring);
111 static VOID
113 _In_ XhciTransferRing* Ring);
114 static VOID
116 _In_ XhciTransferRing* Ring);
117 static VOID
119 _In_ XhciTransferRing* Ring);
120 static VOID
122 _In_ XhciTransferRing* Ring);
123 static BOOLEAN
125 _In_ const XhciTransferRing* Ring);
126 static BOOLEAN
128 _In_ const XhciTransferRing* Ring);
129
130 static BOOLEAN
133 _In_ const XHCI_TRB* Event);
134
136 static VOID
140
141private:
142 enum class Outcome : ULONG
143 {
144 Ready,
145 Completed,
147 WaitDma,
148 Gap,
149 Late,
150 Failed
151 };
152
153 static EVT_WDF_REQUEST_CANCEL EvtRequestCancel;
154 static EVT_WDF_TIMER EvtWatchdog;
155 static DRIVER_LIST_CONTROL DmaCallback;
156
157 /* Mapping */
158 static VOID
160 _In_ XhciTransferRing* Ring);
161 static VOID
162 FillLoop(
163 _In_ XhciTransferRing* Ring);
164 static VOID
166 _In_ XhciTransferRing* Ring);
167 static BOOLEAN
169 _In_ XhciTransferRing* Ring);
170 static VOID
173 _In_ ULONG InFlight);
174 static BOOLEAN
176 _In_ XhciTransferRing* Ring);
177
178 /* Intake and stage selection */
179 static XhciIsochStage*
181 _In_ XhciTransferRing* Ring);
182 static BOOLEAN
185 _In_ WDFREQUEST Request,
186 _Out_ XhciIsochTransfer** Taken);
187 static BOOLEAN
189 _In_ const XhciIsochTransfer* Transfer);
190 static NTSTATUS
193 _Inout_ XhciIsochTransfer* Transfer);
194 static VOID
197 _Inout_ XhciIsochTransfer* Transfer);
198 static VOID
200 _Inout_ XhciIsochTransfer* Transfer);
201 static XhciIsochStage*
204 _Inout_ XhciIsochTransfer* Transfer);
205 static VOID
208 _Inout_ XhciIsochStage* Stage);
209 static VOID
213 static BOOLEAN
215 _In_ const XhciIsochTransfer* Transfer);
216
217 /* Stage preparation and ring writing */
218 static Outcome
221 _Inout_ XhciIsochStage* Stage);
222 static NTSTATUS
225 _Inout_ XhciIsochStage* Stage);
226 static BOOLEAN
227 SizeStage(
229 _Inout_ XhciIsochStage* Stage);
230 static ULONG
233 _In_ const XhciIsochStage* Stage);
234 static Outcome
235 FailStage(
237 _Inout_ XhciIsochStage* Stage);
238 static Outcome
241 _Inout_ XhciIsochStage* Stage);
242 static VOID
245 _Inout_ XhciIsochStage* Stage);
246 static ULONG
249 _Inout_ XhciIsochStage* Stage,
250 _In_ BOOLEAN Commit);
251 static VOID
254 _Inout_ XhciIsochStage* Stage,
255 _In_ BOOLEAN FirstOfTd);
256
257 /* Completion */
258 static VOID
261 _In_ XhciIsochTransfer* Transfer,
262 _In_ XhciIsochStage* Stage,
263 _In_ ULONG Sequence,
266 _In_ BOOLEAN CloseStage);
267 static VOID
270 _In_ const XhciIsochTransfer* Newest,
271 _In_ ULONG Sequence);
272 static VOID
275 _In_ XhciIsochTransfer* Transfer,
276 _In_ XhciIsochStage* Stage,
277 _In_ ULONG Sequence);
278 static ULONG
281 _Inout_ XhciIsochTransfer* Transfer);
282 static VOID
283 Finalize(
285 _Inout_ XhciIsochTransfer* Transfer,
286 _In_ USBD_STATUS PacketStatus,
287 _In_ USBD_STATUS HeaderStatus);
288 static VOID
291 _Inout_ XhciIsochTransfer* Transfer,
292 _In_ USBD_STATUS PacketStatus,
293 _In_ USBD_STATUS HeaderStatus,
294 _In_ BOOLEAN Async);
295 static VOID
298 _Inout_ XhciIsochTransfer* Transfer,
299 _In_ USBD_STATUS PacketStatus,
300 _In_ USBD_STATUS HeaderStatus,
301 _In_ BOOLEAN FinishCanceled,
302 _In_ BOOLEAN Async);
303 static VOID
307 static BOOLEAN
309 _In_ const XhciTransferRing* Ring);
310
311 /* Transfer events */
312 static VOID
313 Ed1Event(
315 _In_ const XHCI_TRB* Event);
316 static VOID
317 Ed0Event(
319 _In_ const XHCI_TRB* Event);
320 static BOOLEAN
323 _In_ const XHCI_TRB* Event,
326 static VOID
328 _In_ XhciTransferRing* Ring);
329 static BOOLEAN
331 _In_ XhciTransferRing* Ring);
332
333 /* Guarded by the ring lock unless noted */
344 volatile LONG m_Flags;
347 volatile LONG m_FillAgain;
348 volatile LONG m_LateStage;
354 WDFTIMER m_Watchdog;
355
356 /* Counters */
364};
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
return Found
Definition: dirsup.c:1270
static VOID AllowReclaimOnCancel(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:702
volatile LONG m_Flags
Definition: isoxfer.h:344
static ULONG EstimateSegments(_In_ XhciTransferRing *Ring, _In_ const XhciIsochStage *Stage)
Definition: isoxfer.cpp:1601
static VOID SuspendRingFill(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:661
static EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtIoCanceledOnQueue
Definition: isoxfer.h:102
static XhciIsochStage * AcquireStage(_In_ XhciTransferRing *Ring, _Inout_ XhciIsochTransfer *Transfer)
static VOID OnRingStarved(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:2924
static BOOLEAN OnTransferEvent(_In_ XhciTransferRing *Ring, _In_ const XHCI_TRB *Event)
Definition: isoxfer.cpp:772
static BOOLEAN TakeRequest(_In_ XhciTransferRing *Ring, _In_ WDFREQUEST Request, _Out_ XhciIsochTransfer **Taken)
Definition: isoxfer.cpp:1063
static EVT_WDF_REQUEST_CANCEL EvtRequestCancel
Definition: isoxfer.h:153
static ULONG ReleaseAllStages(_In_ XhciTransferRing *Ring, _Inout_ XhciIsochTransfer *Transfer)
Definition: isoxfer.cpp:2269
static VOID ReleaseParkedMapping(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:495
static EVT_WDF_TIMER EvtWatchdog
Definition: isoxfer.h:154
ULONG m_TrbsPerTd
Definition: isoxfer.h:341
volatile LONG m_SegmentWait
Definition: isoxfer.h:349
static Outcome EncodeStage(_In_ XhciTransferRing *Ring, _Inout_ XhciIsochStage *Stage)
Definition: isoxfer.cpp:1675
static VOID AwaitRingEmpty(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:908
static VOID SkipUnmapped(_Inout_ XhciIsochTransfer *Transfer)
Definition: isoxfer.cpp:1282
static VOID RecoverTransfers(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:734
static VOID FinishExpiredIsoch(_In_ XhciTransferRing *Ring, _In_ const XhciIsochTransfer *Newest, _In_ ULONG Sequence)
Definition: isoxfer.cpp:2188
BOOLEAN m_DoorbellAfterFirstTd
Definition: isoxfer.h:335
static VOID WriteStage(_In_ XhciTransferRing *Ring, _Inout_ XhciIsochStage *Stage)
Definition: isoxfer.cpp:1747
static EVT_WDF_DPC EvtCompletionDpc
Definition: isoxfer.h:103
static VOID FreeStage(_In_ XhciTransferRing *Ring, _Inout_ XhciIsochStage *Stage)
static VOID FillLoop(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:857
static VOID CompleteAfterUncancel(_In_ XhciTransferRing *Ring, _Inout_ XhciIsochTransfer *Transfer, _In_ USBD_STATUS PacketStatus, _In_ USBD_STATUS HeaderStatus, _In_ BOOLEAN FinishCanceled, _In_ BOOLEAN Async)
ULONG64 m_Bytes
Definition: isoxfer.h:359
XhciIsochStage * m_CurrentStage
Definition: isoxfer.h:350
static NTSTATUS AcquireStageMdl(_In_ XhciTransferRing *Ring, _Inout_ XhciIsochStage *Stage)
Definition: isoxfer.cpp:1465
static Outcome FailStage(_In_ XhciTransferRing *Ring, _Inout_ XhciIsochStage *Stage)
Definition: isoxfer.cpp:1643
BOOLEAN m_FreshStream
Definition: isoxfer.h:334
volatile LONG m_FillWanted
Definition: isoxfer.h:345
static DRIVER_LIST_CONTROL DmaCallback
Definition: isoxfer.h:155
ULONG m_RingEmptyEvents
Definition: isoxfer.h:363
static BOOLEAN HasQueuedWork(_In_ const XhciTransferRing *Ring)
Definition: isoxfer.cpp:757
WDFTIMER m_Watchdog
Definition: isoxfer.h:354
static VOID CompletePlain(_In_ XhciTransferRing *Ring, _Inout_ XhciIsochTransfer *Transfer, _In_ USBD_STATUS PacketStatus, _In_ USBD_STATUS HeaderStatus, _In_ BOOLEAN Async)
static VOID InsertLink(_In_ XhciTransferRing *Ring, _Inout_ XhciIsochStage *Stage, _In_ BOOLEAN FirstOfTd)
Definition: isoxfer.cpp:2056
static Outcome PrimeStage(_In_ XhciTransferRing *Ring, _Inout_ XhciIsochStage *Stage)
Definition: isoxfer.cpp:1393
static BOOLEAN SizeStage(_In_ XhciTransferRing *Ring, _Inout_ XhciIsochStage *Stage)
Definition: isoxfer.cpp:1513
static VOID CompleteBatch(_In_ XhciTransferRing *Ring, _Inout_ PLIST_ENTRY Batch)
Definition: isoxfer.cpp:2477
ULONG m_Tds
Definition: isoxfer.h:360
ULONG m_Transfers
Definition: isoxfer.h:357
static VOID CompleteTd(_In_ XhciTransferRing *Ring, _In_ XhciIsochTransfer *Transfer, _In_ XhciIsochStage *Stage, _In_ ULONG Sequence, _In_ ULONG Code, _In_ ULONG Bytes, _In_ BOOLEAN CloseStage)
Definition: isoxfer.cpp:2091
ULONG m_MissedServiceErrors
Definition: isoxfer.h:362
static VOID Ed0Event(_In_ XhciTransferRing *Ring, _In_ const XHCI_TRB *Event)
Definition: isoxfer.cpp:2661
static VOID OnClientPipeReset(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:691
static BOOLEAN ParkOnSegments(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:948
static VOID KickAfterStage(_In_ XhciTransferRing *Ring, _In_ ULONG InFlight)
Definition: isoxfer.cpp:931
static BOOLEAN FindTrb(_In_ XhciTransferRing *Ring, _In_ const XHCI_TRB *Event, _Outptr_result_maybenull_ XhciIsochStage **Found, _Out_ PULONG Bytes)
ULONG m_BufferRetries
Definition: isoxfer.h:342
static XhciIsochStage * NextTdSlot(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:966
LIST_ENTRY m_WaitingForCancel
Definition: isoxfer.h:352
LIST_ENTRY m_Pending
Definition: isoxfer.h:351
static VOID Ed1Event(_In_ XhciTransferRing *Ring, _In_ const XHCI_TRB *Event)
Definition: isoxfer.cpp:2564
static BOOLEAN PacketsValid(_In_ const XhciIsochTransfer *Transfer)
Definition: isoxfer.cpp:1170
ULONG m_TdFailures
Definition: isoxfer.h:361
static VOID ConsumePendingEvents(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:726
static BOOLEAN DoorbellRungSinceFill(_In_ const XhciTransferRing *Ring)
Definition: isoxfer.cpp:750
LIST_ENTRY m_Completion
Definition: isoxfer.h:353
static BOOLEAN FinishLostStages(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:2960
static VOID Finalize(_In_ XhciTransferRing *Ring, _Inout_ XhciIsochTransfer *Transfer, _In_ USBD_STATUS PacketStatus, _In_ USBD_STATUS HeaderStatus)
Definition: isoxfer.cpp:2312
static VOID PutScatterGather(_In_ XhciTransferRing *Ring, _In_opt_ PSCATTER_GATHER_LIST SgList)
volatile LONG m_RingEmptySeen
Definition: isoxfer.h:346
static ULONG LayoutStage(_In_ XhciTransferRing *Ring, _Inout_ XhciIsochStage *Stage, _In_ BOOLEAN Commit)
Definition: isoxfer.cpp:1823
BOOLEAN m_DpcRunning
Definition: isoxfer.h:336
ULONG m_NextSequence
Definition: isoxfer.h:343
static VOID SegmentsArrived(_In_ XhciTransferRing *Ring, _In_ NTSTATUS Status)
Definition: isoxfer.cpp:785
static EVT_WDF_IO_QUEUE_STATE ReadyNotification
Definition: isoxfer.h:101
static BOOLEAN OwnsRequests(_In_ const XhciTransferRing *Ring)
ULONG m_LastScheduledFrame
Definition: isoxfer.h:338
volatile LONG m_LateStage
Definition: isoxfer.h:348
static VOID FlagMissedPackets(_In_ XhciTransferRing *Ring, _Inout_ XhciIsochTransfer *Transfer)
Definition: isoxfer.cpp:1253
static VOID BuildTdsFromQueue(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:824
ULONG m_NextStartFrame
Definition: isoxfer.h:337
static VOID RetireExpiredStages(_In_ XhciTransferRing *Ring, _In_ XhciIsochTransfer *Transfer, _In_ XhciIsochStage *Stage, _In_ ULONG Sequence)
Definition: isoxfer.cpp:2224
ULONG m_PacketsPerFrame
Definition: isoxfer.h:339
ULONG m_FailedTransfers
Definition: isoxfer.h:358
static NTSTATUS ScheduleStartFrame(_In_ XhciTransferRing *Ring, _Inout_ XhciIsochTransfer *Transfer)
Definition: isoxfer.cpp:1189
static BOOLEAN LeaveRingEmptyWait(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:916
ULONG m_PendingStages
Definition: isoxfer.h:340
static VOID ResumeRingFill(_In_ XhciTransferRing *Ring)
Definition: isoxfer.cpp:636
volatile LONG m_FillAgain
Definition: isoxfer.h:347
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
static const WCHAR Cleanup[]
Definition: register.c:80
Status
Definition: gdiplustypes.h:24
XhciIsochCancel
Definition: isoxfer.h:16
_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 _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
@ Batch
Definition: ntsecapi.h:291
LIST_ENTRY UsedSegments
Definition: isoxfer.h:38
ULONG FirstPacket
Definition: isoxfer.h:31
PSCATTER_GATHER_LIST SgList
Definition: isoxfer.h:36
XhciDmaBuffer * ScanSegment
Definition: isoxfer.h:43
BOOLEAN OnHardware
Definition: isoxfer.h:27
ULONG ScanIndex
Definition: isoxfer.h:44
ULONG NextPacket
Definition: isoxfer.h:33
ULONG EndIndex
Definition: isoxfer.h:42
LIST_ENTRY FreeSegments
Definition: isoxfer.h:37
XhciIsochTransfer * Transfer
Definition: isoxfer.h:30
ULONG LastPacket
Definition: isoxfer.h:32
ULONG FirstIndex
Definition: isoxfer.h:40
BOOLEAN Truncated
Definition: isoxfer.h:29
BOOLEAN InUse
Definition: isoxfer.h:26
BOOLEAN FreeMdl
Definition: isoxfer.h:28
ULONG Size
Definition: isoxfer.h:34
XhciDmaBuffer * FirstSegment
Definition: isoxfer.h:39
XhciDmaBuffer * LastSegment
Definition: isoxfer.h:41
static const ULONG StageSlots
Definition: isoxfer.h:50
ULONG StartFrame
Definition: isoxfer.h:62
BOOLEAN OwnMdl
Definition: isoxfer.h:56
ULONG TdsRetired
Definition: isoxfer.h:71
ULONG PacketsQueued
Definition: isoxfer.h:69
XhciIsochStage Stages[StageSlots]
Definition: isoxfer.h:75
ULONG BytesDropped
Definition: isoxfer.h:66
ULONG BytesTransferred
Definition: isoxfer.h:64
ULONG BytesQueued
Definition: isoxfer.h:65
ULONG TdsQueued
Definition: isoxfer.h:72
ULONG StageHead
Definition: isoxfer.h:73
NTSTATUS Status
Definition: isoxfer.h:60
ULONG PacketsRetired
Definition: isoxfer.h:68
WDFREQUEST Request
Definition: isoxfer.h:57
XhciIsochCancel CancelState
Definition: isoxfer.h:55
ULONG StageCount
Definition: isoxfer.h:74
ULONG Sequence
Definition: isoxfer.h:54
struct _URB_ISOCH_TRANSFER * Urb
Definition: isoxfer.h:58
ULONG BytesTotal
Definition: isoxfer.h:63
XhciTransferRing * Ring
Definition: isoxfer.h:59
ULONG Initialized
Definition: isoxfer.h:53
ULONG PacketsDropped
Definition: isoxfer.h:70
LIST_ENTRY Link
Definition: isoxfer.h:52
ULONG PacketsInUrb
Definition: isoxfer.h:67
Definition: typedefs.h:120
uint32_t * PULONG
Definition: typedefs.h:59
unsigned char UCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
LONG USBD_STATUS
Definition: usb.h:172
_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
struct _SCATTER_GATHER_LIST * PSCATTER_GATHER_LIST
Definition: iotypes.h:2219
static void Initialize()
Definition: xlate.c:212