]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/SnpDxe/Get_status.c
Rename
[mirror_edk2.git] / MdeModulePkg / Universal / Network / SnpDxe / Get_status.c
CommitLineData
75d0f44d 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\r
46 db = snp->db;\r
47 snp->cdb.OpCode = PXE_OPCODE_GET_STATUS;\r
48\r
49 snp->cdb.OpFlags = 0;\r
50\r
51 if (TransmitBufferListPtr != NULL) {\r
52 snp->cdb.OpFlags |= PXE_OPFLAGS_GET_TRANSMITTED_BUFFERS;\r
53 }\r
54\r
55 if (InterruptStatusPtr != NULL) {\r
56 snp->cdb.OpFlags |= PXE_OPFLAGS_GET_INTERRUPT_STATUS;\r
57 }\r
58\r
59 snp->cdb.CPBsize = PXE_CPBSIZE_NOT_USED;\r
60 snp->cdb.CPBaddr = PXE_CPBADDR_NOT_USED;\r
61\r
62 //\r
63 // size DB for return of one buffer\r
64 //\r
65 snp->cdb.DBsize = (UINT16) (((UINT16) (sizeof (PXE_DB_GET_STATUS)) - (UINT16) (sizeof db->TxBuffer)) + (UINT16) (sizeof db->TxBuffer[0]));\r
66\r
67 snp->cdb.DBaddr = (UINT64)(UINTN) db;\r
68\r
69 snp->cdb.StatCode = PXE_STATCODE_INITIALIZE;\r
70 snp->cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;\r
71 snp->cdb.IFnum = snp->if_num;\r
72 snp->cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;\r
73\r
74 //\r
75 // Issue UNDI command and check result.\r
76 //\r
77 DEBUG ((EFI_D_NET, "\nsnp->undi.get_status() "));\r
78\r
79 (*snp->issue_undi32_command) ((UINT64)(UINTN) &snp->cdb);\r
80\r
81 if (snp->cdb.StatCode != EFI_SUCCESS) {\r
82 DEBUG (\r
83 (EFI_D_NET,\r
84 "\nsnp->undi.get_status() %xh:%xh\n",\r
85 snp->cdb.StatFlags,\r
86 snp->cdb.StatFlags)\r
87 );\r
88\r
89 return EFI_DEVICE_ERROR;\r
90 }\r
91 //\r
92 // report the values back..\r
93 //\r
94 if (InterruptStatusPtr != NULL) {\r
95 InterruptFlags = (UINT16) (snp->cdb.StatFlags & PXE_STATFLAGS_GET_STATUS_INTERRUPT_MASK);\r
96\r
97 *InterruptStatusPtr = 0;\r
98\r
99 if (InterruptFlags & PXE_STATFLAGS_GET_STATUS_RECEIVE) {\r
100 *InterruptStatusPtr |= EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT;\r
101 }\r
102\r
103 if (InterruptFlags & PXE_STATFLAGS_GET_STATUS_TRANSMIT) {\r
104 *InterruptStatusPtr |= EFI_SIMPLE_NETWORK_TRANSMIT_INTERRUPT;\r
105 }\r
106\r
107 if (InterruptFlags & PXE_STATFLAGS_GET_STATUS_COMMAND) {\r
108 *InterruptStatusPtr |= EFI_SIMPLE_NETWORK_COMMAND_INTERRUPT;\r
109 }\r
110\r
111 if (InterruptFlags & PXE_STATFLAGS_GET_STATUS_SOFTWARE) {\r
112 *InterruptStatusPtr |= EFI_SIMPLE_NETWORK_COMMAND_INTERRUPT;\r
113 }\r
114\r
115 }\r
116\r
117 if (TransmitBufferListPtr != NULL) {\r
118 *TransmitBufferListPtr =\r
119 (\r
120 (snp->cdb.StatFlags & PXE_STATFLAGS_GET_STATUS_NO_TXBUFS_WRITTEN) ||\r
121 (snp->cdb.StatFlags & PXE_STATFLAGS_GET_STATUS_TXBUF_QUEUE_EMPTY)\r
122 ) ? 0 : (VOID *) (UINTN) db->TxBuffer[0];\r
123\r
124 }\r
125\r
126 return EFI_SUCCESS;\r
127}\r
128\r
129\r
130/**\r
131 This is the SNP interface routine for getting the status\r
132 This routine basically retrieves snp structure, checks the SNP state and\r
133 calls the pxe_getstatus routine to actually get the undi status\r
134\r
135 @param this context pointer\r
136 @param InterruptStatusPtr a non null pointer gets the interrupt status\r
137 @param TransmitBufferListPtrs a non null ointer gets the list of pointers of\r
138 previously transmitted buffers whose\r
139 transmission was completed asynchrnously.\r
140\r
141\r
142**/\r
143EFI_STATUS\r
144EFIAPI\r
145snp_undi32_get_status (\r
146 IN EFI_SIMPLE_NETWORK_PROTOCOL * this,\r
147 OUT UINT32 *InterruptStatusPtr OPTIONAL,\r
148 OUT VOID **TransmitBufferListPtr OPTIONAL\r
149 )\r
150{\r
151 SNP_DRIVER *snp;\r
152 EFI_TPL OldTpl;\r
153 EFI_STATUS Status;\r
154\r
155 if (this == NULL) {\r
156 return EFI_INVALID_PARAMETER;\r
157 }\r
158\r
159 if (InterruptStatusPtr == NULL && TransmitBufferListPtr == NULL) {\r
160 return EFI_INVALID_PARAMETER;\r
161 }\r
162\r
163 snp = EFI_SIMPLE_NETWORK_DEV_FROM_THIS (this);\r
164\r
165 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
166\r
167 if (snp == NULL) {\r
168 return EFI_DEVICE_ERROR;\r
169 }\r
170\r
171 switch (snp->mode.State) {\r
172 case EfiSimpleNetworkInitialized:\r
173 break;\r
174\r
175 case EfiSimpleNetworkStopped:\r
176 Status = EFI_NOT_STARTED;\r
177 goto ON_EXIT;\r
178\r
179 default:\r
180 Status = EFI_DEVICE_ERROR;\r
181 goto ON_EXIT;\r
182 }\r
183\r
184 Status = pxe_getstatus (snp, InterruptStatusPtr, TransmitBufferListPtr);\r
185\r
186ON_EXIT:\r
187 gBS->RestoreTPL (OldTpl);\r
188\r
189 return Status;\r
190}\r