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
7 * Hervé Poussineau (hpoussin@reactos.org)
8 * Michael Martin (michael.martin@reactos.org)
9 * Johannes Anderwald (johannes.anderwald@reactos.org)
19 IN PDEVICE_OBJECT DeviceObject
,
22 DPRINT("USBHUB: IRP_MJ_CREATE\n");
24 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
25 Irp
->IoStatus
.Information
= 0;
26 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
27 return STATUS_SUCCESS
;
32 IN PDEVICE_OBJECT DeviceObject
,
35 DPRINT("USBHUB: IRP_MJ_CLOSE\n");
37 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
38 Irp
->IoStatus
.Information
= 0;
39 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
40 return STATUS_SUCCESS
;
45 IN PDEVICE_OBJECT DeviceObject
,
48 DPRINT("USBHUB: IRP_MJ_CLEANUP\n");
50 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
51 Irp
->IoStatus
.Information
= 0;
52 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
53 return STATUS_SUCCESS
;
59 IN PDRIVER_OBJECT DriverObject
,
60 IN PDEVICE_OBJECT PhysicalDeviceObject
)
62 PDEVICE_OBJECT DeviceObject
;
63 PHUB_DEVICE_EXTENSION HubDeviceExtension
;
65 DPRINT("USBHUB: AddDevice (%p)\n", PhysicalDeviceObject
);
67 // Create the Device Object
69 Status
= IoCreateDevice(DriverObject
,
70 sizeof(HUB_DEVICE_EXTENSION
),
72 FILE_DEVICE_BUS_EXTENDER
,
73 FILE_AUTOGENERATED_DEVICE_NAME
,
77 if (!NT_SUCCESS(Status
))
79 DPRINT1("USBHUB: IoCreateDevice() failed with status 0x%08lx\n", Status
);
86 HubDeviceExtension
= (PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
87 RtlZeroMemory(HubDeviceExtension
, sizeof(HUB_DEVICE_EXTENSION
));
89 INITIALIZE_PNP_STATE(HubDeviceExtension
->Common
);
94 HubDeviceExtension
->Common
.IsFDO
= TRUE
;
95 DeviceObject
->Flags
|= DO_POWER_PAGABLE
;
98 KeInitializeGuardedMutex(&HubDeviceExtension
->HubMutexLock
);
100 // initialize remove lock
101 IoInitializeRemoveLock(&HubDeviceExtension
->Common
.RemoveLock
, 'buH', 0, 0);
104 // initialize reset complete event
106 KeInitializeEvent(&HubDeviceExtension
->ResetComplete
, NotificationEvent
, FALSE
);
109 // Attached to lower device
111 //Status = IoAttachDeviceToDeviceStackSafe(Fdo, Pdo, &DeviceExtension->LowerDevice);
112 HubDeviceExtension
->LowerDeviceObject
= IoAttachDeviceToDeviceStack(DeviceObject
, PhysicalDeviceObject
);
113 if (!NT_SUCCESS(Status
))
115 DPRINT1("USBHUB: IoAttachDeviceToDeviceStackSafe() failed with status 0x%08lx\n", Status
);
116 IoDeleteDevice(DeviceObject
);
120 DeviceObject
->Flags
|= DO_BUFFERED_IO
;
121 DeviceObject
->Flags
&= ~DO_DEVICE_INITIALIZING
;
123 return STATUS_SUCCESS
;
126 static NTSTATUS NTAPI
128 IN PDEVICE_OBJECT DeviceObject
,
133 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
135 DPRINT1("Usbhub: FDO stub for major function 0x%lx\n",
136 IoGetCurrentIrpStackLocation(Irp
)->MajorFunction
);
137 return ForwardIrpAndForget(DeviceObject
, Irp
);
142 // Cant forward as we are the PDO!
144 DPRINT1("USBHUB: ERROR- PDO stub for major function 0x%lx\n",
145 IoGetCurrentIrpStackLocation(Irp
)->MajorFunction
);
151 Status
= Irp
->IoStatus
.Status
;
152 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
158 USBHUB_DispatchDeviceControl(
159 PDEVICE_OBJECT DeviceObject
,
162 DPRINT("Usbhub: DispatchDeviceControl\n");
163 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
164 return USBHUB_FdoHandleDeviceControl(DeviceObject
, Irp
);
166 return USBHUB_IrpStub(DeviceObject
, Irp
);
170 USBHUB_DispatchSystemControl(
171 PDEVICE_OBJECT DeviceObject
,
174 DPRINT("Usbhub: DispatchSystemControl\n");
175 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
176 return USBHUB_IrpStub(DeviceObject
, Irp
);
178 return USBHUB_IrpStub(DeviceObject
, Irp
);
182 USBHUB_DispatchInternalDeviceControl(
183 PDEVICE_OBJECT DeviceObject
,
186 DPRINT("Usbhub: DispatchInternalDeviceControl\n");
187 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
188 return USBHUB_IrpStub(DeviceObject
, Irp
);
190 return USBHUB_PdoHandleInternalDeviceControl(DeviceObject
, Irp
);
195 PDEVICE_OBJECT DeviceObject
,
198 DPRINT("USBHUB: DispatchPnp\n");
199 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
200 return USBHUB_FdoHandlePnp(DeviceObject
, Irp
);
202 return USBHUB_PdoHandlePnp(DeviceObject
, Irp
);
206 USBHUB_DispatchPower(
207 PDEVICE_OBJECT DeviceObject
,
210 PIO_STACK_LOCATION IoStack
;
211 PHUB_DEVICE_EXTENSION DeviceExtension
;
213 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
214 DeviceExtension
= DeviceObject
->DeviceExtension
;
216 Status
= IoAcquireRemoveLock(&DeviceExtension
->Common
.RemoveLock
, Irp
);
217 if (!NT_SUCCESS(Status
))
219 Irp
->IoStatus
.Status
= Status
;
220 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
224 DPRINT1("Power Function %x\n", IoStack
->MinorFunction
);
226 if (DeviceExtension
->Common
.IsFDO
)
228 PoStartNextPowerIrp(Irp
);
229 IoSkipCurrentIrpStackLocation(Irp
);
230 Status
= PoCallDriver(DeviceExtension
->LowerDeviceObject
, Irp
);
231 IoReleaseRemoveLock(&DeviceExtension
->Common
.RemoveLock
, Irp
);
235 switch (IoStack
->MinorFunction
)
237 case IRP_MN_SET_POWER
:
239 DPRINT("IRP_MN_SET_POWER\n");
242 case IRP_MN_QUERY_POWER
:
244 DPRINT("IRP_MN_QUERY_POWER\n");
247 case IRP_MN_WAIT_WAKE
:
249 DPRINT("IRP_MN_WAIT_WAKE\n");
254 DPRINT1("PDO IRP_MJ_POWER / unknown minor function 0x%lx\n", IoStack
->MinorFunction
);
255 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
256 return Irp
->IoStatus
.Status
;
260 PoStartNextPowerIrp(Irp
);
261 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
262 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
263 IoReleaseRemoveLock(&DeviceExtension
->Common
.RemoveLock
, Irp
);
264 return STATUS_SUCCESS
;
270 IN PDRIVER_OBJECT DriverObject
)
278 IN PDRIVER_OBJECT DriverObject
,
279 IN PUNICODE_STRING RegistryPath
)
281 DriverObject
->DriverExtension
->AddDevice
= USBHUB_AddDevice
;
282 DriverObject
->DriverUnload
= USBHUB_Unload
;
284 DPRINT("USBHUB: DriverEntry\n");
286 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = USBHUB_Create
;
287 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = USBHUB_Close
;
288 DriverObject
->MajorFunction
[IRP_MJ_CLEANUP
] = USBHUB_Cleanup
;
289 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = USBHUB_DispatchDeviceControl
;
290 DriverObject
->MajorFunction
[IRP_MJ_SYSTEM_CONTROL
] = USBHUB_DispatchSystemControl
;
291 DriverObject
->MajorFunction
[IRP_MJ_INTERNAL_DEVICE_CONTROL
] = USBHUB_DispatchInternalDeviceControl
;
292 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = USBHUB_DispatchPnp
;
293 DriverObject
->MajorFunction
[IRP_MJ_POWER
] =USBHUB_DispatchPower
;
295 return STATUS_SUCCESS
;