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)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