ReactOS 0.4.17-dev-1281-g065abb3
pipe.h
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS USB Host Controller Extension
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: UCXENDPOINT and UCXSSTREAMS objects
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#pragma once
9
11
13{
14 Generic = 0,
15 ZeroBandwidth = 1,
16 Default = 2
17};
18
20{
21 Unknown = 0,
22 Control = 1,
23 Bulk = 2,
24 Isochronous = 3,
25 Interrupt = 4
26};
27
28/* What a USBD_PIPE_HANDLE points at; Self is cleared once the handle goes stale */
29struct UcxPipe
30{
31 WDFQUEUE Queue;
44
46 IsValid() const
47 {
48 return Self == this;
49 }
50
51 static
52 UcxPipe*
55 {
56 return (UcxPipe*)Handle;
57 }
58
61 {
62 return (USBD_PIPE_HANDLE)this;
63 }
64};
65
66/* The Reserved1 slot of both endpoint callback structures */
67typedef
70(NTAPI *PFN_UCX_HCD_ENDPOINT_ENABLE_FORWARD_PROGRESS)(
71 _In_ UCXENDPOINT Endpoint,
73
76{
86 PFN_UCX_HCD_ENDPOINT_ENABLE_FORWARD_PROGRESS EnableForwardProgress;
89};
90
91/* Opaque to the HCD; lives on the UCX stack while the HCD's endpoint add runs */
93{
95 UCXUSBDEVICE Device;
103 UCXENDPOINT Created;
105};
106
108
109/* Opaque to the HCD; lives on the UCX stack while the HCD's streams add runs */
111{
112 UCXENDPOINT Endpoint;
116 UCXSSTREAMS Created;
117};
118
120
122{
123public:
124 /* Exports */
125
127 static
129 Create(
130 _In_ UCXUSBDEVICE UsbDevice,
133 _Out_ UCXENDPOINT* Endpoint);
134
135 static
136 VOID
140
141 static
142 VOID
146
147 VOID
149 _In_ WDFQUEUE Queue);
150
151 VOID
153
154 UCXSSTREAMS
156 _In_ PVOID Tag);
157
158 /* Hub interface */
159
161 static
164 _In_ UCXUSBDEVICE UsbDevice,
166 _Out_ UCXENDPOINT* Endpoint);
167
169 static
172 _In_ UCXUSBDEVICE UsbDevice,
176 _Out_ UCXENDPOINT* Endpoint);
177
178 VOID
180
182 VOID
184
185 /* Request paths, see pipeio.cpp */
186
187 VOID
189 _In_ WDFREQUEST Request);
190
193 _In_ PIRP Irp);
194
197 _In_ PIRP Irp,
198 _In_ PURB Urb);
199
202 _In_ PIRP Irp,
203 _In_ PURB Urb);
204
205 VOID
207 _In_ WDFREQUEST Request);
208
209 VOID
211 _In_ WDFREQUEST Request);
212
215 _In_ PIRP Irp,
216 _In_ PURB Urb);
217
220 _In_ PIRP Irp);
221
223 AbortPipe(
224 _In_ PIRP Irp,
225 _In_ PURB Urb);
226
229 _In_ PIRP Irp,
230 _In_ PURB Urb);
231
232 /* Lookups */
233
234 static
237 _In_ UCXENDPOINT Handle);
238
239 static
243 {
245 }
246
247 BOOLEAN
249 {
250 return m_HasMachine;
251 }
252
254 BOOLEAN
257 {
258 return m_Machine.SmPost(Event);
259 }
260
261 /* Taking and putting the one pending request or IRP */
262
263 PVOID
265 {
267
268 m_Pending = NULL;
269 return Pending;
270 }
271
272 VOID
275 {
278 }
279
280public:
281 UCXENDPOINT m_Handle;
285
288
291
292 /* Device endpoint list, or the device stale list once stale */
295
296 /* Temporary lists built under the topology lock */
301
304
307
309
310 /* 0 when idle, 2 while a TT clear is in flight */
312
315
316private:
317 VOID
320 _In_ const UcxEndpointInit* Init);
321
322 static
331 _Out_ UCXENDPOINT* Endpoint);
332
333 static
334 EVT_WDF_OBJECT_CONTEXT_DESTROY EvtDestroy;
335
336 friend class EndpointMachine;
337};
338
340
341/* One static stream of a UCXSSTREAMS object */
343{
349};
350
352{
353public:
355 static
357 Create(
358 _In_ UCXENDPOINT Endpoint,
361 _Out_ UCXSSTREAMS* StaticStreams);
362
363 VOID
365 _In_ PSTREAM_INFO StreamInfo);
366
367 static
370 _In_ UCXSSTREAMS Handle);
371
372 UcxStream*
375 {
376 return &((UcxStream*)(this + 1))[Index];
377 }
378
379public:
380 UCXSSTREAMS m_Handle;
383
384 /* Set only while EvtEndpointStaticStreamsAdd runs */
386
387private:
388 static
389 EVT_WDF_OBJECT_CONTEXT_DESTROY EvtDestroy;
390};
391
393
394/* Maximum transfer sizes and isoch parameters, see pipe.cpp */
395
396ULONG
397NTAPI
400 _In_ USHORT BcdUsb,
401 _In_ const UcxEndpointInit* Init);
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
const struct winhelp_callbacks Callbacks
Definition: callback.c:161
@ Create
Definition: registry.c:563
BOOLEAN SmPost(_In_ Event Ev)
Definition: smengine.h:370
VOID HandleHubReset(_In_ WDFREQUEST Request)
Definition: pipeio.cpp:16
NTSTATUS GetIsochPathDelays(_In_ PIRP Irp, _In_ PURB Urb)
Definition: pipeio.cpp:59
UcxController * m_Controller
Definition: pipe.h:282
UCXSSTREAMS GetStaticStreamsReferenced(_In_ PVOID Tag)
Definition: pipe.cpp:370
VOID SetWdfIoQueue(_In_ WDFQUEUE Queue)
Definition: pipe.cpp:313
static EVT_WDF_OBJECT_CONTEXT_DESTROY EvtDestroy
Definition: pipe.h:334
USB_ENDPOINT_DESCRIPTOR m_Descriptor
Definition: pipe.h:290
UcxEndpointCallbacks m_Callbacks
Definition: pipe.h:289
LIST_ENTRY m_ControllerResetLink
Definition: pipe.h:298
BOOLEAN m_OpenFailedOnReset
Definition: pipe.h:306
LONG m_CancelSync
Definition: pipe.h:311
static UcxEndpoint * FromHandle(_In_ UCXENDPOINT Handle)
Definition: pipe.cpp:91
NTSTATUS CloseStaticStreams(_In_ PIRP Irp, _In_ PURB Urb)
Definition: pipeio.cpp:267
BOOLEAN Post(_In_ EpEvent Event)
Definition: pipe.h:255
BOOLEAN HasMachine() const
Definition: pipe.h:248
static NTSTATUS CreateThroughHcd(_In_ UcxUsbDevice *Device, _Inout_ UcxEndpointInit *Init, _In_ ULONG MaxPacketSize, _In_opt_ PUSB_ENDPOINT_DESCRIPTOR Descriptor, _In_ ULONG DescriptorBufferLength, _In_opt_ PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR Companion, _Out_ UCXENDPOINT *Endpoint)
Definition: pipe.cpp:392
UcxStaticStreams * m_Streams
Definition: pipe.h:286
LIST_ENTRY m_TreePurgeLink
Definition: pipe.h:299
NTSTATUS OpenStaticStreamsComplete(_In_ PIRP Irp, _In_ PURB Urb)
Definition: pipeio.cpp:306
UcxUsbDevice * m_Device
Definition: pipe.h:283
VOID ReleaseCancelSync()
Definition: pipe.cpp:360
VOID HandleClientStreamsDisable(_In_ WDFREQUEST Request)
Definition: pipeio.cpp:298
IO_CSQ_IRP_CONTEXT m_AbortCsqContext
Definition: pipe.h:308
LIST_ENTRY m_DisconnectLink
Definition: pipe.h:297
LONG m_StreamsOpenCount
Definition: pipe.h:287
LIST_ENTRY m_TrackingLink
Definition: pipe.h:294
UcxPipe m_Pipe
Definition: pipe.h:284
LIST_ENTRY m_OperationLink
Definition: pipe.h:300
UCXENDPOINT m_Handle
Definition: pipe.h:281
VOID HandleClientStreamsEnable(_In_ WDFREQUEST Request)
Definition: pipeio.cpp:290
static UcxEndpoint * FromPipe(_In_ USBD_PIPE_HANDLE Handle)
Definition: pipe.h:241
NTSTATUS OpenStaticStreams(_In_ PIRP Irp, _In_ PURB Urb)
Definition: pipeio.cpp:171
BOOLEAN m_HasMachine
Definition: pipe.h:303
static _Must_inspect_result_ NTSTATUS CreateDefaultFromHub(_In_ UCXUSBDEVICE UsbDevice, _In_ ULONG MaxPacketSize, _Out_ UCXENDPOINT *Endpoint)
Definition: pipe.cpp:451
PVOID TakePending()
Definition: pipe.h:264
VOID DeleteFromHub()
Definition: pipe.cpp:515
static _Must_inspect_result_ NTSTATUS CreateFromHub(_In_ UCXUSBDEVICE UsbDevice, _In_ PUSB_ENDPOINT_DESCRIPTOR Descriptor, _In_ ULONG DescriptorBufferLength, _In_opt_ PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR Companion, _Out_ UCXENDPOINT *Endpoint)
Definition: pipe.cpp:467
LIST_ENTRY m_DeviceLink
Definition: pipe.h:293
BOOLEAN m_ClientHoldsHandle
Definition: pipe.h:313
EndpointMachine m_Machine
Definition: pipe.h:302
NTSTATUS CloseStaticStreamsComplete(_In_ PIRP Irp)
Definition: pipeio.cpp:361
NTSTATUS OnHcdResetDone(_In_ PIRP Irp)
Definition: pipeio.cpp:25
PVOID m_Pending
Definition: pipe.h:305
VOID SetPending(_In_ PVOID Pending)
Definition: pipe.h:273
VOID NeedToCancelTransfers()
Definition: pipe.cpp:328
BOOLEAN m_ClearTtOnCancel
Definition: pipe.h:314
static VOID InitSetDefaultEventCallbacks(_Inout_ PUCXENDPOINT_INIT Init, _In_ PUCX_DEFAULT_ENDPOINT_EVENT_CALLBACKS Callbacks)
Definition: pipe.cpp:125
static VOID InitSetEventCallbacks(_Inout_ PUCXENDPOINT_INIT Init, _In_ PUCX_ENDPOINT_EVENT_CALLBACKS Callbacks)
Definition: pipe.cpp:98
static UcxStaticStreams * FromHandle(_In_ UCXSSTREAMS Handle)
Definition: pipe.cpp:523
static EVT_WDF_OBJECT_CONTEXT_DESTROY EvtDestroy
Definition: pipe.h:389
UcxStream * Stream(_In_ ULONG Index)
Definition: pipe.h:373
ULONG m_StreamCount
Definition: pipe.h:381
UcxEndpoint * m_Endpoint
Definition: pipe.h:382
UcxStaticStreamsInit * m_Init
Definition: pipe.h:385
VOID SetStreamInfo(_In_ PSTREAM_INFO StreamInfo)
Definition: pipe.cpp:573
UCXSSTREAMS m_Handle
Definition: pipe.h:380
_In_ ULONG Attributes
Definition: dispmprt.h:1077
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
#define NULL
Definition: types.h:112
#define NTSTATUS
Definition: precomp.h:19
#define _IRQL_requires_(irql)
Definition: driverspecs.h:229
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
EpEvent
Definition: epsm.h:15
@ Pending
Definition: fs_rec.h:186
ULONG Handle
Definition: gdb_input.c:15
_In_ UCXUSBDEVICE UsbDevice
Definition: hostctl.h:31
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
Definition: hubucx.h:258
_Must_inspect_result_ _In_ UCXUSBDEVICE _In_ ULONG MaxPacketSize
Definition: hubucx.h:289
_Must_inspect_result_ _In_ UCXUSBDEVICE _In_ ULONG _In_opt_ PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR Companion
Definition: hubucx.h:308
_In_ UCXHUB_DEVICE_CONTEXT _In_ UCXENDPOINT Endpoint
Definition: hubucx.h:238
_Must_inspect_result_ _In_ UCXUSBDEVICE _In_ ULONG DescriptorBufferLength
Definition: hubucx.h:307
_In_ PIRP Irp
Definition: kse.h:79
#define _Inout_
Definition: no_sal2.h:162
#define _Must_inspect_result_
Definition: no_sal2.h:62
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
UcxTransferType
Definition: pipe.h:20
UcxEndpointKind
Definition: pipe.h:13
_In_ ULONG MaxTransferSize
Definition: pipe.h:72
ULONG NTAPI UcxComputeMaxTransferSize(_In_ USB_DEVICE_SPEED Speed, _In_ USHORT BcdUsb, _In_ const UcxEndpointInit *Init)
Definition: pipe.cpp:49
PFN_UCX_ENDPOINT_STATIC_STREAMS_ADD StaticStreamsAdd
Definition: pipe.h:82
PFN_UCX_ENDPOINT_GET_ISOCH_TRANSFER_PATH_DELAYS GetIsochTransferPathDelays
Definition: pipe.h:87
PFN_UCX_ENDPOINT_PURGE Purge
Definition: pipe.h:77
PFN_UCX_ENDPOINT_STATIC_STREAMS_ENABLE StaticStreamsEnable
Definition: pipe.h:83
PFN_UCX_HCD_ENDPOINT_ENABLE_FORWARD_PROGRESS EnableForwardProgress
Definition: pipe.h:86
PFN_UCX_ENDPOINT_SET_CHARACTERISTIC SetCharacteristic
Definition: pipe.h:88
PFN_UCX_ENDPOINT_ABORT Abort
Definition: pipe.h:79
PFN_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS OkToCancelTransfers
Definition: pipe.h:81
PFN_UCX_ENDPOINT_RESET Reset
Definition: pipe.h:80
PFN_UCX_ENDPOINT_STATIC_STREAMS_DISABLE StaticStreamsDisable
Definition: pipe.h:84
PFN_UCX_ENDPOINT_START Start
Definition: pipe.h:78
PFN_UCX_DEFAULT_ENDPOINT_UPDATE DefaultEndpointUpdate
Definition: pipe.h:85
Definition: pipe.h:30
static UcxPipe * FromHandle(_In_ USBD_PIPE_HANDLE Handle)
Definition: pipe.h:53
BOOLEAN IsValid() const
Definition: pipe.h:46
ULONG ReservedIoMaxBytes
Definition: pipe.h:43
UcxPipe * Self
Definition: pipe.h:40
BOOLEAN ForwardProgressAllocatedByHcd
Definition: pipe.h:42
WDFQUEUE Queue
Definition: pipe.h:31
UcxEndpoint * Endpoint
Definition: pipe.h:32
BOOLEAN BelongsToStream
Definition: pipe.h:35
ULONG IsochPacketLimit
Definition: pipe.h:38
UcxTransferType TransferType
Definition: pipe.h:33
BOOLEAN ReservedIoActive
Definition: pipe.h:41
UcxEndpointKind Kind
Definition: pipe.h:34
ULONG MaximumTransferSize
Definition: pipe.h:37
ULONG IsochPeriodMicroframes
Definition: pipe.h:39
BOOLEAN DirectionIn
Definition: pipe.h:36
USBD_PIPE_HANDLE Handle()
Definition: pipe.h:60
UcxPipe Pipe
Definition: pipe.h:347
ULONG Index
Definition: pipe.h:345
UcxStaticStreams * Streams
Definition: pipe.h:346
BOOLEAN Filled
Definition: pipe.h:344
ULONG StreamId
Definition: pipe.h:348
Definition: typedefs.h:120
USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR Companion
Definition: pipe.h:98
BOOLEAN CreateMachine
Definition: pipe.h:102
UcxEndpointKind Kind
Definition: pipe.h:94
UCXENDPOINT Created
Definition: pipe.h:103
USB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR IsochCompanion
Definition: pipe.h:99
USB_ENDPOINT_DESCRIPTOR Descriptor
Definition: pipe.h:97
UcxTransferType TransferType
Definition: pipe.h:96
UcxEndpointCallbacks Callbacks
Definition: pipe.h:104
BOOLEAN HasCompanion
Definition: pipe.h:100
BOOLEAN HasIsochCompanion
Definition: pipe.h:101
UCXUSBDEVICE Device
Definition: pipe.h:95
BOOLEAN Failed
Definition: pipe.h:115
UCXENDPOINT Endpoint
Definition: pipe.h:112
ULONG SetInfoCalls
Definition: pipe.h:114
UCXSSTREAMS Created
Definition: pipe.h:116
ULONG StreamCount
Definition: pipe.h:113
Definition: usb.h:565
#define NTAPI
Definition: typedefs.h:36
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
EVT_UCX_ENDPOINT_START * PFN_UCX_ENDPOINT_START
Definition: ucxendpoint.h:120
EVT_UCX_ENDPOINT_SET_CHARACTERISTIC * PFN_UCX_ENDPOINT_SET_CHARACTERISTIC
Definition: ucxendpoint.h:216
_Must_inspect_result_ _In_ UCXENDPOINT _In_ PVOID Tag
Definition: ucxendpoint.h:325
EVT_UCX_ENDPOINT_RESET * PFN_UCX_ENDPOINT_RESET
Definition: ucxendpoint.h:98
EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS * PFN_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS
Definition: ucxendpoint.h:141
EVT_UCX_ENDPOINT_GET_ISOCH_TRANSFER_PATH_DELAYS * PFN_UCX_ENDPOINT_GET_ISOCH_TRANSFER_PATH_DELAYS
Definition: ucxendpoint.h:205
EVT_UCX_DEFAULT_ENDPOINT_UPDATE * PFN_UCX_DEFAULT_ENDPOINT_UPDATE
Definition: ucxendpoint.h:152
EVT_UCX_ENDPOINT_PURGE * PFN_UCX_ENDPOINT_PURGE
Definition: ucxendpoint.h:109
EVT_UCX_ENDPOINT_STATIC_STREAMS_ENABLE * PFN_UCX_ENDPOINT_STATIC_STREAMS_ENABLE
Definition: ucxendpoint.h:179
EVT_UCX_ENDPOINT_ABORT * PFN_UCX_ENDPOINT_ABORT
Definition: ucxendpoint.h:131
EVT_UCX_ENDPOINT_STATIC_STREAMS_DISABLE * PFN_UCX_ENDPOINT_STATIC_STREAMS_DISABLE
Definition: ucxendpoint.h:191
_Must_inspect_result_ _In_ UCXUSBDEVICE _Inout_ PUCXENDPOINT_INIT * EndpointInit
Definition: ucxendpoint.h:314
EVT_UCX_ENDPOINT_STATIC_STREAMS_ADD * PFN_UCX_ENDPOINT_STATIC_STREAMS_ADD
Definition: ucxendpoint.h:167
WDF_EXTERN_C_START struct _STREAM_INFO * PSTREAM_INFO
_Must_inspect_result_ _In_ UCXENDPOINT _Inout_ PUCXSSTREAMS_INIT _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXSSTREAMS * StaticStreams
Definition: ucxsstreams.h:55
enum _USB_DEVICE_SPEED USB_DEVICE_SPEED
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
Definition: usbdlib.h:333
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
Definition: wdfdevice.h:2231
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_INTERRUPT_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFINTERRUPT * Interrupt
Definition: wdfinterrupt.h:379
#define WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(_contexttype, _castingfunction)
Definition: wdfobject.h:350
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:342
_In_ WDF_WMI_PROVIDER_CONTROL Control
Definition: wdfwmi.h:166
#define NT_ASSERT
Definition: rtlfuncs.h:3334
static void Initialize()
Definition: xlate.c:212