BaseTools:Change the path of the file that Binary Cache
[mirror_edk2.git] / MdeModulePkg / Universal / Network / SnpDxe / WaitForPacket.c
1 /** @file\r
2     Event handler to check for available packet.\r
3 \r
4 Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6 \r
7 **/\r
8 \r
9 #include "Snp.h"\r
10 \r
11 \r
12 /**\r
13   Nofication call back function for WaitForPacket event.\r
14 \r
15   @param  Event       EFI Event.\r
16   @param  SnpPtr      Pointer to SNP_DRIVER structure.\r
17 \r
18 **/\r
19 VOID\r
20 EFIAPI\r
21 SnpWaitForPacketNotify (\r
22   EFI_EVENT     Event,\r
23   VOID          *SnpPtr\r
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
37   switch (((SNP_DRIVER *) SnpPtr)->Mode.State) {\r
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
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
53   ((SNP_DRIVER *) SnpPtr)->Cdb.DBsize     = (UINT16) (sizeof (UINT32) * 2);\r
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
59 \r
60   //\r
61   // Clear contents of DB buffer.\r
62   //\r
63   ZeroMem (((SNP_DRIVER *) SnpPtr)->Db, sizeof (UINT32) * 2);\r
64 \r
65   //\r
66   // Issue UNDI command and check result.\r
67   //\r
68   (*((SNP_DRIVER *) SnpPtr)->IssueUndi32Command) ((UINT64)(UINTN) &((SNP_DRIVER *) SnpPtr)->Cdb);\r
69 \r
70   if (((SNP_DRIVER *) SnpPtr)->Cdb.StatCode != EFI_SUCCESS) {\r
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
79     ((SNP_DRIVER *) SnpPtr)->Db,\r
80     sizeof (UINT32) * 2\r
81     );\r
82 \r
83   if (PxeDbGetStatus.RxFrameLen != 0) {\r
84     gBS->SignalEvent (Event);\r
85   }\r
86 }\r