]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4ConfigDriver.c
SourceLevelDebugPkg/SecPeiDebugAgentLib: Restore CPU interrupt state
[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
cbcccd2c 4Copyright (c) 2006 - 2013, 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
cbcccd2c 74 0,\r
72ed3d75 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
5f6aee0f 90 TRUE,\r
91 FALSE\r
72ed3d75 92};\r
93\r
7bce0c5a 94/**\r
95 The entry point for IP4 config driver which install the driver\r
96 binding and component name protocol on its image.\r
97\r
98 @param ImageHandle The image handle of the driver.\r
99 @param SystemTable The system table.\r
b2570da8 100\r
7bce0c5a 101 @retval EFI_SUCCES All the related protocols are installed on the driver.\r
102 @retval Others Failed to install protocols.\r
103\r
104**/\r
b2570da8 105EFI_STATUS\r
6d3ea23f 106EFIAPI\r
b2570da8 107Ip4ConfigDriverEntryPoint (\r
108 IN EFI_HANDLE ImageHandle,\r
109 IN EFI_SYSTEM_TABLE *SystemTable\r
110 )\r
b2570da8 111{\r
cbcccd2c
LG
112 mIp4ConfigTemplate.Result = EFI_NOT_READY;\r
113\r
83cbd279 114 return EfiLibInstallDriverBindingComponentName2 (\r
b2570da8 115 ImageHandle,\r
116 SystemTable,\r
117 &gIp4ConfigDriverBinding,\r
118 ImageHandle,\r
119 &gIp4ConfigComponentName,\r
83cbd279 120 &gIp4ConfigComponentName2\r
b2570da8 121 );\r
122}\r
123\r
124\r
125/**\r
126 Test to see if this driver supports ControllerHandle.\r
127\r
128 @param This Protocol instance pointer.\r
129 @param ControllerHandle Handle of device to test\r
130 @param RemainingDevicePath Optional parameter use to pick a specific child\r
131 device to start.\r
132\r
133 @retval EFI_SUCCES This driver supports this device\r
134 @retval EFI_ALREADY_STARTED This driver is already running on this device\r
135 @retval other This driver does not support this device\r
136\r
137**/\r
138EFI_STATUS\r
139EFIAPI\r
140Ip4ConfigDriverBindingSupported (\r
141 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
142 IN EFI_HANDLE ControllerHandle,\r
143 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
144 )\r
145{\r
146 EFI_STATUS Status;\r
147\r
148 Status = gBS->OpenProtocol (\r
149 ControllerHandle,\r
150 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
151 NULL,\r
152 This->DriverBindingHandle,\r
153 ControllerHandle,\r
154 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
155 );\r
156\r
157 return Status;\r
158}\r
159\r
160\r
161/**\r
162 Start this driver on ControllerHandle.\r
163\r
164 @param This Protocol instance pointer.\r
165 @param ControllerHandle Handle of device to bind driver to\r
166 @param RemainingDevicePath Optional parameter use to pick a specific child\r
167 device to start.\r
168\r
169 @retval EFI_SUCCES This driver is added to ControllerHandle\r
170 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle\r
171 @retval other This driver does not support this device\r
172\r
173**/\r
174EFI_STATUS\r
175EFIAPI\r
176Ip4ConfigDriverBindingStart (\r
177 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
178 IN EFI_HANDLE ControllerHandle,\r
179 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
180 )\r
181{\r
182 EFI_IP4_CONFIG_PROTOCOL *Ip4Config;\r
183 EFI_MANAGED_NETWORK_PROTOCOL *Mnp;\r
184 EFI_HANDLE MnpHandle;\r
185 IP4_CONFIG_INSTANCE *Instance;\r
186 EFI_SIMPLE_NETWORK_MODE SnpMode;\r
b2570da8 187 NIC_IP4_CONFIG_INFO *NicConfig;\r
b2570da8 188 EFI_STATUS Status;\r
d80ea739 189 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
c22b6cdf 190\r
d80ea739 191 Status = gBS->HandleProtocol (\r
192 ControllerHandle,\r
193 &gEfiDevicePathProtocolGuid,\r
194 (VOID **) &ParentDevicePath\r
195 );\r
196 if (EFI_ERROR (Status)) {\r
197 return Status;\r
198 }\r
b2570da8 199\r
200 //\r
201 // Check for multiple start.\r
202 //\r
203 Status = gBS->OpenProtocol (\r
204 ControllerHandle,\r
205 &gEfiIp4ConfigProtocolGuid,\r
4eb65aff 206 (VOID **) &Ip4Config,\r
b2570da8 207 This->DriverBindingHandle,\r
208 ControllerHandle,\r
209 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
210 );\r
211\r
212 if (!EFI_ERROR (Status)) {\r
213 return EFI_ALREADY_STARTED;\r
214 }\r
215\r
216 //\r
217 // Create a MNP child\r
218 //\r
219 Mnp = NULL;\r
220 MnpHandle = NULL;\r
221 Instance = NULL;\r
222\r
223 Status = NetLibCreateServiceChild (\r
224 ControllerHandle,\r
225 This->DriverBindingHandle,\r
226 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
227 &MnpHandle\r
228 );\r
229\r
230 if (EFI_ERROR (Status)) {\r
231 return Status;\r
232 }\r
233\r
234 Status = gBS->OpenProtocol (\r
235 MnpHandle,\r
236 &gEfiManagedNetworkProtocolGuid,\r
237 (VOID **) &Mnp,\r
238 This->DriverBindingHandle,\r
239 ControllerHandle,\r
240 EFI_OPEN_PROTOCOL_BY_DRIVER\r
241 );\r
242\r
243 if (EFI_ERROR (Status)) {\r
244 goto ON_ERROR;\r
245 }\r
246\r
247 //\r
248 // Allocate an instance then initialize it\r
249 //\r
72ed3d75 250 Instance = AllocateCopyPool (sizeof (IP4_CONFIG_INSTANCE), &mIp4ConfigTemplate);\r
b2570da8 251\r
252 if (Instance == NULL) {\r
253 Status = EFI_OUT_OF_RESOURCES;\r
254 goto ON_ERROR;\r
255 }\r
256\r
b2570da8 257 Instance->Controller = ControllerHandle;\r
258 Instance->Image = This->DriverBindingHandle;\r
d80ea739 259 Instance->ParentDevicePath = ParentDevicePath;\r
b2570da8 260\r
67a58d0f 261 CopyMem (&Instance->Ip4ConfigProtocol, &mIp4ConfigProtocolTemplate, sizeof (mIp4ConfigProtocolTemplate));\r
b2570da8 262\r
263 Instance->State = IP4_CONFIG_STATE_IDLE;\r
264 Instance->Mnp = Mnp;\r
265 Instance->MnpHandle = MnpHandle;\r
266\r
b2570da8 267 Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);\r
268\r
269 if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {\r
270 goto ON_ERROR;\r
271 }\r
272\r
273 Instance->NicAddr.Type = (UINT16) SnpMode.IfType;\r
274 Instance->NicAddr.Len = (UINT8) SnpMode.HwAddressSize;\r
63886849 275 CopyMem (&Instance->NicAddr.MacAddr, &SnpMode.CurrentAddress, Instance->NicAddr.Len);\r
b2570da8 276\r
277 //\r
278 // Add it to the global list, and compose the name\r
279 //\r
74df5026 280 Status = NetLibGetMacString (Instance->Controller, Instance->Image, &Instance->MacString);\r
281 if (EFI_ERROR (Status)) {\r
b2570da8 282 goto ON_ERROR;\r
283 }\r
284\r
63886849 285 Status = Ip4ConfigDeviceInit (Instance);\r
63886849 286\r
b2570da8 287 //\r
74df5026 288 // Install the IP4_CONFIG protocols\r
b2570da8 289 //\r
290 Status = gBS->InstallMultipleProtocolInterfaces (\r
291 &ControllerHandle,\r
292 &gEfiIp4ConfigProtocolGuid,\r
293 &Instance->Ip4ConfigProtocol,\r
b2570da8 294 NULL\r
295 );\r
296\r
297 if (EFI_ERROR (Status)) {\r
b2570da8 298 goto ON_ERROR;\r
299 }\r
300\r
9f82599a 301 //\r
302 // A dedicated timer is used to poll underlying media status.\r
303 //\r
304 Status = gBS->CreateEvent (\r
305 EVT_NOTIFY_SIGNAL | EVT_TIMER,\r
306 TPL_CALLBACK,\r
307 MediaChangeDetect,\r
308 Instance,\r
309 &Instance->Timer\r
310 );\r
311\r
312 if (EFI_ERROR (Status)) {\r
313 goto ON_ERROR;\r
314 }\r
315\r
b2570da8 316 //\r
317 // Get the previous configure parameters. If an error happend here,\r
318 // just ignore it because the driver should be able to operate.\r
319 //\r
74df5026 320 NicConfig = Ip4ConfigReadVariable (Instance);\r
b2570da8 321 if (NicConfig != NULL) {\r
928927dd 322 if (!NicConfig->Permanent) {\r
74df5026 323 //\r
324 // Delete the non-permanent configuration.\r
325 //\r
326 Ip4ConfigWriteVariable (Instance, NULL);\r
327 }\r
328\r
766c7483 329 FreePool (NicConfig);\r
b2570da8 330 }\r
331\r
332 return EFI_SUCCESS;\r
333\r
334ON_ERROR:\r
335 if (Instance != NULL) {\r
766c7483 336 FreePool (Instance);\r
b2570da8 337 }\r
338\r
339 if (Mnp != NULL) {\r
340 gBS->CloseProtocol (\r
341 MnpHandle,\r
342 &gEfiManagedNetworkProtocolGuid,\r
343 This->DriverBindingHandle,\r
344 ControllerHandle\r
345 );\r
346 }\r
347\r
348 NetLibDestroyServiceChild (\r
349 ControllerHandle,\r
350 This->DriverBindingHandle,\r
baa9a782 351 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
b2570da8 352 MnpHandle\r
353 );\r
354\r
355 return Status;\r
356}\r
357\r
358\r
359/**\r
360 Stop this driver on ControllerHandle.\r
361\r
362 @param This Protocol instance pointer.\r
363 @param ControllerHandle Handle of device to stop driver on\r
364 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
365 children is zero stop the entire bus driver.\r
366 @param ChildHandleBuffer List of Child Handles to Stop.\r
367\r
368 @retval EFI_SUCCES This driver is removed ControllerHandle\r
369 @retval other This driver was not removed from this device\r
370\r
371**/\r
372EFI_STATUS\r
373EFIAPI\r
374Ip4ConfigDriverBindingStop (\r
375 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
376 IN EFI_HANDLE ControllerHandle,\r
377 IN UINTN NumberOfChildren,\r
378 IN EFI_HANDLE *ChildHandleBuffer\r
379 )\r
380{\r
381 IP4_CONFIG_INSTANCE *Instance;\r
382 EFI_IP4_CONFIG_PROTOCOL *Ip4Config;\r
383 EFI_HANDLE NicHandle;\r
384 EFI_STATUS Status;\r
385\r
386 //\r
387 // IP4_CONFIG instance opens an MNP child. It may also create and open\r
388 // a DHCP child. If this is the DHCP handle, stop the DHCP process. If\r
389 // it is the MNP child, stop the whole driver.\r
390 //\r
391 //\r
392 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);\r
393\r
394 if (NicHandle != NULL) {\r
395 //\r
396 // Get our context back then clean the DHCP up. Notify the user if necessary.\r
397 //\r
398 Status = gBS->OpenProtocol (\r
399 NicHandle,\r
400 &gEfiIp4ConfigProtocolGuid,\r
401 (VOID **) &Ip4Config,\r
402 This->DriverBindingHandle,\r
403 ControllerHandle,\r
404 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
405 );\r
406\r
407 if (EFI_ERROR (Status)) {\r
408 return Status;\r
409 }\r
410\r
411 Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (Ip4Config);\r
412 ASSERT (ControllerHandle == Instance->Dhcp4Handle);\r
413\r
414 Ip4ConfigCleanDhcp4 (Instance);\r
415\r
416 Instance->State = IP4_CONFIG_STATE_CONFIGURED;\r
417 Instance->Result = EFI_DEVICE_ERROR;\r
418\r
419 if (Instance->DoneEvent != NULL) {\r
420 gBS->SignalEvent (Instance->DoneEvent);\r
421 }\r
422\r
423 return EFI_SUCCESS;\r
424 }\r
425\r
426 //\r
427 // This is a MNP handle, stop the whole driver\r
428 //\r
429 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiManagedNetworkProtocolGuid);\r
430\r
431 if (NicHandle == NULL) {\r
432 return EFI_SUCCESS;\r
433 }\r
434\r
435 //\r
436 // Get our context back.\r
437 //\r
438 Status = gBS->OpenProtocol (\r
439 NicHandle,\r
440 &gEfiIp4ConfigProtocolGuid,\r
441 (VOID **) &Ip4Config,\r
442 This->DriverBindingHandle,\r
443 ControllerHandle,\r
444 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
445 );\r
446\r
447 if (EFI_ERROR (Status)) {\r
448 return Status;\r
449 }\r
450\r
451 Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (Ip4Config);\r
452\r
63886849 453 Ip4ConfigDeviceUnload (Instance);\r
454\r
b2570da8 455 //\r
456 // Unload the protocols first to inform the top drivers\r
457 //\r
458 Status = gBS->UninstallMultipleProtocolInterfaces (\r
459 NicHandle,\r
460 &gEfiIp4ConfigProtocolGuid,\r
461 &Instance->Ip4ConfigProtocol,\r
b2570da8 462 NULL\r
463 );\r
464\r
465 if (EFI_ERROR (Status)) {\r
466 return Status;\r
467 }\r
468\r
469 //\r
470 // Release all the resources\r
471 //\r
472 if (Instance->MnpHandle != NULL) {\r
473 gBS->CloseProtocol (\r
474 Instance->MnpHandle,\r
475 &gEfiManagedNetworkProtocolGuid,\r
476 This->DriverBindingHandle,\r
477 NicHandle\r
478 );\r
479\r
480 NetLibDestroyServiceChild (\r
481 NicHandle,\r
482 Instance->Image,\r
483 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
484 Instance->MnpHandle\r
485 );\r
486\r
487 Instance->Mnp = NULL;\r
488 Instance->MnpHandle = NULL;\r
489 }\r
490\r
74df5026 491 if (Instance->MacString != NULL) {\r
492 FreePool (Instance->MacString);\r
493 }\r
494\r
9f82599a 495 if (Instance->Timer != NULL) {\r
496 gBS->SetTimer (Instance->Timer, TimerCancel, 0);\r
497 gBS->CloseEvent (Instance->Timer);\r
498 Instance->Timer = NULL;\r
499 }\r
500 \r
b2570da8 501 Ip4ConfigCleanConfig (Instance);\r
766c7483 502 FreePool (Instance);\r
b2570da8 503\r
504 return EFI_SUCCESS;\r
505}\r