+++ /dev/null
-/*++\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