ReactOS 0.4.17-dev-1281-g065abb3
devsm_desc.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, descriptor reads after addressing and
5 * SuperSpeed link power setup
6 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
7 */
8
9/* INCLUDES *******************************************************************/
10
11#include "usbhub3.h"
12
13/* GLOBALS ********************************************************************/
14
15/* A detach or hub stop or suspend cancels the transfer and ends the sub machine */
17 { NULL, "CollectingDescriptors", 0, &DeviceMachine::OnCollectingDescriptors, NULL };
18
20 { &CollectingDescriptors, "ReadingDeviceDescriptor", SM_STATE_TAKES_REQUESTS,
22
24 { &CollectingDescriptors, "ReadingConfigDescriptor", 0,
26
27/* Asked the port machine to bring the device back at high speed; the caller decides */
29 { NULL, "DisablingSuperSpeed", SM_STATE_YIELDS_TO_CALLER,
31
32/* Runs the sub machine that reads everything after the configuration descriptor */
34 { NULL, "RemainingDescriptors", 0,
36
38 { &CollectingDescriptors, "ReadingBos", 0,
40
42 { &CollectingDescriptors, "ReadingMsOs", 0,
44
46 { &CollectingDescriptors, "ReadingLanguages", 0,
48
50 { &CollectingDescriptors, "ReadingProductName", 0,
52
54 { &CollectingDescriptors, "ReadingQualifier", 0,
56
57/* FUNCTIONS ******************************************************************/
58
62{
63 switch (Event)
64 {
65 case DsmEvent::PortDetached:
66 case DsmEvent::HubSuspending:
67 case DsmEvent::HubStopping:
69
70 default:
71 return SmUnhandled();
72 }
73}
74
77{
79}
80
83{
85 return SmHandled();
86}
87
91{
92 switch (Event)
93 {
94 case DsmEvent::TransferFailed:
95 return EndWith(DsmEvent::Failed);
96
97 case DsmEvent::TransferDone:
99 return EndWith(DsmEvent::Failed);
100
103
104 default:
105 return SmUnhandled();
106 }
107}
108
111{
112 if (!QueryRegistryValues())
113 return EndWith(DsmEvent::Failed);
114
116 {
119 }
120
123
126}
127
131{
132 switch (Event)
133 {
134 case DsmEvent::TransferDone:
136
137 case DsmEvent::TransferFailed:
138 return EndWith(DsmEvent::Failed);
139
140 default:
141 return SmUnhandled();
142 }
143}
144
147{
149 return SmHandled();
150}
151
154{
157 else
159
160 return SmHandled();
161}
162
166{
167 switch (Event)
168 {
169 case DsmEvent::TransferFailed:
170 return EndWith(DsmEvent::Failed);
171
172 case DsmEvent::TransferDone:
174 {
177 }
178
180 return EndWith(DsmEvent::Failed);
181
183
184 default:
185 return SmUnhandled();
186 }
187}
188
191{
192 return SmCall(&ReadingBos);
193}
194
198{
199 switch (Event)
200 {
201 case DsmEvent::Failed:
202 case DsmEvent::Succeeded:
203 case DsmEvent::HubStopping:
204 case DsmEvent::HubSuspending:
205 case DsmEvent::PortDetached:
206 return EndWith(Event);
207
208 default:
209 return SmUnhandled();
210 }
211}
212
213/* BOS DESCRIPTOR SUB MACHINE *************************************************/
214
217{
220
221 return SmTransition(&ReadingMsOs);
222}
223
227{
228 switch (Event)
229 {
230 case DsmEvent::Succeeded:
231 return SmTransition(&ReadingMsOs);
232
233 case DsmEvent::Failed:
234 return EndWith(DsmEvent::Failed);
235
236 default:
237 return SmUnhandled();
238 }
239}
240
243{
244 if (BosQuerySkipped())
245 return EndWith(DsmEvent::Succeeded);
246
249}
250
254{
255 switch (Event)
256 {
257 case DsmEvent::TransferDone:
258 if (!BosHeaderValid())
259 return BosError();
260
261 if (BosComplete())
263
266
267 case DsmEvent::TransferFailed:
268 return BosError();
269
270 default:
271 return SmUnhandled();
272 }
273}
274
275/* A device may get away with a bad or missing BOS, the error policy decides */
278{
280 return EndWith(DsmEvent::Succeeded);
281
282 return EndWith(DsmEvent::Failed);
283}
284
288{
289 switch (Event)
290 {
291 case DsmEvent::TransferDone:
293
294 case DsmEvent::TransferFailed:
295 return BosError();
296
297 default:
298 return SmUnhandled();
299 }
300}
301
304{
305 if (!BosValid())
306 return BosError();
307
308 if (DualRoleSupported())
309 {
312 }
313
314 return BosBillboard();
315}
316
320{
321 switch (Event)
322 {
323 case DsmEvent::TransferDone:
324 return BosBillboard();
325
326 case DsmEvent::TransferFailed:
327 return BosError();
328
329 default:
330 return SmUnhandled();
331 }
332}
333
336{
337 if (!HasBillboard())
338 return BosAltEnum();
339
341 {
344 }
345
346 return BosAltModes();
347}
348
352{
353 switch (Event)
354 {
355 case DsmEvent::TransferDone:
357 return BosAltModes();
358
359 return BosError();
360
361 case DsmEvent::TransferFailed:
362 return BosError();
363
364 default:
365 return SmUnhandled();
366 }
367}
368
371{
373 {
376 }
377
378 return BosAltEnum();
379}
380
384{
385 switch (Event)
386 {
387 case DsmEvent::TransferDone:
388 if (AltModeStringValid())
389 return BosAltModes();
390
391 return BosError();
392
393 case DsmEvent::TransferFailed:
394 return BosError();
395
396 default:
397 return SmUnhandled();
398 }
399}
400
403{
405 {
408 }
409
410 return BosMsOs20();
411}
412
415{
416 if (MsOs20Supported())
417 {
420 }
421
422 return EndWith(DsmEvent::Succeeded);
423}
424
428{
429 switch (Event)
430 {
431 case DsmEvent::TransferDone:
433
434 case DsmEvent::TransferFailed:
435 return BosError();
436
437 default:
438 return SmUnhandled();
439 }
440}
441
444{
445 if (MsOs20SetValid())
446 return EndWith(DsmEvent::Succeeded);
447
448 return BosError();
449}
450
451/* The device switched to its alternate enumeration: read it again from the top */
455{
456 switch (Event)
457 {
458 case DsmEvent::TransferDone:
461
462 case DsmEvent::TransferFailed:
463 return BosError();
464
465 default:
466 return SmUnhandled();
467 }
468}
469
473{
474 switch (Event)
475 {
476 case DsmEvent::TransferDone:
478 return EndWith(DsmEvent::Failed);
479
482
483 case DsmEvent::TransferFailed:
484 return EndWith(DsmEvent::Failed);
485
486 default:
487 return SmUnhandled();
488 }
489}
490
493{
494 if (!QueryRegistryValues())
495 return EndWith(DsmEvent::Failed);
496
499}
500
501/* Unlike the first read, a short alternate configuration is validated as is */
505{
506 switch (Event)
507 {
508 case DsmEvent::TransferDone:
510 return AltValidateConfig();
511
514
515 case DsmEvent::TransferFailed:
516 return EndWith(DsmEvent::Failed);
517
518 default:
519 return SmUnhandled();
520 }
521}
522
526{
527 switch (Event)
528 {
529 case DsmEvent::TransferDone:
530 return AltValidateConfig();
531
532 case DsmEvent::TransferFailed:
533 return EndWith(DsmEvent::Failed);
534
535 default:
536 return SmUnhandled();
537 }
538}
539
542{
544 return EndWith(DsmEvent::Failed);
545
546 if (BosQuerySkipped())
547 return EndWith(DsmEvent::Succeeded);
548
551}
552
556{
557 switch (Event)
558 {
559 case DsmEvent::TransferDone:
560 if (!BosHeaderValid())
561 return EndWith(DsmEvent::Failed);
562
563 if (BosComplete())
565
568
569 case DsmEvent::TransferFailed:
570 return EndWith(DsmEvent::Failed);
571
572 default:
573 return SmUnhandled();
574 }
575}
576
580{
581 switch (Event)
582 {
583 case DsmEvent::TransferDone:
585
586 case DsmEvent::TransferFailed:
587 return EndWith(DsmEvent::Failed);
588
589 default:
590 return SmUnhandled();
591 }
592}
593
596{
597 if (!BosValid())
598 return EndWith(DsmEvent::Failed);
599
600 return BosMsOs20();
601}
602
603/* MICROSOFT OS AND SERIAL NUMBER SUB MACHINE *********************************/
604
607{
609}
610
614{
615 switch (Event)
616 {
617 case DsmEvent::Succeeded:
620
622
623 case DsmEvent::Failed:
624 return EndWith(DsmEvent::Failed);
625
626 default:
627 return SmUnhandled();
628 }
629}
630
633{
634 if (MsOsQueryWanted())
635 {
638 }
639
640 return MsOsSerial();
641}
642
646{
647 switch (Event)
648 {
649 case DsmEvent::TransferFailed:
651
652 case DsmEvent::TransferDone:
655
657
658 default:
659 return SmUnhandled();
660 }
661}
662
665{
667 return MsOsSerial();
668}
669
672{
676
677 return MsOsSerial();
678}
679
682{
684 return MsOsExtendedConfig();
685
688}
689
693{
694 switch (Event)
695 {
696 case DsmEvent::TransferFailed:
698
699 case DsmEvent::TransferDone:
700 if (SerialNumberValid())
701 return MsOsExtendedConfig();
702
704
705 default:
706 return SmUnhandled();
707 }
708}
709
710/* A bad optional descriptor fails enumeration unless the error policy says go on */
713 _In_ DSM_THEN GoOn)
714{
716 return (this->*GoOn)();
717
718 return EndWith(DsmEvent::Failed);
719}
720
723{
725 {
728 }
729
730 return MsOsContainerId();
731}
732
736{
737 switch (Event)
738 {
739 case DsmEvent::TransferDone:
742
745
746 case DsmEvent::TransferFailed:
747 return MsOsContainerId();
748
749 default:
750 return SmUnhandled();
751 }
752}
753
757{
758 switch (Event)
759 {
760 case DsmEvent::TransferDone:
762 return MsOsContainerId();
763
765
766 case DsmEvent::TransferFailed:
768
769 default:
770 return SmUnhandled();
771 }
772}
773
776{
777 if (ContainerIdWanted())
778 {
781 }
782
783 return EndWith(DsmEvent::Succeeded);
784}
785
789{
790 switch (Event)
791 {
792 case DsmEvent::TransferDone:
795
798
799 case DsmEvent::TransferFailed:
801
802 default:
803 return SmUnhandled();
804 }
805}
806
810{
811 switch (Event)
812 {
813 case DsmEvent::TransferDone:
814 if (ContainerIdKnown())
815 return EndWith(DsmEvent::Succeeded);
816
818
819 case DsmEvent::TransferFailed:
821
822 default:
823 return SmUnhandled();
824 }
825}
826
829{
831}
832
835{
837 return EndWith(DsmEvent::Succeeded);
838}
839
840/* STRINGS AND QUALIFIER ******************************************************/
841
844{
846 return SmHandled();
847}
848
852{
853 switch (Event)
854 {
855 case DsmEvent::TransferFailed:
856 return StringError();
857
858 case DsmEvent::TransferDone:
859 if (!LanguageIdsValid())
860 return StringError();
861
862 if (ProductNameWanted())
864
866
867 default:
868 return SmUnhandled();
869 }
870}
871
874{
877
878 return EndWith(DsmEvent::Failed);
879}
880
883{
885 return SmHandled();
886}
887
891{
892 switch (Event)
893 {
894 case DsmEvent::TransferDone:
895 if (ProductNameValid())
897
898 return StringError();
899
900 case DsmEvent::TransferFailed:
901 return StringError();
902
903 default:
904 return SmUnhandled();
905 }
906}
907
910{
912 {
915 }
916
917 return EndWith(DsmEvent::Succeeded);
918}
919
923{
924 switch (Event)
925 {
926 case DsmEvent::Failed:
927 case DsmEvent::FailEnumeration:
928 return EndWith(DsmEvent::Failed);
929
930 case DsmEvent::Succeeded:
931 return EndWith(DsmEvent::Succeeded);
932
933 default:
934 return SmUnhandled();
935 }
936}
937
938/* A full speed 2.0 device may be high speed capable; a bad qualifier only matters if the policy says so */
942{
943 switch (Event)
944 {
945 case DsmEvent::TransferDone:
946 if (QualifierValid())
947 return EndWith(DsmEvent::Succeeded);
948
950 return EndWith(DsmEvent::Succeeded);
951
952 return EndWith(DsmEvent::FailEnumeration);
953
954 case DsmEvent::TransferFailed:
955 return EndWith(DsmEvent::Succeeded);
956
957 default:
958 return SmUnhandled();
959 }
960}
961
962/* SUPERSPEED LINK POWER SUB MACHINE ******************************************/
963
966{
967 if (IsochDelaySkipped())
968 return LinkExitLatency();
969
972}
973
977{
978 if ((Event != DsmEvent::TransferDone) && (Event != DsmEvent::TransferFailed))
979 return SmUnhandled();
980
981 return LinkExitLatency();
982}
983
986{
987 if (SelSkipped())
988 return LinkLatencyTolerance();
989
991}
992
996{
997 switch (Event)
998 {
999 case DsmEvent::TransferDone:
1000 case DsmEvent::TransferStalled:
1001 return LinkLatencyTolerance();
1002
1003 case DsmEvent::TransferFailed:
1004 return EndWith(DsmEvent::Failed);
1005
1006 default:
1007 return SmUnhandled();
1008 }
1009}
1010
1013{
1014 if (LtmWanted())
1016
1017 return EndWith(DsmEvent::Succeeded);
1018}
1019
1023{
1024 switch (Event)
1025 {
1026 case DsmEvent::TransferFailed:
1027 return EndWith(DsmEvent::Failed);
1028
1029 case DsmEvent::TransferDone:
1030 case DsmEvent::TransferStalled:
1031 return EndWith(DsmEvent::Succeeded);
1032
1033 default:
1034 return SmUnhandled();
1035 }
1036}
SM_RESULT MsOsContainerRead(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:808
SM_RESULT AltBosValidate()
Definition: devsm_desc.cpp:595
BOOLEAN QueryRegistryValues()
BOOLEAN BosQuerySkipped()
Definition: devdesc.cpp:285
SM_RESULT DescriptorsAltEnumSent(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:129
SM_RESULT MsOsMarkUnsupported()
Definition: devsm_desc.cpp:664
VOID ReadFullConfigDescriptor()
Definition: devreq.cpp:450
BOOLEAN MsOsQueryWanted()
Definition: hubmsos.cpp:228
static const State Requesting
Definition: devsm.h:229
BOOLEAN SelSkipped()
Definition: devmisc.cpp:311
SM_RESULT BosBillboard()
Definition: devsm_desc.cpp:335
SM_RESULT EnterDisablingSuperSpeed()
Definition: devsm_desc.cpp:146
BOOLEAN MsOsDescriptorValid()
Definition: devdesc.cpp:826
VOID ReadBillboardString()
Definition: devreq.cpp:521
SM_RESULT MsOsNoContainerId()
Definition: devsm_desc.cpp:828
SM_RESULT MsOsRead(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:644
VOID SendAltEnumCommand()
Definition: devreq.cpp:735
SM_RESULT LinkLatencyTolerance()
BOOLEAN IgnoreDescriptorError()
Definition: devdesc.cpp:292
SM_RESULT BosRead(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:286
SM_RESULT AltConfigRead(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:524
SM_RESULT AltBosRead(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:578
SM_RESULT OnReadingBos(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:225
BOOLEAN ProductNameValid()
Definition: devdesc.cpp:803
SM_RESULT EnterReadingDescriptors()
Definition: devsm_desc.cpp:76
VOID ReadQualifier()
Definition: devreq.cpp:607
SM_RESULT MsOsStoreVendorCode()
Definition: devsm_desc.cpp:671
static const State ReadingDeviceDescriptor
Definition: devsm.h:549
SM_RESULT OnReadingLanguages(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:850
VOID StoreMsOsVendorCode()
Definition: hubmsos.cpp:344
VOID ReadMsOs20Set()
Definition: devreq.cpp:711
SM_RESULT BosError()
Definition: devsm_desc.cpp:277
VOID ReadContainerId()
Definition: devreq.cpp:641
SM_RESULT EnterRemainingDescriptors()
Definition: devsm_desc.cpp:190
BOOLEAN QualifierValid()
Definition: devdesc.cpp:810
SM_RESULT OnReadingProductName(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:889
BOOLEAN AltEnumNeededAfterBos()
Definition: hubmsos.cpp:104
BOOLEAN AltModeStringWanted()
Definition: devdesc.cpp:701
BOOLEAN SerialNumberValid()
Definition: hubid.cpp:1144
SM_RESULT AltQueryRegistry()
Definition: devsm_desc.cpp:492
SM_RESULT BosAltModes()
Definition: devsm_desc.cpp:370
BOOLEAN BillboardStringWanted()
Definition: devdesc.cpp:647
static const State ReadingConfigDescriptor
Definition: devsm.h:550
BOOLEAN ContainerIdKnown()
Definition: devdesc.cpp:865
SM_RESULT LinkStart()
Definition: devsm_desc.cpp:965
SM_RESULT OnReadingDeviceDescriptor(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:89
VOID ReadMsOsDescriptor()
Definition: devreq.cpp:620
BOOLEAN ConfigLongerThanRead()
Definition: devdesc.cpp:131
VOID ReadExtendedConfig()
Definition: devreq.cpp:664
SM_RESULT EnterReadingConfigDescriptor()
Definition: devsm_desc.cpp:153
SM_RESULT EnterReadingQualifier()
Definition: devsm_desc.cpp:909
static const State ReadingBos
Definition: devsm.h:553
static const State RequestingYielding
Definition: devsm.h:231
VOID RequestSuperSpeedDisable()
Definition: hubport.cpp:674
BOOLEAN ContainerIdHeaderValid()
Definition: devdesc.cpp:847
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 MsOsContainerHeaderRead(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:787
SM_RESULT LinkSelSet(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:994
SM_RESULT BosFeaturesSent(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:318
SM_RESULT AltConfigHeaderRead(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:503
VOID ReadConfigDescriptorHeader()
Definition: devreq.cpp:433
SM_RESULT BosValidate()
Definition: devsm_desc.cpp:303
SM_RESULT EndWith(_In_ DsmEvent Result)
Definition: devsm.cpp:186
SM_RESULT CancelTransferAndEnd(_In_ DsmEvent Event)
Definition: devsm.cpp:596
VOID SetIsochDelay()
Definition: devreq.cpp:1068
BOOLEAN SerialNumberIndexZero()
Definition: hubid.cpp:1137
SM_RESULT MsOsSerialRead(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:691
VOID SendUsbFeatures()
Definition: devreq.cpp:500
SM_RESULT BosAltModeRead(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:382
SM_RESULT MsOsContainerId()
Definition: devsm_desc.cpp:775
BOOLEAN MsOsExtendedConfigSupported()
Definition: hubmsos.cpp:260
SM_RESULT CallStep(_In_ DSM_THEN Then)
Definition: devsm.cpp:552
SM_RESULT QualifierRead(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:940
BOOLEAN ProductStringIndexZero()
Definition: devmisc.cpp:305
static const State ReadingMsOs
Definition: devsm.h:554
SM_RESULT BosAltEnum()
Definition: devsm_desc.cpp:402
SM_RESULT OnReadingQualifier(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:921
SM_RESULT MsOsExtendedConfig()
Definition: devsm_desc.cpp:722
VOID SetSel()
Definition: devreq.cpp:1011
BOOLEAN IsochDelaySkipped()
Definition: devmisc.cpp:317
SM_RESULT AltDeviceDescriptorRead(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:471
BOOLEAN BosComplete()
Definition: devdesc.cpp:322
SM_RESULT MsOsExtendedRead(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:755
SM_RESULT EnterReadingMsOs()
Definition: devsm_desc.cpp:606
static const State ReadingLanguages
Definition: devsm.h:555
BOOLEAN BosHeaderValid()
Definition: devdesc.cpp:298
SM_RESULT BosMsOs20Validate()
Definition: devsm_desc.cpp:443
BOOLEAN m_ConfigFullLength
Definition: devsm.h:1858
VOID ReadAltModeString()
Definition: devreq.cpp:536
VOID ReadSerialNumber()
Definition: devreq.cpp:592
SM_RESULT BosBillboardRead(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:350
SM_RESULT BosMsOs20()
Definition: devsm_desc.cpp:414
BOOLEAN ExtendedConfigHeaderValid()
Definition: devdesc.cpp:881
VOID ReadDeviceDescriptor()
Definition: devreq.cpp:415
static const State ReadingProductName
Definition: devsm.h:556
BOOLEAN DualRoleSupported()
Definition: devmisc.cpp:299
BOOLEAN ProductNameWanted()
Definition: devmisc.cpp:492
BOOLEAN MsOs20SetValid()
Definition: devdesc.cpp:928
VOID ReadExtendedConfigHeader()
Definition: devreq.cpp:651
SM_RESULT OnReadingMsOs(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:612
VOID MarkContainerIdUnsupported()
Definition: hubmsos.cpp:357
SM_RESULT EnterReadingLanguages()
Definition: devsm_desc.cpp:843
SM_RESULT MsOsStart()
Definition: devsm_desc.cpp:632
BOOLEAN AltEnumNeededInEnum()
Definition: hubmsos.cpp:86
SM_RESULT LinkExitLatency()
Definition: devsm_desc.cpp:985
SM_RESULT DescriptorsQueryRegistry()
Definition: devsm_desc.cpp:110
SM_RESULT LinkIsochDelaySet(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:975
SM_RESULT StringError()
Definition: devsm_desc.cpp:873
SM_RESULT BosStart()
Definition: devsm_desc.cpp:242
static const State DisablingSuperSpeed
Definition: devsm.h:551
VOID ReadBosHeader()
Definition: devreq.cpp:471
SM_RESULT EnterReadingBos()
Definition: devsm_desc.cpp:216
SM_RESULT MsOsExtendedHeaderRead(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:734
SM_RESULT EnterReadingProductName()
Definition: devsm_desc.cpp:882
static const State ReadingQualifier
Definition: devsm.h:557
static const State CollectingDescriptors
Definition: devsm.h:548
SM_RESULT OnReadingConfigDescriptor(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:164
BOOLEAN HasBillboard()
Definition: devdesc.cpp:641
BOOLEAN BillboardStringValid()
Definition: devdesc.cpp:662
SM_RESULT AtPassive(_In_ DSM_THEN Then)
Definition: devsm.cpp:177
BOOLEAN ExtendedConfigValid()
Definition: devdesc.cpp:900
SM_RESULT CallRequest(_In_ const State *Target, _In_ DSM_ACTION Start, _In_ DSM_NEXT Next)
Definition: devsm.cpp:578
BOOLEAN SuperSpeedMustBeDisabled()
Definition: devmisc.cpp:287
BOOLEAN BosValid()
Definition: devdesc.cpp:547
SM_RESULT AltBosHeaderRead(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:554
static const State RequestingCritical
Definition: devsm.h:230
SM_RESULT BosMsOs20Read(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:426
SM_RESULT AltValidateConfig()
Definition: devsm_desc.cpp:541
BOOLEAN MsOsContainerIdSupported()
Definition: hubmsos.cpp:296
VOID MarkMsOsUnsupported()
Definition: hubmsos.cpp:333
SM_RESULT LinkLtmSet(_In_ DsmEvent Event)
static const State RemainingDescriptors
Definition: devsm.h:552
BOOLEAN MsOs20Supported()
Definition: hubmsos.cpp:121
VOID ReadContainerIdHeader()
Definition: devreq.cpp:631
VOID ReadProductName()
Definition: devreq.cpp:575
SM_RESULT MsOsError(_In_ DSM_THEN GoOn)
Definition: devsm_desc.cpp:712
VOID EnableLtm()
Definition: devreq.cpp:963
VOID RecordDeviceVersion()
Definition: devmisc.cpp:149
BOOLEAN DeviceDescriptorValid()
Definition: devdesc.cpp:98
SM_RESULT OnCollectingDescriptors(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:60
BOOLEAN IgnoreSerialNumber()
Definition: hubid.cpp:1131
SM_RESULT MsOsSerial()
Definition: devsm_desc.cpp:681
BOOLEAN ContainerIdWanted()
Definition: hubmsos.cpp:278
BOOLEAN AltModeStringValid()
Definition: devdesc.cpp:732
SM_RESULT BosAltEnumSent(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:453
BOOLEAN LtmWanted()
Definition: devmisc.cpp:323
BOOLEAN LanguageIdsValid()
Definition: devdesc.cpp:797
BOOLEAN ConfigDescriptorValid()
Definition: devdesc.cpp:213
SM_RESULT OnRemainingDescriptors(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:196
SM_RESULT BosHeaderRead(_In_ DsmEvent Event)
Definition: devsm_desc.cpp:252
VOID ReadBos()
Definition: devreq.cpp:482
SM_RESULT MsOsMarkNoContainerId()
Definition: devsm_desc.cpp:834
SM_RESULT EnterReadingDeviceDescriptor()
Definition: devsm_desc.cpp:82
VOID ReadLanguageIds()
Definition: devreq.cpp:567
static SM_RESULT SmTransition(_In_ const State *Target)
Definition: smengine.h:194
static SM_RESULT SmCall(_In_ const State *Start)
Definition: smengine.h:209
static SM_RESULT SmUnhandled()
Definition: smengine.h:188
#define DSM_KIND_USB2X
Definition: devsm.h:144
#define DSM_KIND_ANY_SPEED
Definition: devsm.h:151
DsmEvent
Definition: devsm.h:15
#define DSM_KIND_USB20
Definition: devsm.h:143
#define DSM_KIND_FULL_SPEED
Definition: devsm.h:148
#define DSM_KIND_USB3X
Definition: devsm.h:145
#define DSM_KIND_ANY_PORT
Definition: devsm.h:154
_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