]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
Update the copyright notice format
[mirror_edk2.git] / MdeModulePkg / Universal / Network / UefiPxeBcDxe / PxeBcDriver.c
CommitLineData
dc361cc5 1/** @file\r
d59b8b55 2 The driver binding for UEFI PXEBC protocol.\r
7bc01e86 3\r
e5eed7d3
HT
4Copyright (c) 2007 - 2009, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
dc361cc5 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\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
dc361cc5 13**/\r
14\r
15\r
16#include "PxeBcImpl.h"\r
17\r
f737cfb9 18EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding = {\r
19 PxeBcDriverBindingSupported,\r
20 PxeBcDriverBindingStart,\r
21 PxeBcDriverBindingStop,\r
22 0xa,\r
23 NULL,\r
24 NULL\r
25};\r
dc361cc5 26\r
27/**\r
f737cfb9 28 This is the declaration of an EFI image entry point. This entry point is\r
29 the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including\r
30 both device drivers and bus drivers.\r
dc361cc5 31\r
f737cfb9 32 @param ImageHandle The firmware allocated handle for the UEFI image.\r
33 @param SystemTable A pointer to the EFI System Table.\r
dc361cc5 34\r
f737cfb9 35 @retval EFI_SUCCESS The operation completed successfully.\r
36 @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
dc361cc5 37\r
38**/\r
39EFI_STATUS\r
6d3ea23f 40EFIAPI\r
dc361cc5 41PxeBcDriverEntryPoint (\r
42 IN EFI_HANDLE ImageHandle,\r
43 IN EFI_SYSTEM_TABLE *SystemTable\r
44 )\r
45{\r
46 return EfiLibInstallDriverBindingComponentName2 (\r
47 ImageHandle,\r
48 SystemTable,\r
49 &gPxeBcDriverBinding,\r
50 ImageHandle,\r
51 &gPxeBcComponentName,\r
52 &gPxeBcComponentName2\r
53 );\r
54}\r
55\r
56\r
57/**\r
f737cfb9 58 Test to see if this driver supports ControllerHandle. This service\r
59 is called by the EFI boot service ConnectController(). In\r
60 order to make drivers as small as possible, there are a few calling\r
61 restrictions for this service. ConnectController() must\r
62 follow these calling restrictions. If any other agent wishes to call\r
7bc01e86 63 Supported() it must also follow these calling restrictions.\r
f737cfb9 64 PxeBc requires DHCP4 and MTFTP4 protocols.\r
65\r
66 @param This Protocol instance pointer.\r
67 @param ControllerHandle Handle of device to test\r
68 @param RemainingDevicePath Optional parameter use to pick a specific child\r
69 device to start.\r
70\r
71 @retval EFI_SUCCESS This driver supports this device\r
72 @retval EFI_ALREADY_STARTED This driver is already running on this device\r
73 @retval other This driver does not support this device\r
dc361cc5 74\r
75**/\r
76EFI_STATUS\r
77EFIAPI\r
78PxeBcDriverBindingSupported (\r
79 IN EFI_DRIVER_BINDING_PROTOCOL * This,\r
80 IN EFI_HANDLE ControllerHandle,\r
81 IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL\r
82 )\r
83{\r
84 EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;\r
85 EFI_STATUS Status;\r
86\r
87 Status = gBS->OpenProtocol (\r
88 ControllerHandle,\r
89 &gEfiPxeBaseCodeProtocolGuid,\r
90 (VOID **) &PxeBc,\r
91 This->DriverBindingHandle,\r
92 ControllerHandle,\r
93 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
94 );\r
95\r
96 if (!EFI_ERROR (Status)) {\r
97 return EFI_ALREADY_STARTED;\r
98 }\r
99\r
100 Status = gBS->OpenProtocol (\r
101 ControllerHandle,\r
102 &gEfiDhcp4ServiceBindingProtocolGuid,\r
103 NULL,\r
104 This->DriverBindingHandle,\r
105 ControllerHandle,\r
106 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
107 );\r
108\r
109 if (!EFI_ERROR (Status)) {\r
110\r
111 Status = gBS->OpenProtocol (\r
112 ControllerHandle,\r
113 &gEfiMtftp4ServiceBindingProtocolGuid,\r
114 NULL,\r
115 This->DriverBindingHandle,\r
116 ControllerHandle,\r
117 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
118 );\r
119\r
120 }\r
121\r
122 return Status;\r
123}\r
124\r
125\r
126/**\r
f737cfb9 127 Start this driver on ControllerHandle. This service is called by the\r
128 EFI boot service ConnectController(). In order to make\r
129 drivers as small as possible, there are a few calling restrictions for\r
130 this service. ConnectController() must follow these\r
131 calling restrictions. If any other agent wishes to call Start() it\r
132 must also follow these calling restrictions.\r
dc361cc5 133\r
134 @param This Protocol instance pointer.\r
135 @param ControllerHandle Handle of device to bind driver to\r
136 @param RemainingDevicePath Optional parameter use to pick a specific child\r
137 device to start.\r
138\r
f737cfb9 139 @retval EFI_SUCCESS This driver is added to ControllerHandle\r
140 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle\r
141 @retval other This driver does not support this device\r
dc361cc5 142\r
143**/\r
144EFI_STATUS\r
145EFIAPI\r
146PxeBcDriverBindingStart (\r
147 IN EFI_DRIVER_BINDING_PROTOCOL * This,\r
148 IN EFI_HANDLE ControllerHandle,\r
149 IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL\r
150 )\r
151{\r
152 PXEBC_PRIVATE_DATA *Private;\r
153 UINTN Index;\r
154 EFI_STATUS Status;\r
fa6d3ee4 155 EFI_IP4_MODE_DATA Ip4ModeData;\r
dc361cc5 156\r
e48e37fc 157 Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));\r
dc361cc5 158 if (Private == NULL) {\r
159 return EFI_OUT_OF_RESOURCES;\r
160 }\r
161\r
162 Private->Signature = PXEBC_PRIVATE_DATA_SIGNATURE;\r
163 Private->Controller = ControllerHandle;\r
164 Private->Image = This->DriverBindingHandle;\r
165 CopyMem (&Private->PxeBc, &mPxeBcProtocolTemplate, sizeof (Private->PxeBc));\r
166 Private->PxeBc.Mode = &Private->Mode;\r
167 CopyMem (&Private->LoadFile, &mLoadFileProtocolTemplate, sizeof (Private->LoadFile));\r
168\r
169 Private->ProxyOffer.Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
170 Private->Dhcp4Ack.Packet.Ack.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
171 Private->PxeReply.Packet.Ack.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
172\r
173 for (Index = 0; Index < PXEBC_MAX_OFFER_NUM; Index++) {\r
174 Private->Dhcp4Offers[Index].Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
175 }\r
176\r
177 //\r
169a3461 178 // Get the NII interface if it exists.\r
dc361cc5 179 //\r
180 Status = gBS->OpenProtocol (\r
181 ControllerHandle,\r
182 &gEfiNetworkInterfaceIdentifierProtocolGuid_31,\r
183 (VOID **) &Private->Nii,\r
184 This->DriverBindingHandle,\r
185 ControllerHandle,\r
186 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
187 );\r
188 if (EFI_ERROR (Status)) {\r
169a3461 189 Private->Nii = NULL;\r
dc361cc5 190 }\r
191\r
8d285ec0 192 Status = NetLibCreateServiceChild (\r
193 ControllerHandle,\r
194 This->DriverBindingHandle,\r
195 &gEfiArpServiceBindingProtocolGuid,\r
196 &Private->ArpChild\r
197 );\r
198 if (EFI_ERROR (Status)) {\r
199 goto ON_ERROR;\r
200 }\r
201\r
202 Status = gBS->OpenProtocol (\r
203 Private->ArpChild,\r
204 &gEfiArpProtocolGuid,\r
205 (VOID **) &Private->Arp,\r
206 This->DriverBindingHandle,\r
207 ControllerHandle,\r
208 EFI_OPEN_PROTOCOL_BY_DRIVER\r
209 );\r
210 if (EFI_ERROR (Status)) {\r
211 goto ON_ERROR;\r
212 }\r
213\r
dc361cc5 214 Status = NetLibCreateServiceChild (\r
215 ControllerHandle,\r
216 This->DriverBindingHandle,\r
217 &gEfiDhcp4ServiceBindingProtocolGuid,\r
218 &Private->Dhcp4Child\r
219 );\r
220 if (EFI_ERROR (Status)) {\r
221 goto ON_ERROR;\r
222 }\r
223\r
224 Status = gBS->OpenProtocol (\r
225 Private->Dhcp4Child,\r
226 &gEfiDhcp4ProtocolGuid,\r
227 (VOID **) &Private->Dhcp4,\r
228 This->DriverBindingHandle,\r
229 ControllerHandle,\r
230 EFI_OPEN_PROTOCOL_BY_DRIVER\r
231 );\r
232 if (EFI_ERROR (Status)) {\r
233 goto ON_ERROR;\r
234 }\r
235\r
982a9eae 236 Status = NetLibCreateServiceChild (\r
237 ControllerHandle,\r
238 This->DriverBindingHandle,\r
239 &gEfiIp4ServiceBindingProtocolGuid,\r
240 &Private->Ip4Child\r
241 );\r
242 if (EFI_ERROR (Status)) {\r
243 goto ON_ERROR;\r
244 }\r
245\r
246 Status = gBS->OpenProtocol (\r
247 Private->Ip4Child,\r
248 &gEfiIp4ProtocolGuid,\r
249 (VOID **) &Private->Ip4,\r
250 This->DriverBindingHandle,\r
251 ControllerHandle,\r
252 EFI_OPEN_PROTOCOL_BY_DRIVER\r
253 );\r
254 if (EFI_ERROR (Status)) {\r
255 goto ON_ERROR;\r
256 }\r
fa6d3ee4 257
258 //
259 // Get max packet size from Ip4 to calculate block size for Tftp later.\r
260 //
261 Status = Private->Ip4->GetModeData (Private->Ip4, &Ip4ModeData, NULL, NULL);
262 if (EFI_ERROR (Status)) {
7bc01e86 263 goto ON_ERROR;
fa6d3ee4 264 }
265
266 Private->Ip4MaxPacketSize = Ip4ModeData.MaxPacketSize;\r
982a9eae 267\r
dc361cc5 268 Status = NetLibCreateServiceChild (\r
269 ControllerHandle,\r
270 This->DriverBindingHandle,\r
271 &gEfiMtftp4ServiceBindingProtocolGuid,\r
272 &Private->Mtftp4Child\r
273 );\r
274\r
275 if (EFI_ERROR (Status)) {\r
276 goto ON_ERROR;\r
277 }\r
278\r
279 Status = gBS->OpenProtocol (\r
280 Private->Mtftp4Child,\r
281 &gEfiMtftp4ProtocolGuid,\r
282 (VOID **) &Private->Mtftp4,\r
283 This->DriverBindingHandle,\r
284 ControllerHandle,\r
285 EFI_OPEN_PROTOCOL_BY_DRIVER\r
286 );\r
287\r
288 if (EFI_ERROR (Status)) {\r
289 goto ON_ERROR;\r
290 }\r
291\r
292 Status = NetLibCreateServiceChild (\r
293 ControllerHandle,\r
294 This->DriverBindingHandle,\r
295 &gEfiUdp4ServiceBindingProtocolGuid,\r
8792362f 296 &Private->Udp4ReadChild\r
dc361cc5 297 );\r
298\r
299 if (EFI_ERROR (Status)) {\r
300 goto ON_ERROR;\r
301 }\r
302\r
8792362f 303 //\r
304 // The UDP instance for EfiPxeBcUdpRead\r
305 //\r
dc361cc5 306 Status = gBS->OpenProtocol (\r
8792362f 307 Private->Udp4ReadChild,\r
dc361cc5 308 &gEfiUdp4ProtocolGuid,\r
8792362f 309 (VOID **) &Private->Udp4Read,\r
dc361cc5 310 This->DriverBindingHandle,\r
311 ControllerHandle,\r
312 EFI_OPEN_PROTOCOL_BY_DRIVER\r
313 );\r
314\r
315 if (EFI_ERROR (Status)) {\r
316 goto ON_ERROR;\r
317 }\r
318\r
8792362f 319 //\r
320 // The UDP instance for EfiPxeBcUdpWrite\r
321 //\r
322 Status = NetLibCreateServiceChild (\r
7bc01e86 323 ControllerHandle,\r
8792362f 324 This->DriverBindingHandle,\r
325 &gEfiUdp4ServiceBindingProtocolGuid,\r
326 &Private->Udp4WriteChild\r
327 );\r
328 if (EFI_ERROR (Status)) {\r
329 goto ON_ERROR;\r
330 }\r
331\r
332 Status = gBS->OpenProtocol (\r
333 Private->Udp4WriteChild,\r
334 &gEfiUdp4ProtocolGuid,\r
335 (VOID **) &Private->Udp4Write,\r
336 This->DriverBindingHandle,\r
337 ControllerHandle,\r
338 EFI_OPEN_PROTOCOL_BY_DRIVER\r
339 );\r
340 if (EFI_ERROR (Status)) {\r
341 goto ON_ERROR;\r
342 }\r
e48e37fc 343 ZeroMem (&Private->Udp4CfgData, sizeof (EFI_UDP4_CONFIG_DATA));\r
48bd50c5 344 Private->Udp4CfgData.AcceptBroadcast = TRUE;\r
dc361cc5 345 Private->Udp4CfgData.AcceptPromiscuous = FALSE;\r
8792362f 346 Private->Udp4CfgData.AcceptAnyPort = TRUE;\r
dc361cc5 347 Private->Udp4CfgData.AllowDuplicatePort = TRUE;\r
348 Private->Udp4CfgData.TypeOfService = DEFAULT_ToS;\r
349 Private->Udp4CfgData.TimeToLive = DEFAULT_TTL;\r
350 Private->Udp4CfgData.DoNotFragment = FALSE;\r
7bc01e86 351 Private->Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;\r
dc361cc5 352 Private->Udp4CfgData.UseDefaultAddress = FALSE;\r
353\r
8792362f 354 PxeBcInitSeedPacket (&Private->SeedPacket, Private->Udp4Read);\r
982a9eae 355 Private->MacLen = Private->SeedPacket.Dhcp4.Header.HwAddrLen;\r
356 CopyMem (&Private->Mac, &Private->SeedPacket.Dhcp4.Header.ClientHwAddr[0], Private->MacLen);\r
357\r
358\r
359 ZeroMem (&Private->Ip4ConfigData, sizeof (EFI_IP4_CONFIG_DATA));\r
360 Private->Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP;\r
361 Private->Ip4ConfigData.AcceptIcmpErrors = TRUE;\r
362 Private->Ip4ConfigData.TypeOfService = DEFAULT_ToS;\r
363 Private->Ip4ConfigData.TimeToLive = DEFAULT_TTL;\r
364 Private->Ip4ConfigData.DoNotFragment = FALSE;\r
365 Private->Ip4ConfigData.RawData = FALSE;\r
dc361cc5 366\r
367 Status = gBS->InstallMultipleProtocolInterfaces (\r
368 &ControllerHandle,\r
369 &gEfiPxeBaseCodeProtocolGuid,\r
370 &Private->PxeBc,\r
371 &gEfiLoadFileProtocolGuid,\r
372 &Private->LoadFile,\r
373 NULL\r
374 );\r
375 if (EFI_ERROR (Status)) {\r
376 goto ON_ERROR;\r
377 }\r
378\r
379 return EFI_SUCCESS;\r
380\r
381ON_ERROR:\r
382\r
8792362f 383 if (Private->Udp4WriteChild != NULL) {\r
384 gBS->CloseProtocol (\r
385 Private->Udp4WriteChild,\r
386 &gEfiUdp4ProtocolGuid,\r
387 This->DriverBindingHandle,\r
388 ControllerHandle\r
389 );\r
390 NetLibDestroyServiceChild (\r
391 ControllerHandle,\r
392 This->DriverBindingHandle,\r
393 &gEfiUdp4ServiceBindingProtocolGuid,\r
394 Private->Udp4WriteChild\r
395 );\r
396 }\r
397\r
398 if (Private->Udp4ReadChild != NULL) {\r
dc361cc5 399 gBS->CloseProtocol (\r
8792362f 400 Private->Udp4ReadChild,\r
dc361cc5 401 &gEfiUdp4ProtocolGuid,\r
402 This->DriverBindingHandle,\r
403 ControllerHandle\r
404 );\r
405 NetLibDestroyServiceChild (\r
406 ControllerHandle,\r
407 This->DriverBindingHandle,\r
51dc1f65 408 &gEfiUdp4ServiceBindingProtocolGuid,\r
8792362f 409 Private->Udp4ReadChild\r
dc361cc5 410 );\r
411 }\r
412\r
413 if (Private->Mtftp4Child != NULL) {\r
414 gBS->CloseProtocol (\r
415 Private->Mtftp4Child,\r
416 &gEfiMtftp4ProtocolGuid,\r
417 This->DriverBindingHandle,\r
418 ControllerHandle\r
419 );\r
420\r
421 NetLibDestroyServiceChild (\r
422 ControllerHandle,\r
423 This->DriverBindingHandle,\r
51dc1f65 424 &gEfiMtftp4ServiceBindingProtocolGuid,\r
dc361cc5 425 Private->Mtftp4Child\r
426 );\r
427 }\r
428\r
982a9eae 429 if (Private->Ip4Child != NULL) {\r
430 gBS->CloseProtocol (\r
431 Private->Ip4Child,\r
432 &gEfiIp4ProtocolGuid,\r
433 This->DriverBindingHandle,\r
434 ControllerHandle\r
435 );\r
436\r
437 NetLibDestroyServiceChild (\r
438 ControllerHandle,\r
439 This->DriverBindingHandle,\r
440 &gEfiIp4ServiceBindingProtocolGuid,\r
441 Private->Ip4Child\r
442 );\r
443 }\r
444\r
dc361cc5 445 if (Private->Dhcp4Child != NULL) {\r
446 gBS->CloseProtocol (\r
447 Private->Dhcp4Child,\r
448 &gEfiDhcp4ProtocolGuid,\r
449 This->DriverBindingHandle,\r
450 ControllerHandle\r
451 );\r
452\r
453 NetLibDestroyServiceChild (\r
454 ControllerHandle,\r
455 This->DriverBindingHandle,\r
51dc1f65 456 &gEfiDhcp4ServiceBindingProtocolGuid,\r
dc361cc5 457 Private->Dhcp4Child\r
458 );\r
459 }\r
460\r
8d285ec0 461 if (Private->ArpChild != NULL) {\r
462 gBS->CloseProtocol (\r
463 Private->ArpChild,\r
464 &gEfiArpProtocolGuid,\r
465 This->DriverBindingHandle,\r
466 ControllerHandle\r
467 );\r
468\r
469 NetLibDestroyServiceChild (\r
470 ControllerHandle,\r
471 This->DriverBindingHandle,\r
472 &gEfiArpServiceBindingProtocolGuid,\r
473 Private->ArpChild\r
474 );\r
475 }\r
476\r
766c7483 477 FreePool (Private);\r
dc361cc5 478\r
479 return Status;\r
480}\r
481\r
482\r
483/**\r
f737cfb9 484 Stop this driver on ControllerHandle. This service is called by the\r
485 EFI boot service DisconnectController(). In order to\r
486 make drivers as small as possible, there are a few calling\r
487 restrictions for this service. DisconnectController()\r
488 must follow these calling restrictions. If any other agent wishes\r
489 to call Stop() it must also follow these calling restrictions.\r
7bc01e86 490\r
f737cfb9 491 @param This Protocol instance pointer.\r
492 @param ControllerHandle Handle of device to stop driver on\r
493 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
494 children is zero stop the entire bus driver.\r
495 @param ChildHandleBuffer List of Child Handles to Stop.\r
496\r
497 @retval EFI_SUCCESS This driver is removed ControllerHandle\r
498 @retval other This driver was not removed from this device\r
dc361cc5 499\r
500**/\r
501EFI_STATUS\r
502EFIAPI\r
503PxeBcDriverBindingStop (\r
504 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
505 IN EFI_HANDLE ControllerHandle,\r
506 IN UINTN NumberOfChildren,\r
507 IN EFI_HANDLE *ChildHandleBuffer\r
508 )\r
509{\r
510 PXEBC_PRIVATE_DATA *Private;\r
511 EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;\r
512 EFI_HANDLE NicHandle;\r
513 EFI_STATUS Status;\r
514\r
7d7a8ea2 515 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);\r
dc361cc5 516 if (NicHandle == NULL) {\r
7d7a8ea2 517 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);\r
dc361cc5 518\r
519 if (NicHandle == NULL) {\r
aa6c4e3c 520 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);\r
7d7a8ea2 521\r
522 if (NicHandle == NULL) {\r
aa6c4e3c 523 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp4ProtocolGuid);\r
7d7a8ea2 524\r
aa6c4e3c 525 if (NicHandle == NULL) {\r
526 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid);\r
7d7a8ea2 527\r
aa6c4e3c 528 if (NicHandle == NULL) {\r
529 return EFI_DEVICE_ERROR;\r
530 }\r
531 }\r
7d7a8ea2 532 }\r
dc361cc5 533 }\r
534 }\r
535\r
536 Status = gBS->OpenProtocol (\r
537 NicHandle,\r
538 &gEfiPxeBaseCodeProtocolGuid,\r
539 (VOID **) &PxeBc,\r
540 This->DriverBindingHandle,\r
541 ControllerHandle,\r
542 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
543 );\r
544\r
545 if (EFI_ERROR (Status)) {\r
546 return Status;\r
547 }\r
7bc01e86 548\r
8f8bfa5b 549 //\r
550 // Stop functionality of PXE Base Code protocol\r
551 //\r
552 Status = PxeBc->Stop (PxeBc);\r
553 if (Status != EFI_SUCCESS && Status != EFI_NOT_STARTED) {\r
554 return Status;\r
555 }\r
dc361cc5 556\r
557 Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc);\r
558\r
559 Status = gBS->UninstallMultipleProtocolInterfaces (\r
560 NicHandle,\r
561 &gEfiPxeBaseCodeProtocolGuid,\r
562 &Private->PxeBc,\r
563 &gEfiLoadFileProtocolGuid,\r
564 &Private->LoadFile,\r
565 NULL\r
566 );\r
567\r
568 if (!EFI_ERROR (Status)) {\r
569\r
570 gBS->CloseProtocol (\r
8792362f 571 Private->Udp4WriteChild,\r
572 &gEfiUdp4ProtocolGuid,\r
573 This->DriverBindingHandle,\r
574 NicHandle\r
575 );\r
576 NetLibDestroyServiceChild (\r
577 ControllerHandle,\r
578 This->DriverBindingHandle,\r
579 &gEfiUdp4ServiceBindingProtocolGuid,\r
580 Private->Udp4WriteChild\r
581 );\r
582\r
583 gBS->CloseProtocol (\r
584 Private->Udp4ReadChild,\r
dc361cc5 585 &gEfiUdp4ProtocolGuid,\r
586 This->DriverBindingHandle,\r
51dc1f65 587 NicHandle\r
dc361cc5 588 );\r
589 NetLibDestroyServiceChild (\r
51dc1f65 590 NicHandle,\r
dc361cc5 591 This->DriverBindingHandle,\r
592 &gEfiUdp4ServiceBindingProtocolGuid,\r
8792362f 593 Private->Udp4ReadChild\r
dc361cc5 594 );\r
595\r
596 gBS->CloseProtocol (\r
597 Private->Dhcp4Child,\r
598 &gEfiDhcp4ProtocolGuid,\r
599 This->DriverBindingHandle,\r
51dc1f65 600 NicHandle\r
dc361cc5 601 );\r
602 NetLibDestroyServiceChild (\r
51dc1f65 603 NicHandle,\r
dc361cc5 604 This->DriverBindingHandle,\r
605 &gEfiDhcp4ServiceBindingProtocolGuid,\r
606 Private->Dhcp4Child\r
607 );\r
608\r
609 gBS->CloseProtocol (\r
610 Private->Mtftp4Child,\r
611 &gEfiMtftp4ProtocolGuid,\r
612 This->DriverBindingHandle,\r
51dc1f65 613 NicHandle\r
dc361cc5 614 );\r
615 NetLibDestroyServiceChild (\r
51dc1f65 616 NicHandle,\r
dc361cc5 617 This->DriverBindingHandle,\r
618 &gEfiMtftp4ServiceBindingProtocolGuid,\r
619 Private->Mtftp4Child\r
620 );\r
621\r
aa6c4e3c 622 gBS->CloseProtocol (\r
623 Private->Ip4Child,\r
624 &gEfiIp4ProtocolGuid,\r
625 This->DriverBindingHandle,\r
626 NicHandle\r
627 );\r
628 NetLibDestroyServiceChild (\r
629 NicHandle,\r
630 This->DriverBindingHandle,\r
631 &gEfiIp4ServiceBindingProtocolGuid,\r
632 Private->Ip4Child\r
633 );\r
634\r
8d285ec0 635 gBS->CloseProtocol (\r
636 Private->ArpChild,\r
637 &gEfiArpProtocolGuid,\r
638 This->DriverBindingHandle,\r
639 NicHandle\r
640 );\r
641 NetLibDestroyServiceChild (\r
642 NicHandle,\r
643 This->DriverBindingHandle,\r
644 &gEfiArpServiceBindingProtocolGuid,\r
645 Private->ArpChild\r
646 );\r
647\r
766c7483 648 FreePool (Private);\r
dc361cc5 649 }\r
650\r
651 return Status;\r
652}\r
653\r
dc361cc5 654\r