]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
NetworkPkg: Remove some clarification from IScsiDxe.inf
[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
14e84fd8 4Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>\r
e5eed7d3 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
4b738c76
HT
257\r
258 //\r
fa6d3ee4 259 // Get max packet size from Ip4 to calculate block size for Tftp later.\r
4b738c76
HT
260 //\r
261 Status = Private->Ip4->GetModeData (Private->Ip4, &Ip4ModeData, NULL, NULL);\r
262 if (EFI_ERROR (Status)) {\r
263 goto ON_ERROR;\r
264 }\r
265\r
fa6d3ee4 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
c82291bc 344 Private->Udp4CfgData.AcceptBroadcast = FALSE;\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
14e84fd8
ZL
378 //\r
379 // Locate Ip4->Ip4Config2 and store it for set IPv4 Policy.\r
380 //\r
381 Status = gBS->HandleProtocol (\r
382 ControllerHandle,\r
383 &gEfiIp4Config2ProtocolGuid,\r
384 (VOID **) &Private->Ip4Config2\r
385 );\r
386 if (EFI_ERROR (Status)) {\r
387 goto ON_ERROR;\r
388 }\r
dc361cc5 389\r
390 return EFI_SUCCESS;\r
391\r
392ON_ERROR:\r
393\r
8792362f 394 if (Private->Udp4WriteChild != NULL) {\r
395 gBS->CloseProtocol (\r
396 Private->Udp4WriteChild,\r
397 &gEfiUdp4ProtocolGuid,\r
398 This->DriverBindingHandle,\r
399 ControllerHandle\r
400 );\r
401 NetLibDestroyServiceChild (\r
402 ControllerHandle,\r
403 This->DriverBindingHandle,\r
404 &gEfiUdp4ServiceBindingProtocolGuid,\r
405 Private->Udp4WriteChild\r
406 );\r
407 }\r
408\r
409 if (Private->Udp4ReadChild != NULL) {\r
dc361cc5 410 gBS->CloseProtocol (\r
8792362f 411 Private->Udp4ReadChild,\r
dc361cc5 412 &gEfiUdp4ProtocolGuid,\r
413 This->DriverBindingHandle,\r
414 ControllerHandle\r
415 );\r
416 NetLibDestroyServiceChild (\r
417 ControllerHandle,\r
418 This->DriverBindingHandle,\r
51dc1f65 419 &gEfiUdp4ServiceBindingProtocolGuid,\r
8792362f 420 Private->Udp4ReadChild\r
dc361cc5 421 );\r
422 }\r
423\r
424 if (Private->Mtftp4Child != NULL) {\r
425 gBS->CloseProtocol (\r
426 Private->Mtftp4Child,\r
427 &gEfiMtftp4ProtocolGuid,\r
428 This->DriverBindingHandle,\r
429 ControllerHandle\r
430 );\r
431\r
432 NetLibDestroyServiceChild (\r
433 ControllerHandle,\r
434 This->DriverBindingHandle,\r
51dc1f65 435 &gEfiMtftp4ServiceBindingProtocolGuid,\r
dc361cc5 436 Private->Mtftp4Child\r
437 );\r
438 }\r
439\r
982a9eae 440 if (Private->Ip4Child != NULL) {\r
441 gBS->CloseProtocol (\r
442 Private->Ip4Child,\r
443 &gEfiIp4ProtocolGuid,\r
444 This->DriverBindingHandle,\r
445 ControllerHandle\r
446 );\r
447\r
448 NetLibDestroyServiceChild (\r
449 ControllerHandle,\r
450 This->DriverBindingHandle,\r
451 &gEfiIp4ServiceBindingProtocolGuid,\r
452 Private->Ip4Child\r
453 );\r
454 }\r
455\r
dc361cc5 456 if (Private->Dhcp4Child != NULL) {\r
457 gBS->CloseProtocol (\r
458 Private->Dhcp4Child,\r
459 &gEfiDhcp4ProtocolGuid,\r
460 This->DriverBindingHandle,\r
461 ControllerHandle\r
462 );\r
463\r
464 NetLibDestroyServiceChild (\r
465 ControllerHandle,\r
466 This->DriverBindingHandle,\r
51dc1f65 467 &gEfiDhcp4ServiceBindingProtocolGuid,\r
dc361cc5 468 Private->Dhcp4Child\r
469 );\r
470 }\r
471\r
8d285ec0 472 if (Private->ArpChild != NULL) {\r
473 gBS->CloseProtocol (\r
474 Private->ArpChild,\r
475 &gEfiArpProtocolGuid,\r
476 This->DriverBindingHandle,\r
477 ControllerHandle\r
478 );\r
479\r
480 NetLibDestroyServiceChild (\r
481 ControllerHandle,\r
482 This->DriverBindingHandle,\r
483 &gEfiArpServiceBindingProtocolGuid,\r
484 Private->ArpChild\r
485 );\r
486 }\r
487\r
766c7483 488 FreePool (Private);\r
dc361cc5 489\r
490 return Status;\r
491}\r
492\r
493\r
494/**\r
f737cfb9 495 Stop this driver on ControllerHandle. This service is called by the\r
496 EFI boot service DisconnectController(). In order to\r
497 make drivers as small as possible, there are a few calling\r
498 restrictions for this service. DisconnectController()\r
499 must follow these calling restrictions. If any other agent wishes\r
500 to call Stop() it must also follow these calling restrictions.\r
7bc01e86 501\r
f737cfb9 502 @param This Protocol instance pointer.\r
503 @param ControllerHandle Handle of device to stop driver on\r
504 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
505 children is zero stop the entire bus driver.\r
506 @param ChildHandleBuffer List of Child Handles to Stop.\r
507\r
508 @retval EFI_SUCCESS This driver is removed ControllerHandle\r
509 @retval other This driver was not removed from this device\r
dc361cc5 510\r
511**/\r
512EFI_STATUS\r
513EFIAPI\r
514PxeBcDriverBindingStop (\r
515 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
516 IN EFI_HANDLE ControllerHandle,\r
517 IN UINTN NumberOfChildren,\r
518 IN EFI_HANDLE *ChildHandleBuffer\r
519 )\r
520{\r
521 PXEBC_PRIVATE_DATA *Private;\r
522 EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;\r
523 EFI_HANDLE NicHandle;\r
524 EFI_STATUS Status;\r
525\r
7d7a8ea2 526 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);\r
dc361cc5 527 if (NicHandle == NULL) {\r
7d7a8ea2 528 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);\r
dc361cc5 529\r
530 if (NicHandle == NULL) {\r
aa6c4e3c 531 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);\r
7d7a8ea2 532\r
533 if (NicHandle == NULL) {\r
aa6c4e3c 534 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp4ProtocolGuid);\r
7d7a8ea2 535\r
aa6c4e3c 536 if (NicHandle == NULL) {\r
537 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid);\r
7d7a8ea2 538\r
aa6c4e3c 539 if (NicHandle == NULL) {\r
216f7970 540 return EFI_SUCCESS;\r
aa6c4e3c 541 }\r
542 }\r
7d7a8ea2 543 }\r
dc361cc5 544 }\r
545 }\r
546\r
547 Status = gBS->OpenProtocol (\r
548 NicHandle,\r
549 &gEfiPxeBaseCodeProtocolGuid,\r
550 (VOID **) &PxeBc,\r
551 This->DriverBindingHandle,\r
552 ControllerHandle,\r
553 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
554 );\r
555\r
556 if (EFI_ERROR (Status)) {\r
557 return Status;\r
558 }\r
7bc01e86 559\r
8f8bfa5b 560 //\r
561 // Stop functionality of PXE Base Code protocol\r
562 //\r
563 Status = PxeBc->Stop (PxeBc);\r
564 if (Status != EFI_SUCCESS && Status != EFI_NOT_STARTED) {\r
565 return Status;\r
566 }\r
dc361cc5 567\r
568 Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc);\r
569\r
570 Status = gBS->UninstallMultipleProtocolInterfaces (\r
571 NicHandle,\r
572 &gEfiPxeBaseCodeProtocolGuid,\r
573 &Private->PxeBc,\r
574 &gEfiLoadFileProtocolGuid,\r
575 &Private->LoadFile,\r
576 NULL\r
577 );\r
578\r
579 if (!EFI_ERROR (Status)) {\r
580\r
581 gBS->CloseProtocol (\r
8792362f 582 Private->Udp4WriteChild,\r
583 &gEfiUdp4ProtocolGuid,\r
584 This->DriverBindingHandle,\r
585 NicHandle\r
586 );\r
587 NetLibDestroyServiceChild (\r
588 ControllerHandle,\r
589 This->DriverBindingHandle,\r
590 &gEfiUdp4ServiceBindingProtocolGuid,\r
591 Private->Udp4WriteChild\r
592 );\r
593\r
594 gBS->CloseProtocol (\r
595 Private->Udp4ReadChild,\r
dc361cc5 596 &gEfiUdp4ProtocolGuid,\r
597 This->DriverBindingHandle,\r
51dc1f65 598 NicHandle\r
dc361cc5 599 );\r
600 NetLibDestroyServiceChild (\r
51dc1f65 601 NicHandle,\r
dc361cc5 602 This->DriverBindingHandle,\r
603 &gEfiUdp4ServiceBindingProtocolGuid,\r
8792362f 604 Private->Udp4ReadChild\r
dc361cc5 605 );\r
606\r
607 gBS->CloseProtocol (\r
608 Private->Dhcp4Child,\r
609 &gEfiDhcp4ProtocolGuid,\r
610 This->DriverBindingHandle,\r
51dc1f65 611 NicHandle\r
dc361cc5 612 );\r
613 NetLibDestroyServiceChild (\r
51dc1f65 614 NicHandle,\r
dc361cc5 615 This->DriverBindingHandle,\r
616 &gEfiDhcp4ServiceBindingProtocolGuid,\r
617 Private->Dhcp4Child\r
618 );\r
619\r
620 gBS->CloseProtocol (\r
621 Private->Mtftp4Child,\r
622 &gEfiMtftp4ProtocolGuid,\r
623 This->DriverBindingHandle,\r
51dc1f65 624 NicHandle\r
dc361cc5 625 );\r
626 NetLibDestroyServiceChild (\r
51dc1f65 627 NicHandle,\r
dc361cc5 628 This->DriverBindingHandle,\r
629 &gEfiMtftp4ServiceBindingProtocolGuid,\r
630 Private->Mtftp4Child\r
631 );\r
632\r
aa6c4e3c 633 gBS->CloseProtocol (\r
634 Private->Ip4Child,\r
635 &gEfiIp4ProtocolGuid,\r
636 This->DriverBindingHandle,\r
637 NicHandle\r
638 );\r
639 NetLibDestroyServiceChild (\r
640 NicHandle,\r
641 This->DriverBindingHandle,\r
642 &gEfiIp4ServiceBindingProtocolGuid,\r
643 Private->Ip4Child\r
644 );\r
645\r
8d285ec0 646 gBS->CloseProtocol (\r
647 Private->ArpChild,\r
648 &gEfiArpProtocolGuid,\r
649 This->DriverBindingHandle,\r
650 NicHandle\r
651 );\r
652 NetLibDestroyServiceChild (\r
653 NicHandle,\r
654 This->DriverBindingHandle,\r
655 &gEfiArpServiceBindingProtocolGuid,\r
656 Private->ArpChild\r
657 );\r
658\r
766c7483 659 FreePool (Private);\r
dc361cc5 660 }\r
661\r
662 return Status;\r
663}\r
664\r
dc361cc5 665\r