--- /dev/null
+/** @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