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