[CMAKE]
[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
100 PDEVICE_OBJECT LowerDevice;
101 PDEVICE_OBJECT Pdo;
102 ULONG DeviceState;
103 PVOID RootHubDeviceHandle;
104 ULONG Vector;
105 KIRQL Irql;
106
107 KTIMER UpdateTimer;
108 KINTERRUPT_MODE Mode;
109 BOOLEAN IrqShared;
110 PKINTERRUPT EhciInterrupt;
111 KDPC DpcObject;
112 KDPC TimerDpcObject;
113
114 KAFFINITY Affinity;
115
116 ULONG BusNumber;
117 ULONG BusAddress;
118 ULONG PCIAddress;
119 USHORT VendorId;
120 USHORT DeviceId;
121
122 BUS_INTERFACE_STANDARD BusInterface;
123
124 union
125 {
126 ULONG ResourcePort;
127 ULONG ResourceMemory;
128 };
129
130 EHCI_HOST_CONTROLLER hcd;
131 PERIODICFRAMELIST PeriodicFrameList;
132
133 FAST_MUTEX FrameListMutex;
134
135 BOOLEAN AsyncComplete;
136
137 } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
138
139 typedef struct _PDO_DEVICE_EXTENSION
140 {
141 COMMON_DEVICE_EXTENSION Common;
142 PDEVICE_OBJECT DeviceObject;
143 PDEVICE_OBJECT ControllerFdo;
144 PUSB_DEVICE UsbDevices[127];
145 LIST_ENTRY IrpQueue;
146 KSPIN_LOCK IrpQueueLock;
147 PIRP CurrentIrp;
148 HANDLE ThreadHandle;
149 ULONG ChildDeviceCount;
150 BOOLEAN HaltQueue;
151 PVOID CallbackContext;
152 RH_INIT_CALLBACK *CallbackRoutine;
153 USB_IDLE_CALLBACK IdleCallback;
154 PVOID IdleContext;
155 KTIMER Timer;
156 KEVENT QueueDrainedEvent;
157 FAST_MUTEX ListLock;
158 } PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
159
160 typedef struct _WORKITEMDATA
161 {
162 WORK_QUEUE_ITEM WorkItem;
163 PVOID Context;
164 } WORKITEMDATA, *PWORKITEMDATA;
165
166 VOID NTAPI
167 UrbWorkerThread(PVOID Context);
168
169 NTSTATUS NTAPI
170 GetBusInterface(PDEVICE_OBJECT pcifido, PBUS_INTERFACE_STANDARD busInterface);
171
172 NTSTATUS NTAPI
173 ForwardAndWaitCompletionRoutine(PDEVICE_OBJECT DeviceObject, PIRP Irp, PKEVENT Event);
174
175 NTSTATUS NTAPI
176 ForwardAndWait(PDEVICE_OBJECT DeviceObject, PIRP Irp);
177
178 NTSTATUS NTAPI
179 ForwardIrpAndForget(PDEVICE_OBJECT DeviceObject,PIRP Irp);
180
181 NTSTATUS NTAPI
182 FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
183
184 NTSTATUS NTAPI
185 PdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
186
187 NTSTATUS NTAPI
188 AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo);
189
190 NTSTATUS
191 DuplicateUnicodeString(ULONG Flags, PCUNICODE_STRING SourceString, PUNICODE_STRING DestinationString);
192
193 PWSTR
194 GetSymbolicName(PDEVICE_OBJECT DeviceObject);
195
196 PWSTR
197 GetPhysicalDeviceObjectName(PDEVICE_OBJECT DeviceObject);
198
199 NTSTATUS NTAPI
200 PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
201
202 NTSTATUS NTAPI
203 FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
204
205 USBD_STATUS
206 ExecuteControlRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, UCHAR Address, ULONG Port, PVOID Buffer, ULONG BufferLength);
207
208 VOID
209 RequestURBCancel (PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp);
210
211 VOID
212 RemoveUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp);
213
214 VOID
215 QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp);
216
217 VOID
218 CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension);
219
220 NTSTATUS
221 HandleUrbRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp);
222
223 PUSB_DEVICE
224 DeviceHandleToUsbDevice(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PUSB_DEVICE_HANDLE DeviceHandle);
225
226 VOID
227 DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
228
229 VOID
230 DumpFullConfigurationDescriptor(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor);
231
232
233 VOID
234 DumpTransferDescriptor(PQUEUE_TRANSFER_DESCRIPTOR TransferDescriptor);
235
236 VOID
237 DumpQueueHead(PQUEUE_HEAD QueueHead);
238