Per the UEFI specification, a device driver implementation should return EFI_UNSUPPORTED if the ChildHandle argument in EFI_COMPONENT_NAME2_PROTOCOL.GetControllerName() is not NULL. Signed-off-by: Dimitrije Pavlov <Dimitrije.Pavlov@arm.com> Reviewed-by: Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com> Reviewed-by: Sunny Wang <sunny.wang@arm.com>
		
			
				
	
	
		
			176 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
 | 
						|
  Component Name code for the virtio-net driver.
 | 
						|
 | 
						|
  Copyright (C) 2013, Red Hat, Inc.
 | 
						|
  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
 | 
						|
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include <Library/UefiLib.h>
 | 
						|
 | 
						|
#include "VirtioNet.h"
 | 
						|
 | 
						|
STATIC
 | 
						|
EFI_UNICODE_STRING_TABLE  mVirtioNetDriverNameTable[] = {
 | 
						|
  { "eng;en", L"Virtio Network Driver" },
 | 
						|
  { NULL,     NULL                     }
 | 
						|
};
 | 
						|
 | 
						|
STATIC
 | 
						|
EFI_UNICODE_STRING_TABLE  mVirtioNetControllerNameTable[] = {
 | 
						|
  { "eng;en", L"Virtio Network Device" },
 | 
						|
  { NULL,     NULL                     }
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
  Retrieves a Unicode string that is the user-readable name of the EFI Driver.
 | 
						|
 | 
						|
  @param  This       A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
 | 
						|
  @param  Language   A pointer to a three-character ISO 639-2 language
 | 
						|
                     identifier. This is the language of the driver name that
 | 
						|
                     that the caller is requesting, and it must match one of
 | 
						|
                     the languages specified in SupportedLanguages.  The number
 | 
						|
                     of languages supported by a driver is up to the driver
 | 
						|
                     writer.
 | 
						|
  @param  DriverName A pointer to the Unicode string to return.  This Unicode
 | 
						|
                     string is the name of the driver specified by This in the
 | 
						|
                     language specified by Language.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The Unicode string for the Driver specified by
 | 
						|
                                This and the language specified by Language was
 | 
						|
                                returned in DriverName.
 | 
						|
  @retval EFI_INVALID_PARAMETER Language is NULL.
 | 
						|
  @retval EFI_INVALID_PARAMETER DriverName is NULL.
 | 
						|
  @retval EFI_UNSUPPORTED       The driver specified by This does not support
 | 
						|
                                the language specified by Language.
 | 
						|
 | 
						|
**/
 | 
						|
STATIC
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
VirtioNetGetDriverName (
 | 
						|
  IN  EFI_COMPONENT_NAME_PROTOCOL  *This,
 | 
						|
  IN  CHAR8                        *Language,
 | 
						|
  OUT CHAR16                       **DriverName
 | 
						|
  )
 | 
						|
{
 | 
						|
  return (Language == NULL || DriverName == NULL) ?
 | 
						|
         EFI_INVALID_PARAMETER :
 | 
						|
         LookupUnicodeString2 (
 | 
						|
           Language,
 | 
						|
           This->SupportedLanguages,
 | 
						|
           mVirtioNetDriverNameTable,
 | 
						|
           DriverName,
 | 
						|
           (BOOLEAN)(This == &gVirtioNetComponentName)  // Iso639Language
 | 
						|
           );
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Retrieves a Unicode string that is the user readable name of the controller
 | 
						|
  that is being managed by an EFI Driver.
 | 
						|
 | 
						|
  @param  This             A pointer to the EFI_COMPONENT_NAME_PROTOCOL
 | 
						|
                           instance.
 | 
						|
  @param  ControllerHandle The handle of a controller that the driver specified
 | 
						|
                           by This is managing.  This handle specifies the
 | 
						|
                           controller whose name is to be returned.
 | 
						|
  @param  ChildHandle      The handle of the child controller to retrieve the
 | 
						|
                           name of.  This is an optional parameter that may be
 | 
						|
                           NULL.  It will be NULL for device drivers.  It will
 | 
						|
                           also be NULL for a bus drivers that wish to retrieve
 | 
						|
                           the name of the bus controller.  It will not be NULL
 | 
						|
                           for a bus driver that wishes to retrieve the name of
 | 
						|
                           a child controller.
 | 
						|
  @param  Language         A pointer to a three character ISO 639-2 language
 | 
						|
                           identifier.  This is the language of the controller
 | 
						|
                           name that the caller is requesting, and it must
 | 
						|
                           match one of the languages specified in
 | 
						|
                           SupportedLanguages.  The number of languages
 | 
						|
                           supported by a driver is up to the driver writer.
 | 
						|
  @param  ControllerName   A pointer to the Unicode string to return.  This
 | 
						|
                           Unicode string is the name of the controller
 | 
						|
                           specified by ControllerHandle and ChildHandle in the
 | 
						|
                           language specified by Language, from the point of
 | 
						|
                           view of the driver specified by This.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The Unicode string for the user-readable name
 | 
						|
                                in the language specified by Language for the
 | 
						|
                                driver specified by This was returned in
 | 
						|
                                DriverName.
 | 
						|
  @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
 | 
						|
  @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
 | 
						|
                                EFI_HANDLE.
 | 
						|
  @retval EFI_INVALID_PARAMETER Language is NULL.
 | 
						|
  @retval EFI_INVALID_PARAMETER ControllerName is NULL.
 | 
						|
  @retval EFI_UNSUPPORTED       The driver specified by This is not currently
 | 
						|
                                managing the controller specified by
 | 
						|
                                ControllerHandle and ChildHandle.
 | 
						|
  @retval EFI_UNSUPPORTED       The driver specified by This does not support
 | 
						|
                                the language specified by Language.
 | 
						|
 | 
						|
**/
 | 
						|
STATIC
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
VirtioNetGetControllerName (
 | 
						|
  IN  EFI_COMPONENT_NAME_PROTOCOL  *This,
 | 
						|
  IN  EFI_HANDLE                   ControllerHandle,
 | 
						|
  IN  EFI_HANDLE                   ChildHandle,
 | 
						|
  IN  CHAR8                        *Language,
 | 
						|
  OUT CHAR16                       **ControllerName
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS  Status;
 | 
						|
 | 
						|
  if ((ControllerHandle == NULL) || (Language == NULL) || (ControllerName == NULL)) {
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // This is a device driver, so ChildHandle must be NULL.
 | 
						|
  //
 | 
						|
  if (ChildHandle != NULL) {
 | 
						|
    return EFI_UNSUPPORTED;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // confirm that the device is managed by this driver, using the VirtIo
 | 
						|
  // Protocol
 | 
						|
  //
 | 
						|
  Status = EfiTestManagedDevice (
 | 
						|
             ControllerHandle,
 | 
						|
             gVirtioNetDriverBinding.DriverBindingHandle,
 | 
						|
             &gVirtioDeviceProtocolGuid
 | 
						|
             );
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // we don't give different names to the bus (= parent) handle and the
 | 
						|
  // child (= MAC) handle
 | 
						|
  //
 | 
						|
  return LookupUnicodeString2 (
 | 
						|
           Language,
 | 
						|
           This->SupportedLanguages,
 | 
						|
           mVirtioNetControllerNameTable,
 | 
						|
           ControllerName,
 | 
						|
           (BOOLEAN)(This == &gVirtioNetComponentName)  // Iso639Language
 | 
						|
           );
 | 
						|
}
 | 
						|
 | 
						|
EFI_COMPONENT_NAME_PROTOCOL  gVirtioNetComponentName = {
 | 
						|
  &VirtioNetGetDriverName,
 | 
						|
  &VirtioNetGetControllerName,
 | 
						|
  "eng" // SupportedLanguages, ISO 639-2 language codes
 | 
						|
};
 | 
						|
 | 
						|
EFI_COMPONENT_NAME2_PROTOCOL  gVirtioNetComponentName2 = {
 | 
						|
  (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)&VirtioNetGetDriverName,
 | 
						|
  (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)&VirtioNetGetControllerName,
 | 
						|
  "en" // SupportedLanguages, RFC 4646 language codes
 | 
						|
};
 |