/** @file | |
Event handler to check for available packet. | |
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> | |
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); | |
} | |
} |