ReactOS 0.4.17-dev-1281-g065abb3
hc.h
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS xHCI Host Controller Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Controller object, errata, recovery and the UCX controller callbacks
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#pragma once
9
11enum class XhciRecovery : ULONG
12{
13 Ignore,
15 Disable,
16 Gone,
19};
20
21#define XHCI_FIRMWARE_UNKNOWN 0xFFFFFFFFFFFFFFFFULL
22
25{
38
41
44};
45
48{
49public:
50 static XhciController*
52 _In_ WDFDEVICE Device);
53 static XhciController*
54 FromUcx(
55 _In_ UCXCONTROLLER UcxController);
56
59 _In_ XhciErrata Bit) const
60 {
61 ULONG Position = static_cast<ULONG>(Bit);
62
63 if (Position >= 64)
64 return (m_ErrataWord2 & (1ULL << (Position - 64))) != 0;
65
66 return (m_Errata & XhciErrataBit(Bit)) != 0;
67 }
68
70 VOID
72 _In_ XhciErrata Bit);
73
75 BOOLEAN IsAccessible() const;
76 VOID MarkGone();
77
80 VOID
81 RaiseControllerFault(
84
85 WDFDEVICE m_Device;
87 UCXCONTROLLER m_Ucx;
90
97
98
101
104 {
110 };
112
115
118
120 enum class SystemAction : ULONG
121 {
122 Boot = 0,
123 ResumeFromSleep = 1,
125 Sleep = 3,
126 HybridSleep = 4,
127 Hibernate = 5,
128 Shutdown = 6,
129 None = 7
130 };
132
135
138 ULONG
139 GetFrameNumber(
141
144 VOID
145 VerifierCheck(
146 _In_ ULONG Flag);
147
150 VOID OnRootHubD0Entry();
151
154 VOID
155 NotifyPortConnectState(
156 _In_ BOOLEAN AnyConnected);
157
158 /* Event handlers; the KMDF and UCX callbacks in hc.cpp forward here */
161 _In_ WDFDEVICE Device,
162 _In_ UCXCONTROLLER Ucx,
163 _In_ const XhciIdentity* Identity);
166 _In_ WDFCMRESLIST Raw,
167 _In_ WDFCMRESLIST Translated);
170 D0Entry(
176 VOID
177 D0Exit(
181 VOID
184 _In_ BOOLEAN InPath);
185 VOID
187 _In_ BOOLEAN Arm);
188 VOID
194 VOID UcxReset();
197 _In_ const GUID* Capability,
202
205
206private:
207 enum class IdleStatus : ULONG
208 {
210 NoS0Wake,
212 };
213
216 VOID
218 _In_ BOOLEAN AtAddDevice);
223 VOID
225 _In_ ULONG Milliseconds);
226 VOID
232
235 RunD0Pass(
236 _In_ BOOLEAN Restore);
238
240 VOID
241 QueueRecovery(
242 _In_ ULONG Actions,
244 VOID
246 _In_ ULONG Actions);
247 VOID
249 _In_ ULONG Actions);
251 VOID
252 SetGone(
253 _In_ BOOLEAN ReportToPnp);
255 VOID DisableController();
257
258 ULONG64
259 NowMs() const;
260
275
276 WDFTIMER m_Watchdog;
277 WDFWORKITEM m_RecoveryItem;
278 WDFWORKITEM m_IdleItem;
279
280 /* Recovery state */
286};
287
290{
294};
295
Type
Definition: Type.h:7
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
_In_ BOOLEAN _In_ BOOLEAN SetIdleTimeout
Definition: cdrom.h:1429
_In_ CDROM_SCAN_FOR_SPECIAL_INFO _In_ PCDROM_SCAN_FOR_SPECIAL_HANDLER Function
Definition: cdrom.h:1156
XhciSlotTable m_Slots
Definition: hc.h:93
VOID InternalReset()
Definition: hc.cpp:2113
LONG64 m_FrameSnapshot
Definition: hc.h:265
_IRQL_requires_max_(DISPATCH_LEVEL) VOID RaiseControllerFault(_In_ XhciRecovery Action
ULONG64 NowMs() const
Definition: hc.cpp:1783
WDF_POWER_DEVICE_STATE m_PowerState
Definition: hc.h:117
KSPIN_LOCK m_RecoveryLock
Definition: hc.h:281
BOOLEAN m_PnpToldRemoved
Definition: hc.h:285
@ FixFrescoShadow
Definition: hc.h:105
@ FixAsmediaResetDelay
Definition: hc.h:109
@ FixEtronClear
Definition: hc.h:108
@ FixFrescoControl
Definition: hc.h:106
@ FixEtronSet
Definition: hc.h:107
VOID WatchdogTick()
Definition: hc.cpp:1848
NTSTATUS D0EntryPostInterruptsEnabled(_In_ WDF_POWER_DEVICE_STATE PreviousState)
Definition: hc.cpp:1574
VOID UsageNotification(_In_ WDF_SPECIAL_FILE_TYPE Type, _In_ BOOLEAN InPath)
Definition: hc.cpp:1734
_IRQL_requires_max_(DISPATCH_LEVEL) VOID QueueRecovery(_In_ ULONG Actions
VOID QueryErrataDatabase(_In_ BOOLEAN AtAddDevice)
Definition: hc.cpp:432
VOID IdleTimeoutWorker()
Definition: hc.cpp:822
_IRQL_requires_max_(DISPATCH_LEVEL) ULONG GetFrameNumber(_In_ ULONG Increment)
static XhciController * FromDevice(_In_ WDFDEVICE Device)
Definition: hc.cpp:169
_IRQL_requires_max_(DISPATCH_LEVEL) VOID NotifyPortConnectState(_In_ BOOLEAN AnyConnected)
_IRQL_requires_max_(DISPATCH_LEVEL) VOID DisableController()
_IRQL_requires_max_(DISPATCH_LEVEL) VOID OnRootHubD0Entry()
VOID RecoveryWorker()
Definition: hc.cpp:2095
XhciCommonBuffer m_Buffers
Definition: hc.h:92
BOOLEAN HasErrata(_In_ XhciErrata Bit) const
Definition: hc.h:58
VOID EvaluatePrmi()
Definition: hc.cpp:723
XhciInterrupters m_Interrupters
Definition: hc.h:94
VOID SelfManagedIoCleanup()
Definition: hc.cpp:1722
IdleStatus m_IdleStatus
Definition: hc.h:273
PDEVICE_OBJECT m_WdmDevice
Definition: hc.h:86
ULONG m_RecoveryActions
Definition: hc.h:282
NTSTATUS RunD0Pass(_In_ BOOLEAN Restore)
Definition: hc.cpp:1329
ULONG m_RestoreFailures
Definition: hc.h:268
WDFDEVICE m_Device
Definition: hc.h:85
XhciCommandRing m_Commands
Definition: hc.h:95
_In_ ULONG Reason
Definition: hc.h:83
NTSTATUS QueryUsbCapability(_In_ const GUID *Capability, _In_ ULONG OutputBufferLength, _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, _Out_ PULONG ResultLength)
Definition: hc.cpp:2210
VOID BootRecovery(_In_ ULONG Actions)
Definition: hc.cpp:1971
ULONG m_LastIdleTimeout
Definition: hc.h:274
WDFTIMER m_Watchdog
Definition: hc.h:276
XhciIdentity m_Identity
Definition: hc.h:100
VOID SetPortWake(_In_ BOOLEAN Arm)
Definition: hc.cpp:836
BOOLEAN m_SaveFailed
Definition: hc.h:263
BOOLEAN m_TestMode
Definition: hc.h:204
_IRQL_requires_max_(DISPATCH_LEVEL) VOID SetGone(_In_ BOOLEAN ReportToPnp)
VOID SelfManagedIoInit()
Definition: hc.cpp:1668
ULONG64 m_InternalFlags
Definition: hc.h:111
BOOLEAN IsAccessible() const
Definition: hc.cpp:193
VOID PopulateErrata()
Definition: hc.cpp:580
UCXCONTROLLER m_Ucx
Definition: hc.h:87
ULONG64 m_Errata
Definition: hc.h:88
VOID ConfigureS0Idle()
Definition: hc.cpp:761
BOOLEAN m_ReservedIoArmed
Definition: hc.h:114
VOID SetInternalFlags()
Definition: hc.cpp:562
VOID RunFirmwareCommands()
Definition: hc.cpp:1536
VOID EvaluateDsm(_In_ ULONG Function)
Definition: hc.cpp:686
VOID TrackSystemPowerIrp(_In_ PIO_STACK_LOCATION Stack)
Definition: hc.cpp:1746
XhciRootHub m_RootHub
Definition: hc.h:96
VOID ReadRegistryErrata()
Definition: hc.cpp:522
BOOLEAN m_FrameSnapshotReady
Definition: hc.h:264
WDFWORKITEM m_IdleItem
Definition: hc.h:278
VOID RunRecovery(_In_ ULONG Actions)
Definition: hc.cpp:2024
LONG m_ResetLock
Definition: hc.h:272
SystemAction
Definition: hc.h:121
ULONG m_SpecialFiles
Definition: hc.h:267
VOID SetErrata(_In_ XhciErrata Bit)
Definition: hc.cpp:183
XhciRegisters m_Registers
Definition: hc.h:91
_IRQL_requires_max_(DISPATCH_LEVEL) VOID VerifierCheck(_In_ ULONG Flag)
XhciDmaBuffer * m_SplitPadBuffer
Definition: hc.h:134
VOID UpdateRegistryCounters()
Definition: hc.cpp:1689
SystemAction m_SystemAction
Definition: hc.h:131
BOOLEAN m_Gone
Definition: hc.h:262
ULONG m_RecoveryCount
Definition: hc.h:269
KMUTEX m_RecoveryMutex
Definition: hc.h:283
VOID ReadVerifierFlags()
Definition: hc.cpp:596
VOID InitFrameSnapshot()
Definition: hc.cpp:1805
NTSTATUS StartController()
Definition: hc.cpp:1483
static XhciController * FromUcx(_In_ UCXCONTROLLER UcxController)
Definition: hc.cpp:176
VOID D0ExitPreInterruptsDisabled()
Definition: hc.cpp:1604
VOID MarkGone()
Definition: hc.cpp:1924
VOID FdoCleanup()
Definition: hc.cpp:1229
WDFWORKITEM m_RecoveryItem
Definition: hc.h:277
NTSTATUS CreateWdfObjects()
Definition: hc.cpp:850
BOOLEAN m_GoneHandled
Definition: hc.h:284
VOID ReleaseHardware()
Definition: hc.cpp:1312
ULONG m_VerifierFlags
Definition: hc.h:261
BOOLEAN m_WaitWakeQueued
Definition: hc.h:203
ULONG64 m_ErrataWord2
Definition: hc.h:89
LONG m_ResetCount
Definition: hc.h:270
LONG m_ResetInterval
Definition: hc.h:271
VOID UcxReset()
Definition: hc.cpp:2193
ULONG m_TimeIncrement
Definition: hc.h:266
static GLfloat Identity[16]
Definition: matrix.c:127
ULONG KSPIN_LOCK
Definition: env_spec_w32.h:72
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG Increment
Definition: CrNtStubs.h:46
XhciRecovery
Definition: hc.h:12
XhciDriverData XhciDriver
Definition: xhcientry.cpp:23
@ PrepareHardware
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
Definition: hubucx.h:258
unsigned __int64 ULONG64
Definition: imports.h:198
#define _Enum_is_bitflag_
Definition: no_sal2.h:404
#define _Out_writes_bytes_opt_(s)
Definition: no_sal2.h:228
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
char CHAR
Definition: pedump.c:57
@ Raw
Definition: sacdrv.h:279
Definition: xml2sdb.h:103
PDRIVER_OBJECT DriverObject
Definition: hc.h:291
PVOID QueryDeviceFlags
Definition: hc.h:292
BOOLEAN TestMode
Definition: hc.h:293
UCHAR PciRevisionId
Definition: hc.h:29
ULONG PciDeviceId
Definition: hc.h:28
CHAR AcpiRevisionId[MAX_REVISION_ID_STRING_LENGTH]
Definition: hc.h:37
ULONG PciFunction
Definition: hc.h:34
CHAR AcpiDeviceId[MAX_DEVICE_ID_STRING_LENGTH]
Definition: hc.h:36
BUS_INTERFACE_STANDARD PciInterface
Definition: hc.h:43
ULONG PciVendorId
Definition: hc.h:27
CHAR AcpiVendorId[MAX_VENDOR_ID_STRING_LENGTH]
Definition: hc.h:35
ULONG64 FirmwareVersion
Definition: hc.h:40
USHORT PciSubsystemId
Definition: hc.h:31
ULONG PciDevice
Definition: hc.h:33
UCX_CONTROLLER_PARENT_BUS_TYPE ParentBus
Definition: hc.h:26
USHORT PciSubsystemVendorId
Definition: hc.h:30
ULONG PciBus
Definition: hc.h:32
static COORD Position
Definition: mouse.c:34
uint32_t * PULONG
Definition: typedefs.h:59
int64_t LONG64
Definition: typedefs.h:68
unsigned char UCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define MAX_DEVICE_ID_STRING_LENGTH
Definition: ucxcontroller.h:34
#define MAX_REVISION_ID_STRING_LENGTH
Definition: ucxcontroller.h:35
_In_ PGUID _In_ ULONG _Out_ PULONG ResultLength
Definition: ucxcontroller.h:83
#define MAX_VENDOR_ID_STRING_LENGTH
Definition: ucxcontroller.h:33
_In_ PGUID _In_ ULONG OutputBufferLength
Definition: ucxcontroller.h:81
WDF_EXTERN_C_START enum _UCX_CONTROLLER_PARENT_BUS_TYPE UCX_CONTROLLER_PARENT_BUS_TYPE
_In_ WDF_POWER_DEVICE_STATE PreviousState
Definition: wdfdevice.h:829
enum _WDF_SPECIAL_FILE_TYPE WDF_SPECIAL_FILE_TYPE
enum _WDF_POWER_DEVICE_STATE WDF_POWER_DEVICE_STATE
_In_ WDF_POWER_DEVICE_STATE TargetState
Definition: wdfdevice.h:859
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
Definition: wdfiotarget.h:863
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
Definition: wdfiotarget.h:510
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639
FORCEINLINE ULONG64 NTAPI XhciErrataBit(_In_ XhciErrata Bit)
Definition: xhcierrata.h:90
XhciErrata
Definition: xhcierrata.h:15
static void Initialize()
Definition: xlate.c:212