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