14#define PORT_OVER_CURRENT_LIMIT 5
15#define PORT_OVER_CURRENT_WINDOW (3LL * 1000 * 1000 * 10)
37 DPRINT(
"Hub %p port %u resume pending, hub kept awake\n",
Hub,
Port->Number());
83 UCHAR RequestCode =
Port->m_Control.Urb.SetupPacket[1];
90 DPRINT1(
"Hub %p port %u control request 0x%x failed 0x%lx, URB status 0x%lx\n",
96 DPRINT(
"Hub %p port %u status 0x%x change 0x%x\n",
98 Port->m_Current.StatusChange.PortStatus.AsUshort16,
Port->m_Current.StatusChange.PortChange.AsUshort16);
106 Port->m_Control.Reuse();
307 *
Change &= ~m_Port->m_ChangeAccumulator;
312 if (Bit == 0 || !(*
Change & Bit))
340 if (!
Port->m_InitialConnectPowerReference)
344 Port->m_InitialConnectPowerReference =
FALSE;
460 DPRINT1(
"Hub %p port %u still in SS.Inactive, already reported\n",
Hub,
Port->Number());
514 What =
"over current";
521 DPRINT(
"Hub %p port %u empty, no change\n",
Port->m_Hub,
Port->Number());
525 What =
"invalid status";
529 What =
"invalid status, hub reset";
533 What =
"link error, port reset";
539 DPRINT(
"Hub %p port %u connect change\n",
Port->m_Hub,
Port->Number());
550 DPRINT1(
"Hub %p port %u %s: status 0x%x previous 0x%x change 0x%x\n",
576 if (
Result == PortEvent::ChangeLinkError)
579 if (
Result == PortEvent::ChangeNeedsHubReset)
585 if (
Result != PortEvent::ChangeNone)
606 Result = PortEvent::ChangeConnect;
617 Result = PortEvent::ChangeOverCurrent;
622 Result = PortEvent::ChangeOverCurrentCleared;
627 Result = PortEvent::ChangeDisabled;
631 Result = PortEvent::ChangeResumed;
645 DPRINT1(
"Hub %p port %u bad status during reset: status 0x%x change 0x%x\n",
654 return (
Status &
PS_ENABLED) ? PortEvent::ErrorCycle : PortEvent::ChangeNeedsHubReset;
657 return PortEvent::ErrorCycle;
662 return PortEvent::ChangeOverCurrent;
667 return (
Status &
PS_ENABLED) ? PortEvent::ErrorEnabledWhileReset : PortEvent::ErrorIgnore;
669 return PortEvent::ErrorIgnore;
678 return PortEvent::ErrorCycle;
681 return PortEvent::ErrorIgnore;
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE ACPI_HANDLE ACPI_HANDLE *OutHandle ACPI_HANDLE *OutHandle void *Context void *Context ACPI_EVENT_HANDLER Handler UINT32 UINT32 ACPI_GPE_HANDLER void *Context UINT32 ACPI_NOTIFY_HANDLER void *Context ACPI_ADR_SPACE_TYPE ACPI_ADR_SPACE_HANDLER ACPI_ADR_SPACE_SETUP Setup
_In_ ULONG const _In_ FEATURE_NUMBER const Feature
_In_ DsmEvent _In_ PCSTR What
WDFIOTARGET m_RootHubTarget
ULONG m_LastResetPortStatus
BOOLEAN HasFlag(_In_ HubFlag Flag) const
UCXUSBDEVICE UsbDevice() const
BOOLEAN NeedsForwardProgress() const
BOOLEAN HasProperty(_In_ PortProperty Property) const
USHORT m_ChangeAccumulator
LARGE_INTEGER m_LastOverCurrentTime
BOOLEAN m_InitialConnectPowerReference
USB_CONNECTION_STATUS m_ConnectionStatus
VOID SendRemoteWake(_In_ BOOLEAN Enable)
PortEvent ErrorResponseDuringReset()
BOOLEAN SuperSpeedBlocked()
BOOLEAN OverCurrentPersists()
VOID FixPortStateAfterPowerUp()
PSM_PENDING PendingChange()
PortEvent ErrorResponse()
#define NT_SUCCESS(StatCode)
#define KeQuerySystemTime(t)
@ PendingHubPowerReference
#define PORT_F_U1_TIMEOUT
#define HUB_REQUEST_CLEAR_FEATURE
#define PORT_F_U2_TIMEOUT
#define PORT_C_LINK_STATE
#define HUB_MSG_CONTROL_TRANSFER_FAILED
#define PORT_F_REMOTE_WAKE_MASK
#define HUB_REQUEST_GET_STATUS
#define PORT_C_CONNECTION
#define HUB_MSG_INVALID_PORT_STATUS
#define HUB_REQUEST_SET_FEATURE
#define PORT_C_OVER_CURRENT
#define PORT_C_CONFIG_ERROR
FORCEINLINE USHORT NTAPI HubLinkState(_In_ USHORT Status)
#define PORT_F_LINK_STATE
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
#define _In_reads_bytes_opt_(s)
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG _In_ ULONG Length
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
enum _PSM_PENDING PSM_PENDING
static const PortChangeOrder PortChanges[]
static EVT_WDF_REQUEST_COMPLETION_ROUTINE PortControlComplete
#define PORT_OVER_CURRENT_WINDOW
static PortEvent NTAPI PortNextChange20(_In_ HubPort *Port, _In_ USHORT Status, _In_ USHORT Previous, _In_ USHORT Change)
static VOID NTAPI PortTrackPendingOperation(_In_ HubPort *Port, _In_ USBD_STATUS UrbStatus)
static PortEvent NTAPI PortNextChange30(_In_ HubPort *Port, _In_ USHORT Status, _In_ USHORT Previous, _In_ USHORT Change)
#define PORT_OVER_CURRENT_LIMIT
static VOID NTAPI PortDropInitialConnectReference(_In_ HubPort *Port)
static VOID NTAPI PortCacheSetFeature(_In_ HubPort *Port)
static VOID NTAPI PortReportChange(_In_ HubPort *Port, _In_ PortEvent Result, _In_ USHORT Status, _In_ USHORT Previous, _In_ USHORT Change)
static VOID NTAPI PortSendControl(_In_ HubPort *Port, _In_ UCHAR RequestType, _In_ UCHAR Request, _In_ USHORT Value, _In_ USHORT Index, _In_reads_bytes_opt_(Length) PVOID Buffer, _In_ USHORT Length)
static USHORT NTAPI PortIndex(_In_ HubPort *Port, _In_ UCHAR High)
USB_PORT_STATUS_AND_CHANGE StatusChange
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
USB_PORT_STATUS PortStatus
USB_PORT_CHANGE PortChange
@ ToleratesU0WhileDetached
@ IgnoreEnabledInSsInactive
@ DiscardEnableDuringReset
#define USBD_STATUS_PORT_OPERATION_PENDING
@ DeviceCausedOvercurrent
_In_ WDFCOLLECTION _In_ ULONG Index
#define WdfDeviceStopIdle(Device, WaitForD0)
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFQUEUE _In_ _Strict_type_match_ WDF_REQUEST_TYPE RequestType
#define WdfDeviceResumeIdle(Device)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO