ReactOS 0.4.17-dev-1281-g065abb3
devsm_config.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, configured device, client requests
5 * and configuration changes
6 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
7 */
8
9/* INCLUDES *******************************************************************/
10
11#include "usbhub3.h"
12
13/* GLOBALS ********************************************************************/
14
16
17/* A configuration is selected; handles the client requests both children share */
19 { NULL, "Configured", 0, &DeviceMachine::OnConfigured, NULL };
20
21/* Configured and the PDO in D0 */
24
25/* Configured before PnP started the PDO; some client drivers do that */
27 { &Configured, "ConfiguredNotStarted", SM_STATE_TAKES_REQUESTS,
30
31/* Runs the configure sub machine; m_AfterConfigure decides what follows */
34
35/* Runs the set interface sub machine for a client request */
37 { NULL, "SettingInterface", 0,
39
40/* Programs endpoints and, for SuperSpeed, link power; m_AfterProgram gets the result */
42 { NULL, "ProgrammingEndpoints", SM_STATE_YIELDS_TO_CALLER,
44
45/* Link power settings changed while configured */
47 { NULL, "UpdatingLinkPower", 0,
49
50/* Configured device leaving D0 through the suspend sub machine */
52 { NULL, "SuspendingConfigured", 0,
54
55/* Same for the device holding the boot, paging or hibernation file */
57 { NULL, "BootDeviceSuspending", 0,
59
61 { NULL, "SuspendedConfigured", SM_STATE_TAKES_REQUESTS,
63
65 { NULL, "BootDeviceSuspended", SM_STATE_TAKES_REQUESTS,
67
68/* Configured device suspended because the hub suspended */
70 { NULL, "ConfiguredHubSuspended", 0,
72
73/* Asked the port machine to get the boot device ready for hibernation */
75 { NULL, "PreparingHibernation", 0,
77
78/* FUNCTIONS ******************************************************************/
79
80/* Back to the configured D0 state, or to waiting for a start for an early configuration */
83{
84 if (PdoStarted())
86
88}
89
92{
94}
95
96/* CONFIGURED *****************************************************************/
97
101{
102 switch (Event)
103 {
104 case DsmEvent::ClientUnconfigure:
107
108 case DsmEvent::ClientResetDevice:
110 if (IsBootDevice())
112
114
115 case DsmEvent::ClientStreams:
117 return ForwardStreams(NULL);
118
119 case DsmEvent::ClientSelectConfig:
122
123 case DsmEvent::ClientSetInterface:
126
128
129 case DsmEvent::ClientClearStall:
130 if (!FindClientPipe())
132
134 return ClientDoneOk();
135
138
139 case DsmEvent::DeviceTextQuery:
142
143 case DsmEvent::ClientSyncResetPipe:
144 if (!FindClientPipe())
146
148 return ClientDoneOk();
149
152
153 case DsmEvent::HubGetDescriptor:
157
158 case DsmEvent::ClientResetPipe:
159 if (!FindClientPipe())
161
163 return ClientDoneOk();
164
165 if (PipeIsIsochronous())
166 {
169 }
170
173
174 default:
175 return SmUnhandled();
176 }
177}
178
181{
183 return BackToConfigured();
184}
185
188{
190 return BackToConfigured();
191}
192
193/* A pipe request finished in the controller or on the bus */
197{
198 switch (Event)
199 {
200 case DsmEvent::TransferDone:
201 case DsmEvent::ControllerIoctlDone:
202 return ClientDoneOk();
203
204 case DsmEvent::TransferFailed:
205 case DsmEvent::ControllerIoctlFailed:
207
208 default:
209 return SmUnhandled();
210 }
211}
212
213/* Reset pipe on a non isochronous pipe: halt cleared, now reset it in the controller */
217{
218 switch (Event)
219 {
220 case DsmEvent::TransferDone:
223
224 case DsmEvent::TransferFailed:
226
227 default:
228 return SmUnhandled();
229 }
230}
231
235{
236 if ((Event != DsmEvent::TransferDone) && (Event != DsmEvent::TransferFailed))
237 return SmUnhandled();
238
240}
241
245{
246 if (Event != DsmEvent::ControllerIoctlDone)
247 return SmUnhandled();
248
250}
251
254{
257 return BackToUnconfigured();
258}
259
262{
265}
266
270{
271 switch (Event)
272 {
273 case DsmEvent::ClientCyclePort:
275 return SmHandled();
276
277 case DsmEvent::PdoPowerUp:
278 case DsmEvent::PdoInstallMsOsExt:
280
281 case DsmEvent::HubSuspending:
284
285 case DsmEvent::PdoPrepareHibernate:
288
289 case DsmEvent::NoPingResponse:
292
293 return ConfiguredCyclePort();
294
295 case DsmEvent::PortDetached:
296 return PurgeOnDetach();
297
298 case DsmEvent::PdoPowerDown:
300 if (IsBootDevice())
302
304
305 case DsmEvent::LpmSettingChanged:
307
308 case DsmEvent::PdoPowerDownFinal:
310
311 default:
312 return SmUnhandled();
313 }
314}
315
318{
320 return SmTransition(&ConfiguredOn);
321}
322
323/* An error the device cannot recover from: cycle the port and wait */
326{
327 AskPortCycle();
329}
330
334{
335 if (Event != DsmEvent::ControllerIoctlDone)
336 return SmUnhandled();
337
338 return StopDecision();
339}
340
341/* PDO stopped for good: disable the device, or keep it enabled for the next start */
344{
345 if (DisableWhenUnused())
347
350 return SmTransition(&StoppedReady);
351}
352
356{
357 if (Event != DsmEvent::ControllerIoctlDone)
358 return SmUnhandled();
359
361}
362
366{
367 switch (Event)
368 {
369 case DsmEvent::PortFault:
371 return ConfiguredCyclePort();
372
373 case DsmEvent::PortSuspendDone:
375
376 case DsmEvent::PortDetached:
379
380 default:
381 return SmUnhandled();
382 }
383}
384
385/* Hibernation purge also clears the reset on last resume mark */
386VOID
388{
391}
392
396{
397 if (Event != DsmEvent::ControllerIoctlDone)
398 return SmUnhandled();
399
401}
402
405{
407 return SmHandled();
408}
409
413{
414 switch (Event)
415 {
416 case DsmEvent::PortSuspendDone:
418
419 case DsmEvent::PortDetached:
421
422 case DsmEvent::PortFault:
424 return BootDeviceFailed();
425
426 default:
427 return SmUnhandled();
428 }
429}
430
434{
435 switch (Event)
436 {
437 case DsmEvent::PdoPreStart:
438 AckPreStart();
439 return SmHandled();
440
441 case DsmEvent::PdoPowerUp:
443
444 case DsmEvent::PdoCleanup:
446
447 case DsmEvent::PortDetached:
449
450 case DsmEvent::HubStopping:
452
453 case DsmEvent::HubSuspending:
455
456 default:
457 return SmUnhandled();
458 }
459}
460
464{
465 if (Event != DsmEvent::ControllerIoctlDone)
466 return SmUnhandled();
467
469}
470
474{
475 if (Event != DsmEvent::ControllerIoctlDone)
476 return SmUnhandled();
477
479}
480
484{
485 if (Event != DsmEvent::ControllerIoctlDone)
486 return SmUnhandled();
487
489}
490
491/* SELECT CONFIGURATION *******************************************************/
492
495{
496 if (!SelectConfigValid())
497 return SelectConfigFailed(TRUE);
498
499 if (!PrepareConfigLists())
501
503 return SmTransition(&Configuring);
504}
505
506/* The two failures differ in the status they complete the request with */
509 _In_ BOOLEAN LastStatus)
510{
511 if (LastStatus)
513 else
515
517 return BackToConfigured();
518
519 return BackToUnconfigured();
520}
521
525{
526 switch (Event)
527 {
528 case DsmEvent::Succeeded:
531 return BackToConfigured();
532
533 case DsmEvent::Failed:
535
536 case DsmEvent::PortDetached:
538 return DetachConfigured();
539
540 default:
541 return SmUnhandled();
542 }
543}
544
547{
550 return BackToUnconfigured();
551}
552
553/* CONFIGURE SUB MACHINE ******************************************************/
554
557{
560}
561
565{
566 switch (Event)
567 {
568 case DsmEvent::Succeeded:
569 case DsmEvent::Failed:
570 case DsmEvent::PortDetached:
571 return (this->*m_AfterConfigure)(Event);
572
573 default:
574 return SmUnhandled();
575 }
576}
577
581{
582 if (Event != DsmEvent::ControllerIoctlDone)
583 return SmUnhandled();
584
586}
587
590{
594}
595
596/* Configuration or one alternate setting set; set the next one or create endpoints */
600{
601 switch (Event)
602 {
603 case DsmEvent::TransferDone:
605 {
608 }
609
611
612 case DsmEvent::TransferFailed:
613 return ConfigureFailed();
614
615 default:
616 return SmUnhandled();
617 }
618}
619
622{
623 if (!CreateEndpoints())
624 return ConfigureFailed();
625
628}
629
632{
634 return EndWith(DsmEvent::Failed);
635}
636
640{
641 if (Event == DsmEvent::Succeeded)
642 return EndWith(DsmEvent::Succeeded);
643
644 return EndWith(DsmEvent::Failed);
645}
646
647/* PROGRAMMING ENDPOINTS ******************************************************/
648
651{
654
657}
658
662{
663 if ((Event != DsmEvent::Succeeded) && (Event != DsmEvent::Failed))
664 return SmUnhandled();
665
666 return (this->*m_AfterProgram)(Event);
667}
668
672{
673 switch (Event)
674 {
675 case DsmEvent::ControllerIoctlDone:
676 return (this->*m_AfterProgram)(DsmEvent::Succeeded);
677
678 case DsmEvent::ControllerIoctlFailed:
679 return (this->*m_AfterProgram)(DsmEvent::Failed);
680
681 default:
682 return SmUnhandled();
683 }
684}
685
686/* SET INTERFACE **************************************************************/
687
690{
692}
693
697{
698 switch (Event)
699 {
700 case DsmEvent::Failed:
702
703 case DsmEvent::Succeeded:
705 return ClientDoneOk();
706
707 case DsmEvent::PortDetached:
709 return DetachConfigured();
710
711 default:
712 return SmUnhandled();
713 }
714}
715
718{
721
723}
724
727{
728 if (!CreateEndpoints())
729 {
732 }
733
736}
737
741{
742 if (Event != DsmEvent::ControllerIoctlDone)
743 return SmUnhandled();
744
745 return InterfaceRestoreOld();
746}
747
751{
752 if (Event == DsmEvent::Succeeded)
753 {
756 }
757
758 return InterfaceRestoreOld();
759}
760
761/* Put the old alternate setting back on the device so it matches the old endpoints */
764{
767}
768
772{
773 if ((Event != DsmEvent::TransferDone) && (Event != DsmEvent::TransferFailed))
774 return SmUnhandled();
775
777}
778
782{
783 switch (Event)
784 {
785 case DsmEvent::TransferDone:
787
788 case DsmEvent::TransferFailed:
791
792 default:
793 return SmUnhandled();
794 }
795}
796
800{
801 if (Event != DsmEvent::ControllerIoctlDone)
802 return SmUnhandled();
803
805}
806
809{
811 return EndWith(DsmEvent::Succeeded);
812}
813
816{
819}
820
823{
825 return EndWith(DsmEvent::Failed);
826}
827
828/* LINK POWER WHILE CONFIGURED ************************************************/
829
832{
835
836 return SmTransition(&ConfiguredOn);
837}
838
842{
843 switch (Event)
844 {
845 case DsmEvent::Succeeded:
846 return SmTransition(&ConfiguredOn);
847
848 case DsmEvent::Failed:
849 return ConfiguredCyclePort();
850
851 case DsmEvent::PortDetached:
852 return PurgeOnDetach();
853
854 default:
855 return SmUnhandled();
856 }
857}
858
859/* SUSPEND AND RESUME WHILE CONFIGURED ****************************************/
860
863{
865}
866
870{
871 switch (Event)
872 {
873 case DsmEvent::Succeeded:
874 case DsmEvent::Failed:
876
877 case DsmEvent::PortDetached:
879 return DetachConfigured();
880
881 case DsmEvent::HubSuspending:
884
885 default:
886 return SmUnhandled();
887 }
888}
889
893{
894 if (Event != DsmEvent::ControllerIoctlDone)
895 return SmUnhandled();
896
899}
900
904{
905 switch (Event)
906 {
907 case DsmEvent::Succeeded:
909
910 case DsmEvent::Failed:
912 return BootDeviceFailed();
913
914 case DsmEvent::PortDetached:
916
917 default:
918 return SmUnhandled();
919 }
920}
921
925{
926 switch (Event)
927 {
928 case DsmEvent::ClientSelectConfig:
929 case DsmEvent::ClientClearStall:
930 case DsmEvent::ClientUnconfigure:
931 case DsmEvent::ClientSetInterface:
932 case DsmEvent::ClientResetPipe:
933 case DsmEvent::ClientSyncResetPipe:
934 case DsmEvent::ClientResetDevice:
936 return SmHandled();
937
938 case DsmEvent::NoPingResponse:
939 case DsmEvent::LpmSettingChanged:
940 return SmHandled();
941
942 case DsmEvent::DeviceTextQuery:
944 return SmHandled();
945
946 case DsmEvent::ClientCyclePort:
948 return SmHandled();
949
950 case DsmEvent::HubGetDescriptor:
952 return SmHandled();
953
954 case DsmEvent::NeedsReenumeration:
955 return ReenumForResume(TRUE);
956
957 case DsmEvent::ResumeDone:
959
960 case DsmEvent::HubStopping:
963
964 case DsmEvent::PortDetached:
966
967 case DsmEvent::PdoCleanup:
970
971 case DsmEvent::ClientStreams:
973
974 case DsmEvent::PortFault:
975 return ConfiguredCyclePort();
976
977 case DsmEvent::HubStoppingAfterSuspend:
980
981 case DsmEvent::PdoPreStart:
984
985 default:
986 return SmUnhandled();
987 }
988}
989
992{
994 return SmTransition(&ConfiguredOn);
995}
996
999{
1000 return ReenumForPreStart();
1001}
1002
1006{
1007 switch (Event)
1008 {
1009 case DsmEvent::ClientSyncResetPipe:
1010 case DsmEvent::ClientClearStall:
1011 case DsmEvent::ClientSetInterface:
1012 case DsmEvent::ClientResetPipe:
1013 case DsmEvent::ClientUnconfigure:
1014 case DsmEvent::ClientResetDevice:
1015 case DsmEvent::ClientSelectConfig:
1017 return SmHandled();
1018
1019 case DsmEvent::NoPingResponse:
1020 case DsmEvent::LpmSettingChanged:
1021 return SmHandled();
1022
1023 case DsmEvent::DeviceTextQuery:
1025 return SmHandled();
1026
1027 case DsmEvent::HubGetDescriptor:
1029 return SmHandled();
1030
1031 case DsmEvent::NeedsReenumeration:
1032 return ReenumForBootResume();
1033
1034 case DsmEvent::ResumeDone:
1036
1037 case DsmEvent::PortDetached:
1039
1040 case DsmEvent::ClientStreams:
1042
1043 case DsmEvent::PortFault:
1044 return BootDeviceFailed();
1045
1046 default:
1047 return SmUnhandled();
1048 }
1049}
1050
1054{
1055 switch (Event)
1056 {
1057 case DsmEvent::NeedsReenumeration:
1058 return ReenumForHubResume(TRUE);
1059
1060 case DsmEvent::SuspendedAfterHubResume:
1062
1063 case DsmEvent::ResumedWithHub:
1066
1067 case DsmEvent::PortDetached:
1069
1070 default:
1071 return SmUnhandled();
1072 }
1073}
1074
1078{
1079 switch (Event)
1080 {
1081 case DsmEvent::PortDetached:
1083
1084 case DsmEvent::PortFault:
1085 case DsmEvent::PortNowEnabledOnReconnect:
1086 case DsmEvent::PortResumeTimeout:
1087 case DsmEvent::PortNowDisabled:
1088 return ConfiguredCyclePort();
1089
1090 case DsmEvent::PortResumeDone:
1093
1094 default:
1095 return SmUnhandled();
1096 }
1097}
1098
1102{
1103 if ((Event != DsmEvent::ControllerIoctlDone) && (Event != DsmEvent::ControllerIoctlFailed))
1104 return SmUnhandled();
1105
1106 return SmTransition(&ConfiguredOn);
1107}
unsigned char BOOLEAN
Definition: actypes.h:127
SM_RESULT InterfaceOldRestored(_In_ DsmEvent Event)
SM_RESULT RemovalDropPowerAndPark()
SM_RESULT OnSuspendingConfigured(_In_ DsmEvent Event)
BOOLEAN m_EndpointsConfigured
Definition: devsm.h:1840
SM_RESULT ConfiguredResetBootDevice()
SM_RESULT SelectConfigDone(_In_ DsmEvent Event)
SM_RESULT SelectConfigValidate()
SM_RESULT ConfiguredNotStartedHubStop(_In_ DsmEvent Event)
VOID SetConfiguration()
Definition: devreq.cpp:755
SM_RESULT ConfigureProgrammed(_In_ DsmEvent Event)
SM_RESULT EnterSuspendingConfigured()
SM_RESULT EndpointsProgrammed(_In_ DsmEvent Event)
SM_RESULT EnterProgrammingEndpoints()
VOID FailHubDescriptorRequest()
Definition: hubioctl.cpp:383
SM_RESULT InterfaceSet(_In_ DsmEvent Event)
VOID DisablePendingEndpoints()
Definition: devhcd.cpp:1087
VOID PurgeIoForHibernation()
SM_RESULT ConfiguredPurgedWhileSuspending(_In_ DsmEvent Event)
SM_RESULT ConfiguredIoStarted(_In_ DsmEvent Event)
SM_RESULT ReenumForHubResume(_In_ BOOLEAN Configured)
SM_RESULT ConfiguredFreeForClient()
VOID ResetEndpointAndTransfers()
Definition: devhcd.cpp:971
SM_RESULT OnProgrammingEndpoints(_In_ DsmEvent Event)
SM_RESULT OnUpdatingLinkPower(_In_ DsmEvent Event)
SM_RESULT RemovalDeleteForgetAndPark()
SM_RESULT InterfaceProgrammed(_In_ DsmEvent Event)
SM_RESULT UnconfiguredDisabledForStop(_In_ DsmEvent Event)
SM_RESULT ConfiguredResumedWithHub(_In_ DsmEvent Event)
SM_RESULT ConfigureDeleteOld()
BOOLEAN FindClientPipe()
Definition: childpdo.cpp:3857
SM_RESULT OnSuspendedConfigured(_In_ DsmEvent Event)
static const State ResumingPort
Definition: devsm.h:236
SM_RESULT ConfiguredCyclePort()
DSM_THEN m_Resume
Definition: devsm.h:1845
SM_RESULT OnConfiguredHubSuspended(_In_ DsmEvent Event)
SM_RESULT ConfigureCreateEndpoints()
SM_RESULT ReenumForResume(_In_ BOOLEAN Configured)
SM_RESULT ConfiguredNotStartedCleanup(_In_ DsmEvent Event)
SM_RESULT OnConfigured(_In_ DsmEvent Event)
static const State DisablingEndpoints
Definition: devsm.h:239
SM_RESULT InterfaceStart()
SM_RESULT Then(_In_ DSM_THEN Next)
SM_RESULT BootDeviceNotifyDetached()
Definition: devsm_boot.cpp:83
SM_RESULT ConfiguredPurgedForHub(_In_ DsmEvent Event)
VOID AckPreStart()
Definition: childpdo.cpp:4051
VOID CyclePortForClient()
Definition: childpdo.cpp:4070
VOID ClearResetAtResume()
Definition: childpdo.cpp:4109
SM_RESULT ClientDoneWithLastStatus()
SM_RESULT InterfaceDeleteOld()
SM_RESULT ConfiguredNotStartedHubSuspend(_In_ DsmEvent Event)
SM_RESULT InterfaceDeleteOldAndFail()
static const State ConfiguredOn
Definition: devsm.h:1062
VOID MarkPendingEndpointsDisabled()
Definition: devhcd.cpp:1105
BOOLEAN SelectInterfaceValid()
Definition: childpdo.cpp:3819
SM_RESULT ConfigureOldDisabled(_In_ DsmEvent Event)
VOID FailClientRequest()
Definition: childpdo.cpp:3558
SM_RESULT ConfiguredRestartWhileSuspended()
SM_RESULT ConfiguredSuspendedForHub(_In_ DsmEvent Event)
SM_RESULT InterfaceCreateEndpoints()
static const State SuspendingConfigured
Definition: devsm.h:1068
VOID RequestHibernationPrep()
Definition: hubport.cpp:692
SM_RESULT DisableForRemoval(_In_ DSM_THEN After)
static const State BootDeviceSuspended
Definition: devsm.h:1071
VOID ClearEndpointHalt()
Definition: devreq.cpp:832
SM_RESULT OnConfiguring(_In_ DsmEvent Event)
static const State SuspendingPort
Definition: devsm.h:235
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 EnterWithMsOsInstall()
SM_RESULT ReenumForPreStart()
static const State StoppedReady
Definition: devsm.h:835
VOID SetNullConfiguration()
Definition: devreq.cpp:777
VOID AskPortCycle()
Definition: hubport.cpp:656
static const State ProgrammingEndpoints
Definition: devsm.h:1066
SM_RESULT RemovalAckAndPark()
VOID DisableNewInterfaceEndpoints()
Definition: devhcd.cpp:1061
static const State ConfiguredNotStarted
Definition: devsm.h:1063
VOID DeleteOldInterfaceEndpoints()
Definition: devhcd.cpp:1295
BOOLEAN PipeIsIsochronous()
Definition: childpdo.cpp:3885
VOID NotifyDisconnected()
Definition: childpdo.cpp:3952
VOID ProgramEndpoints()
Definition: devhcd.cpp:979
static const State UpdatingLinkPower
Definition: devsm.h:1067
SM_RESULT EndWith(_In_ DsmEvent Result)
Definition: devsm.cpp:186
static const State SettingInterface
Definition: devsm.h:1065
SM_RESULT ReenumForBootResume()
static const State SuspendedConfigured
Definition: devsm.h:1070
SM_RESULT ToAwaitingDetachOrRemove(_In_ BOOLEAN Configured)
static const State DisablingDevice
Definition: devsm.h:243
static const State BootDeviceSuspending
Definition: devsm.h:1069
SM_RESULT CallStep(_In_ DSM_THEN Then)
Definition: devsm.cpp:552
SM_RESULT PurgeOnDetach()
Definition: devsm_boot.cpp:56
SM_RESULT EnterPreparingHibernation()
SM_RESULT SuspendStart()
VOID GetDescriptorForHub()
Definition: devreq.cpp:1108
BOOLEAN PipeIsZeroBandwidth()
Definition: childpdo.cpp:3879
SM_RESULT OnPreparingHibernation(_In_ DsmEvent Event)
static const State DisablingPort
Definition: devsm.h:221
VOID SetConfigInfoInRequest()
Definition: devconfig.cpp:939
SM_RESULT ConfiguredEndpointsDisabledForStop(_In_ DsmEvent Event)
VOID DereferenceDevicePower()
Definition: fanout.cpp:1044
SM_RESULT EnterSettingInterface()
SM_RESULT BootDeviceFailed()
Definition: devsm_boot.cpp:116
SM_RESULT BackToConfigured()
BOOLEAN AdjustLatencyForNoPing()
Definition: devlpm.cpp:567
SM_RESULT InterfaceNewDisabled(_In_ DsmEvent Event)
SM_RESULT ConfiguredNullSet(_In_ DsmEvent Event)
VOID CompleteClientRequestFailed()
Definition: childpdo.cpp:3507
BOOLEAN PrepareConfigLists()
Definition: devconfig.cpp:557
VOID CompleteClientRequest()
Definition: childpdo.cpp:3462
SM_RESULT EnterHubSuspendedReleasingPower()
static const State PreparingHibernation
Definition: devsm.h:1073
BOOLEAN PdoStarted()
Definition: childpdo.cpp:4122
VOID SignalPnpWaiter()
Definition: childpdo.cpp:4023
SM_RESULT CleanupPortDisabled(_In_ DsmEvent Event)
SM_RESULT InterfaceDeleteNewAndFail()
SM_RESULT InterfaceRestoreOld()
SM_RESULT HubDescriptorDone(_In_ DsmEvent Event)
SM_RESULT StoppedPortSuspendedForHub(_In_ DsmEvent Event)
static const State Configured
Definition: devsm.h:1061
SM_RESULT StopDecision()
BOOLEAN m_FromConfigured
Definition: devsm.h:1850
SM_RESULT SelectConfigFailed(_In_ BOOLEAN LastStatus)
SM_RESULT BackToUnconfigured()
VOID SetInterface()
Definition: devreq.cpp:806
SM_RESULT ForwardStreams(_In_ const State *ReturnTo)
Definition: devsm.cpp:645
SM_RESULT OnConfiguredNotStarted(_In_ DsmEvent Event)
SM_RESULT ConfiguredPurgedForHibernation(_In_ DsmEvent Event)
SM_RESULT StoppedPortOffForHubStop(_In_ DsmEvent Event)
SM_RESULT EnterSuspended()
SM_RESULT InterfaceNewEndpointsDisabled(_In_ DsmEvent Event)
SM_RESULT RemovalNotifyThenReport()
SM_RESULT ConfigureFailed()
SM_RESULT SelectConfigCleanUp()
SM_RESULT OnBootDeviceSuspended(_In_ DsmEvent Event)
SM_RESULT GoConfiguredOn()
static const State ConfiguredHubSuspended
Definition: devsm.h:1072
VOID PurgeIoForSuspend()
Definition: devhcd.cpp:917
static const State ReadingDeviceText
Definition: devsm.h:839
SM_RESULT AtPassive(_In_ DSM_THEN Then)
Definition: devsm.cpp:177
BOOLEAN DisableWhenUnused()
Definition: devmisc.cpp:331
SM_RESULT ReenumForBootClient(_In_ BOOLEAN AfterReattach)
SM_RESULT DetachConfigured()
VOID DeleteOldConfigEndpoints()
Definition: devhcd.cpp:1289
VOID SetInterfaceInfoInRequest()
Definition: devconfig.cpp:972
SM_RESULT CallRequest(_In_ const State *Target, _In_ DSM_ACTION Start, _In_ DSM_NEXT Next)
Definition: devsm.cpp:578
SM_RESULT ClientPipeDone(_In_ DsmEvent Event)
VOID StartDeviceIo()
Definition: devhcd.cpp:934
SM_RESULT ConfiguredEndpointsDisabledForClient(_In_ DsmEvent Event)
static const State RequestingCritical
Definition: devsm.h:230
SM_RESULT OnBootDeviceSuspending(_In_ DsmEvent Event)
VOID ForceResetOnNextStart()
Definition: childpdo.cpp:4090
SM_RESULT OnConfiguredOn(_In_ DsmEvent Event)
SM_RESULT ClientHaltCleared(_In_ DsmEvent Event)
SM_RESULT EnterConfiguring()
VOID DeleteConfigEndpoints()
Definition: devhcd.cpp:1283
DSM_NEXT m_AfterProgram
Definition: devsm.h:1853
SM_RESULT OnSettingInterface(_In_ DsmEvent Event)
static const State Configuring
Definition: devsm.h:1064
SM_RESULT ConfiguredResumed()
VOID DeleteNewInterfaceEndpoints()
Definition: devhcd.cpp:1308
BOOLEAN SelectConfigValid()
Definition: childpdo.cpp:3617
VOID ResetEndpoint()
Definition: devhcd.cpp:965
VOID CompleteClientRequestLastStatus()
Definition: childpdo.cpp:3526
BOOLEAN IsBootDevice()
Definition: childpdo.cpp:4128
DSM_NEXT m_AfterConfigure
Definition: devsm.h:1852
SM_RESULT ConfiguredSignalAndStay()
BOOLEAN PrepareInterfaceLists()
Definition: devconfig.cpp:706
SM_RESULT ConfigureInterfaceSet(_In_ DsmEvent Event)
SM_RESULT ReenumForClientConfigured()
BOOLEAN AlternateSettingLeft()
Definition: devreq.cpp:783
VOID SignalQueryText()
Definition: childpdo.cpp:4064
SM_RESULT EnterUpdatingLinkPower()
SM_RESULT ClientDoneOk()
BOOLEAN CreateEndpoints()
Definition: devhcd.cpp:1136
SM_RESULT LinkPowerStart()
Definition: devsm_lpm.cpp:16
static SM_RESULT SmTransition(_In_ const State *Target)
Definition: smengine.h:194
static SM_RESULT SmUnhandled()
Definition: smengine.h:188
#define DSM_KIND_ANY_SPEED
Definition: devsm.h:151
DsmEvent
Definition: devsm.h:15
@ LpmSettingChanged
#define DSM_KIND_USB3X
Definition: devsm.h:145
#define DSM_KIND_ANY_PORT
Definition: devsm.h:154
static const DsmEvent ConfigLpmDiscards[]
_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
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