]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/SnpDxe/WaitForPacket.c
NetworkPkg: Move Network library and drivers from MdeModulePkg to NetworkPkg
[mirror_edk2.git] / NetworkPkg / SnpDxe / WaitForPacket.c
diff --git a/NetworkPkg/SnpDxe/WaitForPacket.c b/NetworkPkg/SnpDxe/WaitForPacket.c
new file mode 100644 (file)
index 0000000..866a1e8
--- /dev/null
@@ -0,0 +1,86 @@
+/** @file\r
+    Event handler to check for available packet.\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
+  Nofication call back function for WaitForPacket event.\r
+\r
+  @param  Event       EFI Event.\r
+  @param  SnpPtr      Pointer to SNP_DRIVER structure.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SnpWaitForPacketNotify (\r
+  EFI_EVENT     Event,\r
+  VOID          *SnpPtr\r
+  )\r
+{\r
+  PXE_DB_GET_STATUS PxeDbGetStatus;\r
+\r
+  //\r
+  // Do nothing if either parameter is a NULL pointer.\r
+  //\r
+  if (Event == NULL || SnpPtr == NULL) {\r
+    return ;\r
+  }\r
+  //\r
+  // Do nothing if the SNP interface is not initialized.\r
+  //\r
+  switch (((SNP_DRIVER *) SnpPtr)->Mode.State) {\r
+  case EfiSimpleNetworkInitialized:\r
+    break;\r
+\r
+  case EfiSimpleNetworkStopped:\r
+  case EfiSimpleNetworkStarted:\r
+  default:\r
+    return ;\r
+  }\r
+  //\r
+  // Fill in CDB for UNDI GetStatus().\r
+  //\r
+  ((SNP_DRIVER *) SnpPtr)->Cdb.OpCode     = PXE_OPCODE_GET_STATUS;\r
+  ((SNP_DRIVER *) SnpPtr)->Cdb.OpFlags    = 0;\r
+  ((SNP_DRIVER *) SnpPtr)->Cdb.CPBsize    = PXE_CPBSIZE_NOT_USED;\r
+  ((SNP_DRIVER *) SnpPtr)->Cdb.CPBaddr    = PXE_CPBADDR_NOT_USED;\r
+  ((SNP_DRIVER *) SnpPtr)->Cdb.DBsize     = (UINT16) (sizeof (UINT32) * 2);\r
+  ((SNP_DRIVER *) SnpPtr)->Cdb.DBaddr     = (UINT64)(UINTN) (((SNP_DRIVER *) SnpPtr)->Db);\r
+  ((SNP_DRIVER *) SnpPtr)->Cdb.StatCode   = PXE_STATCODE_INITIALIZE;\r
+  ((SNP_DRIVER *) SnpPtr)->Cdb.StatFlags  = PXE_STATFLAGS_INITIALIZE;\r
+  ((SNP_DRIVER *) SnpPtr)->Cdb.IFnum      = ((SNP_DRIVER *) SnpPtr)->IfNum;\r
+  ((SNP_DRIVER *) SnpPtr)->Cdb.Control    = PXE_CONTROL_LAST_CDB_IN_LIST;\r
+\r
+  //\r
+  // Clear contents of DB buffer.\r
+  //\r
+  ZeroMem (((SNP_DRIVER *) SnpPtr)->Db, sizeof (UINT32) * 2);\r
+\r
+  //\r
+  // Issue UNDI command and check result.\r
+  //\r
+  (*((SNP_DRIVER *) SnpPtr)->IssueUndi32Command) ((UINT64)(UINTN) &((SNP_DRIVER *) SnpPtr)->Cdb);\r
+\r
+  if (((SNP_DRIVER *) SnpPtr)->Cdb.StatCode != EFI_SUCCESS) {\r
+    return ;\r
+  }\r
+  //\r
+  // We might have a packet.  Check the receive length and signal\r
+  // the event if the length is not zero.\r
+  //\r
+  CopyMem (\r
+    &PxeDbGetStatus,\r
+    ((SNP_DRIVER *) SnpPtr)->Db,\r
+    sizeof (UINT32) * 2\r
+    );\r
+\r
+  if (PxeDbGetStatus.RxFrameLen != 0) {\r
+    gBS->SignalEvent (Event);\r
+  }\r
+}\r