ReactOS 0.4.17-dev-1281-g065abb3
devsm_lpm.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, SuperSpeed U1 and U2 link power sub machine
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8/* INCLUDES *******************************************************************/
9
10#include "usbhub3.h"
11
12/* FUNCTIONS ******************************************************************/
13
14/* The exit latency is raised before the timeouts change and lowered after */
17{
19 return LpmCompute();
20}
21
24{
29 return LpmU1();
30
32 {
35 }
36
39}
40
44{
45 switch (Event)
46 {
47 case DsmEvent::ControllerIoctlDone:
50
51 case DsmEvent::ControllerExitLatencyTooLarge:
52 return LpmLatencyTooLarge();
53
54 case DsmEvent::ControllerIoctlFailed:
55 return LpmFailCleanup();
56
57 default:
58 return SmUnhandled();
59 }
60}
61
65{
66 switch (Event)
67 {
68 case DsmEvent::ControllerIoctlDone:
69 case DsmEvent::ControllerIoctlFailed:
70 return LpmU1();
71
72 case DsmEvent::ControllerExitLatencyTooLarge:
73 return LpmLatencyTooLarge();
74
75 default:
76 return SmUnhandled();
77 }
78}
79
80/* The controller cannot meet the exit latency: try again without U1 and U2 */
83{
85 return LpmCompute();
86
87 return LpmFailCleanup();
88}
89
92{
94 {
97 }
98
99 return EndWith(DsmEvent::Failed);
100}
101
105{
106 if (Event != DsmEvent::ControllerIoctlDone)
107 return SmUnhandled();
108
109 return EndWith(DsmEvent::Failed);
110}
111
114{
116 {
119 }
120
121 return EndWith(DsmEvent::PortDetached);
122}
123
127{
128 if (Event != DsmEvent::ControllerIoctlDone)
129 return SmUnhandled();
130
131 return EndWith(DsmEvent::PortDetached);
132}
133
136{
137 if (!U1TimeoutChanged())
138 return LpmEnableU1();
139
142}
143
147{
148 switch (Event)
149 {
150 case DsmEvent::PortTimeoutSet:
151 case DsmEvent::PortFault:
152 return LpmEnableU1();
153
154 case DsmEvent::PortDetached:
155 return LpmDetachCleanup();
156
157 default:
158 return SmUnhandled();
159 }
160}
161
164{
165 switch (U1Change())
166 {
170
171 case DsmFeatureEnable:
174
175 default:
176 return LpmU2();
177 }
178}
179
183{
184 if ((Event != DsmEvent::TransferDone) && (Event != DsmEvent::TransferFailed))
185 return SmUnhandled();
186
188 return LpmU2();
189}
190
194{
195 if ((Event != DsmEvent::TransferDone) && (Event != DsmEvent::TransferFailed))
196 return SmUnhandled();
197
199 return LpmU2();
200}
201
204{
205 if (!U2TimeoutChanged())
206 return LpmEnableU2();
207
210}
211
215{
216 switch (Event)
217 {
218 case DsmEvent::PortTimeoutSet:
219 case DsmEvent::PortFault:
220 return LpmEnableU2();
221
222 case DsmEvent::PortDetached:
223 return LpmDetachCleanup();
224
225 default:
226 return SmUnhandled();
227 }
228}
229
232{
233 switch (U2Change())
234 {
238
239 case DsmFeatureEnable:
242
243 default:
244 return LpmLower();
245 }
246}
247
251{
252 if ((Event != DsmEvent::TransferDone) && (Event != DsmEvent::TransferFailed))
253 return SmUnhandled();
254
256 return LpmLower();
257}
258
262{
263 if ((Event != DsmEvent::TransferDone) && (Event != DsmEvent::TransferFailed))
264 return SmUnhandled();
265
267 return LpmLower();
268}
269
272{
273 if (ExitLatencyMayDrop())
274 {
277 }
278
279 return LpmFinalProgram();
280}
281
285{
286 switch (Event)
287 {
288 case DsmEvent::ControllerIoctlDone:
289 case DsmEvent::ControllerIoctlFailed:
290 return LpmFinalProgram();
291
292 case DsmEvent::ControllerExitLatencyTooLarge:
293 return LpmLatencyTooLarge();
294
295 default:
296 return SmUnhandled();
297 }
298}
299
302{
304 {
307 }
308
309 return EndWith(DsmEvent::Succeeded);
310}
311
315{
316 switch (Event)
317 {
318 case DsmEvent::ControllerIoctlDone:
319 return EndWith(DsmEvent::Succeeded);
320
321 case DsmEvent::ControllerExitLatencyTooLarge:
322 return LpmLatencyTooLarge();
323
324 case DsmEvent::ControllerIoctlFailed:
325 return LpmFailCleanup();
326
327 default:
328 return SmUnhandled();
329 }
330}
SM_RESULT LpmProgrammedBeforeRaise(_In_ DsmEvent Event)
Definition: devsm_lpm.cpp:42
VOID MarkU1Disabled()
Definition: devlpm.cpp:516
BOOLEAN ExitLatencyMayDrop()
Definition: devlpm.cpp:540
DSM_FEATURE_CHANGE U2Change()
Definition: devlpm.cpp:503
SM_RESULT LpmCompute()
Definition: devsm_lpm.cpp:23
SM_RESULT LpmU1()
Definition: devsm_lpm.cpp:135
SM_RESULT LpmLower()
Definition: devsm_lpm.cpp:271
SM_RESULT LpmLatencyRaised(_In_ DsmEvent Event)
Definition: devsm_lpm.cpp:63
BOOLEAN U1TimeoutChanged()
Definition: devlpm.cpp:463
VOID RequestU2Timeout()
Definition: hubport.cpp:686
VOID MarkU2Disabled()
Definition: devlpm.cpp:528
BOOLEAN EndpointsNeedDisableOnFailure()
Definition: devhcd.cpp:1117
VOID MarkU2Enabled()
Definition: devlpm.cpp:522
BOOLEAN ExitLatencyMustRise()
Definition: devlpm.cpp:534
SM_RESULT LpmU1Enabled(_In_ DsmEvent Event)
Definition: devsm_lpm.cpp:192
VOID DisableU1()
Definition: devreq.cpp:945
VOID EnableU1()
Definition: devreq.cpp:939
VOID ComputeExitLatency()
Definition: devlpm.cpp:430
DSM_FEATURE_CHANGE U1Change()
Definition: devlpm.cpp:496
SM_RESULT LpmFinalProgram()
Definition: devsm_lpm.cpp:301
BOOLEAN DisableLinkStatesForLatency()
Definition: devlpm.cpp:547
VOID ProgramEndpoints()
Definition: devhcd.cpp:979
VOID DisableU2()
Definition: devreq.cpp:957
SM_RESULT EndWith(_In_ DsmEvent Result)
Definition: devsm.cpp:186
VOID UpdateExitLatency()
Definition: devhcd.cpp:812
BOOLEAN EndpointsNeedProgramming()
Definition: devhcd.cpp:1111
SM_RESULT LpmU2Disabled(_In_ DsmEvent Event)
Definition: devsm_lpm.cpp:249
SM_RESULT LpmFinalProgrammed(_In_ DsmEvent Event)
Definition: devsm_lpm.cpp:313
SM_RESULT LpmU1Disabled(_In_ DsmEvent Event)
Definition: devsm_lpm.cpp:181
SM_RESULT LpmLatencyLowered(_In_ DsmEvent Event)
Definition: devsm_lpm.cpp:283
SM_RESULT LpmCleanedUpAfterDetach(_In_ DsmEvent Event)
Definition: devsm_lpm.cpp:125
SM_RESULT LpmLatencyTooLarge()
Definition: devsm_lpm.cpp:82
VOID CalcU2Timeout()
Definition: devlpm.cpp:341
VOID MarkU1Enabled()
Definition: devlpm.cpp:510
VOID InitLinkStates()
Definition: devlpm.cpp:110
SM_RESULT LpmU2()
Definition: devsm_lpm.cpp:203
SM_RESULT LpmEnableU1()
Definition: devsm_lpm.cpp:163
VOID CalcU1Timeout()
Definition: devlpm.cpp:220
BOOLEAN U2TimeoutChanged()
Definition: devlpm.cpp:473
SM_RESULT LpmEnableU2()
Definition: devsm_lpm.cpp:231
static const State AwaitingPortYielding
Definition: devsm.h:240
SM_RESULT LpmDetachCleanup()
Definition: devsm_lpm.cpp:113
SM_RESULT LpmCleanedUpAfterFailure(_In_ DsmEvent Event)
Definition: devsm_lpm.cpp:103
static const State RequestingCritical
Definition: devsm.h:230
SM_RESULT LpmU2Enabled(_In_ DsmEvent Event)
Definition: devsm_lpm.cpp:260
SM_RESULT LpmFailCleanup()
Definition: devsm_lpm.cpp:91
SM_RESULT LpmU1TimeoutSet(_In_ DsmEvent Event)
Definition: devsm_lpm.cpp:145
VOID EnableU2()
Definition: devreq.cpp:951
SM_RESULT LpmU2TimeoutSet(_In_ DsmEvent Event)
Definition: devsm_lpm.cpp:213
VOID RequestU1Timeout()
Definition: hubport.cpp:680
SM_RESULT LinkPowerStart()
Definition: devsm_lpm.cpp:16
static SM_RESULT SmUnhandled()
Definition: smengine.h:188
DsmEvent
Definition: devsm.h:15
@ DsmFeatureDisable
Definition: devsm.h:110
@ DsmFeatureEnable
Definition: devsm.h:109
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
#define _In_
Definition: no_sal2.h:158
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
_In_ WDFDPC _In_ BOOLEAN Wait
Definition: wdfdpc.h:170