Home | History | Annotate | Download | only in SnpDxe
      1 /** @file
      2     UEFI Component Name(2) protocol implementation for SnpDxe driver.
      3 
      4 Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
      5 This program and the accompanying materials are licensed
      6 and made available under the terms and conditions of the BSD License which
      7 accompanies this distribution. The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 
     16 #include "Snp.h"
     17 
     18 //
     19 // EFI Component Name Functions
     20 //
     21 /**
     22   Retrieves a Unicode string that is the user readable name of the driver.
     23 
     24   This function retrieves the user readable name of a driver in the form of a
     25   Unicode string. If the driver specified by This has a user readable name in
     26   the language specified by Language, then a pointer to the driver name is
     27   returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
     28   by This does not support the language specified by Language,
     29   then EFI_UNSUPPORTED is returned.
     30 
     31   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
     32                                 EFI_COMPONENT_NAME_PROTOCOL instance.
     33 
     34   @param  Language[in]          A pointer to a Null-terminated ASCII string
     35                                 array indicating the language. This is the
     36                                 language of the driver name that the caller is
     37                                 requesting, and it must match one of the
     38                                 languages specified in SupportedLanguages. The
     39                                 number of languages supported by a driver is up
     40                                 to the driver writer. Language is specified
     41                                 in RFC 4646 or ISO 639-2 language code format.
     42 
     43   @param  DriverName[out]       A pointer to the Unicode string to return.
     44                                 This Unicode string is the name of the
     45                                 driver specified by This in the language
     46                                 specified by Language.
     47 
     48   @retval EFI_SUCCESS           The Unicode string for the Driver specified by
     49                                 This and the language specified by Language was
     50                                 returned in DriverName.
     51 
     52   @retval EFI_INVALID_PARAMETER Language is NULL.
     53 
     54   @retval EFI_INVALID_PARAMETER DriverName is NULL.
     55 
     56   @retval EFI_UNSUPPORTED       The driver specified by This does not support
     57                                 the language specified by Language.
     58 
     59 **/
     60 EFI_STATUS
     61 EFIAPI
     62 SimpleNetworkComponentNameGetDriverName (
     63   IN  EFI_COMPONENT_NAME_PROTOCOL  *This,
     64   IN  CHAR8                        *Language,
     65   OUT CHAR16                       **DriverName
     66   );
     67 
     68 
     69 /**
     70   Retrieves a Unicode string that is the user readable name of the controller
     71   that is being managed by a driver.
     72 
     73   This function retrieves the user readable name of the controller specified by
     74   ControllerHandle and ChildHandle in the form of a Unicode string. If the
     75   driver specified by This has a user readable name in the language specified by
     76   Language, then a pointer to the controller name is returned in ControllerName,
     77   and EFI_SUCCESS is returned.  If the driver specified by This is not currently
     78   managing the controller specified by ControllerHandle and ChildHandle,
     79   then EFI_UNSUPPORTED is returned.  If the driver specified by This does not
     80   support the language specified by Language, then EFI_UNSUPPORTED is returned.
     81 
     82   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
     83                                 EFI_COMPONENT_NAME_PROTOCOL instance.
     84 
     85   @param  ControllerHandle[in]  The handle of a controller that the driver
     86                                 specified by This is managing.  This handle
     87                                 specifies the controller whose name is to be
     88                                 returned.
     89 
     90   @param  ChildHandle[in]       The handle of the child controller to retrieve
     91                                 the name of.  This is an optional parameter that
     92                                 may be NULL.  It will be NULL for device
     93                                 drivers.  It will also be NULL for a bus drivers
     94                                 that wish to retrieve the name of the bus
     95                                 controller.  It will not be NULL for a bus
     96                                 driver that wishes to retrieve the name of a
     97                                 child controller.
     98 
     99   @param  Language[in]          A pointer to a Null-terminated ASCII string
    100                                 array indicating the language.  This is the
    101                                 language of the driver name that the caller is
    102                                 requesting, and it must match one of the
    103                                 languages specified in SupportedLanguages. The
    104                                 number of languages supported by a driver is up
    105                                 to the driver writer. Language is specified in
    106                                 RFC 4646 or ISO 639-2 language code format.
    107 
    108   @param  ControllerName[out]   A pointer to the Unicode string to return.
    109                                 This Unicode string is the name of the
    110                                 controller specified by ControllerHandle and
    111                                 ChildHandle in the language specified by
    112                                 Language from the point of view of the driver
    113                                 specified by This.
    114 
    115   @retval EFI_SUCCESS           The Unicode string for the user readable name in
    116                                 the language specified by Language for the
    117                                 driver specified by This was returned in
    118                                 DriverName.
    119 
    120   @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
    121 
    122   @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
    123                                 EFI_HANDLE.
    124 
    125   @retval EFI_INVALID_PARAMETER Language is NULL.
    126 
    127   @retval EFI_INVALID_PARAMETER ControllerName is NULL.
    128 
    129   @retval EFI_UNSUPPORTED       The driver specified by This is not currently
    130                                 managing the controller specified by
    131                                 ControllerHandle and ChildHandle.
    132 
    133   @retval EFI_UNSUPPORTED       The driver specified by This does not support
    134                                 the language specified by Language.
    135 
    136 **/
    137 EFI_STATUS
    138 EFIAPI
    139 SimpleNetworkComponentNameGetControllerName (
    140   IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,
    141   IN  EFI_HANDLE                                      ControllerHandle,
    142   IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,
    143   IN  CHAR8                                           *Language,
    144   OUT CHAR16                                          **ControllerName
    145   );
    146 
    147 
    148 //
    149 // EFI Component Name Protocol
    150 //
    151 GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL  gSimpleNetworkComponentName = {
    152   SimpleNetworkComponentNameGetDriverName,
    153   SimpleNetworkComponentNameGetControllerName,
    154   "eng"
    155 };
    156 
    157 //
    158 // EFI Component Name 2 Protocol
    159 //
    160 GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gSimpleNetworkComponentName2 = {
    161   (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) SimpleNetworkComponentNameGetDriverName,
    162   (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) SimpleNetworkComponentNameGetControllerName,
    163   "en"
    164 };
    165 
    166 
    167 GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mSimpleNetworkDriverNameTable[] = {
    168   {
    169     "eng;en",
    170     L"Simple Network Protocol Driver"
    171   },
    172   {
    173     NULL,
    174     NULL
    175   }
    176 };
    177 
    178 GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gSimpleNetworkControllerNameTable = NULL;
    179 
    180 /**
    181   Retrieves a Unicode string that is the user readable name of the driver.
    182 
    183   This function retrieves the user readable name of a driver in the form of a
    184   Unicode string. If the driver specified by This has a user readable name in
    185   the language specified by Language, then a pointer to the driver name is
    186   returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
    187   by This does not support the language specified by Language,
    188   then EFI_UNSUPPORTED is returned.
    189 
    190   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
    191                                 EFI_COMPONENT_NAME_PROTOCOL instance.
    192 
    193   @param  Language[in]          A pointer to a Null-terminated ASCII string
    194                                 array indicating the language. This is the
    195                                 language of the driver name that the caller is
    196                                 requesting, and it must match one of the
    197                                 languages specified in SupportedLanguages. The
    198                                 number of languages supported by a driver is up
    199                                 to the driver writer. Language is specified
    200                                 in RFC 4646 or ISO 639-2 language code format.
    201 
    202   @param  DriverName[out]       A pointer to the Unicode string to return.
    203                                 This Unicode string is the name of the
    204                                 driver specified by This in the language
    205                                 specified by Language.
    206 
    207   @retval EFI_SUCCESS           The Unicode string for the Driver specified by
    208                                 This and the language specified by Language was
    209                                 returned in DriverName.
    210 
    211   @retval EFI_INVALID_PARAMETER Language is NULL.
    212 
    213   @retval EFI_INVALID_PARAMETER DriverName is NULL.
    214 
    215   @retval EFI_UNSUPPORTED       The driver specified by This does not support
    216                                 the language specified by Language.
    217 
    218 **/
    219 EFI_STATUS
    220 EFIAPI
    221 SimpleNetworkComponentNameGetDriverName (
    222   IN  EFI_COMPONENT_NAME_PROTOCOL  *This,
    223   IN  CHAR8                        *Language,
    224   OUT CHAR16                       **DriverName
    225   )
    226 {
    227   return LookupUnicodeString2 (
    228            Language,
    229            This->SupportedLanguages,
    230            mSimpleNetworkDriverNameTable,
    231            DriverName,
    232            (BOOLEAN)(This == &gSimpleNetworkComponentName)
    233            );
    234 }
    235 
    236 /**
    237   Update the component name for the Snp child handle.
    238 
    239   @param  Snp[in]                   A pointer to the EFI_SIMPLE_NETWORK_PROTOCOL.
    240 
    241 
    242   @retval EFI_SUCCESS               Update the ControllerNameTable of this instance successfully.
    243   @retval EFI_INVALID_PARAMETER     The input parameter is invalid.
    244 
    245 **/
    246 EFI_STATUS
    247 UpdateName (
    248   IN  EFI_SIMPLE_NETWORK_PROTOCOL   *Snp
    249   )
    250 {
    251   EFI_STATUS                       Status;
    252   CHAR16                           HandleName[80];
    253   UINTN                            OffSet;
    254   UINTN                            Index;
    255 
    256   if (Snp == NULL) {
    257     return EFI_INVALID_PARAMETER;
    258   }
    259 
    260   OffSet = 0;
    261   OffSet += UnicodeSPrint (
    262               HandleName,
    263               sizeof (HandleName),
    264               L"SNP (MAC="
    265               );
    266   for (Index = 0; Index < Snp->Mode->HwAddressSize; Index++) {
    267     OffSet += UnicodeSPrint (
    268                 HandleName + OffSet,
    269                 sizeof (HandleName) - OffSet * sizeof (CHAR16),
    270                 L"%02X-",
    271                 Snp->Mode->CurrentAddress.Addr[Index]
    272                 );
    273   }
    274   ASSERT (OffSet > 0);
    275   //
    276   // Remove the last '-'
    277   //
    278   OffSet--;
    279   OffSet += UnicodeSPrint (
    280               HandleName + OffSet,
    281               sizeof (HandleName) - OffSet * sizeof (CHAR16),
    282               L")"
    283               );
    284   if (gSimpleNetworkControllerNameTable != NULL) {
    285     FreeUnicodeStringTable (gSimpleNetworkControllerNameTable);
    286     gSimpleNetworkControllerNameTable = NULL;
    287   }
    288 
    289   Status = AddUnicodeString2 (
    290              "eng",
    291              gSimpleNetworkComponentName.SupportedLanguages,
    292              &gSimpleNetworkControllerNameTable,
    293              HandleName,
    294              TRUE
    295              );
    296   if (EFI_ERROR (Status)) {
    297     return Status;
    298   }
    299 
    300   return AddUnicodeString2 (
    301            "en",
    302            gSimpleNetworkComponentName2.SupportedLanguages,
    303            &gSimpleNetworkControllerNameTable,
    304            HandleName,
    305            FALSE
    306            );
    307 }
    308 
    309 /**
    310   Retrieves a Unicode string that is the user readable name of the controller
    311   that is being managed by a driver.
    312 
    313   This function retrieves the user readable name of the controller specified by
    314   ControllerHandle and ChildHandle in the form of a Unicode string. If the
    315   driver specified by This has a user readable name in the language specified by
    316   Language, then a pointer to the controller name is returned in ControllerName,
    317   and EFI_SUCCESS is returned.  If the driver specified by This is not currently
    318   managing the controller specified by ControllerHandle and ChildHandle,
    319   then EFI_UNSUPPORTED is returned.  If the driver specified by This does not
    320   support the language specified by Language, then EFI_UNSUPPORTED is returned.
    321   Currently not implemented.
    322 
    323   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
    324                                 EFI_COMPONENT_NAME_PROTOCOL instance.
    325 
    326   @param  ControllerHandle[in]  The handle of a controller that the driver
    327                                 specified by This is managing.  This handle
    328                                 specifies the controller whose name is to be
    329                                 returned.
    330 
    331   @param  ChildHandle[in]       The handle of the child controller to retrieve
    332                                 the name of.  This is an optional parameter that
    333                                 may be NULL.  It will be NULL for device
    334                                 drivers.  It will also be NULL for a bus drivers
    335                                 that wish to retrieve the name of the bus
    336                                 controller.  It will not be NULL for a bus
    337                                 driver that wishes to retrieve the name of a
    338                                 child controller.
    339 
    340   @param  Language[in]          A pointer to a Null-terminated ASCII string
    341                                 array indicating the language.  This is the
    342                                 language of the driver name that the caller is
    343                                 requesting, and it must match one of the
    344                                 languages specified in SupportedLanguages. The
    345                                 number of languages supported by a driver is up
    346                                 to the driver writer. Language is specified in
    347                                 RFC 4646 or ISO 639-2 language code format.
    348 
    349   @param  ControllerName[out]   A pointer to the Unicode string to return.
    350                                 This Unicode string is the name of the
    351                                 controller specified by ControllerHandle and
    352                                 ChildHandle in the language specified by
    353                                 Language from the point of view of the driver
    354                                 specified by This.
    355 
    356   @retval EFI_SUCCESS           The Unicode string for the user readable name in
    357                                 the language specified by Language for the
    358                                 driver specified by This was returned in
    359                                 DriverName.
    360 
    361   @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
    362 
    363   @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
    364                                 EFI_HANDLE.
    365 
    366   @retval EFI_INVALID_PARAMETER Language is NULL.
    367 
    368   @retval EFI_INVALID_PARAMETER ControllerName is NULL.
    369 
    370   @retval EFI_UNSUPPORTED       The driver specified by This is not currently
    371                                 managing the controller specified by
    372                                 ControllerHandle and ChildHandle.
    373 
    374   @retval EFI_UNSUPPORTED       The driver specified by This does not support
    375                                 the language specified by Language.
    376 
    377 **/
    378 EFI_STATUS
    379 EFIAPI
    380 SimpleNetworkComponentNameGetControllerName (
    381   IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,
    382   IN  EFI_HANDLE                                      ControllerHandle,
    383   IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,
    384   IN  CHAR8                                           *Language,
    385   OUT CHAR16                                          **ControllerName
    386   )
    387 {
    388   EFI_STATUS                    Status;
    389   EFI_SIMPLE_NETWORK_PROTOCOL   *Snp;
    390 
    391   if (ChildHandle != NULL) {
    392     return EFI_UNSUPPORTED;
    393   }
    394 
    395   //
    396   // Make sure this driver is currently managing ControllHandle
    397   //
    398   Status = EfiTestManagedDevice (
    399              ControllerHandle,
    400              gSimpleNetworkDriverBinding.DriverBindingHandle,
    401              &gEfiSimpleNetworkProtocolGuid
    402              );
    403   if (EFI_ERROR (Status)) {
    404     return Status;
    405   }
    406 
    407   //
    408   // Retrieve an instance of a produced protocol from ControllerHandle
    409   //
    410   Status = gBS->OpenProtocol (
    411                   ControllerHandle,
    412                   &gEfiSimpleNetworkProtocolGuid,
    413                   (VOID **)&Snp,
    414                   NULL,
    415                   NULL,
    416                   EFI_OPEN_PROTOCOL_GET_PROTOCOL
    417                   );
    418   if (EFI_ERROR (Status)) {
    419     return Status;
    420   }
    421   //
    422   // Update the component name for this child handle.
    423   //
    424   Status = UpdateName (Snp);
    425   if (EFI_ERROR (Status)) {
    426     return Status;
    427   }
    428 
    429   return LookupUnicodeString2 (
    430            Language,
    431            This->SupportedLanguages,
    432            gSimpleNetworkControllerNameTable,
    433            ControllerName,
    434            (BOOLEAN)(This == &gSimpleNetworkComponentName)
    435            );
    436 }
    437