mnpdriver.c

来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 591 行 · 第 1/2 页

C
591
字号
/*++

Copyright (c) 2005 - 2006, Intel Corporation                                                         
All rights reserved. This program and the accompanying materials                          
are licensed and made available under the terms and conditions of the BSD License         
which accompanies this distribution.  The full text of the license may be found at        
http://opensource.org/licenses/bsd-license.php                                            
                                                                                          
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             

Module Name:

  MnpDriver.c

Abstract:

--*/

#include "MnpDriver.h"
#include "MnpDebug.h"
#include "MnpImpl.h"

EFI_DRIVER_BINDING_PROTOCOL gMnpDriverBinding = {
  MnpDriverBindingSupported,
  MnpDriverBindingStart,
  MnpDriverBindingStop,
  0x10,
  NULL,
  NULL
};

EFI_STATUS
EFIAPI
MnpDriverBindingSupported (
  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
  IN EFI_HANDLE                   ControllerHandle,
  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
  )
/*++

Routine Description:

  Test to see if this driver supports ControllerHandle. 

Arguments:

  This                - Protocol instance pointer.
  ControllerHandle    - Handle of device to test.
  RemainingDevicePath - Optional parameter use to pick a specific child device to start.

Returns:

  EFI_SUCCES          - This driver supports this device.
  EFI_ALREADY_STARTED - This driver is already running on this device.
  other               - This driver does not support this device.

--*/
{
  EFI_STATUS  Status;

  //
  // Test to see if MNP is already installed.
  //
  Status = gBS->OpenProtocol (
                  ControllerHandle,
                  &gEfiManagedNetworkServiceBindingProtocolGuid,
                  NULL,
                  This->DriverBindingHandle,
                  ControllerHandle,
                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL
                  );
  if (!EFI_ERROR (Status)) {

    return EFI_ALREADY_STARTED;
  }

  //
  // Test to see if SNP is installed.
  //
  Status = gBS->OpenProtocol (
                  ControllerHandle,
                  &gEfiSimpleNetworkProtocolGuid,
                  NULL,
                  This->DriverBindingHandle,
                  ControllerHandle,
                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL
                  );

  return Status;
}

EFI_STATUS
EFIAPI
MnpDriverBindingStart (
  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
  IN EFI_HANDLE                   ControllerHandle,
  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
  )
/*++

Routine Description:

  Start this driver on ControllerHandle.

Arguments:

  This                - Protocol instance pointer.
  ControllerHandle    - Handle of device to bind driver to.
  RemainingDevicePath - Optional parameter use to pick a specific child device to start.

Returns:

  EFI_SUCCES          - This driver is added to ControllerHandle.
  EFI_ALREADY_STARTED - This driver is already running on ControllerHandle.
  other               - This driver does not support this device.

--*/
{
  EFI_STATUS        Status;
  MNP_SERVICE_DATA  *MnpServiceData;
  BOOLEAN           MnpInitialized;

  MnpInitialized  = FALSE;

  MnpServiceData  = NetAllocateZeroPool (sizeof (MNP_SERVICE_DATA));
  if (MnpServiceData == NULL) {
    MNP_DEBUG_ERROR (("MnpDriverBindingStart(): Failed to allocate the "
      L"Mnp Service Data.\n"));

    return EFI_OUT_OF_RESOURCES;
  }

  //
  // Initialize the Mnp Service Data.
  //
  Status = MnpInitializeServiceData (MnpServiceData, This->DriverBindingHandle, ControllerHandle);
  if (EFI_ERROR (Status)) {

    MNP_DEBUG_ERROR (("MnpDriverBindingStart: MnpInitializeServiceData "
      L"failed, %r.\n",Status));
    goto ErrorExit;
  }

  MnpInitialized = TRUE;

  //
  // Install the MNP Service Binding Protocol.
  //
  Status = gBS->InstallMultipleProtocolInterfaces (
                  &ControllerHandle,
                  &gEfiManagedNetworkServiceBindingProtocolGuid,
                  &MnpServiceData->ServiceBinding,
                  NULL
                  );

ErrorExit:

  if (EFI_ERROR (Status)) {

    if (MnpInitialized) {
      //
      // Flush the Mnp Service Data.
      //
      MnpFlushServiceData (MnpServiceData);
    }

    //
    // Close the Simple Network Protocol.
    //
    gBS->CloseProtocol (
          ControllerHandle,
          &gEfiSimpleNetworkProtocolGuid,
          This->DriverBindingHandle,
          ControllerHandle
          );

    NetFreePool (MnpServiceData);
  }

  return Status;
}

EFI_STATUS
EFIAPI
MnpDriverBindingStop (
  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
  IN EFI_HANDLE                   ControllerHandle,
  IN UINTN                        NumberOfChildren,
  IN EFI_HANDLE                   *ChildHandleBuffer
  )
/*++

Routine Description:

  Stop this driver on ControllerHandle.

Arguments:

  This              - Protocol instance pointer.
  ControllerHandle  - Handle of device to stop driver on.
  NumberOfChildren  - Number of Handles in ChildHandleBuffer. If number of children is
                      zero stop the entire bus driver.
  ChildHandleBuffer - List of Child Handles to Stop.

Returns:

  EFI_SUCCES - This driver is removed ControllerHandle.
  other      - This driver was not removed from this device.

--*/
{
  EFI_STATUS                    Status;
  EFI_SERVICE_BINDING_PROTOCOL  *ServiceBinding;
  MNP_SERVICE_DATA              *MnpServiceData;
  MNP_INSTANCE_DATA             *Instance;

  //
  // Retrieve the MNP service binding protocol from the ControllerHandle.
  //
  Status = gBS->OpenProtocol (
                  ControllerHandle,
                  &gEfiManagedNetworkServiceBindingProtocolGuid,
                  (VOID **) &ServiceBinding,
                  This->DriverBindingHandle,
                  ControllerHandle,
                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
                  );
  if (EFI_ERROR (Status)) {

    MNP_DEBUG_ERROR (
      ("MnpDriverBindingStop: Locate MNP Service Binding ""Protocol failed, %r.\n",
      Status)
      );
    goto EXIT;
  }

  MnpServiceData = MNP_SERVICE_DATA_FROM_THIS (ServiceBinding);

  while (!NetListIsEmpty (&MnpServiceData->ChildrenList)) {
    //
    // Don't use NetListRemoveHead here, the remove opreration will be done
    // in ServiceBindingDestroyChild.
    //
    Instance = NET_LIST_HEAD (
                &MnpServiceData->ChildrenList,
                MNP_INSTANCE_DATA,
                InstEntry
                );

    ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle);
  }

  //
  // Uninstall the MNP Service Binding Protocol.
  //
  Status = gBS->UninstallMultipleProtocolInterfaces (
                  ControllerHandle,
                  &gEfiManagedNetworkServiceBindingProtocolGuid,
                  ServiceBinding,
                  NULL
                  );
  if (EFI_ERROR (Status)) {

    MNP_DEBUG_ERROR (("MnpDriverBindingStop: Uninstall MNP Service ""Binding Protocol failed, %r.\n"));
    goto EXIT;
  }

  //
  // Close the openned Snp protocol.
  //
  Status = gBS->CloseProtocol (
                  ControllerHandle,
                  &gEfiSimpleNetworkProtocolGuid,
                  This->DriverBindingHandle,
                  ControllerHandle
                  );
  if (EFI_ERROR (Status)) {

    MNP_DEBUG_ERROR (
      ("MnpDriverBindingStop: Close SNP Protocol failed "", %r.\n",
      Status)
      );
    goto EXIT;
  }

  //
  // Flush the Mnp service data.
  //
  MnpFlushServiceData (MnpServiceData);

  NetFreePool (MnpServiceData);

EXIT:

  return Status;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?