[ros-diffs] [mjmartin] 45554: [usb/usbehci] - Remove WorkItem code as its not needed. UsbHub driver polls the hubs for device connects. - Register USB Host Controller Device Interface during AddDevice.- Implement more URB's USB_DEVICE_DESCRIPTOR_TYPE, USB_CONFIGURATION_DESCRIPTOR_TYPE, URB_FUNCTION_SELECT_CONFIGURATION, URB_FUNCTION_CLASS_DEVICE/USB_DEVICE_CLASS_HUB. - Implement returning generic UsbdDeviceHandle in URB struct.

mjmartin at svn.reactos.org mjmartin at svn.reactos.org
Wed Feb 10 13:38:18 CET 2010


Author: mjmartin
Date: Wed Feb 10 13:38:18 2010
New Revision: 45554

URL: http://svn.reactos.org/svn/reactos?rev=45554&view=rev
Log:
[usb/usbehci]
- Remove WorkItem code as its not needed. UsbHub driver polls the hubs for device connects.
- Register USB Host Controller Device Interface during AddDevice.- Implement more URB's USB_DEVICE_DESCRIPTOR_TYPE, USB_CONFIGURATION_DESCRIPTOR_TYPE, URB_FUNCTION_SELECT_CONFIGURATION, URB_FUNCTION_CLASS_DEVICE/USB_DEVICE_CLASS_HUB.
- Implement returning generic UsbdDeviceHandle in URB struct.

Modified:
    trunk/reactos/drivers/usb/usbehci/fdo.c
    trunk/reactos/drivers/usb/usbehci/irp.c
    trunk/reactos/drivers/usb/usbehci/urbreq.c

Modified: trunk/reactos/drivers/usb/usbehci/fdo.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbehci/fdo.c?rev=45554&r1=45553&r2=45554&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/usbehci/fdo.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbehci/fdo.c [iso-8859-1] Wed Feb 10 13:38:18 2010
@@ -10,15 +10,18 @@
 /* INCLUDES *******************************************************************/
 #include "usbehci.h"
 #include <stdio.h>
+
 //#include "ntstrsafe.h"
 
 VOID NTAPI
 EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)
 {
     PFDO_DEVICE_EXTENSION FdoDeviceExtension;
+    PPDO_DEVICE_EXTENSION PdoDeviceExtension;
     ULONG CStatus;
 
     FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) DeferredContext;
+    PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) FdoDeviceExtension->Pdo->DeviceExtension;
 
     CStatus = (ULONG) SystemArgument2;
 
@@ -39,8 +42,6 @@
             /* Check for port change on this port */
             if (tmp & 0x02)
             {
-                PWORKITEM_DATA WorkItemData = NULL;
-
                 /* Connect or Disconnect? */
                 if (tmp & 0x01)
                 {
@@ -81,31 +82,9 @@
                     tmp = READ_REGISTER_ULONG((PULONG)((Base + EHCI_PORTSC) + (4 * i)));
 
                     DPRINT("port tmp %x\n", tmp);
-                    GetDeviceDescriptor(FdoDeviceExtension, 0);
-                    FdoDeviceExtension->ChildDeviceCount++;
-                    CompletePendingRequest(FdoDeviceExtension);
-
-                    WorkItemData = ExAllocatePool(NonPagedPool, sizeof(WORKITEM_DATA));
-                    if (!WorkItemData)
-                    {
-                        DPRINT1("No memory\n");
-                        break;
-                    }
-
-                    WorkItemData->IoWorkItem = IoAllocateWorkItem(FdoDeviceExtension->Pdo);
-                    if (!WorkItemData->IoWorkItem)
-                    {
-                        DPRINT1("WorkItem allocation failed!\n");
-                        break;
-                    }
-
-
-                    WorkItemData->FdoDeviceExtension = FdoDeviceExtension;
-                    
-                    IoQueueWorkItem(WorkItemData->IoWorkItem,
-                                    (PIO_WORKITEM_ROUTINE)DeviceArrivalWorkItem,
-                                    DelayedWorkQueue,
-                                    WorkItemData);
+                    GetDeviceDescriptor(FdoDeviceExtension, 0, 0, FALSE);
+                    PdoDeviceExtension->ChildDeviceCount++;
+                    //CompletePendingURBRequest(PdoDeviceExtension);
                 }
                 else
                 {
@@ -116,7 +95,6 @@
                     tmp |= 0x02;
                     WRITE_REGISTER_ULONG((PULONG) ((Base + EHCI_PORTSC) + (4 * i)), tmp);
                 }
-
             }
         }
     }
@@ -180,7 +158,6 @@
 BOOLEAN
 ResetPort(PDEVICE_OBJECT DeviceObject)
 {
-
     /*FIXME: Implement me */
 
     return TRUE;
@@ -310,8 +287,6 @@
                       EHCI_USBINTR_INTE | EHCI_USBINTR_ERR | EHCI_USBINTR_ASYNC | EHCI_USBINTR_HSERR
                       | EHCI_USBINTR_FLROVR  | EHCI_USBINTR_PC);
 
-    //UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp;
-
     UsbCmd->Run = 1;
     WRITE_REGISTER_ULONG((PULONG)(base + EHCI_USBCMD), tmp);
 
@@ -351,13 +326,11 @@
     PCap->HCSParamsLong = READ_REGISTER_ULONG((PULONG)(Base + 4));
     PCap->HCCParams = READ_REGISTER_ULONG((PULONG)(Base + 8));
 
-
     DPRINT("Length %d\n", PCap->Length);
     DPRINT("Reserved %d\n", PCap->Reserved);
     DPRINT("HCIVersion %x\n", PCap->HCIVersion);
     DPRINT("HCSParams %x\n", PCap->HCSParamsLong);
     DPRINT("HCCParams %x\n", PCap->HCCParams);
-
 
     if (PCap->HCCParams & 0x02)
         DPRINT1("Frame list size is configurable\n");
@@ -412,8 +385,8 @@
     DeviceDescription.MaximumLength = EHCI_MAX_SIZE_TRANSFER;
 
     FdoDeviceExtension->pDmaAdapter = IoGetDmaAdapter(FdoDeviceExtension->LowerDevice,
-                                                    &DeviceDescription,
-                                                    &FdoDeviceExtension->MapRegisters);
+                                                      &DeviceDescription,
+                                                      &FdoDeviceExtension->MapRegisters);
 
     if (FdoDeviceExtension->pDmaAdapter == NULL)
     {
@@ -561,14 +534,16 @@
     NTSTATUS Status;
     ULONG UsbDeviceNumber = 0;
     WCHAR CharDeviceName[64];
+
     UNICODE_STRING DeviceName;
 
     DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-    /* Create the PDO */
+
+    /* Create the PDO with the next available number */
     while (TRUE)
     {
-        /* FIXME: Use safe string sprintf*/
-        /* RtlStringCchPrintfW(CharDeviceName, 64, L"USBFDO-%d", UsbDeviceNumber); */
+        /* FIXME: Use safe string */
+        /* RtlStringCchPrintfW(CharDeviceName, 64, L"USBPDO-%d", UsbDeviceNumber); */
         swprintf(CharDeviceName, L"\\Device\\USBPDO-%d", UsbDeviceNumber);
         RtlInitUnicodeString(&DeviceName, CharDeviceName);
         DPRINT("DeviceName %wZ\n", &DeviceName);
@@ -604,20 +579,17 @@
     PdoDeviceExtension->Common.IsFdo = FALSE;
 
     PdoDeviceExtension->ControllerFdo = DeviceObject;
+    PdoDeviceExtension->DeviceObject = Pdo;
+
+    InitializeListHead(&PdoDeviceExtension->IrpQueue);
+    KeInitializeSpinLock(&PdoDeviceExtension->IrpQueueLock);
 
     Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
+
     DeviceExtension->Pdo = Pdo;
 
-    /*swprintf(CharSymLinkName, L"\\Device\\HCD%d", UsbDeviceNumber);
-    RtlInitUnicodeString(&SymLinkName, CharSymLinkName);
-    Status = IoCreateSymbolicLink(&SymLinkName, &DeviceName);
-
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("Warning: Unable to create symbolic link for ehci usb device!\n");
-    }*/
-
     DeviceRelations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS));
+
     if (!DeviceRelations)
     {
         return STATUS_INSUFFICIENT_RESOURCES;
@@ -646,7 +618,7 @@
     {
         case IRP_MN_START_DEVICE:
         {
-            DPRINT("START_DEVICE\n");
+            DPRINT1("START_DEVICE\n");
             Irp->IoStatus.Status = STATUS_SUCCESS;
             Status = ForwardAndWait(DeviceObject, Irp);
 
@@ -657,7 +629,7 @@
         }
         case IRP_MN_QUERY_DEVICE_RELATIONS:
         {
-            DPRINT("IRP_MN_QUERY_DEVICE_RELATIONS\n");
+            DPRINT1("IRP_MN_QUERY_DEVICE_RELATIONS\n");
             switch(Stack->Parameters.QueryDeviceRelations.Type)
             {
                 case BusRelations:
@@ -687,6 +659,14 @@
         {
             DPRINT("IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
         }
+        case IRP_MN_QUERY_INTERFACE:
+        {
+            Status = STATUS_SUCCESS;
+            Information = 0;
+            Status = ForwardIrpAndForget(DeviceObject, Irp);
+            return Status;
+            break;
+        }
         default:
         {
             DPRINT1("IRP_MJ_PNP / Unhandled minor function 0x%lx\n", Stack->MinorFunction);
@@ -710,21 +690,22 @@
     WCHAR CharSymLinkName[64];
     UNICODE_STRING DeviceName;
     UNICODE_STRING SymLinkName;
+    UNICODE_STRING InterfaceSymLinkName;
     ULONG BytesRead;
     PCI_COMMON_CONFIG PciConfig;
 
     PFDO_DEVICE_EXTENSION FdoDeviceExtension;
 
-    DPRINT1("Ehci AddDevice\n");
-
-    /* Create the FDO */
+    DPRINT("Ehci AddDevice\n");
+
+    /* Create the FDO with next available number */
     while (TRUE)
     {
         /* FIXME: Use safe string sprintf*/
         /* RtlStringCchPrintfW(CharDeviceName, 64, L"USBFDO-%d", UsbDeviceNumber); */
         swprintf(CharDeviceName, L"\\Device\\USBFDO-%d", UsbDeviceNumber);
         RtlInitUnicodeString(&DeviceName, CharDeviceName);
-        DPRINT1("DeviceName %wZ\n", &DeviceName);
+        DPRINT("DeviceName %wZ\n", &DeviceName);
 
         Status = IoCreateDevice(DriverObject,
                                 sizeof(FDO_DEVICE_EXTENSION),
@@ -734,8 +715,8 @@
                                 FALSE,
                                 &Fdo);
 
-       if (NT_SUCCESS(Status))
-           break;
+        if (NT_SUCCESS(Status))
+            break;
 
         if ((Status == STATUS_OBJECT_NAME_EXISTS) || (Status == STATUS_OBJECT_NAME_COLLISION))
         {
@@ -758,21 +739,17 @@
 
     if (!NT_SUCCESS(Status))
     {
-        DPRINT1("Warning: Unable to create symbolic link for ehci usb device!\n");
-    }
-
-    DPRINT("Attaching created device %x to %x\n", Fdo, Pdo);
+        DPRINT1("Warning: Unable to create symbolic link for ehci host controller!\n");
+    }
 
     FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) Fdo->DeviceExtension;
     RtlZeroMemory(FdoDeviceExtension, sizeof(PFDO_DEVICE_EXTENSION));
 
-    InitializeListHead(&FdoDeviceExtension->IrpQueue);
-    KeInitializeSpinLock(&FdoDeviceExtension->IrpQueueLock);
-
     FdoDeviceExtension->Common.IsFdo = TRUE;
     FdoDeviceExtension->DeviceObject = Fdo;
 
     FdoDeviceExtension->LowerDevice = IoAttachDeviceToDeviceStack(Fdo, Pdo);
+
     if (FdoDeviceExtension->LowerDevice == NULL)
     {
         DPRINT1("UsbEhci: Failed to attach to device stack!\n");
@@ -782,10 +759,10 @@
         return STATUS_NO_SUCH_DEVICE;
     }
 
-    Fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
-
-    DPRINT("Attached %x!\n", FdoDeviceExtension->LowerDevice);
+    Fdo->Flags |= DO_BUFFERED_IO;// | DO_POWER_PAGABLE;
+
     ASSERT(FdoDeviceExtension->LowerDevice == Pdo);
+
     Status = GetBusInterface(FdoDeviceExtension->LowerDevice, &FdoDeviceExtension->BusInterface);
 
     if (!NT_SUCCESS(Status))
@@ -796,8 +773,6 @@
         IoDeleteDevice(Fdo);
         return Status;
     }
-
-    DPRINT("Context %x\n", FdoDeviceExtension->BusInterface.Context);
 
     BytesRead = (*FdoDeviceExtension->BusInterface.GetBusData)(
         FdoDeviceExtension->BusInterface.Context,
@@ -827,15 +802,24 @@
         DPRINT("PCI_ENABLE_BUS_MASTER\n");
 
     DPRINT("BaseAddress[0] %x\n", PciConfig.u.type0.BaseAddresses[0]);
-    DPRINT("Vendor %x\n", PciConfig.VendorID);
-    DPRINT("Device %x\n", PciConfig.DeviceID);
+    DPRINT1("Vendor %x\n", PciConfig.VendorID);
+    DPRINT1("Device %x\n", PciConfig.DeviceID);
 
     FdoDeviceExtension->VendorId = PciConfig.VendorID;
     FdoDeviceExtension->DeviceId = PciConfig.DeviceID;
 
-    DPRINT("FdoDeviceExtension->NextLowerDevice %x\n", FdoDeviceExtension->LowerDevice);
     FdoDeviceExtension->DeviceState = DEVICEINTIALIZED;
 
+    Status = IoRegisterDeviceInterface(Pdo, &GUID_DEVINTERFACE_USB_HOST_CONTROLLER, NULL, &InterfaceSymLinkName);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Unable to register device interface!\n");
+    }
+    else
+    {
+        Status = IoSetDeviceInterfaceState(&InterfaceSymLinkName, TRUE);
+        DPRINT1("SetInterfaceState %x\n", Status);
+    }
     Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
 
     return STATUS_SUCCESS;

Modified: trunk/reactos/drivers/usb/usbehci/irp.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbehci/irp.c?rev=45554&r1=45553&r2=45554&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/usbehci/irp.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbehci/irp.c [iso-8859-1] Wed Feb 10 13:38:18 2010
@@ -10,28 +10,26 @@
 #include "usbehci.h"
 
 VOID
-RequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp)
+RequestURBCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp)
 {
     PPDO_DEVICE_EXTENSION PdoDeviceExtension;
-    PFDO_DEVICE_EXTENSION FdoDeviceExtension;
 
     PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
-    FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) PdoDeviceExtension->ControllerFdo->DeviceExtension;
 
     KIRQL OldIrql = Irp->CancelIrql;
     IoReleaseCancelSpinLock(DISPATCH_LEVEL);
 
-    KeAcquireSpinLockAtDpcLevel(&FdoDeviceExtension->IrpQueueLock);
+    KeAcquireSpinLockAtDpcLevel(&PdoDeviceExtension->IrpQueueLock);
     RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
 
-    KeReleaseSpinLock(&FdoDeviceExtension->IrpQueueLock, OldIrql);
-
-   Irp->IoStatus.Status = STATUS_CANCELLED;
-   IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    KeReleaseSpinLock(&PdoDeviceExtension->IrpQueueLock, OldIrql);
+
+    Irp->IoStatus.Status = STATUS_CANCELLED;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 }
 
 VOID
-QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp)
+QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp)
 {
     KIRQL OldIrql;
 
@@ -51,10 +49,13 @@
 }
 
 VOID
-CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension)
+CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension)
 {
     PLIST_ENTRY NextIrp = NULL;
+    NTSTATUS Status = STATUS_UNSUCCESSFUL;
+    ULONG_PTR Information = 0;
     PIO_STACK_LOCATION Stack;
+    PUSB_DEVICE UsbDevice = NULL;
     KIRQL oldIrql;
     PIRP Irp = NULL;
     URB *Urb;
@@ -75,83 +76,275 @@
         Urb = (PURB) Stack->Parameters.Others.Argument1;
         ASSERT(Urb);
 
-        /* FIXME: Fill in information for Argument1/URB */
-
-        DPRINT("TransferBuffer %x\n", Urb->UrbControlDescriptorRequest.TransferBuffer);
-        DPRINT("TransferBufferLength %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength);
-        DPRINT("Index %x\n", Urb->UrbControlDescriptorRequest.Index);
-        DPRINT("DescriptorType %x\n",     Urb->UrbControlDescriptorRequest.DescriptorType);    
-        DPRINT("LanguageId %x\n", Urb->UrbControlDescriptorRequest.LanguageId);
-
-        Irp->IoStatus.Status = STATUS_SUCCESS;
-        Irp->IoStatus.Information = 0;
+        Information = 0;
+        Status = STATUS_SUCCESS;
+
+        DPRINT1("TransferBuffer %x\n", Urb->UrbControlDescriptorRequest.TransferBuffer);
+        DPRINT1("TransferBufferLength %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength);
+
+        UsbDevice = Urb->UrbHeader.UsbdDeviceHandle;
+        /* UsbdDeviceHandle of 0 is root hub */
+        if (UsbDevice == NULL)
+            UsbDevice = DeviceExtension->UsbDevices[0];
+
+        switch (Urb->UrbHeader.Function)
+        {
+            case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
+            {
+                /* We should not get here yet! */
+                ASSERT(FALSE);
+            }
+            case URB_FUNCTION_GET_STATUS_FROM_DEVICE:
+            {
+                DPRINT1("Get Status from Device\n");
+            }
+            case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
+            {
+                Urb->UrbHeader.Function = 0x08;
+                Urb->UrbHeader.UsbdFlags = 0;
+                Urb->UrbHeader.UsbdDeviceHandle = UsbDevice;
+
+                switch(Urb->UrbControlDescriptorRequest.DescriptorType)
+                {
+                    case USB_DEVICE_DESCRIPTOR_TYPE:
+                    {
+                        DPRINT1("USB DEVICE DESC\n");
+                        if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= sizeof(USB_DEVICE_DESCRIPTOR))
+                        {
+                            Urb->UrbControlDescriptorRequest.TransferBufferLength = sizeof(USB_DEVICE_DESCRIPTOR);
+                        }
+
+                        RtlCopyMemory(Urb->UrbControlDescriptorRequest.TransferBuffer,
+                                      &UsbDevice->DeviceDescriptor,
+                                      Urb->UrbControlDescriptorRequest.TransferBufferLength);
+
+                        Urb->UrbHeader.Status = USBD_STATUS_SUCCESS;
+
+                        break;
+                    }
+                    case USB_CONFIGURATION_DESCRIPTOR_TYPE:
+                    {
+                        DPRINT1("USB CONFIG DESC\n");
+                        ULONG FullDescriptorLength = sizeof(USB_CONFIGURATION_DESCRIPTOR) +
+                                                     sizeof(USB_INTERFACE_DESCRIPTOR) +
+                                                     sizeof(USB_ENDPOINT_DESCRIPTOR);
+
+                        if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= FullDescriptorLength)
+                        {
+                            Urb->UrbControlDescriptorRequest.TransferBufferLength = FullDescriptorLength;
+                        }
+
+                        RtlCopyMemory(Urb->UrbControlDescriptorRequest.TransferBuffer,
+                                      &UsbDevice->ConfigurationDescriptor,
+                                      Urb->UrbControlDescriptorRequest.TransferBufferLength);
+
+                        Urb->UrbHeader.Status = USBD_STATUS_SUCCESS;
+
+                        break;
+                    }
+                    case USB_STRING_DESCRIPTOR_TYPE:
+                    {
+                        DPRINT1("Usb String Descriptor not implemented\n");
+                    }
+                    default:
+                    {
+                        DPRINT1("Descriptor Type %x not supported!\n", Urb->UrbControlDescriptorRequest.DescriptorType);
+                    }
+                }
+            }
+            case URB_FUNCTION_SELECT_CONFIGURATION:
+            {
+                PUSBD_INTERFACE_INFORMATION InterfaceInfo;
+                LONG iCount, pCount;
+
+                DPRINT("Selecting Configuration\n");
+                DPRINT("Length %x\n", Urb->UrbHeader.Length);
+                DPRINT("Urb->UrbSelectConfiguration.ConfigurationHandle %x\n",Urb->UrbSelectConfiguration.ConfigurationHandle);
+
+                if (Urb->UrbSelectConfiguration.ConfigurationDescriptor)
+                {
+                    DPRINT("ConfigurationDescriptor = %p\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor);
+                    DPRINT(" bLength = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bLength);
+                    DPRINT(" bDescriptorType = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bDescriptorType);
+                    DPRINT(" wTotalLength = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->wTotalLength);
+                    DPRINT(" bNumInterfaces = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bNumInterfaces);
+                    DPRINT(" bConfigurationValue = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bConfigurationValue);
+                    DPRINT(" iConfiguration = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->iConfiguration);
+                    DPRINT(" bmAttributes = %04x\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bmAttributes);
+                    DPRINT(" MaxPower = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->MaxPower);
+
+
+                    Urb->UrbSelectConfiguration.ConfigurationHandle = (PVOID)&DeviceExtension->UsbDevices[0]->ConfigurationDescriptor;
+                    DPRINT("ConfigHandle %x\n", Urb->UrbSelectConfiguration.ConfigurationHandle);
+                    InterfaceInfo = &Urb->UrbSelectConfiguration.Interface;
+
+                    for (iCount = 0; iCount < Urb->UrbSelectConfiguration.ConfigurationDescriptor->bNumInterfaces; iCount++)
+                    {
+                        DPRINT("InterfaceInformation[%d]\n", iCount);
+                        DPRINT(" Length = %d\n", InterfaceInfo->Length);
+                        DPRINT(" InterfaceNumber = %d\n", InterfaceInfo->InterfaceNumber);
+                        DPRINT(" AlternateSetting = %d\n", InterfaceInfo->AlternateSetting);
+                        DPRINT(" Class = %02x\n", (ULONG)InterfaceInfo->Class);
+                        DPRINT(" SubClass = %02x\n", (ULONG)InterfaceInfo->SubClass);
+                        DPRINT(" Protocol = %02x\n", (ULONG)InterfaceInfo->Protocol);
+                        DPRINT(" Reserved = %02x\n", (ULONG)InterfaceInfo->Reserved);
+                        DPRINT(" InterfaceHandle = %p\n", InterfaceInfo->InterfaceHandle);
+                        DPRINT(" NumberOfPipes = %d\n", InterfaceInfo->NumberOfPipes);
+                        InterfaceInfo->InterfaceHandle = (PVOID)&UsbDevice->InterfaceDescriptor;
+                        InterfaceInfo->Class = UsbDevice->InterfaceDescriptor.bInterfaceClass;
+                        InterfaceInfo->SubClass = UsbDevice->InterfaceDescriptor.bInterfaceSubClass;
+                        InterfaceInfo->Protocol = UsbDevice->InterfaceDescriptor.bInterfaceProtocol;
+                        InterfaceInfo->Reserved = 0;
+
+                        for (pCount = 0; pCount < InterfaceInfo->NumberOfPipes; pCount++)
+                        {
+                          DPRINT("Pipe[%d]\n", pCount);
+                          DPRINT(" MaximumPacketSize = %d\n", InterfaceInfo->Pipes[pCount].MaximumPacketSize);
+                          DPRINT(" EndpointAddress = %d\n", InterfaceInfo->Pipes[pCount].EndpointAddress);
+                          DPRINT(" Interval = %d\n", InterfaceInfo->Pipes[pCount].Interval);
+                          DPRINT(" PipeType = %d\n", InterfaceInfo->Pipes[pCount].PipeType);
+                          DPRINT(" PipeHandle = %x\n", InterfaceInfo->Pipes[pCount].PipeHandle);
+                          DPRINT(" MaximumTransferSize = %d\n", InterfaceInfo->Pipes[pCount].MaximumTransferSize);
+                          DPRINT(" PipeFlags = %08x\n", InterfaceInfo->Pipes[pCount].PipeFlags);
+                          InterfaceInfo->Pipes[pCount].MaximumPacketSize = UsbDevice->EndPointDescriptor.wMaxPacketSize;
+                          InterfaceInfo->Pipes[pCount].EndpointAddress = UsbDevice->EndPointDescriptor.bEndpointAddress;
+                          InterfaceInfo->Pipes[pCount].Interval = UsbDevice->EndPointDescriptor.bInterval;
+                          InterfaceInfo->Pipes[pCount].PipeType = UsbdPipeTypeInterrupt;
+                          InterfaceInfo->Pipes[pCount].PipeHandle = (PVOID)&UsbDevice->EndPointDescriptor;
+                          if (InterfaceInfo->Pipes[pCount].MaximumTransferSize == 0)
+                              InterfaceInfo->Pipes[pCount].MaximumTransferSize = 4096;
+                          /* InterfaceInfo->Pipes[j].PipeFlags = 0; */
+                        }
+                        InterfaceInfo = (PUSBD_INTERFACE_INFORMATION)((PUCHAR)InterfaceInfo + InterfaceInfo->Length);
+                    }
+
+                    Urb->UrbHeader.UsbdDeviceHandle = UsbDevice;
+                    Urb->UrbHeader.UsbdFlags = 0;
+                    Urb->UrbHeader.Status = USBD_STATUS_SUCCESS;
+                }
+                else
+                {
+                    /* FIXME: Set device to unconfigured state */
+                }
+                break;
+            }
+            case URB_FUNCTION_CLASS_DEVICE:
+            {
+                switch (Urb->UrbControlVendorClassRequest.Request)
+                {
+                    case USB_REQUEST_GET_DESCRIPTOR:
+                    {
+                        DPRINT1("TransferFlags %x\n", Urb->UrbControlVendorClassRequest.TransferFlags);
+                        DPRINT1("Urb->UrbControlVendorClassRequest.Value %x\n", Urb->UrbControlVendorClassRequest.Value);
+
+
+                        switch (Urb->UrbControlVendorClassRequest.Value >> 8)
+                        {
+                            case USB_DEVICE_CLASS_AUDIO:
+                            {
+                                DPRINT1("USB_DEVICE_CLASS_AUDIO\n");
+                                break;
+                            }
+                            case USB_DEVICE_CLASS_COMMUNICATIONS:
+                            {
+                                DPRINT1("USB_DEVICE_CLASS_COMMUNICATIONS\n");
+                                break;
+                            }
+                            case USB_DEVICE_CLASS_HUMAN_INTERFACE:
+                            {
+                                DPRINT1("USB_DEVICE_CLASS_HUMAN_INTERFACE\n");
+                                break;
+                            }
+                            case USB_DEVICE_CLASS_MONITOR:
+                            {
+                                DPRINT1("USB_DEVICE_CLASS_MONITOR\n");
+                                break;
+                            }
+                            case USB_DEVICE_CLASS_PHYSICAL_INTERFACE:
+                            {
+                                DPRINT1("USB_DEVICE_CLASS_PHYSICAL_INTERFACE\n");
+                                break;
+                            }
+                            case USB_DEVICE_CLASS_POWER:
+                            {
+                                DPRINT1("USB_DEVICE_CLASS_POWER\n");
+                                break;
+                            }
+                            case USB_DEVICE_CLASS_PRINTER:
+                            {
+                                DPRINT1("USB_DEVICE_CLASS_PRINTER\n");
+                                break;
+                            }
+                            case USB_DEVICE_CLASS_STORAGE:
+                            {
+                               DPRINT1("USB_DEVICE_CLASS_STORAGE\n");
+                               break;
+                            }
+                            case USB_DEVICE_CLASS_RESERVED:
+                            case USB_DEVICE_CLASS_HUB:
+                            {
+                                PUSB_HUB_DESCRIPTOR UsbHubDescr = Urb->UrbControlVendorClassRequest.TransferBuffer;
+                                /* FIXME: Handle more than root hub? */
+                                if(Urb->UrbControlVendorClassRequest.TransferBufferLength >= sizeof(USB_HUB_DESCRIPTOR))
+                                {
+                                    Urb->UrbControlVendorClassRequest.TransferBufferLength = sizeof(USB_HUB_DESCRIPTOR);
+                                }
+                                else
+                                {
+                                    /* FIXME: Handle this correctly */
+                                    UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR);
+                                    UsbHubDescr->bDescriptorType = 0x29;
+                                    return;
+                                }
+                                DPRINT1("USB_DEVICE_CLASS_HUB request\n");
+                                UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR);
+                                UsbHubDescr->bDescriptorType = 0x29;
+                                UsbHubDescr->bNumberOfPorts = 0x08;
+                                UsbHubDescr->wHubCharacteristics = 0x0012;
+                                UsbHubDescr->bPowerOnToPowerGood = 0x01;
+                                UsbHubDescr->bHubControlCurrent = 0x00;
+                                UsbHubDescr->bRemoveAndPowerMask[0] = 0x00;
+                                UsbHubDescr->bRemoveAndPowerMask[1] = 0x00;
+                                UsbHubDescr->bRemoveAndPowerMask[2] = 0xff;
+                                break;
+                            }
+                            default:
+                            {
+                                DPRINT1("Unknown UrbControlVendorClassRequest Value\n");
+                            }
+                        }
+                        Urb->UrbHeader.Function = 0x08;
+                        Urb->UrbHeader.Status = USBD_STATUS_SUCCESS;
+                        Urb->UrbHeader.UsbdDeviceHandle = UsbDevice;
+                        Urb->UrbHeader.UsbdFlags = 0;
+                        /* Stop handling the URBs now as its not coded yet */
+                        DeviceExtension->HaltUrbHandling = TRUE;
+                        break;
+                    }
+                    default:
+                    {
+                        DPRINT1("Unhandled URB request for class device\n");
+                        Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION;
+                    }
+                }
+                break;
+            }
+            default:
+            {
+                DPRINT1("Unhandled URB %x\n", Urb->UrbHeader.Function);
+                Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION;
+            }
+
+        }
 
         KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql);
+
+        Irp->IoStatus.Status = Status;
+        Irp->IoStatus.Information = Information;
+
         IoCompleteRequest(Irp, IO_NO_INCREMENT);
         KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &oldIrql);
     }
 
     KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql);
 }
-
-NTSTATUS
-NTAPI
-ArrivalNotificationCompletion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID PContext)
-{
-    PDEVICE_OBJECT PortDeviceObject = (PDEVICE_OBJECT) PContext;
-    IoFreeIrp(Irp);
-    ObDereferenceObject(PortDeviceObject);
-    return STATUS_MORE_PROCESSING_REQUIRED;
-}
-
-VOID
-DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context)
-{
-    PWORKITEM_DATA WorkItemData;
-    PIO_STACK_LOCATION IrpStack = NULL;
-    PDEVICE_OBJECT PortDeviceObject = NULL;
-    PIRP Irp = NULL;
-
-    WorkItemData = (PWORKITEM_DATA)Context;
-
-    PortDeviceObject = IoGetAttachedDeviceReference(WorkItemData->FdoDeviceExtension->Pdo);
-
-    if (!PortDeviceObject)
-    {
-        DPRINT1("Unable to notify Pdos parent of device arrival.\n");
-        goto Cleanup;
-    }
-
-    if (PortDeviceObject == DeviceObject)
-    {
-        /* Piontless to send query relations to ourself */
-        ObDereferenceObject(PortDeviceObject);
-        goto Cleanup;
-    }
-
-    Irp = IoAllocateIrp(PortDeviceObject->StackSize, FALSE);
-
-    if (!Irp)
-    {
-        DPRINT1("Unable to allocate IRP\n");
-    }
-
-    IoSetCompletionRoutine(Irp,
-                           (PIO_COMPLETION_ROUTINE)ArrivalNotificationCompletion,
-                           (PVOID) PortDeviceObject,
-                           TRUE,
-                           TRUE,
-                           TRUE);
-
-    IrpStack = IoGetNextIrpStackLocation(Irp);
-    IrpStack->Parameters.QueryDeviceRelations.Type = TargetDeviceRelation;
-    IrpStack->MajorFunction = IRP_MJ_PNP;
-    IrpStack->MinorFunction = IRP_MN_QUERY_DEVICE_RELATIONS;
-
-    IoCallDriver(PortDeviceObject, Irp);
-
-Cleanup:
-    IoFreeWorkItem(WorkItemData->IoWorkItem);
-    ExFreePool(WorkItemData);
-}
-

Modified: trunk/reactos/drivers/usb/usbehci/urbreq.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbehci/urbreq.c?rev=45554&r1=45553&r2=45554&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/usbehci/urbreq.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbehci/urbreq.c [iso-8859-1] Wed Feb 10 13:38:18 2010
@@ -68,7 +68,7 @@
 
     /* Must be Page aligned */
     *CtrlSetup = (PEHCI_SETUP_FORMAT) (( (ULONG)(*CtrlTD3) + sizeof(QUEUE_TRANSFER_DESCRIPTOR) + 0xFFF)  & ~0xFFF);
-    *CtrlData = (PSTANDARD_DEVICE_DESC) (( (ULONG)(*CtrlSetup) + sizeof(EHCI_SETUP_FORMAT) + 0xFFF)  & ~0xFFF);
+    *CtrlData = (PUSB_DEVICE_DESCRIPTOR) (( (ULONG)(*CtrlSetup) + sizeof(EHCI_SETUP_FORMAT) + 0xFFF)  & ~0xFFF);
 
     (*CtrlTD1)->NextPointer = TERMINATE_POINTER;
     (*CtrlTD1)->AlternateNextPointer = TERMINATE_POINTER;
@@ -105,10 +105,10 @@
 }
 
 BOOLEAN
-GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index)
+GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index, PUSB_DEVICE_DESCRIPTOR OutBuffer, BOOLEAN Hub)
 {
     PEHCI_SETUP_FORMAT CtrlSetup = NULL;
-    PSTANDARD_DEVICE_DESC CtrlData = NULL;
+    PUSB_DEVICE_DESCRIPTOR CtrlData = NULL;
     PQUEUE_TRANSFER_DESCRIPTOR CtrlTD1 = NULL;
     PQUEUE_TRANSFER_DESCRIPTOR CtrlTD2 = NULL;
     PQUEUE_TRANSFER_DESCRIPTOR CtrlTD3 = NULL;
@@ -129,14 +129,22 @@
                                          &CtrlTD3,
                                          &CtrlSetup,
                                          (PVOID)&CtrlData,
-                                         sizeof(STANDARD_DEVICE_DESC));
+                                         sizeof(USB_DEVICE_DESCRIPTOR));
 
     /* FIXME: Use defines and handle other than Device Desciptors */
-    CtrlSetup->bmRequestType = 0x80;
+    if (Hub)
+    {
+        CtrlSetup->bmRequestType = 0x80;
+        CtrlSetup->wValue = 0x0600;
+    }
+    else
+    {
+        CtrlSetup->bmRequestType = 0x80;
+        CtrlSetup->wValue = 0x0100;
+    }
     CtrlSetup->bRequest = 0x06;
-    CtrlSetup->wValue = 0x0100;
     CtrlSetup->wIndex = 0;
-    CtrlSetup->wLength = sizeof(STANDARD_DEVICE_DESC);
+    CtrlSetup->wLength = sizeof(USB_DEVICE_DESCRIPTOR);
 
     tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD));
     UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp;
@@ -182,13 +190,31 @@
             break;
     }
 
+    if (OutBuffer != NULL)
+    {
+        OutBuffer->bLength = CtrlData->bLength;
+        OutBuffer->bDescriptorType = CtrlData->bDescriptorType;
+        OutBuffer->bcdUSB = CtrlData->bcdUSB;
+        OutBuffer->bDeviceClass = CtrlData->bDeviceClass;
+        OutBuffer->bDeviceSubClass = CtrlData->bDeviceSubClass;
+        OutBuffer->bDeviceProtocol = CtrlData->bDeviceProtocol;
+        OutBuffer->bMaxPacketSize0 = CtrlData->bMaxPacketSize0;
+        OutBuffer->idVendor = CtrlData->idVendor;
+        OutBuffer->idProduct = CtrlData->idProduct;
+        OutBuffer->bcdDevice = CtrlData->bcdDevice;
+        OutBuffer->iManufacturer = CtrlData->iManufacturer;
+        OutBuffer->iProduct = CtrlData->iProduct;
+        OutBuffer->iSerialNumber = CtrlData->iSerialNumber;
+        OutBuffer->bNumConfigurations = CtrlData->bNumConfigurations;
+    }
+
     DPRINT1("bLength %d\n", CtrlData->bLength);
     DPRINT1("bDescriptorType %x\n", CtrlData->bDescriptorType);
     DPRINT1("bcdUSB %x\n", CtrlData->bcdUSB);
     DPRINT1("CtrlData->bDeviceClass %x\n", CtrlData->bDeviceClass);
     DPRINT1("CtrlData->bDeviceSubClass %x\n", CtrlData->bDeviceSubClass);
-    DPRINT1("CtrlData->bDeviceProtocal %x\n", CtrlData->bDeviceProtocal);
-    DPRINT1("CtrlData->bMaxPacketSize %x\n", CtrlData->bMaxPacketSize);
+    DPRINT1("CtrlData->bDeviceProtocal %x\n", CtrlData->bDeviceProtocol);
+    DPRINT1("CtrlData->bMaxPacketSize %x\n", CtrlData->bMaxPacketSize0);
     DPRINT1("CtrlData->idVendor %x\n", CtrlData->idVendor);
     DPRINT1("CtrlData->idProduct %x\n", CtrlData->idProduct);
     DPRINT1("CtrlData->bcdDevice %x\n", CtrlData->bcdDevice);
@@ -202,7 +228,7 @@
     {
         /* We got valid data, try for strings */
         UCHAR Manufacturer = CtrlData->iManufacturer;
-        UCHAR Product = CtrlData->iManufacturer;
+        UCHAR Product = CtrlData->iProduct;
         UCHAR SerialNumber = CtrlData->iSerialNumber;
 
         GetDeviceStringDescriptor(DeviceExtension, Manufacturer);
@@ -228,7 +254,7 @@
     LONG tmp;
 
     Base = (ULONG) DeviceExtension->ResourceMemory;
-DPRINT1("Index: %d\n", Index);
+
     /* Set up the QUEUE HEAD in memory */
     QueueHead = (PQUEUE_HEAD) ((ULONG)DeviceExtension->AsyncListQueueHeadPtr);
 




More information about the Ros-diffs mailing list