[USBHUB_NEW]
[reactos.git] / drivers / usb / usbhub_new / 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
13 //#define NDEBUG
14 #include "usbhub.h"
15
16 NTSTATUS NTAPI
17 USBHUB_Create(
18 IN PDEVICE_OBJECT DeviceObject,
19 IN PIRP Irp)
20 {
21 DPRINT1("USBHUB: IRP_MJ_CREATE\n");
22
23 Irp->IoStatus.Status = STATUS_SUCCESS;
24 Irp->IoStatus.Information = 0;
25 IoCompleteRequest(Irp, IO_NO_INCREMENT);
26 return STATUS_SUCCESS;
27 }
28
29 NTSTATUS NTAPI
30 USBHUB_Close(
31 IN PDEVICE_OBJECT DeviceObject,
32 IN PIRP Irp)
33 {
34 DPRINT1("USBHUB: IRP_MJ_CLOSE\n");
35
36 Irp->IoStatus.Status = STATUS_SUCCESS;
37 Irp->IoStatus.Information = 0;
38 IoCompleteRequest(Irp, IO_NO_INCREMENT);
39 return STATUS_SUCCESS;
40 }
41
42 NTSTATUS NTAPI
43 USBHUB_Cleanup(
44 IN PDEVICE_OBJECT DeviceObject,
45 IN PIRP Irp)
46 {
47 DPRINT1("USBHUB: IRP_MJ_CLEANUP\n");
48
49 Irp->IoStatus.Status = STATUS_SUCCESS;
50 Irp->IoStatus.Information = 0;
51 IoCompleteRequest(Irp, IO_NO_INCREMENT);
52 return STATUS_SUCCESS;
53 }
54
55
56 NTSTATUS NTAPI
57 USBHUB_AddDevice(
58 IN PDRIVER_OBJECT DriverObject,
59 IN PDEVICE_OBJECT PhysicalDeviceObject)
60 {
61 PDEVICE_OBJECT DeviceObject;
62 PHUB_DEVICE_EXTENSION HubDeviceExtension;
63 NTSTATUS Status;
64
65 //
66 // Create the Device Object
67 //
68 Status = IoCreateDevice(DriverObject,
69 sizeof(HUB_DEVICE_EXTENSION),
70 NULL,
71 FILE_DEVICE_BUS_EXTENDER,
72 FILE_AUTOGENERATED_DEVICE_NAME,
73 FALSE,
74 &DeviceObject);
75
76 if (!NT_SUCCESS(Status))
77 {
78 DPRINT1("USBHUB: IoCreateDevice() failed with status 0x%08lx\n", Status);
79 return Status;
80 }
81
82 //
83 // Zero Hub Extension
84 //
85 HubDeviceExtension = (PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
86 RtlZeroMemory(HubDeviceExtension, sizeof(HUB_DEVICE_EXTENSION));
87
88 //
89 // Set this to Fdo
90 //
91 HubDeviceExtension->Common.IsFDO = TRUE;
92 DeviceObject->Flags |= DO_POWER_PAGABLE;
93
94 //
95 // Attached to lower device
96 //
97 //Status = IoAttachDeviceToDeviceStackSafe(Fdo, Pdo, &DeviceExtension->LowerDevice);
98 HubDeviceExtension->LowerDeviceObject = IoAttachDeviceToDeviceStack(DeviceObject, PhysicalDeviceObject);
99 if (!NT_SUCCESS(Status))
100 {
101 DPRINT1("USBHUB: IoAttachDeviceToDeviceStackSafe() failed with status 0x%08lx\n", Status);
102 IoDeleteDevice(DeviceObject);
103 return Status;
104 }
105
106 DeviceObject->Flags |= DO_BUFFERED_IO;
107 DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
108
109 return STATUS_SUCCESS;
110 }
111
112 static NTSTATUS NTAPI
113 USBHUB_IrpStub(
114 IN PDEVICE_OBJECT DeviceObject,
115 IN PIRP Irp)
116 {
117 NTSTATUS Status;
118
119 if (((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
120 {
121 DPRINT1("Usbhub: FDO stub for major function 0x%lx\n",
122 IoGetCurrentIrpStackLocation(Irp)->MajorFunction);
123 return ForwardIrpAndForget(DeviceObject, Irp);
124 }
125 else
126 {
127 //
128 // Cant forward as we are the PDO!
129 //
130 DPRINT1("USBHUB: ERROR- PDO stub for major function 0x%lx\n",
131 IoGetCurrentIrpStackLocation(Irp)->MajorFunction);
132 #ifndef NDEBUG
133 DbgBreakPoint();
134 #endif
135 }
136
137 Status = Irp->IoStatus.Status;
138 IoCompleteRequest(Irp, IO_NO_INCREMENT);
139 return Status;
140 }
141
142
143 NTSTATUS NTAPI
144 USBHUB_DispatchDeviceControl(
145 PDEVICE_OBJECT DeviceObject,
146 PIRP Irp)
147 {
148 DPRINT1("Usbhub: DispatchDeviceControl\n");
149 if (((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
150 return USBHUB_FdoHandleDeviceControl(DeviceObject, Irp);
151 else
152 return USBHUB_IrpStub(DeviceObject, Irp);
153 }
154
155 NTSTATUS NTAPI
156 USBHUB_DispatchInternalDeviceControl(
157 PDEVICE_OBJECT DeviceObject,
158 PIRP Irp)
159 {
160 DPRINT1("Usbhub: DispatchInternalDeviceControl\n");
161 if (((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
162 return USBHUB_IrpStub(DeviceObject, Irp);
163 else
164 return USBHUB_PdoHandleInternalDeviceControl(DeviceObject, Irp);
165 }
166
167 NTSTATUS NTAPI
168 USBHUB_DispatchPnp(PDEVICE_OBJECT DeviceObject, PIRP Irp)
169 {
170 DPRINT1("USBHUB: DispatchPnp\n");
171 if (((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
172 return USBHUB_FdoHandlePnp(DeviceObject, Irp);
173 else
174 return USBHUB_PdoHandlePnp(DeviceObject, Irp);
175 }
176
177 NTSTATUS NTAPI
178 DriverEntry(
179 IN PDRIVER_OBJECT DriverObject,
180 IN PUNICODE_STRING RegistryPath)
181 {
182 ULONG i;
183
184 DriverObject->DriverExtension->AddDevice = USBHUB_AddDevice;
185 DPRINT1("USBHUB: DriverEntry\n");
186
187 for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
188 DriverObject->MajorFunction[i] = USBHUB_IrpStub;
189
190 DriverObject->MajorFunction[IRP_MJ_CREATE] = USBHUB_Create;
191 DriverObject->MajorFunction[IRP_MJ_CLOSE] = USBHUB_Close;
192 DriverObject->MajorFunction[IRP_MJ_CLEANUP] = USBHUB_Cleanup;
193 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = USBHUB_DispatchDeviceControl;
194 DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = USBHUB_DispatchInternalDeviceControl;
195 DriverObject->MajorFunction[IRP_MJ_PNP] = USBHUB_DispatchPnp;
196
197 return STATUS_SUCCESS;
198 }
199