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 VirtioNetShutdown(IN EFI_SIMPLE_NETWORK_PROTOCOL * This)41VirtioNetShutdown ( 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