Home | History | Annotate | Download | only in VirtioNetDxe
      1 /** @file
      2 
      3   Implementation of the SNP.Shutdown() function and its private helpers if any.
      4 
      5   Copyright (C) 2013, Red Hat, Inc.
      6   Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
      7 
      8   This program and the accompanying materials are licensed and made available
      9   under the terms and conditions of the BSD License which accompanies this
     10   distribution. The full text of the license may be found at
     11   http://opensource.org/licenses/bsd-license.php
     12 
     13   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
     14   WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     15 
     16 **/
     17 
     18 #include <Library/UefiBootServicesTableLib.h>
     19 
     20 #include "VirtioNet.h"
     21 
     22 /**
     23   Resets a network adapter and leaves it in a state that is safe for  another
     24   driver to initialize.
     25 
     26   @param  This Protocol instance pointer.
     27 
     28   @retval EFI_SUCCESS           The network interface was shutdown.
     29   @retval EFI_NOT_STARTED       The network interface has not been started.
     30   @retval EFI_INVALID_PARAMETER One or more of the parameters has an
     31                                 unsupported value.
     32   @retval EFI_DEVICE_ERROR      The command could not be sent to the network
     33                                 interface.
     34   @retval EFI_UNSUPPORTED       This function is not supported by the network
     35                                 interface.
     36 
     37 **/
     38 
     39 EFI_STATUS
     40 EFIAPI
     41 VirtioNetShutdown (
     42   IN EFI_SIMPLE_NETWORK_PROTOCOL *This
     43   )
     44 {
     45   VNET_DEV   *Dev;
     46   EFI_TPL    OldTpl;
     47   EFI_STATUS Status;
     48 
     49   if (This == NULL) {
     50     return EFI_INVALID_PARAMETER;
     51   }
     52 
     53   Dev = VIRTIO_NET_FROM_SNP (This);
     54   OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
     55   switch (Dev->Snm.State) {
     56   case EfiSimpleNetworkStopped:
     57     Status = EFI_NOT_STARTED;
     58     goto Exit;
     59   case EfiSimpleNetworkStarted:
     60     Status = EFI_DEVICE_ERROR;
     61     goto Exit;
     62   default:
     63     break;
     64   }
     65 
     66   Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, 0);
     67   VirtioNetShutdownRx (Dev);
     68   VirtioNetShutdownTx (Dev);
     69   VirtioRingUninit (&Dev->TxRing);
     70   VirtioRingUninit (&Dev->RxRing);
     71 
     72   Dev->Snm.State = EfiSimpleNetworkStarted;
     73   Status = EFI_SUCCESS;
     74 
     75 Exit:
     76   gBS->RestoreTPL (OldTpl);
     77   return Status;
     78 }
     79