]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Delegate to child device's EFI_COMPONENT_NAME2_PROTOCOL, if present
authorMichael Brown <mcb30@ipxe.org>
Wed, 21 Nov 2012 02:37:55 +0000 (02:37 +0000)
committerMichael Brown <mcb30@ipxe.org>
Wed, 21 Nov 2012 03:26:45 +0000 (03:26 +0000)
EFI's device naming model requires drivers to provide names for child
devices.  Allow the driver's GetControllerName() method to delegate to
an instance of EFI_COMPONENT_NAME2_PROTOCOL installed on the child
device itself (if present); this allows the SNP device to expose its
own device name via the PCI driver's GetControllerName() method.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/interface/efi/efi_driver.c

index 476b3c3279322c9f6712be5ae6e7f020e40ef245..deb3cf2cd59c906c9ad0bb23de3d54bdabd4fe9b 100644 (file)
@@ -90,12 +90,29 @@ efi_driver_get_driver_name ( EFI_COMPONENT_NAME2_PROTOCOL *wtf,
  */
 static EFI_STATUS EFIAPI
 efi_driver_get_controller_name ( EFI_COMPONENT_NAME2_PROTOCOL *wtf __unused,
-                                EFI_HANDLE device __unused,
-                                EFI_HANDLE child __unused,
-                                CHAR8 *language __unused,
-                                CHAR16 **controller_name __unused ) {
+                                EFI_HANDLE device, EFI_HANDLE child,
+                                CHAR8 *language, CHAR16 **controller_name ) {
+       EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
+       union {
+               EFI_COMPONENT_NAME2_PROTOCOL *name2;
+               void *interface;
+       } name2;
+       EFI_STATUS efirc;
+
+       /* Delegate to the EFI_COMPONENT_NAME2_PROTOCOL instance
+        * installed on child handle, if present.
+        */
+       if ( ( child != NULL ) &&
+            ( ( efirc = bs->OpenProtocol (
+                         child, &efi_component_name2_protocol_guid,
+                         &name2.interface, NULL, NULL,
+                         EFI_OPEN_PROTOCOL_GET_PROTOCOL ) ) == 0 ) ) {
+               return name2.name2->GetControllerName ( name2.name2, device,
+                                                       child, language,
+                                                       controller_name );
+       }
 
-       /* Just let EFI use the default Device Path Name */
+       /* Otherwise, let EFI use the default Device Path Name */
        return EFI_UNSUPPORTED;
 }