2 Event handler to check for available packet.
4 Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
12 Notification call back function for WaitForPacket event.
14 @param Event EFI Event.
15 @param SnpPtr Pointer to SNP_DRIVER structure.
20 SnpWaitForPacketNotify (
25 PXE_DB_GET_STATUS PxeDbGetStatus
;
28 // Do nothing if either parameter is a NULL pointer.
30 if ((Event
== NULL
) || (SnpPtr
== NULL
)) {
35 // Do nothing if the SNP interface is not initialized.
37 switch (((SNP_DRIVER
*)SnpPtr
)->Mode
.State
) {
38 case EfiSimpleNetworkInitialized
:
41 case EfiSimpleNetworkStopped
:
42 case EfiSimpleNetworkStarted
:
48 // Fill in CDB for UNDI GetStatus().
50 ((SNP_DRIVER
*)SnpPtr
)->Cdb
.OpCode
= PXE_OPCODE_GET_STATUS
;
51 ((SNP_DRIVER
*)SnpPtr
)->Cdb
.OpFlags
= 0;
52 ((SNP_DRIVER
*)SnpPtr
)->Cdb
.CPBsize
= PXE_CPBSIZE_NOT_USED
;
53 ((SNP_DRIVER
*)SnpPtr
)->Cdb
.CPBaddr
= PXE_CPBADDR_NOT_USED
;
54 ((SNP_DRIVER
*)SnpPtr
)->Cdb
.DBsize
= (UINT16
)(sizeof (UINT32
) * 2);
55 ((SNP_DRIVER
*)SnpPtr
)->Cdb
.DBaddr
= (UINT64
)(UINTN
)(((SNP_DRIVER
*)SnpPtr
)->Db
);
56 ((SNP_DRIVER
*)SnpPtr
)->Cdb
.StatCode
= PXE_STATCODE_INITIALIZE
;
57 ((SNP_DRIVER
*)SnpPtr
)->Cdb
.StatFlags
= PXE_STATFLAGS_INITIALIZE
;
58 ((SNP_DRIVER
*)SnpPtr
)->Cdb
.IFnum
= ((SNP_DRIVER
*)SnpPtr
)->IfNum
;
59 ((SNP_DRIVER
*)SnpPtr
)->Cdb
.Control
= PXE_CONTROL_LAST_CDB_IN_LIST
;
62 // Clear contents of DB buffer.
64 ZeroMem (((SNP_DRIVER
*)SnpPtr
)->Db
, sizeof (UINT32
) * 2);
67 // Issue UNDI command and check result.
69 (*((SNP_DRIVER
*)SnpPtr
)->IssueUndi32Command
)((UINT64
)(UINTN
)&((SNP_DRIVER
*)SnpPtr
)->Cdb
);
71 if (((SNP_DRIVER
*)SnpPtr
)->Cdb
.StatCode
!= EFI_SUCCESS
) {
76 // We might have a packet. Check the receive length and signal
77 // the event if the length is not zero.
81 ((SNP_DRIVER
*)SnpPtr
)->Db
,
85 if (PxeDbGetStatus
.RxFrameLen
!= 0) {
86 gBS
->SignalEvent (Event
);