2 * PROJECT: ReactOS USB EHCI Miniport Driver
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: USBEHCI declarations
5 * COPYRIGHT: Copyright 2017-2018 Vadim Galyant <vgal@rambler.ru>
17 #include <drivers/usbport/usbmport.h>
20 extern USBPORT_REGISTRATION_PACKET RegPacket
;
22 #define EHCI_MAX_CONTROL_TRANSFER_SIZE 0x10000
23 #define EHCI_MAX_INTERRUPT_TRANSFER_SIZE 0x1000
24 #define EHCI_MAX_BULK_TRANSFER_SIZE 0x400000
25 #define EHCI_MAX_FS_ISO_TRANSFER_SIZE 0x40000
26 #define EHCI_MAX_HS_ISO_TRANSFER_SIZE 0x180000
28 #define EHCI_MAX_FS_ISO_HEADER_BUFFER_SIZE 0x1000
29 #define EHCI_MAX_HS_ISO_HEADER_BUFFER_SIZE 0x40000
31 #define EHCI_MAX_CONTROL_TD_COUNT 6
32 #define EHCI_MAX_INTERRUPT_TD_COUNT 4
33 #define EHCI_MAX_BULK_TD_COUNT 209
35 #define EHCI_FRAMES 32
36 #define EHCI_MICROFRAMES 8
38 #define EHCI_MAX_HC_SYSTEM_ERRORS 256
40 typedef struct _EHCI_PERIOD
{
44 } EHCI_PERIOD
, *PEHCI_PERIOD
;
46 /* Transfer Descriptor */
47 #define EHCI_HCD_TD_FLAG_ALLOCATED 0x01
48 #define EHCI_HCD_TD_FLAG_PROCESSED 0x02
49 #define EHCI_HCD_TD_FLAG_DONE 0x08
50 #define EHCI_HCD_TD_FLAG_ACTIVE 0x10
51 #define EHCI_HCD_TD_FLAG_DUMMY 0x20
54 struct _EHCI_ENDPOINT
;
55 struct _EHCI_TRANSFER
;
57 typedef struct _EHCI_HCD_TD
{
61 ULONG PhysicalAddress
;
63 struct _EHCI_ENDPOINT
* EhciEndpoint
;
64 struct _EHCI_TRANSFER
* EhciTransfer
;
65 struct _EHCI_HCD_TD
* NextHcdTD
;
66 struct _EHCI_HCD_TD
* AltNextHcdTD
;
67 USB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
;
75 } EHCI_HCD_TD
, *PEHCI_HCD_TD
;
77 C_ASSERT(sizeof(EHCI_HCD_TD
) == 0x100);
80 #define EHCI_QH_FLAG_IN_SCHEDULE 0x01
81 #define EHCI_QH_FLAG_CLOSED 0x02
82 #define EHCI_QH_FLAG_STATIC 0x04
83 #define EHCI_QH_FLAG_STATIC_FAST 0x08
84 #define EHCI_QH_FLAG_UPDATING 0x10
85 #define EHCI_QH_FLAG_NUKED 0x20
87 typedef struct _EHCI_STATIC_QH
{
92 ULONG PhysicalAddress
;
93 struct _EHCI_HCD_QH
* PrevHead
;
97 struct _EHCI_HCD_QH
* NextHead
;
101 struct _EHCI_STATIC_QH
* StaticQH
;
112 } EHCI_STATIC_QH
, *PEHCI_STATIC_QH
;
114 C_ASSERT(sizeof(EHCI_STATIC_QH
) == 0xA0);
116 #define EHCI_DUMMYQH_MAX_PACKET_LENGTH 64
118 typedef struct _EHCI_HCD_QH
{
125 } EHCI_HCD_QH
, *PEHCI_HCD_QH
;
127 C_ASSERT(sizeof(EHCI_HCD_QH
) == 0x100);
129 /* EHCI Endpoint follows USBPORT Endpoint */
130 typedef struct _EHCI_ENDPOINT
{
132 ULONG EndpointStatus
;
134 USBPORT_ENDPOINT_PROPERTIES EndpointProperties
;
137 PEHCI_HCD_TD FirstTD
;
142 PEHCI_HCD_TD HcdHeadP
;
143 PEHCI_HCD_TD HcdTailP
;
145 const EHCI_PERIOD
* PeriodTable
;
146 PEHCI_STATIC_QH StaticQH
;
147 } EHCI_ENDPOINT
, *PEHCI_ENDPOINT
;
149 /* EHCI Transfer follows USBPORT Transfer */
150 typedef struct _EHCI_TRANSFER
{
152 PUSBPORT_TRANSFER_PARAMETERS TransferParameters
;
155 PEHCI_ENDPOINT EhciEndpoint
;
157 ULONG TransferOnAsyncList
;
158 } EHCI_TRANSFER
, *PEHCI_TRANSFER
;
160 typedef struct _EHCI_HC_RESOURCES
{
161 ULONG PeriodicFrameList
[EHCI_FRAME_LIST_MAX_ENTRIES
]; // 4K-page aligned array
162 EHCI_STATIC_QH AsyncHead
;
163 EHCI_STATIC_QH PeriodicHead
[64];
165 EHCI_HCD_QH IsoDummyQH
[EHCI_FRAME_LIST_MAX_ENTRIES
];
166 } EHCI_HC_RESOURCES
, *PEHCI_HC_RESOURCES
;
168 #define EHCI_FLAGS_CONTROLLER_SUSPEND 0x01
169 #define EHCI_FLAGS_IDLE_SUPPORT 0x20
171 /* EHCI Extension follows USBPORT Extension */
172 typedef struct _EHCI_EXTENSION
{
175 PEHCI_HC_CAPABILITY_REGISTERS CapabilityRegisters
;
176 PEHCI_HW_REGISTERS OperationalRegs
;
177 UCHAR FrameLengthAdjustment
;
179 USHORT HcSystemErrors
;
180 ULONG PortRoutingControl
;
181 USHORT NumberOfPorts
;
182 USHORT PortPowerControl
;
183 EHCI_INTERRUPT_ENABLE InterruptMask
;
184 EHCI_INTERRUPT_ENABLE InterruptStatus
;
186 PEHCI_HC_RESOURCES HcResourcesVA
;
188 PEHCI_STATIC_QH AsyncHead
;
189 PEHCI_STATIC_QH PeriodicHead
[64];
190 PEHCI_HCD_QH IsoDummyQHListVA
;
191 ULONG IsoDummyQHListPA
;
195 ULONG ConnectPortBits
;
196 ULONG SuspendPortBits
;
198 ULONG FinishResetPortBits
;
200 ULONG PendingTransfers
;
205 /* Registers Copy Backup */
206 ULONG BackupPeriodiclistbase
;
207 ULONG BackupAsynclistaddr
;
208 ULONG BackupCtrlDSSegment
;
210 } EHCI_EXTENSION
, *PEHCI_EXTENSION
;
226 EHCI_RH_ChirpRootPort(
227 IN PVOID ehciExtension
,
232 EHCI_RH_GetRootHubData(
233 IN PVOID ohciExtension
,
234 IN PVOID rootHubData
);
239 IN PVOID ohciExtension
,
244 EHCI_RH_GetPortStatus(
245 IN PVOID ohciExtension
,
247 IN PUSB_PORT_STATUS_AND_CHANGE PortStatus
);
251 EHCI_RH_GetHubStatus(
252 IN PVOID ohciExtension
,
253 IN PUSB_HUB_STATUS_AND_CHANGE HubStatus
);
257 EHCI_RH_SetFeaturePortReset(
258 IN PVOID ohciExtension
,
263 EHCI_RH_SetFeaturePortPower(
264 IN PVOID ohciExtension
,
269 EHCI_RH_SetFeaturePortEnable(
270 IN PVOID ohciExtension
,
275 EHCI_RH_SetFeaturePortSuspend(
276 IN PVOID ohciExtension
,
281 EHCI_RH_ClearFeaturePortEnable(
282 IN PVOID ohciExtension
,
287 EHCI_RH_ClearFeaturePortPower(
288 IN PVOID ohciExtension
,
293 EHCI_RH_ClearFeaturePortSuspend(
294 IN PVOID ohciExtension
,
299 EHCI_RH_ClearFeaturePortEnableChange(
300 IN PVOID ohciExtension
,
305 EHCI_RH_ClearFeaturePortConnectChange(
306 IN PVOID ohciExtension
,
311 EHCI_RH_ClearFeaturePortResetChange(
312 IN PVOID ohciExtension
,
317 EHCI_RH_ClearFeaturePortSuspendChange(
318 IN PVOID ohciExtension
,
323 EHCI_RH_ClearFeaturePortOvercurrentChange(
324 IN PVOID ohciExtension
,
330 IN PVOID ohciExtension
);
335 IN PVOID ohciExtension
);
337 #endif /* USBEHCI_H__ */