ReactOS 0.4.17-dev-1281-g065abb3
epsm.h
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS USB Controller Extension
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 UcxEndpoint;
13
14enum class EpEvent : UCHAR
15{
16 /* Requests from the hub and the client, wait until the endpoint is idle */
27 Delete,
31
32 /* Completions of work the machine started */
41
42 /* Posted by the controller once a reset finishes */
44
45 Count
46};
47
48class EndpointMachine : public SmMachine<EndpointMachine, EpEvent>
49{
50 friend class SmMachine<EndpointMachine, EpEvent>;
51
52public:
53 VOID
56
58 Endpoint() const
59 {
60 return m_Endpoint;
61 }
62
63 static const SM_EVENT_INFO EventInfo[];
64
65private:
67 {
71 };
72
73 /* States */
74 static const State Inactive;
75 static const State Created;
76 static const State Disabled;
77 static const State Retired;
78 static const State Stale;
79 static const State AwaitingDestroy;
80 static const State Enabled;
81 static const State Busy;
82 static const State Purging;
83 static const State Operation;
84 static const State AwaitingAbortUrb;
85 static const State Aborting;
86 static const State EnablingStreams;
87 static const State DisablingStreams;
88 static const State ResettingPipe;
89 static const State OperationHeld;
91
92 /* Engine hooks */
96
97 VOID
99
100 VOID
102
103 /* Handlers */
108 OnCreated(
114 OnRetired(
117 OnStale(
120 OnEnabled(
123 OnBusy(
126 OnPurging(
152
153 /* Entry actions */
160
161 /* Helpers */
164
167 _In_ PURGE_FOLLOW_UP FollowUp);
168
171 _In_ const State* Target,
172 _In_ const State* ReturnTo);
173
175 TryStart();
176
178 Retire();
179
180 BOOLEAN
181 CanStart();
182
183 /* Actions and queries, implemented by the endpoint object */
194 VOID
196 _In_ BOOLEAN ForceFailure);
211
219};
unsigned char BOOLEAN
Definition: actypes.h:127
static const State Inactive
Definition: epsm.h:74
VOID CompleteAbortUrb()
Definition: pipe.cpp:783
static const State ResettingPipe
Definition: epsm.h:88
VOID FailResetRequest()
Definition: pipe.cpp:691
VOID AckControllerReset()
Definition: pipe.cpp:816
VOID FinishStreamsOpenRequest(_In_ BOOLEAN ForceFailure)
Definition: pipe.cpp:720
SM_RESULT OnOperation(_In_ EpEvent Event)
Definition: epsm.cpp:360
static const State AwaitingDestroy
Definition: epsm.h:79
SM_RESULT OnBusy(_In_ EpEvent Event)
Definition: epsm.cpp:314
static const State Purging
Definition: epsm.h:82
VOID FinishStreamsCloseRequest()
Definition: pipe.cpp:762
BOOLEAN DeviceAllowsStart()
Definition: pipe.cpp:925
SM_RESULT OnAborting(_In_ EpEvent Event)
Definition: epsm.cpp:392
static const State Busy
Definition: epsm.h:81
SM_RESULT EnterDisablingStreams()
Definition: epsm.cpp:435
SM_RESULT OnAwaitingAbortUrb(_In_ EpEvent Event)
Definition: epsm.cpp:375
static const State Stale
Definition: epsm.h:78
SM_RESULT EnterAborting()
Definition: epsm.cpp:385
VOID ForwardResetRequest()
Definition: pipe.cpp:682
VOID StartEndpoint()
Definition: pipe.cpp:663
SM_RESULT StartPurge(_In_ PURGE_FOLLOW_UP FollowUp)
Definition: epsm.cpp:555
static const State EnablingStreams
Definition: epsm.h:86
SM_RESULT BeginOperation(_In_ const State *Target, _In_ const State *ReturnTo)
Definition: epsm.cpp:563
VOID SmDereference()
Definition: epsm.cpp:142
SM_RESULT EnterPurging()
Definition: epsm.cpp:331
VOID ParkStreamsDisableRequest()
Definition: pipe.cpp:750
BOOLEAN CanStart()
Definition: epsm.cpp:606
BOOLEAN m_PauseAfterPurge
Definition: epsm.h:218
BOOLEAN DeviceDisconnected()
Definition: pipe.cpp:937
SM_RESULT OnEnabled(_In_ EpEvent Event)
Definition: epsm.cpp:268
const State * m_HeldOperation
Definition: epsm.h:214
SM_RESULT OnOperationUnwinding(_In_ EpEvent Event)
Reset under an outstanding operation: finish it, then purge.
Definition: epsm.cpp:500
SM_RESULT OnResettingPipe(_In_ EpEvent Event)
Definition: epsm.cpp:469
VOID AbortEndpoint()
Definition: pipe.cpp:676
SM_RESULT OnEnablingStreams(_In_ EpEvent Event)
Definition: epsm.cpp:424
VOID ReferenceEndpoint()
Definition: pipe.cpp:651
VOID ForwardStreamsDisableRequest()
Definition: pipe.cpp:741
VOID FinishEndpointResetRequest()
Definition: pipe.cpp:698
VOID RejectStreamsEnableRequest()
Definition: pipe.cpp:713
static const State Enabled
Definition: epsm.h:80
@ PurgeFollowUpTreePurge
Definition: epsm.h:70
@ PurgeFollowUpHubOperation
Definition: epsm.h:69
@ PurgeFollowUpNone
Definition: epsm.h:68
SM_RESULT Retire()
An endpoint the client still has a handle to stays around as stale.
Definition: epsm.cpp:590
static const State OperationUnwinding
Definition: epsm.h:90
BOOLEAN m_AbortForHub
Definition: epsm.h:217
BOOLEAN DeviceDeprogrammed()
Definition: pipe.cpp:931
UcxEndpoint * Endpoint() const
Definition: epsm.h:58
PURGE_FOLLOW_UP m_AfterPurge
Definition: epsm.h:215
SM_RESULT EnterOperationHeld()
Definition: epsm.cpp:480
static const State Retired
Definition: epsm.h:77
VOID DereferenceEndpoint()
Definition: pipe.cpp:657
VOID ForwardStreamsEnableRequest()
Definition: pipe.cpp:704
VOID DeleteEndpoint()
Definition: pipe.cpp:844
UcxEndpoint * m_Endpoint
Definition: epsm.h:212
SM_RESULT OnCreated(_In_ EpEvent Event)
Definition: epsm.cpp:179
VOID DeleteStaleEndpoint()
Definition: pipe.cpp:914
static const State AwaitingAbortUrb
Definition: epsm.h:84
SM_RESULT OnOperationHeld(_In_ EpEvent Event)
Definition: epsm.cpp:486
BOOLEAN ClientHoldsHandle()
Definition: pipe.cpp:943
VOID CompleteHubOperation()
Definition: pipe.cpp:796
static const State Aborting
Definition: epsm.h:85
VOID PurgeEndpoint()
Definition: pipe.cpp:670
SM_RESULT OnPurging(_In_ EpEvent Event)
Definition: epsm.cpp:345
SM_RESULT OnDisabled(_In_ EpEvent Event)
Definition: epsm.cpp:205
BOOLEAN ParkAsStale()
Definition: pipe.cpp:867
VOID CompleteTreePurge()
Definition: pipe.cpp:803
SM_RESULT TryStart()
Definition: epsm.cpp:572
SM_RESULT OnDisablingStreams(_In_ EpEvent Event)
Definition: epsm.cpp:447
static const State DisablingStreams
Definition: epsm.h:87
SM_RESULT OnInactive(_In_ EpEvent Event)
Definition: epsm.cpp:148
static const State OperationHeld
Definition: epsm.h:89
static const State Created
Definition: epsm.h:75
SM_RESULT EnterEnablingStreams()
Definition: epsm.cpp:413
SM_RESULT PauseForControllerReset()
Pause before the ack; nothing may touch the machine after it.
Definition: epsm.cpp:547
SM_RESULT OnRetired(_In_ EpEvent Event)
Definition: epsm.cpp:242
SM_RESULT OnStale(_In_ EpEvent Event)
Definition: epsm.cpp:255
const State * m_ReturnTo
Definition: epsm.h:213
static const State Operation
Definition: epsm.h:83
SM_RESULT EnterResettingPipe()
Definition: epsm.cpp:458
static const State Disabled
Definition: epsm.h:76
static const SM_EVENT_INFO EventInfo[]
Definition: epsm.h:63
BOOLEAN SmAccepts(_In_ EpEvent Event)
Abort URB is only taken while running; the caller fails the URB on FALSE.
Definition: epsm.cpp:126
VOID SmReference()
Definition: epsm.cpp:136
BOOLEAN m_Enabled
Definition: epsm.h:216
Run to completion engine. The first thread to post into an idle machine drains the queue; everyone el...
Definition: smengine.h:114
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
EpEvent
Definition: epsm.h:15
@ AbortUrbParked
@ ClientStreamsEnable
@ HubTreePurge
@ StreamsClosed
@ DeviceResetDone
@ ConfigureDone
@ ClientAbortUrb
@ HubDeviceReset
@ StreamsOpened
@ HubDisconnect
@ StaleReplaced
@ ControllerResetDone
@ HubStartRequest
@ ClientStreamsDisable
@ EndpointResetDone
@ ControllerResetStarting
@ HubEndpointReset
_In_ UCXHUB_DEVICE_CONTEXT _In_ UCXENDPOINT Endpoint
Definition: hubucx.h:238
#define _In_
Definition: no_sal2.h:158
One state. Handler gets every event the state sees.
Definition: smengine.h:93
unsigned char UCHAR
Definition: typedefs.h:53
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306
static void Initialize()
Definition: xlate.c:212