]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4ConfigDriver.c
Add missing braces around initializer.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Ip4ConfigDxe / Ip4ConfigDriver.c
... / ...
CommitLineData
1/** @file\r
2 The driver binding for IP4 CONFIG protocol.\r
3\r
4Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at<BR>\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15\r
16#include "Ip4Config.h"\r
17#include "Ip4ConfigNv.h"\r
18#include "NicIp4Variable.h"\r
19\r
20EFI_DRIVER_BINDING_PROTOCOL gIp4ConfigDriverBinding = {\r
21 Ip4ConfigDriverBindingSupported,\r
22 Ip4ConfigDriverBindingStart,\r
23 Ip4ConfigDriverBindingStop,\r
24 0xa,\r
25 NULL,\r
26 NULL\r
27};\r
28\r
29//\r
30// The intance of template of IP4 Config private data\r
31//\r
32IP4_CONFIG_INSTANCE mIp4ConfigTemplate = {\r
33 IP4_CONFIG_INSTANCE_SIGNATURE,\r
34 NULL,\r
35 NULL,\r
36 (EFI_DEVICE_PATH_PROTOCOL *) NULL,\r
37 {\r
38 NULL,\r
39 NULL,\r
40 NULL\r
41 },\r
42 {\r
43 NULL,\r
44 NULL,\r
45 NULL\r
46 },\r
47 NULL,\r
48 (EFI_DEVICE_PATH_PROTOCOL *) NULL,\r
49 NULL,\r
50 {\r
51 FALSE,\r
52 FALSE,\r
53 {\r
54 {\r
55 0\r
56 }\r
57 },\r
58 {\r
59 {\r
60 0\r
61 }\r
62 },\r
63 {\r
64 {\r
65 0\r
66 }\r
67 }\r
68 },\r
69 0,\r
70 (EFI_MANAGED_NETWORK_PROTOCOL *) NULL,\r
71 NULL,\r
72 NULL,\r
73 NULL,\r
74 EFI_NOT_READY,\r
75 {\r
76 0,\r
77 0,\r
78 {\r
79 {\r
80 0\r
81 }\r
82 }\r
83 },\r
84 (CHAR16 *) NULL,\r
85 (NIC_IP4_CONFIG_INFO *) NULL,\r
86 (EFI_DHCP4_PROTOCOL *) NULL,\r
87 NULL,\r
88 NULL,\r
89 NULL,\r
90 TRUE\r
91};\r
92\r
93/**\r
94 The entry point for IP4 config driver which install the driver\r
95 binding and component name protocol on its image.\r
96\r
97 @param ImageHandle The image handle of the driver.\r
98 @param SystemTable The system table.\r
99\r
100 @retval EFI_SUCCES All the related protocols are installed on the driver.\r
101 @retval Others Failed to install protocols.\r
102\r
103**/\r
104EFI_STATUS\r
105EFIAPI\r
106Ip4ConfigDriverEntryPoint (\r
107 IN EFI_HANDLE ImageHandle,\r
108 IN EFI_SYSTEM_TABLE *SystemTable\r
109 )\r
110{\r
111 return EfiLibInstallDriverBindingComponentName2 (\r
112 ImageHandle,\r
113 SystemTable,\r
114 &gIp4ConfigDriverBinding,\r
115 ImageHandle,\r
116 &gIp4ConfigComponentName,\r
117 &gIp4ConfigComponentName2\r
118 );\r
119}\r
120\r
121\r
122/**\r
123 Test to see if this driver supports ControllerHandle.\r
124\r
125 @param This Protocol instance pointer.\r
126 @param ControllerHandle Handle of device to test\r
127 @param RemainingDevicePath Optional parameter use to pick a specific child\r
128 device to start.\r
129\r
130 @retval EFI_SUCCES This driver supports this device\r
131 @retval EFI_ALREADY_STARTED This driver is already running on this device\r
132 @retval other This driver does not support this device\r
133\r
134**/\r
135EFI_STATUS\r
136EFIAPI\r
137Ip4ConfigDriverBindingSupported (\r
138 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
139 IN EFI_HANDLE ControllerHandle,\r
140 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
141 )\r
142{\r
143 EFI_STATUS Status;\r
144\r
145 Status = gBS->OpenProtocol (\r
146 ControllerHandle,\r
147 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
148 NULL,\r
149 This->DriverBindingHandle,\r
150 ControllerHandle,\r
151 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
152 );\r
153\r
154 return Status;\r
155}\r
156\r
157\r
158/**\r
159 Start this driver on ControllerHandle.\r
160\r
161 @param This Protocol instance pointer.\r
162 @param ControllerHandle Handle of device to bind driver to\r
163 @param RemainingDevicePath Optional parameter use to pick a specific child\r
164 device to start.\r
165\r
166 @retval EFI_SUCCES This driver is added to ControllerHandle\r
167 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle\r
168 @retval other This driver does not support this device\r
169\r
170**/\r
171EFI_STATUS\r
172EFIAPI\r
173Ip4ConfigDriverBindingStart (\r
174 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
175 IN EFI_HANDLE ControllerHandle,\r
176 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
177 )\r
178{\r
179 EFI_IP4_CONFIG_PROTOCOL *Ip4Config;\r
180 EFI_MANAGED_NETWORK_PROTOCOL *Mnp;\r
181 EFI_HANDLE MnpHandle;\r
182 IP4_CONFIG_INSTANCE *Instance;\r
183 EFI_SIMPLE_NETWORK_MODE SnpMode;\r
184 NIC_IP4_CONFIG_INFO *NicConfig;\r
185 EFI_STATUS Status;\r
186 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
187\r
188 Status = gBS->HandleProtocol (\r
189 ControllerHandle,\r
190 &gEfiDevicePathProtocolGuid,\r
191 (VOID **) &ParentDevicePath\r
192 );\r
193 if (EFI_ERROR (Status)) {\r
194 return Status;\r
195 }\r
196\r
197 //\r
198 // Check for multiple start.\r
199 //\r
200 Status = gBS->OpenProtocol (\r
201 ControllerHandle,\r
202 &gEfiIp4ConfigProtocolGuid,\r
203 (VOID **) &Ip4Config,\r
204 This->DriverBindingHandle,\r
205 ControllerHandle,\r
206 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
207 );\r
208\r
209 if (!EFI_ERROR (Status)) {\r
210 return EFI_ALREADY_STARTED;\r
211 }\r
212\r
213 //\r
214 // Create a MNP child\r
215 //\r
216 Mnp = NULL;\r
217 MnpHandle = NULL;\r
218 Instance = NULL;\r
219\r
220 Status = NetLibCreateServiceChild (\r
221 ControllerHandle,\r
222 This->DriverBindingHandle,\r
223 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
224 &MnpHandle\r
225 );\r
226\r
227 if (EFI_ERROR (Status)) {\r
228 return Status;\r
229 }\r
230\r
231 Status = gBS->OpenProtocol (\r
232 MnpHandle,\r
233 &gEfiManagedNetworkProtocolGuid,\r
234 (VOID **) &Mnp,\r
235 This->DriverBindingHandle,\r
236 ControllerHandle,\r
237 EFI_OPEN_PROTOCOL_BY_DRIVER\r
238 );\r
239\r
240 if (EFI_ERROR (Status)) {\r
241 goto ON_ERROR;\r
242 }\r
243\r
244 //\r
245 // Allocate an instance then initialize it\r
246 //\r
247 Instance = AllocateCopyPool (sizeof (IP4_CONFIG_INSTANCE), &mIp4ConfigTemplate);\r
248\r
249 if (Instance == NULL) {\r
250 Status = EFI_OUT_OF_RESOURCES;\r
251 goto ON_ERROR;\r
252 }\r
253\r
254 Instance->Controller = ControllerHandle;\r
255 Instance->Image = This->DriverBindingHandle;\r
256 Instance->ParentDevicePath = ParentDevicePath;\r
257\r
258 CopyMem (&Instance->Ip4ConfigProtocol, &mIp4ConfigProtocolTemplate, sizeof (mIp4ConfigProtocolTemplate));\r
259\r
260 Instance->State = IP4_CONFIG_STATE_IDLE;\r
261 Instance->Mnp = Mnp;\r
262 Instance->MnpHandle = MnpHandle;\r
263\r
264 Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);\r
265\r
266 if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {\r
267 goto ON_ERROR;\r
268 }\r
269\r
270 Instance->NicAddr.Type = (UINT16) SnpMode.IfType;\r
271 Instance->NicAddr.Len = (UINT8) SnpMode.HwAddressSize;\r
272 CopyMem (&Instance->NicAddr.MacAddr, &SnpMode.CurrentAddress, Instance->NicAddr.Len);\r
273\r
274 //\r
275 // Add it to the global list, and compose the name\r
276 //\r
277 Status = NetLibGetMacString (Instance->Controller, Instance->Image, &Instance->MacString);\r
278 if (EFI_ERROR (Status)) {\r
279 goto ON_ERROR;\r
280 }\r
281\r
282 Status = Ip4ConfigDeviceInit (Instance);\r
283\r
284 //\r
285 // Install the IP4_CONFIG protocols\r
286 //\r
287 Status = gBS->InstallMultipleProtocolInterfaces (\r
288 &ControllerHandle,\r
289 &gEfiIp4ConfigProtocolGuid,\r
290 &Instance->Ip4ConfigProtocol,\r
291 NULL\r
292 );\r
293\r
294 if (EFI_ERROR (Status)) {\r
295 goto ON_ERROR;\r
296 }\r
297\r
298 //\r
299 // A dedicated timer is used to poll underlying media status.\r
300 //\r
301 Status = gBS->CreateEvent (\r
302 EVT_NOTIFY_SIGNAL | EVT_TIMER,\r
303 TPL_CALLBACK,\r
304 MediaChangeDetect,\r
305 Instance,\r
306 &Instance->Timer\r
307 );\r
308\r
309 if (EFI_ERROR (Status)) {\r
310 goto ON_ERROR;\r
311 }\r
312\r
313 //\r
314 // Get the previous configure parameters. If an error happend here,\r
315 // just ignore it because the driver should be able to operate.\r
316 //\r
317 NicConfig = Ip4ConfigReadVariable (Instance);\r
318 if (NicConfig != NULL) {\r
319 if (!NicConfig->Perment) {\r
320 //\r
321 // Delete the non-permanent configuration.\r
322 //\r
323 Ip4ConfigWriteVariable (Instance, NULL);\r
324 }\r
325\r
326 FreePool (NicConfig);\r
327 }\r
328\r
329 return EFI_SUCCESS;\r
330\r
331ON_ERROR:\r
332 if (Instance != NULL) {\r
333 FreePool (Instance);\r
334 }\r
335\r
336 if (Mnp != NULL) {\r
337 gBS->CloseProtocol (\r
338 MnpHandle,\r
339 &gEfiManagedNetworkProtocolGuid,\r
340 This->DriverBindingHandle,\r
341 ControllerHandle\r
342 );\r
343 }\r
344\r
345 NetLibDestroyServiceChild (\r
346 ControllerHandle,\r
347 This->DriverBindingHandle,\r
348 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
349 MnpHandle\r
350 );\r
351\r
352 return Status;\r
353}\r
354\r
355\r
356/**\r
357 Stop this driver on ControllerHandle.\r
358\r
359 @param This Protocol instance pointer.\r
360 @param ControllerHandle Handle of device to stop driver on\r
361 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
362 children is zero stop the entire bus driver.\r
363 @param ChildHandleBuffer List of Child Handles to Stop.\r
364\r
365 @retval EFI_SUCCES This driver is removed ControllerHandle\r
366 @retval other This driver was not removed from this device\r
367\r
368**/\r
369EFI_STATUS\r
370EFIAPI\r
371Ip4ConfigDriverBindingStop (\r
372 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
373 IN EFI_HANDLE ControllerHandle,\r
374 IN UINTN NumberOfChildren,\r
375 IN EFI_HANDLE *ChildHandleBuffer\r
376 )\r
377{\r
378 IP4_CONFIG_INSTANCE *Instance;\r
379 EFI_IP4_CONFIG_PROTOCOL *Ip4Config;\r
380 EFI_HANDLE NicHandle;\r
381 EFI_STATUS Status;\r
382\r
383 //\r
384 // IP4_CONFIG instance opens an MNP child. It may also create and open\r
385 // a DHCP child. If this is the DHCP handle, stop the DHCP process. If\r
386 // it is the MNP child, stop the whole driver.\r
387 //\r
388 //\r
389 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);\r
390\r
391 if (NicHandle != NULL) {\r
392 //\r
393 // Get our context back then clean the DHCP up. Notify the user if necessary.\r
394 //\r
395 Status = gBS->OpenProtocol (\r
396 NicHandle,\r
397 &gEfiIp4ConfigProtocolGuid,\r
398 (VOID **) &Ip4Config,\r
399 This->DriverBindingHandle,\r
400 ControllerHandle,\r
401 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
402 );\r
403\r
404 if (EFI_ERROR (Status)) {\r
405 return Status;\r
406 }\r
407\r
408 Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (Ip4Config);\r
409 ASSERT (ControllerHandle == Instance->Dhcp4Handle);\r
410\r
411 Ip4ConfigCleanDhcp4 (Instance);\r
412\r
413 Instance->State = IP4_CONFIG_STATE_CONFIGURED;\r
414 Instance->Result = EFI_DEVICE_ERROR;\r
415\r
416 if (Instance->DoneEvent != NULL) {\r
417 gBS->SignalEvent (Instance->DoneEvent);\r
418 }\r
419\r
420 return EFI_SUCCESS;\r
421 }\r
422\r
423 //\r
424 // This is a MNP handle, stop the whole driver\r
425 //\r
426 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiManagedNetworkProtocolGuid);\r
427\r
428 if (NicHandle == NULL) {\r
429 return EFI_SUCCESS;\r
430 }\r
431\r
432 //\r
433 // Get our context back.\r
434 //\r
435 Status = gBS->OpenProtocol (\r
436 NicHandle,\r
437 &gEfiIp4ConfigProtocolGuid,\r
438 (VOID **) &Ip4Config,\r
439 This->DriverBindingHandle,\r
440 ControllerHandle,\r
441 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
442 );\r
443\r
444 if (EFI_ERROR (Status)) {\r
445 return Status;\r
446 }\r
447\r
448 Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (Ip4Config);\r
449\r
450 Ip4ConfigDeviceUnload (Instance);\r
451\r
452 //\r
453 // Unload the protocols first to inform the top drivers\r
454 //\r
455 Status = gBS->UninstallMultipleProtocolInterfaces (\r
456 NicHandle,\r
457 &gEfiIp4ConfigProtocolGuid,\r
458 &Instance->Ip4ConfigProtocol,\r
459 NULL\r
460 );\r
461\r
462 if (EFI_ERROR (Status)) {\r
463 return Status;\r
464 }\r
465\r
466 //\r
467 // Release all the resources\r
468 //\r
469 if (Instance->MnpHandle != NULL) {\r
470 gBS->CloseProtocol (\r
471 Instance->MnpHandle,\r
472 &gEfiManagedNetworkProtocolGuid,\r
473 This->DriverBindingHandle,\r
474 NicHandle\r
475 );\r
476\r
477 NetLibDestroyServiceChild (\r
478 NicHandle,\r
479 Instance->Image,\r
480 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
481 Instance->MnpHandle\r
482 );\r
483\r
484 Instance->Mnp = NULL;\r
485 Instance->MnpHandle = NULL;\r
486 }\r
487\r
488 if (Instance->MacString != NULL) {\r
489 FreePool (Instance->MacString);\r
490 }\r
491\r
492 if (Instance->Timer != NULL) {\r
493 gBS->SetTimer (Instance->Timer, TimerCancel, 0);\r
494 gBS->CloseEvent (Instance->Timer);\r
495 Instance->Timer = NULL;\r
496 }\r
497 \r
498 Ip4ConfigCleanConfig (Instance);\r
499 FreePool (Instance);\r
500\r
501 return EFI_SUCCESS;\r
502}\r