]>
Commit | Line | Data |
---|---|---|
8a67d61d | 1 | /** @file\r |
4cda7726 | 2 | Event handler to check for available packet.\r |
3 | \r | |
d1102dba | 4 | Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r |
9d510e61 | 5 | SPDX-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 | |
bb3594e8 | 13 | Notification 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 | |
19 | VOID\r | |
20 | EFIAPI\r | |
21 | SnpWaitForPacketNotify (\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 |