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