ReactOS 0.4.17-dev-1281-g065abb3
crsm.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS USB Controller Extension
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Controller reset state machine
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8/* INCLUDES *******************************************************************/
9
10#include "ucx01000.h"
11
12/* GLOBALS ********************************************************************/
13
15{
16 { "ControllerLost", SmEventRequest, FALSE },
17 { "HubRequestsReset", SmEventRequest, FALSE },
18 { "RootHubPoweredUp", SmEventRequest, FALSE },
19 { "RootHubPoweringDown", SmEventRequest, FALSE },
20 { "ControllerNeedsReset", SmEventCompletion, TRUE },
21 { "ControllerResetDone", SmEventCompletion, TRUE },
22 { "ResetBlocksCleared", SmEventCompletion, FALSE },
23 { "DevicesReady", SmEventCompletion, FALSE },
24};
25
27 "EventInfo must have one entry per CrEvent");
28
29/* Root hub PDO in D0, controller running */
32
33/* Root hub PDO out of D0. Initial state */
36
37/* The controller reset itself while the root hub was off, devices catch up */
39 { NULL, "PreparingDevicesOff", 0,
41
42/* A reset UCX drives, the reset in progress flag is set throughout */
44 { NULL, "Resetting", 0, &ControllerResetMachine::OnResetting, NULL };
45
47 { &Resetting, "DrainingReferences", 0,
49
51 { &Resetting, "PreparingDevices", 0,
53
55 { &Resetting, "ResettingController", SM_STATE_NEEDS_PASSIVE,
57
58/* Another reset was asked for while one was running, call the driver again when it ends */
60 { &Resetting, "AwaitingResetDone", 0, &ControllerResetMachine::OnAwaitingResetDone, NULL };
61
62/* Reset done on the controller's own request, the hub has to reset the root hub ports */
64 { &Resetting, "AwaitingHubReset", SM_STATE_TAKES_REQUESTS,
66
67/* The controller driver reported the hardware dead, nothing leaves this group */
70
72 { &Failed, "FailedOn", 0, &ControllerResetMachine::OnFailedOn, NULL };
73
75 { &Failed, "FailedOff", 0, &ControllerResetMachine::OnFailedOff, NULL };
76
77/* FUNCTIONS ******************************************************************/
78
79VOID
82{
87
89}
90
91VOID
93{
95}
96
97VOID
99{
101}
102
103VOID
105{
107}
108
112{
113 switch (Event)
114 {
115 case CrEvent::ControllerLost:
117 return SmTransition(&FailedOn);
118
119 case CrEvent::ControllerNeedsReset:
120 return StartReset(FALSE);
121
122 case CrEvent::HubRequestsReset:
123 return StartReset(TRUE);
124
125 case CrEvent::RootHubPoweringDown:
126 return PowerDown(FALSE);
127
128 default:
129 return SmUnhandled();
130 }
131}
132
140{
141 switch (Event)
142 {
143 case CrEvent::ControllerResetDone:
145 if (!m_ResetSeen)
147
149 return SmHandled();
150
151 case CrEvent::ControllerNeedsReset:
154 return SmHandled();
155
156 case CrEvent::RootHubPoweredUp:
158 if (m_ResetPending)
159 return StartReset(FALSE);
160
161 return SmTransition(&RootHubOn);
162
163 case CrEvent::ControllerLost:
165 return SmTransition(&FailedOff);
166
167 default:
168 return SmUnhandled();
169 }
170}
171
175{
176 if (Event != CrEvent::DevicesReady)
177 return SmUnhandled();
178
182 return SmTransition(&RootHubOff);
183}
184
188{
189 /* A reset is already under way */
190 if (Event == CrEvent::ControllerNeedsReset)
191 return SmHandled();
192
193 return SmUnhandled();
194}
195
198{
203 return SmHandled();
204}
205
209{
210 if (Event == CrEvent::ResetBlocksCleared)
212
213 return SmUnhandled();
214}
215
218{
220 return SmHandled();
221}
222
226{
227 if (Event == CrEvent::DevicesReady)
229
230 return SmUnhandled();
231}
232
235{
237 return SmHandled();
238}
239
243{
244 switch (Event)
245 {
246 case CrEvent::ControllerResetDone:
249 if (m_ForHub)
250 return EndResetForHub();
251
253
254 case CrEvent::ControllerNeedsReset:
256
257 default:
258 return SmUnhandled();
259 }
260}
261
265{
266 if (Event == CrEvent::ControllerResetDone)
268
269 return SmUnhandled();
270}
271
275{
276 switch (Event)
277 {
278 case CrEvent::HubRequestsReset:
279 return EndResetForHub();
280
281 case CrEvent::ControllerNeedsReset:
284
285 case CrEvent::RootHubPoweringDown:
288 return PowerDown(TRUE);
289
290 case CrEvent::ControllerLost:
293 return SmTransition(&FailedOn);
294
295 default:
296 return SmUnhandled();
297 }
298}
299
303{
304 if (Event == CrEvent::ControllerNeedsReset)
305 return SmHandled();
306
307 return SmUnhandled();
308}
309
313{
314 switch (Event)
315 {
316 case CrEvent::HubRequestsReset:
318 return SmHandled();
319
320 case CrEvent::RootHubPoweringDown:
322 return SmTransition(&FailedOff);
323
324 default:
325 return SmUnhandled();
326 }
327}
328
332{
333 switch (Event)
334 {
335 case CrEvent::ControllerResetDone:
337 return SmHandled();
338
339 case CrEvent::RootHubPoweredUp:
341 return SmTransition(&FailedOn);
342
343 default:
344 return SmUnhandled();
345 }
346}
347
350 _In_ BOOLEAN ForHub)
351{
352 m_ForHub = ForHub;
354}
355
358{
362 return SmTransition(&RootHubOn);
363}
364
367 _In_ BOOLEAN ResetSeen)
368{
371 m_ResetSeen = ResetSeen;
372 return SmTransition(&RootHubOff);
373}
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
unsigned char BOOLEAN
Definition: actypes.h:127
SM_RESULT OnRootHubOff(_In_ CrEvent Event)
m_ResetSeen: a reset done while off was caught up. m_ResetPending: a reset is owed.
Definition: crsm.cpp:138
SM_RESULT OnDrainingReferences(_In_ CrEvent Event)
Definition: crsm.cpp:207
SM_RESULT OnResettingController(_In_ CrEvent Event)
Definition: crsm.cpp:241
static const State RootHubOn
Definition: crsm.h:52
SM_RESULT OnFailedOff(_In_ CrEvent Event)
Definition: crsm.cpp:330
BOOLEAN m_ResetPending
Definition: crsm.h:154
static const State RootHubOff
Definition: crsm.h:53
SM_RESULT OnPreparingDevices(_In_ CrEvent Event)
Definition: crsm.cpp:224
SM_RESULT OnAwaitingHubReset(_In_ CrEvent Event)
Definition: crsm.cpp:273
SM_RESULT EndResetForHub()
Definition: crsm.cpp:357
static const State FailedOff
Definition: crsm.h:63
static const SM_EVENT_INFO EventInfo[]
Definition: crsm.h:48
SM_RESULT OnRootHubOn(_In_ CrEvent Event)
Definition: crsm.cpp:110
VOID SmDereference()
Definition: crsm.cpp:98
static const State DrainingReferences
Definition: crsm.h:56
static const State PreparingDevicesOff
Definition: crsm.h:54
SM_RESULT EnterPreparingDevices()
Definition: crsm.cpp:217
SM_RESULT PowerDown(_In_ BOOLEAN ResetSeen)
Definition: crsm.cpp:366
SM_RESULT StartReset(_In_ BOOLEAN ForHub)
Definition: crsm.cpp:349
BOOLEAN m_ForHub
Definition: crsm.h:153
VOID CompleteHubReset(_In_ BOOLEAN Succeeded)
Definition: hostreset.cpp:228
UcxController * m_Controller
Definition: crsm.h:152
UcxController * Controller() const
Definition: crsm.h:43
BOOLEAN m_ResetSeen
Definition: crsm.h:155
static const State Resetting
Definition: crsm.h:55
SM_RESULT EnterDrainingReferences()
Definition: crsm.cpp:197
SM_RESULT OnResetting(_In_ CrEvent Event)
Definition: crsm.cpp:186
SM_RESULT OnPreparingDevicesOff(_In_ CrEvent Event)
Definition: crsm.cpp:173
static const State AwaitingHubReset
Definition: crsm.h:60
static const State AwaitingResetDone
Definition: crsm.h:59
SM_RESULT EnterResettingController()
Definition: crsm.cpp:234
static const State Failed
Definition: crsm.h:61
SM_RESULT OnFailed(_In_ CrEvent Event)
Definition: crsm.cpp:301
SM_RESULT OnAwaitingResetDone(_In_ CrEvent Event)
Definition: crsm.cpp:263
VOID ReleaseResetCompleteWaiter()
Definition: hostreset.cpp:255
static const State ResettingController
Definition: crsm.h:58
VOID LetResetCompletionProceed()
Definition: hostreset.cpp:249
VOID Initialize(_In_ UcxController *Controller)
Definition: crsm.cpp:80
SM_RESULT OnFailedOn(_In_ CrEvent Event)
Definition: crsm.cpp:311
static const State FailedOn
Definition: crsm.h:62
static const State PreparingDevices
Definition: crsm.h:57
VOID SmInitialize(_In_ const State *Initial)
Definition: smengine.h:349
static SM_RESULT SmTransition(_In_ const State *Target)
Definition: smengine.h:194
CrEvent
Definition: crsm.h:15
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define _In_
Definition: no_sal2.h:158
@ Failed
Definition: arc.h:88
#define SM_STATE_TAKES_REQUESTS
Definition: smengine.h:39
#define SM_STATE_NEEDS_PASSIVE
Definition: smengine.h:40
@ SmEventRequest
Definition: smengine.h:25
@ SmEventCompletion
Definition: smengine.h:24
One state. Handler gets every event the state sees.
Definition: smengine.h:93
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXCONTROLLER * Controller