[USBEHCI_NEW]
[reactos.git] / drivers / usb / usbehci_new / usbehci.cpp
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.cpp
5 * PURPOSE: USB EHCI device driver.
6 * PROGRAMMERS:
7 * Michael Martin (michael.martin@reactos.org)
8 * Johannes Anderwald (johannes.anderwald@reactos.org)
9 */
10
11 #include "usbehci.h"
12
13 //
14 // driver verifier
15 //
16 DRIVER_ADD_DEVICE EHCI_AddDevice;
17
18 NTSTATUS
19 NTAPI
20 EHCI_AddDevice(
21 PDRIVER_OBJECT DriverObject,
22 PDEVICE_OBJECT PhysicalDeviceObject)
23 {
24 NTSTATUS Status;
25 PHCDCONTROLLER HcdController;
26
27 DPRINT1("EHCI_AddDevice\n");
28
29 /* first create the controller object */
30 Status = CreateHCDController(&HcdController);
31 if (!NT_SUCCESS(Status))
32 {
33 /* failed to create hcd */
34 DPRINT1("AddDevice: Failed to create hcd with %x\n", Status);
35 return Status;
36 }
37
38 /* initialize the hcd */
39 Status = HcdController->Initialize(NULL, // FIXME
40 DriverObject,
41 PhysicalDeviceObject);
42
43 /* check for success */
44 if (!NT_SUCCESS(Status))
45 {
46 /* failed to initialize device */
47 DPRINT1("AddDevice: failed to initialize\n");
48
49 /* release object */
50 HcdController->Release();
51 }
52
53 return Status;
54
55 }
56
57 NTSTATUS
58 NTAPI
59 EHCI_Dispatch(
60 PDEVICE_OBJECT DeviceObject,
61 PIRP Irp)
62 {
63 PCOMMON_DEVICE_EXTENSION DeviceExtension;
64 PIO_STACK_LOCATION IoStack;
65 NTSTATUS Status;
66
67 DPRINT1("EHCI_Dispatch\n");
68
69 //
70 // get common device extension
71 //
72 DeviceExtension = (PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
73
74 //
75 // get current stack location
76 //
77 IoStack = IoGetCurrentIrpStackLocation(Irp);
78
79 //
80 // sanity checks
81 //
82 PC_ASSERT(DeviceExtension->Dispatcher);
83
84 switch(IoStack->MajorFunction)
85 {
86 case IRP_MJ_PNP:
87 {
88 //
89 // dispatch pnp
90 //
91 return DeviceExtension->Dispatcher->HandlePnp(DeviceObject, Irp);
92 }
93
94 case IRP_MJ_POWER:
95 {
96 //
97 // dispatch pnp
98 //
99 return DeviceExtension->Dispatcher->HandlePower(DeviceObject, Irp);
100 }
101 case IRP_MJ_SYSTEM_CONTROL:
102 case IRP_MJ_DEVICE_CONTROL:
103 {
104 //
105 // dispatch pnp
106 //
107 return DeviceExtension->Dispatcher->HandleDeviceControl(DeviceObject, Irp);
108 }
109 case IRP_MJ_CREATE:
110 {
111 //
112 // dispatch create request
113 //
114 Status = STATUS_SUCCESS;
115
116 break;
117 }
118 default:
119 {
120 DPRINT1("EHCI_Dispatch> Major %lu Minor %lu not supported\n", IoStack->MajorFunction, IoStack->MinorFunction);
121 Status = STATUS_NOT_SUPPORTED;
122 }
123 }
124
125 //
126 // complete request
127 //
128 Irp->IoStatus.Information = 0;
129 Irp->IoStatus.Status = Status;
130 IoCompleteRequest(Irp, IO_NO_INCREMENT);
131
132 return Status;
133 }
134
135 extern
136 "C"
137 NTSTATUS
138 NTAPI
139 DriverEntry(
140 PDRIVER_OBJECT DriverObject,
141 PUNICODE_STRING RegistryPath)
142 {
143
144 /* initialize driver object*/
145 DriverObject->DriverExtension->AddDevice = EHCI_AddDevice;
146
147 DriverObject->MajorFunction[IRP_MJ_CREATE] = EHCI_Dispatch;
148 DriverObject->MajorFunction[IRP_MJ_CLOSE] = EHCI_Dispatch;
149 DriverObject->MajorFunction[IRP_MJ_CLEANUP] = EHCI_Dispatch;
150 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = EHCI_Dispatch;
151 DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = EHCI_Dispatch;
152 DriverObject->MajorFunction[IRP_MJ_PNP] = EHCI_Dispatch;
153
154 return STATUS_SUCCESS;
155 }