ReactOS 0.4.17-dev-1281-g065abb3
epctx.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: Endpoint object, its state machine owner and the UCX endpoint callbacks
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#pragma once
9
10class XhciController;
11class XhciUsbDevice;
13struct XhciStreams;
14
17{
18public:
19 static XhciEndpoint*
20 FromUcx(
21 _In_ UCXENDPOINT Endpoint);
22
24 XhciUsbDevice* Device() const;
25 UCXENDPOINT Handle() const;
26 ULONG Dci() const;
27
29 ULONG TransferType() const;
31 USHORT MaxPacketSize() const;
32 ULONG MaxBurst() const;
33 ULONG MaxEsitPayload() const;
35
36 /* Used by the USB device module during Configure Endpoint and Address Device */
40 VOID Disable();
41
43 VOID
45 _Out_writes_bytes_(ContextSize) PVOID EndpointContext,
46 _In_ ULONG ContextSize) const;
47
48 /* From the USB device */
49 VOID
51 _In_ const XHCI_TRB* Event);
56
57 /* Hooks the transfer rings call, at up to DISPATCH_LEVEL */
59 VOID
61 _In_ ULONG CompletionCode,
62 _In_ BOOLEAN TransferFound);
68
70
73 VOID
74 Disable(
75 _In_ BOOLEAN SlotDisabling);
76
77 /* Stream context access for the bulk ring after a stop */
80 _In_ ULONG StreamId) const;
81 ULONG
83 _In_ ULONG StreamId) const;
84
86 ULONG StreamHaltedCode() const;
87
89 static NTSTATUS
90 Create(
91 _In_ UCXCONTROLLER UcxController,
92 _In_ UCXUSBDEVICE UcxUsbDevice,
97
98 /* UCX endpoint callbacks */
99 static EVT_UCX_ENDPOINT_PURGE EvtPurge;
100 static EVT_UCX_ENDPOINT_START EvtStart;
101 static EVT_UCX_ENDPOINT_ABORT EvtAbort;
102 static EVT_UCX_ENDPOINT_RESET EvtReset;
103 static EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS EvtOkToCancel;
104 static EVT_UCX_DEFAULT_ENDPOINT_UPDATE EvtDefaultUpdate;
105 static EVT_UCX_ENDPOINT_STATIC_STREAMS_ADD EvtStreamsAdd;
106 static EVT_UCX_ENDPOINT_STATIC_STREAMS_ENABLE EvtStreamsEnable;
107 static EVT_UCX_ENDPOINT_STATIC_STREAMS_DISABLE EvtStreamsDisable;
108
109 static NTSTATUS
110 NTAPI
112 _In_ UCXENDPOINT Endpoint,
114
115private:
117
118 struct HaltClearBlock;
119
120 static EVT_WDF_OBJECT_CONTEXT_CLEANUP EvtCleanup;
121 static EVT_WDF_OBJECT_CONTEXT_CLEANUP EvtStreamsCleanup;
122 static EVT_WDF_TIMER EvtTimer;
123 static EVT_WDF_IO_QUEUE_STATE EvtPurgeDone;
124 static EVT_WDF_IO_QUEUE_STATE EvtAbortDone;
125 static IO_COMPLETION_ROUTINE ClearStallDone;
126
127 /* Command completions */
128 static VOID
129 NTAPI
130 StopDone(
132 static VOID
133 NTAPI
136 static VOID
137 NTAPI
140 static VOID
141 NTAPI
144 static VOID
145 NTAPI
148 static VOID
149 NTAPI
152 static VOID
153 NTAPI
156 static VOID
157 NTAPI
160 static VOID
161 NTAPI
164 static VOID
165 NTAPI
168 static VOID
169 NTAPI
172
173 /* Single endpoint reconfigure completions of the streams open and close */
174 static VOID
175 NTAPI
179 static VOID
180 NTAPI
184
188 _In_ UCXUSBDEVICE UcxUsbDevice,
189 _In_ UCXENDPOINT Endpoint,
194 VOID Cleanup();
195
196 VOID
198 _In_ BOOLEAN SlotDisabling);
199
200 /* The rings an action fans out to: each stream ring, or the main ring */
201 BOOLEAN UsesStreams() const;
202 ULONG RingCount() const;
204 RingAt(
205 _In_ ULONG Index) const;
206 VOID
209 BOOLEAN
213
217 _In_ ULONG StreamId) const;
218 VOID
220 _In_ ULONG StreamId);
221 BOOLEAN
223 _In_ ULONG StreamId) const;
225
226 VOID
227 PostEvent(
230 VOID
235
236 VOID
239 _In_ ULONG64 DequeuePointer,
240 _In_ ULONG StreamId,
242 VOID
245 _In_opt_ const VOID* EndpointContext,
246 _In_ BOOLEAN Drop,
247 _In_ BOOLEAN Add,
252 _In_ XhciDmaBuffer* Input) const;
253
254 VOID
256 _In_ ULONG StreamId);
257 VOID
259 _In_ ULONG StreamId);
261
264 _In_ XhciStreams* Streams,
265 _In_ WDFREQUEST Request);
268 _In_ XhciStreams* Streams,
269 _In_ WDFREQUEST Request);
270 VOID
272 _In_ XhciStreams* Streams);
274 VOID
276 _In_opt_ XhciStreams* Streams);
277
280 UCXUSBDEVICE m_UcxDevice;
281 UCXENDPOINT m_Ucx;
285 volatile LONG m_Flags;
287 WDFTIMER m_Timer;
289
295
296 /* Side outputs of BuildContext, read by the transfer rings */
299
302
307
308 WDFREQUEST volatile m_ResetRequest;
310};
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
@ Create
Definition: registry.c:563
ULONG Dci() const
Definition: epctx.cpp:257
static VOID NTAPI ControlDequeueDone(_In_ XhciCommand *Command)
Definition: epctx.cpp:2084
static EVT_WDF_OBJECT_CONTEXT_CLEANUP EvtStreamsCleanup
Definition: epctx.h:121
BOOLEAN m_ForwardProgress
Definition: epctx.h:283
PXHCI_ENDPOINT_CONTEXT InputEndpointContext(_In_ XhciDmaBuffer *Input) const
Definition: epctx.cpp:1877
BOOLEAN UsesStreams() const
Definition: epctx.cpp:899
BOOLEAN m_StreamsCapable
Definition: epctx.h:284
BOOLEAN IsStreamsCapable() const
Definition: epctx.cpp:297
ULONG MaxBurst() const
Definition: epctx.cpp:281
_IRQL_requires_max_(DISPATCH_LEVEL) VOID Disable()
static EVT_WDF_IO_QUEUE_STATE EvtPurgeDone
Definition: epctx.h:123
volatile LONG m_Flags
Definition: epctx.h:285
VOID OnStoppedEvent()
Definition: epctx.cpp:1217
ULONG StreamTransferLength(_In_ ULONG StreamId) const
Definition: epctx.cpp:987
static EVT_WDF_OBJECT_CONTEXT_CLEANUP EvtCleanup
Definition: epctx.h:120
static EVT_WDF_IO_QUEUE_STATE EvtAbortDone
Definition: epctx.h:124
NTSTATUS CloseStreams(_In_ XhciStreams *Streams, _In_ WDFREQUEST Request)
Definition: epctx.cpp:1777
XhciController * m_Controller
Definition: epctx.h:278
static XhciEndpoint * FromUcx(_In_ UCXENDPOINT Endpoint)
Definition: epctx.cpp:232
VOID FatalError(_In_ ULONG Reason)
Definition: epctx.cpp:1083
VOID SendClearStall()
Definition: epctx.cpp:2338
BOOLEAN m_Listed
Definition: epctx.h:282
static VOID NTAPI ClientDequeueDone(_In_ XhciCommand *Command)
Definition: epctx.cpp:2178
BOOLEAN PostWhenAllRings(_In_ XepEvent Event)
Definition: epctx.cpp:933
VOID BuildEndpointConfigure(_In_ XhciDmaBuffer *Input, _In_opt_ const VOID *EndpointContext, _In_ BOOLEAN Drop, _In_ BOOLEAN Add, _Out_ XhciCommand *Command, _In_ PFN_XHCI_COMMAND_DONE Done)
Definition: epctx.cpp:1888
ULONG TransferType() const
Definition: epctx.cpp:263
UCXENDPOINT Handle() const
Definition: epctx.cpp:251
ULONG StreamHaltedCode() const
Definition: epctx.cpp:1061
static EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS EvtOkToCancel
Definition: epctx.h:103
VOID OnTransferCanceled()
Definition: epctx.cpp:1183
ULONG m_StopAttempts
Definition: epctx.h:303
XhciCommand m_Command
Definition: epctx.h:304
static VOID NTAPI StopDone(_In_ XhciCommand *Command)
Definition: epctx.cpp:1929
XhciDmaBuffer * m_StopInput
Definition: epctx.h:305
static EVT_UCX_ENDPOINT_STATIC_STREAMS_DISABLE EvtStreamsDisable
Definition: epctx.h:107
ULONG m_MaxBurst
Definition: epctx.h:297
NTSTATUS m_ResetStatus
Definition: epctx.h:309
static EVT_WDF_TIMER EvtTimer
Definition: epctx.h:122
VOID Cleanup()
Definition: epctx.cpp:466
VOID OnMappingStopped()
Definition: epctx.cpp:1237
static VOID NTAPI StopAddDone(_In_ XhciCommand *Command)
Definition: epctx.cpp:2310
BOOLEAN StreamCommandDone()
Definition: epctx.cpp:962
VOID OnTransferEvent(_In_ const XHCI_TRB *Event)
Definition: epctx.cpp:1102
static VOID NTAPI DefaultUpdateDone(_In_ XhciCommand *Command)
Definition: epctx.cpp:1515
static VOID NTAPI ResetConfigureDone(_In_ XhciCommand *Command)
Definition: epctx.cpp:2250
const USB_ENDPOINT_DESCRIPTOR * Descriptor() const
Definition: epctx.cpp:269
static VOID NTAPI ResetDropDone(_In_ XhciCommand *Command)
Definition: epctx.cpp:2210
PXHCI_STREAM_CONTEXT StreamContext(_In_ ULONG StreamId) const
Definition: epctx.cpp:969
static EVT_UCX_ENDPOINT_ABORT EvtAbort
Definition: epctx.h:101
static VOID NTAPI StreamsEnableDone(_In_ PVOID Context, _In_ NTSTATUS Status)
Definition: epctx.cpp:1724
VOID OnHaltedCompletionCode(_In_ ULONG CompletionCode, _In_ BOOLEAN TransferFound)
Definition: epctx.cpp:1190
VOID BuildContext(_Out_writes_bytes_(ContextSize) PVOID EndpointContext, _In_ ULONG ContextSize) const
Definition: epctx.cpp:754
XhciUsbDevice * Device() const
Definition: epctx.cpp:245
PENDPOINT_RESET ResetPayload() const
Definition: epctx.cpp:1096
static VOID NTAPI CancelDequeueDone(_In_ XhciCommand *Command)
Definition: epctx.cpp:2026
VOID OnExpectedEventsProcessed()
Definition: epctx.cpp:1231
VOID PostCommandFailure()
Definition: epctx.cpp:1076
static IO_COMPLETION_ROUTINE ClearStallDone
Definition: epctx.h:125
USHORT MaxPacketSize() const
Definition: epctx.cpp:275
USB_ENDPOINT_DESCRIPTOR m_Descriptor
Definition: epctx.h:290
BOOLEAN StreamRingEmpty(_In_ ULONG StreamId) const
Definition: epctx.cpp:1051
_IRQL_requires_(PASSIVE_LEVEL) VOID ControllerResetDone()
static VOID NTAPI ClientResetDone(_In_ XhciCommand *Command)
Definition: epctx.cpp:2111
static VOID NTAPI ControlResetDone(_In_ XhciCommand *Command)
Definition: epctx.cpp:2055
USB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR m_IsochCompanion
Definition: epctx.h:292
VOID ForEachRing(_In_ VOID(XhciTransferRing::*Action)())
Definition: epctx.cpp:918
ULONG OutputEndpointState() const
Definition: epctx.cpp:1090
NTSTATUS CreateClearStall()
Definition: epctx.cpp:428
VOID ControllerRemoved()
Definition: epctx.cpp:1270
HaltClearBlock * m_ClearStall
Definition: epctx.h:306
BOOLEAN ShouldDropStoppedEvent() const
Definition: epctx.cpp:1211
UCXUSBDEVICE m_UcxDevice
Definition: epctx.h:280
ULONG64 EndpointDequeuePointer() const
Definition: epctx.cpp:885
VOID BuildSetDequeue(_Out_ XhciCommand *Command, _In_ ULONG64 DequeuePointer, _In_ ULONG StreamId, _In_ PFN_XHCI_COMMAND_DONE Done)
Definition: epctx.cpp:1860
static EVT_UCX_ENDPOINT_PURGE EvtPurge
Definition: epctx.h:99
WDFREQUEST volatile m_ResetRequest
Definition: epctx.h:308
static NTSTATUS NTAPI EvtEnableForwardProgress(_In_ UCXENDPOINT Endpoint, _In_ ULONG MaxTransferSize)
Definition: epctx.cpp:1424
XhciController * Controller() const
Definition: epctx.cpp:239
VOID DequeueAfterStop(_In_ ULONG StreamId)
Definition: epctx.cpp:1997
XhciTransferRing * m_MainRing
Definition: epctx.h:288
static EVT_UCX_DEFAULT_ENDPOINT_UPDATE EvtDefaultUpdate
Definition: epctx.h:104
static EVT_UCX_ENDPOINT_STATIC_STREAMS_ADD EvtStreamsAdd
Definition: epctx.h:105
KEVENT m_ResetAck
Definition: epctx.h:286
ULONG RingCount() const
Definition: epctx.cpp:905
XhciEndpointMachine m_Machine
Definition: epctx.h:69
XhciStreams * m_DefaultStreams
Definition: epctx.h:300
ULONG m_MaxPayload
Definition: epctx.h:298
VOID OnTransfersReclaimed()
Definition: epctx.cpp:1243
BOOLEAN AnyTransfersPending() const
Definition: epctx.cpp:947
XhciTransferRing * RingAt(_In_ ULONG Index) const
Definition: epctx.cpp:911
VOID DisableRings(_In_ BOOLEAN SlotDisabling)
Definition: epctx.cpp:715
XhciStreams * m_CurrentStreams
Definition: epctx.h:301
USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR m_Companion
Definition: epctx.h:291
ULONG MaxEsitPayload() const
Definition: epctx.cpp:291
VOID ResetStreamTransferLength(_In_ ULONG StreamId)
Definition: epctx.cpp:1027
static EVT_UCX_ENDPOINT_START EvtStart
Definition: epctx.h:100
ULONG m_Dci
Definition: epctx.h:294
static VOID NTAPI StreamsDisableDone(_In_ PVOID Context, _In_ NTSTATUS Status)
Definition: epctx.cpp:1820
VOID PostEvent(_In_ XepEvent Event)
Definition: epctx.cpp:1069
ULONG m_XhciType
Definition: epctx.h:293
_IRQL_requires_max_(DISPATCH_LEVEL) VOID Disable(_In_ BOOLEAN SlotDisabling)
ULONG64 StreamDequeuePointer(_In_ ULONG StreamId) const
Definition: epctx.cpp:976
VOID DequeueAfterReset(_In_ ULONG StreamId)
Definition: epctx.cpp:2150
VOID DisableStreamRings(_In_ XhciStreams *Streams)
Definition: epctx.cpp:1623
UCXENDPOINT m_Ucx
Definition: epctx.h:281
XhciUsbDevice * m_Device
Definition: epctx.h:279
VOID FreeDefaultStreams(_In_opt_ XhciStreams *Streams)
Definition: epctx.cpp:499
_IRQL_requires_max_(DISPATCH_LEVEL) NTSTATUS Enable()
static EVT_UCX_ENDPOINT_STATIC_STREAMS_ENABLE EvtStreamsEnable
Definition: epctx.h:106
VOID ControllerResetStarting()
Definition: epctx.cpp:1253
WDFTIMER m_Timer
Definition: epctx.h:287
static EVT_UCX_ENDPOINT_RESET EvtReset
Definition: epctx.h:102
static VOID NTAPI StopDropDone(_In_ XhciCommand *Command)
Definition: epctx.cpp:2282
NTSTATUS OpenStreams(_In_ XhciStreams *Streams, _In_ WDFREQUEST Request)
Definition: epctx.cpp:1648
VOID(NTAPI * PFN_XHCI_COMMAND_DONE)(_In_ XhciCommand *Command)
Definition: cmdring.h:13
@ ControllerResetDone
Definition: epctx.cpp:1259
KEVENT Done
Definition: devreq.cpp:1162
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
XepEvent
Definition: epstate.h:15
_Must_inspect_result_ _In_ FLT_CONTEXT_TYPE _In_ SIZE_T ContextSize
Definition: fltkernel.h:1444
Status
Definition: gdiplustypes.h:24
_Must_inspect_result_ _In_ UCXUSBDEVICE _In_ ULONG _In_opt_ PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR Companion
Definition: hubucx.h:308
_In_ UCXHUB_DEVICE_CONTEXT _In_ UCXENDPOINT Endpoint
Definition: hubucx.h:238
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
unsigned __int64 ULONG64
Definition: imports.h:198
PVOID PVOID PWCHAR PVOID USHORT PULONG Reason
Definition: env.c:47
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define _Out_writes_bytes_(s)
Definition: no_sal2.h:178
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:142
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
_In_ ULONG MaxTransferSize
Definition: pipe.h:72
_In_ ULONG _In_ WDFMEMORY Input
Definition: portacpi.cpp:109
Definition: shell.h:41
#define NTAPI
Definition: typedefs.h:36
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
_Must_inspect_result_ _In_ UCXUSBDEVICE _Inout_ PUCXENDPOINT_INIT * EndpointInit
Definition: ucxendpoint.h:314
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
Definition: wdfiotarget.h:510
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:342
static void Initialize()
Definition: xlate.c:212