/** Create an interface for the descriptor IfDesc. Each device's configuration can have several interfaces. @param Device The device has the interface descriptor. @param IfDesc The interface descriptor. @return The created USB interface for the descriptor, or NULL. **/ USB_INTERFACE * UsbCreateInterface ( IN USB_DEVICE *Device, IN USB_INTERFACE_DESC *IfDesc ) { USB_DEVICE_PATH UsbNode; USB_INTERFACE *UsbIf; USB_INTERFACE *HubIf; EFI_STATUS Status; UsbIf = AllocateZeroPool (sizeof (USB_INTERFACE)); if (UsbIf == NULL) { return NULL; } UsbIf->Signature = USB_INTERFACE_SIGNATURE; UsbIf->Device = Device; UsbIf->IfDesc = IfDesc; // ASSERT (IfDesc->ActiveIndex < USB_MAX_INTERFACE_SETTING); if (IfDesc->ActiveIndex >= USB_MAX_INTERFACE_SETTING) { FreePool(UsbIf); return NULL; } UsbIf->IfSetting = IfDesc->Settings[IfDesc->ActiveIndex]; CopyMem ( &(UsbIf->UsbIo), &mUsbIoProtocol, sizeof (EFI_USB_IO_PROTOCOL) ); // // Install protocols for USBIO and device path // UsbNode.Header.Type = MESSAGING_DEVICE_PATH; UsbNode.Header.SubType = MSG_USB_DP; UsbNode.ParentPortNumber = Device->ParentPort; UsbNode.InterfaceNumber = UsbIf->IfSetting->Desc.InterfaceNumber; SetDevicePathNodeLength (&UsbNode.Header, sizeof (UsbNode)); HubIf = Device->ParentIf; // ASSERT (HubIf != NULL); if (!HubIf) { return NULL; } UsbIf->DevicePath = AppendDevicePathNode (HubIf->DevicePath, &UsbNode.Header); if (UsbIf->DevicePath == NULL) { // DEBUG ((EFI_D_ERROR, "UsbCreateInterface: failed to create device path\n")); DBG("UsbCreateInterface: failed to create device path\n"); Status = EFI_OUT_OF_RESOURCES; goto ON_ERROR; } Status = gBS->InstallMultipleProtocolInterfaces ( &UsbIf->Handle, &gEfiDevicePathProtocolGuid, UsbIf->DevicePath, &gEfiUsbIoProtocolGuid, &UsbIf->UsbIo, NULL ); if (EFI_ERROR (Status)) { // DEBUG ((EFI_D_ERROR, "UsbCreateInterface: failed to install UsbIo - %r\n", Status)); goto ON_ERROR; } // // Open USB Host Controller Protocol by Child // Status = UsbOpenHostProtoByChild (Device->Bus, UsbIf->Handle); if (EFI_ERROR (Status)) { gBS->UninstallMultipleProtocolInterfaces ( &UsbIf->Handle, &gEfiDevicePathProtocolGuid, UsbIf->DevicePath, &gEfiUsbIoProtocolGuid, &UsbIf->UsbIo, NULL ); // DEBUG ((EFI_D_ERROR, "UsbCreateInterface: failed to open host for child - %r\n", Status)); DBG("UsbCreateInterface: failed to open host for child - %r\n", Status); goto ON_ERROR; } return UsbIf; ON_ERROR: if (UsbIf->DevicePath != NULL) { FreePool (UsbIf->DevicePath); } FreePool (UsbIf); return NULL; }
STATIC USB_INTERFACE * UsbCreateInterface ( IN USB_DEVICE *Device, IN USB_INTERFACE_DESC *IfDesc ) /*++ Routine Description: Create an interface for the descriptor IfDesc. Each device's configuration can have several interfaces. Arguments: Device - The device has the interface descriptor IfDesc - The interface descriptor Returns: The created USB interface for the descriptor, or NULL. --*/ { USB_DEVICE_PATH UsbNode; USB_INTERFACE *UsbIf; USB_INTERFACE *HubIf; EFI_STATUS Status; UsbIf = EfiLibAllocateZeroPool (sizeof (USB_INTERFACE)); if (UsbIf == NULL) { return NULL; } UsbIf->Signature = USB_INTERFACE_SIGNATURE; UsbIf->Device = Device; UsbIf->IfDesc = IfDesc; UsbIf->IfSetting = IfDesc->Settings[IfDesc->ActiveIndex]; UsbIf->UsbIo = mUsbIoProtocol; // // Install protocols for USBIO and device path // UsbNode.Header.Type = MESSAGING_DEVICE_PATH; UsbNode.Header.SubType = MSG_USB_DP; UsbNode.ParentPortNumber = Device->ParentPort; UsbNode.InterfaceNumber = UsbIf->IfSetting->Desc.InterfaceNumber; SetDevicePathNodeLength (&UsbNode.Header, sizeof (UsbNode)); HubIf = Device->ParentIf; ASSERT (HubIf != NULL); UsbIf->DevicePath = EfiAppendDevicePathNode (HubIf->DevicePath, &UsbNode.Header); if (UsbIf->DevicePath == NULL) { USB_ERROR (("UsbCreateInterface: failed to create device path\n")); Status = EFI_OUT_OF_RESOURCES; goto ON_ERROR; } Status = gBS->InstallMultipleProtocolInterfaces ( &UsbIf->Handle, &gEfiDevicePathProtocolGuid, UsbIf->DevicePath, &gEfiUsbIoProtocolGuid, &UsbIf->UsbIo, NULL ); if (EFI_ERROR (Status)) { USB_ERROR (("UsbCreateInterface: failed to install UsbIo - %r\n", Status)); goto ON_ERROR; } // // Open USB Host Controller Protocol by Child // Status = UsbOpenHostProtoByChild (Device->Bus, UsbIf->Handle); if (EFI_ERROR (Status)) { gBS->UninstallMultipleProtocolInterfaces ( &UsbIf->Handle, &gEfiDevicePathProtocolGuid, UsbIf->DevicePath, &gEfiUsbIoProtocolGuid, &UsbIf->UsbIo, NULL ); USB_ERROR (("UsbCreateInterface: failed to open host for child - %r\n", Status)); goto ON_ERROR; } return UsbIf; ON_ERROR: if (UsbIf->DevicePath) { gBS->FreePool (UsbIf->DevicePath); } gBS->FreePool (UsbIf); return NULL; }