ReactOS 0.4.17-dev-1281-g065abb3
portsm_port.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: Port state machine: states of a running hub port
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8/* INCLUDES *******************************************************************/
9
10#include "usbhub3.h"
11
12/* GLOBALS ********************************************************************/
13
15{
20};
21
22static const PortEvent RemovedOnly[] =
23{
25};
26
27static const PortEvent RemovedAndGone[] =
28{
30};
31
32static const PortEvent RemovedAndLpm[] =
33{
35};
36
38{
40};
41
42/* Port has no device, or is bringing one up */
44 { NULL, "Empty", 0, &PortMachine::OnEmpty, NULL, NULL };
45
47 { &Empty, "Disconnected", SM_STATE_TAKES_REQUESTS | PSM_STATE_IDLE,
49
51 { &Empty, "StartingEmpty", 0,
53
55 { NULL, "Debouncing", 0, &PortMachine::OnDebouncing, NULL, NULL };
56
58 { &Debouncing, "DebouncingUsb2", 0, NULL, &PortMachine::EnterDebouncing, RemovedAndGone };
59
61 { &Debouncing, "DebouncingUsb3", 0, NULL, &PortMachine::EnterDebouncing, RemovedOnly };
62
64 { NULL, "OldDeviceWait", 0,
66
68 { NULL, "OverCurrentWait", 0,
70
72 { NULL, "NotifyingOverCurrent", SM_STATE_NEEDS_PASSIVE,
74
76 { NULL, "UserResetWait", 0,
78
79/* Timer could not be stopped, m_AfterTimer runs once it fires */
81 { NULL, "TimerFlush", 0,
83
85 { NULL, "FlushBeforeOffEmpty", 0, &PortMachine::OnFlushBeforeOff, NULL, RemovedAndGone };
86
88 { NULL, "FlushBeforeOffAttached", 0, &PortMachine::OnFlushBeforeOff, NULL, PortStatusAndRemoved };
89
91 { NULL, "FlushBeforeSuperSpeedOff", 0, &PortMachine::OnFlushBeforeOff, NULL, RemovedOnly };
92
93/* A device is on the port */
95 { NULL, "Attached", 0, &PortMachine::OnAttached, NULL, NULL };
96
98 { &Attached, "Enabled", SM_STATE_TAKES_REQUESTS,
100
102 { &Attached, "AttachedDisabled", SM_STATE_TAKES_REQUESTS | PSM_STATE_IDLE,
104
108
110 { &Attached, "DisabledInSuspend", SM_STATE_TAKES_REQUESTS | PSM_STATE_IDLE,
112
114 { &Attached, "SuspendedD3Cold", SM_STATE_TAKES_REQUESTS | PSM_STATE_IDLE,
116
118 { &Attached, "ResumeAckWait", SM_STATE_TAKES_REQUESTS,
120
122 { &Attached, "ResetRequestWait", SM_STATE_TAKES_REQUESTS,
124
126 { &Attached, "StartingAttached", 0,
128
130 { &Attached, "ResumingAttached", 0,
132
134 { &Attached, "ResumingDisabled", 0,
136
138 { &Attached, "SystemResuming", 0,
140
141/* Not under Attached: hub stop is not expected while it reads status */
143 { NULL, "ErrorRestarting", 0,
145
147 { NULL, "ResumeAckWaitStopped", SM_STATE_TAKES_REQUESTS,
149
150/* Attached, holding an interrupt reference with the port timer running */
152 { NULL, "Timed", 0, &PortMachine::OnTimed, NULL, NULL };
153
155 { &Timed, "ResetWait", 0, &PortMachine::OnResetWait, &PortMachine::EnterResetWait, NULL };
156
158 { &Timed, "ResetEnabledWait", 0,
160
162 { &Timed, "ResetFlush", 0,
164
166 { &Timed, "ResumeWait", 0, &PortMachine::OnResumeWait, &PortMachine::EnterResumeWait, NULL };
167
169 { &Timed, "ResumeRecovery", 0,
171
173 { &Timed, "ResumeFlush", 0,
175
176/* Waiting for the hub to stop or suspend after a hub reset was asked for */
178 { NULL, "HubResetIssued", SM_STATE_TAKES_REQUESTS,
180
182 { NULL, "HubResetWait", SM_STATE_TAKES_REQUESTS,
184
186 { NULL, "HubResetTimerWait", SM_STATE_TAKES_REQUESTS,
188
190 { NULL, "EmptyHubResetWait", SM_STATE_TAKES_REQUESTS,
192
194 { NULL, "EmptyHubResetTimerWait", SM_STATE_TAKES_REQUESTS,
196
198 { NULL, "AttachFailedWait", 0,
200
202 { NULL, "SuperSpeedOffWait", 0,
204
206 { NULL, "SsLinkDisabled", SM_STATE_TAKES_REQUESTS | PSM_STATE_IDLE,
208
209/* A port control transfer is in flight, only its completion may run */
211 { NULL, "Transfer", SM_STATE_CRITICAL_ONLY, NULL, NULL, NULL };
212
214 { &Transfer, "PoweringPort", 0,
216
218 { &Transfer, "QueryingOverCurrent", 0,
220
222 { &Transfer, "SendingReset", 0,
224
226 { &Transfer, "SendingWarmReset", 0,
228
230 { &Transfer, "SendingResume", 0,
232
234 { &Transfer, "SendingSuspend", 0,
236
238 { &Transfer, "DisablingOnRequest", 0,
240
242 { &Transfer, "DisablingForCycle", 0,
244
246 { &Transfer, "DisablingBeforeConnect", 0,
248
250 { &Transfer, "QuiescingForHubSuspend", 0,
252 RemovedOnly };
253
255 { &Transfer, "DisablingForCycleTimed", 0,
257
259 { &Transfer, "DisablingOnSuspendTimed", 0,
261
263 { &Transfer, "DisablingOnResetTimeout", 0,
265
267 { &Transfer, "ReadingForResume", 0,
269
271 { &Transfer, "ReadingAfterResumeTimeout", 0,
273
275 { &Transfer, "SettingLpmTimeout", 0,
277
279 { &Transfer, "DisablingSuperSpeed", 0,
281
283 { &Transfer, "DisablingSuperSpeedOnRequest", 0,
286
288 { &Transfer, "EnablingSuperSpeedOnStop", 0,
290
292 { &Transfer, "EnablingSuperSpeedOnTimer", 0,
294
296 { &Transfer, "ResetTimeoutStatus", 0,
298
300 { &Transfer, "ArmingWake", 0, &PortMachine::OnArmingWake, &PortMachine::EnterArmingWake, NULL };
301
302/* FUNCTIONS ******************************************************************/
303
306{
308}
309
310/* EMPTY PORT *****************************************************************/
311
315{
316 switch (Event)
317 {
318 case PortEvent::ChangeConnect:
319 return CheckConnection();
320
321 case PortEvent::ChangeOverCurrent:
322 return StartOverCurrentWait();
323
324 case PortEvent::ChangeOverCurrentCleared:
325 return SmTransition(&PoweringPort);
326
327 case PortEvent::ChangeResetDone:
328 case PortEvent::ChangeDisabled:
329 case PortEvent::ChangeResumed:
330 case PortEvent::ChangeError:
331 if (m_Usb3)
332 return SmUnhandled();
333 return SmTransition(&Disconnected);
334
335 case PortEvent::ChangeNeedsHubReset:
336 if (!m_Usb3)
337 return SmUnhandled();
339
340 case PortEvent::HubStopping:
341 return PowerDown(&OffEmpty);
342
343 case PortEvent::HubSuspending:
344 if (!m_Usb3)
345 return PowerDown(&OffEmpty);
347 return SmTransition(&ArmingWake);
348
349 default:
350 return SmUnhandled();
351 }
352}
353
356{
358 return EnterWithPortChange();
359}
360
363{
365}
366
370{
371 if (!m_Usb3)
372 {
373 if (Event == PortEvent::SubDone)
374 return SmTransition(&Disconnected);
375
376 return SmUnhandled();
377 }
378
379 if (Event == PortEvent::ChangeNone)
380 return SmTransition(&Disconnected);
381
382 if (Event == PortEvent::ChangeResetBusy)
384
385 return SmUnhandled();
386}
387
390{
392 return EnterWithPortChange();
393}
394
398{
399 PortEvent response;
400
401 switch (Event)
402 {
403 case PortEvent::ChangeOverCurrentCleared:
405
406 case PortEvent::ChangeOverCurrent:
408
409 case PortEvent::ChangeConnect:
411
412 case PortEvent::ChangeNeedsHubReset:
413 if (!m_Usb3)
414 return SmUnhandled();
417
418 case PortEvent::ChangeDisabled:
419 case PortEvent::ChangeResumed:
420 case PortEvent::ChangeResetDone:
421 case PortEvent::ChangeError:
422 if (m_Usb3)
423 return SmUnhandled();
424
425 response = ErrorResponse();
426 switch (response)
427 {
428 case PortEvent::ChangeNeedsHubReset:
431
432 case PortEvent::ErrorIgnore:
433 case PortEvent::ChangeConnect:
435
436 case PortEvent::ErrorCycle:
438
439 case PortEvent::ErrorDisableAndCycle:
441
442 case PortEvent::ChangeOverCurrentCleared:
444
445 case PortEvent::ChangeOverCurrent:
447
448 default:
449 SM_BREAK("Port error response not valid here");
450 return SmHandled();
451 }
452
453 case PortEvent::TimerExpired:
454 if (!m_Usb3)
457
458 case PortEvent::HubSuspending:
459 if (m_Usb3)
462
463 case PortEvent::HubStopping:
464 if (m_Usb3)
466 if (StopTimer())
467 return PowerDown(&OffEmpty);
469
470 default:
471 return SmUnhandled();
472 }
473}
474
478{
479 PortEvent response;
480
481 switch (Event)
482 {
483 case PortEvent::ChangeOverCurrentCleared:
484 return SmTransition(&PoweringPort);
485
486 case PortEvent::ChangeConnect:
487 return CheckConnection();
488
489 case PortEvent::ChangeOverCurrent:
490 return StartOverCurrentWait();
491
492 case PortEvent::ChangeNeedsHubReset:
493 if (!m_Usb3)
494 return SmUnhandled();
496
497 case PortEvent::ChangeDisabled:
498 case PortEvent::ChangeResumed:
499 case PortEvent::ChangeResetDone:
500 case PortEvent::ChangeError:
501 if (m_Usb3)
502 return SmUnhandled();
503
504 response = ErrorResponse();
505 switch (response)
506 {
507 case PortEvent::ChangeNeedsHubReset:
509
510 case PortEvent::ErrorIgnore:
512
513 case PortEvent::ErrorCycle:
515
516 case PortEvent::ChangeOverCurrent:
517 return StartOverCurrentWait();
518
519 case PortEvent::ErrorDisableAndCycle:
521
522 default:
523 SM_BREAK("Port error response not valid here");
524 return SmHandled();
525 }
526
527 case PortEvent::HubStopping:
529
530 case PortEvent::HubSuspending:
532 return PowerDown(&OffResetNeeded);
534
535 case PortEvent::DeviceGone:
537
538 default:
539 return SmUnhandled();
540 }
541}
542
546{
547 switch (Event)
548 {
549 case PortEvent::ChangeError:
550 case PortEvent::ChangeResetDone:
551 case PortEvent::ChangeDisabled:
552 case PortEvent::ChangeResumed:
553 if (m_Usb3)
554 return SmUnhandled();
556
557 case PortEvent::ChangeConnect:
559
560 case PortEvent::ChangeNeedsHubReset:
561 if (!m_Usb3)
562 return SmUnhandled();
565
566 case PortEvent::ChangeOverCurrentCleared:
568
569 case PortEvent::ChangeOverCurrent:
571
572 case PortEvent::TimerExpired:
575 return SmTransition(&PoweringPort);
576
577 case PortEvent::HubStopping:
578 case PortEvent::HubSuspending:
580
581 default:
582 return SmUnhandled();
583 }
584}
585
588{
591}
592
596{
597 switch (Event)
598 {
599 case PortEvent::ChangeError:
600 case PortEvent::ChangeResetDone:
601 case PortEvent::ChangeDisabled:
602 case PortEvent::ChangeResumed:
603 if (m_Usb3)
604 return SmUnhandled();
606
607 case PortEvent::ChangeConnect:
609
610 case PortEvent::ChangeNeedsHubReset:
611 if (!m_Usb3)
612 return SmUnhandled();
615 SmDiscardQueued(PortEvent::UserOverCurrentReset);
617
618 case PortEvent::ChangeOverCurrent:
619 return StartOverCurrentWait();
620
621 case PortEvent::ChangeOverCurrentCleared:
623 SmDiscardQueued(PortEvent::UserOverCurrentReset);
624 return SmTransition(&PoweringPort);
625
626 case PortEvent::UserOverCurrentReset:
627 return SmTransition(&PoweringPort);
628
629 case PortEvent::HubStopping:
630 case PortEvent::HubSuspending:
632 SmDiscardQueued(PortEvent::UserOverCurrentReset);
633 return PowerDown(&OffEmpty);
634
635 default:
636 return SmUnhandled();
637 }
638}
639
643{
644 switch (Event)
645 {
646 case PortEvent::TimerExpired:
648
649 case PortEvent::ChangeOverCurrent:
651 return SmTransition(&TimerFlush);
652
653 case PortEvent::ChangeOverCurrentCleared:
655 return SmTransition(&TimerFlush);
656
657 case PortEvent::ChangeConnect:
658 /* After an over current the connect change waits for the timer too */
661 return SmTransition(&TimerFlush);
662
663 case PortEvent::ChangeError:
664 case PortEvent::ChangeResetDone:
665 case PortEvent::ChangeDisabled:
666 case PortEvent::ChangeResumed:
667 if (m_Usb3)
668 return SmUnhandled();
669 return SmTransition(&TimerFlush);
670
671 case PortEvent::ChangeNeedsHubReset:
672 if (!m_Usb3)
673 return SmUnhandled();
675
676 case PortEvent::HubStopping:
678
679 case PortEvent::HubSuspending:
680 if (!m_Usb3 && (m_AfterTimer == FollowCycle))
683
684 default:
685 return SmUnhandled();
686 }
687}
688
692{
693 if (Event != PortEvent::TimerExpired)
694 return SmUnhandled();
695
697 return PowerDown(&OffAttached);
698
699 return PowerDown(&OffEmpty);
700}
701
702/* ATTACHED *******************************************************************/
703
707{
708 switch (Event)
709 {
710 case PortEvent::ChangeConnect:
711 case PortEvent::ChangeOverCurrent:
712 case PortEvent::ChangeOverCurrentCleared:
713 return DetachThen(Event);
714
715 case PortEvent::ChangeNeedsHubReset:
716 if (!m_Usb3)
717 return SmUnhandled();
719
720 case PortEvent::HubStopping:
721 return PowerDown(&OffAttached);
722
723 default:
724 return SmUnhandled();
725 }
726}
727
731{
732 switch (Event)
733 {
734 case PortEvent::ChangeError:
735 case PortEvent::ChangeDisabled:
736 case PortEvent::ChangeResetDone:
737 case PortEvent::ChangeResumed:
738 if (m_Usb3)
739 return SmUnhandled();
741
742 case PortEvent::DisableRequest:
744
745 case PortEvent::SuspendRequest:
747
748 case PortEvent::HibernateRequest:
750 if (!m_Usb3)
752 return SmTransition(&Suspended);
753
754 case PortEvent::ResetRequest:
756
757 case PortEvent::CycleRequest:
758 if (m_Usb3)
759 return CycleDetach();
762
763 case PortEvent::WarmResetRequest:
764 if (!m_Usb3)
765 return SmUnhandled();
767
768 case PortEvent::SetU1Timeout:
769 case PortEvent::SetU2Timeout:
770 if (!m_Usb3)
771 return SmUnhandled();
772 m_LpmU2 = (Event == PortEvent::SetU2Timeout);
774
775 case PortEvent::DisableSuperSpeedRequest:
776 if (!m_Usb3)
777 return SmUnhandled();
779
780 default:
781 return SmUnhandled();
782 }
783}
784
788{
789 switch (Event)
790 {
791 case PortEvent::ChangeError:
792 case PortEvent::ChangeDisabled:
793 case PortEvent::ChangeResetDone:
794 case PortEvent::ChangeResumed:
795 if (m_Usb3)
796 return SmUnhandled();
798
799 case PortEvent::DisableRequest:
800 if (m_Usb3)
805
806 case PortEvent::CycleRequest:
807 return CycleDetach();
808
809 case PortEvent::HubSuspending:
810 return PowerDown(&OffAttached);
811
812 case PortEvent::ResetRequest:
813 if (!m_Usb3)
816
817 case PortEvent::WarmResetRequest:
818 if (!m_Usb3)
819 return SmUnhandled();
821
822 case PortEvent::DisableSuperSpeedRequest:
823 if (!m_Usb3)
824 return SmUnhandled();
826
827 default:
828 return SmUnhandled();
829 }
830}
831
834{
836}
837
841{
842 if (m_Usb3)
843 {
844 switch (Event)
845 {
846 case PortEvent::ChangeConnect:
847 if (D3ColdEnabled())
849 return DetachThen(Event);
850
851 case PortEvent::DisableRequest:
855
856 case PortEvent::ResumeRequest:
861 return SmTransition(&Suspended);
862
863 default:
865 }
866 }
867
868 switch (Event)
869 {
870 case PortEvent::ChangeResumed:
872
873 case PortEvent::ChangeResetDone:
874 case PortEvent::ChangeError:
876
877 case PortEvent::ChangeDisabled:
879
880 case PortEvent::HubSuspending:
882
883 case PortEvent::ResumeRequest:
887 return SmTransition(&Suspended);
888
889 case PortEvent::ResetRequest:
891
892 case PortEvent::CycleRequest:
895
896 default:
897 return SmUnhandled();
898 }
899}
900
901/* 3.0 suspended states: suspended, suspended after a disable, and D3cold */
905{
906 switch (Event)
907 {
908 case PortEvent::ChangeResumed:
909 if (SmFrame(0) != &SuspendedD3Cold)
910 return SmUnhandled();
911 return SmTransition(&Enabled);
912
913 case PortEvent::DisableRequest:
917
918 case PortEvent::HubSuspending:
920 return SmTransition(&ArmingWake);
921
922 case PortEvent::ResetRequest:
923 case PortEvent::WarmResetRequest:
925
926 case PortEvent::CycleRequest:
927 return CycleDetach();
928
929 default:
930 return SmUnhandled();
931 }
932}
933
936{
937 return SmCall(&D3Idle);
938}
939
943{
944 switch (Event)
945 {
946 case PortEvent::ChangeError:
947 case PortEvent::ChangeDisabled:
948 case PortEvent::ChangeResetDone:
949 case PortEvent::ChangeResumed:
951
952 case PortEvent::ResumeRequest:
953 return SmTransition(&Enabled);
954
955 case PortEvent::HubStopping:
957
958 case PortEvent::CycleRequest:
961
962 default:
963 return SmUnhandled();
964 }
965}
966
970{
971 if (Event == PortEvent::ResumeRequest)
972 return PowerDown(&OffAttached);
973
974 if (Event == PortEvent::CycleRequest)
975 {
977 return PowerDown(&OffEmpty);
978 }
979
980 return SmUnhandled();
981}
982
986{
987 switch (Event)
988 {
989 case PortEvent::ChangeResetDone:
990 return SmTransition(&Enabled);
991
992 case PortEvent::CycleRequest:
993 return CycleDetach();
994
995 case PortEvent::ResetRequest:
996 case PortEvent::WarmResetRequest:
998
999 case PortEvent::DisableRequest:
1001
1002 default:
1003 return SmUnhandled();
1004 }
1005}
1006
1009{
1010 return SmCall(&PowerOnSending);
1011}
1012
1016{
1017 switch (Event)
1018 {
1019 case PortEvent::SubDone:
1021
1022 case PortEvent::ChangeResetDone:
1023 case PortEvent::ChangeResumed:
1024 case PortEvent::ChangeError:
1025 case PortEvent::ChangeDisabled:
1027
1028 case PortEvent::HubSuspending:
1029 return PowerDown(&OffAttached);
1030
1031 default:
1032 return SmUnhandled();
1033 }
1034}
1035
1038{
1040 return SmCall(&ResumeReading);
1041
1042 return SmCall(&ResumePowering);
1043}
1044
1048{
1049 switch (Event)
1050 {
1051 case PortEvent::ChangeError:
1052 case PortEvent::ChangeResetDone:
1053 case PortEvent::SubDone:
1055 return SmTransition(&Suspended);
1056
1057 case PortEvent::ChangeResumed:
1059 return SmTransition(&Enabled);
1060
1061 case PortEvent::ChangeDisabled:
1064
1065 default:
1066 return SmUnhandled();
1067 }
1068}
1069
1073{
1074 switch (Event)
1075 {
1076 case PortEvent::ChangeError:
1077 case PortEvent::ChangeDisabled:
1078 case PortEvent::ChangeResetDone:
1079 case PortEvent::ChangeResumed:
1080 case PortEvent::SubDone:
1083
1084 case PortEvent::HubSuspending:
1085 return PowerDown(&OffAttached);
1086
1087 default:
1088 return SmUnhandled();
1089 }
1090}
1091
1094{
1095 return SmCall(&SystemResumeReading);
1096}
1097
1101{
1102 switch (Event)
1103 {
1104 case PortEvent::ChangeResumed:
1105 return SmTransition(&Enabled);
1106
1107 case PortEvent::SubDone:
1108 return SmTransition(&Suspended);
1109
1110 case PortEvent::ChangeResetBusy:
1112
1113 case PortEvent::ChangeNeedsReset:
1115
1116 default:
1117 return SmUnhandled();
1118 }
1119}
1120
1123{
1125}
1126
1130{
1131 switch (Event)
1132 {
1133 case PortEvent::ChangeResetBusy:
1135
1136 case PortEvent::ChangeResumed:
1137 case PortEvent::ChangeLinkError:
1138 case PortEvent::ChangeError:
1139 case PortEvent::ChangeNone:
1140 case PortEvent::ChangeResetDone:
1142
1143 case PortEvent::HubStopping:
1144 return SmUnhandled();
1145
1146 default:
1147 return OnAttached(Event);
1148 }
1149}
1150
1151/* TIMED **********************************************************************/
1152
1156{
1157 switch (Event)
1158 {
1159 case PortEvent::ChangeConnect:
1160 case PortEvent::ChangeOverCurrent:
1161 case PortEvent::ChangeOverCurrentCleared:
1162 return DetachTimed(Event);
1163
1164 case PortEvent::ChangeNeedsHubReset:
1165 if (!m_Usb3)
1166 return SmUnhandled();
1167 return TimedHubReset();
1168
1169 default:
1170 return SmUnhandled();
1171 }
1172}
1173
1176{
1177 if (!m_Usb3)
1178 return SmCall(&ChangeIdle20);
1179
1180 if (SmCurrent() == &ResetWait)
1182
1183 return SmCall(&ResetChangeIdle);
1184}
1185
1189{
1190 switch (Event)
1191 {
1192 case PortEvent::ChangeResetDone:
1193 if (StopTimer())
1194 return ResetSucceeded();
1195 return SmTransition(&ResetFlush);
1196
1197 case PortEvent::HubRemoved:
1198 return ReleaseAndStopTimer();
1199
1200 case PortEvent::ChangeError:
1201 case PortEvent::ChangeDisabled:
1202 case PortEvent::ChangeResumed:
1203 case PortEvent::ChangeConnect:
1204 if (m_Usb3)
1205 return SmUnhandled();
1206 return TimedError(&ResetWait, TRUE);
1207
1208 case PortEvent::TimerExpired:
1209 if (m_Usb3)
1214
1215 default:
1216 return SmUnhandled();
1217 }
1218}
1219
1223{
1224 switch (Event)
1225 {
1226 case PortEvent::ChangeResetDone:
1227 if (StopTimer())
1228 return ResetSucceeded();
1229 return SmTransition(&ResetFlush);
1230
1231 case PortEvent::HubRemoved:
1232 return ReleaseAndStopTimer();
1233
1234 case PortEvent::ChangeResumed:
1235 case PortEvent::ChangeError:
1236 case PortEvent::ChangeDisabled:
1238
1239 case PortEvent::TimerExpired:
1241
1242 default:
1243 return SmUnhandled();
1244 }
1245}
1246
1250{
1251 switch (Event)
1252 {
1253 case PortEvent::ChangeError:
1254 case PortEvent::ChangeDisabled:
1255 case PortEvent::ChangeResumed:
1256 case PortEvent::ChangeResetDone:
1257 if (m_Usb3)
1258 return SmUnhandled();
1259 return TimedError(&ResetFlush, FALSE);
1260
1261 case PortEvent::TimerExpired:
1262 return ResetSucceeded();
1263
1264 default:
1265 return SmUnhandled();
1266 }
1267}
1268
1271{
1273}
1274
1278{
1279 switch (Event)
1280 {
1281 case PortEvent::ChangeResumed:
1282 if (!StopTimer())
1283 return SmTransition(&ResumeFlush);
1284 if (m_Usb3)
1285 return ResumeSucceeded();
1288
1289 case PortEvent::ChangeDisabled:
1290 case PortEvent::ChangeError:
1291 case PortEvent::ChangeResetDone:
1292 if (m_Usb3)
1293 return SmUnhandled();
1294 return TimedError(&ResumeWait, FALSE);
1295
1296 case PortEvent::HubRemoved:
1297 return ReleaseAndStopTimer();
1298
1299 case PortEvent::TimerExpired:
1300 if (m_Usb3)
1305
1306 default:
1307 return SmUnhandled();
1308 }
1309}
1310
1314{
1315 switch (Event)
1316 {
1317 case PortEvent::ChangeResumed:
1318 case PortEvent::ChangeResetDone:
1319 case PortEvent::ChangeError:
1320 case PortEvent::ChangeDisabled:
1322
1323 case PortEvent::TimerExpired:
1324 return ResumeSucceeded();
1325
1326 default:
1327 return SmUnhandled();
1328 }
1329}
1330
1334{
1335 switch (Event)
1336 {
1337 case PortEvent::ChangeDisabled:
1338 case PortEvent::ChangeError:
1339 case PortEvent::ChangeResetDone:
1340 case PortEvent::ChangeResumed:
1341 if (m_Usb3)
1342 return SmUnhandled();
1343 return TimedError(&ResumeFlush, FALSE);
1344
1345 case PortEvent::TimerExpired:
1346 if (m_Usb3)
1347 return ResumeSucceeded();
1350
1351 default:
1352 return SmUnhandled();
1353 }
1354}
1355
1356/* HUB RESET PENDING **********************************************************/
1357
1360{
1362 return EnterDraining();
1363}
1364
1367{
1369 return SmCall(&DrainIdle);
1370}
1371
1374{
1377}
1378
1382{
1383 if (Event == PortEvent::HubStopping)
1384 return PowerDown(&OffAttached);
1385
1386 if (Event == PortEvent::HubSuspending)
1388
1389 return SmUnhandled();
1390}
1391
1395{
1396 if ((Event == PortEvent::HubStopping) || (Event == PortEvent::HubSuspending))
1397 return PowerDown(&OffAttached);
1398
1399 return SmUnhandled();
1400}
1401
1405{
1406 if (Event == PortEvent::TimerExpired)
1407 return SmTransition(&HubResetWait);
1408
1409 if ((Event == PortEvent::HubStopping) || (Event == PortEvent::HubSuspending))
1411
1412 return SmUnhandled();
1413}
1414
1418{
1419 if ((Event == PortEvent::HubStopping) || (Event == PortEvent::HubSuspending))
1420 return PowerDown(&OffEmpty);
1421
1422 return SmUnhandled();
1423}
1424
1428{
1429 if (Event == PortEvent::TimerExpired)
1431
1432 if ((Event == PortEvent::HubStopping) || (Event == PortEvent::HubSuspending))
1434
1435 return SmUnhandled();
1436}
1437
1441{
1442 if ((Event != PortEvent::HubStopping) && (Event != PortEvent::HubSuspending))
1443 return SmUnhandled();
1444
1445 if (!m_Usb3)
1446 return PowerDown(&OffEmpty);
1447
1448 if ((Event == PortEvent::HubSuspending) && !m_AttachForcedReset)
1450
1451 return PowerDown(&OffResetNeeded);
1452}
1453
1457{
1458 if (Event == PortEvent::TimerExpired)
1460
1461 if ((Event == PortEvent::HubStopping) || (Event == PortEvent::HubSuspending))
1463
1464 return SmUnhandled();
1465}
1466
1470{
1471 if ((Event == PortEvent::HubStopping) || (Event == PortEvent::HubSuspending))
1473
1474 return SmUnhandled();
1475}
1476
1477/* PORT CONTROL TRANSFERS *****************************************************/
1478
1481{
1482 SendPortPower();
1483 return SmHandled();
1484}
1485
1488{
1489 SendGetStatus();
1490 return SmHandled();
1491}
1492
1495{
1496 SendReset();
1497 return SmHandled();
1498}
1499
1502{
1503 SendWarmReset();
1504 return SmHandled();
1505}
1506
1509{
1510 SendResume();
1511 return SmHandled();
1512}
1513
1516{
1517 SendSuspend();
1518 return SmHandled();
1519}
1520
1523{
1524 SendDisable();
1525 return SmHandled();
1526}
1527
1530{
1531 if (!m_Usb3)
1532 {
1533 SendDisable();
1534 return SmHandled();
1535 }
1536
1537 /* A 3.0 port has no disabled state, the link is suspended instead */
1538 SendSuspend();
1540 return SmHandled();
1541}
1542
1545{
1546 if (m_Usb3)
1547 SendSuspend();
1548 else
1549 SendDisable();
1550
1551 return SmHandled();
1552}
1553
1556{
1557 if (m_LpmU2)
1558 SendU2Timeout();
1559 else
1560 SendU1Timeout();
1561
1562 return SmHandled();
1563}
1564
1567{
1569 return SmHandled();
1570}
1571
1574{
1577 return SmHandled();
1578}
1579
1582{
1584 return SmHandled();
1585}
1586
1589{
1591}
1592
1595{
1596 return SmCall(&WakeArming);
1597}
1598
1602{
1603 if (Event == PortEvent::TransferDone)
1605
1606 if (Event == PortEvent::TransferFailed)
1608
1609 return SmUnhandled();
1610}
1611
1615{
1616 if (Event == PortEvent::TransferFailed)
1618
1619 if (Event != PortEvent::TransferDone)
1620 return SmUnhandled();
1621
1622 if (OverCurrentActive())
1623 return StartOverCurrentWait();
1624
1625 if (m_Usb3)
1626 return SmTransition(&Disconnected);
1627
1628 return CheckConnection();
1629}
1630
1634{
1635 if ((Event != PortEvent::TransferDone) && (Event != PortEvent::TransferFailed))
1636 return SmUnhandled();
1637
1638 if (!m_Usb3)
1639 {
1641 return SmTransition(&ResetWait);
1642 }
1643
1644 if (Event == PortEvent::TransferDone)
1645 return SmTransition(&ResetWait);
1646
1647 return ResetTransferFailed();
1648}
1649
1653{
1654 if ((Event != PortEvent::TransferDone) && (Event != PortEvent::TransferFailed))
1655 return SmUnhandled();
1656
1657 if (m_Usb3 && (Event == PortEvent::TransferFailed))
1658 {
1660 return FailToHubReset();
1661 }
1662
1664 return SmTransition(&ResumeWait);
1665}
1666
1670{
1671 if (Event == PortEvent::TransferFailed)
1672 return FailToHubReset();
1673
1674 if (Event != PortEvent::TransferDone)
1675 return SmUnhandled();
1676
1678 if (!m_Usb3)
1680
1681 return SmTransition(&Suspended);
1682}
1683
1687{
1688 if (Event == PortEvent::TransferFailed)
1689 {
1692 }
1693
1694 if (Event != PortEvent::TransferDone)
1695 return SmUnhandled();
1696
1698 if (m_Usb3)
1700
1703}
1704
1708{
1709 if (Event == PortEvent::TransferFailed)
1711
1712 if (Event == PortEvent::TransferDone)
1713 return SmTransition(&OldDeviceWait);
1714
1715 return SmUnhandled();
1716}
1717
1721{
1722 if (Event == PortEvent::TransferFailed)
1724
1725 if (Event == PortEvent::TransferDone)
1727
1728 return SmUnhandled();
1729}
1730
1734{
1735 const State* target = m_Usb3 ? &OffResetNeeded : &OffEmpty;
1736
1737 if (Event == PortEvent::TransferFailed)
1738 {
1740 return PowerDown(target);
1741 }
1742
1743 if (Event == PortEvent::TransferDone)
1744 return PowerDown(target);
1745
1746 return SmUnhandled();
1747}
1748
1752{
1753 if (Event == PortEvent::TransferFailed)
1754 {
1757 }
1758
1759 if (Event == PortEvent::TransferDone)
1760 return StopTimerThen(FollowCycle);
1761
1762 return SmUnhandled();
1763}
1764
1768{
1769 if (Event == PortEvent::TransferFailed)
1771
1772 if (Event == PortEvent::TransferDone)
1774
1775 return SmUnhandled();
1776}
1777
1781{
1782 if (Event == PortEvent::TransferFailed)
1783 return ResetTransferFailed();
1784
1785 if (Event != PortEvent::TransferDone)
1786 return SmUnhandled();
1787
1791}
1792
1796{
1797 if (Event == PortEvent::TransferFailed)
1798 {
1800 return FailToHubReset();
1801 }
1802
1803 if (Event != PortEvent::TransferDone)
1804 return SmUnhandled();
1805
1806 /* The link may already be back in U0, then no resume is sent */
1807 if (LinkInU0())
1808 return ResumeSucceeded();
1809
1810 return SmTransition(&SendingResume);
1811}
1812
1816{
1817 if (Event == PortEvent::TransferFailed)
1818 return FailToHubReset();
1819
1820 if (Event != PortEvent::TransferDone)
1821 return SmUnhandled();
1822
1823 if (LinkInU0())
1824 return ResumeSucceeded();
1825
1829}
1830
1834{
1835 if (Event == PortEvent::TransferFailed)
1836 {
1838 return SmTransition(&Enabled);
1839 }
1840
1841 if (Event == PortEvent::TransferDone)
1842 {
1844 return SmTransition(&Enabled);
1845 }
1846
1847 return SmUnhandled();
1848}
1849
1853{
1854 if ((Event == PortEvent::TransferDone) || (Event == PortEvent::TransferFailed))
1855 return PowerUp(&SsLinkDisabled);
1856
1857 return SmUnhandled();
1858}
1859
1863{
1864 if (Event == PortEvent::TransferFailed)
1866
1867 if (Event == PortEvent::TransferDone)
1868 {
1871 }
1872
1873 return SmUnhandled();
1874}
1875
1879{
1880 if ((Event != PortEvent::TransferDone) && (Event != PortEvent::TransferFailed))
1881 return SmUnhandled();
1882
1883 if (StopTimer())
1884 return PowerDown(&OffEmpty);
1885
1887}
1888
1892{
1893 if (Event == PortEvent::TransferFailed)
1895
1896 if (Event == PortEvent::TransferDone)
1897 return SmTransition(&Disconnected);
1898
1899 return SmUnhandled();
1900}
1901
1902/* Status read after the reset timer fired on a 3.0 port */
1906{
1907 switch (Event)
1908 {
1909 case PortEvent::ChangeNone:
1913
1914 case PortEvent::ChangeResetDone:
1915 return ResetSucceeded();
1916
1917 case PortEvent::ChangeResetBusy:
1918 case PortEvent::ChangeNeedsHubReset:
1919 case PortEvent::ChangeResumed:
1920 case PortEvent::ChangeError:
1924 return SmTransition(&HubResetWait);
1925
1926 case PortEvent::ChangeOverCurrent:
1929 return StartOverCurrentWait();
1930
1931 case PortEvent::ChangeOverCurrentCleared:
1934 return SmTransition(&PoweringPort);
1935
1936 case PortEvent::ChangeConnect:
1939 return CheckConnection();
1940
1941 case PortEvent::ChangeLinkError:
1946
1947 default:
1948 return SmUnhandled();
1949 }
1950}
1951
1955{
1956 if (Event != PortEvent::SubDone)
1957 return SmUnhandled();
1958
1959 if (m_ArmForEmpty)
1960 return PowerDown(&OffEmpty);
1961
1963}
SM_RESULT OnOverCurrentWait(_In_ PortEvent Event)
SM_RESULT EnterErrorRestarting()
static const State EmptyHubResetWait
Definition: portsm.h:247
SM_RESULT EnterStartingEmpty()
SM_RESULT EnterDisablingOnRequest()
SM_RESULT OnHubResetTimerWait(_In_ PortEvent Event)
static const State Attached
Definition: portsm.h:221
static const State ChangeIdle30
Definition: portsm.h:284
SM_RESULT EnterEnablingSuperSpeed()
SM_RESULT EnterQuiescingForHubSuspend()
SM_RESULT OnHubResetWait(_In_ PortEvent Event)
static const State StartReadingFirst
Definition: portsm.h:309
VOID DropInterruptReference()
Definition: fanout.cpp:1000
static const State ResetRequestWait
Definition: portsm.h:228
static const State EmptyHubResetTimerWait
Definition: portsm.h:248
static const State TimerFlush
Definition: portsm.h:216
SM_RESULT CallStatusRead(_In_ READ_KIND Kind)
static const State DrainIdle
Definition: portsm.h:298
SM_RESULT EnterDisablingSuperSpeed()
static const State OffEmpty
Definition: portsm.h:197
SM_RESULT OnResumeFlush(_In_ PortEvent Event)
SM_RESULT OnArmingWake(_In_ PortEvent Event)
SM_RESULT OnQuiescingForHubSuspend(_In_ PortEvent Event)
SM_RESULT OnPoweringPort(_In_ PortEvent Event)
static const State DisablingForCycleTimed
Definition: portsm.h:264
static const State DisablingForCycle
Definition: portsm.h:261
SM_RESULT OnSuperSpeedOffWait(_In_ PortEvent Event)
static const State ResumeAckWaitStopped
Definition: portsm.h:234
VOID SendReset()
Definition: portxfer.cpp:177
SM_RESULT OnAttachFailedWait(_In_ PortEvent Event)
SM_RESULT EnterDisablingPort()
SM_RESULT EnterSuspendedD3Cold()
@ FollowOverCurrent
Definition: portsm.h:163
@ FollowOverCurrentCleared
Definition: portsm.h:164
@ FollowConnect
Definition: portsm.h:161
@ FollowCycle
Definition: portsm.h:162
SM_RESULT OnHubResetIssued(_In_ PortEvent Event)
SM_RESULT DetachThen(_In_ PortEvent Change)
Definition: portsm.cpp:426
SM_RESULT OnResetEnabledWait(_In_ PortEvent Event)
SM_RESULT DetachTimed(_In_ PortEvent Change)
Definition: portsm.cpp:442
SM_RESULT OnOldDeviceWait(_In_ PortEvent Event)
SM_RESULT EnterPoweringPort()
SM_RESULT EnterResetWait()
SM_RESULT EnterSettingLpmTimeout()
SM_RESULT EnterResetTimeoutStatus()
static const State DrainEmptyIdleUsb2
Definition: portsm.h:299
SM_RESULT EnterReadingStatus()
SM_RESULT EnterSendingSuspend()
static const State DebouncingUsb2
Definition: portsm.h:210
static const State HubResetTimerWait
Definition: portsm.h:246
static const State AttachFailedWait
Definition: portsm.h:249
SM_RESULT OnAttached(_In_ PortEvent Event)
SM_RESULT OnResetTimeoutStatus(_In_ PortEvent Event)
SM_RESULT FailToHubReset()
Definition: portsm.cpp:648
static const State ResumingAttached
Definition: portsm.h:230
VOID RecordPortSuspended()
Definition: hubport.cpp:471
VOID SendSuspend()
Definition: portxfer.cpp:206
VOID DisconnectDevice()
Definition: hubport.cpp:369
BOOLEAN OverCurrentActive()
Definition: hubport.cpp:493
static const State D3Idle
Definition: portsm.h:333
static const State ResumeChangeIdle
Definition: portsm.h:290
VOID SendWarmReset()
Definition: portxfer.cpp:184
SM_RESULT OnDisablingSuperSpeedOnRequest(_In_ PortEvent Event)
static const State ErrorRestarting
Definition: portsm.h:233
VOID RecordPortDisabled()
Definition: hubport.cpp:465
SM_RESULT OnResetRequestWait(_In_ PortEvent Event)
static const State DrainEmptyIdleUsb3
Definition: portsm.h:300
SM_RESULT OnErrorRestarting(_In_ PortEvent Event)
SM_RESULT OnReadingForResume(_In_ PortEvent Event)
static const State QueryingOverCurrent
Definition: portsm.h:255
SM_RESULT OnResumingAttached(_In_ PortEvent Event)
SM_RESULT OnSuspended(_In_ PortEvent Event)
SM_RESULT EnterNotifyingOverCurrent()
BOOLEAN LinkInU0()
Definition: hubport.cpp:510
static const State EnablingSuperSpeedOnStop
Definition: portsm.h:272
VOID SendLinkDisable()
Definition: portxfer.cpp:215
SM_RESULT EnterWithPortChange()
SM_RESULT EnterArmingWake()
BOOLEAN OverCurrentPersists()
Definition: portxfer.cpp:704
SM_RESULT OnAttachedDisabled(_In_ PortEvent Event)
SM_RESULT EnterDraining()
VOID SendLinkRxDetect()
Definition: portxfer.cpp:221
SM_RESULT OnDisabledInSuspend(_In_ PortEvent Event)
VOID LogLinkStateError()
Definition: hubport.cpp:619
static const State ArmingWake
Definition: portsm.h:275
VOID SendDisable()
Definition: portxfer.cpp:191
static const State HubResetWait
Definition: portsm.h:245
static const State EnablingSuperSpeedOnTimer
Definition: portsm.h:273
static const State ResumeAckWait
Definition: portsm.h:227
VOID NotifyUserOfOverCurrent()
Definition: hubport.cpp:604
SM_RESULT ResumeSucceeded()
Definition: portsm.cpp:631
SM_RESULT OnSendingReset(_In_ PortEvent Event)
SM_RESULT TimedHubReset()
Definition: portsm.cpp:576
SM_RESULT TakeInterruptForReset(_In_ const State *Start, _In_ const State *Refused)
Definition: portsm.cpp:594
BOOLEAN StopTimer()
Definition: hubport.cpp:301
static const State OffResetNeeded
Definition: portsm.h:199
VOID ForceResetOnEnumeration()
Definition: hubport.cpp:451
static const State OffSuperSpeedDisabled
Definition: portsm.h:200
static const State QuiescingForHubSuspend
Definition: portsm.h:263
static const State SuspendIdle
Definition: portsm.h:328
SM_RESULT ReleaseAndStopTimer()
Definition: portsm.cpp:584
SM_RESULT ResetSucceeded()
Definition: portsm.cpp:606
static const State SendingSuspend
Definition: portsm.h:259
SM_RESULT OnSettingLpmTimeout(_In_ PortEvent Event)
static const State UserResetWait
Definition: portsm.h:215
SM_RESULT OnTimerFlush(_In_ PortEvent Event)
static const State OffAttached
Definition: portsm.h:198
static const State DisablingSuperSpeed
Definition: portsm.h:270
OLD_DEVICE_KIND m_OldDevice
Definition: portsm.h:954
BOOLEAN TakeInterruptReference()
Definition: fanout.cpp:994
static const State Enabled
Definition: portsm.h:222
static const State DisabledInSuspend
Definition: portsm.h:225
SM_RESULT OnEmptyHubResetTimerWait(_In_ PortEvent Event)
SM_RESULT EnterDrainingEmpty()
SM_RESULT OnResumeWait(_In_ PortEvent Event)
SM_RESULT EnterDisablingSuperSpeedOnRequest()
static const State SystemResuming
Definition: portsm.h:232
SM_RESULT CheckConnection()
Definition: portsm.cpp:304
SM_RESULT OnDisablingSuperSpeed(_In_ PortEvent Event)
SM_RESULT OnDisablingOnResetTimeout(_In_ PortEvent Event)
static const State Transfer
Definition: portsm.h:253
static const State DisablingOnResetTimeout
Definition: portsm.h:266
static const State OverCurrentWait
Definition: portsm.h:213
static const State ResetEnabledWait
Definition: portsm.h:238
static const State SuperSpeedOffWait
Definition: portsm.h:250
static const State SendingResume
Definition: portsm.h:258
static const State ReadingAfterResumeTimeout
Definition: portsm.h:268
SM_RESULT StartOverCurrentWait()
Definition: portsm.cpp:418
SM_RESULT OnSendingResume(_In_ PortEvent Event)
SM_RESULT EnterSuspended()
SM_RESULT EnterSendingReset()
BOOLEAN m_AttachForcedReset
Definition: portsm.h:962
VOID TellDevice(_In_ PSM_DEVICE_NOTICE Notice)
Definition: hubport.cpp:309
BOOLEAN m_LpmU2
Definition: portsm.h:963
SM_RESULT OnEnabled(_In_ PortEvent Event)
static const State Suspended
Definition: portsm.h:224
SM_RESULT OnDisablingForCycleTimed(_In_ PortEvent Event)
@ ReadNoChange
Definition: portsm.h:179
@ ReadStartResume
Definition: portsm.h:180
static const State ResumePowering
Definition: portsm.h:314
SM_RESULT OnDisablingOnRequest(_In_ PortEvent Event)
SM_RESULT OnDisablingOnSuspendTimed(_In_ PortEvent Event)
BOOLEAN m_ArmForEmpty
Definition: portsm.h:964
static const State ResumeWait
Definition: portsm.h:240
VOID CancelUserOverCurrentReset()
Definition: hubport.cpp:612
SM_RESULT ResetHubThen(_In_ const State *Target)
Definition: portsm.cpp:281
SM_RESULT EnterResumingAttached()
VOID SendGetStatus()
Definition: portxfer.cpp:152
static const State FlushBeforeSuperSpeedOff
Definition: portsm.h:219
static const State PowerOnSending
Definition: portsm.h:306
SM_RESULT OnResumeAckWaitStopped(_In_ PortEvent Event)
SM_RESULT OnDisablingBeforeConnect(_In_ PortEvent Event)
SM_RESULT EnterHubResetIssued()
@ OldDeviceResetInProgress
Definition: portsm.h:172
@ OldDeviceResetNeeded
Definition: portsm.h:171
@ OldDevicePlain
Definition: portsm.h:170
SM_RESULT OnStartingAttached(_In_ PortEvent Event)
static const State AttachedDisabled
Definition: portsm.h:223
static const State FlushBeforeOffEmpty
Definition: portsm.h:217
SM_RESULT HandleConnectedFault(_In_ const State *Stay)
Handles a 2.0 port status that makes no sense for an attached port.
Definition: portsm.cpp:502
static const State WakeArming
Definition: portsm.h:343
static const State ResetFlush
Definition: portsm.h:239
SM_RESULT OnEmptyHubResetWait(_In_ PortEvent Event)
static const State Timed
Definition: portsm.h:236
static const State NotifyingOverCurrent
Definition: portsm.h:214
SM_RESULT OnEmpty(_In_ PortEvent Event)
SM_RESULT CheckOldDevice(_In_ OLD_DEVICE_KIND Kind)
Definition: portsm.cpp:316
static const State Empty
Definition: portsm.h:206
static const State OffSuspendedUsb3
Definition: portsm.h:201
SM_RESULT OnStartingEmpty(_In_ PortEvent Event)
VOID NotifyBootDeviceRemoval()
Definition: hubport.cpp:416
SM_RESULT OnResetFlush(_In_ PortEvent Event)
static const State PoweringPort
Definition: portsm.h:254
SM_RESULT OnDebouncing(_In_ PortEvent Event)
static const State SystemResumeReading
Definition: portsm.h:324
static const State SuspendedD3Cold
Definition: portsm.h:226
SM_RESULT ReattachOrCreate(_In_ OLD_DEVICE_KIND Kind)
Definition: portsm.cpp:381
static const State ResumeFlush
Definition: portsm.h:242
VOID SendU2Timeout()
Definition: portxfer.cpp:250
static const State SendingReset
Definition: portsm.h:256
static const State Debouncing
Definition: portsm.h:209
SM_RESULT OnFlushBeforeOff(_In_ PortEvent Event)
static const State StartingAttached
Definition: portsm.h:229
static const State ResetWait
Definition: portsm.h:237
VOID SendPortPower()
Definition: portxfer.cpp:228
static const State DisablingOnSuspendTimed
Definition: portsm.h:265
VOID StartTimer(_In_ PSM_TIMER Timer)
Definition: hubport.cpp:230
static const State OldDeviceWait
Definition: portsm.h:212
SM_RESULT OnDisablingForCycle(_In_ PortEvent Event)
static const State ResumeReading
Definition: portsm.h:316
SM_RESULT DeviceArrived(_In_ OLD_DEVICE_KIND Kind)
Drops requests the previous device left behind, then reattaches or creates a device.
Definition: portsm.cpp:333
SM_RESULT OnEnablingSuperSpeedOnStop(_In_ PortEvent Event)
SM_RESULT OnReadingAfterResumeTimeout(_In_ PortEvent Event)
SM_RESULT OnResumeAckWait(_In_ PortEvent Event)
SM_RESULT EnterResumeWait()
TIMER_FOLLOW_UP m_AfterTimer
Definition: portsm.h:953
static const State SsLinkDisabled
Definition: portsm.h:251
static const State DisablingBeforeConnect
Definition: portsm.h:262
SM_RESULT EnterDebouncing()
SM_RESULT EnterDisconnected()
BOOLEAN D3ColdEnabled()
Definition: hubport.cpp:572
SM_RESULT OnSsLinkDisabled(_In_ PortEvent Event)
SM_RESULT OnTimed(_In_ PortEvent Event)
PortEvent ErrorResponse()
Definition: portxfer.cpp:673
SM_RESULT CycleDetach()
Definition: portsm.cpp:466
static const State DebouncingUsb3
Definition: portsm.h:211
SM_RESULT OnEnablingSuperSpeedOnTimer(_In_ PortEvent Event)
BOOLEAN m_WarmResume
Definition: portsm.h:961
SM_RESULT EnterStartingAttached()
VOID SendU1Timeout()
Definition: portxfer.cpp:238
SM_RESULT OnResumeRecovery(_In_ PortEvent Event)
SM_RESULT TimedError(_In_ const State *Stay, _In_ BOOLEAN DuringReset)
Definition: portsm.cpp:537
SM_RESULT ResetTransferFailed()
Definition: portsm.cpp:614
static const State DisablingSuperSpeedOnRequest
Definition: portsm.h:271
SM_RESULT OnSendingSuspend(_In_ PortEvent Event)
SM_RESULT StopTimerThen(_In_ TIMER_FOLLOW_UP FollowUp)
Definition: portsm.cpp:474
SM_RESULT OnUserResetWait(_In_ PortEvent Event)
SM_RESULT OnResetWait(_In_ PortEvent Event)
SM_RESULT FollowTimer(_In_ TIMER_FOLLOW_UP FollowUp)
Definition: portsm.cpp:485
static const State ResetTimeoutStatus
Definition: portsm.h:274
SM_RESULT EnterSendingResume()
static const State HubResetIssued
Definition: portsm.h:244
static const State SendingWarmReset
Definition: portsm.h:257
SM_RESULT EnterSendingWarmReset()
static const State ResumeRecovery
Definition: portsm.h:241
SM_RESULT OnQueryingOverCurrent(_In_ PortEvent Event)
static const State ReadingForResume
Definition: portsm.h:267
static const State ChangeIdle20
Definition: portsm.h:278
BOOLEAN m_Usb3
Definition: portsm.h:951
SM_RESULT OnResumingDisabled(_In_ PortEvent Event)
VOID RequestHubReset()
Definition: fanout.cpp:1006
SM_RESULT EnterSystemResuming()
static const State ResetChangeIdle
Definition: portsm.h:286
static const State Disconnected
Definition: portsm.h:207
static const State OffSuspendedUsb2
Definition: portsm.h:202
SM_RESULT OnSystemResuming(_In_ PortEvent Event)
static const State SettingLpmTimeout
Definition: portsm.h:269
BOOLEAN m_DrainReturnsEmpty
Definition: portsm.h:969
static const State FlushBeforeOffAttached
Definition: portsm.h:218
static const State StartingEmpty
Definition: portsm.h:208
VOID SendResume()
Definition: portxfer.cpp:197
static const State ResumingDisabled
Definition: portsm.h:231
static const State DisablingOnRequest
Definition: portsm.h:260
VOID SmDiscardQueued(_In_ PortEvent Ev)
Definition: smengine.h:522
const State * SmCurrent() const
Definition: smengine.h:130
static SM_RESULT SmTransition(_In_ const State *Target)
Definition: smengine.h:194
static SM_RESULT SmCall(_In_ const State *Start)
Definition: smengine.h:209
static SM_RESULT SmHandled()
Definition: smengine.h:182
static SM_RESULT SmUnhandled()
Definition: smengine.h:188
const State * SmFrame(_In_ ULONG Index) const
Definition: smengine.h:142
_In_ BOOLEAN Attached
Definition: devdesc.cpp:443
_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
@ Empty
Definition: npfs.h:126
#define _In_
Definition: no_sal2.h:158
PortEvent
Definition: portsm.h:15
@ DisableSuperSpeedRequest
@ WarmResetRequest
@ HibernateRequest
@ PsmNoticeDisabled
Definition: portsm.h:75
@ PsmNoticeResumeTimedOut
Definition: portsm.h:80
@ PsmNoticeSuspended
Definition: portsm.h:78
@ PsmNoticeStateEnabled
Definition: portsm.h:82
@ PsmNoticeResumeRefused
Definition: portsm.h:79
@ PsmNoticeResetTimedOut
Definition: portsm.h:84
@ PsmNoticeStateSuspended
Definition: portsm.h:83
@ PsmNoticeFailed
Definition: portsm.h:74
@ PsmNoticeStateDisabled
Definition: portsm.h:81
@ PsmNoticeTimeoutUpdated
Definition: portsm.h:86
@ PsmTimerResumeCompletion
Definition: portsm.h:96
@ PsmTimerResumeRecovery
Definition: portsm.h:97
@ PsmTimerSuperSpeedDisable
Definition: portsm.h:101
@ PsmTimerDebounce
Definition: portsm.h:93
@ PsmTimerResetCompletion
Definition: portsm.h:95
#define PSM_STATE_IDLE
Definition: portsm.h:125
static const PortEvent RemovedOnly[]
Definition: portsm_port.cpp:22
static const PortEvent RemovedAndGone[]
Definition: portsm_port.cpp:27
static const PortEvent PortStatusAndRemoved[]
Definition: portsm_port.cpp:37
static const PortEvent RemovedAndLpm[]
Definition: portsm_port.cpp:32
static const PortEvent DisconnectedDrops[]
Definition: portsm_port.cpp:14
#define SM_STATE_TAKES_REQUESTS
Definition: smengine.h:39
#define SM_BREAK(Message)
Definition: smengine.h:18
#define SM_STATE_NEEDS_PASSIVE
Definition: smengine.h:40
#define SM_STATE_CRITICAL_ONLY
Definition: smengine.h:41
One state. Handler gets every event the state sees.
Definition: smengine.h:93
Definition: tools.h:99