ReactOS 0.4.17-dev-1281-g065abb3
hubport.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS SuperSpeed USB Hub Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Port object lifetime, its timers and work item
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#include "usbhub3.h"
9
10#define NDEBUG
11#include <debug.h>
12
13/* A port holds this on its hub so the hub outlives a port a device still uses */
14static const char HubTagPort[] = "hub port";
15
16/* Port timer durations in ms */
17#define PORT_DEBOUNCE_TIME 100
18#define PORT_OVERCURRENT_TIME 500
19#define PORT_RESET_TIME 3000
20#define HUB_PORT_RESUME_WAIT_MS 500
21#define PORT_RESUME_RECOVERY_TIME 10
22#define PORT_POWER_ON_TIME_ROOT 100
23#define PORT_POWER_ON_TIME 300
24#define PORT_RECONNECT_TIME_BOOT 2000
25#define PORT_RECONNECT_TIME 1000
26#define PORT_SUPERSPEED_DISABLE_TIME 5000
27#define PORT_RESET_POLL_TIME 500
28
32{
33 return HubGetPortContext(Object);
34}
35
38HubPort::Create(
40 _In_ const HubPortInfo* Info)
41{
43 WDF_TIMER_CONFIG TimerConfig;
47
48 PAGED_CODE();
49
51 Attributes.ParentObject = Hub->m_Device;
52 Attributes.ExecutionLevel = WdfExecutionLevelPassive;
53 Attributes.EvtCleanupCallback = EvtCleanup;
54 Attributes.EvtDestroyCallback = EvtDestroy;
55
56 Status = WdfObjectCreate(&Attributes, &Object);
57 if (!NT_SUCCESS(Status))
58 {
59 DPRINT1("Hub %p port %u object creation failed 0x%lx\n", Hub, Info->PortNumber, Status);
60 return NULL;
61 }
62
64
65 Port = new (HubGetPortContext(Object)) HubPort();
66 Port->m_Object = Object;
67 Port->m_Hub = Hub;
68 Port->m_Info = *Info;
69 Port->m_SelectedFeature = HUB_FEATURE_NONE;
70 Port->m_D3ColdReconnectTimeout = PORT_RECONNECT_TIME;
71 HubClearListEntry(&Port->m_HubLink);
72
73 Status = Port->m_Control.Create(Object, WdfDeviceGetIoTarget(Hub->m_Device));
74 if (!NT_SUCCESS(Status))
75 {
76 DPRINT1("Port %u control request creation failed 0x%lx\n", Port->Number(), Status);
77 goto Failed;
78 }
79
80 Port->m_Machine.Initialize(Port, Port->IsUsb30());
81 Port->m_Timer.Initialize(TimerFired, Port);
82
83 if (Hub->HasFlag(HubFlag::DelayAfterResetComplete))
84 {
87 Attributes.ParentObject = Object;
88
89 Status = WdfTimerCreate(&TimerConfig, &Attributes, &Port->m_ResetPollTimer);
90 if (!NT_SUCCESS(Status))
91 {
92 DPRINT1("Port %u reset poll timer creation failed 0x%lx\n", Port->Number(), Status);
93 goto Failed;
94 }
95 }
96
97 Port->m_WorkItem = Hub->AllocateWorkItem();
98 if (Port->m_WorkItem == NULL)
99 {
100 DPRINT1("Port %u work item allocation failed\n", Port->Number());
101 goto Failed;
102 }
103
104 DPRINT("Hub %p created port %p number %u\n", Hub, Port, Port->Number());
105 return Port;
106
107Failed:
109 return NULL;
110}
111
112/* A device still attached when the hub goes away is detached here */
113VOID
114NTAPI
117{
118 HubPort* Port = HubGetPortContext(Object);
119
120 if (Port->m_WorkItem == NULL)
121 return;
122
123 Port->Post(PortEvent::PortCleanup);
124 Port->m_Hub->FlushAndDeleteWorkItem(&Port->m_WorkItem);
125}
126
127/* A running timer callback is waited for */
128VOID
129NTAPI
132{
133 HubPort* Port = HubGetPortContext(Object);
134
135 if (Port->m_Hub == NULL)
136 return;
137
138 Port->m_Timer.Cancel();
139 KeFlushQueuedDpcs();
140
142}
143
144VOID
145NTAPI
148{
149 ((HubPort*)Context)->Post(PortEvent::TimerExpired);
150}
151
152VOID
153NTAPI
155 _In_ WDFTIMER Timer)
156{
157 HubGetPortContext(WdfTimerGetParentObject(Timer))->Post(PortEvent::ResetPollExpired);
158}
159
160VOID
161NTAPI
166{
169
170 ((HubPort*)Context)->m_Machine.SmContinueOnPassive();
171}
172
173/* Engine hooks */
174
175VOID
177{
179}
180
181VOID
183{
185}
186
187VOID
189{
192 m_Port,
194}
195
196/* Keeps the hub out of idle while the port works; only while the hub is started */
199{
202
203 if (!Hub->HasFlag(HubFlag::PowerReferenceAllowed))
204 return FALSE;
205
207 if (!NT_SUCCESS(Status))
208 {
209 DPRINT1("Port %u could not take a hub power reference 0x%lx\n", m_Port->Number(), Status);
210 return FALSE;
211 }
212
213 m_Port->SetMuxFlag(PortMuxFlag::WdfPowerReference);
214 return TRUE;
215}
216
217VOID
219{
220 if (!m_Port->HasMuxFlag(PortMuxFlag::WdfPowerReference))
221 return;
222
223 m_Port->ClearMuxFlag(PortMuxFlag::WdfPowerReference);
225}
226
227/* Port timers */
228
229VOID
232{
234 ULONG Time;
235
236 switch (Timer)
237 {
238 case PsmTimerDebounce:
240 break;
241
244 DPRINT1("Port %u over current, waiting %lu ms\n", m_Port->Number(), Time);
245 break;
246
249 break;
250
253 break;
254
255 /* The device may ask for longer in its MS OS 2.0 descriptor set */
257 Time = (Child != NULL && Child->m_HasResumeRecoveryTime) ? Child->m_ResumeRecoveryTime
259 break;
260
261 /* Longer on external hubs */
262 case PsmTimerPowerOn:
264 break;
265
267 Time = m_Port->HasFlag(PortFlag::SupportsReattach) ? PORT_RECONNECT_TIME_BOOT
269 break;
270
273 DPRINT("Port %u waiting %lu ms for reconnect after D3 cold\n", m_Port->Number(), Time);
274 break;
275
278 break;
279
280 /* A separate WDF timer, which the port stop never cancels */
282 {
284
285 if (Queued)
286 DPRINT1("Port %u reset poll timer was already queued\n", m_Port->Number());
287 NT_ASSERT(!Queued);
288 return;
289 }
290
291 default:
292 DPRINT1("Port %u asked for unknown timer %d\n", m_Port->Number(), (int)Timer);
294 return;
295 }
296
298}
299
302{
303 return m_Port->m_Timer.Cancel();
304}
305
306/* Notices to the device machine */
307
308VOID
310 _In_ PSM_DEVICE_NOTICE Notice)
311{
312 static const DsmEvent NoticeEvents[] =
313 {
314 DsmEvent::PortFault,
315 DsmEvent::PortDisableDone,
316 DsmEvent::PortResetAbortedForSuspend,
317 DsmEvent::PortResumeDone,
318 DsmEvent::PortSuspendDone,
319 DsmEvent::PortResumeAbortedForSuspend,
320 DsmEvent::PortResumeTimeout,
321 DsmEvent::PortNowDisabled,
322 DsmEvent::PortNowEnabled,
323 DsmEvent::PortNowSuspended,
324 DsmEvent::PortResetTimeout,
325 DsmEvent::PortResetDone,
326 DsmEvent::PortTimeoutSet,
327 DsmEvent::PortNowEnabledOnReconnect
328 };
329
330 NT_ASSERT((ULONG)Notice < RTL_NUMBER_OF(NoticeEvents));
331
332 if (m_Port->m_Child != NULL)
333 m_Port->m_Child->Post(NoticeEvents[Notice]);
334}
335
336/* Attach, detach and re-attach */
337
340{
341 return HubChild::Create(m_Port) != NULL;
342}
343
344/* The device machine is idle and handles PortAttached inside this post */
347{
349
350 Child->ClearState(ChildState::AttachSucceeded);
351 m_Port->ClearFlag(PortFlag::SupportsReattach);
352
353 Child->Post(DsmEvent::PortAttached);
354
355 if (!Child->HasState(ChildState::AttachSucceeded))
356 {
357 DPRINT1("Port %u device %p attach failed\n", m_Port->Number(), Child);
359 return FALSE;
360 }
361
362 m_Port->SetFlag(PortFlag::DeviceConnected);
363 m_Port->m_ConnectionStatus = DeviceEnumerating;
364 return TRUE;
365}
366
367/* UCX keeps a boot device's transfers alive so it can come back */
368VOID
370{
372
373 m_Port->m_Child->Post(DsmEvent::PortDetached);
374
375 if (!m_Port->HasFlag(PortFlag::SupportsReattach))
377}
378
379VOID
381{
382 m_Port->m_Child->Post(DsmEvent::PortReattached);
383 m_Port->SetFlag(PortFlag::DeviceConnected);
384 m_Port->m_ConnectionStatus = DeviceEnumerating;
385}
386
387/* Runs when a DeviceGone is taken off the queue */
388VOID
390{
392
393 if (Child != NULL)
394 {
395 if (Child->HasState(ChildState::DifferentDeviceOnBootPort))
396 DPRINT("Port %u wrong device on the boot device port detached\n", m_Port->Number());
397
398 Child->ClearState(ChildState::DifferentDeviceOnBootPort);
399
400 if (!m_Port->HasFlag(PortFlag::SupportsReattach))
401 {
402 DPRINT("Port %u deleting detached device %p\n", m_Port->Number(), Child);
404 HubDeleteDeferred(Child->m_Object);
405 }
406 }
407
408 m_Port->ClearFlag(PortFlag::DeviceConnected);
409
412}
413
414/* Tells the kernel a boot device went away, once per absence */
415VOID
417{
419
420 if (!m_Port->HasFlag(PortFlag::SupportsReattach) ||
423 Child == NULL ||
424 InterlockedExchange(&Child->m_BootReportedMissing, 1) != 0)
425 {
426 return;
427 }
428
429 if (!Child->HasProperty(ChildProperty::IsHub))
430 m_Port->SetFlag(PortFlag::PendingRecoveryUpdate);
431
432 DPRINT("Port %u boot device %p reported missing\n", m_Port->Number(), Child);
433 HubNotifyBootDeviceRemoval(Child->m_BootHandle);
434}
435
436/* Device kind bits; the device machine is not running yet */
437
438VOID
440{
442}
443
444VOID
446{
448}
449
450VOID
452{
453 m_Port->m_Child->SetState(ChildState::WarmResetOnEnumeration);
454}
455
456/* Saved status updates and queries */
457
458VOID
460{
462}
463
464VOID
466{
468}
469
470VOID
472{
474}
475
478{
480}
481
482/* SS.Inactive and Compliance Mode mean something is attached even when not connected */
485{
488
490}
491
494{
496 return FALSE;
497
499 HubNoteHubOverCurrent(m_Port->m_Hub);
500 return TRUE;
501}
502
503VOID
505{
507}
508
511{
513}
514
517{
519}
520
521/* Selects the change for the next ack */
524{
526
527 if (*Change & PC_CONNECT)
528 {
529 *Change &= ~PC_CONNECT;
531 return TRUE;
532 }
533
534 if (*Change & PC_SUSPEND)
535 {
536 *Change &= ~PC_SUSPEND;
538 return TRUE;
539 }
540
541 return FALSE;
542}
543
546{
547 return (m_Port->m_ChangeAccumulator & PC_RESET) &&
548 m_Port->m_Hub->HasFlag(HubFlag::DelayAfterResetComplete);
549}
550
553{
554 return m_Port->HasFlag(PortFlag::DeviceConnected);
555}
556
559{
560 return m_Port->HasFlag(PortFlag::SupportsReattach);
561}
562
563/* While a SuperSpeed device's last SET_ADDRESS failed, connects wait longer */
566{
567 return !HubDriver.HasFlag(HubGlobal::PreventSuperSpeedDebounce) &&
569}
570
573{
576
577 Enabled = Child->HasProperty(ChildProperty::AcpiAllowsD3Cold) &&
578 Child->HasState(ChildState::D3ColdEnabledByDriver) &&
579 !m_Port->HasProperty(PortProperty::Removable) &&
580 Child->m_PowerState == PowerDeviceD3;
581
582 if (Enabled)
583 DPRINT("Port %u device %p is in D3 cold\n", m_Port->Number(), Child);
584
585 return Enabled;
586}
587
588VOID
591{
594
595 Bits->Connected = (Status & PS_CONNECTED) != 0;
596 Bits->Enabled = (Status & PS_ENABLED) != 0;
597 Bits->OverCurrent = (Status & PS_OVER_CURRENT) != 0;
598 Bits->OverCurrentChanged = (Change & PC_OVER_CURRENT) != 0;
599}
600
601/* Over current reset requested by user mode, see the WMI module */
602
603VOID
605{
606 m_Port->SetFlag(PortFlag::OverCurrentResetArmed);
607 DPRINT1("Hub %p port %u over current persists, notifying user\n", m_Port->m_Hub, m_Port->Number());
609}
610
611VOID
613{
614 m_Port->ClearFlag(PortFlag::OverCurrentResetArmed);
615}
616
617/* The enumeration failure text the device shows for a broken link */
618VOID
620{
622
623 if (Link == LINK_SS_INACTIVE)
625 else if (Link == LINK_COMPLIANCE)
627}
628
629/* Device machine requests to its port */
630
631VOID
633{
634 m_Device->m_Port->Post(PortEvent::DeviceGone);
635}
636
637VOID
639{
640 m_Device->m_Port->Post(PortEvent::DisableRequest);
641}
642
643VOID
645{
646 m_Device->m_Port->Post(PortEvent::SuspendRequest);
647}
648
649VOID
651{
652 m_Device->m_Port->Post(PortEvent::ResumeRequest);
653}
654
655VOID
657{
658 m_Device->m_Port->Post(PortEvent::CycleRequest);
659}
660
661VOID
663{
664 m_Device->m_Port->Post(PortEvent::ResetRequest);
665}
666
667VOID
669{
670 m_Device->m_Port->Post(PortEvent::WarmResetRequest);
671}
672
673VOID
675{
676 m_Device->m_Port->Post(PortEvent::DisableSuperSpeedRequest);
677}
678
679VOID
681{
682 m_Device->m_Port->Post(PortEvent::SetU1Timeout);
683}
684
685VOID
687{
688 m_Device->m_Port->Post(PortEvent::SetU2Timeout);
689}
690
691VOID
693{
694 m_Device->m_Port->Post(PortEvent::HibernateRequest);
695}
#define PAGED_CODE()
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
unsigned char BOOLEAN
Definition: actypes.h:127
#define InterlockedExchange
Definition: armddk.h:54
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
HubFdo * Hub
Definition: bootdev.cpp:261
USHORT Change
Definition: bootdev.cpp:133
HubChild * m_Device
Definition: devsm.h:1832
VOID RequestPortDisable()
Definition: hubport.cpp:638
VOID RequestU2Timeout()
Definition: hubport.cpp:686
VOID RequestPortReset()
Definition: hubport.cpp:662
VOID RequestHibernationPrep()
Definition: hubport.cpp:692
VOID RequestPortSuspend()
Definition: hubport.cpp:644
VOID RequestSuperSpeedDisable()
Definition: hubport.cpp:674
VOID AskPortCycle()
Definition: hubport.cpp:656
VOID RequestPortResume()
Definition: hubport.cpp:650
VOID RequestPortWarmReset()
Definition: hubport.cpp:668
VOID NotifyPortDetached()
Definition: hubport.cpp:632
VOID RequestU1Timeout()
Definition: hubport.cpp:680
HubPort * m_Port
Definition: hubchild.h:317
VOID ClearState(_In_ ChildState Flag)
Definition: hubchild.h:274
ULONG m_Kind
Definition: hubchild.h:328
VOID Post(_In_ DsmEvent Event)
Definition: hubchild.h:253
ULONG m_EnumMessageId
Definition: hubchild.h:355
VOID SetState(_In_ ChildState Flag)
Definition: hubchild.h:267
static HubChild * Create(_In_ HubPort *Port)
Definition: hubchild.cpp:94
Definition: fdo.h:132
WDFDEVICE m_Device
Definition: fdo.h:349
PUCXHUB_WORKITEM AllocateWorkItem()
Definition: fdo.cpp:46
UCXHUB_STACK_INTERFACE m_Stack
Definition: fdo.h:356
BOOLEAN HasFlag(_In_ HubFlag Flag) const
Definition: fdo.h:153
VOID EnqueueWorkItem(_In_ PUCXHUB_WORKITEM WorkItem, _In_ PUCXHUB_WORKITEM_ROUTINE Routine, _In_ PVOID Context, _In_ BOOLEAN ForwardProgress)
Definition: fdo.cpp:54
UCXUSBDEVICE UsbDevice() const
Definition: fdo.h:180
BOOLEAN IsHubResetInProgress() const
Definition: fdo.h:333
BOOLEAN NeedsForwardProgress() const
Definition: fdo.h:208
BOOLEAN IsRootHub() const
Definition: fdo.h:174
static UCXHUB_WORKITEM_ROUTINE MachineWorkItem
Definition: hubport.h:292
BOOLEAN HasMuxFlag(_In_ PortMuxFlag Flag) const
Definition: hubport.h:164
static EVT_WDF_TIMER ResetPollFired
Definition: hubport.h:289
BOOLEAN HasProperty(_In_ PortProperty Property) const
Definition: hubport.h:206
HubChild * m_Child
Definition: hubport.h:236
static HubPort * FromObject(_In_ WDFOBJECT Object)
Definition: hubport.cpp:30
static EVT_WDF_OBJECT_CONTEXT_CLEANUP EvtCleanup
Definition: hubport.h:290
USHORT m_ChangeAccumulator
Definition: hubport.h:246
VOID ClearMuxFlag(_In_ PortMuxFlag Flag)
Definition: hubport.h:178
USHORT Number() const
Definition: hubport.h:213
USHORT m_PreviousStatus
Definition: hubport.h:245
VOID Post(_In_ PortEvent Event)
Definition: hubport.h:157
USHORT m_SelectedFeature
Definition: hubport.h:247
static EVT_WDF_OBJECT_CONTEXT_DESTROY EvtDestroy
Definition: hubport.h:291
WDFOBJECT m_Object
Definition: hubport.h:227
USB_CONNECTION_STATUS m_ConnectionStatus
Definition: hubport.h:254
_In_ const HubPortInfo * Info
Definition: hubport.h:149
PUCXHUB_WORKITEM m_WorkItem
Definition: hubport.h:240
HubPortStatus m_Current
Definition: hubport.h:244
WDFTIMER m_ResetPollTimer
Definition: hubport.h:239
VOID SetMuxFlag(_In_ PortMuxFlag Flag)
Definition: hubport.h:171
VOID SetFlag(_In_ PortFlag Flag)
Definition: hubport.h:192
VOID ClearFlag(_In_ PortFlag Flag)
Definition: hubport.h:199
BOOLEAN HasFlag(_In_ PortFlag Flag) const
Definition: hubport.h:185
ULONG m_D3ColdReconnectTimeout
Definition: hubport.h:255
HubFdo * m_Hub
Definition: hubport.h:228
static VOID NTAPI TimerFired(_In_ PVOID Context)
Definition: hubport.cpp:146
HubTimer m_Timer
Definition: hubport.h:238
VOID Start(_In_ ULONG Milliseconds)
Definition: hubutil.h:104
BOOLEAN Cancel()
Definition: hubutil.h:115
VOID ReattachBootDevice()
Definition: hubport.cpp:380
BOOLEAN OldDevicePresent()
Definition: hubport.cpp:552
HubPort * m_Port
Definition: portsm.h:950
VOID RecordPortSuspended()
Definition: hubport.cpp:471
VOID DisconnectDevice()
Definition: hubport.cpp:369
BOOLEAN OverCurrentActive()
Definition: hubport.cpp:493
BOOLEAN BootDeviceReturning()
Definition: hubport.cpp:558
VOID RecordPortDisabled()
Definition: hubport.cpp:465
BOOLEAN LinkInU0()
Definition: hubport.cpp:510
BOOLEAN DeviceConnected()
Definition: hubport.cpp:477
BOOLEAN NeedsDebounce()
Definition: hubport.cpp:565
VOID LogLinkStateError()
Definition: hubport.cpp:619
VOID NotifyUserOfOverCurrent()
Definition: hubport.cpp:604
VOID ResetChangeAccumulator()
Definition: hubport.cpp:459
BOOLEAN StopTimer()
Definition: hubport.cpp:301
VOID ForceResetOnEnumeration()
Definition: hubport.cpp:451
VOID ReferencePort()
Definition: hubport.cpp:176
BOOLEAN PortPowered()
Definition: hubport.cpp:516
BOOLEAN PollResetCompletion()
Definition: hubport.cpp:545
static const State Enabled
Definition: portsm.h:222
VOID HubPowerDrop()
Definition: hubport.cpp:218
VOID DereferencePort()
Definition: hubport.cpp:182
VOID TellDevice(_In_ PSM_DEVICE_NOTICE Notice)
Definition: hubport.cpp:309
VOID CancelUserOverCurrentReset()
Definition: hubport.cpp:612
VOID QueuePassiveWork()
Definition: hubport.cpp:188
VOID MarkUsb3Device()
Definition: hubport.cpp:445
VOID ReadPortBits(_Out_ PPSM_PORT_BITS Bits)
Definition: hubport.cpp:589
VOID NotifyBootDeviceRemoval()
Definition: hubport.cpp:416
BOOLEAN ConnectDevice()
Definition: hubport.cpp:346
VOID MarkOverCurrentCause()
Definition: hubport.cpp:504
VOID MarkUsb2Device()
Definition: hubport.cpp:439
VOID StartTimer(_In_ PSM_TIMER Timer)
Definition: hubport.cpp:230
BOOLEAN HubPowerTake()
Definition: hubport.cpp:198
BOOLEAN DevicePresent()
Definition: hubport.cpp:484
BOOLEAN D3ColdEnabled()
Definition: hubport.cpp:572
BOOLEAN CreateDevice()
Definition: hubport.cpp:339
BOOLEAN ConnectChangedOnResume()
Definition: hubport.cpp:523
VOID ForgetDetachedDevice()
Definition: hubport.cpp:389
#define DSM_KIND_PORT30
Definition: devsm.h:153
#define DSM_KIND_SUPER_SPEED
Definition: devsm.h:150
DsmEvent
Definition: devsm.h:15
#define DSM_KIND_PORT20
Definition: devsm.h:152
_In_ ULONG Attributes
Definition: dispmprt.h:1077
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define _IRQL_requires_(irql)
Definition: driverspecs.h:229
VOID NTAPI HubNotifyBootDeviceRemoval(_In_opt_ PVOID Handle)
Definition: entry.cpp:335
HubDriverState HubDriver
Definition: entry.cpp:13
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
Status
Definition: gdiplustypes.h:24
CPPORT Port[4]
Definition: headless.c:38
#define HUB_ENUM_LINK_COMPLIANCE
Definition: hubid.h:33
#define HUB_ENUM_LINK_SS_INACTIVE
Definition: hubid.h:32
#define HUB_PORT_RESUME_WAIT_MS
Definition: hubport.cpp:20
#define PORT_RECONNECT_TIME
Definition: hubport.cpp:25
#define PORT_RESET_TIME
Definition: hubport.cpp:19
#define PORT_RESET_POLL_TIME
Definition: hubport.cpp:27
#define PORT_RECONNECT_TIME_BOOT
Definition: hubport.cpp:24
#define PORT_RESUME_RECOVERY_TIME
Definition: hubport.cpp:21
#define PORT_DEBOUNCE_TIME
Definition: hubport.cpp:17
#define PORT_OVERCURRENT_TIME
Definition: hubport.cpp:18
#define PORT_POWER_ON_TIME
Definition: hubport.cpp:23
#define PORT_POWER_ON_TIME_ROOT
Definition: hubport.cpp:22
static const char HubTagPort[]
Definition: hubport.cpp:14
#define PORT_SUPERSPEED_DISABLE_TIME
Definition: hubport.cpp:26
#define PS_SUSPENDED
Definition: hubreq.h:128
#define PC_RESET
Definition: hubreq.h:140
#define PC_OVER_CURRENT
Definition: hubreq.h:139
#define PC_SUSPEND
Definition: hubreq.h:138
#define LINK_SS_INACTIVE
Definition: hubreq.h:119
#define PC_CONNECT
Definition: hubreq.h:136
#define PS_OVER_CURRENT
Definition: hubreq.h:129
#define PS_CONNECTED
Definition: hubreq.h:126
#define PORT_C_CONNECTION
Definition: hubreq.h:101
#define PS_POWER_30
Definition: hubreq.h:134
#define PORT_C_SUSPEND
Definition: hubreq.h:103
#define PS_ENABLED
Definition: hubreq.h:127
FORCEINLINE USHORT NTAPI HubLinkState(_In_ USHORT Status)
Definition: hubreq.h:159
#define HUB_FEATURE_NONE
Definition: hubreq.h:14
#define LINK_COMPLIANCE
Definition: hubreq.h:122
VOID NTAPI HubWmiNotifyOverCurrent(_In_ HubFdo *Hub, _In_ ULONG PortNumber)
Definition: hubwmi.cpp:750
_In_opt_ PVOID _In_ PUCXHUB_WORKITEM WorkItem
Definition: hubucx.h:227
FORCEINLINE VOID NTAPI HubDereferenceDeferred(_In_ WDFOBJECT Object)
Definition: hubutil.h:181
FORCEINLINE VOID NTAPI HubDeleteDeferred(_In_ WDFOBJECT Object)
Definition: hubutil.h:195
FORCEINLINE VOID NTAPI HubClearListEntry(_Out_ PLIST_ENTRY Entry)
Definition: hubutil.h:149
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
static PLARGE_INTEGER Time
Definition: time.c:37
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
@ PowerDeviceD3
Definition: ntpoapi.h:52
unsigned short USHORT
Definition: pedump.c:61
enum _PSM_TIMER PSM_TIMER
@ PsmTimerResetPoll
Definition: portsm.h:102
@ PsmTimerResumeCompletion
Definition: portsm.h:96
@ PsmTimerReconnect
Definition: portsm.h:99
@ PsmTimerOverCurrent
Definition: portsm.h:94
@ PsmTimerResumeRecovery
Definition: portsm.h:97
@ PsmTimerPowerOn
Definition: portsm.h:98
@ PsmTimerSuperSpeedDisable
Definition: portsm.h:101
@ PsmTimerDebounce
Definition: portsm.h:93
@ PsmTimerD3ColdReconnect
Definition: portsm.h:100
@ PsmTimerResetCompletion
Definition: portsm.h:95
enum _PSM_DEVICE_NOTICE PSM_DEVICE_NOTICE
@ Failed
Definition: arc.h:88
#define DPRINT
Definition: sndvol32.h:73
volatile LONG SuperSpeedDebounceVotes
Definition: hubdriver.h:108
BOOLEAN HasFlag(_In_ HubGlobal Flag) const
Definition: hubdriver.h:119
USB_PORT_STATUS_AND_CHANGE StatusChange
Definition: hubport.h:56
PFN_UCXHUB_DEVICE_DISCONNECT DeviceDisconnect
Definition: hubucx.h:436
#define NTAPI
Definition: typedefs.h:36
uint32_t ULONG
Definition: typedefs.h:59
USHORT AsUshort16
Definition: usb200.h:231
USB_PORT_STATUS PortStatus
Definition: usb200.h:241
USB_PORT_CHANGE PortChange
Definition: usb200.h:242
USHORT AsUshort16
Definition: usb200.h:223
@ DeviceGeneralFailure
Definition: usbioctl.h:281
@ DeviceCausedOvercurrent
Definition: usbioctl.h:282
@ NoDeviceConnected
Definition: usbioctl.h:278
WdfObjectDelete(String)
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
FORCEINLINE LONGLONG WDF_REL_TIMEOUT_IN_MS(_In_ ULONGLONG Time)
Definition: wdfcore.h:80
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
#define WdfDeviceStopIdle(Device, WaitForD0)
Definition: wdfdevice.h:1977
#define WdfDeviceResumeIdle(Device)
Definition: wdfdevice.h:1983
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
Definition: wdffdo.h:536
#define WdfObjectDereferenceWithTag(Handle, Tag)
Definition: wdfobject.h:829
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
Definition: wdfobject.h:147
#define WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(_attributes, _contexttype)
Definition: wdfobject.h:170
@ WdfExecutionLevelPassive
Definition: wdfobject.h:54
#define WdfObjectReference(Handle)
Definition: wdfobject.h:803
#define WdfObjectReferenceWithTag(Handle, Tag)
Definition: wdfobject.h:806
FORCEINLINE VOID WDF_TIMER_CONFIG_INIT(_Out_ PWDF_TIMER_CONFIG Config, _In_ PFN_WDF_TIMER EvtTimerFunc)
Definition: wdftimer.h:111
#define NT_ASSERT
Definition: rtlfuncs.h:3334