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\n");
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
));
92 HubDeviceExtension
->Common
.IsFDO
= TRUE
;
93 DeviceObject
->Flags
|= DO_POWER_PAGABLE
;
96 // initialize reset complete event
98 KeInitializeEvent(&HubDeviceExtension
->ResetComplete
, NotificationEvent
, FALSE
);
101 // Attached to lower device
103 //Status = IoAttachDeviceToDeviceStackSafe(Fdo, Pdo, &DeviceExtension->LowerDevice);
104 HubDeviceExtension
->LowerDeviceObject
= IoAttachDeviceToDeviceStack(DeviceObject
, PhysicalDeviceObject
);
105 if (!NT_SUCCESS(Status
))
107 DPRINT1("USBHUB: IoAttachDeviceToDeviceStackSafe() failed with status 0x%08lx\n", Status
);
108 IoDeleteDevice(DeviceObject
);
112 DeviceObject
->Flags
|= DO_BUFFERED_IO
;
113 DeviceObject
->Flags
&= ~DO_DEVICE_INITIALIZING
;
115 return STATUS_SUCCESS
;
118 static NTSTATUS NTAPI
120 IN PDEVICE_OBJECT DeviceObject
,
125 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
127 DPRINT1("Usbhub: FDO stub for major function 0x%lx\n",
128 IoGetCurrentIrpStackLocation(Irp
)->MajorFunction
);
129 return ForwardIrpAndForget(DeviceObject
, Irp
);
134 // Cant forward as we are the PDO!
136 DPRINT1("USBHUB: ERROR- PDO stub for major function 0x%lx\n",
137 IoGetCurrentIrpStackLocation(Irp
)->MajorFunction
);
143 Status
= Irp
->IoStatus
.Status
;
144 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
150 USBHUB_DispatchDeviceControl(
151 PDEVICE_OBJECT DeviceObject
,
154 DPRINT("Usbhub: DispatchDeviceControl\n");
155 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
156 return USBHUB_FdoHandleDeviceControl(DeviceObject
, Irp
);
158 return USBHUB_IrpStub(DeviceObject
, Irp
);
162 USBHUB_DispatchInternalDeviceControl(
163 PDEVICE_OBJECT DeviceObject
,
166 DPRINT("Usbhub: DispatchInternalDeviceControl\n");
167 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
168 return USBHUB_IrpStub(DeviceObject
, Irp
);
170 return USBHUB_PdoHandleInternalDeviceControl(DeviceObject
, Irp
);
175 PDEVICE_OBJECT DeviceObject
,
178 DPRINT("USBHUB: DispatchPnp\n");
179 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
180 return USBHUB_FdoHandlePnp(DeviceObject
, Irp
);
182 return USBHUB_PdoHandlePnp(DeviceObject
, Irp
);
186 USBHUB_DispatchPower(
187 PDEVICE_OBJECT DeviceObject
,
190 PIO_STACK_LOCATION IoStack
;
192 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
193 DPRINT1("Power Function %x\n", IoStack
->MinorFunction
);
195 if (IoStack
->MinorFunction
== IRP_MN_SET_POWER
)
197 PoStartNextPowerIrp(Irp
);
198 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
199 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
200 return STATUS_SUCCESS
;
203 else if (IoStack
->MinorFunction
== IRP_MN_QUERY_POWER
)
205 PoStartNextPowerIrp(Irp
);
206 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
207 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
208 return STATUS_SUCCESS
;
211 else if (IoStack
->MinorFunction
== IRP_MN_WAIT_WAKE
)
213 PoStartNextPowerIrp(Irp
);
214 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
215 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
216 return STATUS_SUCCESS
;
219 PoStartNextPowerIrp(Irp
);
220 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
221 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
222 return STATUS_SUCCESS
;
228 IN PDRIVER_OBJECT DriverObject
)
236 IN PDRIVER_OBJECT DriverObject
,
237 IN PUNICODE_STRING RegistryPath
)
239 DriverObject
->DriverExtension
->AddDevice
= USBHUB_AddDevice
;
240 DriverObject
->DriverUnload
= USBHUB_Unload
;
242 DPRINT("USBHUB: DriverEntry\n");
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
;
252 return STATUS_SUCCESS
;