ReactOS 0.4.17-dev-1281-g065abb3
devsm_reenum.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, enumerating a known device again after
5 * a reset, resume or restart
6 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
7 */
8
9/* INCLUDES *******************************************************************/
10
11#include "usbhub3.h"
12
13/* GLOBALS ********************************************************************/
14
16
18{
20};
21
22/* The flavors differ only in which requests wait and which are dropped */
25
27 { NULL, "ReenumeratingForHubStart", SM_STATE_TAKES_REQUESTS,
29
31 { NULL, "ReenumeratingForPower", SM_STATE_TAKES_REQUESTS,
33
34/* Address zero work in the re-enumeration sub machine */
36 { NULL, "AtAddressZeroAgain", 0,
38
41
44
46 { NULL, "ParkedForHubAgain", SM_STATE_YIELDS_TO_CALLER,
48
49/* Claims address zero for the re-enumeration */
51 { NULL, "ClaimingAddressZeroAgain", 0,
53
55 { NULL, "CancelingClaimAgain", SM_STATE_CRITICAL_ONLY,
57
58/* The boot device failed to enumerate again; the system cannot go on */
60 { NULL, "BugChecking", 0, NULL, &DeviceMachine::EnterBugChecking };
61
62/* FUNCTIONS ******************************************************************/
63
64/* Start a re-enumeration from Target with the given start and result handling */
67 _In_ const State* Target,
68 _In_ DSM_REENUM Kind,
69 _In_ BOOLEAN ForceReset,
70 _In_ DSM_NEXT After)
71{
72 m_ReenumKind = Kind;
73 m_ReenumForceReset = ForceReset;
74 m_AfterReenum = After;
75 return SmTransition(Target);
76}
77
80{
83
86
87 switch (m_ReenumKind)
88 {
92
96
97 default:
100 }
101}
102
106{
107 switch (Event)
108 {
109 case DsmEvent::Succeeded:
110 case DsmEvent::Failed:
111 case DsmEvent::FailedDeviceEnabled:
112 case DsmEvent::DetachedDeviceEnabled:
113 case DsmEvent::PortDetached:
114 case DsmEvent::PdoCleanup:
115 return (this->*m_AfterReenum)(Event);
116
117 default:
118 return SmUnhandled();
119 }
120}
121
122/* RE-ENUMERATION SUB MACHINE *************************************************/
123
127{
128 if (Event != DsmEvent::ControllerIoctlDone)
129 return SmUnhandled();
130
133
135}
136
140{
141 if (Event != DsmEvent::ControllerIoctlDone)
142 return SmUnhandled();
143
145}
146
150{
151 if (Event != DsmEvent::ControllerIoctlDone)
152 return SmUnhandled();
153
156
158}
159
163{
164 switch (Event)
165 {
166 case DsmEvent::ControllerIoctlFailed:
167 if (!EnumRetriesUsedUp())
169
172
173 case DsmEvent::ControllerIoctlDone:
175
176 default:
177 return SmUnhandled();
178 }
179}
180
181VOID
183{
184 SetFailIo();
186}
187
188/* Out of retries with the device disabled in the controller */
192{
193 switch (Event)
194 {
195 case DsmEvent::PortDetached:
196 return EndWith(DsmEvent::PortDetached);
197
198 case DsmEvent::PortFault:
199 case DsmEvent::PortDisableDone:
200 return EndWith(DsmEvent::Failed);
201
202 case DsmEvent::HubSuspending:
203 case DsmEvent::HubStopping:
205
206 default:
207 return SmUnhandled();
208 }
209}
210
214{
215 if ((Event != DsmEvent::PortDisableDone) && (Event != DsmEvent::PortFault))
216 return SmUnhandled();
217
218 return ReenumParkForHub();
219}
220
223{
226}
227
231{
232 switch (Event)
233 {
234 case DsmEvent::SuspendedAfterHubResume:
235 case DsmEvent::ResumedWithHub:
236 case DsmEvent::NeedsReenumeration:
239
240 case DsmEvent::HubStoppedHoldingReference:
241 return ReenumParkForHub();
242
243 case DsmEvent::PortDetached:
244 return EndWith(DsmEvent::PortDetached);
245
246 case DsmEvent::HubStarted:
249
250 default:
251 return SmUnhandled();
252 }
253}
254
258{
259 switch (Event)
260 {
261 case DsmEvent::PortDetached:
264
265 case DsmEvent::HubStopping:
266 case DsmEvent::HubSuspending:
268
269 case DsmEvent::ControllerIoctlDone:
271
272 case DsmEvent::ControllerIoctlFailed:
273 return ReenumRetryOrFail();
274
275 default:
276 return SmUnhandled();
277 }
278}
279
283{
284 switch (Event)
285 {
286 case DsmEvent::ControllerIoctlFailed:
287 return EndWith(DsmEvent::DetachedDeviceEnabled);
288
289 case DsmEvent::ControllerIoctlDone:
291 return EndWith(DsmEvent::DetachedDeviceEnabled);
292
293 default:
294 return SmUnhandled();
295 }
296}
297
301{
302 switch (Event)
303 {
304 case DsmEvent::ControllerIoctlFailed:
305 return ReenumDisableForHub();
306
307 case DsmEvent::ControllerIoctlDone:
309 return ReenumDisableForHub();
310
311 default:
312 return SmUnhandled();
313 }
314}
315
316/* Hub stop or suspend: disable the device and the port, then park */
319{
321}
322
326{
327 if (Event != DsmEvent::ControllerIoctlDone)
328 return SmUnhandled();
329
331}
332
336{
337 switch (Event)
338 {
339 case DsmEvent::PortDetached:
340 return EndWith(DsmEvent::PortDetached);
341
342 case DsmEvent::PortFault:
343 case DsmEvent::PortDisableDone:
344 return ReenumParkForHub();
345
346 default:
347 return SmUnhandled();
348 }
349}
350
353{
354 if (EnumRetriesUsedUp())
355 {
358 }
359
361}
362
363VOID
365{
366 SetFailIo();
368}
369
373{
374 if (Event != DsmEvent::ControllerIoctlDone)
375 return SmUnhandled();
376
378}
379
380/* Out of retries with the device still enabled in the controller */
384{
385 switch (Event)
386 {
387 case DsmEvent::PortDetached:
388 return EndWith(DsmEvent::DetachedDeviceEnabled);
389
390 case DsmEvent::PortFault:
391 case DsmEvent::PortDisableDone:
392 return EndWith(DsmEvent::FailedDeviceEnabled);
393
394 case DsmEvent::HubSuspending:
395 case DsmEvent::HubStopping:
397
398 default:
399 return SmUnhandled();
400 }
401}
402
406{
407 switch (Event)
408 {
409 case DsmEvent::PortDetached:
410 return EndWith(DsmEvent::DetachedDeviceEnabled);
411
412 case DsmEvent::PortFault:
413 case DsmEvent::PortDisableDone:
415
416 default:
417 return SmUnhandled();
418 }
419}
420
424{
425 if (Event != DsmEvent::ControllerIoctlDone)
426 return SmUnhandled();
427
428 return ReenumParkForHub();
429}
430
434{
435 switch (Event)
436 {
437 case DsmEvent::TimerFired:
439
440 case DsmEvent::PortDetached:
442
443 case DsmEvent::HubSuspending:
444 case DsmEvent::HubStopping:
445 return ReenumStopRetryForHub();
446
447 default:
448 return SmUnhandled();
449 }
450}
451
454{
455 if (StopTimer())
456 return EndWith(DsmEvent::DetachedDeviceEnabled);
457
459}
460
464{
465 if (Event != DsmEvent::TimerFired)
466 return SmUnhandled();
467
468 return EndWith(DsmEvent::DetachedDeviceEnabled);
469}
470
473{
474 if (StopTimer())
475 return ReenumDisableForHub();
476
478}
479
483{
484 switch (Event)
485 {
486 case DsmEvent::TimerFired:
487 return ReenumDisableForHub();
488
489 case DsmEvent::PortDetached:
491
492 default:
493 return SmUnhandled();
494 }
495}
496
499{
501 return StartSuperSpeedReset();
502
505
506 return SmUnhandled();
507}
508
512{
513 switch (Event)
514 {
515 case DsmEvent::Succeeded:
517
518 case DsmEvent::Failed:
520
521 case DsmEvent::PortDetached:
523 return EndWith(DsmEvent::DetachedDeviceEnabled);
524
525 case DsmEvent::HubSuspending:
526 case DsmEvent::HubStopping:
528 return ReenumDisableForHub();
529
530 default:
531 return SmUnhandled();
532 }
533}
534
537{
538 if (EnumRetriesUsedUp())
539 {
542 }
543
545}
546
550{
551 if (Event != DsmEvent::ControllerIoctlDone)
552 return SmUnhandled();
553
555}
556
560{
561 switch (Event)
562 {
563 case DsmEvent::PortDetached:
565 return EndWith(DsmEvent::DetachedDeviceEnabled);
566
567 case DsmEvent::HubSuspending:
568 case DsmEvent::HubStopping:
571
572 case DsmEvent::PortDisableDone:
573 case DsmEvent::PortFault:
575 return EndWith(DsmEvent::FailedDeviceEnabled);
576
577 default:
578 return SmUnhandled();
579 }
580}
581
585{
586 switch (Event)
587 {
588 case DsmEvent::HubSuspending:
589 case DsmEvent::HubStopping:
591 return ReenumStopRetryForHub();
592
593 case DsmEvent::PortDetached:
596
597 case DsmEvent::TimerFired:
599
600 default:
601 return SmUnhandled();
602 }
603}
604
605/* 2.0 PORT AT ADDRESS ZERO, RE-ENUMERATION ***********************************/
606
610{
611 switch (Event)
612 {
613 case DsmEvent::PortResetDone:
615
616 case DsmEvent::HubStopping:
617 case DsmEvent::HubSuspending:
620
621 case DsmEvent::PortResetAbortedForSuspend:
623
624 case DsmEvent::PortResetTimeout:
626 return EndWith(DsmEvent::Failed);
627
628 case DsmEvent::PortFault:
629 return EndWith(DsmEvent::Failed);
630
631 case DsmEvent::PortDetached:
632 return EndWith(DsmEvent::PortDetached);
633
634 default:
635 return SmUnhandled();
636 }
637}
638
642{
643 if (Event != DsmEvent::ControllerIoctlDone)
644 return SmUnhandled();
645
646 if (DeviceSpeedChanged())
647 return EndWith(DsmEvent::Failed);
648
650}
651
655{
656 switch (Event)
657 {
658 case DsmEvent::TimerFired:
660
661 case DsmEvent::HubStopping:
662 case DsmEvent::HubSuspending:
663 case DsmEvent::PortDetached:
664 return EndAfterTimer(Event);
665
666 default:
667 return SmUnhandled();
668 }
669}
670
674{
675 if ((Event != DsmEvent::TransferDone) && (Event != DsmEvent::TransferFailed))
676 return SmUnhandled();
677
680
681 return EndWith(DsmEvent::Failed);
682}
683
687{
688 switch (Event)
689 {
690 case DsmEvent::PortResetDone:
692
693 case DsmEvent::PortResetTimeout:
695 return EndWith(DsmEvent::Failed);
696
697 case DsmEvent::PortFault:
698 return EndWith(DsmEvent::Failed);
699
700 case DsmEvent::PortResetAbortedForSuspend:
702
703 case DsmEvent::PortDetached:
704 return EndWith(DsmEvent::PortDetached);
705
706 case DsmEvent::HubStopping:
707 case DsmEvent::HubSuspending:
710
711 default:
712 return SmUnhandled();
713 }
714}
715
719{
720 switch (Event)
721 {
722 case DsmEvent::ControllerIoctlDone:
725
726 case DsmEvent::ControllerIoctlFailed:
727 return EndWith(DsmEvent::Failed);
728
729 default:
730 return SmUnhandled();
731 }
732}
733
737{
738 switch (Event)
739 {
740 case DsmEvent::TimerFired:
741 return EndWith(DsmEvent::Succeeded);
742
743 case DsmEvent::HubStopping:
744 case DsmEvent::HubSuspending:
745 case DsmEvent::PortDetached:
746 return EndAfterTimer(Event);
747
748 default:
749 return SmUnhandled();
750 }
751}
752
753/* ADDRESS, IDENTITY CHECK AND LINK POWER *************************************/
754
758{
759 switch (Event)
760 {
761 case DsmEvent::Failed:
763
764 case DsmEvent::Succeeded:
768
769 case DsmEvent::PortDetached:
771 return EndWith(DsmEvent::DetachedDeviceEnabled);
772
773 case DsmEvent::HubStopping:
774 case DsmEvent::HubSuspending:
776 return ReenumDisableForHub();
777
778 default:
779 return SmUnhandled();
780 }
781}
782
783/* Make sure the same device came back before reusing what is known about it */
787{
788 switch (Event)
789 {
790 case DsmEvent::TransferDone:
791 if (!SameDeviceConnected())
792 return ReenumWrongDevice();
793
795 {
798 }
799
800 return ReenumSerialNumber();
801
802 case DsmEvent::TransferFailed:
803 return ReenumRetryOrFail();
804
805 default:
806 return SmUnhandled();
807 }
808}
809
810/* A different device on the boot device's port stops here until it leaves */
813{
814 if (!IsBootDevice())
815 return ReenumRetryOrFail();
816
819}
820
824{
825 if (Event != DsmEvent::PortDetached)
826 return SmUnhandled();
827
828 return EndWith(DsmEvent::DetachedDeviceEnabled);
829}
830
834{
835 switch (Event)
836 {
837 case DsmEvent::TransferFailed:
838 return ReenumRetryOrFail();
839
840 case DsmEvent::TransferDone:
841 return ReenumSerialNumber();
842
843 default:
844 return SmUnhandled();
845 }
846}
847
850{
852 return ReenumConfigDescriptor();
853
856}
857
861{
862 switch (Event)
863 {
864 case DsmEvent::TransferFailed:
865 return ReenumRetryOrFail();
866
867 case DsmEvent::TransferDone:
868 if (SameSerialNumber())
869 return ReenumConfigDescriptor();
870
871 return ReenumWrongDevice();
872
873 default:
874 return SmUnhandled();
875 }
876}
877
880{
881 if (!ConfigReadOnReset())
883
886}
887
891{
892 switch (Event)
893 {
894 case DsmEvent::TransferDone:
896
897 case DsmEvent::TransferFailed:
898 return ReenumRetryOrFail();
899
900 default:
901 return SmUnhandled();
902 }
903}
904
907{
910
913
914 return ReenumPdCharging();
915}
916
920{
921 switch (Event)
922 {
923 case DsmEvent::Failed:
924 return ReenumRetryOrFail();
925
926 case DsmEvent::Succeeded:
927 return ReenumPdCharging();
928
929 default:
930 return SmUnhandled();
931 }
932}
933
934/* USB 2.1 LPM: the controller request completes on its own when it was sent */
937{
938 if (!UpdateLpm20())
939 return EndWith(DsmEvent::Succeeded);
940
942}
943
947{
948 if ((Event != DsmEvent::ControllerIoctlDone) && (Event != DsmEvent::ControllerIoctlFailed))
949 return SmUnhandled();
950
951 return EndWith(DsmEvent::Succeeded);
952}
953
956{
957 if (SupportsPdCharging())
959
960 return EndWith(DsmEvent::Succeeded);
961}
962
966{
967 switch (Event)
968 {
969 case DsmEvent::TransferDone:
970 return EndWith(DsmEvent::Succeeded);
971
972 case DsmEvent::TransferFailed:
973 return ReenumRetryOrFail();
974
975 default:
976 return SmUnhandled();
977 }
978}
979
982{
984 return SmHandled();
985}
986
987/* CALLERS ********************************************************************/
988
989/* Port cycled after a failure; the device's endpoints are still to be deleted */
992{
993 AskPortCycle();
996}
997
998/* Client reset of an unconfigured device */
1002{
1003 switch (Event)
1004 {
1005 case DsmEvent::Succeeded:
1007 return BackToUnconfigured();
1008
1009 default:
1011 }
1012}
1013
1017{
1018 switch (Event)
1019 {
1020 case DsmEvent::Failed:
1022 return CycleAndPark();
1023
1024 case DsmEvent::FailedDeviceEnabled:
1026 AskPortCycle();
1028
1029 case DsmEvent::DetachedDeviceEnabled:
1031 return DetachUnconfigured();
1032
1033 case DsmEvent::PortDetached:
1036
1037 default:
1038 return SmUnhandled();
1039 }
1040}
1041
1042/* Client reset of a configured device: put the configuration back afterwards */
1046{
1047 if (Event != DsmEvent::Succeeded)
1049
1050 if (!PrepareListsForReset())
1051 {
1053 return BackToUnconfigured();
1054 }
1055
1057 return SmTransition(&Configuring);
1058}
1059
1063{
1064 switch (Event)
1065 {
1066 case DsmEvent::Failed:
1068 return BackToUnconfigured();
1069
1070 case DsmEvent::Succeeded:
1071 return ClientDoneOk();
1072
1073 case DsmEvent::PortDetached:
1075 return DetachConfigured();
1076
1077 default:
1078 return SmUnhandled();
1079 }
1080}
1081
1082/* Client reset of the boot device; m_DetachEnds when a detach ends the reset */
1086{
1087 switch (Event)
1088 {
1089 case DsmEvent::Succeeded:
1090 if (!PrepareListsForReset())
1091 return SmTransition(&BugChecking);
1092
1094 return SmTransition(&Configuring);
1095
1096 case DsmEvent::DetachedDeviceEnabled:
1098
1099 case DsmEvent::Failed:
1100 case DsmEvent::FailedDeviceEnabled:
1101 return SmTransition(&BugChecking);
1102
1103 case DsmEvent::PortDetached:
1104 if (!m_DetachEndsReset)
1105 return SmUnhandled();
1106
1108
1109 default:
1110 return SmUnhandled();
1111 }
1112}
1113
1117{
1118 switch (Event)
1119 {
1120 case DsmEvent::Succeeded:
1123 return SmTransition(&ConfiguredOn);
1124
1125 case DsmEvent::Failed:
1126 return SmTransition(&BugChecking);
1127
1128 case DsmEvent::PortDetached:
1131
1132 default:
1133 return SmUnhandled();
1134 }
1135}
1136
1140{
1141 if (Event != DsmEvent::ControllerIoctlDone)
1142 return SmUnhandled();
1143
1146}
1147
1148/* Hub started again with the device enumerated but not started */
1152{
1153 switch (Event)
1154 {
1155 case DsmEvent::Succeeded:
1157
1158 case DsmEvent::Failed:
1159 return CycleAndPark();
1160
1161 case DsmEvent::DetachedDeviceEnabled:
1163
1164 case DsmEvent::FailedDeviceEnabled:
1166
1167 case DsmEvent::PdoCleanup:
1169
1170 case DsmEvent::PortDetached:
1172
1173 default:
1174 return SmUnhandled();
1175 }
1176}
1177
1181{
1182 if (Event != DsmEvent::ControllerIoctlDone)
1183 return SmUnhandled();
1184
1186}
1187
1191{
1192 if (Event != DsmEvent::ControllerIoctlDone)
1193 return SmUnhandled();
1194
1195 return CycleAndPark();
1196}
1197
1198/* PDO start of a device that stayed enabled or stopped */
1202{
1203 switch (Event)
1204 {
1205 case DsmEvent::Succeeded:
1207
1208 case DsmEvent::Failed:
1210 return CycleAndPark();
1211
1212 case DsmEvent::DetachedDeviceEnabled:
1214 return DetachUnconfigured();
1215
1216 case DsmEvent::FailedDeviceEnabled:
1218
1219 case DsmEvent::PortDetached:
1222
1223 default:
1224 return SmUnhandled();
1225 }
1226}
1227
1230{
1234}
1235
1239{
1240 if (Event != DsmEvent::ControllerIoctlDone)
1241 return SmUnhandled();
1242
1244 return CycleAndPark();
1245}
1246
1247/* PDO pre start of a device that stayed enabled */
1251{
1252 switch (Event)
1253 {
1254 case DsmEvent::Succeeded:
1255 return StoppedAckPreStart();
1256
1257 case DsmEvent::FailedDeviceEnabled:
1259
1260 case DsmEvent::DetachedDeviceEnabled:
1262 return DetachUnconfigured();
1263
1264 case DsmEvent::Failed:
1266 return CycleAndPark();
1267
1268 case DsmEvent::PortDetached:
1271
1272 default:
1273 return SmUnhandled();
1274 }
1275}
1276
1280{
1281 if (Event != DsmEvent::ControllerIoctlDone)
1282 return SmUnhandled();
1283
1285 return CycleAndPark();
1286}
1287
1288/* Hub resumed and asked for the device to be enumerated again */
1292{
1293 switch (Event)
1294 {
1295 case DsmEvent::Succeeded:
1297
1298 default:
1300 }
1301}
1302
1306{
1307 switch (Event)
1308 {
1309 case DsmEvent::DetachedDeviceEnabled:
1310 return DetachUnconfigured();
1311
1312 case DsmEvent::Failed:
1313 return CycleAndPark();
1314
1315 case DsmEvent::FailedDeviceEnabled:
1316 AskPortCycle();
1318
1319 case DsmEvent::PortDetached:
1321
1322 default:
1323 return SmUnhandled();
1324 }
1325}
1326
1330{
1331 if (Event != DsmEvent::Succeeded)
1333
1334 if (!PrepareListsForReset())
1336
1338 return SmTransition(&Configuring);
1339}
1340
1344{
1345 switch (Event)
1346 {
1347 case DsmEvent::Succeeded:
1348 return SmTransition(&ConfiguredOn);
1349
1350 case DsmEvent::Failed:
1352
1353 case DsmEvent::PortDetached:
1355
1356 default:
1357 return SmUnhandled();
1358 }
1359}
1360
1361/* Configuration could not be restored: the port goes off, the device waits */
1365{
1366 switch (Event)
1367 {
1368 case DsmEvent::PortDisableDone:
1369 case DsmEvent::PortFault:
1371
1372 case DsmEvent::PortDetached:
1373 return DetachUnconfigured();
1374
1375 default:
1376 return SmUnhandled();
1377 }
1378}
1379
1380/* PnP resume that needed a re-enumeration */
1384{
1385 switch (Event)
1386 {
1387 case DsmEvent::Succeeded:
1390
1391 default:
1393 }
1394}
1395
1399{
1400 switch (Event)
1401 {
1402 case DsmEvent::FailedDeviceEnabled:
1403 AskPortCycle();
1406
1407 case DsmEvent::Failed:
1409 return CycleAndPark();
1410
1411 case DsmEvent::DetachedDeviceEnabled:
1413 return DetachUnconfigured();
1414
1415 case DsmEvent::PortDetached:
1418
1419 default:
1420 return SmUnhandled();
1421 }
1422}
1423
1427{
1428 if (Event != DsmEvent::Succeeded)
1430
1431 if (!PrepareListsForReset())
1433
1435 return SmTransition(&Configuring);
1436}
1437
1440{
1441 AskPortCycle();
1444}
1445
1449{
1450 switch (Event)
1451 {
1452 case DsmEvent::Succeeded:
1454 return SmTransition(&ConfiguredOn);
1455
1456 case DsmEvent::Failed:
1458
1459 case DsmEvent::PortDetached:
1461 return DetachConfigured();
1462
1463 default:
1464 return SmUnhandled();
1465 }
1466}
1467
1468/* PnP resume of the boot device that needed a re-enumeration */
1472{
1473 switch (Event)
1474 {
1475 case DsmEvent::Failed:
1476 case DsmEvent::FailedDeviceEnabled:
1477 return SmTransition(&BugChecking);
1478
1479 case DsmEvent::Succeeded:
1480 if (!PrepareListsForReset())
1481 return SmTransition(&BugChecking);
1482
1484 return SmTransition(&Configuring);
1485
1486 case DsmEvent::DetachedDeviceEnabled:
1490
1491 case DsmEvent::PortDetached:
1494
1495 default:
1496 return SmUnhandled();
1497 }
1498}
1499
1503{
1504 switch (Event)
1505 {
1506 case DsmEvent::Failed:
1507 return SmTransition(&BugChecking);
1508
1509 case DsmEvent::Succeeded:
1511 return SmTransition(&ConfiguredOn);
1512
1513 case DsmEvent::PortDetached:
1516
1517 default:
1518 return SmUnhandled();
1519 }
1520}
1521
1522/* STARTING A RE-ENUMERATION **************************************************/
1523
1526{
1529}
1530
1533{
1536}
1537
1538/* Boot device reset by its client, either right away or once it is back */
1541 _In_ BOOLEAN AfterReattach)
1542{
1544
1545 if (AfterReattach)
1547
1548 m_DetachEndsReset = AfterReattach;
1550}
1551
1554{
1557}
1558
1561 _In_ DSM_REENUM Kind)
1562{
1564}
1565
1568{
1571}
1572
1576{
1577 if (Configured)
1578 {
1581 }
1582
1585}
1586
1590{
1591 if (Configured)
1592 {
1595 }
1596
1599}
1600
1603{
1606}
#define VOID
Definition: acefi.h:82
unsigned char BOOLEAN
Definition: actypes.h:127
static const State BootDeviceResetPending
Definition: devsm.h:1273
VOID ReleaseAddressZero()
Definition: devhcd.cpp:478
SM_RESULT ReconfiguredAfterResume(_In_ DsmEvent Event)
SM_RESULT ReenumPdCharging()
SM_RESULT EnterLinkPowerAgain()
static const State ReenumeratingForPower
Definition: devsm.h:1315
SM_RESULT ReenumDoneForHubResumeConfigured(_In_ DsmEvent Event)
static const State StoppedAddressed
Definition: devsm.h:834
VOID CompletePreStart()
Definition: childpdo.cpp:4045
BOOLEAN AltEnumNeededOnReenum()
Definition: hubmsos.cpp:111
SM_RESULT Again20SecondResetNotified(_In_ DsmEvent Event)
BOOLEAN DeviceProgrammingLost()
Definition: devmisc.cpp:352
static const State Reenumerating
Definition: devsm.h:1313
SM_RESULT ReenumTreePurgedUnconfigured(_In_ DsmEvent Event)
static const State Requesting
Definition: devsm.h:229
SM_RESULT ReenumPurgedHoldingAddressZero(_In_ DsmEvent Event)
SM_RESULT ReconfiguredForClient(_In_ DsmEvent Event)
SM_RESULT ReenumRetryDelayEndedHoldingAddressZero(_In_ DsmEvent Event)
SM_RESULT ReenumPortOffForHubDeviceEnabled(_In_ DsmEvent Event)
SM_RESULT ReenumAltEnumSent(_In_ DsmEvent Event)
static const State AwaitingPort
Definition: devsm.h:222
SM_RESULT ReenumForHubResume(_In_ BOOLEAN Configured)
SM_RESULT ReenumDisabledThenPark(_In_ DsmEvent Event)
SM_RESULT StartSuperSpeedReset()
Definition: devsm_zero.cpp:406
BOOLEAN m_ReenumForceReset
Definition: devsm.h:1847
VOID FailIoAndPurge()
SM_RESULT CallWait(_In_ const State *Target, _In_ DSM_NEXT Next)
Definition: devsm.cpp:389
SM_RESULT Link20Updated(_In_ DsmEvent Event)
BOOLEAN m_DetachEndsReset
Definition: devsm.h:1848
VOID SendAltEnumCommand()
Definition: devreq.cpp:735
SM_RESULT ReenumCycleAfterResumeFailure()
VOID DisableEndpointsAndNotify()
Definition: devsm_boot.cpp:123
SM_RESULT ReenumPdChargingSet(_In_ DsmEvent Event)
SM_RESULT ReenumForResume(_In_ BOOLEAN Configured)
VOID RequestPortDisable()
Definition: hubport.cpp:638
SM_RESULT ReenumFailedForHubResume(_In_ DsmEvent Event)
BOOLEAN SupportsPdCharging()
Definition: devmisc.cpp:293
SM_RESULT ReenumTimerFlushedForHub(_In_ DsmEvent Event)
static const State DisablingEndpoints
Definition: devsm.h:239
static const State SettingPdCharging
Definition: devsm.h:244
SM_RESULT ReenumDoneForStart(_In_ DsmEvent Event)
SM_RESULT BootDeviceNotifyDetached()
Definition: devsm_boot.cpp:83
static const State WaitingForController
Definition: devsm.h:232
SM_RESULT ReenumClaimEndedOnDetach(_In_ DsmEvent Event)
SM_RESULT ReenumCleanUpOldConfig()
SM_RESULT ReenumDisableForHub()
SM_RESULT EnterReenumerating()
SM_RESULT Again20FirstResetDone(_In_ DsmEvent Event)
static const State ConfiguredOn
Definition: devsm.h:1062
SM_RESULT ReenumRetryOrFail()
SM_RESULT ReenumConfigRead(_In_ DsmEvent Event)
static const State AtAddressZeroAgain
Definition: devsm.h:1316
BOOLEAN StopTimer()
Definition: hubchild.cpp:295
SM_RESULT OnAddressingAgain(_In_ DsmEvent Event)
SM_RESULT Again20FirstDescriptorRead(_In_ DsmEvent Event)
static const State IoctlAfterDetach
Definition: devsm.h:241
static const State ParkedPortOff
Definition: devsm.h:753
SM_RESULT LinkStart()
Definition: devsm_desc.cpp:965
SM_RESULT ReenumPurgedAfterFailure(_In_ DsmEvent Event)
SM_RESULT ReenumDisabledForHub(_In_ DsmEvent Event)
SM_RESULT Link20Start()
static const State TimerAfterDetach
Definition: devsm.h:242
DSM_NEXT m_AfterReenum
Definition: devsm.h:1849
BOOLEAN KindWithin(_In_ ULONG Allowed)
A device with no version or speed known yet passes for any version or speed.
Definition: devsm.cpp:159
SM_RESULT Again20SecondDelayEnded(_In_ DsmEvent Event)
SM_RESULT ReenumForPreStart()
VOID ClearReprogramNeeded()
Definition: devmisc.cpp:385
VOID AskPortCycle()
Definition: hubport.cpp:656
SM_RESULT EnterAtAddressZeroAgain()
SM_RESULT ReenumPortOffAfterFailure(_In_ DsmEvent Event)
BOOLEAN EnumRetriesUsedUp()
Definition: devmisc.cpp:74
static const State ClaimingAddressZeroAgain
Definition: devsm.h:1320
SM_RESULT Again20FirstDelayEnded(_In_ DsmEvent Event)
VOID PurgeDeviceIo()
Definition: devhcd.cpp:908
SM_RESULT ReenumStopRetryForHub()
SM_RESULT OnParkedForHubAgain(_In_ DsmEvent Event)
VOID ReadConfigDescriptorHeader()
Definition: devreq.cpp:433
SM_RESULT EndWith(_In_ DsmEvent Result)
Definition: devsm.cpp:186
SM_RESULT ReenumDoneForClientUnconfigured(_In_ DsmEvent Event)
SM_RESULT EndAfterTimer(_In_ DsmEvent Event)
Definition: devsm.cpp:466
SM_RESULT ReenumForBootResume()
SM_RESULT EnterAddressing()
Definition: devsm_enum.cpp:460
SM_RESULT ReenumDoneForBootDevice(_In_ DsmEvent Event)
SM_RESULT ReconfiguredBootDevice(_In_ DsmEvent Event)
SM_RESULT ReenumPortOffForHubDeviceDisabled(_In_ DsmEvent Event)
SM_RESULT ToAwaitingDetachOrRemove(_In_ BOOLEAN Configured)
SM_RESULT ReenumDisabledThenReport(_In_ DsmEvent Event)
BOOLEAN m_ContextGone
Definition: devsm.h:1851
SM_RESULT ReconfiguredAfterHubResume(_In_ DsmEvent Event)
static const State DisablingDevice
Definition: devsm.h:243
SM_RESULT ReenumDisabledThenSignalAndCycle(_In_ DsmEvent Event)
VOID LogReenumeration()
Definition: devmisc.cpp:392
SM_RESULT ReenumTreePurgedConfigured(_In_ DsmEvent Event)
SM_RESULT OnReenumerating(_In_ DsmEvent Event)
SM_RESULT CallStep(_In_ DSM_THEN Then)
Definition: devsm.cpp:552
SM_RESULT EnterClaimingAddressZero()
Definition: devsm_enum.cpp:143
SM_RESULT ReenumTimerFlushedOnDetach(_In_ DsmEvent Event)
BOOLEAN IsFirstEnumTry()
Definition: devmisc.cpp:30
VOID CancelControllerIoctl()
Definition: devhcd.cpp:462
VOID ReferenceDevicePower()
Definition: fanout.cpp:1038
BOOLEAN DeviceSpeedChanged()
Definition: devmisc.cpp:218
static const State DisablingPort
Definition: devsm.h:221
static const State EnablingDevice
Definition: devsm.h:224
SM_RESULT OnAtAddressZeroAgain(_In_ DsmEvent Event)
static const State BootDeviceDetached
Definition: devsm.h:1271
SM_RESULT CycleAndPark()
VOID DereferenceDevicePower()
Definition: fanout.cpp:1044
SM_RESULT ReenumPortOffHoldingAddressZero(_In_ DsmEvent Event)
VOID ReadSerialNumber()
Definition: devreq.cpp:592
VOID CompleteClientRequestFailed()
Definition: childpdo.cpp:3507
VOID RecordResetTimeout()
Definition: devmisc.cpp:398
static const State CancelingClaimAgain
Definition: devsm.h:1321
VOID ReadDeviceDescriptor()
Definition: devreq.cpp:415
VOID FailIoAndDisablePort()
SM_RESULT ReenumDisabledThenAckAndCycle(_In_ DsmEvent Event)
SM_RESULT ReenumPortOffDeviceDisabled(_In_ DsmEvent Event)
DsmEvent m_HubEvent
Definition: devsm.h:1838
VOID CompleteClientRequest()
Definition: childpdo.cpp:3462
SM_RESULT ReenumDoneForBootResume(_In_ DsmEvent Event)
SM_RESULT EnterBugChecking()
static const State NotifyingReset
Definition: devsm.h:226
SM_RESULT ReenumEndpointsDisabled(_In_ DsmEvent Event)
static const State ReadingFirstDescriptor
Definition: devsm.h:227
SM_RESULT ReenumDoneForPreStart(_In_ DsmEvent Event)
static const State ParkedForHubAgain
Definition: devsm.h:1319
SM_RESULT StoppedAckPreStart()
SM_RESULT EnterCancelingClaim()
Definition: devsm_enum.cpp:193
VOID SignalPnpWaiter()
Definition: childpdo.cpp:4023
SM_RESULT EndOnHubOrDetach(_In_ DsmEvent Event)
Definition: devsm.cpp:428
SM_RESULT ReconfiguredBootAfterResume(_In_ DsmEvent Event)
SM_RESULT DetachUnconfigured()
SM_RESULT ReenumSerialNumber()
VOID NotifyPortDetached()
Definition: hubport.cpp:632
static const State ResettingPort
Definition: devsm.h:225
SM_RESULT ReportMissingAndLeave()
static const State Configured
Definition: devsm.h:1061
SM_RESULT ReenumStopRetryOnDetach()
BOOLEAN UpdateLpm20()
Definition: devhcd.cpp:798
BOOLEAN ConfigReadOnReset()
Definition: devmisc.cpp:255
SM_RESULT ReenumForStart(_In_ DSM_REENUM Kind)
SM_RESULT ReenumDoneForHubResumeUnconfigured(_In_ DsmEvent Event)
SM_RESULT ReenumDoneForResumeUnconfigured(_In_ DsmEvent Event)
static const State BugChecking
Definition: devsm.h:1322
SM_RESULT ReenumWrongDeviceLeft(_In_ DsmEvent Event)
SM_RESULT ReenumDisabledThenCycle(_In_ DsmEvent Event)
static const State RequestingCriticalPassive
Definition: devsm.h:233
SM_RESULT ReenumForClientUnconfigured()
SM_RESULT BackToUnconfigured()
SM_RESULT OnLinkPowerAgain(_In_ DsmEvent Event)
SM_RESULT EnterParkedForHub()
Definition: devsm_enum.cpp:620
BOOLEAN SerialNumberCompared()
Definition: hubid.cpp:1208
SM_RESULT OnCancelingClaimAgain(_In_ DsmEvent Event)
SM_RESULT Again20SecondResetDone(_In_ DsmEvent Event)
BOOLEAN m_PortMayResume
Definition: devsm.h:1843
SM_RESULT EndOnResetForHub(_In_ DsmEvent Event)
Definition: devsm.cpp:445
BOOLEAN SameSerialNumber()
Definition: hubid.cpp:1218
SM_RESULT RemovalNotifyThenReport()
SM_RESULT ReenumPortOffAfterConfigFailure(_In_ DsmEvent Event)
SM_RESULT ReenumSerialRead(_In_ DsmEvent Event)
SM_RESULT RemovalDeleteForgetPortOn()
SM_RESULT AtPassive(_In_ DSM_THEN Then)
Definition: devsm.cpp:177
SM_RESULT ReenumForBootClient(_In_ BOOLEAN AfterReattach)
SM_RESULT ReenumConfigDescriptor()
SM_RESULT BootDeviceDetachDuringReset(_In_ BOOLEAN ContextGone)
Definition: devsm_boot.cpp:142
SM_RESULT DetachConfigured()
SM_RESULT ReenumParkForHub()
SM_RESULT ReenumFailedForResume(_In_ DsmEvent Event)
SM_RESULT CallRequest(_In_ const State *Target, _In_ DSM_ACTION Start, _In_ DSM_NEXT Next)
Definition: devsm.cpp:578
BOOLEAN SameDeviceConnected()
Definition: devmisc.cpp:238
static const State RequestingCritical
Definition: devsm.h:230
static const State ReenumeratingForHubStart
Definition: devsm.h:1314
VOID NotifyWrongDevice()
Definition: bootdev.cpp:371
SM_RESULT Again20FirstResetNotified(_In_ DsmEvent Event)
VOID ForceResetOnNextStart()
Definition: childpdo.cpp:4090
SM_RESULT Delay(_In_ DSM_DELAY Kind, _In_ DSM_NEXT Next)
Definition: devsm.cpp:291
SM_RESULT ReenumEnabled(_In_ DsmEvent Event)
SM_RESULT ReenumPortOffForHub(_In_ DsmEvent Event)
static const State BootDeviceDetachedContextGone
Definition: devsm.h:1272
BOOLEAN PrepareListsForReset()
Definition: devconfig.cpp:872
SM_RESULT ReenumDoneForResumeConfigured(_In_ DsmEvent Event)
SM_RESULT ReenumDoneForClientConfigured(_In_ DsmEvent Event)
VOID DeleteConfigEndpoints()
Definition: devhcd.cpp:1283
SM_RESULT ReenumDoneForHubStart(_In_ DsmEvent Event)
VOID StartEnumRetries()
Definition: devmisc.cpp:59
BOOLEAN FirstDescriptorValid()
Definition: devdesc.cpp:67
SM_RESULT ReenumRetryOrFailHoldingAddressZero()
SM_RESULT BootDeviceDisabledForReset(_In_ DsmEvent Event)
static const State Configuring
Definition: devsm.h:1064
SM_RESULT OnClaimingAddressZeroAgain(_In_ DsmEvent Event)
VOID PurgeDeviceTreeIo()
Definition: devhcd.cpp:927
VOID BugCheckForBootDevice()
Definition: devmisc.cpp:405
VOID SetFailIo()
Definition: childpdo.cpp:4084
BOOLEAN IsBootDevice()
Definition: childpdo.cpp:4128
DSM_NEXT m_AfterConfigure
Definition: devsm.h:1852
SM_RESULT ReenumRetryDelayEnded(_In_ DsmEvent Event)
SM_RESULT ReenumFailedForClient(_In_ DsmEvent Event)
SM_RESULT ReenumForClientConfigured()
SM_RESULT Reenumerate(_In_ const State *Target, _In_ DSM_REENUM Kind, _In_ BOOLEAN ForceReset, _In_ DSM_NEXT After)
static const State AddressingAgain
Definition: devsm.h:1317
VOID NotifyReconnected()
Definition: childpdo.cpp:3969
DSM_REENUM m_ReenumKind
Definition: devsm.h:1846
SM_RESULT ReenumForHubStart()
SM_RESULT ClientDoneOk()
static const State LinkPowerAgain
Definition: devsm.h:1318
static const State UnconfiguredOn
Definition: devsm.h:947
SM_RESULT ReenumDescriptorRead(_In_ DsmEvent Event)
SM_RESULT ReenumWrongDevice()
static SM_RESULT SmTransition(_In_ const State *Target)
Definition: smengine.h:194
static SM_RESULT SmUnhandled()
Definition: smengine.h:188
#define DSM_KIND_USB2X
Definition: devsm.h:144
#define DSM_KIND_PORT30
Definition: devsm.h:153
#define DSM_KIND_ANY_SPEED
Definition: devsm.h:151
DsmEvent
Definition: devsm.h:15
@ NoPingResponse
@ LpmSettingChanged
@ DsmDelayPostResetLong
Definition: devsm.h:126
@ DsmDelayEnumRetry
Definition: devsm.h:124
@ DsmDelayPostReset
Definition: devsm.h:125
enum _DSM_REENUM DSM_REENUM
#define DSM_KIND_PORT20
Definition: devsm.h:152
@ DsmReenumConfigured
Definition: devsm.h:135
@ DsmReenumRestart
Definition: devsm.h:137
@ DsmReenumUnconfigured
Definition: devsm.h:136
#define DSM_KIND_USB3X
Definition: devsm.h:145
#define DSM_KIND_ANY_PORT
Definition: devsm.h:154
#define DSM_KIND_ANY_VERSION
Definition: devsm.h:146
static const DsmEvent ReenumLpmDiscards[]
static const DsmEvent ReenumQuietDiscards[]
_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
#define SM_STATE_TAKES_REQUESTS
Definition: smengine.h:39
#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
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
_In_ WDFDPC _In_ BOOLEAN Wait
Definition: wdfdpc.h:170
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306