]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/SnpDxe/Reset.c
NetworkPkg: Move Network library and drivers from MdeModulePkg to NetworkPkg
[mirror_edk2.git] / NetworkPkg / SnpDxe / Reset.c
diff --git a/NetworkPkg/SnpDxe/Reset.c b/NetworkPkg/SnpDxe/Reset.c
new file mode 100644 (file)
index 0000000..3069bfd
--- /dev/null
@@ -0,0 +1,130 @@
+/** @file\r
+    Implementation of resetting a network adapter.\r
+\r
+Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include "Snp.h"\r
+\r
+\r
+/**\r
+  Call UNDI to reset the NIC.\r
+\r
+  @param  Snp                 Pointer to the snp driver structure.\r
+\r
+  @return EFI_SUCCESSFUL      The NIC was reset.\r
+  @retval EFI_DEVICE_ERROR    The NIC cannot be reset.\r
+\r
+**/\r
+EFI_STATUS\r
+PxeReset (\r
+  SNP_DRIVER *Snp\r
+  )\r
+{\r
+  Snp->Cdb.OpCode     = PXE_OPCODE_RESET;\r
+  Snp->Cdb.OpFlags    = PXE_OPFLAGS_NOT_USED;\r
+  Snp->Cdb.CPBsize    = PXE_CPBSIZE_NOT_USED;\r
+  Snp->Cdb.DBsize     = PXE_DBSIZE_NOT_USED;\r
+  Snp->Cdb.CPBaddr    = PXE_CPBADDR_NOT_USED;\r
+  Snp->Cdb.DBaddr     = PXE_DBADDR_NOT_USED;\r
+  Snp->Cdb.StatCode   = PXE_STATCODE_INITIALIZE;\r
+  Snp->Cdb.StatFlags  = PXE_STATFLAGS_INITIALIZE;\r
+  Snp->Cdb.IFnum      = Snp->IfNum;\r
+  Snp->Cdb.Control    = PXE_CONTROL_LAST_CDB_IN_LIST;\r
+\r
+  //\r
+  // Issue UNDI command and check result.\r
+  //\r
+  DEBUG ((EFI_D_NET, "\nsnp->undi.reset()  "));\r
+\r
+  (*Snp->IssueUndi32Command) ((UINT64)(UINTN) &Snp->Cdb);\r
+\r
+  if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) {\r
+    DEBUG (\r
+      (EFI_D_WARN,\r
+      "\nsnp->undi32.reset()  %xh:%xh\n",\r
+      Snp->Cdb.StatFlags,\r
+      Snp->Cdb.StatCode)\r
+      );\r
+\r
+    //\r
+    // UNDI could not be reset. Return UNDI error.\r
+    //\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Resets a network adapter and reinitializes it with the parameters that were\r
+  provided in the previous call to Initialize().\r
+\r
+  This function resets a network adapter and reinitializes it with the parameters\r
+  that were provided in the previous call to Initialize(). The transmit and\r
+  receive queues are emptied and all pending interrupts are cleared.\r
+  Receive filters, the station address, the statistics, and the multicast-IP-to-HW\r
+  MAC addresses are not reset by this call. If the network interface was\r
+  successfully reset, then EFI_SUCCESS will be returned. If the driver has not\r
+  been initialized, EFI_DEVICE_ERROR will be returned.\r
+\r
+  @param This                 A pointer to the EFI_SIMPLE_NETWORK_PROTOCOL instance.\r
+  @param ExtendedVerification Indicates that the driver may perform a more\r
+                              exhaustive verification operation of the device\r
+                              during reset.\r
+\r
+  @retval EFI_SUCCESS           The network interface was reset.\r
+  @retval EFI_NOT_STARTED       The network interface has not been started.\r
+  @retval EFI_INVALID_PARAMETER One or more of the parameters has an unsupported value.\r
+  @retval EFI_DEVICE_ERROR      The command could not be sent to the network interface.\r
+  @retval EFI_UNSUPPORTED       This function is not supported by the network interface.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SnpUndi32Reset (\r
+  IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
+  IN BOOLEAN                     ExtendedVerification\r
+  )\r
+{\r
+  SNP_DRIVER  *Snp;\r
+  EFI_TPL     OldTpl;\r
+  EFI_STATUS  Status;\r
+\r
+  //\r
+  // Resolve Warning 4 unreferenced parameter problem\r
+  //\r
+  ExtendedVerification = 0;\r
+  DEBUG ((EFI_D_WARN, "ExtendedVerification = %d is not implemented!\n", ExtendedVerification));\r
+\r
+  if (This == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Snp = EFI_SIMPLE_NETWORK_DEV_FROM_THIS (This);\r
+\r
+  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+\r
+  switch (Snp->Mode.State) {\r
+  case EfiSimpleNetworkInitialized:\r
+    break;\r
+\r
+  case EfiSimpleNetworkStopped:\r
+    Status = EFI_NOT_STARTED;\r
+    goto ON_EXIT;\r
+\r
+  default:\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto ON_EXIT;\r
+  }\r
+\r
+  Status = PxeReset (Snp);\r
+\r
+ON_EXIT:\r
+  gBS->RestoreTPL (OldTpl);\r
+\r
+  return Status;\r
+}\r