]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4ConfigDriver.c
Add missing braces around initializer.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Ip4ConfigDxe / Ip4ConfigDriver.c
CommitLineData
b2570da8 1/** @file\r
402fa70f 2 The driver binding for IP4 CONFIG protocol.\r
b2570da8 3\r
ce68d3bc 4Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
e5eed7d3 5This program and the accompanying materials\r
b2570da8 6are licensed and made available under the terms and conditions of the BSD License\r
402fa70f 7which accompanies this distribution. The full text of the license may be found at<BR>\r
b2570da8 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
b2570da8 13**/\r
14\r
15\r
16#include "Ip4Config.h"\r
c40a1556 17#include "Ip4ConfigNv.h"\r
74df5026 18#include "NicIp4Variable.h"\r
b2570da8 19\r
c8d8f1e3 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
b2570da8 28\r
72ed3d75 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
ce68d3bc
SZ
54 {\r
55 0\r
56 }\r
72ed3d75 57 },\r
58 {\r
ce68d3bc
SZ
59 {\r
60 0\r
61 }\r
72ed3d75 62 },\r
63 {\r
ce68d3bc
SZ
64 {\r
65 0\r
66 }\r
72ed3d75 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
ce68d3bc
SZ
79 {\r
80 0\r
81 }\r
72ed3d75 82 }\r
83 },\r
84 (CHAR16 *) NULL,\r
85 (NIC_IP4_CONFIG_INFO *) NULL,\r
86 (EFI_DHCP4_PROTOCOL *) NULL,\r
87 NULL,\r
9f82599a 88 NULL,\r
89 NULL,\r
90 TRUE\r
72ed3d75 91};\r
92\r
7bce0c5a 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
b2570da8 99\r
7bce0c5a 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
b2570da8 104EFI_STATUS\r
6d3ea23f 105EFIAPI\r
b2570da8 106Ip4ConfigDriverEntryPoint (\r
107 IN EFI_HANDLE ImageHandle,\r
108 IN EFI_SYSTEM_TABLE *SystemTable\r
109 )\r
b2570da8 110{\r
83cbd279 111 return EfiLibInstallDriverBindingComponentName2 (\r
b2570da8 112 ImageHandle,\r
113 SystemTable,\r
114 &gIp4ConfigDriverBinding,\r
115 ImageHandle,\r
116 &gIp4ConfigComponentName,\r
83cbd279 117 &gIp4ConfigComponentName2\r
b2570da8 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
b2570da8 184 NIC_IP4_CONFIG_INFO *NicConfig;\r
b2570da8 185 EFI_STATUS Status;\r
d80ea739 186 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
c22b6cdf 187\r
d80ea739 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
b2570da8 196\r
197 //\r
198 // Check for multiple start.\r
199 //\r
200 Status = gBS->OpenProtocol (\r
201 ControllerHandle,\r
202 &gEfiIp4ConfigProtocolGuid,\r
4eb65aff 203 (VOID **) &Ip4Config,\r
b2570da8 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
72ed3d75 247 Instance = AllocateCopyPool (sizeof (IP4_CONFIG_INSTANCE), &mIp4ConfigTemplate);\r
b2570da8 248\r
249 if (Instance == NULL) {\r
250 Status = EFI_OUT_OF_RESOURCES;\r
251 goto ON_ERROR;\r
252 }\r
253\r
b2570da8 254 Instance->Controller = ControllerHandle;\r
255 Instance->Image = This->DriverBindingHandle;\r
d80ea739 256 Instance->ParentDevicePath = ParentDevicePath;\r
b2570da8 257\r
67a58d0f 258 CopyMem (&Instance->Ip4ConfigProtocol, &mIp4ConfigProtocolTemplate, sizeof (mIp4ConfigProtocolTemplate));\r
b2570da8 259\r
260 Instance->State = IP4_CONFIG_STATE_IDLE;\r
261 Instance->Mnp = Mnp;\r
262 Instance->MnpHandle = MnpHandle;\r
263\r
b2570da8 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
63886849 272 CopyMem (&Instance->NicAddr.MacAddr, &SnpMode.CurrentAddress, Instance->NicAddr.Len);\r
b2570da8 273\r
274 //\r
275 // Add it to the global list, and compose the name\r
276 //\r
74df5026 277 Status = NetLibGetMacString (Instance->Controller, Instance->Image, &Instance->MacString);\r
278 if (EFI_ERROR (Status)) {\r
b2570da8 279 goto ON_ERROR;\r
280 }\r
281\r
63886849 282 Status = Ip4ConfigDeviceInit (Instance);\r
63886849 283\r
b2570da8 284 //\r
74df5026 285 // Install the IP4_CONFIG protocols\r
b2570da8 286 //\r
287 Status = gBS->InstallMultipleProtocolInterfaces (\r
288 &ControllerHandle,\r
289 &gEfiIp4ConfigProtocolGuid,\r
290 &Instance->Ip4ConfigProtocol,\r
b2570da8 291 NULL\r
292 );\r
293\r
294 if (EFI_ERROR (Status)) {\r
b2570da8 295 goto ON_ERROR;\r
296 }\r
297\r
9f82599a 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
b2570da8 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
74df5026 317 NicConfig = Ip4ConfigReadVariable (Instance);\r
b2570da8 318 if (NicConfig != NULL) {\r
afbccd0a 319 if (!NicConfig->Perment) {\r
74df5026 320 //\r
321 // Delete the non-permanent configuration.\r
322 //\r
323 Ip4ConfigWriteVariable (Instance, NULL);\r
324 }\r
325\r
766c7483 326 FreePool (NicConfig);\r
b2570da8 327 }\r
328\r
329 return EFI_SUCCESS;\r
330\r
331ON_ERROR:\r
332 if (Instance != NULL) {\r
766c7483 333 FreePool (Instance);\r
b2570da8 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
baa9a782 348 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
b2570da8 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
63886849 450 Ip4ConfigDeviceUnload (Instance);\r
451\r
b2570da8 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
b2570da8 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
74df5026 488 if (Instance->MacString != NULL) {\r
489 FreePool (Instance->MacString);\r
490 }\r
491\r
9f82599a 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
b2570da8 498 Ip4ConfigCleanConfig (Instance);\r
766c7483 499 FreePool (Instance);\r
b2570da8 500\r
501 return EFI_SUCCESS;\r
502}\r