[USBAUDIO]
[reactos.git] / reactos / drivers / usb / usbhub / usbhub.c
1 /*
2 * PROJECT: ReactOS Universal Serial Bus Hub Driver
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/usb/usbhub/fdo.c
5 * PURPOSE: UsbHub Driver
6 * PROGRAMMERS:
7 * Hervé Poussineau (hpoussin@reactos.org)
8 * Michael Martin (michael.martin@reactos.org)
9 * Johannes Anderwald (johannes.anderwald@reactos.org)
10 */
11
12 #include "usbhub.h"
13
14 #define NDEBUG
15 #include <debug.h>
16
17 NTSTATUS NTAPI
18 USBHUB_Create(
19 IN PDEVICE_OBJECT DeviceObject,
20 IN PIRP Irp)
21 {
22 DPRINT("USBHUB: IRP_MJ_CREATE\n");
23
24 Irp->IoStatus.Status = STATUS_SUCCESS;
25 Irp->IoStatus.Information = 0;
26 IoCompleteRequest(Irp, IO_NO_INCREMENT);
27 return STATUS_SUCCESS;
28 }
29
30 NTSTATUS NTAPI
31 USBHUB_Close(
32 IN PDEVICE_OBJECT DeviceObject,
33 IN PIRP Irp)
34 {
35 DPRINT("USBHUB: IRP_MJ_CLOSE\n");
36
37 Irp->IoStatus.Status = STATUS_SUCCESS;
38 Irp->IoStatus.Information = 0;
39 IoCompleteRequest(Irp, IO_NO_INCREMENT);
40 return STATUS_SUCCESS;
41 }
42
43 NTSTATUS NTAPI
44 USBHUB_Cleanup(
45 IN PDEVICE_OBJECT DeviceObject,
46 IN PIRP Irp)
47 {
48 DPRINT("USBHUB: IRP_MJ_CLEANUP\n");
49
50 Irp->IoStatus.Status = STATUS_SUCCESS;
51 Irp->IoStatus.Information = 0;
52 IoCompleteRequest(Irp, IO_NO_INCREMENT);
53 return STATUS_SUCCESS;
54 }
55
56
57 NTSTATUS NTAPI
58 USBHUB_AddDevice(
59 IN PDRIVER_OBJECT DriverObject,
60 IN PDEVICE_OBJECT PhysicalDeviceObject)
61 {
62 PDEVICE_OBJECT DeviceObject;
63 PHUB_DEVICE_EXTENSION HubDeviceExtension;
64 NTSTATUS Status;
65 DPRINT("USBHUB: AddDevice\n");
66 //
67 // Create the Device Object
68 //
69 Status = IoCreateDevice(DriverObject,
70 sizeof(HUB_DEVICE_EXTENSION),
71 NULL,
72 FILE_DEVICE_BUS_EXTENDER,
73 FILE_AUTOGENERATED_DEVICE_NAME,
74 FALSE,
75 &DeviceObject);
76
77 if (!NT_SUCCESS(Status))
78 {
79 DPRINT1("USBHUB: IoCreateDevice() failed with status 0x%08lx\n", Status);
80 return Status;
81 }
82
83 //
84 // Zero Hub Extension
85 //
86 HubDeviceExtension = (PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
87 RtlZeroMemory(HubDeviceExtension, sizeof(HUB_DEVICE_EXTENSION));
88
89 //
90 // Set this to Fdo
91 //
92 HubDeviceExtension->Common.IsFDO = TRUE;
93 DeviceObject->Flags |= DO_POWER_PAGABLE;
94
95 //
96 // initialize reset complete event
97 //
98 KeInitializeEvent(&HubDeviceExtension->ResetComplete, NotificationEvent, FALSE);
99
100 //
101 // Attached to lower device
102 //
103 //Status = IoAttachDeviceToDeviceStackSafe(Fdo, Pdo, &DeviceExtension->LowerDevice);
104 HubDeviceExtension->LowerDeviceObject = IoAttachDeviceToDeviceStack(DeviceObject, PhysicalDeviceObject);
105 if (!NT_SUCCESS(Status))
106 {
107 DPRINT1("USBHUB: IoAttachDeviceToDeviceStackSafe() failed with status 0x%08lx\n", Status);
108 IoDeleteDevice(DeviceObject);
109 return Status;
110 }
111
112 DeviceObject->Flags |= DO_BUFFERED_IO;
113 DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
114
115 return STATUS_SUCCESS;
116 }
117
118 static NTSTATUS NTAPI
119 USBHUB_IrpStub(
120 IN PDEVICE_OBJECT DeviceObject,
121 IN PIRP Irp)
122 {
123 NTSTATUS Status;
124
125 if (((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
126 {
127 DPRINT1("Usbhub: FDO stub for major function 0x%lx\n",
128 IoGetCurrentIrpStackLocation(Irp)->MajorFunction);
129 return ForwardIrpAndForget(DeviceObject, Irp);
130 }
131 else
132 {
133 //
134 // Cant forward as we are the PDO!
135 //
136 DPRINT1("USBHUB: ERROR- PDO stub for major function 0x%lx\n",
137 IoGetCurrentIrpStackLocation(Irp)->MajorFunction);
138 #ifndef NDEBUG
139 DbgBreakPoint();
140 #endif
141 }
142
143 Status = Irp->IoStatus.Status;
144 IoCompleteRequest(Irp, IO_NO_INCREMENT);
145 return Status;
146 }
147
148
149 NTSTATUS NTAPI
150 USBHUB_DispatchDeviceControl(
151 PDEVICE_OBJECT DeviceObject,
152 PIRP Irp)
153 {
154 DPRINT("Usbhub: DispatchDeviceControl\n");
155 if (((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
156 return USBHUB_FdoHandleDeviceControl(DeviceObject, Irp);
157 else
158 return USBHUB_IrpStub(DeviceObject, Irp);
159 }
160
161 NTSTATUS NTAPI
162 USBHUB_DispatchInternalDeviceControl(
163 PDEVICE_OBJECT DeviceObject,
164 PIRP Irp)
165 {
166 DPRINT("Usbhub: DispatchInternalDeviceControl\n");
167 if (((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
168 return USBHUB_IrpStub(DeviceObject, Irp);
169 else
170 return USBHUB_PdoHandleInternalDeviceControl(DeviceObject, Irp);
171 }
172
173 NTSTATUS NTAPI
174 USBHUB_DispatchPnp(
175 PDEVICE_OBJECT DeviceObject,
176 PIRP Irp)
177 {
178 DPRINT("USBHUB: DispatchPnp\n");
179 if (((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
180 return USBHUB_FdoHandlePnp(DeviceObject, Irp);
181 else
182 return USBHUB_PdoHandlePnp(DeviceObject, Irp);
183 }
184
185 NTSTATUS NTAPI
186 USBHUB_DispatchPower(
187 PDEVICE_OBJECT DeviceObject,
188 PIRP Irp)
189 {
190 PIO_STACK_LOCATION IoStack;
191
192 IoStack = IoGetCurrentIrpStackLocation(Irp);
193 DPRINT1("Power Function %x\n", IoStack->MinorFunction);
194
195 if (IoStack->MinorFunction == IRP_MN_SET_POWER)
196 {
197 PoStartNextPowerIrp(Irp);
198 Irp->IoStatus.Status = STATUS_SUCCESS;
199 IoCompleteRequest(Irp, IO_NO_INCREMENT);
200 return STATUS_SUCCESS;
201
202 }
203 else if (IoStack->MinorFunction == IRP_MN_QUERY_POWER)
204 {
205 PoStartNextPowerIrp(Irp);
206 Irp->IoStatus.Status = STATUS_SUCCESS;
207 IoCompleteRequest(Irp, IO_NO_INCREMENT);
208 return STATUS_SUCCESS;
209
210 }
211 else if (IoStack->MinorFunction == IRP_MN_WAIT_WAKE)
212 {
213 PoStartNextPowerIrp(Irp);
214 Irp->IoStatus.Status = STATUS_SUCCESS;
215 IoCompleteRequest(Irp, IO_NO_INCREMENT);
216 return STATUS_SUCCESS;
217 }
218
219 PoStartNextPowerIrp(Irp);
220 Irp->IoStatus.Status = STATUS_SUCCESS;
221 IoCompleteRequest(Irp, IO_NO_INCREMENT);
222 return STATUS_SUCCESS;
223 }
224
225 VOID
226 NTAPI
227 USBHUB_Unload(
228 IN PDRIVER_OBJECT DriverObject)
229 {
230 UNIMPLEMENTED
231 }
232
233
234 NTSTATUS NTAPI
235 DriverEntry(
236 IN PDRIVER_OBJECT DriverObject,
237 IN PUNICODE_STRING RegistryPath)
238 {
239 DriverObject->DriverExtension->AddDevice = USBHUB_AddDevice;
240 DriverObject->DriverUnload = USBHUB_Unload;
241
242 DPRINT("USBHUB: DriverEntry\n");
243
244 DriverObject->MajorFunction[IRP_MJ_CREATE] = USBHUB_Create;
245 DriverObject->MajorFunction[IRP_MJ_CLOSE] = USBHUB_Close;
246 DriverObject->MajorFunction[IRP_MJ_CLEANUP] = USBHUB_Cleanup;
247 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = USBHUB_DispatchDeviceControl;
248 DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = USBHUB_DispatchInternalDeviceControl;
249 DriverObject->MajorFunction[IRP_MJ_PNP] = USBHUB_DispatchPnp;
250 DriverObject->MajorFunction[IRP_MJ_POWER] =USBHUB_DispatchPower;
251
252 return STATUS_SUCCESS;
253 }
254