mtftp4driver.c

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

C
674
字号
/*++

Copyright (c) 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:
 
  Mtftp4Driver.c
 
Abstract:
 
--*/

#include "Mtftp4Impl.h"

EFI_DRIVER_BINDING_PROTOCOL   gMtftp4DriverBinding = {
  Mtftp4DriverBindingSupported,
  Mtftp4DriverBindingStart,
  Mtftp4DriverBindingStop,
  0x10,
  NULL,
  NULL
};

EFI_SERVICE_BINDING_PROTOCOL  gMtftp4ServiceBindingTemplete = {
  Mtftp4ServiceBindingCreateChild,
  Mtftp4ServiceBindingDestroyChild
};

EFI_DRIVER_ENTRY_POINT (Mtftp4DriverEntryPoint)

EFI_STATUS
EFIAPI
Mtftp4DriverEntryPoint (
  IN EFI_HANDLE             ImageHandle,
  IN EFI_SYSTEM_TABLE       *SystemTable
  )
/*++

Routine Description:

  The driver entry point which installs multiple protocols to the ImageHandle.

Arguments:

  ImageHandle - The MTFTP's image handle
  SystemTable - The system table

Returns:

  EFI_SUCCESS - The handles are successfully installed on the image. Otherwise
  some EFI_ERROR.

--*/
{
  return NetLibInstallAllDriverProtocols (
           ImageHandle,
           SystemTable,
           &gMtftp4DriverBinding,
           ImageHandle,
           &gMtftp4ComponentName,
           NULL,
           NULL
           );
}

EFI_STATUS
Mtftp4DriverBindingSupported (
  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
  IN EFI_HANDLE                     Controller,
  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
  )
/*++

Routine Description:

  Test whether MTFTP driver support this controller. 

Arguments:

  This                - The MTFTP driver binding instance
  Controller          - The controller to test
  RemainingDevicePath - The remaining device path

Returns:

  EFI_SUCCESS - The controller has UDP service binding protocol
                installed, MTFTP can support it.
  Others      - MTFTP can't support the controller.
  
--*/
{
  EFI_STATUS  Status;

  Status = gBS->OpenProtocol (
                  Controller,
                  &gEfiUdp4ServiceBindingProtocolGuid,
                  NULL,
                  This->DriverBindingHandle,
                  Controller,
                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL
                  );

  return Status;
}

EFI_STATUS
Mtftp4ConfigNullUdp (
  IN UDP_IO_PORT            *UdpIo,
  IN VOID                   *Context
  )
/*++

Routine Description:

  Config a NULL UDP that is used to keep the connection between UDP 
  and MTFTP. Just leave the Udp child unconfigured. When UDP is 
  unloaded, MTFTP will be informed with DriverBinding Stop.

Arguments:

  UdpIo   - The UDP port to configure
  Context - The opaque parameter to the callback

Returns:

  EFI_SUCCESS - It always return EFI_SUCCESS directly.

--*/
{
  return EFI_SUCCESS;
}

EFI_STATUS
Mtftp4CreateService (
  IN  EFI_HANDLE            Controller,
  IN  EFI_HANDLE            Image,
  OUT MTFTP4_SERVICE        **Service
  )
/*++

Routine Description:

  Create then initialize a MTFTP service binding instance. 

Arguments:

  Controller  - The controller to install the MTFTP service binding on
  Image       - The driver binding image of the MTFTP driver
  Service     - The variable to receive the created service binding instance.

Returns:

  EFI_OUT_OF_RESOURCES - Failed to allocate resource to create the instance
  EFI_DEVICE_ERROR     - Failed to create a NULL UDP port to keep connection 
                         with UDP.
  EFI_SUCCESS          - The service instance is created for the controller.

--*/
{
  MTFTP4_SERVICE            *MtftpSb;
  EFI_STATUS                Status;

  *Service  = NULL;
  MtftpSb   = NetAllocatePool (sizeof (MTFTP4_SERVICE));

  if (MtftpSb == NULL) {
    return EFI_OUT_OF_RESOURCES;
  }

  MtftpSb->Signature      = MTFTP4_SERVICE_SIGNATURE;
  MtftpSb->ServiceBinding = gMtftp4ServiceBindingTemplete;
  MtftpSb->InDestory      = FALSE;
  MtftpSb->ChildrenNum    = 0;
  NetListInit (&MtftpSb->Children);

  MtftpSb->Timer          = NULL;
  MtftpSb->TimeToGetMap   = 0;
  MtftpSb->Controller     = Controller;
  MtftpSb->Image          = Image;
  MtftpSb->ConnectUdp     = NULL;

  //
  // Create the timer and a udp to be notified when UDP is uninstalled
  //
  Status = gBS->CreateEvent (
                  EFI_EVENT_NOTIFY_SIGNAL | EFI_EVENT_TIMER,
                  EFI_TPL_CALLBACK,
                  Mtftp4OnTimerTick,
                  MtftpSb,
                  &MtftpSb->Timer
                  );

  if (EFI_ERROR (Status)) {
    NetFreePool (MtftpSb);
    return Status;
  }

  MtftpSb->ConnectUdp = UdpIoCreatePort (Controller, Image, Mtftp4ConfigNullUdp, NULL);

  if (MtftpSb->ConnectUdp == NULL) {
    gBS->CloseEvent (MtftpSb->Timer);
    NetFreePool (MtftpSb);
    return EFI_DEVICE_ERROR;
  }

  *Service = MtftpSb;
  return EFI_SUCCESS;
}

VOID
Mtftp4CleanService (
  IN MTFTP4_SERVICE     *MtftpSb
  )
/*++

Routine Description:

  Release all the resource used the MTFTP service binding instance.

Arguments:

  MtftpSb - The MTFTP service binding instance.

Returns:

  None

--*/
{
  UdpIoFreePort (MtftpSb->ConnectUdp);
  gBS->CloseEvent (MtftpSb->Timer);
}

EFI_STATUS
Mtftp4DriverBindingStart (
  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
  IN EFI_HANDLE                   Controller,
  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
  )
/*++

Routine Description:

  Start the MTFTP driver on this controller. MTFTP driver will
  install a MTFTP SERVICE BINDING protocol on the supported 
  controller, which can be used to create/destroy MTFTP children.

Arguments:

  This                - The MTFTP driver binding protocol.
  Controller          - The controller to manage.
  RemainingDevicePath - Remaining device path.

Returns:

  EFI_ALREADY_STARTED - The MTFTP service binding protocol has been started 
                        on the controller.
  EFI_SUCCESS         - The MTFTP service binding is installed on the controller.

--*/
{
  MTFTP4_SERVICE            *MtftpSb;
  EFI_STATUS                Status;

  //
  // Directly return if driver is already running.
  //
  Status = gBS->OpenProtocol (
                  Controller,
                  &gEfiMtftp4ServiceBindingProtocolGuid,
                  NULL,
                  This->DriverBindingHandle,
                  Controller,
                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL
                  );

  if (Status == EFI_SUCCESS) {
    return EFI_ALREADY_STARTED;
  }

  Status = Mtftp4CreateService (Controller, This->DriverBindingHandle, &MtftpSb);

  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = gBS->SetTimer (MtftpSb->Timer, TimerPeriodic, TICKS_PER_SECOND);

  if (EFI_ERROR (Status)) {
    goto ON_ERROR;
  }
  
  //
  // Install the Mtftp4ServiceBinding Protocol onto Controller
  //
  Status = gBS->InstallMultipleProtocolInterfaces (
                  &Controller,
                  &gEfiMtftp4ServiceBindingProtocolGuid,
                  &MtftpSb->ServiceBinding,
                  NULL
                  );

  if (EFI_ERROR (Status)) {
    goto ON_ERROR;
  }

  return EFI_SUCCESS;

ON_ERROR:
  Mtftp4CleanService (MtftpSb);
  NetFreePool (MtftpSb);

  return Status;
}

EFI_STATUS
Mtftp4DriverBindingStop (
  IN  EFI_DRIVER_BINDING_PROTOCOL *This,
  IN  EFI_HANDLE                  Controller,
  IN  UINTN                       NumberOfChildren,
  IN  EFI_HANDLE                  *ChildHandleBuffer
  )
/*++

Routine Description:

  Stop the MTFTP driver on controller. The controller is a UDP 
  child handle.

Arguments:

⌨️ 快捷键说明

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