]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/Network/Snp32_64/Dxe/initialize.c
Add some definitions for efi event in Uefi/UefiSpec.h to follow spec.
[mirror_edk2.git] / EdkModulePkg / Universal / Network / Snp32_64 / Dxe / initialize.c
CommitLineData
878ddf1f 1/*++\r
93b0fbc8 2Copyright (c) 2006, 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
878ddf1f 10\r
11Module name:\r
12 initialize.c\r
13\r
14Abstract:\r
15\r
16Revision history:\r
17 2000-Feb-09 M(f)J Genesis.\r
18--*/\r
19\r
20\r
4cbd855e 21#include "Snp.h"\r
878ddf1f 22\r
878ddf1f 23EFI_STATUS\r
24pxe_init (\r
25 SNP_DRIVER *snp,\r
26 UINT16 CableDetectFlag\r
27 )\r
28/*++\r
29\r
30Routine Description:\r
31 this routine calls undi to initialize the interface.\r
32\r
33Arguments:\r
34 snp - pointer to snp driver structure\r
35 CableDetectFlag - Do/don't detect the cable (depending on what undi supports)\r
36\r
37Returns:\r
38\r
39--*/\r
40{\r
41 PXE_CPB_INITIALIZE *cpb;\r
42 VOID *addr;\r
43 EFI_STATUS Status;\r
44\r
45 cpb = snp->cpb;\r
46 if (snp->tx_rx_bufsize != 0) {\r
47 Status = snp->IoFncs->AllocateBuffer (\r
48 snp->IoFncs,\r
49 AllocateAnyPages,\r
50 EfiBootServicesData,\r
51 SNP_MEM_PAGES (snp->tx_rx_bufsize),\r
52 &addr,\r
53 0\r
54 );\r
55\r
56 if (Status != EFI_SUCCESS) {\r
57 DEBUG (\r
58 (EFI_D_ERROR,\r
59 "\nsnp->pxe_init() AllocateBuffer %xh (%r)\n",\r
60 Status,\r
61 Status)\r
62 );\r
63\r
64 return Status;\r
65 }\r
66\r
67 ASSERT (addr);\r
68\r
69 snp->tx_rx_buffer = addr;\r
70 }\r
71\r
72 cpb->MemoryAddr = (UINT64) (UINTN) snp->tx_rx_buffer;\r
73\r
74 cpb->MemoryLength = snp->tx_rx_bufsize;\r
75\r
76 //\r
77 // let UNDI decide/detect these values\r
78 //\r
79 cpb->LinkSpeed = 0;\r
80 cpb->TxBufCnt = 0;\r
81 cpb->TxBufSize = 0;\r
82 cpb->RxBufCnt = 0;\r
83 cpb->RxBufSize = 0;\r
84\r
85 cpb->DuplexMode = PXE_DUPLEX_DEFAULT;\r
86\r
87 cpb->LoopBackMode = LOOPBACK_NORMAL;\r
88\r
89 snp->cdb.OpCode = PXE_OPCODE_INITIALIZE;\r
90 snp->cdb.OpFlags = CableDetectFlag;\r
91\r
92 snp->cdb.CPBsize = sizeof (PXE_CPB_INITIALIZE);\r
93 snp->cdb.DBsize = sizeof (PXE_DB_INITIALIZE);\r
94\r
95 snp->cdb.CPBaddr = (UINT64) (UINTN) snp->cpb;\r
96 snp->cdb.DBaddr = (UINT64) (UINTN) snp->db;\r
97\r
98 snp->cdb.StatCode = PXE_STATCODE_INITIALIZE;\r
99 snp->cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;\r
100 snp->cdb.IFnum = snp->if_num;\r
101 snp->cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;\r
102\r
103 DEBUG ((EFI_D_NET, "\nsnp->undi.initialize() "));\r
104\r
105 (*snp->issue_undi32_command) ((UINT64) (UINTN) &snp->cdb);\r
106\r
107 if (snp->cdb.StatCode == PXE_STATCODE_SUCCESS) {\r
108 snp->mode.State = EfiSimpleNetworkInitialized;\r
109\r
110 Status = EFI_SUCCESS;\r
111 } else {\r
112 DEBUG (\r
113 (EFI_D_WARN,\r
114 "\nsnp->undi.initialize() %xh:%xh\n",\r
115 snp->cdb.StatFlags,\r
116 snp->cdb.StatCode)\r
117 );\r
118\r
119 if (snp->tx_rx_buffer != NULL) {\r
120 snp->IoFncs->FreeBuffer (\r
121 snp->IoFncs,\r
122 SNP_MEM_PAGES (snp->tx_rx_bufsize),\r
123 (VOID *) snp->tx_rx_buffer\r
124 );\r
125 }\r
126\r
127 snp->tx_rx_buffer = NULL;\r
128\r
129 Status = EFI_DEVICE_ERROR;\r
130 }\r
131\r
132 return Status;\r
133}\r
134\r
135EFI_STATUS\r
136EFIAPI\r
137snp_undi32_initialize (\r
138 IN EFI_SIMPLE_NETWORK_PROTOCOL *this,\r
139 IN UINTN extra_rx_buffer_size OPTIONAL,\r
140 IN UINTN extra_tx_buffer_size OPTIONAL\r
141 )\r
142/*++\r
143\r
144Routine Description:\r
145 This is the SNP interface routine for initializing the interface\r
146 This routine basically retrieves snp structure, checks the SNP state and\r
147 calls the pxe_initialize routine to actually do the undi initialization\r
148\r
149Arguments:\r
150 this - context pointer\r
151 extra_rx_buffer_size - optional parameter, indicates extra space for rx_buffers\r
152 extra_tx_buffer_size - optional parameter, indicates extra space for tx_buffers\r
153\r
154Returns:\r
155\r
156--*/\r
157{\r
158 EFI_STATUS EfiStatus;\r
159 SNP_DRIVER *snp;\r
160\r
161 //\r
162 //\r
163 //\r
164 if (this == 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 if (snp == NULL) {\r
171 return EFI_INVALID_PARAMETER;\r
172 }\r
173 //\r
174 //\r
175 //\r
176 switch (snp->mode.State) {\r
177 case EfiSimpleNetworkStarted:\r
178 break;\r
179\r
180 case EfiSimpleNetworkStopped:\r
181 return EFI_NOT_STARTED;\r
182\r
183 case EfiSimpleNetworkInitialized:\r
184 return EFI_DEVICE_ERROR;\r
185\r
186 default:\r
187 return EFI_DEVICE_ERROR;\r
188 }\r
189 //\r
190 //\r
191 //\r
192 EfiStatus = gBS->CreateEvent (\r
93b0fbc8 193 EVT_NOTIFY_WAIT,\r
194 TPL_NOTIFY,\r
878ddf1f 195 &SnpWaitForPacketNotify,\r
196 snp,\r
197 &snp->snp.WaitForPacket\r
198 );\r
199\r
200 if (EFI_ERROR (EfiStatus)) {\r
201 snp->snp.WaitForPacket = NULL;\r
202 return EFI_DEVICE_ERROR;\r
203 }\r
204 //\r
205 //\r
206 //\r
207 snp->mode.MCastFilterCount = 0;\r
208 snp->mode.ReceiveFilterSetting = 0;\r
209 ZeroMem (snp->mode.MCastFilter, sizeof snp->mode.MCastFilter);\r
210 CopyMem (\r
211 &snp->mode.CurrentAddress,\r
212 &snp->mode.PermanentAddress,\r
213 sizeof (EFI_MAC_ADDRESS)\r
214 );\r
215\r
216 //\r
217 // Compute tx/rx buffer sizes based on UNDI init info and parameters.\r
218 //\r
219 snp->tx_rx_bufsize = (UINT32) (snp->init_info.MemoryRequired + extra_rx_buffer_size + extra_tx_buffer_size);\r
220\r
221 if (snp->mode.MediaPresentSupported) {\r
222 if (pxe_init (snp, PXE_OPFLAGS_INITIALIZE_DETECT_CABLE) == EFI_SUCCESS) {\r
223 snp->mode.MediaPresent = TRUE;\r
224 return EFI_SUCCESS;\r
225 }\r
226 }\r
227\r
228 snp->mode.MediaPresent = FALSE;\r
229\r
230 EfiStatus = pxe_init (snp, PXE_OPFLAGS_INITIALIZE_DO_NOT_DETECT_CABLE);\r
231\r
232 if (EFI_ERROR (EfiStatus)) {\r
233 gBS->CloseEvent (snp->snp.WaitForPacket);\r
234 }\r
235\r
236 return EfiStatus;\r
237}\r