ReactOS 0.4.17-dev-1281-g065abb3
slotdev.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: USB device (xHCI slot) object and the UCX USB device callbacks
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#pragma once
9
10class XhciController;
11class XhciEndpoint;
12
14#define XHCI_MAX_DCI 31
15
18{
19public:
20 static XhciUsbDevice*
21 FromUcx(
22 _In_ UCXUSBDEVICE UsbDevice);
23
24 /* Context access for the endpoint module (input: control 0, slot 1, DCI n at n + 1) */
25 PVOID
27 _In_ ULONG Index) const;
28 PVOID
30 _In_ ULONG Dci) const;
33
35 VOID
38 _In_ ULONG ContextSize) const;
39
41 ULONG ContextEntries() const;
42
43 ULONG SlotId() const;
44 USB_DEVICE_SPEED Speed() const;
45 UCXUSBDEVICE Handle() const;
46
48 VOID
49 RingDoorbell(
50 _In_ ULONG Dci,
52
53 /* Endpoint table by DCI; adding the default endpoint records it at DCI 1 */
56 EndpointAt(
57 _In_ ULONG Dci) const;
58
60 VOID
61 AddEndpoint(
63
65 VOID
66 RemoveEndpoint(
68
74 VOID
75 ReconfigureEndpoint(
79
80 /* From the slot table */
81 VOID
83 _In_ const XHCI_TRB* Event);
84 VOID
86 _In_ const XHCI_TRB* Event);
88
91
93
96 VOID SetDisabled();
97
99 BOOLEAN IsSlotEnabled() const;
101 const USB_DEVICE_PORT_PATH* PortPath() const;
102 ULONG ContextSize() const;
103
104 /* Output endpoint context reads (xHCI 6.2.3) */
105 ULONG
107 _In_ ULONG Dci) const;
108 ULONG64
110 _In_ ULONG Dci) const;
111
112 /* Bodies of the UCX device callbacks */
117 _In_ UCXUSBDEVICE UsbDevice,
119 VOID
120 Cleanup(
122 VOID
123 Enable(
124 _In_ WDFREQUEST Request,
125 _Inout_ PUSBDEVICE_ENABLE Payload);
126 VOID
127 Address(
128 _In_ WDFREQUEST Request,
130 VOID
131 Update(
132 _In_ WDFREQUEST Request,
133 _Inout_ PUSBDEVICE_UPDATE Payload);
134 VOID
135 HubInfo(
136 _In_ WDFREQUEST Request,
137 _In_ const USBDEVICE_HUB_INFO* Payload);
138 VOID
140 _In_ WDFREQUEST Request,
142 VOID
143 Disable(
144 _In_ WDFREQUEST Request);
145 VOID
146 Reset(
147 _In_ WDFREQUEST Request);
148
149private:
151
153 enum class PendingKind : ULONG
154 {
155 None,
156 Enable,
157 Address,
158 Update,
159 Configure,
160 Disable,
161 Reset
162 };
163
165 enum class AfterDisable : ULONG
166 {
170 };
171
173 {
177 };
178
179 static
180 VOID
181 NTAPI
184 static
185 VOID
186 NTAPI
189
190 VOID
192 _In_ WDFREQUEST Request,
193 _In_ PVOID Payload,
194 _In_ PendingKind Kind,
195 _In_ BOOLEAN MustSucceed);
196 WDFREQUEST TakePending();
197 VOID
200 NTSTATUS LostSlotStatus() const;
201
202 VOID
204 _In_ ULONG Type);
208 _In_ BOOLEAN BlockSetAddress);
209 VOID
213
214 VOID
216 _In_ const XhciCommand* Command);
217 VOID
219 _In_ const XhciCommand* Command);
220 VOID
222 _In_ const XhciCommand* Command);
223 VOID
225 _In_ const XhciCommand* Command);
226 VOID
228 _In_ const XhciCommand* Command);
229 VOID
231 _In_ const XhciCommand* Command);
232
234 VOID
236 _Inout_ PUSBDEVICE_UPDATE Payload);
237
238 /* Tunnel state from ACPI for controllers whose errata ask for it */
239 static EVT_WDF_WORKITEM TunnelDsmWorker;
240 BOOLEAN
242 _In_ const USBDEVICE_UPDATE* Payload) const;
243 BOOLEAN
245 _Inout_ PUSBDEVICE_UPDATE Payload);
246
248 VOID
249 RunTunnelStateDsm(
250 _Inout_ PUSBDEVICE_UPDATE Payload);
251
253 VOID
255 _In_ BOOLEAN ClearTable);
256 VOID
259 _In_reads_(Count) UCXENDPOINT* Endpoints);
260 VOID
262 _In_ const ENDPOINTS_CONFIGURE* Payload);
264
265 VOID
267 _In_ const ReconfigureWaiter* Waiter);
268 VOID
271
274 const XHCI_SLOT_CONTEXT* OutputSlot() const;
275 XhciUsbDevice* TtHub() const;
276
277 UCXUSBDEVICE m_Handle;
283
293
296
299
300 /* The one device level command and the request it serves */
307
308 /* Single endpoint reconfigure, kept apart from the device command block */
316};
Type
Definition: Type.h:7
#define VOID
Definition: acefi.h:82
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
ULONG ContextSize() const
Definition: slotdev.cpp:377
WDFREQUEST m_PendingRequest
Definition: slotdev.h:302
VOID OnResetDeviceDone(_In_ const XhciCommand *Command)
Definition: slotdev.cpp:1541
BOOLEAN QueueTunnelStateDsm(_Inout_ PUSBDEVICE_UPDATE Payload)
Definition: slotdev.cpp:963
BOOLEAN m_MustSucceed
Definition: slotdev.h:305
VOID(NTAPI * PFN_RECONFIGURE_DONE)(_In_ PVOID Context, _In_ NTSTATUS Status)
Definition: slotdev.h:150
VOID PrepareCommand(_In_ ULONG Type)
Definition: slotdev.cpp:557
ULONG64 InputContextAddress() const
Definition: slotdev.cpp:277
VOID ForgetSlot()
Definition: slotdev.cpp:614
VOID BuildSlotContext(_Out_writes_bytes_(ContextSize) PVOID SlotContext, _In_ ULONG ContextSize) const
Definition: slotdev.cpp:1159
const XHCI_SLOT_CONTEXT * OutputSlot() const
Definition: slotdev.cpp:301
NTSTATUS LostSlotStatus() const
Definition: slotdev.cpp:551
BOOLEAN IsSlotEnabled() const
Definition: slotdev.cpp:359
PendingKind m_PendingKind
Definition: slotdev.h:304
BOOLEAN m_LpmEnabled
Definition: slotdev.h:291
VOID OnTransferEvent(_In_ const XHCI_TRB *Event)
Definition: slotdev.cpp:1707
PXHCI_SLOT_CONTEXT InputSlot() const
Definition: slotdev.cpp:295
VOID ControllerResetStarting()
Definition: slotdev.cpp:1746
XhciUsbDevice * TtHub() const
Definition: slotdev.cpp:383
VOID DisableDefaultEndpoint()
Definition: slotdev.cpp:456
_In_ ULONG StreamId
Definition: slotdev.h:51
_IRQL_requires_max_(DISPATCH_LEVEL) VOID SetDisabled()
_IRQL_requires_max_(DISPATCH_LEVEL) VOID ReconfigureEndpoint(_In_ XhciEndpoint *Endpoint
volatile LONG m_EndpointCount
Definition: slotdev.h:298
static VOID NTAPI ReconfigureCommandDone(_In_ XhciCommand *Command)
Definition: slotdev.cpp:1653
VOID DisableConfiguredEndpoints(_In_ BOOLEAN ClearTable)
Definition: slotdev.cpp:463
VOID OnEvaluateContextDone(_In_ const XhciCommand *Command)
Definition: slotdev.cpp:1108
XhciCommand m_Command
Definition: slotdev.h:301
XhciDmaBuffer * m_ReconfigureInput
Definition: slotdev.h:315
VOID OnDisableSlotDone(_In_ const XhciCommand *Command)
Definition: slotdev.cpp:1453
_IRQL_requires_max_(DISPATCH_LEVEL) XhciEndpoint *EndpointAt(_In_ ULONG Dci) const
ULONG SlotId() const
Definition: slotdev.cpp:335
const USB_DEVICE_DESCRIPTOR * DeviceDescriptor() const
Definition: slotdev.cpp:365
VOID FinishReconfigure(_In_ NTSTATUS Status)
Definition: slotdev.cpp:1671
_IRQL_requires_(PASSIVE_LEVEL) VOID ControllerResetDone()
BOOLEAN m_ReconfigureBusy
Definition: slotdev.h:310
VOID CompletePending(_In_ NTSTATUS Status)
Definition: slotdev.cpp:541
_IRQL_requires_max_(DISPATCH_LEVEL) VOID AddEndpoint(_In_ XhciEndpoint *Endpoint)
VOID OnAddressDeviceDone(_In_ const XhciCommand *Command)
Definition: slotdev.cpp:870
PVOID InputContext(_In_ ULONG Index) const
Definition: slotdev.cpp:261
ULONG m_NumberOfTTs
Definition: slotdev.h:289
ULONG m_NumberOfPorts
Definition: slotdev.h:288
BOOLEAN WantsTunnelStateDsm(_In_ const USBDEVICE_UPDATE *Payload) const
Definition: slotdev.cpp:955
VOID SubmitEnableSlot()
Definition: slotdev.cpp:641
_IRQL_requires_max_(DISPATCH_LEVEL) VOID RingDoorbell(_In_ ULONG Dci
_IRQL_requires_(PASSIVE_LEVEL) VOID RunTunnelStateDsm(_Inout_ PUSBDEVICE_UPDATE Payload)
NTSTATUS SubmitAddressDevice(_In_ BOOLEAN BlockSetAddress)
Definition: slotdev.cpp:710
ULONG m_ReconfigureQueued
Definition: slotdev.h:311
static XhciUsbDevice * FromUcx(_In_ UCXUSBDEVICE UsbDevice)
Definition: slotdev.cpp:178
static EVT_WDF_WORKITEM TunnelDsmWorker
Definition: slotdev.h:239
VOID DisableEndpointList(_In_ ULONG Count, _In_reads_(Count) UCXENDPOINT *Endpoints)
Definition: slotdev.cpp:480
PVOID OutputContext(_In_ ULONG Dci) const
Definition: slotdev.cpp:269
ULONG m_SlotId
Definition: slotdev.h:286
VOID ApplyUpdate(_Inout_ PUSBDEVICE_UPDATE Payload)
Definition: slotdev.cpp:918
_IRQL_requires_(PASSIVE_LEVEL) NTSTATUS Initialize(_In_ XhciController *Controller
ULONG64 HardwareDequeuePointer(_In_ ULONG Dci) const
Definition: slotdev.cpp:314
USB_DEVICE_SPEED Speed() const
Definition: slotdev.cpp:341
VOID ZeroInputContext()
Definition: slotdev.cpp:283
XhciEndpoint * m_Endpoints[XHCI_MAX_DCI+1]
Definition: slotdev.h:297
XhciController * m_Controller
Definition: slotdev.h:278
XhciDmaBuffer * m_Output
Definition: slotdev.h:281
VOID EndpointsConfigure(_In_ WDFREQUEST Request, _Inout_ PENDPOINTS_CONFIGURE Payload)
Definition: slotdev.cpp:1194
WDFREQUEST TakePending()
Definition: slotdev.cpp:535
PVOID m_PendingPayload
Definition: slotdev.h:303
BOOLEAN m_IsHub
Definition: slotdev.h:287
static VOID NTAPI CommandDone(_In_ XhciCommand *Command)
Definition: slotdev.cpp:568
UCXUSBDEVICE_INFO m_Info
Definition: slotdev.h:279
VOID SubmitSecondConfigure()
Definition: slotdev.cpp:1294
VOID SubmitDisableSlot(_In_ AfterDisable Next)
Definition: slotdev.cpp:1412
NTSTATUS BuildAddressContext()
Definition: slotdev.cpp:651
AfterDisable m_AfterDisable
Definition: slotdev.h:306
_In_ _In_ NTSTATUS _In_ PVOID Context
Definition: slotdev.h:78
BOOLEAN m_ResumeTimeSet
Definition: slotdev.h:292
KSPIN_LOCK m_ReconfigureLock
Definition: slotdev.h:309
ULONG m_ContextSize
Definition: slotdev.h:280
PXHCI_INPUT_CONTROL_CONTEXT InputControl() const
Definition: slotdev.cpp:289
XhciCommand m_ReconfigureCommand
Definition: slotdev.h:314
VOID RecordEnabledEndpoints(_In_ const ENDPOINTS_CONFIGURE *Payload)
Definition: slotdev.cpp:491
VOID OnEnableSlotDone(_In_ const XhciCommand *Command)
Definition: slotdev.cpp:765
ULONG m_ContextMask
Definition: slotdev.h:295
VOID OnHostLost()
Definition: slotdev.cpp:1773
VOID HubInfo(_In_ WDFREQUEST Request, _In_ const USBDEVICE_HUB_INFO *Payload)
Definition: slotdev.cpp:1142
XhciDmaBuffer * m_Input
Definition: slotdev.h:282
VOID SetPending(_In_ WDFREQUEST Request, _In_ PVOID Payload, _In_ PendingKind Kind, _In_ BOOLEAN MustSucceed)
Definition: slotdev.cpp:519
_IRQL_requires_max_(DISPATCH_LEVEL) VOID RemoveEndpoint(_In_ XhciEndpoint *Endpoint)
const USB_DEVICE_PORT_PATH * PortPath() const
Definition: slotdev.cpp:371
BOOLEAN m_SlotEnabled
Definition: slotdev.h:285
VOID OnConfigureEndpointDone(_In_ const XhciCommand *Command)
Definition: slotdev.cpp:1324
_In_ _In_ NTSTATUS Status
Definition: slotdev.h:77
ReconfigureWaiter m_ReconfigureWaiters[XHCI_MAX_DCI+1]
Definition: slotdev.h:312
UCXUSBDEVICE Handle() const
Definition: slotdev.cpp:347
UCXUSBDEVICE m_Handle
Definition: slotdev.h:277
USB_DEVICE_DESCRIPTOR m_DeviceDescriptor
Definition: slotdev.h:284
ULONG m_TTThinkTime
Definition: slotdev.h:290
VOID StartReconfigure(_In_ const ReconfigureWaiter *Waiter)
Definition: slotdev.cpp:1600
XhciController * Controller() const
Definition: slotdev.cpp:353
ULONG ContextEntries() const
Definition: slotdev.cpp:321
ReconfigureWaiter m_ReconfigureCurrent
Definition: slotdev.h:313
VOID OnDeviceNotificationEvent(_In_ const XHCI_TRB *Event)
Definition: slotdev.cpp:1728
ULONG EndpointState(_In_ ULONG Dci) const
Definition: slotdev.cpp:307
@ ControllerResetDone
Definition: epctx.cpp:1259
KEVENT Done
Definition: devreq.cpp:1162
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
static const WCHAR Cleanup[]
Definition: register.c:80
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
ULONG KSPIN_LOCK
Definition: env_spec_w32.h:72
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
Status
Definition: gdiplustypes.h:24
_In_ UCXUSBDEVICE UsbDevice
Definition: hostctl.h:31
_In_ UCXHUB_DEVICE_CONTEXT _In_ UCXENDPOINT Endpoint
Definition: hubucx.h:238
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
unsigned __int64 ULONG64
Definition: imports.h:198
#define _In_reads_(s)
Definition: no_sal2.h:168
#define _Inout_
Definition: no_sal2.h:162
#define _In_
Definition: no_sal2.h:158
#define _Out_writes_bytes_(s)
Definition: no_sal2.h:178
long LONG
Definition: pedump.c:60
PACPI_METHOD_ARGUMENT Next
Definition: slotdev.cpp:96
#define XHCI_MAX_DCI
Definition: slotdev.h:14
Definition: shell.h:41
PFN_RECONFIGURE_DONE Done
Definition: slotdev.h:175
#define NTAPI
Definition: typedefs.h:36
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXCONTROLLER * Controller
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
enum _USB_DEVICE_SPEED USB_DEVICE_SPEED
USHORT Count
Definition: userreq.cpp:200
_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
_In_ WDFCOLLECTION _In_ ULONG Index
static void Initialize()
Definition: xlate.c:212