]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/Network/SnpDxe/WaitForPacket.c
Update the copyright notice format
[mirror_edk2.git] / MdeModulePkg / Universal / Network / SnpDxe / WaitForPacket.c
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
27 SnpWaitForPacketNotify (
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 = 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 }