Fix following problems about VLAN driver:

1. "VLAN Configuration” form crash after 'reconnect -r'
2. disconnect VLAN driver from the managed device will return EFI_NOT_FOUND
3. disconnect MNP driver from the managed device, VLAN driver couldn't be stopped.
Signed-off-by: Fu Siyuan <siyuan.fu@intel.com>
Reviewed-by: Ni, Ruiyu <ruiyu.ni@intel.com>
Reviewed-by: Gao, Liming <liming.gao@intel.com>


git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15174 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Fu Siyuan 2014-01-24 05:33:18 +00:00 committed by sfu5
parent f20fc992ae
commit ca4e58d8e3
3 changed files with 66 additions and 39 deletions

View File

@ -1,7 +1,7 @@
/** @file /** @file
The driver binding for VLAN configuration module. The driver binding for VLAN configuration module.
Copyright (c) 2009, Intel Corporation. All rights reserved.<BR> Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions are licensed and made available under the terms and conditions
of the BSD License which accompanies this distribution. The full of the BSD License which accompanies this distribution. The full
@ -275,10 +275,13 @@ VlanConfigDriverBindingStop (
} }
ASSERT (PrivateData->Signature == VLAN_CONFIG_PRIVATE_DATA_SIGNATURE); ASSERT (PrivateData->Signature == VLAN_CONFIG_PRIVATE_DATA_SIGNATURE);
// if (NumberOfChildren != 0) {
// Uninstall VLAN configuration Form if (NumberOfChildren != 1 || ChildHandleBuffer[0] != PrivateData->DriverHandle) {
// return EFI_DEVICE_ERROR;
UninstallVlanConfigForm (PrivateData); }
return UninstallVlanConfigForm (PrivateData);
}
// //
// Uninstall the private GUID // Uninstall the private GUID

View File

@ -1,7 +1,7 @@
/** @file /** @file
HII Config Access protocol implementation of VLAN configuration module. HII Config Access protocol implementation of VLAN configuration module.
Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR> Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions are licensed and made available under the terms and conditions
of the BSD License which accompanies this distribution. The full of the BSD License which accompanies this distribution. The full
@ -588,12 +588,62 @@ InstallVlanConfigForm (
@param[in, out] PrivateData Points to VLAN configuration private data. @param[in, out] PrivateData Points to VLAN configuration private data.
@retval EFI_SUCCESS HII Form has been uninstalled successfully.
@retval Others Other errors as indicated.
**/ **/
VOID EFI_STATUS
UninstallVlanConfigForm ( UninstallVlanConfigForm (
IN OUT VLAN_CONFIG_PRIVATE_DATA *PrivateData IN OUT VLAN_CONFIG_PRIVATE_DATA *PrivateData
) )
{ {
EFI_STATUS Status;
EFI_VLAN_CONFIG_PROTOCOL *VlanConfig;
//
// End the parent-child relationship.
//
Status = gBS->CloseProtocol (
PrivateData->ControllerHandle,
&gEfiVlanConfigProtocolGuid,
PrivateData->ImageHandle,
PrivateData->DriverHandle
);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Uninstall HII Config Access Protocol
//
if (PrivateData->DriverHandle != NULL) {
Status = gBS->UninstallMultipleProtocolInterfaces (
PrivateData->DriverHandle,
&gEfiDevicePathProtocolGuid,
PrivateData->ChildDevicePath,
&gEfiHiiConfigAccessProtocolGuid,
&PrivateData->ConfigAccess,
NULL
);
if (EFI_ERROR (Status)) {
gBS->OpenProtocol (
PrivateData->ControllerHandle,
&gEfiVlanConfigProtocolGuid,
(VOID **)&VlanConfig,
PrivateData->ImageHandle,
PrivateData->DriverHandle,
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
);
return Status;
}
PrivateData->DriverHandle = NULL;
if (PrivateData->ChildDevicePath != NULL) {
FreePool (PrivateData->ChildDevicePath);
PrivateData->ChildDevicePath = NULL;
}
}
// //
// Free MAC string // Free MAC string
// //
@ -609,34 +659,5 @@ UninstallVlanConfigForm (
HiiRemovePackages (PrivateData->HiiHandle); HiiRemovePackages (PrivateData->HiiHandle);
PrivateData->HiiHandle = NULL; PrivateData->HiiHandle = NULL;
} }
return EFI_SUCCESS;
//
// End the parent-child relationship.
//
gBS->CloseProtocol (
PrivateData->ControllerHandle,
&gEfiVlanConfigProtocolGuid,
PrivateData->ImageHandle,
PrivateData->DriverHandle
);
//
// Uninstall HII Config Access Protocol
//
if (PrivateData->DriverHandle != NULL) {
gBS->UninstallMultipleProtocolInterfaces (
PrivateData->DriverHandle,
&gEfiDevicePathProtocolGuid,
PrivateData->ChildDevicePath,
&gEfiHiiConfigAccessProtocolGuid,
&PrivateData->ConfigAccess,
NULL
);
PrivateData->DriverHandle = NULL;
if (PrivateData->ChildDevicePath != NULL) {
FreePool (PrivateData->ChildDevicePath);
PrivateData->ChildDevicePath = NULL;
}
}
} }

View File

@ -1,7 +1,7 @@
/** @file /** @file
Header file for driver binding protocol and HII config access protocol. Header file for driver binding protocol and HII config access protocol.
Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR> Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions are licensed and made available under the terms and conditions
of the BSD License which accompanies this distribution. The full of the BSD License which accompanies this distribution. The full
@ -282,8 +282,11 @@ InstallVlanConfigForm (
@param[in, out] PrivateData Points to VLAN configuration private data. @param[in, out] PrivateData Points to VLAN configuration private data.
@retval EFI_SUCCESS HII Form has been uninstalled successfully.
@retval Others Other errors as indicated.
**/ **/
VOID EFI_STATUS
UninstallVlanConfigForm ( UninstallVlanConfigForm (
IN OUT VLAN_CONFIG_PRIVATE_DATA *PrivateData IN OUT VLAN_CONFIG_PRIVATE_DATA *PrivateData
); );