+++ /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
- Usb.c\r
-\r
- Abstract:\r
-\r
- Parse usb device configurations.\r
-\r
- Revision History\r
-\r
---*/\r
-\r
-#include "usbbus.h"\r
-\r
-//\r
-// Here are some internal helper functions\r
-//\r
-STATIC\r
-EFI_STATUS\r
-GetExpectedDescriptor (\r
- IN UINT8 *Buffer,\r
- IN UINTN Length,\r
- IN UINT8 DescType,\r
- IN UINT8 DescLength,\r
- OUT UINTN *ParsedBytes\r
- );\r
-\r
-STATIC\r
-EFI_STATUS\r
-ParseThisEndpoint (\r
- IN ENDPOINT_DESC_LIST_ENTRY *EndpointEntry,\r
- IN UINT8 *Buffer,\r
- IN UINTN BufferLength,\r
- OUT UINTN *ParsedBytes\r
- );\r
-\r
-STATIC\r
-EFI_STATUS\r
-ParseThisInterface (\r
- IN INTERFACE_DESC_LIST_ENTRY *InterfaceEntry,\r
- IN UINT8 *Buffer,\r
- IN UINTN *BufferLen,\r
- OUT UINTN *ParsedBytes\r
- );\r
-\r
-STATIC\r
-EFI_STATUS\r
-ParseThisConfig (\r
- IN CONFIG_DESC_LIST_ENTRY *ConfigDescEntry,\r
- IN UINT8 *Buffer,\r
- IN UINTN Length\r
- );\r
-\r
-//\r
-// Implementations\r
-//\r
-BOOLEAN\r
-IsHub (\r
- IN USB_IO_CONTROLLER_DEVICE *Dev\r
- )\r
-/*++\r
- \r
- Routine Description:\r
- Tell if a usb controller is a hub controller.\r
- \r
- Arguments:\r
- Dev - UsbIoController device structure.\r
- \r
- Returns:\r
- TRUE/FALSE\r
---*/\r
-{\r
- EFI_USB_INTERFACE_DESCRIPTOR Interface;\r
- EFI_USB_IO_PROTOCOL *UsbIo;\r
- EFI_USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;\r
- UINT8 Index;\r
-\r
- if (Dev == NULL) {\r
- return FALSE;\r
- }\r
-\r
- UsbIo = &Dev->UsbIo;\r
-\r
- UsbIo->UsbGetInterfaceDescriptor (\r
- UsbIo,\r
- &Interface\r
- );\r
-\r
- //\r
- // Check classcode\r
- //\r
- if (Interface.InterfaceClass != 0x09) {\r
- return FALSE;\r
- }\r
- \r
- //\r
- // Check protocol\r
- //\r
- if (Interface.InterfaceProtocol != 0x0) {\r
- return FALSE;\r
- }\r
-\r
- for (Index = 0; Index < Interface.NumEndpoints; Index++) {\r
- UsbIo->UsbGetEndpointDescriptor (\r
- UsbIo,\r
- Index,\r
- &EndpointDescriptor\r
- );\r
-\r
- if ((EndpointDescriptor.EndpointAddress & 0x80) == 0) {\r
- continue;\r
- }\r
-\r
- if (EndpointDescriptor.Attributes != 0x03) {\r
- continue;\r
- }\r
-\r
- Dev->HubEndpointAddress = EndpointDescriptor.EndpointAddress;\r
- return TRUE;\r
- }\r
-\r
- return FALSE;\r
-}\r
-\r
-EFI_STATUS\r
-UsbGetStringtable (\r
- IN USB_IO_DEVICE *Dev\r
- )\r
-/*++\r
- \r
- Routine Description:\r
- Get the string table stored in a usb device.\r
- \r
- Arguments:\r
- Dev - UsbIoController device structure.\r
- \r
- Returns:\r
- EFI_SUCCESS\r
- EFI_UNSUPPORTED\r
- EFI_OUT_OF_RESOURCES\r
- \r
---*/\r
-{\r
- EFI_STATUS Result;\r
- UINT32 Status;\r
- EFI_USB_SUPPORTED_LANGUAGES *LanguageTable;\r
- UINT8 *Buffer;\r
- UINT8 *ptr;\r
- UINTN Index;\r
- UINTN LangTableSize;\r
- EFI_USB_IO_PROTOCOL *UsbIo;\r
- UINT16 TempBuffer;\r
-\r
- UsbIo = &(Dev->UsbController[0]->UsbIo);\r
-\r
- //\r
- // We get first 2 byte of langID table,\r
- // so we can have the whole table length\r
- //\r
- Result = UsbGetString (\r
- UsbIo,\r
- 0,\r
- 0,\r
- &TempBuffer,\r
- 2,\r
- &Status\r
- );\r
- if (EFI_ERROR (Result)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- LanguageTable = (EFI_USB_SUPPORTED_LANGUAGES *) &TempBuffer;\r
-\r
- if (LanguageTable->Length == 0) {\r
- return EFI_UNSUPPORTED;\r
- }\r
- //\r
- // If length is 2, then there is no string table\r
- //\r
- if (LanguageTable->Length == 2) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- Buffer = AllocateZeroPool (LanguageTable->Length);\r
- if (Buffer == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- \r
- //\r
- // Now we get the whole LangID table\r
- //\r
- Result = UsbGetString (\r
- UsbIo,\r
- 0,\r
- 0,\r
- Buffer,\r
- LanguageTable->Length,\r
- &Status\r
- );\r
- if (EFI_ERROR (Result)) {\r
- gBS->FreePool (Buffer);\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- LanguageTable = (EFI_USB_SUPPORTED_LANGUAGES *) Buffer;\r
-\r
- //\r
- // ptr point to the LangID table\r
- //\r
- ptr = Buffer + 2;\r
- LangTableSize = (LanguageTable->Length - 2) / 2;\r
-\r
- for (Index = 0; Index < LangTableSize && Index < USB_MAXLANID; Index++) {\r
- Dev->LangID[Index] = *((UINT16 *) ptr);\r
- ptr += 2;\r
- }\r
-\r
- gBS->FreePool (Buffer);\r
- LanguageTable = NULL;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-EFI_STATUS\r
-UsbGetAllConfigurations (\r
- IN USB_IO_DEVICE *UsbIoDevice\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- This function is to parse all the configuration descriptor.\r
- \r
- Arguments:\r
- UsbIoDevice - USB_IO_DEVICE device structure.\r
- \r
- Returns:\r
- EFI_SUCCESS\r
- EFI_DEVICE_ERROR\r
- EFI_OUT_OF_RESOURCES \r
-\r
---*/\r
-{\r
- EFI_STATUS Result;\r
- UINT32 Status;\r
- UINTN Index;\r
- UINTN TotalLength;\r
- UINT8 *Buffer;\r
- CONFIG_DESC_LIST_ENTRY *ConfigDescEntry;\r
- EFI_USB_IO_PROTOCOL *UsbIo;\r
-\r
- InitializeListHead (&UsbIoDevice->ConfigDescListHead);\r
- UsbIo = &(UsbIoDevice->UsbController[0]->UsbIo);\r
-\r
- for (Index = 0; Index < UsbIoDevice->DeviceDescriptor.NumConfigurations; Index++) {\r
- ConfigDescEntry = NULL;\r
-\r
- ConfigDescEntry = AllocateZeroPool (sizeof (CONFIG_DESC_LIST_ENTRY));\r
- if (ConfigDescEntry == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // 1st only get 1st 4 bytes config descriptor,\r
- // so we can know the whole length\r
- //\r
- Result = UsbGetDescriptor (\r
- UsbIo,\r
- (UINT16) ((USB_DT_CONFIG << 8) | Index),\r
- 0,\r
- 4,\r
- &ConfigDescEntry->CongfigDescriptor,\r
- &Status\r
- );\r
- if (EFI_ERROR (Result)) {\r
- DEBUG ((gUSBErrorLevel, "First get config descriptor error\n"));\r
- gBS->FreePool (ConfigDescEntry);\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- TotalLength = ConfigDescEntry->CongfigDescriptor.TotalLength;\r
-\r
- Buffer = AllocateZeroPool (TotalLength);\r
- if (Buffer == NULL) {\r
- gBS->FreePool (ConfigDescEntry);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // Then we get the total descriptors for this configuration\r
- //\r
- Result = UsbGetDescriptor (\r
- UsbIo,\r
- (UINT16) ((USB_DT_CONFIG << 8) | Index),\r
- 0,\r
- (UINT16) TotalLength,\r
- Buffer,\r
- &Status\r
- );\r
- if (EFI_ERROR (Result)) {\r
- DEBUG ((gUSBErrorLevel, "Get whole config descriptor error\n"));\r
- gBS->FreePool (ConfigDescEntry);\r
- gBS->FreePool (Buffer);\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- InitializeListHead (&ConfigDescEntry->InterfaceDescListHead);\r
-\r
- //\r
- // Parse this whole configuration\r
- //\r
- Result = ParseThisConfig (ConfigDescEntry, Buffer, TotalLength);\r
-\r
- if (EFI_ERROR (Result)) {\r
- //\r
- // Ignore this configuration, parse next one\r
- //\r
- gBS->FreePool (ConfigDescEntry);\r
- gBS->FreePool (Buffer);\r
- continue;\r
- }\r
-\r
- InsertTailList (&UsbIoDevice->ConfigDescListHead, &ConfigDescEntry->Link);\r
-\r
- gBS->FreePool (Buffer);\r
-\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-GetExpectedDescriptor (\r
- IN UINT8 *Buffer,\r
- IN UINTN Length,\r
- IN UINT8 DescType,\r
- IN UINT8 DescLength,\r
- OUT UINTN *ParsedBytes\r
- )\r
-/*++\r
- \r
- Routine Description:\r
- Get the start position of next wanted descriptor.\r
- \r
- Arguments:\r
- Buffer - Buffer to parse\r
- Length - Buffer length \r
- DescType - Descriptor type \r
- DescLength - Descriptor length\r
- ParsedBytes - Parsed Bytes to return\r
- Returns:\r
- EFI_SUCCESS\r
- EFI_DEVICE_ERROR\r
-\r
---*/\r
-{\r
- UINT16 DescriptorHeader;\r
- UINT8 Len;\r
- UINT8 *ptr;\r
- UINTN Parsed;\r
-\r
- Parsed = 0;\r
- ptr = Buffer;\r
-\r
- while (TRUE) {\r
- //\r
- // Buffer length should not less than Desc length\r
- //\r
- if (Length < DescLength) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
- //\r
- // DescriptorHeader = *((UINT16 *)ptr), compatible with IPF\r
- //\r
- DescriptorHeader = (UINT16) ((*(ptr + 1) << 8) | *ptr);\r
-\r
- Len = ptr[0];\r
-\r
- //\r
- // Check to see if it is a start of expected descriptor\r
- //\r
- if (DescriptorHeader == ((DescType << 8) | DescLength)) {\r
- break;\r
- }\r
-\r
- if ((UINT8) (DescriptorHeader >> 8) == DescType) {\r
- if (Len > DescLength) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
- }\r
- //\r
- // Descriptor length should be at least 2\r
- // and should not exceed the buffer length\r
- //\r
- if (Len < 2) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- if (Len > Length) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
- //\r
- // Skip this mismatch descriptor\r
- //\r
- Length -= Len;\r
- ptr += Len;\r
- Parsed += Len;\r
- }\r
-\r
- *ParsedBytes = Parsed;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-STATIC\r
-EFI_STATUS\r
-ParseThisEndpoint (\r
- IN ENDPOINT_DESC_LIST_ENTRY *EndpointEntry,\r
- IN UINT8 *Buffer,\r
- IN UINTN BufferLength,\r
- OUT UINTN *ParsedBytes\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Get the start position of next wanted endpoint descriptor.\r
-\r
- Arguments:\r
- EndpointEntry - ENDPOINT_DESC_LIST_ENTRY\r
- Buffer - Buffer to parse \r
- BufferLength - Buffer Length\r
- ParsedBytes - Parsed Bytes to return\r
- Returns:\r
- EFI_SUCCESS\r
- EFI_DEVICE_ERROR\r
-\r
---*/\r
-{\r
- UINT8 *ptr;\r
- EFI_STATUS Status;\r
- UINTN SkipBytes;\r
-\r
- //\r
- // Skip some data for this interface\r
- //\r
- Status = GetExpectedDescriptor (\r
- Buffer,\r
- BufferLength,\r
- USB_DT_ENDPOINT,\r
- sizeof (EFI_USB_ENDPOINT_DESCRIPTOR),\r
- &SkipBytes\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- ptr = Buffer + SkipBytes;\r
- *ParsedBytes = SkipBytes;\r
-\r
- CopyMem (\r
- &EndpointEntry->EndpointDescriptor,\r
- ptr,\r
- sizeof (EFI_USB_ENDPOINT_DESCRIPTOR)\r
- );\r
-\r
- *ParsedBytes += sizeof (EFI_USB_ENDPOINT_DESCRIPTOR);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-ParseThisInterface (\r
- IN INTERFACE_DESC_LIST_ENTRY *InterfaceEntry,\r
- IN UINT8 *Buffer,\r
- IN UINTN *BufferLen,\r
- OUT UINTN *ParsedBytes\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Get the start position of next wanted interface descriptor.\r
-\r
- Arguments:\r
- InterfaceEntry - INTERFACE_DESC_LIST_ENTRY\r
- Buffer - Buffer to parse \r
- BufferLength - Buffer Length\r
- ParsedBytes - Parsed Bytes to return\r
-\r
- Returns:\r
- EFI_SUCCESS\r
- EFI_DEVICE_ERROR\r
-\r
---*/\r
-{\r
- UINT8 *ptr;\r
- UINTN SkipBytes;\r
- UINTN Index;\r
- UINTN Length;\r
- UINTN Parsed;\r
- ENDPOINT_DESC_LIST_ENTRY *EndpointEntry;\r
- EFI_STATUS Status;\r
-\r
- Parsed = 0;\r
-\r
- //\r
- // Skip some data for this interface\r
- //\r
- Status = GetExpectedDescriptor (\r
- Buffer,\r
- *BufferLen,\r
- USB_DT_INTERFACE,\r
- sizeof (EFI_USB_INTERFACE_DESCRIPTOR),\r
- &SkipBytes\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- ptr = Buffer + SkipBytes;\r
- *ParsedBytes = SkipBytes;\r
-\r
- //\r
- // Copy the interface descriptor\r
- //\r
- CopyMem (\r
- &InterfaceEntry->InterfaceDescriptor,\r
- ptr,\r
- sizeof (EFI_USB_INTERFACE_DESCRIPTOR)\r
- );\r
-\r
- ptr = Buffer + sizeof (EFI_USB_INTERFACE_DESCRIPTOR);\r
- *ParsedBytes += sizeof (EFI_USB_INTERFACE_DESCRIPTOR);\r
-\r
- InitializeListHead (&InterfaceEntry->EndpointDescListHead);\r
-\r
- Length = *BufferLen - SkipBytes - sizeof (EFI_USB_INTERFACE_DESCRIPTOR);\r
-\r
- for (Index = 0; Index < InterfaceEntry->InterfaceDescriptor.NumEndpoints; Index++) {\r
- EndpointEntry = AllocateZeroPool (sizeof (ENDPOINT_DESC_LIST_ENTRY));\r
- if (EndpointEntry == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- \r
- //\r
- // Parses all the endpoint descriptors within this interface.\r
- //\r
- Status = ParseThisEndpoint (EndpointEntry, ptr, Length, &Parsed);\r
-\r
- if (EFI_ERROR (Status)) {\r
- gBS->FreePool (EndpointEntry);\r
- return Status;\r
- }\r
-\r
- InsertTailList (\r
- &InterfaceEntry->EndpointDescListHead,\r
- &EndpointEntry->Link\r
- );\r
-\r
- Length -= Parsed;\r
- ptr += Parsed;\r
- *ParsedBytes += Parsed;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-ParseThisConfig (\r
- IN CONFIG_DESC_LIST_ENTRY *ConfigDescEntry,\r
- IN UINT8 *Buffer,\r
- IN UINTN Length\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Parse the current configuration descriptior.\r
-\r
- Arguments:\r
- ConfigDescEntry - CONFIG_DESC_LIST_ENTRY\r
- Buffer - Buffer to parse \r
- Length - Buffer Length\r
-\r
- Returns\r
- EFI_SUCCESS\r
- EFI_DEVICE_ERROR\r
-\r
---*/\r
-{\r
- UINT8 *ptr;\r
- UINT8 NumInterface;\r
- UINTN Index;\r
- INTERFACE_DESC_LIST_ENTRY *InterfaceEntry;\r
- UINTN SkipBytes;\r
- UINTN Parsed;\r
- EFI_STATUS Status;\r
- UINTN LengthLeft;\r
-\r
- Parsed = 0;\r
-\r
- //\r
- // First skip the current config descriptor;\r
- //\r
- Status = GetExpectedDescriptor (\r
- Buffer,\r
- Length,\r
- USB_DT_CONFIG,\r
- sizeof (EFI_USB_CONFIG_DESCRIPTOR),\r
- &SkipBytes\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- ptr = Buffer + SkipBytes;\r
-\r
- CopyMem (\r
- &ConfigDescEntry->CongfigDescriptor,\r
- ptr,\r
- sizeof (EFI_USB_CONFIG_DESCRIPTOR)\r
- );\r
-\r
- NumInterface = ConfigDescEntry->CongfigDescriptor.NumInterfaces;\r
-\r
- //\r
- // Skip size of Configuration Descriptor\r
- //\r
- ptr += sizeof (EFI_USB_CONFIG_DESCRIPTOR);\r
-\r
- LengthLeft = Length - SkipBytes - sizeof (EFI_USB_CONFIG_DESCRIPTOR);\r
-\r
- for (Index = 0; Index < NumInterface; Index++) {\r
- //\r
- // Parse all Interface\r
- //\r
- InterfaceEntry = AllocateZeroPool (sizeof (INTERFACE_DESC_LIST_ENTRY));\r
- if (InterfaceEntry == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- Status = ParseThisInterface (InterfaceEntry, ptr, &LengthLeft, &Parsed);\r
- if (EFI_ERROR (Status)) {\r
- gBS->FreePool (InterfaceEntry);\r
- return Status;\r
- }\r
-\r
- InsertTailList (\r
- &ConfigDescEntry->InterfaceDescListHead,\r
- &InterfaceEntry->Link\r
- );\r
-\r
- //\r
- // Parsed for next interface\r
- //\r
- LengthLeft -= Parsed;\r
- ptr += Parsed;\r
- }\r
- //\r
- // Parse for additional alt setting;\r
- //\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-UsbSetConfiguration (\r
- IN USB_IO_DEVICE *UsbIoDev,\r
- IN UINTN ConfigurationValue\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Set the device to a configuration value.\r
- \r
- Arguments:\r
- UsbIoDev - USB_IO_DEVICE to be set configuration\r
- ConfigrationValue - The configuration value to be set to that device\r
- \r
- Returns:\r
- EFI_SUCCESS\r
- EFI_DEVICE_ERROR\r
- \r
---*/\r
-{\r
- LIST_ENTRY *NextEntry;\r
- CONFIG_DESC_LIST_ENTRY *ConfigEntry;\r
- UINT32 Status;\r
- EFI_STATUS Result;\r
- EFI_USB_IO_PROTOCOL *UsbIo;\r
-\r
- UsbIo = &(UsbIoDev->UsbController[0]->UsbIo);\r
- NextEntry = UsbIoDev->ConfigDescListHead.ForwardLink;\r
-\r
- while (NextEntry != &UsbIoDev->ConfigDescListHead) {\r
- //\r
- // Get one entry\r
- //\r
- ConfigEntry = (CONFIG_DESC_LIST_ENTRY *) NextEntry;\r
- if (ConfigEntry->CongfigDescriptor.ConfigurationValue == ConfigurationValue) {\r
- //\r
- // Find one, set to the active configuration\r
- //\r
- UsbIoDev->ActiveConfig = ConfigEntry;\r
- break;\r
- }\r
-\r
- NextEntry = NextEntry->ForwardLink;\r
- }\r
- //\r
- // Next Entry should not be null\r
- //\r
- Result = UsbSetDeviceConfiguration (\r
- UsbIo,\r
- (UINT16) ConfigurationValue,\r
- &Status\r
- );\r
-\r
- return Result;\r
-}\r
-\r
-EFI_STATUS\r
-UsbSetDefaultConfiguration (\r
- IN USB_IO_DEVICE *UsbIoDev\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Set the device to a default configuration value.\r
- \r
- Arguments:\r
- UsbIoDev - USB_IO_DEVICE to be set configuration\r
- \r
- Returns\r
- EFI_SUCCESS\r
- EFI_DEVICE_ERROR\r
- \r
---*/\r
-{\r
- CONFIG_DESC_LIST_ENTRY *ConfigEntry;\r
- UINT16 ConfigValue;\r
- LIST_ENTRY *NextEntry;\r
-\r
- if (IsListEmpty (&UsbIoDev->ConfigDescListHead)) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- NextEntry = UsbIoDev->ConfigDescListHead.ForwardLink;\r
-\r
- ConfigEntry = (CONFIG_DESC_LIST_ENTRY *) NextEntry;\r
- ConfigValue = ConfigEntry->CongfigDescriptor.ConfigurationValue;\r
-\r
- return UsbSetConfiguration (UsbIoDev, ConfigValue);\r
-}\r
-\r
-VOID\r
-UsbDestroyAllConfiguration (\r
- IN USB_IO_DEVICE *UsbIoDevice\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Delete all configuration data when device is not used.\r
- \r
- Arguments:\r
- UsbIoDevice - USB_IO_DEVICE to be set configuration\r
- \r
- Returns:\r
- N/A\r
- \r
---*/\r
-{\r
- CONFIG_DESC_LIST_ENTRY *ConfigEntry;\r
- INTERFACE_DESC_LIST_ENTRY *InterfaceEntry;\r
- ENDPOINT_DESC_LIST_ENTRY *EndpointEntry;\r
- LIST_ENTRY *NextEntry;\r
-\r
- //\r
- // Delete all configuration descriptor data\r
- //\r
- ConfigEntry = (CONFIG_DESC_LIST_ENTRY *) UsbIoDevice->ConfigDescListHead.ForwardLink;\r
-\r
- while (ConfigEntry != (CONFIG_DESC_LIST_ENTRY *) &UsbIoDevice->ConfigDescListHead) {\r
- //\r
- // Delete all its interface descriptors\r
- //\r
- InterfaceEntry = (INTERFACE_DESC_LIST_ENTRY *) ConfigEntry->InterfaceDescListHead.ForwardLink;\r
-\r
- while (InterfaceEntry != (INTERFACE_DESC_LIST_ENTRY *) &ConfigEntry->InterfaceDescListHead) {\r
- //\r
- // Delete all its endpoint descriptors\r
- //\r
- EndpointEntry = (ENDPOINT_DESC_LIST_ENTRY *) InterfaceEntry->EndpointDescListHead.ForwardLink;\r
- while (EndpointEntry != (ENDPOINT_DESC_LIST_ENTRY *) &InterfaceEntry->EndpointDescListHead) {\r
- NextEntry = ((LIST_ENTRY *) EndpointEntry)->ForwardLink;\r
- RemoveEntryList ((LIST_ENTRY *) EndpointEntry);\r
- gBS->FreePool (EndpointEntry);\r
- EndpointEntry = (ENDPOINT_DESC_LIST_ENTRY *) NextEntry;\r
- }\r
-\r
- NextEntry = ((LIST_ENTRY *) InterfaceEntry)->ForwardLink;\r
- RemoveEntryList ((LIST_ENTRY *) InterfaceEntry);\r
- gBS->FreePool (InterfaceEntry);\r
- InterfaceEntry = (INTERFACE_DESC_LIST_ENTRY *) NextEntry;\r
- }\r
-\r
- NextEntry = ((LIST_ENTRY *) ConfigEntry)->ForwardLink;\r
- RemoveEntryList ((LIST_ENTRY *) ConfigEntry);\r
- gBS->FreePool (ConfigEntry);\r
- ConfigEntry = (CONFIG_DESC_LIST_ENTRY *) NextEntry;\r
- }\r
-}\r