Author: mjmartin
Date: Wed May  4 12:58:42 2011
New Revision: 51576

URL: http://svn.reactos.org/svn/reactos?rev=51576&view=rev
Log:
[USBHUB_NEW]
- Change parameter name for DeviceObject in functions to clearify which device 
object is to received IRPs.
- Fix a typo in GetPortStatusAndChange that caused the function to return 
nothing for status and change.
- Call QueryStatusChangeEndpoint to send the first SCE request in Query Bus 
Releations.
- Complete implementation of StatusChangeEndpointCompletion. Queue a work item 
for DeviceStatusChangeThread, which will be used to initialize the usb device 
and create related device objects.



Modified:
    branches/usb-bringup/drivers/usb/usbhub_new/fdo.c
    branches/usb-bringup/drivers/usb/usbhub_new/usbhub.h

Modified: branches/usb-bringup/drivers/usb/usbhub_new/fdo.c
URL: 
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbhub_new/fdo.c?rev=51576&r1=51575&r2=51576&view=diff
==============================================================================
--- branches/usb-bringup/drivers/usb/usbhub_new/fdo.c [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbhub_new/fdo.c [iso-8859-1] Wed May  4 
12:58:42 2011
@@ -1,4 +1,4 @@
-/*
+/*
  * PROJECT:         ReactOS Universal Serial Bus Hub Driver
  * LICENSE:         GPL - See COPYING in the top level directory
  * FILE:            drivers/usb/usbhub/fdo.c
@@ -14,8 +14,12 @@
 #include "usbhub.h"
 
 NTSTATUS
+QueryStatusChangeEndpoint(
+    IN PDEVICE_OBJECT DeviceObject);
+
+NTSTATUS
 SubmitRequestToRootHub(
-    IN PDEVICE_OBJECT DeviceObject,
+    IN PDEVICE_OBJECT RootHubDeviceObject,
     IN ULONG IoControlCode,
     OUT PVOID OutParameter1,
     OUT PVOID OutParameter2)
@@ -32,7 +36,7 @@
     // Build Control Request
     //
     Irp = IoBuildDeviceIoControlRequest(IoControlCode,
-                                        DeviceObject,
+                                        RootHubDeviceObject,
                                         NULL, 0,
                                         NULL, 0,
                                         TRUE,
@@ -61,7 +65,7 @@
     //
     // Call RootHub
     //
-    Status = IoCallDriver(DeviceObject, Irp);
+    Status = IoCallDriver(RootHubDeviceObject, Irp);
 
     if (Status == STATUS_PENDING)
     {
@@ -73,172 +77,12 @@
     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 
+
+NTSTATUS
 GetPortStatusAndChange(
-    IN PDEVICE_OBJECT DeviceObject,
+    IN PDEVICE_OBJECT RootHubDeviceObject,
     IN ULONG PortId,
-    OUT PORT_STATUS_CHANGE *StatusChange)
+    OUT PPORT_STATUS_CHANGE StatusChange)
 {
     NTSTATUS Status;
     PURB Urb;
@@ -269,7 +113,7 @@
                           USB_REQUEST_GET_STATUS,
                           0,
                           PortId,
-                          &StatusChange,
+                          StatusChange,
                           0,
                           sizeof(PORT_STATUS_CHANGE),
                           0);
@@ -277,7 +121,7 @@
     //
     // Query the Root Hub
     //
-    Status = SubmitRequestToRootHub(DeviceObject, 
IOCTL_INTERNAL_USB_SUBMIT_URB, Urb, NULL);
+    Status = SubmitRequestToRootHub(RootHubDeviceObject, 
IOCTL_INTERNAL_USB_SUBMIT_URB, Urb, NULL);
 
     //
     // Free URB
@@ -289,9 +133,9 @@
 
 NTSTATUS
 SetPortFeature(
-    PDEVICE_OBJECT DeviceObject,
-    ULONG PortId,
-    ULONG Feature)
+    IN PDEVICE_OBJECT RootHubDeviceObject,
+    IN ULONG PortId,
+    IN ULONG Feature)
 {
     NTSTATUS Status;
     PURB Urb;
@@ -329,7 +173,7 @@
     //
     // Query the Root Hub
     //
-    Status = SubmitRequestToRootHub(DeviceObject, 
IOCTL_INTERNAL_USB_SUBMIT_URB, Urb, NULL);
+    Status = SubmitRequestToRootHub(RootHubDeviceObject, 
IOCTL_INTERNAL_USB_SUBMIT_URB, Urb, NULL);
 
     //
     // Free URB
@@ -341,9 +185,9 @@
 
 NTSTATUS
 ClearPortFeature(
-    PDEVICE_OBJECT DeviceObject,
-    ULONG PortId,
-    ULONG Feature)
+    IN PDEVICE_OBJECT RootHubDeviceObject,
+    IN ULONG PortId,
+    IN ULONG Feature)
 {
     NTSTATUS Status;
     PURB Urb;
@@ -381,7 +225,7 @@
     //
     // Query the Root Hub
     //
-    Status = SubmitRequestToRootHub(DeviceObject, 
IOCTL_INTERNAL_USB_SUBMIT_URB, Urb, NULL);
+    Status = SubmitRequestToRootHub(RootHubDeviceObject, 
IOCTL_INTERNAL_USB_SUBMIT_URB, Urb, NULL);
 
     //
     // Free URB
@@ -391,14 +235,273 @@
     return Status;
 }
 
+VOID NTAPI
+DeviceStatusChangeThread(
+    IN PVOID Context)
+{
+    NTSTATUS Status;
+    PDEVICE_OBJECT DeviceObject;
+    PHUB_DEVICE_EXTENSION HubDeviceExtension;
+    PWORK_ITEM_DATA WorkItemData;
+    PORT_STATUS_CHANGE PortStatus;
+    LONG PortId, i;
+
+    WorkItemData = (PWORK_ITEM_DATA)Context;
+    DeviceObject = (PDEVICE_OBJECT)WorkItemData->Context;
+    HubDeviceExtension = (PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+    //
+    // Itterate all ports
+    //
+    for (PortId = 1; PortId <= 
HubDeviceExtension->UsbExtHubInfo.NumberOfPorts; PortId++)
+    {
+        PortStatus.Change = 0;
+        PortStatus.Status = 0;
+        //
+        // Get Port Status
+        //
+        Status = 
GetPortStatusAndChange(HubDeviceExtension->RootHubPhysicalDeviceObject, PortId, 
&PortStatus);
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("Failed to get port status for port %d, Status %x\n", 
PortId, Status);
+            // FIXME: Do we really want to halt further SCE requests?
+            return;
+        }
+
+        //
+        // Check for new device connection
+        //
+        if (PortStatus.Change == USB_PORT_STATUS_CONNECT)
+        {
+            //
+            // Clear Connection Status
+            //
+            Status = 
ClearPortFeature(HubDeviceExtension->RootHubPhysicalDeviceObject, PortId, 
C_PORT_CONNECTION);
+            if (!NT_SUCCESS(Status))
+            {
+                DPRINT1("Failed to clear connection change for port %d\n", 
PortId);
+                // FIXME: Do we really want to halt further SCE requests?
+                return;
+            }
+
+            //
+            // Get Port Status and ensure it updated
+            //
+            Status = 
GetPortStatusAndChange(HubDeviceExtension->RootHubPhysicalDeviceObject, PortId, 
&PortStatus);
+            if (!NT_SUCCESS(Status))
+            {
+                DPRINT1("Failed to get port status for port %d, Status %x\n", 
PortId, Status);
+                // FIXME: Do we really want to halt further SCE requests?
+                return;
+            }
+
+            if (PortStatus.Change != 0)
+            {
+                DPRINT1("Port %d did not clear Connection Change!\n");
+                // FIXME: Do we really want to halt further SCE requests?
+                return;
+            }
+
+            //
+            // FIXME: Create the device object and enable the port
+            //
+            //CreateUsbChildDeviceObject
+        }
+    }
+
+    //
+    // Send another SCE Request
+    //
+    QueryStatusChangeEndpoint(DeviceObject);
+
+    ExFreePool(WorkItemData);
+}
+
+NTSTATUS
+StatusChangeEndpointCompletion(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp,
+    IN PVOID Context)
+{
+    PDEVICE_OBJECT RealDeviceObject;
+    PHUB_DEVICE_EXTENSION HubDeviceExtension;
+    PWORK_ITEM_DATA WorkItemData;
+    LONG i;
+
+    RealDeviceObject = (PDEVICE_OBJECT)Context;
+    HubDeviceExtension = 
(PHUB_DEVICE_EXTENSION)RealDeviceObject->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);
+    }
+
+    //
+    // Free the Irp and return more processing required so the IO Manger 
doesn’t try to free it
+    //
+    IoFreeIrp(Irp);
+
+    //
+    // Create and initialize work item data
+    //
+    WorkItemData = ExAllocatePoolWithTag(NonPagedPool, sizeof(WORK_ITEM_DATA), 
USB_HUB_TAG);
+    if (!WorkItemData)
+    {
+        DPRINT1("Failed to allocate memory!n");
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    WorkItemData->Context = RealDeviceObject;
+    ExInitializeWorkItem(&WorkItemData->WorkItem, 
(PWORKER_THREAD_ROUTINE)DeviceStatusChangeThread, (PVOID)WorkItemData);
+
+    //
+    // Queue the work item to handle initializing the device
+    //
+    ExQueueWorkItem(&WorkItemData->WorkItem, DelayedWorkQueue);
+
+    return STATUS_MORE_PROCESSING_REQUIRED;
+}
+
+NTSTATUS
+QueryStatusChangeEndpoint(
+    IN PDEVICE_OBJECT DeviceObject)
+{
+    NTSTATUS Status;
+    PIO_STACK_LOCATION Stack;
+    PHUB_DEVICE_EXTENSION HubDeviceExtension;
+
+    HubDeviceExtension = (PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+    //
+    // Initialize 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);
+
+    //
+    // Send to RootHub
+    //
+    Status = IoCallDriver(HubDeviceExtension->RootHubPhysicalDeviceObject, 
HubDeviceExtension->PendingSCEIrp);
+
+    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
 GetUsbDeviceDescriptor(
-    PDEVICE_OBJECT ChildDeviceObject,
-    UCHAR DescriptorType,
-    UCHAR Index,
-    USHORT LangId,
-    PVOID TransferBuffer,
-    ULONG TransferBufferLength)
+    IN PDEVICE_OBJECT ChildDeviceObject,
+    IN UCHAR DescriptorType,
+    IN UCHAR Index,
+    IN USHORT LangId,
+    OUT PVOID TransferBuffer,
+    IN ULONG TransferBufferLength)
 {
     NTSTATUS Status;
     PURB Urb;
@@ -508,7 +611,6 @@
     ULONG NeededSize;
 
     HubDeviceExtension = (PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-    DPRINT1("Query Bus Relations\n");
 
     //
     // Count the number of children
@@ -554,8 +656,9 @@
     *pDeviceRelations = DeviceRelations;
 
     //
-    // FIXME: Send the first SCE Request
-    //
+    // Send the first SCE Request
+    //
+    QueryStatusChangeEndpoint(DeviceObject);
 
     return STATUS_SUCCESS;
 }
@@ -582,7 +685,6 @@
             ULONG Result = 0;
             PUSB_INTERFACE_DESCRIPTOR Pid;
             ULONG PortId;
-
             USBD_INTERFACE_LIST_ENTRY InterfaceList[2] = {{NULL, NULL}, {NULL, 
NULL}};
             PURB ConfigUrb = NULL;
 
@@ -629,7 +731,7 @@
             //
             // Get the Hub Interface
             //
-            Status = 
QueryInterface(HubDeviceExtension->RootHubPhysicalDeviceObject, 
+            Status = 
QueryInterface(HubDeviceExtension->RootHubPhysicalDeviceObject,
                                     USB_BUS_INTERFACE_HUB_GUID,
                                     sizeof(USB_BUS_INTERFACE_HUB_V5),
                                     5,
@@ -678,7 +780,6 @@
                                                                              
&HubDeviceExtension->DeviceInformation,
                                                                              
sizeof(USB_DEVICE_INFORMATION_0),
                                                                              
&Result);
-
 
             DPRINT1("Status %x, Result 0x%08lx\n", Status, Result);
             DPRINT1("InformationLevel %x\n", 
HubDeviceExtension->DeviceInformation.InformationLevel);
@@ -687,7 +788,6 @@
             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
@@ -746,10 +846,10 @@
             
DumpConfigurationDescriptor(&HubDeviceExtension->HubConfigDescriptor);
 
             Status = 
HubDeviceExtension->HubInterface.GetExtendedHubInformation(HubDeviceExtension->RootHubPhysicalDeviceObject,
-                                                                    
HubDeviceExtension->RootHubPhysicalDeviceObject,
-                                                                    
&HubDeviceExtension->UsbExtHubInfo,
-                                                                    
sizeof(USB_EXTHUB_INFORMATION_0),
-                                                                    &Result);
+                                                                               
 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");
@@ -764,7 +864,7 @@
             UsbBuildVendorRequest(Urb,
                                   URB_FUNCTION_CLASS_DEVICE,
                                   sizeof(Urb->UrbControlVendorClassRequest),
-                                  USBD_TRANSFER_DIRECTION_IN,
+                                  USBD_TRANSFER_DIRECTION_IN | 
USBD_SHORT_TRANSFER_OK,
                                   0,
                                   USB_DEVICE_CLASS_RESERVED,
                                   0,
@@ -781,6 +881,9 @@
                                             Urb,
                                             NULL);
 
+            //
+            // FIXME: This is returning nothing.
+            //
             DPRINT1("bDescriptorType %x\n", 
HubDeviceExtension->HubDescriptor.bDescriptorType);
 
             if (!NT_SUCCESS(Status))
@@ -794,16 +897,25 @@
             // Allocate memory for PortStatusChange to hold 2 USHORTs for each 
port on hub
             //
             HubDeviceExtension->PortStatusChange = 
ExAllocatePoolWithTag(NonPagedPool,
-                                                                         
sizeof(ULONG) * HubDeviceExtension->HubDescriptor.bNumberOfPorts,
+                                                                         
sizeof(ULONG) * HubDeviceExtension->UsbExtHubInfo.NumberOfPorts,
                                                                          
USB_HUB_TAG);
+
+            //
+            // Initialize the Hub
+            //
+            Status = 
HubDeviceExtension->HubInterface.Initialize20Hub(HubDeviceExtension->RootHubPhysicalDeviceObject,
+                                                                      
HubDeviceExtension->RootHubHandle, 1);
+            DPRINT1("Status %x\n", Status);
 
             //
             // Get the first Configuration Descriptor
             //
             Pid = 
USBD_ParseConfigurationDescriptorEx(&HubDeviceExtension->HubConfigDescriptor,
                                                       
&HubDeviceExtension->HubConfigDescriptor,
-                                                      -1, -1, -1, -1, -1);
+                                                     -1, -1, -1, -1, -1);
+
             ASSERT(Pid != NULL);
+
             InterfaceList[0].InterfaceDescriptor = Pid;
             ConfigUrb = 
USBD_CreateConfigurationRequestEx(&HubDeviceExtension->HubConfigDescriptor,
                                                           
(PUSBD_INTERFACE_LIST_ENTRY)&InterfaceList);
@@ -821,19 +933,15 @@
             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);
-            }
+            for (PortId = 1; PortId <= 
HubDeviceExtension->HubDescriptor.bNumberOfPorts; PortId++)
+            {
+                Status = 
SetPortFeature(HubDeviceExtension->RootHubPhysicalDeviceObject, PortId, 
PORT_POWER);
+                if (!NT_SUCCESS(Status))
+                    DPRINT1("Failed to power on port %d\n", PortId);
+            }
+
             ExFreePool(Urb);
             break;
         }
@@ -859,7 +967,7 @@
                 }
                 default:
                     DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / 
Unknown type 0x%lx\n",
-                        Stack->Parameters.QueryDeviceRelations.Type);
+                            Stack->Parameters.QueryDeviceRelations.Type);
                     return ForwardIrpAndForget(DeviceObject, Irp);
             }
             break;
@@ -885,6 +993,7 @@
             return ForwardIrpAndForget(DeviceObject, Irp);
         }
     }
+
     Irp->IoStatus.Information = Information;
     Irp->IoStatus.Status = Status;
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
@@ -893,8 +1002,8 @@
 
 NTSTATUS
 USBHUB_FdoHandleDeviceControl(
-    PDEVICE_OBJECT DeviceObject,
-    PIRP Irp)
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
 {
     DPRINT1("FdoHandleDeviceControl\n");
     UNIMPLEMENTED

Modified: branches/usb-bringup/drivers/usb/usbhub_new/usbhub.h
URL: 
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbhub_new/usbhub.h?rev=51576&r1=51575&r2=51576&view=diff
==============================================================================
--- branches/usb-bringup/drivers/usb/usbhub_new/usbhub.h [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbhub_new/usbhub.h [iso-8859-1] Wed May  
4 12:58:42 2011
@@ -36,6 +36,12 @@
     USHORT Status;
     USHORT Change;
 } PORT_STATUS_CHANGE, *PPORT_STATUS_CHANGE;
+
+typedef struct _WORK_ITEM_DATA
+{
+    WORK_QUEUE_ITEM WorkItem;
+    PVOID Context;
+} WORK_ITEM_DATA, *PWORK_ITEM_DATA;
 
 typedef struct
 {


Reply via email to