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