ReactOS 0.4.17-dev-1037-g720d112
controller.cpp
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 FDO and UCX controller callbacks
5 * COPYRIGHT: Copyright 2026 Justin Miller <justinmiller100@gmail.com>
6 */
7
8#include "usbxhci.h"
9
10#define NDEBUG
11#include <debug.h>
12
14static
17XhciCreateUcxController(
19{
23
24 UCX_CONTROLLER_CONFIG_INIT(&Config, "ReactOS xHCI Host Controller");
25 Config.EvtControllerQueryUsbCapability = XhciEvtControllerQueryUsbCapability;
26 Config.EvtControllerGetCurrentFrameNumber = XhciEvtControllerGetCurrentFrameNumber;
27 Config.EvtControllerUsbDeviceAdd = XhciEvtControllerUsbDeviceAdd;
28 Config.EvtControllerReset = XhciEvtControllerReset;
29
31
32 Status = UcxControllerCreate(Controller->Device, &Config, &Attributes, &Controller->UcxController);
33 if (!NT_SUCCESS(Status))
34 {
35 DPRINT1("UcxControllerCreate failed 0x%lx\n", Status);
36 return Status;
37 }
38
39 XhciGetUcxControllerContext(Controller->UcxController)->Controller = Controller;
40 return STATUS_SUCCESS;
41}
42
46 _In_ WDFDRIVER Driver,
48{
51 WDF_IO_QUEUE_CONFIG QueueConfig;
53 WDFDEVICE Device;
55
57 PAGED_CODE();
58
64 WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &PnpPower);
65
66 Status = UcxInitializeDeviceInit(DeviceInit);
67 if (!NT_SUCCESS(Status))
68 {
69 DPRINT1("UcxInitializeDeviceInit failed 0x%lx\n", Status);
70 return Status;
71 }
72
74
75 Status = WdfDeviceCreate(&DeviceInit, &Attributes, &Device);
76 if (!NT_SUCCESS(Status))
77 {
78 DPRINT1("WdfDeviceCreate failed 0x%lx\n", Status);
79 return Status;
80 }
81
82 Controller = XhciGetController(Device);
83 Controller->Device = Device;
84
85 /* UCX gets first look at every IOCTL sent to the controller */
88
89 Status = WdfIoQueueCreate(Device, &QueueConfig, WDF_NO_OBJECT_ATTRIBUTES, WDF_NO_HANDLE);
90 if (!NT_SUCCESS(Status))
91 {
92 DPRINT1("WdfIoQueueCreate failed 0x%lx\n", Status);
93 return Status;
94 }
95
96 Status = XhciCreateUcxController(Controller);
97 if (!NT_SUCCESS(Status))
98 return Status;
99
100 return XhciRootHubCreate(Controller);
101}
102
104NTAPI
106 _In_ WDFDEVICE Device,
107 _In_ WDFCMRESLIST ResourcesRaw,
108 _In_ WDFCMRESLIST ResourcesTranslated)
109{
113
114 /* Map the MMIO BAR, read capability registers, connect the interrupt */
116 return STATUS_SUCCESS;
117}
118
120NTAPI
122 _In_ WDFDEVICE Device,
123 _In_ WDFCMRESLIST ResourcesTranslated)
124{
127
129 return STATUS_SUCCESS;
130}
131
133NTAPI
135 _In_ WDFDEVICE Device,
137{
140
141 /* Reset and start the controller */
143 return STATUS_SUCCESS;
144}
145
147NTAPI
149 _In_ WDFDEVICE Device,
151{
154
156 return STATUS_SUCCESS;
157}
158
159VOID
160NTAPI
162 _In_ WDFQUEUE Queue,
163 _In_ WDFREQUEST Request,
165 _In_ size_t InputBufferLength,
167{
168 WDFDEVICE Device = WdfIoQueueGetDevice(Queue);
169
171 return;
172
173 WdfRequestComplete(Request, STATUS_INVALID_DEVICE_REQUEST);
174}
175
177NTAPI
179 _In_ UCXCONTROLLER UcxController,
184{
185 UNREFERENCED_PARAMETER(UcxController);
189
190 *ResultLength = 0;
192}
193
195NTAPI
197 _In_ UCXCONTROLLER UcxController,
199{
200 UNREFERENCED_PARAMETER(UcxController);
201
202 /* MFINDEX >> 3 once the runtime registers are mapped */
203 *FrameNumber = 0;
206}
207
208VOID
209NTAPI
211 _In_ UCXCONTROLLER UcxController)
212{
214
216
218 UcxControllerResetComplete(UcxController, &Info);
219}
#define PAGED_CODE()
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
_In_ ULONG Attributes
Definition: dispmprt.h:1077
#define TRUE
Definition: types.h:120
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define _IRQL_requires_(irql)
Definition: driverspecs.h:229
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
Status
Definition: gdiplustypes.h:24
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
Definition: hubucx.h:258
#define _Inout_
Definition: no_sal2.h:162
#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
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define STATUS_SUCCESS
Definition: shellext.h:65
PFN_WDF_IO_QUEUE_IO_DEVICE_CONTROL EvtIoDeviceControl
Definition: wdfio.h:405
PFN_WDF_DEVICE_D0_ENTRY EvtDeviceD0Entry
Definition: wdfdevice.h:1164
PFN_WDF_DEVICE_D0_EXIT EvtDeviceD0Exit
Definition: wdfdevice.h:1166
PFN_WDF_DEVICE_PREPARE_HARDWARE EvtDevicePrepareHardware
Definition: wdfdevice.h:1168
PFN_WDF_DEVICE_RELEASE_HARDWARE EvtDeviceReleaseHardware
Definition: wdfdevice.h:1169
uint32_t * PULONG
Definition: typedefs.h:59
#define NTAPI
Definition: typedefs.h:36
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
_Out_ PULONG FrameNumber
Definition: ucxcontroller.h:94
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXCONTROLLER * Controller
_In_ PGUID _In_ ULONG _Out_ PULONG ResultLength
Definition: ucxcontroller.h:83
FORCEINLINE VOID NTAPI UCX_CONTROLLER_CONFIG_INIT(_Out_ PUCX_CONTROLLER_CONFIG Config, _In_ LPCSTR DeviceDescription)
@ UcxControllerStateLost
Definition: ucxcontroller.h:24
_In_ PGUID CapabilityType
Definition: ucxcontroller.h:80
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG Config
FORCEINLINE VOID NTAPI UCX_CONTROLLER_RESET_COMPLETE_INFO_INIT(_Out_ PUCX_CONTROLLER_RESET_COMPLETE_INFO UcxControllerResetCompleteInfo, _In_ UCX_CONTROLLER_STATE UcxControllerState, _In_ BOOLEAN UcxCoordinated)
_In_ PGUID _In_ ULONG OutputBufferLength
Definition: ucxcontroller.h:81
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
#define STATUS_INVALID_DEVICE_REQUEST
Definition: udferr_usr.h:138
EVT_UCX_CONTROLLER_GET_CURRENT_FRAMENUMBER XhciEvtControllerGetCurrentFrameNumber
Definition: usbxhci.h:46
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL XhciEvtIoDeviceControl
Definition: usbxhci.h:44
EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY XhciEvtControllerQueryUsbCapability
Definition: usbxhci.h:45
EVT_WDF_DRIVER_DEVICE_ADD XhciEvtDeviceAdd
Definition: usbxhci.h:39
EVT_WDF_DEVICE_PREPARE_HARDWARE XhciEvtDevicePrepareHardware
Definition: usbxhci.h:40
EVT_UCX_CONTROLLER_USBDEVICE_ADD XhciEvtControllerUsbDeviceAdd
Definition: usbxhci.h:70
EVT_WDF_DEVICE_RELEASE_HARDWARE XhciEvtDeviceReleaseHardware
Definition: usbxhci.h:41
EVT_UCX_CONTROLLER_RESET XhciEvtControllerReset
Definition: usbxhci.h:47
EVT_WDF_DEVICE_D0_EXIT XhciEvtDeviceD0Exit
Definition: usbxhci.h:43
EVT_WDF_DEVICE_D0_ENTRY XhciEvtDeviceD0Entry
Definition: usbxhci.h:42
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
_In_ PWDFDEVICE_INIT DeviceInit
Definition: wdfcontrol.h:113
_Must_inspect_result_ _In_ WDFDRIVER Driver
Definition: wdfcontrol.h:83
_In_ WDF_POWER_DEVICE_STATE PreviousState
Definition: wdfdevice.h:829
enum _WDF_POWER_DEVICE_STATE WDF_POWER_DEVICE_STATE
_In_ WDFCMRESLIST _In_ WDFCMRESLIST ResourcesTranslated
Definition: wdfdevice.h:891
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
Definition: wdfdevice.h:2231
FORCEINLINE VOID WDF_PNPPOWER_EVENT_CALLBACKS_INIT(_Out_ PWDF_PNPPOWER_EVENT_CALLBACKS Callbacks)
Definition: wdfdevice.h:1214
_In_ WDF_POWER_DEVICE_STATE TargetState
Definition: wdfdevice.h:859
_In_ WDFCMRESLIST ResourcesRaw
Definition: wdfdevice.h:888
FORCEINLINE VOID WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(_Out_ PWDF_IO_QUEUE_CONFIG Config, _In_ WDF_IO_QUEUE_DISPATCH_TYPE DispatchType)
Definition: wdfio.h:443
@ WdfIoQueueDispatchParallel
Definition: wdfio.h:79
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
Definition: wdfiotarget.h:863
#define WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(_attributes, _contexttype)
Definition: wdfobject.h:170
#define WDF_NO_HANDLE
Definition: wdftypes.h:107
#define WDF_NO_OBJECT_ATTRIBUTES
Definition: wdftypes.h:105