]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/SnpDxe/get_status.c
1. Sync the latest network stack. Add NetLibCreateIPv4DPathNode () in netlib library.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / SnpDxe / get_status.c
CommitLineData
8a67d61d 1/** @file\r
2Copyright (c) 2004 - 2007, Intel Corporation\r
3All rights reserved. This program and the accompanying materials\r
4are licensed and made available under the terms and conditions of the BSD License\r
5which accompanies this distribution. The full text of the license may be found at\r
6http://opensource.org/licenses/bsd-license.php\r
7\r
8THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
9WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
10\r
11Module name:\r
12 get_status.c\r
13\r
14Abstract:\r
15\r
16Revision history:\r
17 2000-Feb-03 M(f)J Genesis.\r
18\r
19**/\r
20\r
21#include "Snp.h"\r
22\r
23STATIC\r
24/**\r
25 this routine calls undi to get the status of the interrupts, get the list of\r
26 transmit buffers that completed transmitting!\r
27\r
28 @param snp pointer to snp driver structure\r
29 @param InterruptStatusPtr a non null pointer gets the interrupt status\r
30 @param TransmitBufferListPtrs a non null ointer gets the list of pointers of\r
31 previously transmitted buffers whose\r
32 transmission was completed asynchrnously.\r
33\r
34\r
35**/\r
36EFI_STATUS\r
37pxe_getstatus (\r
38 SNP_DRIVER *snp,\r
39 UINT32 *InterruptStatusPtr,\r
40 VOID **TransmitBufferListPtr\r
41 )\r
42{\r
43 PXE_DB_GET_STATUS *db;\r
44 UINT16 InterruptFlags;\r
45 UINT64 TempData;\r
46\r
47 db = snp->db;\r
48 snp->cdb.OpCode = PXE_OPCODE_GET_STATUS;\r
49\r
50 snp->cdb.OpFlags = 0;\r
51\r
52 if (TransmitBufferListPtr != NULL) {\r
53 snp->cdb.OpFlags |= PXE_OPFLAGS_GET_TRANSMITTED_BUFFERS;\r
54 }\r
55\r
56 if (InterruptStatusPtr != NULL) {\r
57 snp->cdb.OpFlags |= PXE_OPFLAGS_GET_INTERRUPT_STATUS;\r
58 }\r
59\r
60 snp->cdb.CPBsize = PXE_CPBSIZE_NOT_USED;\r
61 snp->cdb.CPBaddr = PXE_CPBADDR_NOT_USED;\r
62\r
63 //\r
64 // size DB for return of one buffer\r
65 //\r
66 snp->cdb.DBsize = (UINT16) (((UINT16) (sizeof (PXE_DB_GET_STATUS)) - (UINT16) (sizeof db->TxBuffer)) + (UINT16) (sizeof db->TxBuffer[0]));\r
67\r
68 snp->cdb.DBaddr = (UINT64)(UINTN) db;\r
69\r
70 snp->cdb.StatCode = PXE_STATCODE_INITIALIZE;\r
71 snp->cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;\r
72 snp->cdb.IFnum = snp->if_num;\r
73 snp->cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;\r
74\r
75 //\r
76 // Issue UNDI command and check result.\r
77 //\r
78 DEBUG ((EFI_D_NET, "\nsnp->undi.get_status() "));\r
79\r
80 (*snp->issue_undi32_command) ((UINT64)(UINTN) &snp->cdb);\r
81\r
82 if (snp->cdb.StatCode != EFI_SUCCESS) {\r
83 DEBUG (\r
84 (EFI_D_NET,\r
85 "\nsnp->undi.get_status() %xh:%xh\n",\r
86 snp->cdb.StatFlags,\r
87 snp->cdb.StatFlags)\r
88 );\r
89\r
90 return EFI_DEVICE_ERROR;\r
91 }\r
92 //\r
93 // report the values back..\r
94 //\r
95 if (InterruptStatusPtr != NULL) {\r
96 InterruptFlags = (UINT16) (snp->cdb.StatFlags & PXE_STATFLAGS_GET_STATUS_INTERRUPT_MASK);\r
97\r
98 *InterruptStatusPtr = 0;\r
99\r
100 if (InterruptFlags & PXE_STATFLAGS_GET_STATUS_RECEIVE) {\r
101 *InterruptStatusPtr |= EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT;\r
102 }\r
103\r
104 if (InterruptFlags & PXE_STATFLAGS_GET_STATUS_TRANSMIT) {\r
105 *InterruptStatusPtr |= EFI_SIMPLE_NETWORK_TRANSMIT_INTERRUPT;\r
106 }\r
107\r
108 if (InterruptFlags & PXE_STATFLAGS_GET_STATUS_COMMAND) {\r
109 *InterruptStatusPtr |= EFI_SIMPLE_NETWORK_COMMAND_INTERRUPT;\r
110 }\r
111\r
112 if (InterruptFlags & PXE_STATFLAGS_GET_STATUS_SOFTWARE) {\r
113 *InterruptStatusPtr |= EFI_SIMPLE_NETWORK_COMMAND_INTERRUPT;\r
114 }\r
115\r
116 }\r
117\r
118 if (TransmitBufferListPtr != NULL) {\r
119 *TransmitBufferListPtr =\r
120 (\r
121 (snp->cdb.StatFlags & PXE_STATFLAGS_GET_STATUS_NO_TXBUFS_WRITTEN) ||\r
122 (snp->cdb.StatFlags & PXE_STATFLAGS_GET_STATUS_TXBUF_QUEUE_EMPTY)\r
123 ) ? 0 : (VOID *) (UINTN) db->TxBuffer[0];\r
124\r
125 TempData = (UINT64) (UINTN) (*TransmitBufferListPtr);\r
126 if (snp->IsOldUndi && (TempData >= FOUR_GIGABYTES)) {\r
127 del_v2p ((VOID *) (UINTN) (db->TxBuffer[0]));\r
128 }\r
129 }\r
130\r
131 return EFI_SUCCESS;\r
132}\r
133\r
134\r
135/**\r
136 This is the SNP interface routine for getting the status\r
137 This routine basically retrieves snp structure, checks the SNP state and\r
138 calls the pxe_getstatus routine to actually get the undi status\r
139\r
140 @param this context pointer\r
141 @param InterruptStatusPtr a non null pointer gets the interrupt status\r
142 @param TransmitBufferListPtrs a non null ointer gets the list of pointers of\r
143 previously transmitted buffers whose\r
144 transmission was completed asynchrnously.\r
145\r
146\r
147**/\r
148EFI_STATUS\r
149EFIAPI\r
150snp_undi32_get_status (\r
151 IN EFI_SIMPLE_NETWORK_PROTOCOL * this,\r
152 OUT UINT32 *InterruptStatusPtr OPTIONAL,\r
153 OUT VOID **TransmitBufferListPtr OPTIONAL\r
154 )\r
155{\r
156 SNP_DRIVER *snp;\r
157 EFI_TPL OldTpl;\r
158 EFI_STATUS Status;\r
159\r
160 if (this == NULL) {\r
161 return EFI_INVALID_PARAMETER;\r
162 }\r
163\r
164 if (InterruptStatusPtr == NULL && TransmitBufferListPtr == NULL) {\r
165 return EFI_INVALID_PARAMETER;\r
166 }\r
167\r
168 snp = EFI_SIMPLE_NETWORK_DEV_FROM_THIS (this);\r
169\r
170 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
171\r
172 if (snp == NULL) {\r
173 return EFI_DEVICE_ERROR;\r
174 }\r
175\r
176 switch (snp->mode.State) {\r
177 case EfiSimpleNetworkInitialized:\r
178 break;\r
179\r
180 case EfiSimpleNetworkStopped:\r
181 Status = EFI_NOT_STARTED;\r
182 goto ON_EXIT;\r
183\r
184 default:\r
185 Status = EFI_DEVICE_ERROR;\r
186 goto ON_EXIT;\r
187 }\r
188\r
189 Status = pxe_getstatus (snp, InterruptStatusPtr, TransmitBufferListPtr);\r
190\r
191ON_EXIT:\r
192 gBS->RestoreTPL (OldTpl);\r
193\r
194 return Status;\r
195}\r