Fix merge r65567.
[reactos.git] / drivers / usb / usbccgp / usbccgp.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/usbccgp/usbccgp.c
5 * PURPOSE: USB device driver.
6 * PROGRAMMERS:
7 * Michael Martin (michael.martin@reactos.org)
8 * Johannes Anderwald (johannes.anderwald@reactos.org)
9 * Cameron Gutman
10 */
11
12 #include "usbccgp.h"
13
14 #define NDEBUG
15 #include <debug.h>
16
17 /* Driver verifier */
18 DRIVER_ADD_DEVICE USBCCGP_AddDevice;
19
20 NTSTATUS
21 NTAPI
22 USBCCGP_AddDevice(
23 PDRIVER_OBJECT DriverObject,
24 PDEVICE_OBJECT PhysicalDeviceObject)
25 {
26 NTSTATUS Status;
27 PDEVICE_OBJECT DeviceObject;
28 PFDO_DEVICE_EXTENSION FDODeviceExtension;
29
30 /* Lets create the device */
31 Status = IoCreateDevice(DriverObject,
32 sizeof(FDO_DEVICE_EXTENSION),
33 NULL,
34 FILE_DEVICE_USB,
35 FILE_AUTOGENERATED_DEVICE_NAME,
36 FALSE,
37 &DeviceObject);
38 if (!NT_SUCCESS(Status))
39 {
40 /* Failed to create device */
41 DPRINT1("USBCCGP_AddDevice failed to create device with %x\n", Status);
42 return Status;
43 }
44
45 /* Get device extension */
46 FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
47
48 /* Init device extension */
49 RtlZeroMemory(FDODeviceExtension, sizeof(FDO_DEVICE_EXTENSION));
50 FDODeviceExtension->Common.IsFDO = TRUE;
51 FDODeviceExtension->DriverObject = DriverObject;
52 FDODeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
53 InitializeListHead(&FDODeviceExtension->ResetPortListHead);
54 InitializeListHead(&FDODeviceExtension->CyclePortListHead);
55 KeInitializeSpinLock(&FDODeviceExtension->Lock);
56
57 FDODeviceExtension->NextDeviceObject = IoAttachDeviceToDeviceStack(DeviceObject,
58 PhysicalDeviceObject);
59 if (!FDODeviceExtension->NextDeviceObject)
60 {
61 /* Failed to attach */
62 DPRINT1("USBCCGP_AddDevice failed to attach device\n");
63 IoDeleteDevice(DeviceObject);
64 return STATUS_DEVICE_REMOVED;
65 }
66
67 /* Set device flags */
68 DeviceObject->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
69
70 /* Device is initialized */
71 DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
72
73 /* Device initialized */
74 return Status;
75 }
76
77 NTSTATUS
78 NTAPI
79 USBCCGP_CreateClose(
80 PDEVICE_OBJECT DeviceObject,
81 PIRP Irp)
82 {
83 PCOMMON_DEVICE_EXTENSION DeviceExtension;
84 PFDO_DEVICE_EXTENSION FDODeviceExtension;
85
86 /* Get common device extension */
87 DeviceExtension = (PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
88
89 /* Is it a fdo */
90 if (DeviceExtension->IsFDO)
91 {
92 /* Forward and forget */
93 IoSkipCurrentIrpStackLocation(Irp);
94
95 /* Get fdo */
96 FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
97
98 /* Call lower driver */
99 return IoCallDriver(FDODeviceExtension->NextDeviceObject, Irp);
100 }
101 else
102 {
103 /* Pdo not supported */
104 Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
105 IoCompleteRequest(Irp, IO_NO_INCREMENT);
106 return STATUS_NOT_SUPPORTED;
107 }
108 }
109
110 NTSTATUS
111 NTAPI
112 USBCCGP_Dispatch(
113 PDEVICE_OBJECT DeviceObject,
114 PIRP Irp)
115 {
116 PCOMMON_DEVICE_EXTENSION DeviceExtension;
117 PIO_STACK_LOCATION IoStack;
118
119 /* Get common device extension */
120 DeviceExtension = (PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
121
122 /* Get current stack location */
123 IoStack = IoGetCurrentIrpStackLocation(Irp);
124
125 if (IoStack->MajorFunction == IRP_MJ_CREATE || IoStack->MajorFunction == IRP_MJ_CLOSE)
126 {
127 /* Dispatch to default handler */
128 return USBCCGP_CreateClose(DeviceObject, Irp);
129 }
130
131 if (DeviceExtension->IsFDO)
132 {
133 /* Handle request for FDO */
134 return FDO_Dispatch(DeviceObject, Irp);
135 }
136 else
137 {
138 /* Handle request for PDO */
139 return PDO_Dispatch(DeviceObject, Irp);
140 }
141 }
142
143 VOID
144 NTAPI
145 USBCCGP_Unload(PDRIVER_OBJECT DriverObject)
146 {
147 DPRINT("[USBCCGP] Unload\n");
148 }
149
150 NTSTATUS
151 NTAPI
152 DriverEntry(
153 PDRIVER_OBJECT DriverObject,
154 PUNICODE_STRING RegistryPath)
155 {
156
157 /* Initialize driver object */
158 DPRINT("[USBCCGP] DriverEntry\n");
159 DriverObject->DriverExtension->AddDevice = USBCCGP_AddDevice;
160 DriverObject->MajorFunction[IRP_MJ_CREATE] = USBCCGP_Dispatch;
161 DriverObject->MajorFunction[IRP_MJ_CLOSE] = USBCCGP_Dispatch;
162 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = USBCCGP_Dispatch;
163 DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = USBCCGP_Dispatch;
164 DriverObject->MajorFunction[IRP_MJ_POWER] = USBCCGP_Dispatch;
165 DriverObject->MajorFunction[IRP_MJ_PNP] = USBCCGP_Dispatch;
166 DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = USBCCGP_Dispatch;
167 DriverObject->DriverUnload = USBCCGP_Unload;
168
169 /* FIMXE query GenericCompositeUSBDeviceString */
170
171 return STATUS_SUCCESS;
172 }