Author: janderwald
Date: Thu Mar  1 14:16:33 2012
New Revision: 55942

URL: http://svn.reactos.org/svn/reactos?rev=55942&view=rev
Log:
[USBLIB]
- Split retrieving the full configuration descriptor into 2 steps
- Fixes errors while initializing usb devices on UHCI controller
- Tested in VmWare / VBox and real hardware

Modified:
    trunk/reactos/drivers/usb/usbuhci/usb_request.cpp
    trunk/reactos/lib/drivers/libusb/usb_device.cpp

Modified: trunk/reactos/drivers/usb/usbuhci/usb_request.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbuhci/usb_request.cpp?rev=55942&r1=55941&r2=55942&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/usbuhci/usb_request.cpp [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbuhci/usb_request.cpp [iso-8859-1] Thu Mar  1 
14:16:33 2012
@@ -1111,7 +1111,7 @@
         //
         // failed to allocate descriptor
         //
-        DPRINT1("[UHCI] Failed to create setup descriptor\n");
+        DPRINT1("[UHCI] Failed to create status descriptor\n");
         FreeDescriptor(SetupDescriptor);
         m_DmaManager->Release(QueueHead, sizeof(UHCI_QUEUE_HEAD));
         return Status;

Modified: trunk/reactos/lib/drivers/libusb/usb_device.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/libusb/usb_device.cpp?rev=55942&r1=55941&r2=55942&view=diff
==============================================================================
--- trunk/reactos/lib/drivers/libusb/usb_device.cpp [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/libusb/usb_device.cpp [iso-8859-1] Thu Mar  1 
14:16:33 2012
@@ -63,6 +63,7 @@
     virtual NTSTATUS CreateDeviceDescriptor();
     virtual VOID DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
     virtual VOID DumpConfigurationDescriptor(PUSB_CONFIGURATION_DESCRIPTOR 
ConfigurationDescriptor);
+    virtual NTSTATUS GetConfigurationDescriptor(UCHAR ConfigurationIndex, 
USHORT BufferSize, PVOID Buffer);
 
     // constructor / destructor
     CUSBDevice(IUnknown *OuterUnknown){}
@@ -370,6 +371,7 @@
         if (!NT_SUCCESS(Status))
         {
             DPRINT1("CUSBDevice::SetDeviceAddress> failed to retrieve 
configuration %lu\n", Index);
+            ASSERT(FALSE);
             break;
         }
     }
@@ -651,31 +653,33 @@
 
 
//----------------------------------------------------------------------------------------
 NTSTATUS
-CUSBDevice::CreateConfigurationDescriptor(
-    UCHAR Index)
-{
-    PVOID Buffer;
+CUSBDevice::GetConfigurationDescriptor(
+    IN UCHAR ConfigurationIndex, 
+    IN USHORT BufferSize,
+    IN PVOID Buffer)
+{
     USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup;
     NTSTATUS Status;
     PMDL Mdl;
-    PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
-
-    //
-    // sanity checks
-    //
-    PC_ASSERT(m_ConfigurationDescriptors);
-
-    //
-    // first allocate a buffer which should be enough to store all different 
interfaces and endpoints
-    //
-    Buffer = ExAllocatePoolWithTag(NonPagedPool, PAGE_SIZE, TAG_USBLIB);
-    if (!Buffer)
-    {
-        //
-        // failed to allocate buffer
+
+
+    //
+    // now build MDL describing the buffer
+    //
+    Mdl = IoAllocateMdl(Buffer, BufferSize, FALSE, FALSE, 0);
+    if (!Mdl)
+    {
+        //
+        // failed to allocate mdl
         //
         return STATUS_INSUFFICIENT_RESOURCES;
     }
+
+    //
+    // build mdl for non paged pool
+    //
+    MmBuildMdlForNonPagedPool(Mdl);
+
 
     //
     // build setup packet
@@ -685,52 +689,79 @@
     CtrlSetup.bmRequestType._BM.Reserved = 0;
     CtrlSetup.bmRequestType._BM.Dir = BMREQUEST_DEVICE_TO_HOST;
     CtrlSetup.bRequest = USB_REQUEST_GET_DESCRIPTOR;
-    CtrlSetup.wValue.LowByte = Index;
+    CtrlSetup.wValue.LowByte = ConfigurationIndex;
     CtrlSetup.wValue.HiByte = USB_CONFIGURATION_DESCRIPTOR_TYPE;
     CtrlSetup.wIndex.W = 0;
-    CtrlSetup.wLength = PAGE_SIZE;
-
-    //
-    // now build MDL describing the buffer
-    //
-    Mdl = IoAllocateMdl(Buffer, PAGE_SIZE, FALSE, FALSE, 0);
-    if (!Mdl)
-    {
-        //
-        // failed to allocate mdl
-        //
-        ExFreePoolWithTag(Buffer, TAG_USBLIB);
+    CtrlSetup.wLength = BufferSize;
+
+    //
+    // commit packet
+    //
+    Status = CommitSetupPacket(&CtrlSetup, 0, BufferSize, Mdl);
+
+    //
+    // free mdl
+    //
+    IoFreeMdl(Mdl);
+
+    //
+    // done
+    //
+    return Status;
+}
+
+//----------------------------------------------------------------------------------------
+NTSTATUS
+CUSBDevice::CreateConfigurationDescriptor(
+    UCHAR Index)
+{
+    NTSTATUS Status;
+    PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
+
+    //
+    // sanity checks
+    //
+    PC_ASSERT(m_ConfigurationDescriptors);
+
+    //
+    // first allocate a buffer which should be enough to store all different 
interfaces and endpoints
+    //
+    ConfigurationDescriptor = 
(PUSB_CONFIGURATION_DESCRIPTOR)ExAllocatePoolWithTag(NonPagedPool, PAGE_SIZE, 
TAG_USBLIB);
+    if (!ConfigurationDescriptor)
+    {
+        //
+        // failed to allocate buffer
+        //
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
     //
-    // build mdl for non paged pool
-    //
-    MmBuildMdlForNonPagedPool(Mdl);
-
-    //
-    // commit packet
-    //
-    Status = CommitSetupPacket(&CtrlSetup, 0, PAGE_SIZE, Mdl);
+    // get partial configuration descriptor
+    //
+    Status = GetConfigurationDescriptor(Index, 
sizeof(USB_CONFIGURATION_DESCRIPTOR), ConfigurationDescriptor);
     if (!NT_SUCCESS(Status))
     {
         //
-        // failed to issue request, cleanup
-        //
-        IoFreeMdl(Mdl);
-        ExFreePool(Buffer);
-        return Status;
-    }
-
-    //
-    // now free the mdl
-    //
-    IoFreeMdl(Mdl);
-
-    //
-    // get configuration descriptor
-    //
-    ConfigurationDescriptor = (PUSB_CONFIGURATION_DESCRIPTOR)Buffer;
+        // failed to get partial configuration descriptor
+        //
+        DPRINT1("[USBLIB] Failed to get partial configuration descriptor 
Status %x Index %x\n", Status, Index);
+        ExFreePoolWithTag(ConfigurationDescriptor, TAG_USBLIB);
+        return Status;
+    }
+
+    //
+    // now get full descriptor
+    //
+    Status = GetConfigurationDescriptor(Index, 
ConfigurationDescriptor->wTotalLength, ConfigurationDescriptor);
+    if (!NT_SUCCESS(Status))
+    {
+        //
+        // failed to get full configuration descriptor
+        //
+        DPRINT1("[USBLIB] Failed to get full configuration descriptor Status 
%x Index %x\n", Status, Index);
+        ExFreePoolWithTag(ConfigurationDescriptor, TAG_USBLIB);
+        return Status;
+    }
 
     //
     // informal debug print


Reply via email to