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
33 return HubGetPortContext(
Object);
76 DPRINT1(
"Port %u control request creation failed 0x%lx\n",
Port->Number(),
Status);
83 if (
Hub->
HasFlag(HubFlag::DelayAfterResetComplete))
92 DPRINT1(
"Port %u reset poll timer creation failed 0x%lx\n",
Port->Number(),
Status);
100 DPRINT1(
"Port %u work item allocation failed\n",
Port->Number());
123 Port->Post(PortEvent::PortCleanup);
124 Port->m_Hub->FlushAndDeleteWorkItem(&
Port->m_WorkItem);
138 Port->m_Timer.Cancel();
157 HubGetPortContext(WdfTimerGetParentObject(
Timer))->Post(PortEvent::ResetPollExpired);
203 if (!
Hub->
HasFlag(HubFlag::PowerReferenceAllowed))
312 static const DsmEvent NoticeEvents[] =
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
353 Child->Post(DsmEvent::PortAttached);
355 if (!
Child->HasState(ChildState::AttachSucceeded))
395 if (
Child->HasState(ChildState::DifferentDeviceOnBootPort))
398 Child->ClearState(ChildState::DifferentDeviceOnBootPort);
429 if (!
Child->HasProperty(ChildProperty::IsHub))
577 Enabled =
Child->HasProperty(ChildProperty::AcpiAllowsD3Cold) &&
578 Child->HasState(ChildState::D3ColdEnabledByDriver) &&
#define InterlockedExchange
VOID RequestPortDisable()
VOID RequestHibernationPrep()
VOID RequestPortSuspend()
VOID RequestSuperSpeedDisable()
VOID RequestPortWarmReset()
VOID NotifyPortDetached()
VOID ClearState(_In_ ChildState Flag)
VOID Post(_In_ DsmEvent Event)
VOID SetState(_In_ ChildState Flag)
static HubChild * Create(_In_ HubPort *Port)
PUCXHUB_WORKITEM AllocateWorkItem()
UCXHUB_STACK_INTERFACE m_Stack
BOOLEAN HasFlag(_In_ HubFlag Flag) const
VOID EnqueueWorkItem(_In_ PUCXHUB_WORKITEM WorkItem, _In_ PUCXHUB_WORKITEM_ROUTINE Routine, _In_ PVOID Context, _In_ BOOLEAN ForwardProgress)
UCXUSBDEVICE UsbDevice() const
BOOLEAN IsHubResetInProgress() const
BOOLEAN NeedsForwardProgress() const
BOOLEAN IsRootHub() const
static UCXHUB_WORKITEM_ROUTINE MachineWorkItem
BOOLEAN HasMuxFlag(_In_ PortMuxFlag Flag) const
static EVT_WDF_TIMER ResetPollFired
BOOLEAN HasProperty(_In_ PortProperty Property) const
static HubPort * FromObject(_In_ WDFOBJECT Object)
static EVT_WDF_OBJECT_CONTEXT_CLEANUP EvtCleanup
USHORT m_ChangeAccumulator
VOID ClearMuxFlag(_In_ PortMuxFlag Flag)
VOID Post(_In_ PortEvent Event)
static EVT_WDF_OBJECT_CONTEXT_DESTROY EvtDestroy
USB_CONNECTION_STATUS m_ConnectionStatus
_In_ const HubPortInfo * Info
PUCXHUB_WORKITEM m_WorkItem
WDFTIMER m_ResetPollTimer
VOID SetMuxFlag(_In_ PortMuxFlag Flag)
VOID SetFlag(_In_ PortFlag Flag)
VOID ClearFlag(_In_ PortFlag Flag)
BOOLEAN HasFlag(_In_ PortFlag Flag) const
ULONG m_D3ColdReconnectTimeout
static VOID NTAPI TimerFired(_In_ PVOID Context)
VOID Start(_In_ ULONG Milliseconds)
VOID ReattachBootDevice()
BOOLEAN OldDevicePresent()
VOID RecordPortSuspended()
BOOLEAN OverCurrentActive()
BOOLEAN BootDeviceReturning()
VOID RecordPortDisabled()
BOOLEAN DeviceConnected()
VOID NotifyUserOfOverCurrent()
VOID ResetChangeAccumulator()
VOID ForceResetOnEnumeration()
BOOLEAN PollResetCompletion()
static const State Enabled
VOID TellDevice(_In_ PSM_DEVICE_NOTICE Notice)
VOID CancelUserOverCurrentReset()
VOID ReadPortBits(_Out_ PPSM_PORT_BITS Bits)
VOID NotifyBootDeviceRemoval()
VOID MarkOverCurrentCause()
VOID StartTimer(_In_ PSM_TIMER Timer)
BOOLEAN ConnectChangedOnResume()
VOID ForgetDetachedDevice()
#define DSM_KIND_SUPER_SPEED
#define NT_SUCCESS(StatCode)
#define _IRQL_requires_(irql)
VOID NTAPI HubNotifyBootDeviceRemoval(_In_opt_ PVOID Handle)
#define HUB_ENUM_LINK_COMPLIANCE
#define HUB_ENUM_LINK_SS_INACTIVE
#define HUB_PORT_RESUME_WAIT_MS
#define PORT_RECONNECT_TIME
#define PORT_RESET_POLL_TIME
#define PORT_RECONNECT_TIME_BOOT
#define PORT_RESUME_RECOVERY_TIME
#define PORT_DEBOUNCE_TIME
#define PORT_OVERCURRENT_TIME
#define PORT_POWER_ON_TIME
#define PORT_POWER_ON_TIME_ROOT
static const char HubTagPort[]
#define PORT_SUPERSPEED_DISABLE_TIME
#define PORT_C_CONNECTION
FORCEINLINE USHORT NTAPI HubLinkState(_In_ USHORT Status)
VOID NTAPI HubWmiNotifyOverCurrent(_In_ HubFdo *Hub, _In_ ULONG PortNumber)
_In_opt_ PVOID _In_ PUCXHUB_WORKITEM WorkItem
FORCEINLINE VOID NTAPI HubDereferenceDeferred(_In_ WDFOBJECT Object)
FORCEINLINE VOID NTAPI HubDeleteDeferred(_In_ WDFOBJECT Object)
FORCEINLINE VOID NTAPI HubClearListEntry(_Out_ PLIST_ENTRY Entry)
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
static PLARGE_INTEGER Time
#define UNREFERENCED_PARAMETER(P)
enum _PSM_TIMER PSM_TIMER
@ PsmTimerResumeCompletion
@ PsmTimerSuperSpeedDisable
@ PsmTimerD3ColdReconnect
@ PsmTimerResetCompletion
enum _PSM_DEVICE_NOTICE PSM_DEVICE_NOTICE
volatile LONG SuperSpeedDebounceVotes
BOOLEAN HasFlag(_In_ HubGlobal Flag) const
USB_PORT_STATUS_AND_CHANGE StatusChange
PFN_UCXHUB_DEVICE_DISCONNECT DeviceDisconnect
USB_PORT_STATUS PortStatus
USB_PORT_CHANGE PortChange
@ DeviceCausedOvercurrent
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
FORCEINLINE LONGLONG WDF_REL_TIMEOUT_IN_MS(_In_ ULONGLONG Time)
_In_ PDEVICE_OBJECT DeviceObject
#define WdfDeviceStopIdle(Device, WaitForD0)
#define WdfDeviceResumeIdle(Device)
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
#define WdfObjectDereferenceWithTag(Handle, Tag)
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
#define WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(_attributes, _contexttype)
@ WdfExecutionLevelPassive
#define WdfObjectReference(Handle)
#define WdfObjectReferenceWithTag(Handle, Tag)
FORCEINLINE VOID WDF_TIMER_CONFIG_INIT(_Out_ PWDF_TIMER_CONFIG Config, _In_ PFN_WDF_TIMER EvtTimerFunc)