]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/SnpDxe/WaitForPacket.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / Network / SnpDxe / WaitForPacket.c
CommitLineData
8a67d61d 1/** @file\r
4cda7726 2 Event handler to check for available packet.\r
3\r
d1102dba 4Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
9d510e61 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
8a67d61d 6\r
8a67d61d 7**/\r
8\r
9#include "Snp.h"\r
10\r
11\r
12/**\r
4cda7726 13 Nofication call back function for WaitForPacket event.\r
8a67d61d 14\r
4cda7726 15 @param Event EFI Event.\r
16 @param SnpPtr Pointer to SNP_DRIVER structure.\r
8a67d61d 17\r
18**/\r
19VOID\r
20EFIAPI\r
21SnpWaitForPacketNotify (\r
f3816027 22 EFI_EVENT Event,\r
23 VOID *SnpPtr\r
8a67d61d 24 )\r
25{\r
26 PXE_DB_GET_STATUS PxeDbGetStatus;\r
27\r
28 //\r
29 // Do nothing if either parameter is a NULL pointer.\r
30 //\r
31 if (Event == NULL || SnpPtr == NULL) {\r
32 return ;\r
33 }\r
34 //\r
35 // Do nothing if the SNP interface is not initialized.\r
36 //\r
4cda7726 37 switch (((SNP_DRIVER *) SnpPtr)->Mode.State) {\r
8a67d61d 38 case EfiSimpleNetworkInitialized:\r
39 break;\r
40\r
41 case EfiSimpleNetworkStopped:\r
42 case EfiSimpleNetworkStarted:\r
43 default:\r
44 return ;\r
45 }\r
46 //\r
47 // Fill in CDB for UNDI GetStatus().\r
48 //\r
4cda7726 49 ((SNP_DRIVER *) SnpPtr)->Cdb.OpCode = PXE_OPCODE_GET_STATUS;\r
50 ((SNP_DRIVER *) SnpPtr)->Cdb.OpFlags = 0;\r
51 ((SNP_DRIVER *) SnpPtr)->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED;\r
52 ((SNP_DRIVER *) SnpPtr)->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED;\r
c9325700 53 ((SNP_DRIVER *) SnpPtr)->Cdb.DBsize = (UINT16) (sizeof (UINT32) * 2);\r
4cda7726 54 ((SNP_DRIVER *) SnpPtr)->Cdb.DBaddr = (UINT64)(UINTN) (((SNP_DRIVER *) SnpPtr)->Db);\r
55 ((SNP_DRIVER *) SnpPtr)->Cdb.StatCode = PXE_STATCODE_INITIALIZE;\r
56 ((SNP_DRIVER *) SnpPtr)->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;\r
57 ((SNP_DRIVER *) SnpPtr)->Cdb.IFnum = ((SNP_DRIVER *) SnpPtr)->IfNum;\r
58 ((SNP_DRIVER *) SnpPtr)->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;\r
8a67d61d 59\r
60 //\r
61 // Clear contents of DB buffer.\r
62 //\r
4cda7726 63 ZeroMem (((SNP_DRIVER *) SnpPtr)->Db, sizeof (UINT32) * 2);\r
8a67d61d 64\r
65 //\r
66 // Issue UNDI command and check result.\r
67 //\r
4cda7726 68 (*((SNP_DRIVER *) SnpPtr)->IssueUndi32Command) ((UINT64)(UINTN) &((SNP_DRIVER *) SnpPtr)->Cdb);\r
8a67d61d 69\r
4cda7726 70 if (((SNP_DRIVER *) SnpPtr)->Cdb.StatCode != EFI_SUCCESS) {\r
8a67d61d 71 return ;\r
72 }\r
73 //\r
74 // We might have a packet. Check the receive length and signal\r
75 // the event if the length is not zero.\r
76 //\r
77 CopyMem (\r
78 &PxeDbGetStatus,\r
4cda7726 79 ((SNP_DRIVER *) SnpPtr)->Db,\r
8a67d61d 80 sizeof (UINT32) * 2\r
81 );\r
82\r
83 if (PxeDbGetStatus.RxFrameLen != 0) {\r
84 gBS->SignalEvent (Event);\r
85 }\r
86}\r