- Fix the stupid mess we created when making this from the cmake branch
[reactos.git] / drivers / usb / usbehci / usbehci.h
1 #pragma once
2
3 #include "hardware.h"
4 #include <ntifs.h>
5 #include <ntddk.h>
6 #include <stdio.h>
7 #define NDEBUG
8 #include <debug.h>
9 #include <hubbusif.h>
10 #include <usbioctl.h>
11 #include <usb.h>
12
13 #define USB_POOL_TAG (ULONG)'ebsu'
14
15 #define DEVICEINTIALIZED 0x01
16 #define DEVICESTARTED 0x02
17 #define DEVICEBUSY 0x04
18 #define DEVICESTOPPED 0x08
19 #define DEVICESTALLED 0x10
20 #define DEVICEREMOVED 0x20
21
22
23 #define MAX_USB_DEVICES 127
24 #define EHCI_MAX_SIZE_TRANSFER 0x100000
25
26 #define C_HUB_LOCAL_POWER 0
27 #define C_HUB_OVER_CURRENT 1
28 #define PORT_CONNECTION 0
29 #define PORT_ENABLE 1
30 #define PORT_SUSPEND 2
31 #define PORT_OVER_CURRENT 3
32 #define PORT_RESET 4
33 #define PORT_POWER 8
34 #define PORT_LOW_SPEED 9
35 #define PORT_HIGH_SPEED 9
36 #define C_PORT_CONNECTION 16
37 #define C_PORT_ENABLE 17
38 #define C_PORT_SUSPEND 18
39 #define C_PORT_OVER_CURRENT 19
40 #define C_PORT_RESET 20
41 #define PORT_TEST 21
42 #define PORT_INDICATOR 22
43 #define USB_PORT_STATUS_CHANGE 0x4000
44
45 typedef struct _USB_ENDPOINT
46 {
47 ULONG Flags;
48 LIST_ENTRY UrbList;
49 struct _USB_INTERFACE *Interface;
50 USB_ENDPOINT_DESCRIPTOR EndPointDescriptor;
51 } USB_ENDPOINT, *PUSB_ENDPOINT;
52
53 typedef struct _USB_INTERFACE
54 {
55 struct _USB_CONFIGURATION *Config;
56 USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
57 USB_ENDPOINT *EndPoints[];
58 } USB_INTERFACE, *PUSB_INTERFACE;
59
60 typedef struct _USB_CONFIGURATION
61 {
62 struct _USB_DEVICE *Device;
63 USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
64 USB_INTERFACE *Interfaces[];
65 } USB_CONFIGURATION, *PUSB_CONFIGURATION;
66
67 typedef struct _USB_DEVICE
68 {
69 UCHAR Address;
70 ULONG Port;
71 PVOID ParentDevice;
72 BOOLEAN IsHub;
73 USB_DEVICE_SPEED DeviceSpeed;
74 USB_DEVICE_TYPE DeviceType;
75 ULONG DeviceState;
76 PDEVICE_OBJECT UsbDevicePdo;
77 USB_DEVICE_DESCRIPTOR DeviceDescriptor;
78 UNICODE_STRING LanguageIDs;
79 UNICODE_STRING iManufacturer;
80 UNICODE_STRING iProduct;
81 UNICODE_STRING iSerialNumber;
82 USB_CONFIGURATION *ActiveConfig;
83 USB_INTERFACE *ActiveInterface;
84 USB_CONFIGURATION **Configs;
85 } USB_DEVICE, *PUSB_DEVICE;
86
87
88
89 typedef struct _COMMON_DEVICE_EXTENSION
90 {
91 BOOLEAN IsFdo;
92 PDRIVER_OBJECT DriverObject;
93 PDEVICE_OBJECT DeviceObject;
94 } COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
95
96 typedef struct _FDO_DEVICE_EXTENSION
97 {
98 COMMON_DEVICE_EXTENSION Common;
99 PDRIVER_OBJECT DriverObject;
100 PDEVICE_OBJECT DeviceObject;
101 PDEVICE_OBJECT LowerDevice;
102 PDEVICE_OBJECT Pdo;
103 ULONG DeviceState;
104 PVOID RootHubDeviceHandle;
105 ULONG Vector;
106 KIRQL Irql;
107
108 KTIMER UpdateTimer;
109 KINTERRUPT_MODE Mode;
110 BOOLEAN IrqShared;
111 PKINTERRUPT EhciInterrupt;
112 KDPC DpcObject;
113 KDPC TimerDpcObject;
114
115 KAFFINITY Affinity;
116
117 ULONG BusNumber;
118 ULONG BusAddress;
119 ULONG PCIAddress;
120 USHORT VendorId;
121 USHORT DeviceId;
122
123 BUS_INTERFACE_STANDARD BusInterface;
124
125 union
126 {
127 ULONG ResourcePort;
128 ULONG ResourceMemory;
129 };
130
131 EHCI_HOST_CONTROLLER hcd;
132 PERIODICFRAMELIST PeriodicFrameList;
133
134 FAST_MUTEX FrameListMutex;
135
136 BOOLEAN AsyncComplete;
137
138 } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
139
140 typedef struct _PDO_DEVICE_EXTENSION
141 {
142 COMMON_DEVICE_EXTENSION Common;
143 PDEVICE_OBJECT DeviceObject;
144 PDEVICE_OBJECT ControllerFdo;
145 PUSB_DEVICE UsbDevices[127];
146 LIST_ENTRY IrpQueue;
147 KSPIN_LOCK IrpQueueLock;
148 PIRP CurrentIrp;
149 HANDLE ThreadHandle;
150 ULONG ChildDeviceCount;
151 BOOLEAN HaltQueue;
152 PVOID CallbackContext;
153 RH_INIT_CALLBACK *CallbackRoutine;
154 USB_IDLE_CALLBACK IdleCallback;
155 PVOID IdleContext;
156 KTIMER Timer;
157 KEVENT QueueDrainedEvent;
158 FAST_MUTEX ListLock;
159 } PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
160
161 typedef struct _WORKITEMDATA
162 {
163 WORK_QUEUE_ITEM WorkItem;
164 PVOID Context;
165 } WORKITEMDATA, *PWORKITEMDATA;
166
167 VOID NTAPI
168 UrbWorkerThread(PVOID Context);
169
170 NTSTATUS NTAPI
171 GetBusInterface(PDEVICE_OBJECT pcifido, PBUS_INTERFACE_STANDARD busInterface);
172
173 NTSTATUS NTAPI
174 ForwardAndWaitCompletionRoutine(PDEVICE_OBJECT DeviceObject, PIRP Irp, PKEVENT Event);
175
176 NTSTATUS NTAPI
177 ForwardAndWait(PDEVICE_OBJECT DeviceObject, PIRP Irp);
178
179 NTSTATUS NTAPI
180 ForwardIrpAndForget(PDEVICE_OBJECT DeviceObject,PIRP Irp);
181
182 NTSTATUS NTAPI
183 FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
184
185 NTSTATUS NTAPI
186 PdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
187
188 NTSTATUS NTAPI
189 AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo);
190
191 NTSTATUS
192 DuplicateUnicodeString(ULONG Flags, PCUNICODE_STRING SourceString, PUNICODE_STRING DestinationString);
193
194 PWSTR
195 GetSymbolicName(PDEVICE_OBJECT DeviceObject);
196
197 PWSTR
198 GetPhysicalDeviceObjectName(PDEVICE_OBJECT DeviceObject);
199
200 NTSTATUS NTAPI
201 PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
202
203 NTSTATUS NTAPI
204 FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
205
206 USBD_STATUS
207 ExecuteControlRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, UCHAR Address, ULONG Port, PVOID Buffer, ULONG BufferLength);
208
209 VOID
210 RequestURBCancel (PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp);
211
212 VOID
213 RemoveUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp);
214
215 VOID
216 QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp);
217
218 VOID
219 CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension);
220
221 NTSTATUS
222 HandleUrbRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp);
223
224 PUSB_DEVICE
225 DeviceHandleToUsbDevice(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PUSB_DEVICE_HANDLE DeviceHandle);
226
227 VOID
228 DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
229
230 VOID
231 DumpFullConfigurationDescriptor(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor);
232
233
234 VOID
235 DumpTransferDescriptor(PQUEUE_TRANSFER_DESCRIPTOR TransferDescriptor);
236
237 VOID
238 DumpQueueHead(PQUEUE_HEAD QueueHead);
239