diff options
author | Fu Siyuan <siyuan.fu@intel.com> | 2014-01-24 05:33:18 +0000 |
---|---|---|
committer | sfu5 <sfu5@6f19259b-4bc3-4df7-8a09-765794883524> | 2014-01-24 05:33:18 +0000 |
commit | ca4e58d8e390794e9fd8b7eb46073260d19f5e1d (patch) | |
tree | 7c44bf083e1a8fe3a9dfd5be93baa3ae62a87dc2 /MdeModulePkg/Universal | |
parent | f20fc992aee02c54404b68c46abd30ffbdd9888e (diff) | |
download | edk2-platforms-ca4e58d8e390794e9fd8b7eb46073260d19f5e1d.tar.xz |
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
Diffstat (limited to 'MdeModulePkg/Universal')
3 files changed, 66 insertions, 39 deletions
diff --git a/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDriver.c b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDriver.c index 52bb99fa5d..7dfea2e32a 100644 --- a/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDriver.c +++ b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDriver.c @@ -1,7 +1,7 @@ /** @file
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
are licensed and made available under the terms and conditions
of the BSD License which accompanies this distribution. The full
@@ -275,10 +275,13 @@ VlanConfigDriverBindingStop ( }
ASSERT (PrivateData->Signature == VLAN_CONFIG_PRIVATE_DATA_SIGNATURE);
- //
- // Uninstall VLAN configuration Form
- //
- UninstallVlanConfigForm (PrivateData);
+ if (NumberOfChildren != 0) {
+ if (NumberOfChildren != 1 || ChildHandleBuffer[0] != PrivateData->DriverHandle) {
+ return EFI_DEVICE_ERROR;
+ }
+
+ return UninstallVlanConfigForm (PrivateData);
+ }
//
// Uninstall the private GUID
diff --git a/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.c b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.c index 10fb7fa670..fd8555e30e 100644 --- a/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.c +++ b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.c @@ -1,7 +1,7 @@ /** @file
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
are licensed and made available under the terms and conditions
of the BSD License which accompanies this distribution. The full
@@ -588,50 +588,54 @@ InstallVlanConfigForm ( @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 (
IN OUT VLAN_CONFIG_PRIVATE_DATA *PrivateData
)
{
- //
- // Free MAC string
- //
- if (PrivateData->MacString != NULL) {
- FreePool (PrivateData->MacString);
- PrivateData->MacString = NULL;
- }
-
- //
- // Uninstall HII package list
- //
- if (PrivateData->HiiHandle != NULL) {
- HiiRemovePackages (PrivateData->HiiHandle);
- PrivateData->HiiHandle = NULL;
- }
-
+ EFI_STATUS Status;
+ EFI_VLAN_CONFIG_PROTOCOL *VlanConfig;
+
//
// End the parent-child relationship.
//
- gBS->CloseProtocol (
- PrivateData->ControllerHandle,
- &gEfiVlanConfigProtocolGuid,
- PrivateData->ImageHandle,
- PrivateData->DriverHandle
- );
+ 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) {
- gBS->UninstallMultipleProtocolInterfaces (
- PrivateData->DriverHandle,
- &gEfiDevicePathProtocolGuid,
- PrivateData->ChildDevicePath,
- &gEfiHiiConfigAccessProtocolGuid,
- &PrivateData->ConfigAccess,
- 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) {
@@ -639,4 +643,21 @@ UninstallVlanConfigForm ( PrivateData->ChildDevicePath = NULL;
}
}
+
+ //
+ // Free MAC string
+ //
+ if (PrivateData->MacString != NULL) {
+ FreePool (PrivateData->MacString);
+ PrivateData->MacString = NULL;
+ }
+
+ //
+ // Uninstall HII package list
+ //
+ if (PrivateData->HiiHandle != NULL) {
+ HiiRemovePackages (PrivateData->HiiHandle);
+ PrivateData->HiiHandle = NULL;
+ }
+ return EFI_SUCCESS;
}
diff --git a/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.h b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.h index a1c0b2a35d..2aa43b4230 100644 --- a/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.h +++ b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.h @@ -1,7 +1,7 @@ /** @file
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
are licensed and made available under the terms and conditions
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.
+ @retval EFI_SUCCESS HII Form has been uninstalled successfully.
+ @retval Others Other errors as indicated.
+
**/
-VOID
+EFI_STATUS
UninstallVlanConfigForm (
IN OUT VLAN_CONFIG_PRIVATE_DATA *PrivateData
);
|