/** @file Event handler to check for available packet. Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "Snp.h" /** Notification call back function for WaitForPacket event. @param Event EFI Event. @param SnpPtr Pointer to SNP_DRIVER structure. **/ VOID EFIAPI SnpWaitForPacketNotify ( EFI_EVENT Event, VOID *SnpPtr ) { PXE_DB_GET_STATUS PxeDbGetStatus; // // Do nothing if either parameter is a NULL pointer. // if (Event == NULL || SnpPtr == NULL) { return ; } // // Do nothing if the SNP interface is not initialized. // switch (((SNP_DRIVER *) SnpPtr)->Mode.State) { case EfiSimpleNetworkInitialized: break; case EfiSimpleNetworkStopped: case EfiSimpleNetworkStarted: default: return ; } // // Fill in CDB for UNDI GetStatus(). // ((SNP_DRIVER *) SnpPtr)->Cdb.OpCode = PXE_OPCODE_GET_STATUS; ((SNP_DRIVER *) SnpPtr)->Cdb.OpFlags = 0; ((SNP_DRIVER *) SnpPtr)->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; ((SNP_DRIVER *) SnpPtr)->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; ((SNP_DRIVER *) SnpPtr)->Cdb.DBsize = (UINT16) (sizeof (UINT32) * 2); ((SNP_DRIVER *) SnpPtr)->Cdb.DBaddr = (UINT64)(UINTN) (((SNP_DRIVER *) SnpPtr)->Db); ((SNP_DRIVER *) SnpPtr)->Cdb.StatCode = PXE_STATCODE_INITIALIZE; ((SNP_DRIVER *) SnpPtr)->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; ((SNP_DRIVER *) SnpPtr)->Cdb.IFnum = ((SNP_DRIVER *) SnpPtr)->IfNum; ((SNP_DRIVER *) SnpPtr)->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Clear contents of DB buffer. // ZeroMem (((SNP_DRIVER *) SnpPtr)->Db, sizeof (UINT32) * 2); // // Issue UNDI command and check result. // (*((SNP_DRIVER *) SnpPtr)->IssueUndi32Command) ((UINT64)(UINTN) &((SNP_DRIVER *) SnpPtr)->Cdb); if (((SNP_DRIVER *) SnpPtr)->Cdb.StatCode != EFI_SUCCESS) { return ; } // // We might have a packet. Check the receive length and signal // the event if the length is not zero. // CopyMem ( &PxeDbGetStatus, ((SNP_DRIVER *) SnpPtr)->Db, sizeof (UINT32) * 2 ); if (PxeDbGetStatus.RxFrameLen != 0) { gBS->SignalEvent (Event); } }