[CMAKE]
[reactos.git] / drivers / usb / usbehci / urbreq.c
index d9a85ba..86a88a8 100644 (file)
@@ -4,7 +4,7 @@
  * FILE:        drivers/usb/usbehci/urbreq.c
  * PURPOSE:     URB Related Functions.
  * PROGRAMMERS:
- *              Michael Martin
+ *              Michael Martin (mjmartin@reactos.org)
  */
 
 #include "usbehci.h"
@@ -15,7 +15,7 @@ IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead,
                                            PQUEUE_TRANSFER_DESCRIPTOR *CtrlTD1,
                                            PQUEUE_TRANSFER_DESCRIPTOR *CtrlTD2,
                                            PQUEUE_TRANSFER_DESCRIPTOR *CtrlTD3,
-                                           PEHCI_SETUP_FORMAT *CtrlSetup,
+                                           PUSB_DEFAULT_PIPE_SETUP_PACKET *CtrlSetup,
                                            PVOID *CtrlData,
                                            ULONG Size)
 {
@@ -67,22 +67,25 @@ IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead,
     *CtrlTD3 = (PQUEUE_TRANSFER_DESCRIPTOR) (((ULONG)(*CtrlTD2) + sizeof(QUEUE_TRANSFER_DESCRIPTOR) + 0x1F) & ~0x1F);
 
     /* Must be Page aligned */
-    *CtrlSetup = (PEHCI_SETUP_FORMAT) (( (ULONG)(*CtrlTD3) + sizeof(QUEUE_TRANSFER_DESCRIPTOR) + 0xFFF)  & ~0xFFF);
-    *CtrlData = (PUSB_DEVICE_DESCRIPTOR) (( (ULONG)(*CtrlSetup) + sizeof(EHCI_SETUP_FORMAT) + 0xFFF)  & ~0xFFF);
+    *CtrlSetup = (PUSB_DEFAULT_PIPE_SETUP_PACKET) (( (ULONG)(*CtrlTD3) + sizeof(QUEUE_TRANSFER_DESCRIPTOR) + 0xFFF)  & ~0xFFF);
+    *CtrlData = (PVOID) (( (ULONG)(*CtrlSetup) + sizeof(USB_DEFAULT_PIPE_SETUP_PACKET) + 0xFFF)  & ~0xFFF);
 
     (*CtrlTD1)->NextPointer = TERMINATE_POINTER;
     (*CtrlTD1)->AlternateNextPointer = TERMINATE_POINTER;
     (*CtrlTD1)->BufferPointer[0] = (ULONG)MmGetPhysicalAddress((PVOID) (*CtrlSetup)).LowPart;
     (*CtrlTD1)->Token.Bits.DataToggle = FALSE;
     (*CtrlTD1)->Token.Bits.InterruptOnComplete = FALSE;
-    (*CtrlTD1)->Token.Bits.TotalBytesToTransfer = sizeof(EHCI_SETUP_FORMAT);
+    (*CtrlTD1)->Token.Bits.TotalBytesToTransfer = sizeof(USB_DEFAULT_PIPE_SETUP_PACKET);
     (*CtrlTD1)->Token.Bits.ErrorCounter = 0x03;
     (*CtrlTD1)->Token.Bits.PIDCode = PID_CODE_SETUP_TOKEN;
     (*CtrlTD1)->Token.Bits.Active = TRUE;
 
     (*CtrlTD2)->NextPointer = TERMINATE_POINTER;
     (*CtrlTD2)->AlternateNextPointer = TERMINATE_POINTER;
-    (*CtrlTD2)->BufferPointer[0] = (ULONG)MmGetPhysicalAddress((PVOID) (*CtrlData)).LowPart;
+    if (Size == 0)
+        (*CtrlTD2)->BufferPointer[0] = 0;
+    else
+        (*CtrlTD2)->BufferPointer[0] = (ULONG)MmGetPhysicalAddress((PVOID) (*CtrlData)).LowPart;
     (*CtrlTD2)->Token.Bits.DataToggle = TRUE;
     (*CtrlTD2)->Token.Bits.InterruptOnComplete = TRUE;
     (*CtrlTD2)->Token.Bits.TotalBytesToTransfer = Size;
@@ -98,6 +101,7 @@ IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead,
     (*CtrlTD3)->Token.Bits.Active = TRUE;
     (*CtrlTD3)->Token.Bits.PIDCode = PID_CODE_OUT_TOKEN;
     (*CtrlTD3)->Token.Bits.InterruptOnComplete = TRUE;
+    (*CtrlTD3)->Token.Bits.TotalBytesToTransfer = 0;
     (*CtrlTD3)->Token.Bits.DataToggle = TRUE;
     (*CtrlTD3)->Token.Bits.ErrorCounter = 0x03;
     (*CtrlTD2)->NextPointer = (ULONG) MmGetPhysicalAddress((PVOID)(*CtrlTD3)).LowPart;
@@ -105,46 +109,47 @@ IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead,
 }
 
 BOOLEAN
-GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index, PUSB_DEVICE_DESCRIPTOR OutBuffer, BOOLEAN Hub)
+ExecuteControlRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, UCHAR Address, ULONG Port, PVOID Buffer, ULONG BufferLength)
 {
-    PEHCI_SETUP_FORMAT CtrlSetup = NULL;
-    PUSB_DEVICE_DESCRIPTOR CtrlData = NULL;
+    PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup = NULL;
+    PVOID CtrlData = NULL;
     PQUEUE_TRANSFER_DESCRIPTOR CtrlTD1 = NULL;
     PQUEUE_TRANSFER_DESCRIPTOR CtrlTD2 = NULL;
     PQUEUE_TRANSFER_DESCRIPTOR CtrlTD3 = NULL;
+
     PQUEUE_HEAD QueueHead;
     PEHCI_USBCMD_CONTENT UsbCmd;
     PEHCI_USBSTS_CONTEXT UsbSts;
     LONG Base;
     LONG tmp;
 
+    DPRINT1("ExecuteControlRequest: Buffer %x, Length %x\n", Buffer, BufferLength);
+
     Base = (ULONG) DeviceExtension->ResourceMemory;
 
     /* Set up the QUEUE HEAD in memory */
     QueueHead = (PQUEUE_HEAD) ((ULONG)DeviceExtension->AsyncListQueueHeadPtr);
 
+    /* Initialize the memory pointers */
     IntializeHeadQueueForStandardRequest(QueueHead,
                                          &CtrlTD1,
                                          &CtrlTD2,
                                          &CtrlTD3,
                                          &CtrlSetup,
                                          (PVOID)&CtrlData,
-                                         sizeof(USB_DEVICE_DESCRIPTOR));
+                                         BufferLength);
 
-    /* FIXME: Use defines and handle other than Device Desciptors */
-    if (Hub)
-    {
-        CtrlSetup->bmRequestType = 0x80;
-        CtrlSetup->wValue = 0x0600;
-    }
-    else
-    {
-        CtrlSetup->bmRequestType = 0x80;
-        CtrlSetup->wValue = 0x0100;
-    }
-    CtrlSetup->bRequest = 0x06;
-    CtrlSetup->wIndex = 0;
-    CtrlSetup->wLength = sizeof(USB_DEVICE_DESCRIPTOR);
+    QueueHead->EndPointCapabilities2.PortNumber = Port;
+    QueueHead->EndPointCapabilities1.DeviceAddress = Address;
+
+    CtrlSetup->bmRequestType._BM.Recipient = SetupPacket->bmRequestType._BM.Recipient;
+    CtrlSetup->bmRequestType._BM.Type = SetupPacket->bmRequestType._BM.Type;
+    CtrlSetup->bmRequestType._BM.Dir = SetupPacket->bmRequestType._BM.Dir;
+    CtrlSetup->bRequest = SetupPacket->bRequest;
+    CtrlSetup->wValue.LowByte = SetupPacket->wValue.LowByte;
+    CtrlSetup->wValue.HiByte = SetupPacket->wValue.HiByte;
+    CtrlSetup->wIndex.W = SetupPacket->wIndex.W;
+    CtrlSetup->wLength = SetupPacket->wLength;
 
     tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD));
     UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp;
@@ -184,142 +189,24 @@ GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index, PUSB_DEV
 
     for (;;)
     {
-        KeStallExecutionProcessor(10);
+        KeStallExecutionProcessor(100);
         DPRINT("Waiting for completion!\n");
         if (DeviceExtension->AsyncComplete == TRUE)
             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->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);
-    DPRINT1("CtrlData->iManufacturer %x\n", CtrlData->iManufacturer);
-    DPRINT1("CtrlData->iProduct %x\n", CtrlData->iProduct);
-    DPRINT1("CtrlData->iSerialNumber %x\n", CtrlData->iSerialNumber);
-    DPRINT1("CtrlData->bNumConfigurations %x\n", CtrlData->bNumConfigurations);
-
-    /* Temporary: Remove */
-    if (CtrlData->bLength > 0)
-    {
-        /* We got valid data, try for strings */
-        UCHAR Manufacturer = CtrlData->iManufacturer;
-        UCHAR Product = CtrlData->iProduct;
-        UCHAR SerialNumber = CtrlData->iSerialNumber;
-
-        GetDeviceStringDescriptor(DeviceExtension, Manufacturer);
-        GetDeviceStringDescriptor(DeviceExtension, Product);
-        GetDeviceStringDescriptor(DeviceExtension, SerialNumber);
-    }
-
-    return TRUE;
-}
-
-BOOLEAN
-GetDeviceStringDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index)
-{
-    PEHCI_SETUP_FORMAT CtrlSetup = NULL;
-    PSTRING_DESCRIPTOR CtrlData = NULL;
-    PQUEUE_TRANSFER_DESCRIPTOR CtrlTD1 = NULL;
-    PQUEUE_TRANSFER_DESCRIPTOR CtrlTD2 = NULL;
-    PQUEUE_TRANSFER_DESCRIPTOR CtrlTD3 = NULL;
-    PQUEUE_HEAD QueueHead;
-    PEHCI_USBCMD_CONTENT UsbCmd;
-    PEHCI_USBSTS_CONTEXT UsbSts;
-    LONG Base;
-    LONG tmp;
-
-    Base = (ULONG) DeviceExtension->ResourceMemory;
-
-    /* Set up the QUEUE HEAD in memory */
-    QueueHead = (PQUEUE_HEAD) ((ULONG)DeviceExtension->AsyncListQueueHeadPtr);
-
-    IntializeHeadQueueForStandardRequest(QueueHead,
-                                         &CtrlTD1,
-                                         &CtrlTD2,
-                                         &CtrlTD3,
-                                         &CtrlSetup,
-                                         (PVOID)&CtrlData,
-                                         sizeof(STRING_DESCRIPTOR) + 256);
-
-    /* FIXME: Use defines and handle other than Device Desciptors */
-    CtrlSetup->bmRequestType = 0x80;
-    CtrlSetup->bRequest = 0x06;
-    CtrlSetup->wValue = 0x0300 | Index;
-    CtrlSetup->wIndex = 0;
-    /* 256 pulled from thin air */
-    CtrlSetup->wLength = sizeof(STRING_DESCRIPTOR) + 256;
-
-    tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD));
-    UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp;
     UsbCmd->Run = FALSE;
-    WRITE_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD), tmp);
+    WRITE_REGISTER_ULONG((PULONG)(Base + EHCI_USBCMD), tmp);
 
-    /* Wait for the controller to halt */
-    for (;;)
+    if (CtrlSetup->bmRequestType._BM.Dir == BMREQUEST_DEVICE_TO_HOST)
     {
-        KeStallExecutionProcessor(10);
-        tmp = READ_REGISTER_ULONG((PULONG)(Base + EHCI_USBSTS));
-        UsbSts = (PEHCI_USBSTS_CONTEXT)&tmp;
-        DPRINT("Waiting for Halt, USBSTS: %x\n", READ_REGISTER_ULONG ((PULONG)(Base + EHCI_USBSTS)));
-        if (UsbSts->HCHalted)
+        if ((Buffer) && (BufferLength))
         {
-            break;
+            RtlCopyMemory(Buffer, CtrlData, BufferLength);
         }
+        else
+            DPRINT1("Unable to copy data to buffer\n");
     }
 
-    /* Set to TRUE on interrupt for async completion */
-    DeviceExtension->AsyncComplete = FALSE;
-    QueueHead->QETDPointer = (ULONG) MmGetPhysicalAddress((PVOID)(CtrlTD1)).LowPart;
-
-    tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD));
-    UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp;
-    UsbCmd->AsyncEnable = TRUE;
-
-    WRITE_REGISTER_ULONG((PULONG)(Base + EHCI_USBCMD), tmp);
-
-    tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD));
-    UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp;
-
-    /* Interrupt on Async completion */
-    UsbCmd->DoorBell = TRUE;
-    UsbCmd->Run = TRUE;
-    WRITE_REGISTER_ULONG((PULONG)(Base + EHCI_USBCMD), tmp);
-
-    for (;;)
-    {
-        KeStallExecutionProcessor(10);
-        DPRINT("Waiting for completion!\n");
-        if (DeviceExtension->AsyncComplete == TRUE)
-            break;
-    }
-
-    DPRINT1("String %S\n", &CtrlData->bString);
-
     return TRUE;
 }
-