ReactOS 0.4.17-dev-1281-g065abb3
hubreq.h
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS SuperSpeed USB Hub Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Preallocated transfer requests and the control transfer sender
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#pragma once
9
10/* Every control transfer the hub sends gives up after this long */
11#define HUB_SETUP_REQUEST_TIMEOUT_MS 5000
12
13/* No hub or port feature is selected for acknowledging */
14#define HUB_FEATURE_NONE 1000
15
18{
19 WDFREQUEST Request;
21 struct _URB_CONTROL_TRANSFER_EX Urb;
22
23 /* Copied into UrbHeader.UsbdFlags on every send */
25
28 Create(
30 _In_ WDFIOTARGET SizingTarget);
31
33 VOID
36 _In_ UCHAR RequestCode,
40 {
41 Urb.SetupPacket[0] = RequestType;
42 Urb.SetupPacket[1] = RequestCode;
43 Urb.SetupPacket[2] = (UCHAR)(Value & 0xFF);
44 Urb.SetupPacket[3] = (UCHAR)(Value >> 8);
45 Urb.SetupPacket[4] = (UCHAR)(Index & 0xFF);
46 Urb.SetupPacket[5] = (UCHAR)(Index >> 8);
47 Urb.SetupPacket[6] = (UCHAR)(Length & 0xFF);
48 Urb.SetupPacket[7] = (UCHAR)(Length >> 8);
49 }
50
53 Send(
54 _In_ WDFIOTARGET Target,
55 _In_opt_ UCXUSBDEVICE Device,
60 _In_ BOOLEAN ShortTransferOk,
61 _In_ BOOLEAN ForwardProgress);
62
63 VOID
64 Reuse();
65};
66
69{
70 WDFREQUEST Request;
73
74 /* The last completed transfer had no bit set; the next one asks UCX to pend */
76
77 WDFMEMORY BitmapMemory;
82};
83
84/* Hub class request codes */
85#define HUB_REQUEST_GET_STATUS 0
86#define HUB_REQUEST_CLEAR_FEATURE 1
87#define HUB_REQUEST_SET_FEATURE 3
88#define HUB_REQUEST_GET_DESCRIPTOR 6
89#define HUB_REQUEST_CLEAR_TT_BUFFER 8
90#define HUB_REQUEST_RESET_TT 9
91#define HUB_REQUEST_SET_HUB_DEPTH 12
92
93/* Hub and port feature selectors (USB 2.0 11.24.2, USB 3.2 10.16.2) */
94#define HUB_C_LOCAL_POWER 0
95#define HUB_C_OVER_CURRENT 1
96#define PORT_F_ENABLE 1
97#define PORT_F_SUSPEND 2
98#define PORT_F_RESET 4
99#define PORT_F_LINK_STATE 5
100#define PORT_F_POWER 8
101#define PORT_C_CONNECTION 16
102#define PORT_C_ENABLE 17
103#define PORT_C_SUSPEND 18
104#define PORT_C_OVER_CURRENT 19
105#define PORT_C_RESET 20
106#define PORT_F_U1_TIMEOUT 23
107#define PORT_F_U2_TIMEOUT 24
108#define PORT_C_LINK_STATE 25
109#define PORT_C_CONFIG_ERROR 26
110#define PORT_F_REMOTE_WAKE_MASK 27
111#define PORT_F_BH_RESET 28
112#define PORT_C_BH_RESET 29
113
114/* USB 3 link states in port status bits 8:5 */
115#define LINK_U0 0
116#define LINK_U3 3
117#define LINK_SS_DISABLED 4
118#define LINK_RX_DETECT 5
119#define LINK_SS_INACTIVE 6
120#define LINK_POLLING 7
121#define LINK_RECOVERY 8
122#define LINK_COMPLIANCE 10
123#define LINK_LOOPBACK 11
124
125/* Port status and change word bits */
126#define PS_CONNECTED 0x0001
127#define PS_ENABLED 0x0002
128#define PS_SUSPENDED 0x0004
129#define PS_OVER_CURRENT 0x0008
130#define PS_RESET 0x0010
131#define PS_LINK_SHIFT 5
132#define PS_LINK_MASK 0x01E0
133#define PS_POWER_20 0x0100
134#define PS_POWER_30 0x0200
135
136#define PC_CONNECT 0x0001
137#define PC_ENABLE 0x0002
138#define PC_SUSPEND 0x0004
139#define PC_OVER_CURRENT 0x0008
140#define PC_RESET 0x0010
141#define PC_BH_RESET 0x0020
142#define PC_LINK_STATE 0x0040
143#define PC_CONFIG_ERROR 0x0080
144
145/* Hub status and change bits */
146#define HS_LOCAL_POWER_LOST 0x0001
147#define HS_OVER_CURRENT 0x0002
148
149/* Failure reasons the hub keeps for the PnP problem text */
150#define HUB_MSG_INVALID_PORT_STATUS 0x40020000
151#define HUB_MSG_CONTROL_TRANSFER_FAILED 0x40020001
152#define HUB_MSG_INTERRUPT_FAILED 0x40020002
153
154/* Enumeration failure texts for a broken USB 3 link */
155
157USHORT
158NTAPI
161{
162 return (Status & PS_LINK_MASK) >> PS_LINK_SHIFT;
163}
164
165/* Transfer helpers shared by the port and device modules */
166
169NTAPI
170HubReadPortStatusForBootDevice(
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 Parent
Definition: acpixf.h:732
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
@ Create
Definition: registry.c:563
Definition: bufpool.h:45
#define _IRQL_requires_(irql)
Definition: driverspecs.h:229
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
Status
Definition: gdiplustypes.h:24
_Out_ PULONG PortStatus
Definition: hubreq.h:172
#define PS_LINK_SHIFT
Definition: hubreq.h:131
#define PS_LINK_MASK
Definition: hubreq.h:132
FORCEINLINE USHORT NTAPI HubLinkState(_In_ USHORT Status)
Definition: hubreq.h:159
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
Definition: hubucx.h:258
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
#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
#define _In_reads_bytes_opt_(s)
Definition: no_sal2.h:224
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
unsigned short USHORT
Definition: pedump.c:61
ULONG UsbdFlags
Definition: hubreq.h:24
NTSTATUS Send(_In_ WDFIOTARGET Target, _In_opt_ UCXUSBDEVICE Device, _In_ PFN_WDF_REQUEST_COMPLETION_ROUTINE Completion, _In_ WDFCONTEXT Context, _In_reads_bytes_opt_(Length) PVOID Buffer, _In_ ULONG Length, _In_ BOOLEAN ShortTransferOk, _In_ BOOLEAN ForwardProgress)
Definition: hubreq.cpp:62
WDFREQUEST Request
Definition: hubreq.h:19
VOID SetSetup(_In_ UCHAR RequestType, _In_ UCHAR RequestCode, _In_ USHORT Value, _In_ USHORT Index, _In_ USHORT Length)
Definition: hubreq.h:34
struct _URB_CONTROL_TRANSFER_EX Urb
Definition: hubreq.h:21
RTL_BITMAP Bitmap
Definition: hubreq.h:81
WDFMEMORY BitmapMemory
Definition: hubreq.h:77
USHORT BitmapBytes
Definition: hubreq.h:80
USBD_PIPE_HANDLE Pipe
Definition: hubreq.h:72
ULONG BitmapMaxBytes
Definition: hubreq.h:79
BOOLEAN LastInterruptWasEmpty
Definition: hubreq.h:75
struct _URB_BULK_OR_INTERRUPT_TRANSFER Urb
Definition: hubreq.h:71
PUCHAR BitmapBuffer
Definition: hubreq.h:78
WDFREQUEST Request
Definition: hubreq.h:70
uint32_t * PULONG
Definition: typedefs.h:59
unsigned char UCHAR
Definition: typedefs.h:53
#define NTAPI
Definition: typedefs.h:36
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFQUEUE _In_ _Strict_type_match_ WDF_REQUEST_TYPE RequestType
Definition: wdfdevice.h:4239
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
Definition: wdffdo.h:536
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306
EVT_WDF_REQUEST_COMPLETION_ROUTINE * PFN_WDF_REQUEST_COMPLETION_ROUTINE
Definition: wdfrequest.h:313
#define FORCEINLINE
Definition: wdftypes.h:67