]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/MnpDxe/MnpDriver.c
Change the file headers and some function comments.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / MnpDxe / MnpDriver.c
index 814566ec56c647213fec7e7494d66b0d4f7b1f49..d4aaac33bd716aa8bd1523ea188d3f4f4627a288 100644 (file)
@@ -1,25 +1,18 @@
 /** @file\r
+    Implementation of driver entry point and driver binding protocol.\r
 \r
-Copyright (c) 2005 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
+Copyright (c) 2005 - 2008, Intel Corporation. <BR> \r
+All rights reserved. This program and the accompanying materials are licensed \r
+and made available under the terms and conditions of the BSD License which \r
+accompanies this distribution. The full text of the license may be found at \r
+http://opensource.org/licenses/bsd-license.php \r
 \r
 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
-Module Name:\r
-\r
-  MnpDriver.c\r
-\r
-Abstract:\r
-\r
-\r
 **/\r
 \r
 #include "MnpDriver.h"\r
-#include "MnpDebug.h"\r
 #include "MnpImpl.h"\r
 \r
 \r
@@ -32,18 +25,22 @@ EFI_DRIVER_BINDING_PROTOCOL gMnpDriverBinding = {
   NULL\r
 };\r
 \r
-\r
 /**\r
-  Test to see if this driver supports ControllerHandle.\r
-\r
-  @param  This                   Protocol instance pointer.\r
-  @param  ControllerHandle       Handle of device to test.\r
-  @param  RemainingDevicePath    Optional parameter use to pick a specific child\r
-                                 device to start.\r
-\r
-  @retval EFI_SUCCES             This driver supports this device.\r
-  @retval EFI_ALREADY_STARTED    This driver is already running on this device.\r
-  @retval other                  This driver does not support this device.\r
+  Test to see if this driver supports ControllerHandle. This service\r
+  is called by the EFI boot service ConnectController(). In\r
+  order to make drivers as small as possible, there are a few calling\r
+  restrictions for this service. ConnectController() must\r
+  follow these calling restrictions. If any other agent wishes to call\r
+  Supported() it must also follow these calling restrictions.\r
+\r
+  @param  This                Protocol instance pointer.\r
+  @param  ControllerHandle    Handle of device to test\r
+  @param  RemainingDevicePath Optional parameter use to pick a specific child\r
+                              device to start.\r
+\r
+  @retval EFI_SUCCESS         This driver supports this device\r
+  @retval EFI_ALREADY_STARTED This driver is already running on this device\r
+  @retval other               This driver does not support this device\r
 \r
 **/\r
 EFI_STATUS\r
@@ -54,7 +51,8 @@ MnpDriverBindingSupported (
   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL\r
   )\r
 {\r
-  EFI_STATUS  Status;\r
+  EFI_STATUS                   Status;\r
+  EFI_SIMPLE_NETWORK_PROTOCOL  *Snp;\r
 \r
   //\r
   // Test to see if MNP is already installed.\r
@@ -68,38 +66,55 @@ MnpDriverBindingSupported (
                   EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
                   );\r
   if (!EFI_ERROR (Status)) {\r
-\r
     return EFI_ALREADY_STARTED;\r
   }\r
 \r
   //\r
-  // Test to see if SNP is installed.\r
+  // Test to open the Simple Network protocol BY_DRIVER.\r
   //\r
   Status = gBS->OpenProtocol (\r
                   ControllerHandle,\r
                   &gEfiSimpleNetworkProtocolGuid,\r
-                  NULL,\r
+                  (VOID **) &Snp,\r
                   This->DriverBindingHandle,\r
                   ControllerHandle,\r
-                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
+                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
                   );\r
 \r
-  return Status;\r
-}\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
 \r
+  //\r
+  // Close the openned SNP protocol.\r
+  //\r
+  gBS->CloseProtocol (\r
+         ControllerHandle,\r
+         &gEfiSimpleNetworkProtocolGuid,\r
+         This->DriverBindingHandle,\r
+         ControllerHandle\r
+         );\r
 \r
-/**\r
-  Start this driver on ControllerHandle.\r
+  return EFI_SUCCESS;\r
+}\r
 \r
-  @param  This                   Protocol instance pointer.\r
-  @param  ControllerHandle       Handle of device to bind driver to.\r
-  @param  RemainingDevicePath    Optional parameter use to pick a specific child\r
-                                 device to start.\r
 \r
-  @retval EFI_SUCCES             This driver is added to ControllerHandle.\r
-  @retval EFI_ALREADY_STARTED    This driver is already running on\r
-                                 ControllerHandle.\r
-  @retval other                  This driver does not support this device.\r
+/**\r
+  Start this driver on ControllerHandle. This service is called by the\r
+  EFI boot service ConnectController(). In order to make\r
+  drivers as small as possible, there are a few calling restrictions for\r
+  this service. ConnectController() must follow these\r
+  calling restrictions. If any other agent wishes to call Start() it\r
+  must also follow these calling restrictions.\r
+\r
+  @param  This                 Protocol instance pointer.\r
+  @param  ControllerHandle     Handle of device to bind driver to.\r
+  @param  RemainingDevicePath  Optional parameter use to pick a specific child\r
+                               device to start.\r
+\r
+  @retval EFI_SUCCESS          This driver is added to ControllerHandle\r
+  @retval EFI_ALREADY_STARTED  This driver is already running on ControllerHandle\r
+  @retval other                This driver does not support this device\r
 \r
 **/\r
 EFI_STATUS\r
@@ -116,10 +131,9 @@ MnpDriverBindingStart (
 \r
   MnpInitialized  = FALSE;\r
 \r
-  MnpServiceData  = NetAllocateZeroPool (sizeof (MNP_SERVICE_DATA));\r
+  MnpServiceData  = AllocateZeroPool (sizeof (MNP_SERVICE_DATA));\r
   if (MnpServiceData == NULL) {\r
-    MNP_DEBUG_ERROR (("MnpDriverBindingStart(): Failed to allocate the "\r
-      L"Mnp Service Data.\n"));\r
+    DEBUG ((EFI_D_ERROR, "MnpDriverBindingStart(): Failed to allocate the Mnp Service Data.\n"));\r
 \r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
@@ -130,8 +144,7 @@ MnpDriverBindingStart (
   Status = MnpInitializeServiceData (MnpServiceData, This->DriverBindingHandle, ControllerHandle);\r
   if (EFI_ERROR (Status)) {\r
 \r
-    MNP_DEBUG_ERROR (("MnpDriverBindingStart: MnpInitializeServiceData "\r
-      L"failed, %r.\n",Status));\r
+    DEBUG ((EFI_D_ERROR, "MnpDriverBindingStart: MnpInitializeServiceData failed, %r.\n",Status));\r
     goto ErrorExit;\r
   }\r
 \r
@@ -155,37 +168,31 @@ ErrorExit:
       //\r
       // Flush the Mnp Service Data.\r
       //\r
-      MnpFlushServiceData (MnpServiceData);\r
+      MnpFlushServiceData (MnpServiceData, This->DriverBindingHandle);\r
     }\r
 \r
-    //\r
-    // Close the Simple Network Protocol.\r
-    //\r
-    gBS->CloseProtocol (\r
-          ControllerHandle,\r
-          &gEfiSimpleNetworkProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          ControllerHandle\r
-          );\r
-\r
-    NetFreePool (MnpServiceData);\r
+    gBS->FreePool (MnpServiceData);\r
   }\r
 \r
   return Status;\r
 }\r
 \r
-\r
 /**\r
-  Stop this driver on ControllerHandle.\r
-\r
-  @param  This                   Protocol instance pointer.\r
-  @param  ControllerHandle       Handle of device to stop driver on.\r
-  @param  NumberOfChildren       Number of Handles in ChildHandleBuffer. If number\r
-                                 of children is zero stop the entire bus driver.\r
-  @param  ChildHandleBuffer      List of Child Handles to Stop.\r
-\r
-  @retval EFI_SUCCES             This driver is removed ControllerHandle.\r
-  @retval other                  This driver was not removed from this device.\r
+  Stop this driver on ControllerHandle. This service is called by the\r
+  EFI boot service DisconnectController(). In order to\r
+  make drivers as small as possible, there are a few calling\r
+  restrictions for this service. DisconnectController()\r
+  must follow these calling restrictions. If any other agent wishes\r
+  to call Stop() it must also follow these calling restrictions.\r
+  \r
+  @param  This              Protocol instance pointer.\r
+  @param  ControllerHandle  Handle of device to stop driver on\r
+  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of\r
+                            children is zero stop the entire bus driver.\r
+  @param  ChildHandleBuffer List of Child Handles to Stop.\r
+\r
+  @retval EFI_SUCCESS       This driver is removed ControllerHandle\r
+  @retval other             This driver was not removed from this device\r
 \r
 **/\r
 EFI_STATUS\r
@@ -215,68 +222,49 @@ MnpDriverBindingStop (
                   );\r
   if (EFI_ERROR (Status)) {\r
 \r
-    MNP_DEBUG_ERROR (\r
-      ("MnpDriverBindingStop: Locate MNP Service Binding Protocol failed, %r.\n",\r
+    DEBUG (\r
+      (EFI_D_ERROR,\r
+      "MnpDriverBindingStop: Locate MNP Service Binding Protocol failed, %r.\n",\r
       Status)\r
       );\r
-    goto EXIT;\r
+    return EFI_DEVICE_ERROR;\r
   }\r
 \r
   MnpServiceData = MNP_SERVICE_DATA_FROM_THIS (ServiceBinding);\r
 \r
-  while (!NetListIsEmpty (&MnpServiceData->ChildrenList)) {\r
+  if (NumberOfChildren == 0) {\r
     //\r
-    // Don't use NetListRemoveHead here, the remove opreration will be done\r
-    // in ServiceBindingDestroyChild.\r
+    // Uninstall the MNP Service Binding Protocol.\r
     //\r
-    Instance = NET_LIST_HEAD (\r
-                &MnpServiceData->ChildrenList,\r
-                MNP_INSTANCE_DATA,\r
-                InstEntry\r
-                );\r
-\r
-    ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle);\r
-  }\r
-\r
-  //\r
-  // Uninstall the MNP Service Binding Protocol.\r
-  //\r
-  Status = gBS->UninstallMultipleProtocolInterfaces (\r
-                  ControllerHandle,\r
-                  &gEfiManagedNetworkServiceBindingProtocolGuid,\r
-                  ServiceBinding,\r
-                  NULL\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
+    gBS->UninstallMultipleProtocolInterfaces (\r
+           ControllerHandle,\r
+           &gEfiManagedNetworkServiceBindingProtocolGuid,\r
+           ServiceBinding,\r
+           NULL\r
+           );\r
 \r
-    MNP_DEBUG_ERROR (("MnpDriverBindingStop: Uninstall MNP Service Binding Protocol failed, %r.\n"));\r
-    goto EXIT;\r
-  }\r
+    //\r
+    // Flush the Mnp service data.\r
+    //\r
+    MnpFlushServiceData (MnpServiceData, This->DriverBindingHandle);\r
 \r
-  //\r
-  // Close the openned Snp protocol.\r
-  //\r
-  Status = gBS->CloseProtocol (\r
-                  ControllerHandle,\r
-                  &gEfiSimpleNetworkProtocolGuid,\r
-                  This->DriverBindingHandle,\r
-                  ControllerHandle\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
+    gBS->FreePool (MnpServiceData);\r
+  } else {\r
+    while (!IsListEmpty (&MnpServiceData->ChildrenList)) {\r
+      //\r
+      // Don't use NetListRemoveHead here, the remove opreration will be done\r
+      // in ServiceBindingDestroyChild.\r
+      //\r
+      Instance = NET_LIST_HEAD (\r
+                   &MnpServiceData->ChildrenList,\r
+                   MNP_INSTANCE_DATA,\r
+                   InstEntry\r
+                   );\r
 \r
-    MNP_DEBUG_ERROR (("MnpDriverBindingStop: Close SNP Protocol failed, %r.\n", Status));\r
-    goto EXIT;\r
+      ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle);\r
+    }\r
   }\r
 \r
-  //\r
-  // Flush the Mnp service data.\r
-  //\r
-  MnpFlushServiceData (MnpServiceData);\r
-\r
-  NetFreePool (MnpServiceData);\r
-\r
-EXIT:\r
-\r
   return Status;\r
 }\r
 \r
@@ -290,10 +278,10 @@ EXIT:
                                  not NULL, then the I/O services are  added to the\r
                                  existing child handle.\r
 \r
-  @retval EFI_SUCCES             The child handle was created with the I/O\r
-                                 services.\r
-  @retval EFI_OUT_OF_RESOURCES   There are not enough resources availabe to create\r
-                                 the child.\r
+  @retval EFI_SUCCES             The protocol was added to ChildHandle. \r
+  @retval EFI_INVALID_PARAMETER  ChildHandle is NULL. \r
+  @retval EFI_OUT_OF_RESOURCES   There are not enough resources availabe to \r
+                                 create the child.\r
   @retval other                  The child handle was not created.\r
 \r
 **/\r
@@ -301,7 +289,7 @@ EFI_STATUS
 EFIAPI\r
 MnpServiceBindingCreateChild (\r
   IN EFI_SERVICE_BINDING_PROTOCOL  *This,\r
-  IN EFI_HANDLE                    *ChildHandle\r
+  IN OUT EFI_HANDLE                *ChildHandle\r
   )\r
 {\r
   EFI_STATUS         Status;\r
@@ -320,10 +308,10 @@ MnpServiceBindingCreateChild (
   //\r
   // Allocate buffer for the new instance.\r
   //\r
-  Instance = NetAllocateZeroPool (sizeof (MNP_INSTANCE_DATA));\r
+  Instance = AllocateZeroPool (sizeof (MNP_INSTANCE_DATA));\r
   if (Instance == NULL) {\r
 \r
-    MNP_DEBUG_ERROR (("MnpServiceBindingCreateChild: Faild to allocate memory for the new instance.\n"));\r
+    DEBUG ((EFI_D_ERROR, "MnpServiceBindingCreateChild: Faild to allocate memory for the new instance.\n"));\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
@@ -340,8 +328,9 @@ MnpServiceBindingCreateChild (
                   );\r
   if (EFI_ERROR (Status)) {\r
 \r
-    MNP_DEBUG_ERROR (\r
-      ("MnpServiceBindingCreateChild: Failed to install the MNP protocol, %r.\n",\r
+    DEBUG (\r
+      (EFI_D_ERROR,\r
+      "MnpServiceBindingCreateChild: Failed to install the MNP protocol, %r.\n",\r
       Status)\r
       );\r
     goto ErrorExit;\r
@@ -367,12 +356,12 @@ MnpServiceBindingCreateChild (
   //\r
   // Add the child instance into ChildrenList.\r
   //\r
-  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
-  NetListInsertTail (&MnpServiceData->ChildrenList, &Instance->InstEntry);\r
+  InsertTailList (&MnpServiceData->ChildrenList, &Instance->InstEntry);\r
   MnpServiceData->ChildrenNumber++;\r
 \r
-  NET_RESTORE_TPL (OldTpl);\r
+  gBS->RestoreTPL (OldTpl);\r
 \r
 ErrorExit:\r
 \r
@@ -387,7 +376,7 @@ ErrorExit:
             );\r
     }\r
 \r
-    NetFreePool (Instance);\r
+    gBS->FreePool (Instance);\r
   }\r
 \r
   return Status;\r
@@ -396,17 +385,22 @@ ErrorExit:
 \r
 /**\r
   Destroys a child handle with a set of I/O services.\r
-\r
-  @param  This                   Protocol instance pointer.\r
+   \r
+  The DestroyChild() function does the opposite of CreateChild(). It removes a \r
+  protocol that was installed by CreateChild() from ChildHandle. If the removed \r
+  protocol is the last protocol on ChildHandle, then ChildHandle is destroyed. \r
+   \r
+  @param  This                   Pointer to the EFI_SERVICE_BINDING_PROTOCOL \r
+                                 instance.\r
   @param  ChildHandle            Handle of the child to destroy.\r
 \r
-  @retval EFI_SUCCES             The I/O services were removed from the child\r
-                                 handle.\r
-  @retval EFI_UNSUPPORTED        The child handle does not support the I/O services\r
-                                  that are being removed.\r
-  @retval EFI_INVALID_PARAMETER  Child handle is not a valid EFI Handle.\r
-  @retval EFI_ACCESS_DENIED      The child handle could not be destroyed because\r
-                                 its  I/O services are being used.\r
+  @retval EFI_SUCCES             The protocol was removed from ChildHandle. \r
+  @retval EFI_UNSUPPORTED        ChildHandle does not support the protocol that\r
+                                 is being removed.\r
+  @retval EFI_INVALID_PARAMETER  ChildHandle is not a valid UEFI handle.\r
+  @retval EFI_ACCESS_DENIED      The protocol could not be removed from the\r
+                                 ChildHandle because its services are being\r
+                                 used.\r
   @retval other                  The child handle was not destroyed.\r
 \r
 **/\r
@@ -482,8 +476,9 @@ MnpServiceBindingDestroyChild (
                   );\r
   if (EFI_ERROR (Status)) {\r
 \r
-    MNP_DEBUG_ERROR (\r
-      ("MnpServiceBindingDestroyChild: Failed to uninstall the ManagedNetwork protocol, %r.\n",\r
+    DEBUG (\r
+      (EFI_D_ERROR,\r
+      "MnpServiceBindingDestroyChild: Failed to uninstall the ManagedNetwork protocol, %r.\n",\r
       Status)\r
       );\r
 \r
@@ -491,7 +486,7 @@ MnpServiceBindingDestroyChild (
     return Status;\r
   }\r
 \r
-  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
   //\r
   // Reset the configuration.\r
@@ -511,41 +506,34 @@ MnpServiceBindingDestroyChild (
   //\r
   // Remove this instance from the ChildrenList.\r
   //\r
-  NetListRemoveEntry (&Instance->InstEntry);\r
+  RemoveEntryList (&Instance->InstEntry);\r
   MnpServiceData->ChildrenNumber--;\r
 \r
-  NET_RESTORE_TPL (OldTpl);\r
+  gBS->RestoreTPL (OldTpl);\r
 \r
-  NetFreePool (Instance);\r
+  gBS->FreePool (Instance);\r
 \r
   return Status;\r
 }\r
 \r
+/**\r
+  The entry point for Mnp driver which installs the driver binding and component\r
+  name protocol on its ImageHandle.\r
+\r
+  @param  ImageHandle   The image handle of the driver.\r
+  @param  SystemTable   The system table.\r
 \r
+  @retval EFI_SUCCES       The driver binding and component name protocols are \r
+                           successfully installed.\r
+  @retval other            failed.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 MnpDriverEntryPoint (\r
   IN EFI_HANDLE        ImageHandle,\r
   IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  The entry point for Mnp driver which installs the driver binding and component name\r
-  protocol on its ImageHandle.\r
-\r
-Arguments:\r
-\r
-  ImageHandle - The image handle of the driver.\r
-  SystemTable - The system table.\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS - If the driver binding and component name protocols are successfully\r
-                installed, otherwise if failed.\r
-\r
---*/\r
 {\r
   return EfiLibInstallDriverBindingComponentName2 (\r
            ImageHandle,\r