[USB-BRINGUP]
[reactos.git] / drivers / usb / usbhub_new / fdo.c
index 1ccaa5a..c4a631d 100644 (file)
@@ -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
@@ -254,9 +254,11 @@ DeviceStatusChangeThread(
     PWORK_ITEM_DATA WorkItemData;
     PORT_STATUS_CHANGE PortStatus;
     LONG PortId;
-    DPRINT1("Entered DeviceStatusChangeThread, Context %x\n", Context);
+
     static LONG failsafe = 0;
 
+    DPRINT1("Entered DeviceStatusChangeThread, Context %x\n", Context);
+
     WorkItemData = (PWORK_ITEM_DATA)Context;
     DeviceObject = (PDEVICE_OBJECT)WorkItemData->Context;
     HubDeviceExtension = (PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
@@ -952,6 +954,28 @@ CreateDeviceIds(
         UsbChildExtension->usInstanceId.MaximumLength = UsbChildExtension->usInstanceId.Length;
         DPRINT1("Usb InstanceId %wZ\n", &UsbChildExtension->usInstanceId);
     }
+    else
+    {
+       //
+       // the device did not provide a serial number, lets create a pseudo instance id
+       //
+       Index = swprintf(BufferPtr, L"USB\\Vid_%04x&Pid_%04x&1A0700BC\0", UsbChildExtension->DeviceDesc.idVendor, UsbChildExtension->DeviceDesc.idProduct) + 1;
+       UsbChildExtension->usInstanceId.Buffer = (LPWSTR)ExAllocatePool(NonPagedPool, Index * sizeof(WCHAR));
+       if (UsbChildExtension->usInstanceId.Buffer == NULL)
+       {
+           DPRINT1("Error: failed to allocate %lu bytes\n", Index * sizeof(WCHAR));
+           goto Cleanup;
+       }
+
+       //
+       // copy instance id
+       //
+       RtlCopyMemory(UsbChildExtension->usInstanceId.Buffer, BufferPtr, wcslen(BufferPtr) * sizeof(WCHAR));
+       UsbChildExtension->usInstanceId.Length = UsbChildExtension->usDeviceId.MaximumLength = Index * sizeof(WCHAR);
+
+       DPRINT1("usDeviceId %wZ\n", &UsbChildExtension->usInstanceId);
+    }
+
 
     return Status;
 
@@ -1557,11 +1581,28 @@ USBHUB_FdoHandlePnp(
             DPRINT1("Configuration Handle %x\n", HubDeviceExtension->ConfigurationHandle);
 
             //
-            // Initialize the Hub
+            // check if function is available
             //
-            Status = HubDeviceExtension->HubInterface.Initialize20Hub(HubInterfaceBusContext,
-                                                                      HubDeviceExtension->RootHubHandle, 1);
-            DPRINT1("Status %x\n", Status);
+            if (HubDeviceExtension->UsbDInterface.IsDeviceHighSpeed)
+            {
+                //
+                // is it high speed bus
+                //
+                if (HubDeviceExtension->UsbDInterface.IsDeviceHighSpeed(HubInterfaceBusContext))
+                {
+                    //
+                    // initialize usb 2.0 hub
+                    //
+                    Status = HubDeviceExtension->HubInterface.Initialize20Hub(HubInterfaceBusContext,
+                                                                              HubDeviceExtension->RootHubHandle, 1);
+                    DPRINT1("Status %x\n", Status);
+
+                    //
+                    // FIXME handle error
+                    //
+                    ASSERT(Status == STATUS_SUCCESS);
+                }
+            }
 
             ExFreePool(ConfigUrb);
 
@@ -1583,8 +1624,9 @@ USBHUB_FdoHandlePnp(
             }
 
             DPRINT1("RootHubInitNotification %x\n", HubDeviceExtension->HubInterface.RootHubInitNotification);
+
             //
-            //
+            // init roo hub notification
             //
             if (HubDeviceExtension->HubInterface.RootHubInitNotification)
             {