Author: mjmartin
Date: Wed May  4 01:07:21 2011
New Revision: 51569
URL: 
http://svn.reactos.org/svn/reactos?rev=51569&view=rev
Log:
[USBHUB_NEW]
- Start work on reimplementing UsbHub driver.
- Implement SubmitRequestToRootHub, QueryStatusChangeEndpoint, QueryInterface,
GetPortStatusAndChange, SetPortFeature and ClearPortFeature.Handle QueryBusRelations.
- Partially implement PNP handling for FDO. When starting the device get all the
information about the RootHub the driver will need and enable Power on all ports.
- Partially implement PNP handling for PDO, QueryId and QueryDeviceText.
- WIP
Added:
    branches/usb-bringup/drivers/usb/usbhub_new/
    branches/usb-bringup/drivers/usb/usbhub_new/CMakeLists.txt   (with props)
    branches/usb-bringup/drivers/usb/usbhub_new/fdo.c   (with props)
    branches/usb-bringup/drivers/usb/usbhub_new/misc.c   (with props)
    branches/usb-bringup/drivers/usb/usbhub_new/pdo.c   (with props)
    branches/usb-bringup/drivers/usb/usbhub_new/usbhub.c   (with props)
    branches/usb-bringup/drivers/usb/usbhub_new/usbhub.h   (with props)
    branches/usb-bringup/drivers/usb/usbhub_new/usbhub.rc   (with props)
Added: branches/usb-bringup/drivers/usb/usbhub_new/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbhub_…
==============================================================================
--- branches/usb-bringup/drivers/usb/usbhub_new/CMakeLists.txt (added)
+++ branches/usb-bringup/drivers/usb/usbhub_new/CMakeLists.txt [iso-8859-1] Wed May  4
01:07:21 2011
@@ -1,0 +1,12 @@
+
+add_definitions(-DDEBUG_MODE)
+
+include_directories(${REACTOS_SOURCE_DIR}/ntoskrnl/include)
+
+add_library(usbhub SHARED fdo.c misc.c pdo.c usbhub.c usbhub.rc)
+
+target_link_libraries(usbhub ${PSEH_LIB})
+
+set_module_type(usbhub kernelmodedriver)
+add_importlibs(usbhub ntoskrnl hal usbd)
+add_cab_target(usbhub 2)
Propchange: branches/usb-bringup/drivers/usb/usbhub_new/CMakeLists.txt
------------------------------------------------------------------------------
    svn:eol-style = native
Added: branches/usb-bringup/drivers/usb/usbhub_new/fdo.c
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbhub_…
==============================================================================
--- branches/usb-bringup/drivers/usb/usbhub_new/fdo.c (added)
+++ branches/usb-bringup/drivers/usb/usbhub_new/fdo.c [iso-8859-1] Wed May  4 01:07:21
2011
@@ -1,0 +1,903 @@
+/*
+ * PROJECT:         ReactOS Universal Serial Bus Hub Driver
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            drivers/usb/usbhub/fdo.c
+ * PURPOSE:         Handle FDO
+ * PROGRAMMERS:
+ *                  Michael Martin (michael.martin(a)reactos.org)
+ *                  Johannes Anderwald (johannes.anderwald(a)reactos.org)
+ */
+
+#define INITGUID
+
+#define NDEBUG
+#include "usbhub.h"
+
+NTSTATUS
+SubmitRequestToRootHub(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN ULONG IoControlCode,
+    OUT PVOID OutParameter1,
+    OUT PVOID OutParameter2)
+{
+    KEVENT Event;
+    PIRP Irp;
+    IO_STATUS_BLOCK IoStatus;
+    NTSTATUS Status;
+    PIO_STACK_LOCATION Stack = NULL;
+
+    KeInitializeEvent(&Event, NotificationEvent, FALSE);
+
+    //
+    // Build Control Request
+    //
+    Irp = IoBuildDeviceIoControlRequest(IoControlCode,
+                                        DeviceObject,
+                                        NULL, 0,
+                                        NULL, 0,
+                                        TRUE,
+                                        &Event,
+                                        &IoStatus);
+
+    if (Irp == NULL)
+    {
+        DPRINT("Usbhub: IoBuildDeviceIoControlRequest() failed\n");
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    //
+    // Initialize the status block before sending the IRP
+    //
+    IoStatus.Status = STATUS_NOT_SUPPORTED;
+    IoStatus.Information = 0;
+
+    //
+    // Get Next Stack Location and Initialize it
+    //
+    Stack = IoGetNextIrpStackLocation(Irp);
+    Stack->Parameters.Others.Argument1 = OutParameter1;
+    Stack->Parameters.Others.Argument2 = OutParameter2;
+
+    //
+    // Call RootHub
+    //
+    Status = IoCallDriver(DeviceObject, Irp);
+
+    if (Status == STATUS_PENDING)
+    {
+        DPRINT1("USBHUB: Operation pending\n");
+        KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL);
+        Status = IoStatus.Status;
+    }
+
+    return Status;
+}
+
+NTSTATUS
+StatusChangeEndpointCompletion(
+    PDEVICE_OBJECT DeviceObject,
+    PIRP Irp,
+    PVOID Context)
+{
+    PHUB_DEVICE_EXTENSION HubDeviceExtension;
+    LONG i;
+
+    HubDeviceExtension =
(PHUB_DEVICE_EXTENSION)((PDEVICE_OBJECT)Context)->DeviceExtension;
+
+    //
+    // Determine which port has changed
+    //
+    for (i=0; i < HubDeviceExtension->UsbExtHubInfo.NumberOfPorts; i++)
+    {
+        DPRINT1("Port %x HubDeviceExtension->PortStatus %x\n",i+1,
HubDeviceExtension->PortStatusChange[i].Status);
+        DPRINT1("Port %x HubDeviceExtension->PortChange %x\n",i+1,
HubDeviceExtension->PortStatusChange[i].Change);
+        //
+        // FIXME: Call function to check port before creating device object for it
+        //
+    }
+
+    //
+    // Free the Irp and return more processing required so the IO Manger doesnât try to
free it
+    //
+    IoFreeIrp(Irp);
+
+    return STATUS_MORE_PROCESSING_REQUIRED;
+}
+
+NTSTATUS
+QueryStatusChangeEndpoint(
+    PDEVICE_OBJECT DeviceObject)
+{
+    NTSTATUS Status;
+    PIO_STACK_LOCATION Stack;
+    PHUB_DEVICE_EXTENSION HubDeviceExtension;
+
+    HubDeviceExtension = (PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+    HubDeviceExtension->PendingSCEUrb;
+    RtlZeroMemory(&HubDeviceExtension->PendingSCEUrb,
+                  sizeof(URB));
+
+    //
+    // Create URB for Status Change Endpoint request
+    //
+    UsbBuildInterruptOrBulkTransferRequest(&HubDeviceExtension->PendingSCEUrb,
+                                           sizeof(struct
_URB_BULK_OR_INTERRUPT_TRANSFER),
+                                           HubDeviceExtension->PipeHandle,
+                                           HubDeviceExtension->PortStatusChange,
+                                           NULL,
+                                           sizeof(USHORT) * 2 *
HubDeviceExtension->UsbExtHubInfo.NumberOfPorts,
+                                           USBD_TRANSFER_DIRECTION_IN |
USBD_SHORT_TRANSFER_OK,
+                                           NULL);
+
+    //
+    // Set the device handle to null for roothub
+    //
+    HubDeviceExtension->PendingSCEUrb.UrbHeader.UsbdDeviceHandle = NULL;
+
+    //
+    // Allocate an Irp
+    //
+    HubDeviceExtension->PendingSCEIrp =
IoAllocateIrp(HubDeviceExtension->RootHubPhysicalDeviceObject->StackSize,
+                                                      FALSE);
+
+    if (!HubDeviceExtension->PendingSCEIrp)
+    {
+        DPRINT1("USBHUB: Failed to allocate IRP for SCE request!\n");
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    //
+    // Initialize the IRP
+    //
+    HubDeviceExtension->PendingSCEIrp->IoStatus.Status = STATUS_NOT_SUPPORTED;
+    HubDeviceExtension->PendingSCEIrp->IoStatus.Information = 0;
+    HubDeviceExtension->PendingSCEIrp->Flags = 0;
+    HubDeviceExtension->PendingSCEIrp->UserBuffer = NULL;
+
+    //
+    // Get the Next Stack Location and Initialize it
+    //
+    Stack = IoGetNextIrpStackLocation(HubDeviceExtension->PendingSCEIrp);
+    Stack->DeviceObject = HubDeviceExtension->RootHubPhysicalDeviceObject;
+    Stack->Parameters.Others.Argument1 = &HubDeviceExtension->PendingSCEUrb;
+    Stack->Parameters.Others.Argument2 = NULL;
+    Stack->MajorFunction =  IRP_MJ_INTERNAL_DEVICE_CONTROL;
+    Stack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
+
+    //
+    // Set the completion routine for when device is connected to root hub
+    //
+    IoSetCompletionRoutine(HubDeviceExtension->PendingSCEIrp,
+                           (PIO_COMPLETION_ROUTINE) StatusChangeEndpointCompletion,
+                           DeviceObject,
+                           TRUE,
+                           TRUE,
+                           TRUE);
+
+    Status = IoCallDriver(HubDeviceExtension->RootHubPhysicalDeviceObject,
HubDeviceExtension->PendingSCEIrp);
+    DPRINT1("SCE request status %x\n", Status);
+
+    return STATUS_PENDING;
+}
+
+NTSTATUS
+QueryInterface(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN CONST GUID InterfaceType,
+    IN LONG Size,
+    IN LONG Version,
+    OUT PVOID Interface)
+{
+    KEVENT Event;
+    PIRP Irp;
+    IO_STATUS_BLOCK IoStatus;
+    NTSTATUS Status;
+    PIO_STACK_LOCATION Stack = NULL;
+
+    //
+    // Initialize the Event used to wait for Irp completion
+    //
+    KeInitializeEvent(&Event, NotificationEvent, FALSE);
+
+    //
+    // Build Control Request
+    //
+    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
+                                       DeviceObject,
+                                       NULL,
+                                       0,
+                                       NULL,
+                                       &Event,
+                                       &IoStatus);
+
+    //
+    // Get Next Stack Location and Initialize it.
+    //
+    Stack = IoGetNextIrpStackLocation(Irp);
+    Stack->MinorFunction = IRP_MN_QUERY_INTERFACE;
+    Stack->Parameters.QueryInterface.InterfaceType=
&InterfaceType;//USB_BUS_INTERFACE_HUB_GUID;
+    Stack->Parameters.QueryInterface.Size = Size;
+    Stack->Parameters.QueryInterface.Version = Version;
+    Stack->Parameters.QueryInterface.Interface = Interface;
+    Stack->Parameters.QueryInterface.InterfaceSpecificData = NULL;
+
+    Status = IoCallDriver(DeviceObject, Irp);
+
+    if (Status == STATUS_PENDING)
+    {
+        DPRINT("Operation pending\n");
+        KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL);
+        Status = IoStatus.Status;
+    }
+
+    return Status;
+}
+
+NTSTATUS
+GetPortStatusAndChange(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN ULONG PortId,
+    OUT PORT_STATUS_CHANGE *StatusChange)
+{
+    NTSTATUS Status;
+    PURB Urb;
+
+    //
+    // Allocate URB
+    //
+    Urb = ExAllocatePoolWithTag(NonPagedPool, sizeof(URB), USB_HUB_TAG);
+    if (!Urb)
+    {
+        DPRINT1("Failed to allocate memory for URB!\n");
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    //
+    // Zero it
+    //
+    RtlZeroMemory(Urb, sizeof(URB));
+
+    //
+    // Create URB for getting Port Status
+    //
+    UsbBuildVendorRequest(Urb,
+                          URB_FUNCTION_CLASS_OTHER,
+                          sizeof(Urb->UrbControlVendorClassRequest),
+                          USBD_TRANSFER_DIRECTION_OUT,
+                          0,
+                          USB_REQUEST_GET_STATUS,
+                          0,
+                          PortId,
+                          &StatusChange,
+                          0,
+                          sizeof(PORT_STATUS_CHANGE),
+                          0);
+
+    //
+    // Query the Root Hub
+    //
+    Status = SubmitRequestToRootHub(DeviceObject, IOCTL_INTERNAL_USB_SUBMIT_URB, Urb,
NULL);
+
+    //
+    // Free URB
+    //
+    ExFreePool(Urb);
+
+    return Status;
+}
+
+NTSTATUS
+SetPortFeature(
+    PDEVICE_OBJECT DeviceObject,
+    ULONG PortId,
+    ULONG Feature)
+{
+    NTSTATUS Status;
+    PURB Urb;
+
+    //
+    // Allocate URB
+    //
+    Urb = ExAllocatePoolWithTag(NonPagedPool, sizeof(URB), USB_HUB_TAG);
+    if (!Urb)
+    {
+        DPRINT1("Failed to allocate memory for URB!\n");
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    //
+    // Zero it
+    //
+    RtlZeroMemory(Urb, sizeof(URB));
+
+    //
+    // Create URB for Clearing Port Reset
+    //
+    UsbBuildVendorRequest(Urb,
+                          URB_FUNCTION_CLASS_OTHER,
+                          sizeof(Urb->UrbControlVendorClassRequest),
+                          USBD_TRANSFER_DIRECTION_IN,
+                          0,
+                          USB_REQUEST_SET_FEATURE,
+                          Feature,
+                          PortId,
+                          NULL,
+                          0,
+                          0,
+                          0);
+    //
+    // Query the Root Hub
+    //
+    Status = SubmitRequestToRootHub(DeviceObject, IOCTL_INTERNAL_USB_SUBMIT_URB, Urb,
NULL);
+
+    //
+    // Free URB
+    //
+    ExFreePool(Urb);
+
+    return Status;
+}
+
+NTSTATUS
+ClearPortFeature(
+    PDEVICE_OBJECT DeviceObject,
+    ULONG PortId,
+    ULONG Feature)
+{
+    NTSTATUS Status;
+    PURB Urb;
+
+    //
+    // Allocate a URB
+    //
+    Urb = ExAllocatePoolWithTag(NonPagedPool, sizeof(URB), USB_HUB_TAG);
+    if (!Urb)
+    {
+        DPRINT1("Failed to allocate memory for URB!\n");
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    //
+    // Zero it
+    //
+    RtlZeroMemory(Urb, sizeof(URB));
+
+    //
+    // Create URB for Clearing Port Reset
+    //
+    UsbBuildVendorRequest(Urb,
+                          URB_FUNCTION_CLASS_OTHER,
+                          sizeof(Urb->UrbControlVendorClassRequest),
+                          USBD_TRANSFER_DIRECTION_IN,
+                          0,
+                          USB_REQUEST_CLEAR_FEATURE,
+                          Feature,
+                          PortId,
+                          NULL,
+                          0,
+                          0,
+                          0);
+    //
+    // Query the Root Hub
+    //
+    Status = SubmitRequestToRootHub(DeviceObject, IOCTL_INTERNAL_USB_SUBMIT_URB, Urb,
NULL);
+
+    //
+    // Free URB
+    //
+    ExFreePool(Urb);
+
+    return Status;
+}
+
+NTSTATUS
+GetUsbDeviceDescriptor(
+    PDEVICE_OBJECT ChildDeviceObject,
+    UCHAR DescriptorType,
+    UCHAR Index,
+    USHORT LangId,
+    PVOID TransferBuffer,
+    ULONG TransferBufferLength)
+{
+    NTSTATUS Status;
+    PURB Urb;
+    PHUB_DEVICE_EXTENSION HubDeviceExtension;
+    PHUB_CHILDDEVICE_EXTENSION ChildDeviceExtension;
+    PMDL BufferMdl;
+
+    //
+    // Get the Hubs Device Extension
+    //
+    ChildDeviceExtension =
(PHUB_CHILDDEVICE_EXTENSION)ChildDeviceObject->DeviceExtension;
+    HubDeviceExtension = (PHUB_DEVICE_EXTENSION)
ChildDeviceExtension->ParentDeviceObject->DeviceExtension;
+
+    //
+    // Allocate a URB
+    //
+    Urb = ExAllocatePoolWithTag(NonPagedPool, sizeof(URB), USB_HUB_TAG);
+    if (!Urb)
+    {
+        DPRINT1("Failed to allocate memory for URB!\n");
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    //
+    // Zero it
+    //
+    RtlZeroMemory(Urb, sizeof(URB));
+
+    //
+    // Create a MDL for buffer
+    //
+    BufferMdl = IoAllocateMdl(TransferBuffer,
+                              TransferBufferLength,
+                              FALSE,
+                              FALSE,
+                              NULL);
+
+    //
+    // Lock the Mdl
+    //
+    _SEH2_TRY
+    {
+        MmProbeAndLockPages(BufferMdl, KernelMode, IoWriteAccess);
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        DPRINT1("MmProbeAndLockPages Failed!\n");
+        Status = _SEH2_GetExceptionCode();
+    }
+    _SEH2_END;
+
+    //
+    // Create URB for getting device descriptor
+    //
+    UsbBuildGetDescriptorRequest(Urb,
+                                 sizeof(Urb->UrbControlDescriptorRequest),
+                                 DescriptorType,
+                                 Index,
+                                 LangId,
+                                 NULL,
+                                 BufferMdl,
+                                 TransferBufferLength,
+                                 NULL);
+
+    //
+    // Set the device handle
+    //
+    Urb->UrbHeader.UsbdDeviceHandle = (PVOID)ChildDeviceObject;
+
+    //
+    // Query the Root Hub
+    //
+    Status = SubmitRequestToRootHub(HubDeviceExtension->RootHubPhysicalDeviceObject,
+                                    IOCTL_INTERNAL_USB_SUBMIT_URB,
+                                    Urb,
+                                    NULL);
+
+    //
+    // Free Mdl
+    //
+    IoFreeMdl(BufferMdl);
+
+    return Status;
+}
+
+NTSTATUS
+CreateUsbChildDeviceObject(
+    IN PDEVICE_OBJECT UsbHubDeviceObject,
+    IN LONG PortId,
+    OUT PDEVICE_OBJECT *UsbChildDeviceObject)
+{
+    //NTSTATUS Status;
+    //PHUB_CHILDDEVICE_EXTENSION UsbChildExtension;
+
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+USBHUB_FdoQueryBusRelations(
+    IN PDEVICE_OBJECT DeviceObject,
+    OUT PDEVICE_RELATIONS* pDeviceRelations)
+{
+    PHUB_DEVICE_EXTENSION HubDeviceExtension;
+    PDEVICE_RELATIONS DeviceRelations;
+    ULONG i;
+    ULONG Children = 0;
+    ULONG NeededSize;
+
+    HubDeviceExtension = (PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+    DPRINT1("Query Bus Relations\n");
+
+    //
+    // Count the number of children
+    //
+    for (i = 0; i < USB_MAXCHILDREN; i++)
+    {
+
+        if (HubDeviceExtension->ChildDeviceObject[i] == NULL)
+        {
+            continue;
+        }
+        Children++;
+    }
+
+    NeededSize = sizeof(DEVICE_RELATIONS);
+    if (Children > 1)
+        NeededSize += (Children - 1) * sizeof(PDEVICE_OBJECT);
+
+    //
+    // Allocate DeviceRelations
+    //
+    DeviceRelations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool,
+                                                        NeededSize);
+
+    if (!DeviceRelations)
+        return STATUS_INSUFFICIENT_RESOURCES;
+    DeviceRelations->Count = Children;
+    Children = 0;
+
+    //
+    // Fill in return structure
+    //
+    for (i = 0; i < USB_MAXCHILDREN; i++)
+    {
+        if (HubDeviceExtension->ChildDeviceObject[i])
+        {
+            ObReferenceObject(HubDeviceExtension->ChildDeviceObject[i]);
+            DeviceRelations->Objects[Children++] =
HubDeviceExtension->ChildDeviceObject[i];
+        }
+    }
+
+    ASSERT(Children == DeviceRelations->Count);
+    *pDeviceRelations = DeviceRelations;
+
+    //
+    // FIXME: Send the first SCE Request
+    //
+
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+USBHUB_FdoHandlePnp(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    PIO_STACK_LOCATION Stack;
+    NTSTATUS Status = STATUS_SUCCESS;
+    ULONG_PTR Information = 0;
+    PHUB_DEVICE_EXTENSION HubDeviceExtension;
+
+    HubDeviceExtension = (PHUB_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+    Stack = IoGetCurrentIrpStackLocation(Irp);
+
+    switch (Stack->MinorFunction)
+    {
+        case IRP_MN_START_DEVICE:
+        {
+            PURB Urb;
+            ULONG Result = 0;
+            PUSB_INTERFACE_DESCRIPTOR Pid;
+            ULONG PortId;
+
+            USBD_INTERFACE_LIST_ENTRY InterfaceList[2] = {{NULL, NULL}, {NULL, NULL}};
+            PURB ConfigUrb = NULL;
+
+            DPRINT1("IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
+
+            //
+            // Allocated size including the sizeof USBD_INTERFACE_LIST_ENTRY
+            //
+            Urb = ExAllocatePoolWithTag(NonPagedPool, sizeof(URB) +
sizeof(USBD_INTERFACE_LIST_ENTRY), USB_HUB_TAG);
+            RtlZeroMemory(Urb, sizeof(URB) + sizeof(USBD_INTERFACE_LIST_ENTRY));
+
+            //
+            // Get the Root Hub Pdo
+            //
+            SubmitRequestToRootHub(HubDeviceExtension->LowerDeviceObject,
+                                   IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO,
+
&HubDeviceExtension->RootHubPhysicalDeviceObject,
+
&HubDeviceExtension->RootHubFunctionalDeviceObject);
+
+            ASSERT(HubDeviceExtension->RootHubPhysicalDeviceObject);
+            ASSERT(HubDeviceExtension->RootHubFunctionalDeviceObject);
+            DPRINT1("RootPdo %x, RootFdo %x\n",
+                    HubDeviceExtension->RootHubPhysicalDeviceObject,
+                    HubDeviceExtension->RootHubFunctionalDeviceObject);
+
+            //
+            // Send the StartDevice to RootHub
+            //
+            Status =
ForwardIrpAndWait(HubDeviceExtension->RootHubPhysicalDeviceObject, Irp);
+
+            if (!NT_SUCCESS(Status))
+            {
+                DPRINT1("Failed to start the RootHub PDO\n");
+                ASSERT(FALSE);
+            }
+
+            //
+            // Get the current number of hubs
+            //
+            Status =
SubmitRequestToRootHub(HubDeviceExtension->RootHubPhysicalDeviceObject,
+                                            IOCTL_INTERNAL_USB_GET_HUB_COUNT,
+                                            &HubDeviceExtension->NumberOfHubs,
NULL);
+
+            //
+            // Get the Hub Interface
+            //
+            Status = QueryInterface(HubDeviceExtension->RootHubPhysicalDeviceObject,
+                                    USB_BUS_INTERFACE_HUB_GUID,
+                                    sizeof(USB_BUS_INTERFACE_HUB_V5),
+                                    5,
+                                    (PVOID)&HubDeviceExtension->HubInterface);
+
+            if (!NT_SUCCESS(Status))
+            {
+                DPRINT1("Failed to get HUB_GUID interface with status
0x%08lx\n", Status);
+                return STATUS_UNSUCCESSFUL;
+            }
+
+            //
+            // Get the USBDI Interface
+            //
+            Status = QueryInterface(HubDeviceExtension->RootHubPhysicalDeviceObject,
+                                    USB_BUS_INTERFACE_USBDI_GUID,
+                                    sizeof(USB_BUS_INTERFACE_USBDI_V2),
+                                    2,
+                                    (PVOID)&HubDeviceExtension->UsbDInterface);
+
+            if (!NT_SUCCESS(Status))
+            {
+                DPRINT1("Failed to get USBDI_GUID interface with status
0x%08lx\n", Status);
+                return Status;
+            }
+
+            //
+            // Get Root Hub Device Handle
+            //
+            Status =
SubmitRequestToRootHub(HubDeviceExtension->RootHubPhysicalDeviceObject,
+                                            IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE,
+                                            &HubDeviceExtension->RootHubHandle,
+                                            NULL);
+
+            if (!NT_SUCCESS(Status))
+            {
+                DPRINT1("GetRootHubDeviceHandle failed with status 0x%08lx\n",
Status);
+                return Status;
+            }
+
+            //
+            // Get Hub Device Information
+            //
+            Status =
HubDeviceExtension->HubInterface.QueryDeviceInformation(HubDeviceExtension->RootHubPhysicalDeviceObject,
+
HubDeviceExtension->RootHubHandle,
+
&HubDeviceExtension->DeviceInformation,
+
sizeof(USB_DEVICE_INFORMATION_0),
+
&Result);
+
+
+            DPRINT1("Status %x, Result 0x%08lx\n", Status, Result);
+            DPRINT1("InformationLevel %x\n",
HubDeviceExtension->DeviceInformation.InformationLevel);
+            DPRINT1("ActualLength %x\n",
HubDeviceExtension->DeviceInformation.ActualLength);
+            DPRINT1("PortNumber %x\n",
HubDeviceExtension->DeviceInformation.PortNumber);
+            DPRINT1("DeviceDescriptor %x\n",
HubDeviceExtension->DeviceInformation.DeviceDescriptor);
+            DPRINT1("HubAddress %x\n",
HubDeviceExtension->DeviceInformation.HubAddress);
+            DPRINT1("NumberofPipes %x\n",
HubDeviceExtension->DeviceInformation.NumberOfOpenPipes);
+
+
+            //
+            // Get Root Hubs Device Descriptor
+            //
+            UsbBuildGetDescriptorRequest(Urb,
+                                         sizeof(Urb->UrbControlDescriptorRequest),
+                                         USB_DEVICE_DESCRIPTOR_TYPE,
+                                         0,
+                                         0,
+                                         &HubDeviceExtension->HubDeviceDescriptor,
+                                         NULL,
+                                         sizeof(USB_DEVICE_DESCRIPTOR),
+                                         NULL);
+
+            Urb->UrbHeader.UsbdDeviceHandle = HubDeviceExtension->RootHubHandle;
+
+            Status =
SubmitRequestToRootHub(HubDeviceExtension->RootHubPhysicalDeviceObject,
+                                            IOCTL_INTERNAL_USB_SUBMIT_URB,
+                                            Urb,
+                                            NULL);
+
+            if (!NT_SUCCESS(Status))
+            {
+                DPRINT1("Failed to get HubDeviceDescriptor!\n");
+            }
+
+            DumpDeviceDescriptor(&HubDeviceExtension->HubDeviceDescriptor);
+
+            //
+            // Get Root Hubs Configuration Descriptor
+            //
+            UsbBuildGetDescriptorRequest(Urb,
+                                         sizeof(Urb->UrbControlDescriptorRequest),
+                                         USB_CONFIGURATION_DESCRIPTOR_TYPE,
+                                         0,
+                                         0,
+                                         &HubDeviceExtension->HubConfigDescriptor,
+                                         NULL,
+                                         sizeof(USB_CONFIGURATION_DESCRIPTOR) +
sizeof(USB_INTERFACE_DESCRIPTOR) + sizeof(USB_ENDPOINT_DESCRIPTOR),
+                                         NULL);
+
+            Urb->UrbHeader.UsbdDeviceHandle = HubDeviceExtension->RootHubHandle;
+
+            Status =
SubmitRequestToRootHub(HubDeviceExtension->RootHubPhysicalDeviceObject,
+                                            IOCTL_INTERNAL_USB_SUBMIT_URB,
+                                            Urb,
+                                            NULL);
+
+            if (!NT_SUCCESS(Status))
+            {
+                DPRINT1("Failed to get RootHub Configuration with status %x\n",
Status);
+                ASSERT(FALSE);
+            }
+            ASSERT(HubDeviceExtension->HubConfigDescriptor.wTotalLength);
+
+            DumpConfigurationDescriptor(&HubDeviceExtension->HubConfigDescriptor);
+
+            Status =
HubDeviceExtension->HubInterface.GetExtendedHubInformation(HubDeviceExtension->RootHubPhysicalDeviceObject,
+
HubDeviceExtension->RootHubPhysicalDeviceObject,
+
&HubDeviceExtension->UsbExtHubInfo,
+
sizeof(USB_EXTHUB_INFORMATION_0),
+                                                                    &Result);
+            if (!NT_SUCCESS(Status))
+            {
+                DPRINT1("Failed to extended hub information. Unable to determine the
number of ports!\n");
+                ASSERT(FALSE);
+            }
+
+            DPRINT1("HubDeviceExtension->UsbExtHubInfo.NumberOfPorts %x\n",
HubDeviceExtension->UsbExtHubInfo.NumberOfPorts);
+
+            //
+            // Get the Hub Descriptor
+            //
+            UsbBuildVendorRequest(Urb,
+                                  URB_FUNCTION_CLASS_DEVICE,
+                                  sizeof(Urb->UrbControlVendorClassRequest),
+                                  USBD_TRANSFER_DIRECTION_IN,
+                                  0,
+                                  USB_DEVICE_CLASS_RESERVED,
+                                  0,
+                                  0,
+                                  &HubDeviceExtension->HubDescriptor,
+                                  NULL,
+                                  sizeof(USB_HUB_DESCRIPTOR),
+                                  NULL);
+
+            Urb->UrbHeader.UsbdDeviceHandle = HubDeviceExtension->RootHubHandle;
+
+            Status =
SubmitRequestToRootHub(HubDeviceExtension->RootHubPhysicalDeviceObject,
+                                            IOCTL_INTERNAL_USB_SUBMIT_URB,
+                                            Urb,
+                                            NULL);
+
+            DPRINT1("bDescriptorType %x\n",
HubDeviceExtension->HubDescriptor.bDescriptorType);
+
+            if (!NT_SUCCESS(Status))
+            {
+                DPRINT1("Failed to get Hub Descriptor!\n");
+                ExFreePool(Urb);
+                return STATUS_UNSUCCESSFUL;
+            }
+
+            //
+            // Allocate memory for PortStatusChange to hold 2 USHORTs for each port on
hub
+            //
+            HubDeviceExtension->PortStatusChange = ExAllocatePoolWithTag(NonPagedPool,
+                                                                         sizeof(ULONG) *
HubDeviceExtension->HubDescriptor.bNumberOfPorts,
+                                                                         USB_HUB_TAG);
+
+            //
+            // Get the first Configuration Descriptor
+            //
+            Pid =
USBD_ParseConfigurationDescriptorEx(&HubDeviceExtension->HubConfigDescriptor,
+
&HubDeviceExtension->HubConfigDescriptor,
+                                                      -1, -1, -1, -1, -1);
+            ASSERT(Pid != NULL);
+            InterfaceList[0].InterfaceDescriptor = Pid;
+            ConfigUrb =
USBD_CreateConfigurationRequestEx(&HubDeviceExtension->HubConfigDescriptor,
+
(PUSBD_INTERFACE_LIST_ENTRY)&InterfaceList);
+            ASSERT(ConfigUrb != NULL);
+
+            Status =
SubmitRequestToRootHub(HubDeviceExtension->RootHubPhysicalDeviceObject,
+                                            IOCTL_INTERNAL_USB_SUBMIT_URB,
+                                            ConfigUrb,
+                                            NULL);
+
+            HubDeviceExtension->ConfigurationHandle =
ConfigUrb->UrbSelectConfiguration.ConfigurationHandle;
+            HubDeviceExtension->PipeHandle =
ConfigUrb->UrbSelectConfiguration.Interface.Pipes[0].PipeHandle;
+            DPRINT1("Configuration Handle %x\n",
HubDeviceExtension->ConfigurationHandle);
+
+            ExFreePool(ConfigUrb);
+
+            //
+            // Initialize the Hub
+            //
+            Status =
HubDeviceExtension->HubInterface.Initialize20Hub(HubDeviceExtension->RootHubPhysicalDeviceObject,
+
HubDeviceExtension->RootHubHandle, 1);
+            DPRINT1("Status %x\n", Status);
+
+            //
+            // Enable power on all ports
+            //
+            for (PortId = 0; PortId <
HubDeviceExtension->HubDescriptor.bNumberOfPorts; PortId++)
+            {
+                SetPortFeature(HubDeviceExtension->RootHubPhysicalDeviceObject,
PortId, PORT_POWER);
+            }
+            ExFreePool(Urb);
+            break;
+        }
+
+        case IRP_MN_QUERY_DEVICE_RELATIONS:
+        {
+            switch (Stack->Parameters.QueryDeviceRelations.Type)
+            {
+                case BusRelations:
+                {
+                    PDEVICE_RELATIONS DeviceRelations = NULL;
+                    DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS /
BusRelations\n");
+
+                    Status = USBHUB_FdoQueryBusRelations(DeviceObject,
&DeviceRelations);
+
+                    Information = (ULONG_PTR)DeviceRelations;
+                    break;
+                }
+                case RemovalRelations:
+                {
+                    DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS /
RemovalRelations\n");
+                    return ForwardIrpAndForget(DeviceObject, Irp);
+                }
+                default:
+                    DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unknown
type 0x%lx\n",
+                        Stack->Parameters.QueryDeviceRelations.Type);
+                    return ForwardIrpAndForget(DeviceObject, Irp);
+            }
+            break;
+        }
+        case IRP_MN_QUERY_BUS_INFORMATION:
+        {
+            DPRINT1("IRP_MN_QUERY_BUS_INFORMATION\n");
+            break;
+        }
+        case IRP_MN_QUERY_ID:
+        {
+            DPRINT1("IRP_MN_QUERY_ID\n");
+            break;
+        }
+        case IRP_MN_QUERY_CAPABILITIES:
+        {
+            DPRINT1("IRP_MN_QUERY_CAPABILITIES\n");
+            break;
+        }
+        default:
+        {
+            DPRINT1(" IRP_MJ_PNP / unknown minor function 0x%lx\n",
Stack->MinorFunction);
+            return ForwardIrpAndForget(DeviceObject, Irp);
+        }
+    }
+    Irp->IoStatus.Information = Information;
+    Irp->IoStatus.Status = Status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return Status;
+}
+
+NTSTATUS
+USBHUB_FdoHandleDeviceControl(
+    PDEVICE_OBJECT DeviceObject,
+    PIRP Irp)
+{
+    DPRINT1("FdoHandleDeviceControl\n");
+    UNIMPLEMENTED
+    return STATUS_NOT_IMPLEMENTED;
+}
+
Propchange: branches/usb-bringup/drivers/usb/usbhub_new/fdo.c
------------------------------------------------------------------------------
    svn:eol-style = native
Added: branches/usb-bringup/drivers/usb/usbhub_new/misc.c
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbhub_…
==============================================================================
--- branches/usb-bringup/drivers/usb/usbhub_new/misc.c (added)
+++ branches/usb-bringup/drivers/usb/usbhub_new/misc.c [iso-8859-1] Wed May  4 01:07:21
2011
@@ -1,0 +1,98 @@
+/*
+ * PROJECT:         ReactOS Universal Serial Bus Hub Driver
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            drivers/usb/usbhub/fdo.c
+ * PURPOSE:         Misc helper functions
+ * PROGRAMMERS:
+ *                  Michael Martin (michael.martin(a)reactos.org)
+ *                  Johannes Anderwald (johannes.anderwald(a)reactos.org)
+ */
+#define NDEBUG
+#include "usbhub.h"
+#include <stdarg.h>
+
+VOID
+DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor)
+{
+    DPRINT1("Dumping Device Descriptor %x\n", DeviceDescriptor);
+    DPRINT1("bLength %x\n", DeviceDescriptor->bLength);
+    DPRINT1("bDescriptorType %x\n", DeviceDescriptor->bDescriptorType);
+    DPRINT1("bcdUSB %x\n", DeviceDescriptor->bcdUSB);
+    DPRINT1("bDeviceClass %x\n", DeviceDescriptor->bDeviceClass);
+    DPRINT1("bDeviceSubClass %x\n", DeviceDescriptor->bDeviceSubClass);
+    DPRINT1("bDeviceProtocol %x\n", DeviceDescriptor->bDeviceProtocol);
+    DPRINT1("bMaxPacketSize0 %x\n", DeviceDescriptor->bMaxPacketSize0);
+    DPRINT1("idVendor %x\n", DeviceDescriptor->idVendor);
+    DPRINT1("idProduct %x\n", DeviceDescriptor->idProduct);
+    DPRINT1("bcdDevice %x\n", DeviceDescriptor->bcdDevice);
+    DPRINT1("iManufacturer %x\n", DeviceDescriptor->iManufacturer);
+    DPRINT1("iProduct %x\n", DeviceDescriptor->iProduct);
+    DPRINT1("iSerialNumber %x\n", DeviceDescriptor->iSerialNumber);
+    DPRINT1("bNumConfigurations %x\n",
DeviceDescriptor->bNumConfigurations);
+}
+
+//----------------------------------------------------------------------------------------
+VOID
+DumpConfigurationDescriptor(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor)
+{
+    DPRINT1("Dumping ConfigurationDescriptor %x\n", ConfigurationDescriptor);
+    DPRINT1("bLength %x\n", ConfigurationDescriptor->bLength);
+    DPRINT1("bDescriptorType %x\n",
ConfigurationDescriptor->bDescriptorType);
+    DPRINT1("wTotalLength %x\n", ConfigurationDescriptor->wTotalLength);
+    DPRINT1("bNumInterfaces %x\n", ConfigurationDescriptor->bNumInterfaces);
+    DPRINT1("bConfigurationValue %x\n",
ConfigurationDescriptor->bConfigurationValue);
+    DPRINT1("iConfiguration %x\n", ConfigurationDescriptor->iConfiguration);
+    DPRINT1("bmAttributes %x\n", ConfigurationDescriptor->bmAttributes);
+    DPRINT1("MaxPower %x\n", ConfigurationDescriptor->MaxPower);
+}
+
+NTSTATUS
+NTAPI
+ForwardIrpAndWaitCompletion(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp,
+    IN PVOID Context)
+{
+    if (Irp->PendingReturned)
+        KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE);
+
+    return STATUS_MORE_PROCESSING_REQUIRED;
+}
+
+NTSTATUS
+ForwardIrpAndWait(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    KEVENT Event;
+    NTSTATUS Status;
+
+    KeInitializeEvent(&Event, NotificationEvent, FALSE);
+    IoCopyCurrentIrpStackLocationToNext(Irp);
+
+    IoSetCompletionRoutine(Irp, ForwardIrpAndWaitCompletion, &Event, TRUE, TRUE,
TRUE);
+
+    Status = IoCallDriver(DeviceObject, Irp);
+    if (Status == STATUS_PENDING)
+    {
+        Status = KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL);
+        if (NT_SUCCESS(Status))
+            Status = Irp->IoStatus.Status;
+    }
+
+    return Status;
+}
+
+NTSTATUS
+ForwardIrpAndForget(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    PDEVICE_OBJECT LowerDevice =
((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->LowerDeviceObject;
+
+    ASSERT(LowerDevice);
+
+    IoSkipCurrentIrpStackLocation(Irp);
+    return IoCallDriver(LowerDevice, Irp);
+}
+
Propchange: branches/usb-bringup/drivers/usb/usbhub_new/misc.c
------------------------------------------------------------------------------
    svn:eol-style = native
Added: branches/usb-bringup/drivers/usb/usbhub_new/pdo.c
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbhub_…
==============================================================================
--- branches/usb-bringup/drivers/usb/usbhub_new/pdo.c (added)
+++ branches/usb-bringup/drivers/usb/usbhub_new/pdo.c [iso-8859-1] Wed May  4 01:07:21
2011
@@ -1,0 +1,282 @@
+/*
+ * PROJECT:         ReactOS Universal Serial Bus Hub Driver
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            drivers/usb/usbhub/fdo.c
+ * PURPOSE:         Handle PDO
+ * PROGRAMMERS:
+ *                  Hervé Poussineau (hpoussin(a)reactos.org)
+ *                  Michael Martin (michael.martin(a)reactos.org)
+ *                  Johannes Anderwald (johannes.anderwald(a)reactos.org)
+ */
+
+#define NDEBUG
+#include "usbhub.h"
+
+#define IO_METHOD_FROM_CTL_CODE(ctlCode) (ctlCode&0x00000003)
+
+NTSTATUS
+USBHUB_PdoHandleInternalDeviceControl(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    PIO_STACK_LOCATION Stack;
+    ULONG_PTR Information = 0;
+    NTSTATUS Status;
+
+    DPRINT1("UsbhubInternalDeviceControlPdo() called\n");
+
+    Stack = IoGetCurrentIrpStackLocation(Irp);
+    Status = Irp->IoStatus.Status;
+
+    switch (Stack->Parameters.DeviceIoControl.IoControlCode)
+    {
+        case IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO:
+        {
+            PHUB_DEVICE_EXTENSION DeviceExtension;
+
+            DPRINT1("IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO\n");
+            if (Irp->AssociatedIrp.SystemBuffer == NULL
+                || Stack->Parameters.DeviceIoControl.OutputBufferLength !=
sizeof(PVOID))
+            {
+                Status = STATUS_INVALID_PARAMETER;
+            }
+            else
+            {
+                PVOID* pHubPointer;
+                DeviceExtension =
(PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+                pHubPointer = (PVOID*)Irp->AssociatedIrp.SystemBuffer;
+                // FIXME
+                *pHubPointer = NULL;
+                Information = sizeof(PVOID);
+                Status = STATUS_SUCCESS;
+            }
+            break;
+        }
+        default:
+        {
+            DPRINT1("Unknown IOCTL code 0x%lx\n",
Stack->Parameters.DeviceIoControl.IoControlCode);
+            Information = Irp->IoStatus.Information;
+            Status = Irp->IoStatus.Status;
+        }
+    }
+
+    Irp->IoStatus.Information = Information;
+    Irp->IoStatus.Status = Status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return Status;
+}
+
+NTSTATUS
+USBHUB_PdoStartDevice(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    PHUB_DEVICE_EXTENSION DeviceExtension;
+    NTSTATUS Status = STATUS_UNSUCCESSFUL;
+    DPRINT1("USBHUB_PdoStartDevice\n");
+    DeviceExtension = (PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+    UNIMPLEMENTED
+    return Status;
+}
+
+NTSTATUS
+USBHUB_PdoQueryId(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp,
+    OUT ULONG_PTR* Information)
+{
+    PHUB_CHILDDEVICE_EXTENSION ChildDeviceExtension;
+    ULONG IdType;
+    PWCHAR SourceString = NULL;
+    NTSTATUS Status = STATUS_SUCCESS;
+
+    IdType = IoGetCurrentIrpStackLocation(Irp)->Parameters.QueryId.IdType;
+    ChildDeviceExtension = (PHUB_CHILDDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+    switch (IdType)
+    {
+        case BusQueryDeviceID:
+        {
+            DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryDeviceID\n");
+            SourceString = ChildDeviceExtension->DeviceId;
+            break;
+        }
+        case BusQueryHardwareIDs:
+        {
+            DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryHardwareIDs\n");
+            SourceString = ChildDeviceExtension->HardwareIds;
+            break;
+        }
+        case BusQueryCompatibleIDs:
+        {
+            DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryCompatibleIDs\n");
+            SourceString = ChildDeviceExtension->CompatibleIds;
+            break;
+        }
+        case BusQueryInstanceID:
+        {
+            DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryInstanceID\n");
+            SourceString = ChildDeviceExtension->InstanceId;
+            break;
+        }
+        default:
+            DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / unknown query id type
0x%lx\n", IdType);
+            return STATUS_NOT_SUPPORTED;
+    }
+
+    *Information = (ULONG_PTR)SourceString;
+    return Status;
+}
+
+NTSTATUS
+USBHUB_PdoQueryDeviceText(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp,
+    OUT ULONG_PTR* Information)
+{
+    PHUB_CHILDDEVICE_EXTENSION ChildDeviceExtension;
+    DEVICE_TEXT_TYPE DeviceTextType;
+    LCID LocaleId;
+
+    DeviceTextType =
IoGetCurrentIrpStackLocation(Irp)->Parameters.QueryDeviceText.DeviceTextType;
+    LocaleId = IoGetCurrentIrpStackLocation(Irp)->Parameters.QueryDeviceText.LocaleId;
+    ChildDeviceExtension = (PHUB_CHILDDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+    switch (DeviceTextType)
+    {
+        case DeviceTextDescription:
+        case DeviceTextLocationInformation:
+        {
+            if (DeviceTextType == DeviceTextDescription)
+            {
+                *Information = (ULONG_PTR)ChildDeviceExtension->TextDescription;
+                DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT /
DeviceTextDescription\n");
+            }
+            else
+                DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT /
DeviceTextLocationInformation\n");
+            return STATUS_SUCCESS;
+        }
+        default:
+            DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / unknown device text
type 0x%lx\n", DeviceTextType);
+            return STATUS_NOT_SUPPORTED;
+    }
+}
+
+NTSTATUS
+USBHUB_PdoHandlePnp(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    ULONG MinorFunction;
+    PIO_STACK_LOCATION Stack;
+    ULONG_PTR Information = 0;
+    NTSTATUS Status;
+
+    Stack = IoGetCurrentIrpStackLocation(Irp);
+    MinorFunction = Stack->MinorFunction;
+
+    switch (MinorFunction)
+    {
+        case IRP_MN_START_DEVICE:
+        {
+            DPRINT1("IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
+            Status = USBHUB_PdoStartDevice(DeviceObject, Irp);
+            break;
+        }
+        case IRP_MN_QUERY_CAPABILITIES:
+        {
+            PDEVICE_CAPABILITIES DeviceCapabilities;
+            ULONG i;
+            DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_CAPABILITIES\n");
+
+            DeviceCapabilities =
(PDEVICE_CAPABILITIES)Stack->Parameters.DeviceCapabilities.Capabilities;
+            // FIXME: capabilities can change with connected device
+            DeviceCapabilities->LockSupported = TRUE;
+            DeviceCapabilities->EjectSupported = FALSE;
+            DeviceCapabilities->Removable = FALSE;
+            DeviceCapabilities->DockDevice = FALSE;
+            DeviceCapabilities->UniqueID = FALSE;
+            DeviceCapabilities->SilentInstall = TRUE;
+            DeviceCapabilities->RawDeviceOK = FALSE;
+            DeviceCapabilities->SurpriseRemovalOK = FALSE;
+            DeviceCapabilities->HardwareDisabled = FALSE;
+            //DeviceCapabilities->NoDisplayInUI = FALSE;
+            DeviceCapabilities->DeviceState[0] = PowerDeviceD0;
+            for (i = 0; i < PowerSystemMaximum; i++)
+                DeviceCapabilities->DeviceState[i] = PowerDeviceD3;
+            //DeviceCapabilities->DeviceWake = PowerDeviceUndefined;
+            DeviceCapabilities->D1Latency = 0;
+            DeviceCapabilities->D2Latency = 0;
+            DeviceCapabilities->D3Latency = 0;
+            Status = STATUS_SUCCESS;
+            break;
+        }
+        case IRP_MN_QUERY_RESOURCES:
+        {
+            PCM_RESOURCE_LIST ResourceList;
+
+            DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_RESOURCES\n");
+            ResourceList = ExAllocatePool(PagedPool, sizeof(CM_RESOURCE_LIST));
+            if (!ResourceList)
+            {
+                DPRINT1("ExAllocatePool() failed\n");
+                Status = STATUS_INSUFFICIENT_RESOURCES;
+            }
+            else
+            {
+                ResourceList->Count = 0;
+                Information = (ULONG_PTR)ResourceList;
+                Status = STATUS_SUCCESS;
+            }
+            break;
+        }
+        case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
+        {
+            PIO_RESOURCE_REQUIREMENTS_LIST ResourceList;
+
+            DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
+            ResourceList = ExAllocatePool(PagedPool,
sizeof(IO_RESOURCE_REQUIREMENTS_LIST));
+            if (!ResourceList)
+            {
+                DPRINT1("ExAllocatePool() failed\n");
+                Status = STATUS_INSUFFICIENT_RESOURCES;
+            }
+            else
+            {
+                RtlZeroMemory(ResourceList, sizeof(IO_RESOURCE_REQUIREMENTS_LIST));
+                ResourceList->ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST);
+                ResourceList->AlternativeLists = 1;
+                ResourceList->List->Version = 1;
+                ResourceList->List->Revision = 1;
+                ResourceList->List->Count = 0;
+                Information = (ULONG_PTR)ResourceList;
+                Status = STATUS_SUCCESS;
+            }
+            break;
+        }
+        case IRP_MN_QUERY_DEVICE_TEXT:
+        {
+            Status = USBHUB_PdoQueryDeviceText(DeviceObject, Irp, &Information);
+            break;
+        }
+        case IRP_MN_QUERY_ID:
+        {
+            Status = USBHUB_PdoQueryId(DeviceObject, Irp, &Information);
+            break;
+        }
+        default:
+        {
+            DPRINT1("ERROR PDO IRP_MJ_PNP / unknown minor function 0x%lx\n",
MinorFunction);
+            Information = Irp->IoStatus.Information;
+            Status = Irp->IoStatus.Status;
+        }
+    }
+
+    Irp->IoStatus.Information = Information;
+    Irp->IoStatus.Status = Status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return Status;
+}
+
Propchange: branches/usb-bringup/drivers/usb/usbhub_new/pdo.c
------------------------------------------------------------------------------
    svn:eol-style = native
Added: branches/usb-bringup/drivers/usb/usbhub_new/usbhub.c
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbhub_…
==============================================================================
--- branches/usb-bringup/drivers/usb/usbhub_new/usbhub.c (added)
+++ branches/usb-bringup/drivers/usb/usbhub_new/usbhub.c [iso-8859-1] Wed May  4 01:07:21
2011
@@ -1,0 +1,199 @@
+/*
+ * PROJECT:         ReactOS Universal Serial Bus Hub Driver
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            drivers/usb/usbhub/fdo.c
+ * PURPOSE:         UsbHub Driver
+ * PROGRAMMERS:
+ *                  Hervé Poussineau (hpoussin(a)reactos.org)
+ *                  Michael Martin (michael.martin(a)reactos.org)
+ *                  Johannes Anderwald (johannes.anderwald(a)reactos.org)
+ */
+
+
+//#define NDEBUG
+#include "usbhub.h"
+
+NTSTATUS NTAPI
+USBHUB_Create(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    DPRINT1("USBHUB: IRP_MJ_CREATE\n");
+
+    Irp->IoStatus.Status = STATUS_SUCCESS;
+    Irp->IoStatus.Information = 0;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS NTAPI
+USBHUB_Close(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    DPRINT1("USBHUB: IRP_MJ_CLOSE\n");
+
+    Irp->IoStatus.Status = STATUS_SUCCESS;
+    Irp->IoStatus.Information = 0;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS NTAPI
+USBHUB_Cleanup(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    DPRINT1("USBHUB: IRP_MJ_CLEANUP\n");
+
+    Irp->IoStatus.Status = STATUS_SUCCESS;
+    Irp->IoStatus.Information = 0;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return STATUS_SUCCESS;
+}
+
+
+NTSTATUS NTAPI
+USBHUB_AddDevice(
+    IN PDRIVER_OBJECT DriverObject,
+    IN PDEVICE_OBJECT PhysicalDeviceObject)
+{
+    PDEVICE_OBJECT DeviceObject;
+    PHUB_DEVICE_EXTENSION HubDeviceExtension;
+    NTSTATUS Status;
+
+    //
+    // Create the Device Object
+    //
+    Status = IoCreateDevice(DriverObject,
+                            sizeof(HUB_DEVICE_EXTENSION),
+                            NULL,
+                            FILE_DEVICE_BUS_EXTENDER,
+                            FILE_AUTOGENERATED_DEVICE_NAME,
+                            FALSE,
+                            &DeviceObject);
+
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("USBHUB: IoCreateDevice() failed with status 0x%08lx\n",
Status);
+        return Status;
+    }
+
+    //
+    // Zero Hub Extension
+    //
+    HubDeviceExtension = (PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+    RtlZeroMemory(HubDeviceExtension, sizeof(HUB_DEVICE_EXTENSION));
+
+    //
+    // Set this to Fdo
+    //
+    HubDeviceExtension->Common.IsFDO = TRUE;
+    DeviceObject->Flags |= DO_POWER_PAGABLE;
+
+    //
+    // Attached to lower device
+    //
+    //Status = IoAttachDeviceToDeviceStackSafe(Fdo, Pdo,
&DeviceExtension->LowerDevice);
+    HubDeviceExtension->LowerDeviceObject = IoAttachDeviceToDeviceStack(DeviceObject,
PhysicalDeviceObject);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("USBHUB: IoAttachDeviceToDeviceStackSafe() failed with status
0x%08lx\n", Status);
+        IoDeleteDevice(DeviceObject);
+        return Status;
+    }
+
+    DeviceObject->Flags |= DO_BUFFERED_IO;
+    DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
+
+    return STATUS_SUCCESS;
+}
+
+static NTSTATUS NTAPI
+USBHUB_IrpStub(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    NTSTATUS Status;
+
+    if (((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
+    {
+        DPRINT1("Usbhub: FDO stub for major function 0x%lx\n",
+            IoGetCurrentIrpStackLocation(Irp)->MajorFunction);
+        return ForwardIrpAndForget(DeviceObject, Irp);
+    }
+    else
+    {
+        //
+        // Cant forward as we are the PDO!
+        //
+        DPRINT1("USBHUB: ERROR- PDO stub for major function 0x%lx\n",
+            IoGetCurrentIrpStackLocation(Irp)->MajorFunction);
+#ifndef NDEBUG
+        DbgBreakPoint();
+#endif
+    }
+
+    Status = Irp->IoStatus.Status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return Status;
+}
+
+
+NTSTATUS NTAPI
+USBHUB_DispatchDeviceControl(
+    PDEVICE_OBJECT DeviceObject,
+    PIRP Irp)
+{
+    DPRINT1("Usbhub: DispatchDeviceControl\n");
+    if (((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
+        return USBHUB_FdoHandleDeviceControl(DeviceObject, Irp);
+    else
+        return USBHUB_IrpStub(DeviceObject, Irp);
+}
+
+NTSTATUS NTAPI
+USBHUB_DispatchInternalDeviceControl(
+    PDEVICE_OBJECT DeviceObject,
+    PIRP Irp)
+{
+    DPRINT1("Usbhub: DispatchInternalDeviceControl\n");
+    if (((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
+        return USBHUB_IrpStub(DeviceObject, Irp);
+    else
+        return USBHUB_PdoHandleInternalDeviceControl(DeviceObject, Irp);
+}
+
+NTSTATUS NTAPI
+USBHUB_DispatchPnp(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+    DPRINT1("USBHUB: DispatchPnp\n");
+    if (((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
+        return USBHUB_FdoHandlePnp(DeviceObject, Irp);
+    else
+        return USBHUB_PdoHandlePnp(DeviceObject, Irp);
+}
+
+NTSTATUS NTAPI
+DriverEntry(
+    IN PDRIVER_OBJECT DriverObject,
+    IN PUNICODE_STRING RegistryPath)
+{
+    ULONG i;
+
+    DriverObject->DriverExtension->AddDevice = USBHUB_AddDevice;
+    DPRINT1("USBHUB: DriverEntry\n");
+
+    for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
+        DriverObject->MajorFunction[i] = USBHUB_IrpStub;
+
+    DriverObject->MajorFunction[IRP_MJ_CREATE] = USBHUB_Create;
+    DriverObject->MajorFunction[IRP_MJ_CLOSE] = USBHUB_Close;
+    DriverObject->MajorFunction[IRP_MJ_CLEANUP] = USBHUB_Cleanup;
+    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = USBHUB_DispatchDeviceControl;
+    DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] =
USBHUB_DispatchInternalDeviceControl;
+    DriverObject->MajorFunction[IRP_MJ_PNP] = USBHUB_DispatchPnp;
+
+    return STATUS_SUCCESS;
+}
+
Propchange: branches/usb-bringup/drivers/usb/usbhub_new/usbhub.c
------------------------------------------------------------------------------
    svn:eol-style = native
Added: branches/usb-bringup/drivers/usb/usbhub_new/usbhub.h
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbhub_…
==============================================================================
--- branches/usb-bringup/drivers/usb/usbhub_new/usbhub.h (added)
+++ branches/usb-bringup/drivers/usb/usbhub_new/usbhub.h [iso-8859-1] Wed May  4 01:07:21
2011
@@ -1,0 +1,146 @@
+#pragma once
+
+#include <ntddk.h>
+#include <hubbusif.h>
+#include <usbbusif.h>
+#include <usbioctl.h>
+#include <usb.h>
+#include <usbdlib.h>
+#include <debug.h>
+//BROKEN: #include <usbprotocoldefs.h>
+#include <pseh/pseh2.h>
+
+#define USB_HUB_TAG 'hbsu'
+#define USB_MAXCHILDREN 127
+
+// Lifted from broken header above
+#define C_HUB_LOCAL_POWER                    0
+#define C_HUB_OVER_CURRENT                   1
+#define PORT_CONNECTION                      0
+#define PORT_ENABLE                          1
+#define PORT_SUSPEND                         2
+#define PORT_OVER_CURRENT                    3
+#define PORT_RESET                           4
+#define PORT_POWER                           8
+#define PORT_LOW_SPEED                       9
+#define C_PORT_CONNECTION                    16
+#define C_PORT_ENABLE                        17
+#define C_PORT_SUSPEND                       18
+#define C_PORT_OVER_CURRENT                  19
+#define C_PORT_RESET                         20
+#define PORT_TEST                            21
+#define PORT_INDICATOR                       22
+
+typedef struct _PORT_STATUS_CHANGE
+{
+    USHORT Status;
+    USHORT Change;
+} PORT_STATUS_CHANGE, *PPORT_STATUS_CHANGE;
+
+typedef struct
+{
+    BOOLEAN IsFDO;
+} COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
+
+typedef struct _HUB_CHILDDEVICE_EXTENSION
+{
+    COMMON_DEVICE_EXTENSION Common;
+    PDEVICE_OBJECT ParentDeviceObject;
+    PWCHAR DeviceId;
+    PWCHAR InstanceId;
+    PWCHAR HardwareIds;
+    PWCHAR CompatibleIds;
+    PWCHAR TextDescription;
+    UNICODE_STRING SymbolicLinkName;
+} HUB_CHILDDEVICE_EXTENSION, *PHUB_CHILDDEVICE_EXTENSION;
+
+typedef struct _HUB_DEVICE_EXTENSION
+{
+    COMMON_DEVICE_EXTENSION Common;
+    PDEVICE_OBJECT LowerDeviceObject;
+    ULONG ChildCount;
+    PDEVICE_OBJECT ChildDeviceObject[USB_MAXCHILDREN];
+    PDEVICE_OBJECT RootHubPhysicalDeviceObject;
+    PDEVICE_OBJECT RootHubFunctionalDeviceObject;
+
+    ULONG NumberOfHubs;
+
+    PORT_STATUS_CHANGE *PortStatusChange;
+    URB PendingSCEUrb;
+    PIRP PendingSCEIrp;
+
+    USB_BUS_INTERFACE_HUB_V5 HubInterface;
+    USB_BUS_INTERFACE_USBDI_V2 UsbDInterface;
+
+    USB_HUB_DESCRIPTOR HubDescriptor;
+    USB_DEVICE_DESCRIPTOR HubDeviceDescriptor;
+    USB_CONFIGURATION_DESCRIPTOR HubConfigDescriptor;
+    USB_INTERFACE_DESCRIPTOR HubInterfaceDescriptor;
+    USB_ENDPOINT_DESCRIPTOR HubEndPointDescriptor;
+
+    USB_EXTHUB_INFORMATION_0 UsbExtHubInfo;
+    USB_DEVICE_INFORMATION_0 DeviceInformation;
+
+    USBD_CONFIGURATION_HANDLE ConfigurationHandle;
+    USBD_PIPE_HANDLE PipeHandle;
+    PVOID RootHubHandle;
+
+    UNICODE_STRING SymbolicLinkName;
+} HUB_DEVICE_EXTENSION, *PHUB_DEVICE_EXTENSION;
+
+// createclose.c
+NTSTATUS NTAPI
+USBHUB_Create(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp);
+
+NTSTATUS NTAPI
+USBHUB_Close(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp);
+
+NTSTATUS NTAPI
+USBHUB_Cleanup(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp);
+
+// fdo.c
+NTSTATUS
+USBHUB_FdoHandleDeviceControl(
+    PDEVICE_OBJECT DeviceObject,
+    PIRP Irp);
+
+NTSTATUS
+USBHUB_FdoHandlePnp(
+    PDEVICE_OBJECT DeviceObject,
+    PIRP Irp);
+
+// misc.c
+NTSTATUS
+ForwardIrpAndWait(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp);
+
+NTSTATUS
+ForwardIrpAndForget(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp);
+
+// pdo.c
+NTSTATUS
+USBHUB_PdoHandlePnp(
+    PDEVICE_OBJECT DeviceObject,
+    PIRP Irp);
+
+NTSTATUS
+USBHUB_PdoHandleInternalDeviceControl(
+    PDEVICE_OBJECT DeviceObject,
+    PIRP Irp);
+
+VOID
+DumpDeviceDescriptor(
+    PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
+
+VOID
+DumpConfigurationDescriptor(
+    PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor);
Propchange: branches/usb-bringup/drivers/usb/usbhub_new/usbhub.h
------------------------------------------------------------------------------
    svn:eol-style = native
Added: branches/usb-bringup/drivers/usb/usbhub_new/usbhub.rc
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbhub_…
==============================================================================
--- branches/usb-bringup/drivers/usb/usbhub_new/usbhub.rc (added)
+++ branches/usb-bringup/drivers/usb/usbhub_new/usbhub.rc [iso-8859-1] Wed May  4 01:07:21
2011
@@ -1,0 +1,5 @@
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION   "USBHUB Driver API\0"
+#define REACTOS_STR_INTERNAL_NAME      "usbhub\0"
+#define REACTOS_STR_ORIGINAL_FILENAME  "usbhub.sys\0"
+#include <reactos/version.rc>
Propchange: branches/usb-bringup/drivers/usb/usbhub_new/usbhub.rc
------------------------------------------------------------------------------
    svn:eol-style = native