/** @file\r
The module to produce Usb Bus PPI.\r
\r
-Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions\r
UINTN MemPages;\r
EFI_PHYSICAL_ADDRESS AllocateAddress;\r
PEI_USB_DEVICE *NewPeiUsbDevice;\r
+ UINTN InterfaceIndex;\r
+ UINTN EndpointIndex;\r
\r
\r
UsbIoPpi = &PeiUsbDevice->UsbIoPpi;\r
\r
PeiHubEnumeration (PeiServices, NewPeiUsbDevice, CurrentAddress);\r
}\r
- }\r
\r
+ for (InterfaceIndex = 1; InterfaceIndex < NewPeiUsbDevice->ConfigDesc->NumInterfaces; InterfaceIndex++) {\r
+ //\r
+ // Begin to deal with the new device\r
+ //\r
+ MemPages = sizeof (PEI_USB_DEVICE) / EFI_PAGE_SIZE + 1;\r
+ Status = PeiServicesAllocatePages (\r
+ EfiBootServicesCode,\r
+ MemPages,\r
+ &AllocateAddress\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ CopyMem ((VOID *)(UINTN)AllocateAddress, NewPeiUsbDevice, sizeof (PEI_USB_DEVICE));\r
+ NewPeiUsbDevice = (PEI_USB_DEVICE *) ((UINTN) AllocateAddress);\r
+ NewPeiUsbDevice->AllocateAddress = (UINTN) AllocateAddress;\r
+ NewPeiUsbDevice->UsbIoPpiList.Ppi = &NewPeiUsbDevice->UsbIoPpi;\r
+ NewPeiUsbDevice->InterfaceDesc = NewPeiUsbDevice->InterfaceDescList[InterfaceIndex];\r
+ for (EndpointIndex = 0; EndpointIndex < NewPeiUsbDevice->InterfaceDesc->NumEndpoints; EndpointIndex++) {\r
+ NewPeiUsbDevice->EndpointDesc[EndpointIndex] = NewPeiUsbDevice->EndpointDescList[InterfaceIndex][EndpointIndex];\r
+ }\r
+\r
+ Status = PeiServicesInstallPpi (&NewPeiUsbDevice->UsbIoPpiList);\r
+\r
+ if (NewPeiUsbDevice->InterfaceDesc->InterfaceClass == 0x09) {\r
+ NewPeiUsbDevice->IsHub = 0x1;\r
+\r
+ Status = PeiDoHubConfig (PeiServices, NewPeiUsbDevice);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ PeiHubEnumeration (PeiServices, NewPeiUsbDevice, CurrentAddress);\r
+ }\r
+ }\r
+ }\r
}\r
}\r
\r
UINTN MemPages;\r
EFI_PHYSICAL_ADDRESS AllocateAddress;\r
UINT8 CurrentAddress;\r
-\r
+ UINTN InterfaceIndex;\r
+ UINTN EndpointIndex;\r
\r
CurrentAddress = 0;\r
if (Usb2HcPpi != NULL) {\r
\r
PeiHubEnumeration (PeiServices, PeiUsbDevice, &CurrentAddress);\r
}\r
+\r
+ for (InterfaceIndex = 1; InterfaceIndex < PeiUsbDevice->ConfigDesc->NumInterfaces; InterfaceIndex++) {\r
+ //\r
+ // Begin to deal with the new device\r
+ //\r
+ MemPages = sizeof (PEI_USB_DEVICE) / EFI_PAGE_SIZE + 1;\r
+ Status = PeiServicesAllocatePages (\r
+ EfiBootServicesCode,\r
+ MemPages,\r
+ &AllocateAddress\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ CopyMem ((VOID *)(UINTN)AllocateAddress, PeiUsbDevice, sizeof (PEI_USB_DEVICE));\r
+ PeiUsbDevice = (PEI_USB_DEVICE *) ((UINTN) AllocateAddress);\r
+ PeiUsbDevice->AllocateAddress = (UINTN) AllocateAddress;\r
+ PeiUsbDevice->UsbIoPpiList.Ppi = &PeiUsbDevice->UsbIoPpi;\r
+ PeiUsbDevice->InterfaceDesc = PeiUsbDevice->InterfaceDescList[InterfaceIndex];\r
+ for (EndpointIndex = 0; EndpointIndex < PeiUsbDevice->InterfaceDesc->NumEndpoints; EndpointIndex++) {\r
+ PeiUsbDevice->EndpointDesc[EndpointIndex] = PeiUsbDevice->EndpointDescList[InterfaceIndex][EndpointIndex];\r
+ }\r
+\r
+ Status = PeiServicesInstallPpi (&PeiUsbDevice->UsbIoPpiList);\r
+\r
+ if (PeiUsbDevice->InterfaceDesc->InterfaceClass == 0x09) {\r
+ PeiUsbDevice->IsHub = 0x1;\r
+\r
+ Status = PeiDoHubConfig (PeiServices, PeiUsbDevice);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ PeiHubEnumeration (PeiServices, PeiUsbDevice, &CurrentAddress);\r
+ }\r
+ }\r
} else {\r
//\r
// Disconnect change happen, currently we don't support\r
DEBUG ((EFI_D_ERROR, "PeiUsbGetDescriptor First Failed\n"));\r
return Status;\r
}\r
+\r
//\r
// Get its default configuration and its first interface\r
//\r
PeiServices,\r
PeiUsbDevice\r
);\r
-\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
UINT8 *Ptr;\r
UINTN SkipBytes;\r
UINTN LengthLeft;\r
+ UINTN InterfaceIndex;\r
UINTN Index;\r
UINTN NumOfEndpoint;\r
\r
Ptr += sizeof (EFI_USB_CONFIG_DESCRIPTOR);\r
LengthLeft = ConfigDescLength - SkipBytes - sizeof (EFI_USB_CONFIG_DESCRIPTOR);\r
\r
- //\r
- // Get the first interface descriptor\r
- //\r
- Status = GetExpectedDescriptor (\r
- Ptr,\r
- LengthLeft,\r
- USB_DT_INTERFACE,\r
- (UINT8) sizeof (EFI_USB_INTERFACE_DESCRIPTOR),\r
- &SkipBytes\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- Ptr += SkipBytes;\r
- PeiUsbDevice->InterfaceDesc = (EFI_USB_INTERFACE_DESCRIPTOR *) Ptr;\r
+ for (InterfaceIndex = 0; InterfaceIndex < PeiUsbDevice->ConfigDesc->NumInterfaces; InterfaceIndex++) {\r
\r
- Ptr += sizeof (EFI_USB_INTERFACE_DESCRIPTOR);\r
- LengthLeft -= SkipBytes;\r
- LengthLeft -= sizeof (EFI_USB_INTERFACE_DESCRIPTOR);\r
-\r
- //\r
- // Parse all the endpoint descriptor within this interface\r
- //\r
- NumOfEndpoint = PeiUsbDevice->InterfaceDesc->NumEndpoints;\r
- ASSERT (NumOfEndpoint <= MAX_ENDPOINT);\r
-\r
- for (Index = 0; Index < NumOfEndpoint; Index++) {\r
//\r
- // Get the endpoint descriptor\r
+ // Get the interface descriptor\r
//\r
Status = GetExpectedDescriptor (\r
Ptr,\r
LengthLeft,\r
- USB_DT_ENDPOINT,\r
- (UINT8) sizeof (EFI_USB_ENDPOINT_DESCRIPTOR),\r
+ USB_DT_INTERFACE,\r
+ (UINT8) sizeof (EFI_USB_INTERFACE_DESCRIPTOR),\r
&SkipBytes\r
);\r
\r
}\r
\r
Ptr += SkipBytes;\r
- PeiUsbDevice->EndpointDesc[Index] = (EFI_USB_ENDPOINT_DESCRIPTOR *) Ptr;\r
+ if (InterfaceIndex == 0) {\r
+ PeiUsbDevice->InterfaceDesc = (EFI_USB_INTERFACE_DESCRIPTOR *) Ptr;\r
+ }\r
+ PeiUsbDevice->InterfaceDescList[InterfaceIndex] = (EFI_USB_INTERFACE_DESCRIPTOR *) Ptr;\r
\r
- Ptr += sizeof (EFI_USB_ENDPOINT_DESCRIPTOR);\r
+ Ptr += sizeof (EFI_USB_INTERFACE_DESCRIPTOR);\r
LengthLeft -= SkipBytes;\r
- LengthLeft -= sizeof (EFI_USB_ENDPOINT_DESCRIPTOR);\r
+ LengthLeft -= sizeof (EFI_USB_INTERFACE_DESCRIPTOR);\r
+\r
+ //\r
+ // Parse all the endpoint descriptor within this interface\r
+ //\r
+ NumOfEndpoint = PeiUsbDevice->InterfaceDescList[InterfaceIndex]->NumEndpoints;\r
+ ASSERT (NumOfEndpoint <= MAX_ENDPOINT);\r
+\r
+ for (Index = 0; Index < NumOfEndpoint; Index++) {\r
+ //\r
+ // Get the endpoint descriptor\r
+ //\r
+ Status = GetExpectedDescriptor (\r
+ Ptr,\r
+ LengthLeft,\r
+ USB_DT_ENDPOINT,\r
+ (UINT8) sizeof (EFI_USB_ENDPOINT_DESCRIPTOR),\r
+ &SkipBytes\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ Ptr += SkipBytes;\r
+ if (InterfaceIndex == 0) {\r
+ PeiUsbDevice->EndpointDesc[Index] = (EFI_USB_ENDPOINT_DESCRIPTOR *) Ptr;\r
+ }\r
+ PeiUsbDevice->EndpointDescList[InterfaceIndex][Index] = (EFI_USB_ENDPOINT_DESCRIPTOR *) Ptr;\r
+\r
+ Ptr += sizeof (EFI_USB_ENDPOINT_DESCRIPTOR);\r
+ LengthLeft -= SkipBytes;\r
+ LengthLeft -= sizeof (EFI_USB_ENDPOINT_DESCRIPTOR);\r
+ }\r
}\r
\r
return EFI_SUCCESS;\r