ReactOS 0.4.17-dev-1281-g065abb3
devsm_zero.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS USB Hub Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Device state machine, work at address zero and address assignment
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8/* INCLUDES *******************************************************************/
9
10#include "usbhub3.h"
11
12/* GLOBALS ********************************************************************/
13
14/* Sets up the 3.0 device in the controller and runs the port reset sub machine */
16 { NULL, "ResettingSuperSpeed", SM_STATE_YIELDS_TO_CALLER,
18
19/* Points the default endpoint at the max packet size from the first descriptor read */
21 { NULL, "UpdatingDefaultEndpoint", SM_STATE_CRITICAL_ONLY,
23
24/* Gives the device its address */
26 { NULL, "SettingAddress", SM_STATE_CRITICAL_ONLY,
28
29/* FUNCTIONS ******************************************************************/
30
31/* 2.0 PORT AT ADDRESS ZERO, FIRST ENUMERATION ********************************/
32
36{
37 switch (Event)
38 {
39 case DsmEvent::PortResetDone:
40 if (!SetSpeedFor20())
41 return EndWith(DsmEvent::Failed);
42
44
45 case DsmEvent::PortResetAbortedForSuspend:
47
48 case DsmEvent::HubStopping:
49 case DsmEvent::HubSuspending:
52
53 case DsmEvent::PortResetTimeout:
55 return EndWith(DsmEvent::Failed);
56
57 case DsmEvent::PortFault:
58 return EndWith(DsmEvent::Failed);
59
60 case DsmEvent::PortDetached:
61 return EndWith(DsmEvent::PortDetached);
62
63 default:
64 return SmUnhandled();
65 }
66}
67
71{
72 if (Event == DsmEvent::PortDisableDone)
73 return EndWith(m_HubEvent);
74
75 return EndOnResetForHub(Event);
76}
77
80{
82 return EndWith(DsmEvent::Failed);
83
85 {
87 return EndWith(DsmEvent::Failed);
88 }
89
91}
92
96{
97 switch (Event)
98 {
99 case DsmEvent::ControllerIoctlDone:
102
103 case DsmEvent::ControllerIoctlFailed:
105
106 default:
107 return SmUnhandled();
108 }
109}
110
114{
115 if (Event == DsmEvent::TimerFired)
117
118 return Zero20StopDelay(Event);
119}
120
121/* Hub stop, hub suspend or detach while the post reset timer runs */
125{
126 switch (Event)
127 {
128 case DsmEvent::PortDetached:
129 if (StopTimer())
131
133
134 case DsmEvent::HubStopping:
135 case DsmEvent::HubSuspending:
137 if (StopTimer())
139
141
142 default:
143 return SmUnhandled();
144 }
145}
146
150{
151 if (Event != DsmEvent::TimerFired)
152 return SmUnhandled();
153
155}
156
160{
161 switch (Event)
162 {
163 case DsmEvent::PortDetached:
165
166 case DsmEvent::TimerFired:
168
169 default:
170 return SmUnhandled();
171 }
172}
173
177{
178 if ((Event != DsmEvent::TransferDone) && (Event != DsmEvent::TransferFailed))
179 return SmUnhandled();
180
183
185}
186
189{
192 return SmHandled();
193}
194
198{
199 switch (Event)
200 {
201 case DsmEvent::ControllerIoctlDone:
202 if (NeedsSecondReset())
204
206
207 case DsmEvent::ControllerIoctlFailed:
209
210 default:
211 return SmUnhandled();
212 }
213}
214
218{
219 switch (Event)
220 {
221 case DsmEvent::ControllerIoctlDone:
222 return EndWith(DsmEvent::Succeeded);
223
224 case DsmEvent::ControllerIoctlFailed:
226
227 default:
228 return SmUnhandled();
229 }
230}
231
235{
236 switch (Event)
237 {
238 case DsmEvent::PortResetDone:
241
242 case DsmEvent::PortDetached:
244
245 case DsmEvent::PortResetTimeout:
248
249 case DsmEvent::HubStopping:
250 case DsmEvent::HubSuspending:
253
254 case DsmEvent::PortFault:
256
257 case DsmEvent::PortResetAbortedForSuspend:
259
260 default:
261 return SmUnhandled();
262 }
263}
264
268{
269 switch (Event)
270 {
271 case DsmEvent::PortDetached:
273
274 case DsmEvent::PortResetTimeout:
275 case DsmEvent::PortFault:
276 case DsmEvent::PortResetDone:
278
279 case DsmEvent::PortResetAbortedForSuspend:
281
282 default:
283 return SmUnhandled();
284 }
285}
286
290{
291 switch (Event)
292 {
293 case DsmEvent::PortDetached:
295
296 case DsmEvent::HubStopping:
297 case DsmEvent::HubSuspending:
300
301 default:
302 return SmUnhandled();
303 }
304}
305
309{
310 switch (Event)
311 {
312 case DsmEvent::PortFault:
313 case DsmEvent::PortDisableDone:
315
316 case DsmEvent::PortDetached:
318
319 default:
320 return SmUnhandled();
321 }
322}
323
327{
328 if (Event == DsmEvent::TimerFired)
330
331 return Zero20StopDelay(Event);
332}
333
334/* 3.0 PORT AT ADDRESS ZERO, FIRST ENUMERATION ********************************/
335
338{
340 return EndWith(DsmEvent::Failed);
341
343 {
345 return EndWith(DsmEvent::Failed);
346 }
347
349}
350
353{
354 return StartSuperSpeedReset();
355}
356
360{
361 switch (Event)
362 {
363 case DsmEvent::Succeeded:
364 if (!SetSpeedFor30())
366
368
369 case DsmEvent::Failed:
371
372 case DsmEvent::HubStopping:
373 case DsmEvent::HubSuspending:
376
377 case DsmEvent::PortDetached:
379
380 default:
381 return SmUnhandled();
382 }
383}
384
388{
389 switch (Event)
390 {
391 case DsmEvent::ControllerIoctlDone:
392 return EndWith(DsmEvent::Succeeded);
393
394 case DsmEvent::ControllerIoctlFailed:
396
397 default:
398 return SmUnhandled();
399 }
400}
401
402/* SUPERSPEED PORT RESET SUB MACHINE ******************************************/
403
404/* Pushes the reset sub machine; a device that needs no reset only tells the controller */
407{
408 switch (ResetKindNeeded())
409 {
410 case DsmResetHot:
413
414 case DsmResetWarm:
417
418 default:
420 }
421}
422
426{
427 if (Event != DsmEvent::ControllerIoctlDone)
428 return SmUnhandled();
429
430 return EndWith(DsmEvent::Succeeded);
431}
432
436{
437 switch (Event)
438 {
439 case DsmEvent::HubStopping:
440 case DsmEvent::HubSuspending:
443
444 case DsmEvent::PortResetDone:
445 if (IsFirstEnumTry())
447
449
450 case DsmEvent::PortResetAbortedForSuspend:
452
453 case DsmEvent::PortResetTimeout:
455 return EndWith(DsmEvent::Failed);
456
457 case DsmEvent::PortFault:
458 return EndWith(DsmEvent::Failed);
459
460 case DsmEvent::PortDetached:
461 return EndWith(DsmEvent::PortDetached);
462
463 default:
464 return SmUnhandled();
465 }
466}
467
471{
472 switch (Event)
473 {
474 case DsmEvent::TimerFired:
476
477 case DsmEvent::HubStopping:
478 case DsmEvent::HubSuspending:
479 case DsmEvent::PortDetached:
480 return EndAfterTimer(Event);
481
482 default:
483 return SmUnhandled();
484 }
485}
486
487/* ADDRESS SUB MACHINE ********************************************************/
488
491{
493 return SmHandled();
494}
495
499{
500 switch (Event)
501 {
502 case DsmEvent::ControllerIoctlFailed:
503 return EndWith(DsmEvent::Failed);
504
505 case DsmEvent::ControllerIoctlDone:
507 return EndWith(DsmEvent::Succeeded);
508
510
511 default:
512 return SmUnhandled();
513 }
514}
515
519{
520 switch (Event)
521 {
522 case DsmEvent::TimerFired:
523 return EndWith(DsmEvent::Succeeded);
524
525 case DsmEvent::HubStopping:
526 case DsmEvent::HubSuspending:
527 case DsmEvent::PortDetached:
528 return EndAfterTimer(Event);
529
530 default:
531 return SmUnhandled();
532 }
533}
SM_RESULT Zero20TimerFlushedOnDetach(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:148
SM_RESULT EndWithHubEvent()
Definition: devsm.cpp:421
BOOLEAN CreateDeviceInController()
Definition: devhcd.cpp:488
SM_RESULT Zero20SecondResetEndedForHub(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:266
SM_RESULT Zero20ResetNotified(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:216
static const State AwaitingPort
Definition: devsm.h:222
SM_RESULT StartSuperSpeedReset()
Definition: devsm_zero.cpp:406
SM_RESULT CallWait(_In_ const State *Target, _In_ DSM_NEXT Next)
Definition: devsm.cpp:389
SM_RESULT Zero30CreateDevice()
Definition: devsm_zero.cpp:337
BOOLEAN SetSpeedFor30()
Definition: devlpm.cpp:641
SM_RESULT Zero20EndpointUpdated(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:196
SM_RESULT Zero20FirstResetDone(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:34
SM_RESULT EndDetached()
Definition: devsm.cpp:415
SM_RESULT EndFailed()
Definition: devsm.cpp:409
SM_RESULT AddressDelayEnded(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:517
SM_RESULT EnterUpdatingDefaultEndpoint()
Definition: devsm_zero.cpp:188
BOOLEAN SetSpeedFor20()
Definition: devmisc.cpp:115
VOID DeleteDeviceInController()
Definition: devhcd.cpp:568
SM_RESULT EnterSettingAddress()
Definition: devsm_zero.cpp:490
SM_RESULT Zero20SecondDelayEnded(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:325
VOID UpdateDefaultEndpoint()
Definition: devhcd.cpp:596
BOOLEAN StopTimer()
Definition: hubchild.cpp:295
VOID RequestPortReset()
Definition: hubport.cpp:662
SM_RESULT Zero20TimerFlushedForHub(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:158
static const State TimerAfterDetach
Definition: devsm.h:242
SM_RESULT Zero20SecondResetDone(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:233
VOID SetDeviceAddress()
Definition: devhcd.cpp:607
BOOLEAN NeedsSecondReset()
Definition: devmisc.cpp:262
SM_RESULT DisableAndDelete(_In_ DSM_THEN After)
Definition: devsm.cpp:315
static const State UpdatingDefaultEndpoint
Definition: devsm.h:471
SM_RESULT Zero20FirstDelayEnded(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:112
SM_RESULT EndWith(_In_ DsmEvent Result)
Definition: devsm.cpp:186
SM_RESULT EndAfterTimer(_In_ DsmEvent Event)
Definition: devsm.cpp:466
SM_RESULT Zero30Enabled(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:386
SM_RESULT Zero20CreateDevice()
Definition: devsm_zero.cpp:79
SM_RESULT Zero20FirstResetEndedForHub(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:69
SM_RESULT SuperSpeedDelayEnded(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:469
BOOLEAN CreateDefaultEndpoint()
Definition: devhcd.cpp:535
SM_RESULT Zero20Enabled(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:94
BOOLEAN IsFirstEnumTry()
Definition: devmisc.cpp:30
static const State DisablingPort
Definition: devsm.h:221
SM_RESULT OnSettingAddress(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:497
VOID RequestPortWarmReset()
Definition: hubport.cpp:668
static const State EnablingDevice
Definition: devsm.h:224
SM_RESULT Zero20PortOffForHub(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:307
SM_RESULT Zero20StopDelay(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:123
VOID RecordResetTimeout()
Definition: devmisc.cpp:398
DsmEvent m_HubEvent
Definition: devsm.h:1838
SM_RESULT Zero20FirstDescriptorRead(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:175
static const State NotifyingReset
Definition: devsm.h:226
static const State ReadingFirstDescriptor
Definition: devsm.h:227
SM_RESULT EndOnHubOrDetach(_In_ DsmEvent Event)
Definition: devsm.cpp:428
static const State ResettingPort
Definition: devsm.h:225
SM_RESULT SuperSpeedResetDone(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:434
static const State SettingAddress
Definition: devsm.h:472
BOOLEAN WaitNeededAfterAddress()
Definition: devmisc.cpp:281
SM_RESULT EndOnResetForHub(_In_ DsmEvent Event)
Definition: devsm.cpp:445
SM_RESULT SuperSpeedResetNotified(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:424
SM_RESULT OnShared(_In_ DsmEvent Event)
Definition: devsm.cpp:195
SM_RESULT Zero20SecondResetAwaitHub(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:288
SM_RESULT AtPassive(_In_ DSM_THEN Then)
Definition: devsm.cpp:177
SM_RESULT Delay(_In_ DSM_DELAY Kind, _In_ DSM_NEXT Next)
Definition: devsm.cpp:291
DSM_RESET_KIND ResetKindNeeded()
Definition: devmisc.cpp:187
SM_RESULT EnterResettingSuperSpeed()
Definition: devsm_zero.cpp:352
BOOLEAN FirstDescriptorValid()
Definition: devdesc.cpp:67
VOID RecordDeviceVersion()
Definition: devmisc.cpp:149
SM_RESULT DeleteThen(_In_ DSM_THEN After)
Definition: devsm.cpp:399
SM_RESULT OnResettingSuperSpeed(_In_ DsmEvent Event)
Definition: devsm_zero.cpp:358
static const State ResettingSuperSpeed
Definition: devsm.h:470
static SM_RESULT SmTransition(_In_ const State *Target)
Definition: smengine.h:194
static SM_RESULT SmUnhandled()
Definition: smengine.h:188
DsmEvent
Definition: devsm.h:15
@ DsmDelayPostResetLong
Definition: devsm.h:126
@ DsmDelayPostResetSuperSpeed
Definition: devsm.h:127
@ DsmDelayPostReset
Definition: devsm.h:125
@ DsmDelayPostAddress
Definition: devsm.h:128
@ DsmResetWarm
Definition: devsm.h:102
@ DsmResetHot
Definition: devsm.h:101
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
#define NULL
Definition: types.h:112
#define _In_
Definition: no_sal2.h:158
#define SM_STATE_YIELDS_TO_CALLER
Definition: smengine.h:42
#define SM_STATE_CRITICAL_ONLY
Definition: smengine.h:41
One state. Handler gets every event the state sees.
Definition: smengine.h:93
_In_ WDFDPC _In_ BOOLEAN Wait
Definition: wdfdpc.h:170