]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Bus/Usb/UsbBus/Dxe/usbio.c
Retiring the ANT/JAVA build and removing the older EDK II packages that required...
[mirror_edk2.git] / EdkModulePkg / Bus / Usb / UsbBus / Dxe / usbio.c
diff --git a/EdkModulePkg/Bus/Usb/UsbBus/Dxe/usbio.c b/EdkModulePkg/Bus/Usb/UsbBus/Dxe/usbio.c
deleted file mode 100644 (file)
index 4601767..0000000
+++ /dev/null
@@ -1,1183 +0,0 @@
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation                                                         \r
-All rights reserved. This program and the accompanying materials                          \r
-are licensed and made available under the terms and conditions of the BSD License         \r
-which accompanies this distribution.  The full text of the license may be found at        \r
-http://opensource.org/licenses/bsd-license.php                                            \r
-                                                                                          \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
-\r
-  Module Name:\r
-\r
-    UsbIo.c\r
-\r
-  Abstract:\r
-\r
-    USB I/O Abstraction Driver\r
-\r
-  Revision History\r
-\r
---*/\r
-\r
-#include "usbbus.h"\r
-\r
-//\r
-// USB I/O Support Function Prototypes\r
-//\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbControlTransfer (\r
-  IN       EFI_USB_IO_PROTOCOL        *This,\r
-  IN       EFI_USB_DEVICE_REQUEST     *Request,\r
-  IN       EFI_USB_DATA_DIRECTION     Direction,\r
-  IN       UINT32                     Timeout,\r
-  IN OUT   VOID                       *Data, OPTIONAL\r
-  IN       UINTN                      DataLength, OPTIONAL\r
-  OUT      UINT32                     *Status\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbBulkTransfer (\r
-  IN       EFI_USB_IO_PROTOCOL     *This,\r
-  IN       UINT8                   DeviceEndpoint,\r
-  IN OUT   VOID                    *Data,\r
-  IN OUT   UINTN                   *DataLength,\r
-  IN       UINTN                   Timeout,\r
-  OUT      UINT32                  *Status\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbAsyncInterruptTransfer (\r
-  IN EFI_USB_IO_PROTOCOL                 * This,\r
-  IN UINT8                               DeviceEndpoint,\r
-  IN BOOLEAN                             IsNewTransfer,\r
-  IN UINTN                               PollingInterval, OPTIONAL\r
-  IN UINTN                               DataLength, OPTIONAL\r
-  IN EFI_ASYNC_USB_TRANSFER_CALLBACK     InterruptCallBack, OPTIONAL\r
-  IN VOID                                *Context OPTIONAL\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbSyncInterruptTransfer (\r
-  IN       EFI_USB_IO_PROTOCOL     *This,\r
-  IN       UINT8                   DeviceEndpoint,\r
-  IN OUT   VOID                    *Data,\r
-  IN OUT   UINTN                   *DataLength,\r
-  IN       UINTN                   Timeout,\r
-  OUT      UINT32                  *Status\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbIsochronousTransfer (\r
-  IN       EFI_USB_IO_PROTOCOL     *This,\r
-  IN       UINT8                   DeviceEndpoint,\r
-  IN OUT   VOID                    *Data,\r
-  IN       UINTN                   DataLength,\r
-  OUT      UINT32                  *Status\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbAsyncIsochronousTransfer (\r
-  IN        EFI_USB_IO_PROTOCOL                 * This,\r
-  IN        UINT8                               DeviceEndpoint,\r
-  IN OUT    VOID                                *Data,\r
-  IN        UINTN                               DataLength,\r
-  IN        EFI_ASYNC_USB_TRANSFER_CALLBACK     IsochronousCallBack,\r
-  IN        VOID                                *Context OPTIONAL\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbGetDeviceDescriptor (\r
-  IN  EFI_USB_IO_PROTOCOL           *This,\r
-  OUT EFI_USB_DEVICE_DESCRIPTOR     *DeviceDescriptor\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbGetActiveConfigDescriptor (\r
-  IN  EFI_USB_IO_PROTOCOL           *This,\r
-  OUT EFI_USB_CONFIG_DESCRIPTOR     *ConfigurationDescriptor\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbGetInterfaceDescriptor (\r
-  IN  EFI_USB_IO_PROTOCOL              *This,\r
-  OUT EFI_USB_INTERFACE_DESCRIPTOR     *InterfaceDescriptor\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbGetEndpointDescriptor (\r
-  IN  EFI_USB_IO_PROTOCOL             *This,\r
-  IN  UINT8                           EndpointIndex,\r
-  OUT EFI_USB_ENDPOINT_DESCRIPTOR     *EndpointDescriptor\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbGetStringDescriptor (\r
-  IN  EFI_USB_IO_PROTOCOL     *This,\r
-  IN  UINT16                  LangID,\r
-  IN  UINT8                   StringIndex,\r
-  OUT CHAR16                  **String\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbGetSupportedLanguages (\r
-  IN  EFI_USB_IO_PROTOCOL      *This,\r
-  OUT UINT16                   **LangIDTable,\r
-  OUT UINT16                   *TableSize\r
-  );\r
-\r
-//\r
-// USB I/O Interface structure\r
-//\r
-STATIC EFI_USB_IO_PROTOCOL  UsbIoInterface = {\r
-  UsbControlTransfer,\r
-  UsbBulkTransfer,\r
-  UsbAsyncInterruptTransfer,\r
-  UsbSyncInterruptTransfer,\r
-  UsbIsochronousTransfer,\r
-  UsbAsyncIsochronousTransfer,\r
-  UsbGetDeviceDescriptor,\r
-  UsbGetActiveConfigDescriptor,\r
-  UsbGetInterfaceDescriptor,\r
-  UsbGetEndpointDescriptor,\r
-  UsbGetStringDescriptor,\r
-  UsbGetSupportedLanguages,\r
-  UsbPortReset\r
-};\r
-\r
-VOID\r
-InitializeUsbIoInstance (\r
-  IN USB_IO_CONTROLLER_DEVICE     *UsbIoController\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Initialize the instance of UsbIo controller\r
-\r
-Arguments:\r
-\r
-  UsbIoController - A pointer to controller structure of UsbIo\r
-\r
-Returns:\r
-\r
---*/\r
-{\r
-  //\r
-  // Copy EFI_USB_IO protocol instance\r
-  //\r
-  CopyMem (\r
-    &UsbIoController->UsbIo,\r
-    &UsbIoInterface,\r
-    sizeof (EFI_USB_IO_PROTOCOL)\r
-    );\r
-}\r
-//\r
-// Implementation\r
-//\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbControlTransfer (\r
-  IN       EFI_USB_IO_PROTOCOL        *This,\r
-  IN       EFI_USB_DEVICE_REQUEST     *Request,\r
-  IN       EFI_USB_DATA_DIRECTION     Direction,\r
-  IN       UINT32                     Timeout,\r
-  IN OUT   VOID                       *Data, OPTIONAL\r
-  IN       UINTN                      DataLength, OPTIONAL\r
-  OUT      UINT32                     *Status\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    This function is used to manage a USB device with a control transfer pipe.\r
-\r
-  Arguments:\r
-    This        -   Indicates calling context.\r
-    Request     -   A pointer to the USB device request that will be sent to\r
-                    the USB device.\r
-    Direction   -   Indicates the data direction.\r
-    Data        -   A pointer to the buffer of data that will be transmitted\r
-                    to USB device or received from USB device.\r
-    Timeout     -   Indicates the transfer should be completed within this time\r
-                    frame.\r
-    DataLength  -   The size, in bytes, of the data buffer specified by Data.\r
-    Status      -   A pointer to the result of the USB transfer.\r
-\r
-  Returns:\r
-    EFI_SUCCESS\r
-    EFI_INVALID_PARAMETER\r
-    EFI_OUT_OF_RESOURCES\r
-    EFI_TIMEOUT\r
-    EFI_DEVICE_ERROR\r
-\r
---*/\r
-{\r
-  USB_IO_CONTROLLER_DEVICE  *UsbIoController;\r
-\r
-  EFI_STATUS                RetStatus;\r
-  USB_IO_DEVICE             *UsbIoDev;\r
-  UINT8                     MaxPacketLength;\r
-  UINT32                    TransferResult;\r
-  BOOLEAN                   Disconnected;\r
-  //\r
-  // Parameters Checking\r
-  //\r
-  if (Status == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  \r
-  //\r
-  // leave the HostController's ControlTransfer\r
-  // to perform other parameters checking\r
-  //\r
-  UsbIoController = USB_IO_CONTROLLER_DEVICE_FROM_USB_IO_THIS (This);\r
-  UsbIoDev        = UsbIoController->UsbDevice;\r
-\r
-  MaxPacketLength = UsbIoDev->DeviceDescriptor.MaxPacketSize0;\r
-\r
\r
-  if (Request->Request     == USB_DEV_CLEAR_FEATURE && \r
-      Request->RequestType == 0x02                  && \r
-      Request->Value       == EfiUsbEndpointHalt) {\r
-     //\r
-     //Reduce the remove delay time for system response\r
-     //\r
-     IsDeviceDisconnected (UsbIoController, &Disconnected);\r
-     if (!EFI_ERROR (Status) && Disconnected == TRUE) {\r
-      DEBUG ((gUSBErrorLevel, "Device is disconnected when trying reset\n"));\r
-      return EFI_DEVICE_ERROR;\r
-    }\r
-  }\r
-  //\r
-  // using HostController's ControlTransfer to complete the request\r
-  //\r
-  RetStatus = UsbVirtualHcControlTransfer (\r
-                UsbIoDev->BusController,\r
-                UsbIoDev->DeviceAddress,\r
-                UsbIoDev->DeviceSpeed,\r
-                MaxPacketLength,\r
-                Request,\r
-                Direction,\r
-                Data,\r
-                &DataLength,\r
-                (UINTN) Timeout,\r
-                UsbIoDev->Translator,\r
-                &TransferResult\r
-                );\r
-\r
-  *Status = TransferResult;\r
-\r
-  if (Request->Request     == USB_DEV_CLEAR_FEATURE && \r
-      Request->RequestType == 0x02                  && \r
-      Request->Value       == EfiUsbEndpointHalt) {\r
-    //\r
-    // This is a UsbClearEndpointHalt request\r
-    // Need to clear data toggle\r
-    // Request.Index == EndpointAddress\r
-    //\r
-    if (!EFI_ERROR (RetStatus) && TransferResult == EFI_USB_NOERROR) {\r
-      SetDataToggleBit (\r
-        This,\r
-        (UINT8) Request->Index,\r
-        0\r
-        );\r
-    }\r
-  }\r
-  return RetStatus;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbBulkTransfer (\r
-  IN       EFI_USB_IO_PROTOCOL     *This,\r
-  IN       UINT8                   DeviceEndpoint,\r
-  IN OUT   VOID                    *Data,\r
-  IN OUT   UINTN                   *DataLength,\r
-  IN       UINTN                   Timeout,\r
-  OUT      UINT32                  *Status\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    This function is used to manage a USB device with the bulk transfer pipe.\r
-\r
-  Arguments:\r
-    This            - Indicates calling context.\r
-    DeviceEndpoint  - The destination USB device endpoint to which the device\r
-                      request is being sent.\r
-    Data            - A pointer to the buffer of data that will be transmitted\r
-                      to USB device or received from USB device.\r
-    DataLength      - On input, the size, in bytes, of the data buffer\r
-                      specified by Data.  On output, the number of bytes that\r
-                      were actually transferred.\r
-    Timeout         - Indicates the transfer should be completed within this\r
-                      time frame.\r
-    Status          - This parameter indicates the USB transfer status.\r
-\r
-  Returns:\r
-    EFI_SUCCESS\r
-    EFI_INVALID_PARAMETER\r
-    EFI_OUT_OF_RESOURCES\r
-    EFI_TIMEOUT\r
-    EFI_DEVICE_ERROR\r
-\r
---*/\r
-{\r
-  USB_IO_DEVICE               *UsbIoDev;\r
-  UINTN                       MaxPacketLength;\r
-  UINT8                       DataToggle;\r
-  UINT8                       OldToggle;\r
-  EFI_STATUS                  RetStatus;\r
-  USB_IO_CONTROLLER_DEVICE    *UsbIoController;\r
-  ENDPOINT_DESC_LIST_ENTRY    *EndPointListEntry;\r
-  UINT8                       DataBuffersNumber;\r
-  UINT32                      TransferResult;\r
-  \r
-  DataBuffersNumber = 1;\r
-  UsbIoController   = USB_IO_CONTROLLER_DEVICE_FROM_USB_IO_THIS (This);\r
-  UsbIoDev          = UsbIoController->UsbDevice;\r
-\r
-  //\r
-  // Parameters Checking\r
-  //\r
-  if ((DeviceEndpoint & 0x7F) == 0) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if ((DeviceEndpoint & 0x7F) > 15) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (Status == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  EndPointListEntry = FindEndPointListEntry (\r
-                        This,\r
-                        DeviceEndpoint\r
-                        );\r
-\r
-  if (EndPointListEntry == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if ((EndPointListEntry->EndpointDescriptor.Attributes & 0x03) != 0x02) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-                        \r
-  //\r
-  // leave the HostController's BulkTransfer\r
-  // to perform other parameters checking\r
-  //\r
-  GetDeviceEndPointMaxPacketLength (\r
-    This,\r
-    DeviceEndpoint,\r
-    &MaxPacketLength\r
-    );\r
-\r
-  GetDataToggleBit (\r
-    This,\r
-    DeviceEndpoint,\r
-    &DataToggle\r
-    );\r
-\r
-  OldToggle = DataToggle;\r
-\r
-  //\r
-  // using HostController's BulkTransfer to complete the request\r
-  //\r
-  RetStatus = UsbVirtualHcBulkTransfer (\r
-                UsbIoDev->BusController,\r
-                UsbIoDev->DeviceAddress,\r
-                DeviceEndpoint,\r
-                UsbIoDev->DeviceSpeed,\r
-                MaxPacketLength,\r
-                DataBuffersNumber,\r
-                &Data,\r
-                DataLength,\r
-                &DataToggle,\r
-                Timeout,\r
-                UsbIoDev->Translator,\r
-                &TransferResult\r
-                );\r
-\r
-  if (OldToggle != DataToggle) {\r
-    //\r
-    // Write the toggle back\r
-    //\r
-    SetDataToggleBit (\r
-      This,\r
-      DeviceEndpoint,\r
-      DataToggle\r
-      );\r
-  }\r
-\r
-  *Status = TransferResult;\r
-\r
-  return RetStatus;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbSyncInterruptTransfer (\r
-  IN       EFI_USB_IO_PROTOCOL     *This,\r
-  IN       UINT8                   DeviceEndpoint,\r
-  IN OUT   VOID                    *Data,\r
-  IN OUT   UINTN                   *DataLength,\r
-  IN       UINTN                   Timeout,\r
-  OUT      UINT32                  *Status\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Usb Sync Interrupt Transfer\r
-\r
-  Arguments:\r
-    This            - Indicates calling context.\r
-    DeviceEndpoint  - The destination USB device endpoint to which the device\r
-                      request is being sent.\r
-    Data            - A pointer to the buffer of data that will be transmitted\r
-                      to USB device or received from USB device.\r
-    DataLength      - On input, the size, in bytes, of the data buffer\r
-                      specified by Data.  On output, the number of bytes that\r
-                      were actually transferred.\r
-    Timeout         - Indicates the transfer should be completed within this\r
-                      time frame.\r
-    Status          - This parameter indicates the USB transfer status.\r
-\r
-  Returns:\r
-    EFI_SUCCESS\r
-    EFI_INVALID_PARAMETER\r
-    EFI_OUT_OF_RESOURCES\r
-    EFI_TIMEOUT\r
-    EFI_DEVICE_ERROR\r
-\r
---*/\r
-{\r
-  USB_IO_DEVICE             *UsbIoDev;\r
-  UINTN                     MaxPacketLength;\r
-  UINT8                     DataToggle;\r
-  UINT8                     OldToggle;\r
-  EFI_STATUS                RetStatus;\r
-  USB_IO_CONTROLLER_DEVICE  *UsbIoController;\r
-  ENDPOINT_DESC_LIST_ENTRY  *EndPointListEntry;\r
-\r
-  //\r
-  // Parameters Checking\r
-  //\r
-  if ((DeviceEndpoint & 0x7F) == 0) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if ((DeviceEndpoint & 0x7F) > 15) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (Status == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  EndPointListEntry = FindEndPointListEntry (\r
-                        This,\r
-                        DeviceEndpoint\r
-                        );\r
-\r
-  if (EndPointListEntry == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if ((EndPointListEntry->EndpointDescriptor.Attributes & 0x03) != 0x03) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  \r
-  //\r
-  // leave the HostController's SyncInterruptTransfer\r
-  // to perform other parameters checking\r
-  //\r
-  UsbIoController = USB_IO_CONTROLLER_DEVICE_FROM_USB_IO_THIS (This);\r
-  UsbIoDev        = UsbIoController->UsbDevice;\r
-  GetDeviceEndPointMaxPacketLength (\r
-    This,\r
-    DeviceEndpoint,\r
-    &MaxPacketLength\r
-    );\r
-\r
-  GetDataToggleBit (\r
-    This,\r
-    DeviceEndpoint,\r
-    &DataToggle\r
-    );\r
-\r
-  OldToggle = DataToggle;\r
-  //\r
-  // using HostController's SyncInterruptTransfer to complete the request\r
-  //\r
-  RetStatus = UsbVirtualHcSyncInterruptTransfer (\r
-                UsbIoDev->BusController,\r
-                UsbIoDev->DeviceAddress,\r
-                DeviceEndpoint,\r
-                UsbIoDev->DeviceSpeed,\r
-                MaxPacketLength,\r
-                Data,\r
-                DataLength,\r
-                &DataToggle,\r
-                Timeout,\r
-                UsbIoDev->Translator,\r
-                Status\r
-                );\r
-\r
-  if (OldToggle != DataToggle) {\r
-    //\r
-    // Write the toggle back\r
-    //\r
-    SetDataToggleBit (\r
-      This,\r
-      DeviceEndpoint,\r
-      DataToggle\r
-      );\r
-  }\r
-\r
-  return RetStatus;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbAsyncInterruptTransfer (\r
-  IN EFI_USB_IO_PROTOCOL                 *This,\r
-  IN UINT8                               DeviceEndpoint,\r
-  IN BOOLEAN                             IsNewTransfer,\r
-  IN UINTN                               PollingInterval, OPTIONAL\r
-  IN UINTN                               DataLength, OPTIONAL\r
-  IN EFI_ASYNC_USB_TRANSFER_CALLBACK     InterruptCallBack, OPTIONAL\r
-  IN VOID                                *Context OPTIONAL\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Usb Async Interrput Transfer\r
-\r
-  Arguments:\r
-    This              -   Indicates calling context.\r
-    DeviceEndpoint    -   The destination USB device endpoint to which the\r
-                          device request is being sent.\r
-    IsNewTransfer     -   If TRUE, a new transfer will be submitted to USB\r
-                          controller.  If FALSE,  the interrupt transfer is\r
-                          deleted from the device's interrupt transfer queue.\r
-    PollingInterval   -   Indicates the periodic rate, in milliseconds, that\r
-                          the transfer is to be executed.\r
-    DataLength        -   Specifies the length, in bytes, of the data to be\r
-                          received from the USB device.\r
-    InterruptCallBack -   The Callback function.  This function is called if\r
-                          the asynchronous interrupt transfer is completed.\r
-    Context           -   Passed to InterruptCallback \r
-  Returns:\r
-    EFI_SUCCESS\r
-    EFI_INVALID_PARAMETER\r
-    EFI_OUT_OF_RESOURCES\r
-\r
---*/\r
-{\r
-  USB_IO_DEVICE             *UsbIoDev;\r
-  UINTN                     MaxPacketLength;\r
-  UINT8                     DataToggle;\r
-  EFI_STATUS                RetStatus;\r
-  USB_IO_CONTROLLER_DEVICE  *UsbIoController;\r
-  ENDPOINT_DESC_LIST_ENTRY  *EndpointListEntry;\r
-\r
-  //\r
-  // Check endpoint\r
-  //\r
-  if ((DeviceEndpoint & 0x7F) == 0) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if ((DeviceEndpoint & 0x7F) > 15) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  EndpointListEntry = FindEndPointListEntry (\r
-                        This,\r
-                        DeviceEndpoint\r
-                        );\r
-\r
-  if (EndpointListEntry == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if ((EndpointListEntry->EndpointDescriptor.Attributes & 0x03) != 0x03) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  UsbIoController = USB_IO_CONTROLLER_DEVICE_FROM_USB_IO_THIS (This);\r
-  UsbIoDev        = UsbIoController->UsbDevice;\r
-\r
-  if (!IsNewTransfer) {\r
-    //\r
-    // Delete this transfer\r
-    //\r
-    UsbVirtualHcAsyncInterruptTransfer (\r
-      UsbIoDev->BusController,\r
-      UsbIoDev->DeviceAddress,\r
-      DeviceEndpoint,\r
-      UsbIoDev->DeviceSpeed,\r
-      0,\r
-      FALSE,\r
-      &DataToggle,\r
-      PollingInterval,\r
-      DataLength,\r
-      UsbIoDev->Translator,\r
-      NULL,\r
-      NULL\r
-      );\r
-\r
-    //\r
-    // We need to store the toggle value\r
-    //\r
-    SetDataToggleBit (\r
-      This,\r
-      DeviceEndpoint,\r
-      DataToggle\r
-      );\r
-\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  GetDeviceEndPointMaxPacketLength (\r
-    This,\r
-    DeviceEndpoint,\r
-    &MaxPacketLength\r
-    );\r
-\r
-  GetDataToggleBit (\r
-    This,\r
-    DeviceEndpoint,\r
-    &DataToggle\r
-    );\r
-\r
-  RetStatus = UsbVirtualHcAsyncInterruptTransfer (\r
-                UsbIoDev->BusController,\r
-                UsbIoDev->DeviceAddress,\r
-                DeviceEndpoint,\r
-                UsbIoDev->DeviceSpeed,\r
-                MaxPacketLength,\r
-                TRUE,\r
-                &DataToggle,\r
-                PollingInterval,\r
-                DataLength,\r
-                UsbIoDev->Translator,\r
-                InterruptCallBack,\r
-                Context\r
-                );\r
-\r
-  return RetStatus;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbIsochronousTransfer (\r
-  IN       EFI_USB_IO_PROTOCOL     *This,\r
-  IN       UINT8                   DeviceEndpoint,\r
-  IN OUT   VOID                    *Data,\r
-  IN       UINTN                   DataLength,\r
-  OUT      UINT32                  *Status\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Usb Isochronous Transfer\r
-\r
-  Arguments:\r
-    This              -   Indicates calling context.\r
-    DeviceEndpoint    -   The destination USB device endpoint to which the\r
-                          device request is being sent.\r
-    Data              -   A pointer to the buffer of data that will be\r
-                          transmitted to USB device or received from USB device.\r
-    DataLength        -   The size, in bytes, of the data buffer specified by\r
-                          Data.\r
-    Status            -   This parameter indicates the USB transfer status.\r
-\r
-  Returns:\r
-    EFI_SUCCESS\r
-    EFI_INVALID_PARAMETER\r
-    EFI_OUT_OF_RESOURCES\r
-    EFI_TIMEOUT\r
-    EFI_DEVICE_ERROR\r
-    EFI_UNSUPPORTED\r
---*/\r
-{\r
-  //\r
-  // Currently we don't support this transfer\r
-  //\r
-  return EFI_UNSUPPORTED;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbAsyncIsochronousTransfer (\r
-  IN        EFI_USB_IO_PROTOCOL                 *This,\r
-  IN        UINT8                               DeviceEndpoint,\r
-  IN OUT    VOID                                *Data,\r
-  IN        UINTN                               DataLength,\r
-  IN        EFI_ASYNC_USB_TRANSFER_CALLBACK     IsochronousCallBack,\r
-  IN        VOID                                *Context OPTIONAL\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Usb Async Isochronous Transfer\r
-\r
-Arguments:\r
-\r
-  This                - EFI_USB_IO_PROTOCOL\r
-  DeviceEndpoint      - DeviceEndpoint number\r
-  Data                - Data to transfer\r
-  DataLength          - DataLength\r
-  IsochronousCallBack - Isochronous CallBack function\r
-  Context             - Passed to IsochronousCallBack function\r
-Returns:\r
-\r
-  EFI_UNSUPPORTED     - Unsupported now\r
-\r
---*/\r
-{\r
-  //\r
-  // Currently we don't support this transfer\r
-  //\r
-  return EFI_UNSUPPORTED;\r
-}\r
-//\r
-// Here is new definitions\r
-//\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbGetDeviceDescriptor (\r
-  IN  EFI_USB_IO_PROTOCOL           *This,\r
-  OUT EFI_USB_DEVICE_DESCRIPTOR     *DeviceDescriptor\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Retrieves the USB Device Descriptor.\r
-\r
-  Arguments:\r
-    This              -   Indicates the calling context.\r
-    DeviceDescriptor  -   A pointer to the caller allocated USB Device\r
-                          Descriptor.\r
-\r
-  Returns:\r
-    EFI_SUCCESS\r
-    EFI_INVALID_PARAMETER\r
-    EFI_NOT_FOUND\r
-\r
---*/\r
-{\r
-  USB_IO_CONTROLLER_DEVICE  *UsbIoController;\r
-  USB_IO_DEVICE             *UsbIoDev;\r
-\r
-  //\r
-  // This function just wrapps UsbGetDeviceDescriptor.\r
-  //\r
-  \r
-  if (DeviceDescriptor == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  UsbIoController = USB_IO_CONTROLLER_DEVICE_FROM_USB_IO_THIS (This);\r
-  UsbIoDev        = UsbIoController->UsbDevice;\r
-\r
-  if (!UsbIoDev->IsConfigured) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  CopyMem (\r
-    DeviceDescriptor,\r
-    &UsbIoDev->DeviceDescriptor,\r
-    sizeof (EFI_USB_DEVICE_DESCRIPTOR)\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbGetActiveConfigDescriptor (\r
-  IN  EFI_USB_IO_PROTOCOL           *This,\r
-  OUT EFI_USB_CONFIG_DESCRIPTOR     *ConfigurationDescriptor\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Retrieves the current USB configuration Descriptor.\r
-\r
-  Arguments:\r
-    This                     -   Indicates the calling context.\r
-    ConfigurationDescriptor  -   A pointer to the caller allocated USB active\r
-                                 Configuration Descriptor.\r
-\r
-  Returns:\r
-    EFI_SUCCESS\r
-    EFI_INVALID_PARAMETER\r
-    EFI_NOT_FOUND\r
-\r
---*/\r
-{\r
-  USB_IO_DEVICE             *UsbIoDev;\r
-  USB_IO_CONTROLLER_DEVICE  *UsbIoController;\r
-\r
-  //\r
-  // This function just wrapps UsbGetActiveConfigDescriptor.\r
-  //\r
-  if (ConfigurationDescriptor == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  UsbIoController = USB_IO_CONTROLLER_DEVICE_FROM_USB_IO_THIS (This);\r
-  UsbIoDev        = UsbIoController->UsbDevice;\r
-\r
-  if (!UsbIoDev->IsConfigured) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  CopyMem (\r
-    ConfigurationDescriptor,\r
-    &(UsbIoDev->ActiveConfig->CongfigDescriptor),\r
-    sizeof (EFI_USB_CONFIG_DESCRIPTOR)\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbGetInterfaceDescriptor (\r
-  IN  EFI_USB_IO_PROTOCOL              *This,\r
-  OUT EFI_USB_INTERFACE_DESCRIPTOR     *InterfaceDescriptor\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Retrieves the interface Descriptor for that controller.\r
-\r
-  Arguments:\r
-    This                  -   Indicates the calling context.\r
-    InterfaceDescriptor   -   A pointer to the caller allocated USB interface\r
-                              Descriptor.\r
-\r
-  Returns:\r
-    EFI_SUCCESS\r
-    EFI_INVALID_PARAMETER\r
-    EFI_NOT_FOUND\r
-\r
---*/\r
-{\r
-  INTERFACE_DESC_LIST_ENTRY *InterfaceListEntry;\r
-\r
-  if (InterfaceDescriptor == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  InterfaceListEntry = FindInterfaceListEntry (This);\r
-\r
-  if (InterfaceListEntry == NULL) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  CopyMem (\r
-    InterfaceDescriptor,\r
-    &(InterfaceListEntry->InterfaceDescriptor),\r
-    sizeof (EFI_USB_INTERFACE_DESCRIPTOR)\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbGetEndpointDescriptor (\r
-  IN  EFI_USB_IO_PROTOCOL             *This,\r
-  IN  UINT8                           EndpointIndex,\r
-  OUT EFI_USB_ENDPOINT_DESCRIPTOR     *EndpointDescriptor\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Retrieves the endpoint Descriptor for a given endpoint.\r
-\r
-  Arguments:\r
-    This                  -   Indicates the calling context.\r
-    EndpointIndex         -   Indicates which endpoint descriptor to retrieve.\r
-                              The valid range is 0..15.\r
-    EndpointDescriptor    -   A pointer to the caller allocated USB Endpoint\r
-                              Descriptor of a USB controller.\r
-\r
-  Returns:\r
-    EFI_SUCCESS           -   The endpoint descriptor was retrieved successfully.\r
-    EFI_INVALID_PARAMETER -   EndpointIndex is not valid.\r
-                          -   EndpointDescriptor is NULL.\r
-    EFI_NOT_FOUND         -   The endpoint descriptor cannot be found.\r
-                              The device may not be correctly configured.\r
-\r
---*/\r
-{\r
-  INTERFACE_DESC_LIST_ENTRY *InterfaceListEntry;\r
-  LIST_ENTRY            *EndpointListHead;\r
-  ENDPOINT_DESC_LIST_ENTRY  *EndpointListEntry;\r
-\r
-  if (EndpointDescriptor == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (EndpointIndex > 15) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  InterfaceListEntry = FindInterfaceListEntry (This);\r
-\r
-  if (InterfaceListEntry == NULL) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  EndpointListHead  = (LIST_ENTRY *) (&InterfaceListEntry->EndpointDescListHead);\r
-  EndpointListEntry = (ENDPOINT_DESC_LIST_ENTRY *) (EndpointListHead->ForwardLink);\r
-\r
-  if (EndpointIndex >= InterfaceListEntry->InterfaceDescriptor.NumEndpoints) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-  //\r
-  // Loop all endpoint descriptor to get match one.\r
-  //\r
-  while (EndpointIndex != 0) {\r
-    EndpointListEntry = (ENDPOINT_DESC_LIST_ENTRY *) (EndpointListEntry->Link.ForwardLink);\r
-    EndpointIndex--;\r
-  }\r
-\r
-  CopyMem (\r
-    EndpointDescriptor,\r
-    &EndpointListEntry->EndpointDescriptor,\r
-    sizeof (EFI_USB_ENDPOINT_DESCRIPTOR)\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbGetSupportedLanguages (\r
-  IN  EFI_USB_IO_PROTOCOL     *This,\r
-  OUT UINT16                  **LangIDTable,\r
-  OUT UINT16                  *TableSize\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Get all the languages that the USB device supports\r
-\r
-  Arguments:\r
-    This        -   Indicates the calling context.\r
-    LangIDTable -   Language ID for the string the caller wants to get.\r
-    TableSize   -   The size, in bytes, of the table LangIDTable.\r
-\r
-  Returns:\r
-    EFI_SUCCESS\r
-    EFI_NOT_FOUND\r
-\r
---*/\r
-{\r
-  USB_IO_DEVICE             *UsbIoDev;\r
-  USB_IO_CONTROLLER_DEVICE  *UsbIoController;\r
-  UINTN                     Index;\r
-  BOOLEAN                   Found;\r
-\r
-  UsbIoController = USB_IO_CONTROLLER_DEVICE_FROM_USB_IO_THIS (This);\r
-  UsbIoDev        = UsbIoController->UsbDevice;\r
-\r
-  Found           = FALSE;\r
-  Index           = 0;\r
-  //\r
-  // Loop language table\r
-  //\r
-  while (UsbIoDev->LangID[Index]) {\r
-    Found = TRUE;\r
-    Index++;\r
-  }\r
-\r
-  if (!Found) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  *LangIDTable  = UsbIoDev->LangID;\r
-  *TableSize    = (UINT16) Index;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbGetStringDescriptor (\r
-  IN  EFI_USB_IO_PROTOCOL     *This,\r
-  IN  UINT16                  LangID,\r
-  IN  UINT8                   StringIndex,\r
-  OUT CHAR16                  **String\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Get a given string descriptor\r
-\r
-  Arguments:\r
-    This          -   Indicates the calling context.\r
-    LangID        -   The Language ID for the string being retrieved.\r
-    StringIndex  -   The ID of the string being retrieved.\r
-    String        -   A pointer to a buffer allocated by this function\r
-                      with AllocatePool() to store the string.  If this\r
-                      function returns EFI_SUCCESS, it stores the string\r
-                      the caller wants to get.  The caller should release\r
-                      the string buffer with FreePool() after the string\r
-                      is not used any more.\r
-  Returns:\r
-    EFI_SUCCESS\r
-    EFI_NOT_FOUND\r
-    EFI_OUT_OF_RESOURCES\r
-    EFI_UNSUPPORTED\r
-\r
---*/\r
-{\r
-  UINT32                    Status;\r
-  EFI_STATUS                Result;\r
-  EFI_USB_STRING_DESCRIPTOR *StrDescriptor;\r
-  UINT8                     *Buffer;\r
-  CHAR16                    *UsbString;\r
-  UINT16                    TempBuffer;\r
-  USB_IO_DEVICE             *UsbIoDev;\r
-  UINT8                     Index;\r
-  BOOLEAN                   Found;\r
-  USB_IO_CONTROLLER_DEVICE  *UsbIoController;\r
-\r
-  if (StringIndex == 0) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-  //\r
-  // Search LanguageID, check if it is supported by this device\r
-  //\r
-  if (LangID == 0) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  UsbIoController = USB_IO_CONTROLLER_DEVICE_FROM_USB_IO_THIS (This);\r
-  UsbIoDev        = UsbIoController->UsbDevice;\r
-\r
-  Found           = FALSE;\r
-  Index           = 0;\r
-  while (UsbIoDev->LangID[Index]) {\r
-    if (UsbIoDev->LangID[Index] == LangID) {\r
-      Found = TRUE;\r
-      break;\r
-    }\r
-\r
-    Index++;\r
-  }\r
-\r
-  if (!Found) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-  //\r
-  // Get String Length\r
-  //\r
-  Result = UsbGetString (\r
-            This,\r
-            LangID,\r
-            StringIndex,\r
-            &TempBuffer,\r
-            2,\r
-            &Status\r
-            );\r
-  if (EFI_ERROR (Result)) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  StrDescriptor = (EFI_USB_STRING_DESCRIPTOR *) &TempBuffer;\r
-\r
-  if (StrDescriptor->Length == 0) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  Buffer = AllocateZeroPool (StrDescriptor->Length);\r
-  if (Buffer == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  Result = UsbGetString (\r
-            This,\r
-            LangID,\r
-            StringIndex,\r
-            Buffer,\r
-            StrDescriptor->Length,\r
-            &Status\r
-            );\r
-\r
-  if (EFI_ERROR (Result)) {\r
-    gBS->FreePool (Buffer);\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  StrDescriptor = (EFI_USB_STRING_DESCRIPTOR *) Buffer;\r
-\r
-  //\r
-  // UsbString is a UNICODE string\r
-  //\r
-  UsbString = AllocateZeroPool (StrDescriptor->Length);\r
-  if (UsbString == NULL) {\r
-    gBS->FreePool (Buffer);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  CopyMem (\r
-    (VOID *) UsbString,\r
-    Buffer + 2,\r
-    StrDescriptor->Length - 2\r
-    );\r
-\r
-  *String = UsbString;\r
-\r
-  gBS->FreePool (Buffer);\r
-\r
-  return EFI_SUCCESS;\r
-}\r