The HTTP Boot driver have some UEFI driver model problems which will make the code ASSERT when it's disconnected. First, the driver opens the HttpSb protocol BY_CHILD without BY_DRIVER attribute. So the driver binding stop won't be called when HTTP driver is disconnected, so a child handle is left and made HTTP driver binding stop function goes into error. This patch remove this unnecessary OpenProtocol and only unload the HII from when both the IP4 and IP6 stack have been stopped completely. The second issue is the HTTP boot driver always use the driver's image handle as it's driver binding handle, it's not correct. HTTP Boot driver provides 2 separate driver binding protocols from IP4 and IP6 stack, so it has 2 driver binding handle. So this patch fix the code to use correct driver binding handle when create/open a HTTP child handle. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> Reviewed-by: Jiaxin Wu <jiaxin.wu@intel.com>
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  The header file of functions for configuring or getting the parameters
 | 
						|
  relating to HTTP Boot.
 | 
						|
 | 
						|
Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
 | 
						|
This program and the accompanying materials
 | 
						|
are licensed and made available under the terms and conditions of the BSD License
 | 
						|
which accompanies this distribution.  The full text of the license may be found at
 | 
						|
http://opensource.org/licenses/bsd-license.php
 | 
						|
 | 
						|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | 
						|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef _HTTP_BOOT_CONFIG_H_
 | 
						|
#define _HTTP_BOOT_CONFIG_H_
 | 
						|
 | 
						|
 | 
						|
#include "HttpBootConfigNVDataStruc.h"
 | 
						|
 | 
						|
typedef struct _HTTP_BOOT_FORM_CALLBACK_INFO   HTTP_BOOT_FORM_CALLBACK_INFO;
 | 
						|
 | 
						|
extern   UINT8                            HttpBootDxeStrings[];
 | 
						|
extern   UINT8                            HttpBootConfigVfrBin[];
 | 
						|
 | 
						|
#pragma pack()
 | 
						|
 | 
						|
#define HTTP_BOOT_FORM_CALLBACK_INFO_SIGNATURE  SIGNATURE_32 ('H', 'B', 'f', 'c')
 | 
						|
 | 
						|
#define HTTP_BOOT_FORM_CALLBACK_INFO_FROM_CONFIG_ACCESS(Callback) \
 | 
						|
  CR ( \
 | 
						|
  Callback, \
 | 
						|
  HTTP_BOOT_FORM_CALLBACK_INFO, \
 | 
						|
  ConfigAccess, \
 | 
						|
  HTTP_BOOT_FORM_CALLBACK_INFO_SIGNATURE \
 | 
						|
  )
 | 
						|
 | 
						|
struct _HTTP_BOOT_FORM_CALLBACK_INFO {
 | 
						|
  UINT32                           Signature;
 | 
						|
  BOOLEAN                          Initilized;
 | 
						|
  EFI_HANDLE                       ChildHandle;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL         *HiiVendorDevicePath;
 | 
						|
  EFI_HII_HANDLE                   RegisteredHandle;
 | 
						|
  EFI_HII_CONFIG_ACCESS_PROTOCOL   ConfigAccess;
 | 
						|
  HTTP_BOOT_CONFIG_IFR_NVDATA      HttpBootNvData;
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
  Initialize the configuration form.
 | 
						|
 | 
						|
  @param[in]  Private             Pointer to the driver private data.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The configuration form is initialized.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
HttpBootConfigFormInit (
 | 
						|
  IN HTTP_BOOT_PRIVATE_DATA     *Private
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Unload the configuration form, this includes: delete all the configuration
 | 
						|
  entries, uninstall the form callback protocol, and free the resources used.
 | 
						|
  The form will only be unload completely when both IP4 and IP6 stack are stopped.
 | 
						|
 | 
						|
  @param[in]  Private             Pointer to the driver private data.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The configuration form is unloaded.
 | 
						|
  @retval Others                  Failed to unload the form.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
HttpBootConfigFormUnload (
 | 
						|
  IN HTTP_BOOT_PRIVATE_DATA     *Private
 | 
						|
  );
 | 
						|
 | 
						|
#endif
 |