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