- Sync with trunk up to r46941.
[reactos.git] / drivers / usb / usbehci / usbehci.c
1 /*
2 * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/usb/usbehci/usbehci.c
5 * PURPOSE: USB EHCI device driver.
6 * PROGRAMMERS:
7 * Michael Martin
8 */
9
10 /* DEFINES *******************************************************************/
11 #include "usbehci.h"
12
13 static NTSTATUS NTAPI
14 IrpStub(PDEVICE_OBJECT DeviceObject, PIRP Irp)
15 {
16 NTSTATUS Status;
17
18 if (((PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->IsFdo)
19 {
20 DPRINT1("ehci: FDO stub for major function 0x%lx\n",
21 IoGetCurrentIrpStackLocation(Irp)->MajorFunction);
22 return ForwardIrpAndForget(DeviceObject, Irp);
23 }
24
25 /* We are lower driver, So complete */
26 DPRINT1("ehci: PDO stub for major function 0x%lx\n",
27 IoGetCurrentIrpStackLocation(Irp)->MajorFunction);
28
29 Status = Irp->IoStatus.Status;
30 IoCompleteRequest(Irp, IO_NO_INCREMENT);
31 return Status;
32 }
33
34 NTSTATUS NTAPI
35 DispatchDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
36 {
37 DPRINT("DispatchDeviceControl\n");
38 Irp->IoStatus.Information = 0;
39 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
40
41 IoCompleteRequest(Irp, IO_NO_INCREMENT);
42 return STATUS_UNSUCCESSFUL;
43 }
44
45 NTSTATUS NTAPI
46 DispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
47 {
48 DPRINT("DispatchInternalDeviceControl\n");
49 if (((PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->IsFdo)
50 return IrpStub(DeviceObject, Irp);
51 else
52 return PdoDispatchInternalDeviceControl(DeviceObject, Irp);
53 }
54
55 NTSTATUS NTAPI
56 UsbEhciCleanup(PDEVICE_OBJECT DeviceObject, PIRP Irp)
57 {
58 DPRINT1("UsbEhciCleanup\n");
59 Irp->IoStatus.Information = 0;
60 Irp->IoStatus.Status = STATUS_SUCCESS;
61
62 IoCompleteRequest(Irp, IO_NO_INCREMENT);
63 return STATUS_SUCCESS;
64 }
65
66 NTSTATUS NTAPI
67 UsbEhciCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp)
68 {
69 DPRINT1("UsbEhciCreate\n");
70 Irp->IoStatus.Information = 0;
71 Irp->IoStatus.Status = STATUS_SUCCESS;
72
73 IoCompleteRequest(Irp, IO_NO_INCREMENT);
74 return STATUS_SUCCESS;
75 }
76
77 NTSTATUS NTAPI
78 UsbEhciClose(PDEVICE_OBJECT DeviceObject, PIRP Irp)
79 {
80 DPRINT1("Close\n");
81 Irp->IoStatus.Information = 0;
82 Irp->IoStatus.Status = STATUS_SUCCESS;
83
84 IoCompleteRequest(Irp, IO_NO_INCREMENT);
85 return STATUS_SUCCESS;
86 }
87
88 VOID NTAPI
89 DriverUnload(PDRIVER_OBJECT DriverObject)
90 {
91 DPRINT1("Unloading Driver\n");
92 /* FIXME: Clean up */
93 }
94
95 NTSTATUS NTAPI
96 DispatchPnp(PDEVICE_OBJECT DeviceObject, PIRP Irp)
97 {
98 if (((PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->IsFdo)
99 return FdoDispatchPnp(DeviceObject, Irp);
100 else
101 return PdoDispatchPnp(DeviceObject, Irp);
102 }
103
104 NTSTATUS NTAPI
105 DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
106 {
107 DPRINT1("Driver Entry %wZ!\n", RegistryPath);
108
109 DriverObject->DriverExtension->AddDevice = AddDevice;
110
111 DriverObject->MajorFunction[IRP_MJ_CREATE] = UsbEhciCreate;
112 DriverObject->MajorFunction[IRP_MJ_CLOSE] = UsbEhciClose;
113 DriverObject->MajorFunction[IRP_MJ_CLEANUP] = UsbEhciCleanup;
114 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl;
115 DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = DispatchInternalDeviceControl;
116 DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp;
117
118 DriverObject->DriverUnload = DriverUnload;
119 DPRINT1("Driver entry done\n");
120
121 return STATUS_SUCCESS;
122 }
123