ReactOS 0.4.17-dev-1281-g065abb3
epstate.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 state machine
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#pragma once
9
11
12class XhciEndpoint;
13
14enum class XepEvent : UCHAR
15{
16 /* Command and mapping completions, taken even while the endpoint is quiet */
24
25 /* Transfer ring, hardware and timer notifications */
35
36 /* Requests from the controller, the endpoint owner and the client driver */
40 Disable,
41 Enable,
43
44 Count
45};
46
48typedef enum _XEP_TIMEOUT
49{
55
56class XhciEndpointMachine : public SmMachine<XhciEndpointMachine, XepEvent>
57{
59 friend class XhciEndpointProbe;
60
61public:
62 VOID
65
67 Endpoint() const
68 {
69 return m_Endpoint;
70 }
71
72 static const SM_EVENT_INFO EventInfo[];
73
74private:
76 {
81 };
82
84 {
89 };
90
92 {
97 };
98
99 /* States */
100 static const State Disabled;
101 static const State Active;
102 static const State Running;
103 static const State Mapping;
105 static const State AwaitingDisable;
106 static const State Parked;
109 static const State Fenced;
111 static const State Removed;
112 static const State HaltingRingFill;
114 static const State Commanding;
115 static const State StoppingPipe;
117 static const State UpdatingDequeue;
120 static const State ResettingPipe;
122 static const State Reclaiming;
123 static const State Timed;
125 static const State AwaitingHalt;
127 static const State Draining;
128 static const State LeavingTimer;
129
130 /* Engine hooks */
132 static const USHORT SmTimerEventId = static_cast<USHORT>(XepEvent::TimerFired);
133
134 VOID
135 SmReference();
136
137 VOID
139
140 BOOLEAN
142
143 /* Handlers */
148 OnActive(
151 OnRunning(
154 OnMapping(
157 OnParked(
210
211 /* Entry actions */
228
229 /* Helpers */
231 Remap();
232
236
240
243 _In_ ULONG Milliseconds);
244
246 DrainFor(
248
252
256
263
264 BOOLEAN
266 {
269 }
270
271 /* Actions, implemented by the endpoint object */
275 VOID
277 _In_ ULONG Milliseconds);
278 VOID
306
307 /* Queries, implemented by the endpoint object */
317
324};
unsigned char BOOLEAN
Definition: actypes.h:127
Run to completion engine. The first thread to post into an idle machine drains the queue; everyone el...
Definition: smengine.h:114
SM_RESULT OnCommanding(_In_ XepEvent Event)
Definition: epstate.cpp:397
static const State AwaitingDisable
Definition: epstate.h:105
VOID ReportStoppedEvent()
Definition: epctx.cpp:2545
SM_RESULT OnResettingDefaultPipe(_In_ XepEvent Event)
Definition: epstate.cpp:479
VOID DropStoppedEvent()
Definition: epctx.cpp:2554
SM_RESULT OnDraining(_In_ XepEvent Event)
Definition: epstate.cpp:666
static const State Commanding
Definition: epstate.h:114
SM_RESULT OnDisabled(_In_ XepEvent Event)
Definition: epstate.cpp:213
VOID ResetStopAttempts()
Definition: epctx.cpp:2560
SM_RESULT EnterReclaiming()
Definition: epstate.cpp:536
SM_RESULT LeaveTimerFor(_In_ TIMER_EXIT Exit)
Definition: epstate.cpp:742
SM_RESULT OnRebuildingContextAfterStop(_In_ XepEvent Event)
Definition: epstate.cpp:445
static const State Active
Definition: epstate.h:101
SM_RESULT AfterStoppedEvent()
Definition: epstate.cpp:812
static const State AwaitingClientReset
Definition: epstate.h:107
static const State RebuildingContextForReset
Definition: epstate.h:121
static const State UpdatingDequeue
Definition: epstate.h:117
static const State Fenced
Definition: epstate.h:109
SM_RESULT OnAwaitingStoppedEvent(_In_ XepEvent Event)
Definition: epstate.cpp:637
XhciEndpoint * Endpoint() const
Definition: epstate.h:67
VOID NotifyRingsClientReset()
Definition: epctx.cpp:2593
VOID UpdateDequeuePointers()
Definition: epctx.cpp:2716
static const State ClientResetCommand
Definition: epstate.h:119
VOID AskUcxToCancel()
Definition: epctx.cpp:2625
SM_RESULT AfterHaltDrained()
Definition: epstate.cpp:819
SM_RESULT OnReclaiming(_In_ XepEvent Event)
Definition: epstate.cpp:546
SM_RESULT OnAwaitingHalt(_In_ XepEvent Event)
Definition: epstate.cpp:611
BOOLEAN StopAttemptsExhausted()
Definition: epctx.cpp:2808
VOID StartTimer(_In_ ULONG Milliseconds)
Definition: epctx.cpp:2450
SM_RESULT OnAwaitingStopRetry(_In_ XepEvent Event)
Definition: epstate.cpp:579
SM_RESULT OnRunning(_In_ XepEvent Event)
Definition: epstate.cpp:242
BOOLEAN m_DrainAfterHalt
Definition: epstate.h:323
VOID ReportTimeout(_In_ XEP_TIMEOUT Timeout)
Definition: epctx.cpp:2458
SM_RESULT AfterHalt()
Definition: epstate.cpp:800
SM_RESULT OnMapping(_In_ XepEvent Event)
Definition: epstate.cpp:253
static const State Mapping
Definition: epstate.h:103
SM_RESULT OnAwaitingClientReset(_In_ XepEvent Event)
Definition: epstate.cpp:305
static const State Draining
Definition: epstate.h:127
VOID NotifyRingsReclaim()
Definition: epctx.cpp:2618
static const State Reclaiming
Definition: epstate.h:122
@ ReclaimAfterControllerReset
Definition: epstate.h:88
SM_RESULT EnterHaltingRingFill()
Definition: epstate.cpp:344
SM_RESULT EnterAwaitingStopRetry()
Definition: epstate.cpp:572
static const State AwaitingCancelOk
Definition: epstate.h:113
VOID ResumeRingFill()
Definition: epctx.cpp:2484
SM_RESULT OnAwaitingCancelOk(_In_ XepEvent Event)
Definition: epstate.cpp:387
VOID ReconfigureForReset()
Definition: epctx.cpp:2659
VOID AckControllerReset()
Definition: epctx.cpp:2502
VOID ResetEndpoint()
Definition: epctx.cpp:2748
static const State ResettingPipe
Definition: epstate.h:120
SM_RESULT EnterUpdatingDequeue()
Definition: epstate.cpp:455
SM_RESULT EnterResettingPipe()
Definition: epstate.cpp:500
static const State Timed
Definition: epstate.h:123
static const USHORT SmTimerEventId
Definition: epstate.h:132
static const State StoppingPipe
Definition: epstate.h:115
VOID NotifyRingsReclaimOnCancel()
Definition: epctx.cpp:2605
SM_RESULT EnterLeavingTimer()
Runs the timer exit; the engine already stopped the timer, so it cannot fire after this.
Definition: epstate.cpp:697
SM_RESULT AfterStopDrained()
Definition: epstate.cpp:791
SM_RESULT RunTimerExit(_In_ TIMER_EXIT Exit)
Definition: epstate.cpp:750
VOID CompleteResetRequestIfAllowed()
Definition: epctx.cpp:2536
VOID SuspendRingFill()
Definition: epctx.cpp:2496
SM_RESULT SuspendRingFillFor(_In_ MAPPING_STOP_REASON Reason)
Definition: epstate.cpp:710
VOID CompleteResetRequest()
Definition: epctx.cpp:2511
SM_RESULT OnActive(_In_ XepEvent Event)
Definition: epstate.cpp:232
SM_RESULT EnterAwaitingStoppedEvent()
Definition: epstate.cpp:629
static const State ResetWhileMapping
Definition: epstate.h:104
RECLAIM_REASON m_AfterReclaim
Definition: epstate.h:320
BOOLEAN OnPrimaryInterrupterOnly()
Definition: epctx.cpp:2784
SM_RESULT OnHaltingRingFill(_In_ XepEvent Event)
Definition: epstate.cpp:354
SM_RESULT EnterDraining()
Definition: epstate.cpp:655
VOID SendStopCommand()
Definition: epctx.cpp:2572
static const State LeavingTimer
Definition: epstate.h:128
VOID PurgeStreamQueues()
Definition: epctx.cpp:2632
BOOLEAN CanResetAfterHalt()
Definition: epctx.cpp:2864
static const State AwaitingStoppedEvent
Definition: epstate.h:126
SM_RESULT EnterRebuildingContextAfterStop()
Definition: epstate.cpp:438
SM_RESULT EnterRemoved()
Definition: epstate.cpp:336
BOOLEAN SmCancelTimer()
Definition: epstate.cpp:207
static const State RebuildingContextAfterStop
Definition: epstate.h:116
SM_RESULT OnUpdatingDequeue(_In_ XepEvent Event)
Definition: epstate.cpp:462
VOID RequestControllerReset()
Definition: epctx.cpp:2766
SM_RESULT EnterAwaitingCancelOk()
Definition: epstate.cpp:380
SM_RESULT OnParked(_In_ XepEvent Event)
Definition: epstate.cpp:288
VOID NotifyRingsHalted()
Definition: epctx.cpp:2587
TIMER_EXIT m_AfterTimer
Definition: epstate.h:321
static const State ResettingDefaultPipe
Definition: epstate.h:118
SM_RESULT OnClientResetCommand(_In_ XepEvent Event)
Definition: epstate.cpp:489
BOOLEAN IgnoresStopContextError()
Definition: epctx.cpp:2796
SM_RESULT EnterResettingDefaultPipe()
Definition: epstate.cpp:472
VOID CountStopAttempt()
Definition: epctx.cpp:2566
SM_RESULT BeginStop()
Definition: epstate.cpp:770
static const State AwaitingHalt
Definition: epstate.h:125
static const State Removed
Definition: epstate.h:111
VOID NotifyRingsStoppedEvent()
Definition: epctx.cpp:2599
SM_RESULT AfterStopCommand()
Definition: epstate.cpp:781
MAPPING_STOP_REASON m_AfterMapping
Definition: epstate.h:319
VOID ResetDefaultPipe()
Definition: epctx.cpp:2733
static const State Disabled
Definition: epstate.h:100
SM_RESULT EnterRebuildingContextForReset()
Definition: epstate.cpp:517
SM_RESULT OnStoppingPipe(_In_ XepEvent Event)
Definition: epstate.cpp:415
static const State Parked
Definition: epstate.h:106
BOOLEAN StopTimer()
Definition: epctx.cpp:2444
static const State HaltingRingFill
Definition: epstate.h:112
BOOLEAN ReclaimIgnoresCancel() const
Definition: epstate.h:265
XhciEndpoint * m_Endpoint
Definition: epstate.h:318
static const State Running
Definition: epstate.h:102
SM_RESULT OnResettingPipe(_In_ XepEvent Event)
Definition: epstate.cpp:507
static const BOOLEAN SmCompletionsFirst
Definition: epstate.h:131
SM_RESULT OnAwaitingControllerReset(_In_ XepEvent Event)
Definition: epstate.cpp:326
BOOLEAN ShouldReconfigureForReset()
Definition: epctx.cpp:2841
static const State AwaitingRecovery
Definition: epstate.h:108
static const SM_EVENT_INFO EventInfo[]
Definition: epstate.h:72
friend class XhciEndpointProbe
Definition: epstate.h:59
BOOLEAN DelaysFirstStop()
Definition: epctx.cpp:2790
VOID DereferenceEndpoint()
Definition: epctx.cpp:2438
SM_RESULT DrainFor(_In_ BOOLEAN AfterHalt)
Definition: epstate.cpp:734
static const State AwaitingControllerReset
Definition: epstate.h:110
SM_RESULT Remap()
Definition: epstate.cpp:703
BOOLEAN DoorbellRungSinceFill()
Definition: epctx.cpp:2814
SM_RESULT RetryStopAfter(_In_ ULONG Milliseconds)
Definition: epstate.cpp:726
SM_RESULT EnterStoppingPipe()
Definition: epstate.cpp:407
static const State AwaitingStopRetry
Definition: epstate.h:124
VOID ReconfigureAfterStop()
Definition: epctx.cpp:2694
VOID RestartStreamQueues()
Definition: epctx.cpp:2645
BOOLEAN IsControlEndpoint()
Definition: epctx.cpp:2778
SM_RESULT ReclaimFor(_In_ RECLAIM_REASON Reason)
Definition: epstate.cpp:718
BOOLEAN NeedsContextRebuildAfterStop()
Definition: epctx.cpp:2834
VOID ReferenceEndpoint()
Definition: epctx.cpp:2432
VOID NotifyRingsDrainEvents()
Definition: epctx.cpp:2611
SM_RESULT OnRebuildingContextForReset(_In_ XepEvent Event)
Definition: epstate.cpp:524
SM_RESULT EnterAwaitingHalt()
Definition: epstate.cpp:604
SM_RESULT EnterAwaitingControllerReset()
Definition: epstate.cpp:319
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
#define FALSE
Definition: types.h:117
XepEvent
Definition: epstate.h:15
@ StoppedEventSeen
@ BufferAllocFailed
@ ExpectedEventsDone
@ StopFailedHalted
@ StopFailedStopped
@ CommandSucceeded
@ StopFailedRunning
@ TransferAborted
@ ControllerResetDone
@ StreamMapStopped
@ ControllerResetStarting
@ ControllerRemoved
@ TransfersRecovered
_XEP_TIMEOUT
Definition: epstate.h:49
@ XepTimeoutStoppedEvent
Definition: epstate.h:51
@ XepTimeoutDrainAfterStop
Definition: epstate.h:52
@ XepTimeoutHalt
Definition: epstate.h:50
@ XepTimeoutDrainAfterHalt
Definition: epstate.h:53
enum _XEP_TIMEOUT XEP_TIMEOUT
_In_ UCXHUB_DEVICE_CONTEXT _In_ UCXENDPOINT Endpoint
Definition: hubucx.h:238
PVOID PVOID PWCHAR PVOID USHORT PULONG Reason
Definition: env.c:47
#define _In_
Definition: no_sal2.h:158
unsigned short USHORT
Definition: pedump.c:61
static ULONG Timeout
Definition: ping.c:61
static void Exit(void)
Definition: sock.c:1330
One state. Handler gets every event the state sees.
Definition: smengine.h:93
unsigned char UCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
static void Initialize()
Definition: xlate.c:212