ReactOS 0.4.17-dev-1281-g065abb3
hubsm.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: Hub state machine
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8/* INCLUDES *******************************************************************/
9
10#include "usbhub3.h"
11
12#define NDEBUG
13#include <debug.h>
14
15/* GLOBALS ********************************************************************/
16
17/* USB4 router mailbox: 16 data registers, then metadata and opcode/status */
18static const USHORT HubMailboxMetadata = 16;
19static const USHORT HubMailboxOpcode = 17;
20static const ULONG HubMailboxDataWords = 16;
21static const ULONG HubMailboxBusy = 0x80000000UL;
22
23/* Router operation DROM_READ, with the operation valid bit */
24static const ULONG HubDromReadCommand = 0x80000024UL;
25
26/* The header pass reads the first four DWORDs of the DROM */
27static const ULONG HubDromHeaderWords = 4;
28
29/* Bytes of the DROM that its length field does not count */
30static const ULONG HubDromLengthBias = 13;
31static const ULONG HubDromMinimumLength = 3;
32
33/* How long the router may stay busy on one window, in 100 ns units */
34static const ULONGLONG HubDromBusyLimit = 5ULL * 10 * 1000 * 1000;
35
37{
38 { "DeviceAdded", SmEventRequest, FALSE },
39 { "PrepareHardware", SmEventRequest, FALSE },
40 { "ReleaseHardware", SmEventRequest, FALSE },
41 { "DeviceCleanup", SmEventRequest, FALSE },
42 { "D0Entry", SmEventRequest, FALSE },
43 { "D0EntryFromSx", SmEventRequest, FALSE },
44 { "D0Exit", SmEventRequest, FALSE },
45 { "D0ExitFinal", SmEventRequest, FALSE },
46 { "PortStatusRequest", SmEventRequest, FALSE },
47 { "ResetRequested", SmEventRequest, FALSE },
48 { "TimerFired", SmEventCompletion, FALSE },
49 { "ConfigurationSet", SmEventCompletion, FALSE },
50 { "ConfigurationFailed", SmEventCompletion, FALSE },
51 { "IoctlDone", SmEventCompletion, FALSE },
52 { "IoctlFailed", SmEventCompletion, FALSE },
53 { "InterruptDone", SmEventCompletion, FALSE },
54 { "InterruptFailed", SmEventCompletion, FALSE },
55 { "ResetDone", SmEventCompletion, FALSE },
56 { "ResetFailed", SmEventCompletion, FALSE },
57 { "ResetFailedOnRemoval", SmEventCompletion, FALSE },
58 { "PortsAcquired", SmEventCompletion, FALSE },
59 { "PortsReleased", SmEventCompletion, FALSE },
60 { "PortsResetReleased", SmEventCompletion, FALSE },
61 { "PortsInterruptReleased", SmEventCompletion, FALSE },
62 { "PortsEnableInterrupt", SmEventCompletion, FALSE },
63 { "DevicesAcquired", SmEventCompletion, FALSE },
64 { "DevicesReleased", SmEventCompletion, FALSE },
65 { "DevicesStoppedAfterSuspend", SmEventCompletion, FALSE },
66 { "TransferDone", SmEventCritical, FALSE },
67 { "TransferFailed", SmEventCritical, FALSE },
68 { "PipeResetDone", SmEventCritical, FALSE },
69 { "PipeResetFailed", SmEventCritical, FALSE },
70 { "CallSucceeded", SmEventCompletion, FALSE },
71 { "CallFailed", SmEventCompletion, FALSE },
72};
73
74static_assert(RTL_NUMBER_OF(HubMachine::EventInfo) == static_cast<ULONG>(HubEvent::Count),
75 "EventInfo must have one entry per HubEvent");
76
78
79#define HSM_REQ SM_STATE_TAKES_REQUESTS
80#define HSM_PASSIVE SM_STATE_NEEDS_PASSIVE
81#define HSM_CRIT SM_STATE_CRITICAL_ONLY
82
83typedef HubMachine M;
84
85/* Start up */
87 { NULL, "AwaitingAddDevice", HSM_REQ, &M::OnAwaitingAddDevice, NULL };
89 { NULL, "Unconfigured", HSM_REQ, &M::OnUnconfigured, NULL };
91 { NULL, "QueryingParentInfo", 0, &M::OnQueryingParentInfo, &M::EnterQueryingParentInfo };
93 { NULL, "Configuring", 0, &M::OnConfiguring, &M::EnterConfiguring };
95 { NULL, "Reconfiguring", 0, &M::OnReconfiguring, &M::EnterReconfiguring };
96
97/* USB4 router DROM read, every step is a mailbox control transfer */
99 { NULL, "DromRead", 0, &M::OnDromRead, NULL };
101 { &DromRead, "DromReadingFirstStatus", HSM_PASSIVE,
104 { &DromRead, "DromWritingMetadata", HSM_PASSIVE,
107 { &DromRead, "DromSendingCommand", HSM_PASSIVE,
110 { &DromRead, "DromReadingStatus", HSM_PASSIVE,
113 { &DromRead, "DromReadingWord", HSM_PASSIVE,
115
117 { NULL, "QueryingErrata", HSM_PASSIVE, NULL, &M::EnterQueryingErrata };
119 { NULL, "AwaitingD0", HSM_REQ, &M::OnAwaitingD0, &M::EnterSignalPnp };
120
121/* Not running, port status requests fail with no such device */
122const M::State M::Down =
123 { NULL, "Down", HSM_REQ, &M::OnDown, NULL };
124const M::State M::Stopped =
125 { &Down, "Stopped", 0, &M::OnStopped, NULL };
127 { &Down, "AwaitingReleaseHardware", 0, &M::OnAwaitingReleaseHardware,
128 &M::EnterSignalPnp, ResetDiscards };
130 { &Down, "AwaitingReleaseAfterFailure", 0, &M::OnAwaitingReleaseAfterFailure, NULL };
132 { &Down, "AwaitingStop", 0, &M::OnAwaitingStop, NULL, ResetDiscards };
134 { &Down, "SurpriseRemoved", 0, &M::OnSurpriseRemoved, &M::EnterSignalPnp, ResetDiscards };
135const M::State M::Deleted =
136 { NULL, "Deleted", 0, NULL, &M::EnterSignalPnp };
137
138/* Power up and running */
140 { NULL, "PortsAcquiring", 0, &M::OnPortsAcquiring, NULL };
142 { NULL, "DevicesAcquiring", 0, &M::OnDevicesAcquiring, NULL };
144 { NULL, "Listening", HSM_REQ, &M::OnListening, NULL };
146 { NULL, "NotListening", HSM_REQ, &M::OnNotListening, NULL };
148 { NULL, "ReadingPortStatus", HSM_CRIT, &M::OnReadingPortStatus, NULL };
150 { NULL, "ReadingHubStatus", 0, &M::OnReadingHubStatus, NULL };
152 { NULL, "AckingHubChange", 0, &M::OnAckingHubChange, NULL };
154 { NULL, "AwaitingOverCurrentTimer", 0, &M::OnAwaitingOverCurrentTimer, NULL };
156 { NULL, "ResettingPipe", HSM_CRIT, &M::OnResettingPipe, NULL };
157
158/* Tear down, m_Teardown says where it ends */
160 { NULL, "DrainingInterruptRefs", 0, &M::OnDrainingInterruptRefs, NULL };
162 { NULL, "CancelingInterrupt", 0, &M::OnCancelingInterrupt, NULL };
164 { NULL, "AwaitingInterruptRefs", 0, &M::OnAwaitingInterruptRefs, NULL };
166 { NULL, "AwaitingInterruptEnable", 0, &M::OnAwaitingInterruptEnable, NULL };
168 { NULL, "DevicesReleasing", 0, &M::OnDevicesReleasing, NULL };
170 { NULL, "PortsReleasing", 0, &M::OnPortsReleasing, NULL };
172 { NULL, "PortsResetting", 0, &M::OnPortsResetting, NULL };
174 { NULL, "CheckingRecoveryLimit", HSM_PASSIVE, NULL, &M::EnterCheckingRecoveryLimit };
176 { NULL, "ReportingFailure", HSM_PASSIVE, NULL, &M::EnterReportingFailure };
177const M::State M::Halted =
178 { NULL, "Halted", 0, NULL, &M::EnterHalted };
179
180/* Hub reset through the parent */
182 { NULL, "HubResetting", 0, &M::OnHubResetting, &M::EnterHubResetting, ResetDiscards };
184 { NULL, "LoggingReset", HSM_PASSIVE, NULL, &M::EnterLoggingReset };
186 { NULL, "AwaitingResetRetry", 0, &M::OnAwaitingResetRetry, NULL };
188 { NULL, "ReconfiguringAfterReset", HSM_PASSIVE,
191 { NULL, "ResettingOnResume", 0, &M::OnResettingOnResume, &M::EnterHubResetting };
193 { NULL, "ReconfiguringAfterResume", 0,
196 { NULL, "CheckingPowerLoss", 0, &M::OnCheckingPowerLoss, NULL };
197
198/* Suspended, port status requests fail with a hardware error */
199const M::State M::Asleep =
200 { NULL, "Asleep", HSM_REQ, &M::OnAsleep, NULL };
202 { &Asleep, "Suspended", 0, &M::OnSuspended, NULL };
204 { &Asleep, "RecycleSuspended", 0, &M::OnRecycleSuspended, NULL };
206 { &Asleep, "SuspendedResetPending", 0,
209 { NULL, "AwaitingStopAfterSuspend", 0, &M::OnAwaitingStopAfterSuspend, NULL };
210
211/* Called from Configuring and Reconfiguring for external hubs */
213 { NULL, "ReadingHubDescriptor", 0, &M::OnReadingHubDescriptor, &M::EnterReadingHubDescriptor };
215 { NULL, "AwaitingDescriptorRetry", 0,
218 { NULL, "ReadingStandardStatus", 0,
221 { NULL, "ReadingConfigDescriptor", 0,
224 { NULL, "UpdatingController", 0, &M::OnUpdatingController, &M::EnterUpdatingController };
226 { NULL, "SettingConfiguration", 0,
229 { NULL, "FinishingConfiguration", 0,
231
232/* Called from Configuring for the root hub */
234 { NULL, "ReadingRootHubInfo", 0, &M::OnReadingRootHubInfo, &M::EnterReadingRootHubInfo };
236 { NULL, "ReadingRootHub20Ports", 0,
239 { NULL, "ReadingRootHub30Ports", 0,
241
242/* Called for USB 3 hubs after configuration and after a reset */
244 { NULL, "ProgrammingHubDepth", 0, &M::OnProgrammingHubDepth, &M::EnterProgrammingHubDepth };
245
246#undef HSM_REQ
247#undef HSM_PASSIVE
248#undef HSM_CRIT
249
250/* FUNCTIONS ******************************************************************/
251
252VOID
254 _In_ HubFdo* Hub,
255 _In_ HubKind Kind)
256{
257 m_Hub = Hub;
258 m_Kind = Kind;
265 m_DromPollStart = 0;
266 m_DromIndex = 0;
267 m_DromWords = 0;
270
272}
273
274VOID
276{
277 ReferenceHub();
278}
279
280VOID
282{
284}
285
286VOID
288{
290}
291
292/* Start up *******************************************************************/
293
297{
298 if (Event != HubEvent::DeviceAdded)
299 return SmUnhandled();
300
302 return SmTransition(&Unconfigured);
303}
304
308{
309 switch (Event)
310 {
311 case HubEvent::PrepareHardware:
312 /* The root hub has no parent to ask */
313 if (m_Kind == HubKind::Root)
314 return SmTransition(&Configuring);
315
317
318 case HubEvent::DeviceCleanup:
319 return SmTransition(&Deleted);
320
321 default:
322 return SmUnhandled();
323 }
324}
325
328{
330 return SmHandled();
331}
332
336{
337 switch (Event)
338 {
339 case HubEvent::IoctlDone:
340 return SmTransition(&Configuring);
341
342 case HubEvent::IoctlFailed:
343 return FailStart(TRUE);
344
345 default:
346 return SmUnhandled();
347 }
348}
349
352{
354
355 if (m_Kind == HubKind::Root)
356 return SmCall(&ReadingRootHubInfo);
357
358 return StartHubConfiguration();
359}
360
364{
365 switch (Event)
366 {
367 case HubEvent::CallSucceeded:
369
370 case HubEvent::CallFailed:
371 return FailStart(TRUE);
372
373 default:
374 return SmUnhandled();
375 }
376}
377
380{
381 if (m_Kind == HubKind::Root)
382 return SmTransition(&AwaitingD0);
383
384 return StartHubConfiguration();
385}
386
390{
391 switch (Event)
392 {
393 /* A restart reads the DROM again, as the first start does */
394 case HubEvent::CallSucceeded:
396
397 case HubEvent::CallFailed:
398 return FailStart(FALSE);
399
400 default:
401 return SmUnhandled();
402 }
403}
404
407{
410}
411
418 _In_ BOOLEAN FirstStart)
419{
421 m_ReleaseToUnconfigured = FirstStart;
423}
424
427{
429
430 if (!CreateChildPorts())
431 return FailStart(TRUE);
432
433 return SmTransition(&AwaitingD0);
434}
435
438{
440 return SmHandled();
441}
442
446{
447 switch (Event)
448 {
449 case HubEvent::PortStatusRequest:
451 return SmHandled();
452
453 case HubEvent::D0Entry:
456
457 case HubEvent::ReleaseHardware:
459 return SmTransition(&Stopped);
460
461 default:
462 return SmUnhandled();
463 }
464}
465
466/* USB4 DROM ******************************************************************/
467
474 _In_ const State* Next)
475{
477
478 if (!IsDromReadWanted())
479 return SmTransition(Next);
480
482 m_DromIndex = 0;
485
487}
488
492{
493 if (Event == HubEvent::TransferFailed)
494 return FinishDrom();
495
496 return SmUnhandled();
497}
498
499/* QUIRK: this status read is only traced, so its failure is ignored */
502{
504 return SmHandled();
505}
506
510{
511 switch (Event)
512 {
513 case HubEvent::TransferDone:
514 DPRINT("Hub %p router mailbox status 0x%02lx\n", m_Hub, (MailboxValue() >> 24) & 0x3F);
516
517 case HubEvent::TransferFailed:
519
520 default:
521 return SmUnhandled();
522 }
523}
524
525/* Metadata: first DWORD of the window at bits 14:2, DWORD count at bits 19:15 */
528{
530 ULONG Metadata = ((m_DromIndex & 0x1FFF) << 2) | ((Count & 0x1F) << 15);
531
533 return SmHandled();
534}
535
539{
540 if (Event == HubEvent::TransferDone)
542
543 return SmUnhandled();
544}
545
548{
550 return SmHandled();
551}
552
556{
557 if (Event != HubEvent::TransferDone)
558 return SmUnhandled();
559
562}
563
566{
568 return SmHandled();
569}
570
574{
575 if (Event == HubEvent::TransferDone)
576 return CheckDromStatus();
577
578 return SmUnhandled();
579}
580
581/* QUIRK: only the busy bit is checked; a refused command reads whatever the data registers hold */
584{
585 if (!(MailboxValue() & HubMailboxBusy))
587
590
591 DPRINT1("Hub %p router still busy after 5 s, DROM read stopped at DWORD %lu\n", m_Hub, m_DromIndex);
592 return FinishDrom();
593}
594
601{
604
606 {
607 DPRINT1("Hub %p router DROM length %lu is too short\n", m_Hub, DataLength);
608 return FinishDrom();
609 }
610
613 return FinishDrom();
614
616 m_DromIndex = 0;
617 m_DromWords = (TotalBytes + sizeof(ULONG) - 1) / sizeof(ULONG);
619}
620
623{
625 return SmHandled();
626}
627
631{
632 if (Event == HubEvent::TransferDone)
634
635 return SmUnhandled();
636}
637
638/* Each window starts at a multiple of 16, so the data register is the slot in the window */
641{
643 m_DromIndex += 1;
644
647
649 return StartDromWords();
650
653
654 return FinishDrom();
655}
656
657/* Every way out of the read ends here; only a complete full pass is parsed */
660{
663
666 m_DromIndex = 0;
667 m_DromWords = 0;
668 return SmTransition(m_DromNext);
669}
670
671/* Not running ****************************************************************/
672
676{
677 switch (Event)
678 {
679 case HubEvent::PortStatusRequest:
681 return SmHandled();
682
683 case HubEvent::ResetRequested:
684 return SmHandled();
685
686 default:
687 return SmUnhandled();
688 }
689}
690
694{
695 switch (Event)
696 {
697 case HubEvent::PrepareHardware:
699
700 case HubEvent::DeviceCleanup:
701 return SmTransition(&Deleted);
702
703 default:
704 return SmUnhandled();
705 }
706}
707
711{
712 if (Event != HubEvent::ReleaseHardware)
713 return SmUnhandled();
714
716 return SmTransition(&Stopped);
717}
718
722{
723 if (Event != HubEvent::ReleaseHardware)
724 return SmUnhandled();
725
728}
729
730/* Failure reported to PnP, waiting for the stop */
734{
735 switch (Event)
736 {
737 case HubEvent::D0Exit:
741
742 case HubEvent::D0ExitFinal:
747
748 default:
749 return SmUnhandled();
750 }
751}
752
756{
757 if (Event == HubEvent::DeviceCleanup)
758 return SmTransition(&Deleted);
759
760 return SmUnhandled();
761}
762
763/* Power up *******************************************************************/
764
767 _In_ PowerUp Kind)
768{
769 switch (Kind)
770 {
771 case PowerUp::Resume:
773 break;
774
777 break;
778
782 break;
783
784 default:
787 break;
788 }
789
790 m_PowerUp = Kind;
792}
793
797{
798 if (Event != HubEvent::PortsAcquired)
799 return SmUnhandled();
800
801 switch (m_PowerUp)
802 {
805
806 case PowerUp::Resume:
809 break;
810
813 break;
814
818 break;
819
820 default:
822 break;
823 }
824
826}
827
831{
832 if (Event != HubEvent::DevicesAcquired)
833 return SmUnhandled();
834
835 switch (m_PowerUp)
836 {
837 case PowerUp::Start:
840
844 return SmTransition(&NotListening);
845
850
851 default:
853 }
854}
855
856/* Running ********************************************************************/
857
861{
862 switch (Event)
863 {
864 case HubEvent::ResetRequested:
867
868 case HubEvent::D0Exit:
870
871 case HubEvent::D0ExitFinal:
873
874 case HubEvent::InterruptDone:
876 switch (CheckHubChangeBit())
877 {
878 case HubCheck::Yes:
880
881 case HubCheck::Error:
882 return HandleHubStatusFault();
883
884 default:
886 return SmTransition(&NotListening);
887 }
888
889 case HubEvent::InterruptFailed:
893
896
897 case HubEvent::PortStatusRequest:
898 return ReadPortStatus(&Listening);
899
900 default:
901 return SmUnhandled();
902 }
903}
904
905/* The ports hold the interrupt transfer back until they ask for it again */
909{
910 switch (Event)
911 {
912 case HubEvent::ResetRequested:
915
916 case HubEvent::D0Exit:
920
921 case HubEvent::D0ExitFinal:
925
926 case HubEvent::PortsEnableInterrupt:
927 return SendInterrupt(TRUE);
928
929 case HubEvent::PortStatusRequest:
931
932 default:
933 return SmUnhandled();
934 }
935}
936
939 _In_ const State* ReturnTo)
940{
942 m_PortStatusReturn = ReturnTo;
944}
945
949{
950 switch (Event)
951 {
952 case HubEvent::TransferDone:
955
956 case HubEvent::TransferFailed:
959
960 default:
961 return SmUnhandled();
962 }
963}
964
967 _In_ BOOLEAN ClearPipeResets)
968{
971 if (ClearPipeResets)
973
974 return SmTransition(&Listening);
975}
976
979 _In_ StatusRead Purpose)
980{
981 GetHubStatus();
982 m_StatusRead = Purpose;
984}
985
989{
990 switch (Event)
991 {
992 case HubEvent::TransferDone:
995
997 {
998 if (OverCurrentCleared())
1000
1001 return OverCurrentError();
1002 }
1003
1004 switch (SelectHubChange())
1005 {
1006 case HubCheck::Yes:
1007 AckHubChange();
1009
1010 case HubCheck::Error:
1011 return HandleHubStatusFault();
1012
1013 default:
1014 return SendInterrupt(TRUE);
1015 }
1016
1017 case HubEvent::TransferFailed:
1019 return OverCurrentError();
1020
1022
1023 default:
1024 return SmUnhandled();
1025 }
1026}
1027
1031{
1032 switch (Event)
1033 {
1034 case HubEvent::TransferDone:
1036
1037 case HubEvent::TransferFailed:
1039
1040 default:
1041 return SmUnhandled();
1042 }
1043}
1044
1052{
1053 switch (Change)
1054 {
1055 case HubChange::OverCurrent:
1058
1059 case HubChange::OverCurrentCleared:
1061
1062 case HubChange::Error:
1063 return HandleHubStatusFault();
1064
1065 default:
1066 return SendInterrupt(TRUE);
1067 }
1068}
1069
1072{
1073 if (IsErrorFatal())
1075
1076 return SendInterrupt(TRUE);
1077}
1078
1081{
1082 if (IsErrorFatal())
1084
1086}
1087
1091{
1092 if (Event == HubEvent::TimerFired)
1094
1095 return SmUnhandled();
1096}
1097
1101{
1102 switch (Event)
1103 {
1104 case HubEvent::PipeResetDone:
1105 return SendInterrupt(FALSE);
1106
1107 case HubEvent::PipeResetFailed:
1109
1110 default:
1111 return SmUnhandled();
1112 }
1113}
1114
1115/* Tear down ******************************************************************/
1116
1117/* The interrupt transfer is still pending */
1121{
1123
1126
1128
1129 if (!released)
1131
1134}
1135
1136/* No interrupt transfer is pending */
1140{
1143
1145
1148
1149 return AfterInterruptQuiet();
1150}
1151
1154{
1155 switch (m_Teardown)
1156 {
1157 case Teardown::Stop:
1160
1161 case Teardown::Suspend:
1164
1165 default:
1168 }
1169}
1170
1174{
1175 switch (Event)
1176 {
1177 case HubEvent::InterruptDone:
1178 case HubEvent::InterruptFailed:
1180
1181 case HubEvent::PortsInterruptReleased:
1184
1185 default:
1186 return SmUnhandled();
1187 }
1188}
1189
1193{
1194 if ((Event == HubEvent::InterruptDone) || (Event == HubEvent::InterruptFailed))
1195 return AfterInterruptQuiet();
1196
1197 return SmUnhandled();
1198}
1199
1203{
1204 if (Event == HubEvent::PortsInterruptReleased)
1205 return AfterInterruptQuiet();
1206
1207 return SmUnhandled();
1208}
1209
1213{
1214 if (Event == HubEvent::PortsEnableInterrupt)
1216
1217 return SmUnhandled();
1218}
1219
1223{
1224 if (Event != HubEvent::DevicesReleased)
1225 return SmUnhandled();
1226
1227 switch (m_Teardown)
1228 {
1229 case Teardown::Stop:
1232
1233 case Teardown::Suspend:
1236
1237 default:
1239 }
1240}
1241
1245{
1246 if (Event != HubEvent::PortsReleased)
1247 return SmUnhandled();
1248
1249 switch (m_Teardown)
1250 {
1251 case Teardown::Stop:
1253
1254 case Teardown::Suspend:
1256 return SmTransition(&Suspended);
1257
1258 default:
1261 }
1262}
1263
1267{
1268 if (Event != HubEvent::PortsResetReleased)
1269 return SmUnhandled();
1270
1271 switch (m_Teardown)
1272 {
1273 case Teardown::Fatal:
1275
1279 return SmTransition(&HubResetting);
1280
1281 default:
1283 }
1284}
1285
1288{
1289 if (!RecoveryLimitReached())
1290 {
1292 return SmTransition(&HubResetting);
1293 }
1294
1295 if (IsInBootPath())
1296 return SmTransition(&Halted);
1297
1299}
1300
1303{
1305 return SmTransition(&AwaitingStop);
1306}
1307
1310{
1312 return SmHandled();
1313}
1314
1315/* Hub reset ******************************************************************/
1316
1319{
1320 ResetHub();
1321 return SmHandled();
1322}
1323
1327{
1328 switch (Event)
1329 {
1330 case HubEvent::ResetDone:
1332
1333 case HubEvent::ResetFailed:
1334 return SmTransition(&LoggingReset);
1335
1336 case HubEvent::ResetFailedOnRemoval:
1339
1340 default:
1341 return SmUnhandled();
1342 }
1343}
1344
1347{
1351}
1352
1353/* Requests never run here; the handling only mirrors the previous table */
1357{
1358 switch (Event)
1359 {
1360 case HubEvent::TimerFired:
1361 if (ResetLimitReached())
1363
1364 return SmTransition(&HubResetting);
1365
1366 case HubEvent::PortStatusRequest:
1368 return SmHandled();
1369
1370 case HubEvent::ResetRequested:
1371 return SmHandled();
1372
1373 default:
1374 return SmUnhandled();
1375 }
1376}
1377
1380 _In_ PowerUp Kind)
1381{
1382 if (m_Kind == HubKind::Usb30)
1383 return SmCall(&ProgrammingHubDepth);
1384
1385 return StartPowerUp(Kind);
1386}
1387
1390{
1393}
1394
1398{
1399 switch (Event)
1400 {
1401 case HubEvent::CallSucceeded:
1403
1404 case HubEvent::CallFailed:
1406
1407 default:
1408 return SmUnhandled();
1409 }
1410}
1411
1415{
1416 switch (Event)
1417 {
1418 case HubEvent::ResetDone:
1420
1421 case HubEvent::ResetFailed:
1422 case HubEvent::ResetFailedOnRemoval:
1423 return ResumeResetFailed();
1424
1425 default:
1426 return SmUnhandled();
1427 }
1428}
1429
1432{
1437}
1438
1441{
1443}
1444
1448{
1449 switch (Event)
1450 {
1451 case HubEvent::CallSucceeded:
1453
1454 case HubEvent::CallFailed:
1455 return ResumeResetFailed();
1456
1457 default:
1458 return SmUnhandled();
1459 }
1460}
1461
1462/* External hubs read the hub descriptor to see if power was lost while in Sx */
1465{
1466 if (m_Kind == HubKind::Root)
1468
1471}
1472
1476{
1477 switch (Event)
1478 {
1479 case HubEvent::TransferDone:
1481
1482 case HubEvent::TransferFailed:
1484
1485 default:
1486 return SmUnhandled();
1487 }
1488}
1489
1490/* Suspended ******************************************************************/
1491
1495{
1496 switch (Event)
1497 {
1498 case HubEvent::PortStatusRequest:
1500 return SmHandled();
1501
1502 case HubEvent::ResetRequested:
1503 return SmHandled();
1504
1505 case HubEvent::ReleaseHardware:
1508
1509 default:
1510 return SmUnhandled();
1511 }
1512}
1513
1517{
1518 switch (Event)
1519 {
1520 case HubEvent::ResetRequested:
1522
1523 case HubEvent::PortStatusRequest:
1525 return SmHandled();
1526
1527 case HubEvent::D0Entry:
1530
1531 case HubEvent::D0EntryFromSx:
1533 if (WasResetByParent())
1535
1536 return CheckPowerLoss();
1537
1538 default:
1539 return SmUnhandled();
1540 }
1541}
1542
1546{
1547 if ((Event != HubEvent::D0Entry) && (Event != HubEvent::D0EntryFromSx))
1548 return SmUnhandled();
1549
1552 return SmTransition(&AwaitingStop);
1553}
1554
1557{
1559 return SmHandled();
1560}
1561
1562/* The hub is reset on resume either way; the query only keeps the parent in step */
1566{
1567 if ((Event != HubEvent::D0Entry) && (Event != HubEvent::D0EntryFromSx))
1568 return SmUnhandled();
1569
1572}
1573
1577{
1578 if (Event == HubEvent::DevicesStoppedAfterSuspend)
1580
1581 return SmUnhandled();
1582}
1583
1584/* Hub configuration (called) *************************************************/
1585
1588{
1590 return SmHandled();
1591}
1592
1596{
1597 switch (Event)
1598 {
1599 case HubEvent::TransferDone:
1600 if (!ParseHubDescriptor())
1601 return SmReturn(HubEvent::CallFailed);
1602
1604
1605 case HubEvent::TransferFailed:
1607 return SmReturn(HubEvent::CallFailed);
1608
1610
1611 default:
1612 return SmUnhandled();
1613 }
1614}
1615
1618{
1620 return SmHandled();
1621}
1622
1626{
1627 if (Event == HubEvent::TimerFired)
1629
1630 return SmUnhandled();
1631}
1632
1635{
1637 return SmHandled();
1638}
1639
1643{
1644 switch (Event)
1645 {
1646 case HubEvent::TransferDone:
1647 if (!ParsePowerStatus())
1648 return SmReturn(HubEvent::CallFailed);
1649
1652
1653 case HubEvent::TransferFailed:
1654 return SmReturn(HubEvent::CallFailed);
1655
1656 default:
1657 return SmUnhandled();
1658 }
1659}
1660
1663{
1665 return SmHandled();
1666}
1667
1668/* The first read uses a default length, a second read fetches the whole thing */
1672{
1673 switch (Event)
1674 {
1675 case HubEvent::TransferDone:
1677 {
1680 }
1681
1682 if (!CacheConfigDescriptor())
1683 return SmReturn(HubEvent::CallFailed);
1684
1686
1687 case HubEvent::TransferFailed:
1688 return SmReturn(HubEvent::CallFailed);
1689
1690 default:
1691 return SmUnhandled();
1692 }
1693}
1694
1697{
1699 return SmHandled();
1700}
1701
1705{
1706 switch (Event)
1707 {
1708 case HubEvent::IoctlDone:
1710
1711 case HubEvent::IoctlFailed:
1712 return SmReturn(HubEvent::CallFailed);
1713
1714 default:
1715 return SmUnhandled();
1716 }
1717}
1718
1721{
1723 return SmHandled();
1724}
1725
1729{
1730 switch (Event)
1731 {
1732 case HubEvent::ConfigurationSet:
1733 if (m_Kind == HubKind::Usb30)
1735
1736 return SmReturn(HubEvent::CallSucceeded);
1737
1738 case HubEvent::ConfigurationFailed:
1739 return SmReturn(HubEvent::CallFailed);
1740
1741 default:
1742 return SmUnhandled();
1743 }
1744}
1745
1748{
1749 return SmCall(&ProgrammingHubDepth);
1750}
1751
1755{
1756 if ((Event == HubEvent::CallSucceeded) || (Event == HubEvent::CallFailed))
1757 return SmReturn(Event);
1758
1759 return SmUnhandled();
1760}
1761
1762/* Root hub configuration (called) ********************************************/
1763
1766{
1769 return SmHandled();
1770}
1771
1775{
1776 switch (Event)
1777 {
1778 case HubEvent::IoctlDone:
1780
1781 case HubEvent::IoctlFailed:
1782 return SmReturn(HubEvent::CallFailed);
1783
1784 default:
1785 return SmUnhandled();
1786 }
1787}
1788
1791{
1793 return SmHandled();
1794}
1795
1799{
1800 switch (Event)
1801 {
1802 case HubEvent::IoctlDone:
1804
1805 case HubEvent::IoctlFailed:
1806 return SmReturn(HubEvent::CallFailed);
1807
1808 default:
1809 return SmUnhandled();
1810 }
1811}
1812
1815{
1817 return SmHandled();
1818}
1819
1823{
1824 switch (Event)
1825 {
1826 case HubEvent::IoctlDone:
1827 return SmReturn(HubEvent::CallSucceeded);
1828
1829 case HubEvent::IoctlFailed:
1830 return SmReturn(HubEvent::CallFailed);
1831
1832 default:
1833 return SmUnhandled();
1834 }
1835}
1836
1837/* Hub depth (called) *********************************************************/
1838
1841{
1842 SetHubDepth();
1843 return SmHandled();
1844}
1845
1849{
1850 switch (Event)
1851 {
1852 case HubEvent::TransferDone:
1853 return SmReturn(HubEvent::CallSucceeded);
1854
1855 case HubEvent::TransferFailed:
1856 return SmReturn(HubEvent::CallFailed);
1857
1858 default:
1859 return SmUnhandled();
1860 }
1861}
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
#define VOID
Definition: acefi.h:82
unsigned char BOOLEAN
Definition: actypes.h:127
#define DPRINT1
Definition: precomp.h:8
NTSTATUS ReadStatus
Definition: bootdev.cpp:134
HubFdo * Hub
Definition: bootdev.cpp:261
USHORT Change
Definition: bootdev.cpp:133
Definition: fdo.h:132
SM_RESULT OnAckingHubChange(_In_ HubEvent Event)
Definition: hubsm.cpp:1029
VOID Initialize(_In_ HubFdo *Hub, _In_ HubKind Kind)
Definition: hubsm.cpp:253
static const State ReadingConfigDescriptor
Definition: hubsm.h:204
VOID BugcheckBootHub()
Definition: fdo.cpp:1253
static const State Listening
Definition: hubsm.h:170
SM_RESULT SendInterrupt(_In_ BOOLEAN ClearPipeResets)
Definition: hubsm.cpp:966
SM_RESULT EnterSettingConfiguration()
Definition: hubsm.cpp:1720
SM_RESULT OnAwaitingOverCurrentTimer(_In_ HubEvent Event)
Definition: hubsm.cpp:1089
VOID SignalPnpEvent()
Definition: fdo.cpp:1222
static const State AwaitingReleaseAfterFailure
Definition: hubsm.h:164
static const State Deleted
Definition: hubsm.h:167
SM_RESULT OnAsleep(_In_ HubEvent Event)
Definition: hubsm.cpp:1493
VOID QueueSuspendToDevices()
Definition: fanout.cpp:938
VOID QueueResumeInS0ToDevices()
Definition: fanout.cpp:962
const State * m_PortStatusReturn
Definition: hubsm.h:579
VOID ReleasePowerReference()
Definition: fdo.cpp:1216
SM_RESULT EnterReconfiguring()
Definition: hubsm.cpp:379
VOID ArmResetRetryTimer()
Definition: fdo.cpp:1318
SM_RESULT EnterReadingHubDescriptor()
Definition: hubsm.cpp:1587
SM_RESULT OnAwaitingAddDevice(_In_ HubEvent Event)
Definition: hubsm.cpp:295
SM_RESULT StoreDromWordAndContinue()
Definition: hubsm.cpp:640
SM_RESULT OnAwaitingReleaseHardware(_In_ HubEvent Event)
Definition: hubsm.cpp:709
SM_RESULT ResumeResetFailed()
Definition: hubsm.cpp:1431
SM_RESULT EnterFinishingConfiguration()
Definition: hubsm.cpp:1747
BOOLEAN PortInterruptRefsReleased()
Definition: fanout.cpp:859
VOID QueueResumeToDevices()
Definition: fanout.cpp:956
VOID UpdateControllerHubInfo()
Definition: ucxlink.cpp:421
VOID ReadDromRegister(_In_ USHORT Register)
Definition: hubdrom.cpp:134
VOID ClearPipeResetCount()
Definition: fdo.cpp:1344
SM_RESULT OnResettingPipe(_In_ HubEvent Event)
Definition: hubsm.cpp:1099
HubChange LostHubChange()
Definition: hubreq.cpp:639
SM_RESULT EnterReadingStandardStatus()
Definition: hubsm.cpp:1634
VOID InitializeResetCount()
Definition: fdo.cpp:1338
BOOLEAN WasResetByParent()
Definition: upstream.cpp:400
SM_RESULT OnReconfiguring(_In_ HubEvent Event)
Definition: hubsm.cpp:388
VOID InitializeDescriptorRetries()
Definition: fdo.cpp:1350
BOOLEAN RecoveryLimitReached()
Definition: fdo.cpp:1391
ULONG MailboxValue()
Definition: hubdrom.cpp:120
static const State ResettingOnResume
Definition: hubsm.h:191
DromPhase m_DromPhase
Definition: hubsm.h:585
VOID GetRootHub20Ports()
Definition: ucxlink.cpp:212
SM_RESULT EnterReconfiguringAfterResume()
Definition: hubsm.cpp:1440
VOID ReleaseDromBuffer()
Definition: hubdrom.cpp:178
SM_RESULT OnReadingStandardStatus(_In_ HubEvent Event)
Definition: hubsm.cpp:1641
BOOLEAN IsDromReadWanted()
Definition: hubdrom.cpp:114
static const State LoggingReset
Definition: hubsm.h:188
VOID ParseDromIdentity()
Finds the router identity entry of a version 1 DROM, bounds checking each entry.
Definition: hubdrom.cpp:201
SM_RESULT HandleHubStatusFault()
Definition: hubsm.cpp:1071
VOID GetRootHub30Ports()
Definition: ucxlink.cpp:296
static const State PortsResetting
Definition: hubsm.h:183
SM_RESULT EnterReconfiguringAfterReset()
Definition: hubsm.cpp:1389
SM_RESULT OnUpdatingController(_In_ HubEvent Event)
Definition: hubsm.cpp:1703
ULONG DromDataLength()
Definition: hubdrom.cpp:126
static const State DromRead
Definition: hubsm.h:153
SM_RESULT OnSurpriseRemoved(_In_ HubEvent Event)
Definition: hubsm.cpp:754
VOID ResetHub()
Definition: upstream.cpp:301
PowerUp m_PowerUp
Definition: hubsm.h:577
VOID QueueSurpriseRemovalToPorts()
Definition: fanout.cpp:908
static const State ProgrammingHubDepth
Definition: hubsm.h:215
VOID GetHubDescriptor()
Definition: hubreq.cpp:357
static const State AwaitingStop
Definition: hubsm.h:165
static const State AwaitingInterruptRefs
Definition: hubsm.h:179
VOID QueueFakeStatusChangeToPorts()
Definition: fanout.cpp:926
static const State ReadingRootHub20Ports
Definition: hubsm.h:211
VOID SmDereference()
Definition: hubsm.cpp:281
SM_RESULT QuiesceWithoutInterrupt(_In_ Teardown Reason)
Definition: hubsm.cpp:1138
SM_RESULT OnAwaitingDescriptorRetry(_In_ HubEvent Event)
Definition: hubsm.cpp:1624
SM_RESULT OnReconfiguringAfterResume(_In_ HubEvent Event)
Definition: hubsm.cpp:1446
BOOLEAN CacheConfigDescriptor()
Definition: hubreq.cpp:489
static const State HubResetting
Definition: hubsm.h:187
SM_RESULT EnterConfiguring()
Definition: hubsm.cpp:351
SM_RESULT OnDromSendingCommand(_In_ HubEvent Event)
Definition: hubsm.cpp:554
VOID StartStatusChangeRead()
Definition: hubreq.cpp:705
VOID QueryControllerInfo()
Definition: ucxlink.cpp:150
static const State CancelingInterrupt
Definition: hubsm.h:178
SM_RESULT EnterReportingFailure()
Definition: hubsm.cpp:1302
SM_RESULT CheckDromStatus()
Definition: hubsm.cpp:583
SM_RESULT EnterUpdatingController()
Definition: hubsm.cpp:1696
VOID SelectHubConfiguration()
Definition: upstream.cpp:128
SM_RESULT EnterDromReadingFirstStatus()
Definition: hubsm.cpp:501
SM_RESULT OnStopped(_In_ HubEvent Event)
Definition: hubsm.cpp:692
static const State NotListening
Definition: hubsm.h:171
VOID StartDescriptorRetryTimer()
Definition: fdo.cpp:1330
VOID SmReference()
Definition: hubsm.cpp:275
SM_RESULT EnterReadingRootHubInfo()
Definition: hubsm.cpp:1765
static const State DromReadingFirstStatus
Definition: hubsm.h:154
SM_RESULT HandleHubChange(_In_ HubChange Change)
None comes only from the lost change query, Error only from the pending one.
Definition: hubsm.cpp:1050
VOID AcquirePowerReference()
Definition: fdo.cpp:1210
static const State DrainingInterruptRefs
Definition: hubsm.h:177
VOID QueryErrataFlags()
SM_RESULT StartDromOrSkip(_In_ const State *Next)
Reads the router DROM through the vendor mailbox; no failure here fails the start.
Definition: hubsm.cpp:473
static const State QueryingParentInfo
Definition: hubsm.h:150
VOID UseDromHeaderBuffer()
Definition: hubdrom.cpp:150
static const State Halted
Definition: hubsm.h:186
StatusRead
Definition: hubsm.h:139
SM_RESULT EnterLoggingReset()
Definition: hubsm.cpp:1346
SM_RESULT EnterDromReadingWord()
Definition: hubsm.cpp:622
SM_RESULT OnSuspendedResetPending(_In_ HubEvent Event)
Definition: hubsm.cpp:1564
static const State Down
Definition: hubsm.h:161
VOID QueueSuspendToPorts()
Definition: fanout.cpp:902
VOID QueueStatusChangeToPorts()
Definition: fanout.cpp:920
SM_RESULT OnReadingHubStatus(_In_ HubEvent Event)
Definition: hubsm.cpp:987
SM_RESULT OnConfiguring(_In_ HubEvent Event)
Definition: hubsm.cpp:362
SM_RESULT OnAwaitingReleaseAfterFailure(_In_ HubEvent Event)
Definition: hubsm.cpp:720
BOOLEAN m_ReleaseToUnconfigured
Definition: hubsm.h:580
VOID QueueResetToPorts()
Definition: fanout.cpp:914
static const State AwaitingAddDevice
Definition: hubsm.h:148
VOID AckHubChange()
Definition: hubreq.cpp:348
BOOLEAN IsErrorFatal()
Definition: hubreq.cpp:651
HubFdo * m_Hub
Definition: hubsm.h:574
static const State AckingHubChange
Definition: hubsm.h:174
static const State CheckingRecoveryLimit
Definition: hubsm.h:184
SM_RESULT EnterDromReadingStatus()
Definition: hubsm.cpp:565
SM_RESULT EnterAwaitingDescriptorRetry()
Definition: hubsm.cpp:1617
BOOLEAN m_FullConfigRead
Definition: hubsm.h:581
VOID GetStandardStatus()
Definition: hubreq.cpp:388
SM_RESULT OnReconfiguringAfterReset(_In_ HubEvent Event)
Definition: hubsm.cpp:1396
SM_RESULT StartDromWords()
The DWORD count is rounded up from the total size, not from the length field.
Definition: hubsm.cpp:600
static const State DromWritingMetadata
Definition: hubsm.h:155
static const State PortsReleasing
Definition: hubsm.h:182
VOID LogResetRecovery()
Definition: fdo.cpp:1266
SM_RESULT EnterQueryingParentInfo()
Definition: hubsm.cpp:327
static const State Configuring
Definition: hubsm.h:151
VOID GetHubStatus()
Definition: hubreq.cpp:397
static const State DromSendingCommand
Definition: hubsm.h:156
static const State QueryingErrata
Definition: hubsm.h:159
VOID ReferenceHub()
Definition: fdo.cpp:1190
SM_RESULT OnResettingOnResume(_In_ HubEvent Event)
Definition: hubsm.cpp:1413
SM_RESULT OnAwaitingInterruptRefs(_In_ HubEvent Event)
Definition: hubsm.cpp:1201
SM_RESULT CallHubDepthOr(_In_ PowerUp Kind)
Definition: hubsm.cpp:1379
SM_RESULT OnProgrammingHubDepth(_In_ HubEvent Event)
Definition: hubsm.cpp:1847
SM_RESULT OnNotListening(_In_ HubEvent Event)
Definition: hubsm.cpp:907
SM_RESULT ReadStatus(_In_ StatusRead Purpose)
Definition: hubsm.cpp:978
VOID GetConfigDescriptor(_In_ BOOLEAN FullLength)
Definition: hubreq.cpp:417
VOID SmQueuePassive()
Definition: hubsm.cpp:287
static const State Stopped
Definition: hubsm.h:162
static const State Unconfigured
Definition: hubsm.h:149
BOOLEAN ConfigDescriptorTruncated()
Definition: hubreq.cpp:478
SM_RESULT OnDevicesReleasing(_In_ HubEvent Event)
Definition: hubsm.cpp:1221
SM_RESULT OnReadingConfigDescriptor(_In_ HubEvent Event)
Definition: hubsm.cpp:1670
SM_RESULT OnReadingRootHubInfo(_In_ HubEvent Event)
Definition: hubsm.cpp:1773
BOOLEAN DescriptorRetriesExhausted()
Definition: fdo.cpp:1380
SM_RESULT OnCancelingInterrupt(_In_ HubEvent Event)
Definition: hubsm.cpp:1191
static const State ReadingRootHubInfo
Definition: hubsm.h:210
static const State ReadingStandardStatus
Definition: hubsm.h:203
VOID GetParentInfo()
Definition: upstream.cpp:378
static const State DromReadingStatus
Definition: hubsm.h:157
SM_RESULT OnReadingRootHub20Ports(_In_ HubEvent Event)
Definition: hubsm.cpp:1797
static const State Reconfiguring
Definition: hubsm.h:152
SM_RESULT OnReadingPortStatus(_In_ HubEvent Event)
Definition: hubsm.cpp:947
VOID QueueStopToDevices()
Definition: fanout.cpp:932
static const State ResettingPipe
Definition: hubsm.h:176
SM_RESULT OnReadingHubDescriptor(_In_ HubEvent Event)
Definition: hubsm.cpp:1594
static const State AwaitingStopAfterSuspend
Definition: hubsm.h:198
SM_RESULT EnterReadingConfigDescriptor()
Definition: hubsm.cpp:1662
static const State RecycleSuspended
Definition: hubsm.h:196
static const State SettingConfiguration
Definition: hubsm.h:206
HubCheck CheckHubChangeBit()
Definition: hubreq.cpp:765
static const State Suspended
Definition: hubsm.h:195
SM_RESULT QuiesceWithInterrupt(_In_ Teardown Reason)
Definition: hubsm.cpp:1119
SM_RESULT OnAwaitingStopAfterSuspend(_In_ HubEvent Event)
Definition: hubsm.cpp:1575
SM_RESULT OnDown(_In_ HubEvent Event)
Definition: hubsm.cpp:674
ULONG m_DromIndex
Definition: hubsm.h:583
SM_RESULT EnterCheckingRecoveryLimit()
Definition: hubsm.cpp:1287
VOID QueueStartToDevices()
Definition: fanout.cpp:950
VOID ResetStatusChangePipe()
Definition: upstream.cpp:247
SM_RESULT StartPowerUp(_In_ PowerUp Kind)
Definition: hubsm.cpp:766
SM_RESULT OnQueryingParentInfo(_In_ HubEvent Event)
Definition: hubsm.cpp:334
SM_RESULT OnUnconfigured(_In_ HubEvent Event)
Definition: hubsm.cpp:306
SM_RESULT OnAwaitingResetRetry(_In_ HubEvent Event)
Definition: hubsm.cpp:1355
static const State ReadingRootHub30Ports
Definition: hubsm.h:212
VOID CancelStatusChangeRead()
Definition: hubreq.cpp:757
HubCheck SelectHubChange()
Definition: hubreq.cpp:603
BOOLEAN OverCurrentCleared()
Definition: hubreq.cpp:645
static const SM_EVENT_INFO EventInfo[]
Definition: hubsm.h:105
VOID QueueResumeWithResetToDevices()
Definition: fanout.cpp:968
static const State CheckingPowerLoss
Definition: hubsm.h:193
SM_RESULT OnPortsAcquiring(_In_ HubEvent Event)
Definition: hubsm.cpp:795
static const State PortsAcquiring
Definition: hubsm.h:168
SM_RESULT OnPortsReleasing(_In_ HubEvent Event)
Definition: hubsm.cpp:1243
ULONGLONG m_DromPollStart
Definition: hubsm.h:582
BOOLEAN ParseHubDescriptor()
Definition: hubreq.cpp:552
BOOLEAN IsInBootPath()
Definition: fdo.cpp:1304
SM_RESULT OnSettingConfiguration(_In_ HubEvent Event)
Definition: hubsm.cpp:1727
SM_RESULT FailStart(_In_ BOOLEAN FirstStart)
A failed first start returns to Unconfigured, a failed restart to Stopped.
Definition: hubsm.cpp:417
static const State SuspendedResetPending
Definition: hubsm.h:197
SM_RESULT ReadPortStatus(_In_ const State *ReturnTo)
Definition: hubsm.cpp:938
SM_RESULT EnterDromSendingCommand()
Definition: hubsm.cpp:547
static const State ReadingPortStatus
Definition: hubsm.h:172
HubFdo * Hub() const
Definition: hubsm.h:100
VOID QueueResumeToPorts()
Definition: fanout.cpp:878
SM_RESULT OnDrainingInterruptRefs(_In_ HubEvent Event)
Definition: hubsm.cpp:1172
SM_RESULT OnDevicesAcquiring(_In_ HubEvent Event)
Definition: hubsm.cpp:829
const State * m_DromNext
Definition: hubsm.h:586
VOID LogResetOnResume()
Definition: fdo.cpp:1298
VOID FailPortStatus(_In_ BOOLEAN HardwareError)
Definition: hubreq.cpp:884
ULONG m_DromWords
Definition: hubsm.h:584
SM_RESULT OnDromRead(_In_ HubEvent Event)
Definition: hubsm.cpp:490
VOID ReplyPortStatus()
Definition: hubreq.cpp:818
SM_RESULT EnterQueryingErrata()
Definition: hubsm.cpp:426
SM_RESULT EnterSuspendedResetPending()
Definition: hubsm.cpp:1556
SM_RESULT EnterDromWritingMetadata()
Definition: hubsm.cpp:527
SM_RESULT EnterReadingRootHub20Ports()
Definition: hubsm.cpp:1790
SM_RESULT OnHubResetting(_In_ HubEvent Event)
Definition: hubsm.cpp:1325
VOID QueueStopAfterSuspendToDevices()
Definition: fanout.cpp:944
SM_RESULT CheckPowerLoss()
Definition: hubsm.cpp:1464
static const State ReconfiguringAfterResume
Definition: hubsm.h:192
static const State UpdatingController
Definition: hubsm.h:205
VOID ReportFailureToPnp()
Definition: fdo.cpp:1241
static const State FinishingConfiguration
Definition: hubsm.h:207
BOOLEAN ParsePowerStatus()
Definition: hubreq.cpp:596
VOID AllowHubReset()
Definition: fanout.cpp:865
SM_RESULT OnListening(_In_ HubEvent Event)
Definition: hubsm.cpp:859
SM_RESULT EnterHubResetting()
Definition: hubsm.cpp:1318
SM_RESULT EnterProgrammingHubDepth()
Definition: hubsm.cpp:1840
SM_RESULT OnDromWritingMetadata(_In_ HubEvent Event)
Definition: hubsm.cpp:537
static const State SurpriseRemoved
Definition: hubsm.h:166
static const State ReconfiguringAfterReset
Definition: hubsm.h:190
BOOLEAN PipeResetLimitReached()
Definition: fdo.cpp:1369
SM_RESULT OnAwaitingStop(_In_ HubEvent Event)
Definition: hubsm.cpp:732
VOID SetHubDepth()
Definition: hubreq.cpp:408
BOOLEAN CreateChildPorts()
Definition: fanout.cpp:853
static const State Asleep
Definition: hubsm.h:194
VOID QueueStartToPorts()
Definition: fanout.cpp:871
static const State AwaitingResetRetry
Definition: hubsm.h:189
SM_RESULT OnCheckingPowerLoss(_In_ HubEvent Event)
Definition: hubsm.cpp:1474
static const State DromReadingWord
Definition: hubsm.h:158
static const State DevicesAcquiring
Definition: hubsm.h:169
static const State AwaitingReleaseHardware
Definition: hubsm.h:163
SM_RESULT EnterSignalPnp()
Definition: hubsm.cpp:437
VOID GetPortStatus()
Definition: hubreq.cpp:790
HubChange PendingHubChange()
Definition: hubreq.cpp:632
SM_RESULT OnFinishingConfiguration(_In_ HubEvent Event)
Definition: hubsm.cpp:1753
SM_RESULT OnDromReadingWord(_In_ HubEvent Event)
Definition: hubsm.cpp:629
HubKind m_Kind
Definition: hubsm.h:575
static const State ReportingFailure
Definition: hubsm.h:185
SM_RESULT EnterReadingRootHub30Ports()
Definition: hubsm.cpp:1814
SM_RESULT OnAwaitingD0(_In_ HubEvent Event)
Definition: hubsm.cpp:444
SM_RESULT EnterHalted()
Definition: hubsm.cpp:1309
SM_RESULT OverCurrentError()
Definition: hubsm.cpp:1080
SM_RESULT OnRecycleSuspended(_In_ HubEvent Event)
Definition: hubsm.cpp:1544
static const State AwaitingD0
Definition: hubsm.h:160
static const State DevicesReleasing
Definition: hubsm.h:181
SM_RESULT StartHubConfiguration()
Definition: hubsm.cpp:406
SM_RESULT OnAwaitingInterruptEnable(_In_ HubEvent Event)
Definition: hubsm.cpp:1211
VOID QueueStopToPorts()
Definition: fanout.cpp:896
BOOLEAN IsDepthZero()
Definition: fdo.cpp:1310
static const State ReadingHubDescriptor
Definition: hubsm.h:201
SM_RESULT OnSuspended(_In_ HubEvent Event)
Definition: hubsm.cpp:1515
VOID SignalPnpFailure()
Definition: fdo.cpp:1231
BOOLEAN ResetLimitReached()
Definition: fdo.cpp:1356
VOID ArmOverCurrentTimer()
Definition: fdo.cpp:1324
static const State AwaitingDescriptorRetry
Definition: hubsm.h:202
VOID QueueResumeInS0ToPorts()
Definition: fanout.cpp:884
Teardown m_Teardown
Definition: hubsm.h:576
static const State AwaitingInterruptEnable
Definition: hubsm.h:180
VOID DereferenceHub()
Definition: fdo.cpp:1196
SM_RESULT OnDromReadingStatus(_In_ HubEvent Event)
Definition: hubsm.cpp:572
static const State AwaitingOverCurrentTimer
Definition: hubsm.h:175
static const State ReadingHubStatus
Definition: hubsm.h:173
SM_RESULT AfterInterruptQuiet()
Definition: hubsm.cpp:1153
VOID StoreDromWord(_In_ ULONG Index)
Definition: hubdrom.cpp:189
StatusRead m_StatusRead
Definition: hubsm.h:578
SM_RESULT OnDromReadingFirstStatus(_In_ HubEvent Event)
Definition: hubsm.cpp:508
SM_RESULT FinishDrom()
Definition: hubsm.cpp:659
VOID QueuePassiveWork()
Definition: fdo.cpp:1202
VOID WriteDromRegister(_In_ USHORT Register, _In_ ULONG Value)
Definition: hubdrom.cpp:141
static const HubEvent ResetDiscards[]
Definition: hubsm.h:217
VOID QueueResumeWithResetToPorts()
Definition: fanout.cpp:890
BOOLEAN AllocateDromBuffer(_In_ ULONG Length)
Definition: hubdrom.cpp:158
SM_RESULT OnPortsResetting(_In_ HubEvent Event)
Definition: hubsm.cpp:1265
VOID GetRootHubInfo()
Definition: ucxlink.cpp:189
SM_RESULT OnReadingRootHub30Ports(_In_ HubEvent Event)
Definition: hubsm.cpp:1821
VOID SmInitialize(_In_ const State *Initial)
Definition: smengine.h:349
static SM_RESULT SmTransition(_In_ const State *Target)
Definition: smengine.h:194
static SM_RESULT SmReturn(_In_ HubEvent Ev)
Definition: smengine.h:217
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
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG DataLength
Definition: dispmprt.h:233
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static const USHORT HubMailboxMetadata
Definition: hubsm.cpp:18
static const ULONG HubDromReadCommand
Definition: hubsm.cpp:24
static const ULONG HubMailboxDataWords
Definition: hubsm.cpp:20
#define HSM_REQ
Definition: hubsm.cpp:79
static const ULONGLONG HubDromBusyLimit
Definition: hubsm.cpp:34
static const ULONG HubDromHeaderWords
Definition: hubsm.cpp:27
#define HSM_CRIT
Definition: hubsm.cpp:81
static const ULONG HubDromMinimumLength
Definition: hubsm.cpp:31
#define HSM_PASSIVE
Definition: hubsm.cpp:80
static const ULONG HubMailboxBusy
Definition: hubsm.cpp:21
static const USHORT HubMailboxOpcode
Definition: hubsm.cpp:19
static const ULONG HubDromLengthBias
Definition: hubsm.cpp:30
HubMachine M
Definition: hubsm.cpp:83
HubKind
Definition: hubsm.h:64
HubEvent
Definition: hubsm.h:15
@ ResetRequested
HubChange
Definition: hubsm.h:80
PVOID PVOID PWCHAR PVOID USHORT PULONG Reason
Definition: env.c:47
#define min(a, b)
Definition: monoChain.cc:55
#define _In_
Definition: no_sal2.h:158
unsigned short USHORT
Definition: pedump.c:61
#define KeQueryInterruptTime()
Definition: ke.h:37
PACPI_METHOD_ARGUMENT Next
Definition: slotdev.cpp:96
@ SmEventRequest
Definition: smengine.h:25
@ SmEventCompletion
Definition: smengine.h:24
@ SmEventCritical
Definition: smengine.h:27
#define DPRINT
Definition: sndvol32.h:73
One state. Handler gets every event the state sees.
Definition: smengine.h:93
uint64_t ULONGLONG
Definition: typedefs.h:67
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ PHYSICAL_ADDRESS _In_ PHYSICAL_ADDRESS _In_ SIZE_T TotalBytes
Definition: mmfuncs.h:228