1 /** @file 2 Event handler to check for available packet. 3 4 Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR> 5 This program and the accompanying materials are licensed 6 and made available under the terms and conditions of the BSD License which 7 accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #include "Snp.h" 16 17 18 /** 19 Nofication call back function for WaitForPacket event. 20 21 @param Event EFI Event. 22 @param SnpPtr Pointer to SNP_DRIVER structure. 23 24 **/ 25 VOID 26 EFIAPI SnpWaitForPacketNotify(EFI_EVENT Event,VOID * SnpPtr)27SnpWaitForPacketNotify ( 28 EFI_EVENT Event, 29 VOID *SnpPtr 30 ) 31 { 32 PXE_DB_GET_STATUS PxeDbGetStatus; 33 34 // 35 // Do nothing if either parameter is a NULL pointer. 36 // 37 if (Event == NULL || SnpPtr == NULL) { 38 return ; 39 } 40 // 41 // Do nothing if the SNP interface is not initialized. 42 // 43 switch (((SNP_DRIVER *) SnpPtr)->Mode.State) { 44 case EfiSimpleNetworkInitialized: 45 break; 46 47 case EfiSimpleNetworkStopped: 48 case EfiSimpleNetworkStarted: 49 default: 50 return ; 51 } 52 // 53 // Fill in CDB for UNDI GetStatus(). 54 // 55 ((SNP_DRIVER *) SnpPtr)->Cdb.OpCode = PXE_OPCODE_GET_STATUS; 56 ((SNP_DRIVER *) SnpPtr)->Cdb.OpFlags = 0; 57 ((SNP_DRIVER *) SnpPtr)->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; 58 ((SNP_DRIVER *) SnpPtr)->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; 59 ((SNP_DRIVER *) SnpPtr)->Cdb.DBsize = (UINT16) (sizeof (UINT32) * 2); 60 ((SNP_DRIVER *) SnpPtr)->Cdb.DBaddr = (UINT64)(UINTN) (((SNP_DRIVER *) SnpPtr)->Db); 61 ((SNP_DRIVER *) SnpPtr)->Cdb.StatCode = PXE_STATCODE_INITIALIZE; 62 ((SNP_DRIVER *) SnpPtr)->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; 63 ((SNP_DRIVER *) SnpPtr)->Cdb.IFnum = ((SNP_DRIVER *) SnpPtr)->IfNum; 64 ((SNP_DRIVER *) SnpPtr)->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; 65 66 // 67 // Clear contents of DB buffer. 68 // 69 ZeroMem (((SNP_DRIVER *) SnpPtr)->Db, sizeof (UINT32) * 2); 70 71 // 72 // Issue UNDI command and check result. 73 // 74 (*((SNP_DRIVER *) SnpPtr)->IssueUndi32Command) ((UINT64)(UINTN) &((SNP_DRIVER *) SnpPtr)->Cdb); 75 76 if (((SNP_DRIVER *) SnpPtr)->Cdb.StatCode != EFI_SUCCESS) { 77 return ; 78 } 79 // 80 // We might have a packet. Check the receive length and signal 81 // the event if the length is not zero. 82 // 83 CopyMem ( 84 &PxeDbGetStatus, 85 ((SNP_DRIVER *) SnpPtr)->Db, 86 sizeof (UINT32) * 2 87 ); 88 89 if (PxeDbGetStatus.RxFrameLen != 0) { 90 gBS->SignalEvent (Event); 91 } 92 } 93