From bc19591807481c898bd7126bc5badfaab698722b Mon Sep 17 00:00:00 2001 From: Hao Wu Date: Tue, 5 May 2015 02:34:20 +0000 Subject: [PATCH] IntelFrameworkModulePkg: Modify IsaSerialDxe to follow driver rules IsaSerialDxe creates child handles and wishes to retrieve the name for those child controllers. However, in the IsaSerialComponentNameGetControllerName() function, it directly return EFI_UNSUPPORTED when ChildHandle != NULL. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hao Wu Reviewed-by: Liming Gao Reviewed-by: Michael Kinney git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17289 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Bus/Isa/IsaSerialDxe/ComponentName.c | 64 +++++++++++-------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/ComponentName.c b/IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/ComponentName.c index 4b17c5423c..ef24008f6b 100644 --- a/IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/ComponentName.c +++ b/IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/ComponentName.c @@ -180,16 +180,11 @@ IsaSerialComponentNameGetControllerName ( OUT CHAR16 **ControllerName ) { - EFI_STATUS Status; - EFI_SERIAL_IO_PROTOCOL *SerialIo; - SERIAL_DEV *SerialDevice; + EFI_STATUS Status; + EFI_SERIAL_IO_PROTOCOL *SerialIo; + SERIAL_DEV *SerialDevice; + EFI_UNICODE_STRING_TABLE *ControllerNameTable; - // - // This is a device driver, so ChildHandle must be NULL. - // - if (ChildHandle != NULL) { - return EFI_UNSUPPORTED; - } // // Make sure this driver is currently managing ControllerHandle // @@ -201,29 +196,44 @@ IsaSerialComponentNameGetControllerName ( if (EFI_ERROR (Status)) { return Status; } - // - // Get the Block I/O Protocol on Controller - // - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiSerialIoProtocolGuid, - (VOID **) &SerialIo, - gSerialControllerDriver.DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return Status; + + ControllerNameTable = NULL; + if (ChildHandle != NULL) { + Status = EfiTestChildHandle ( + ControllerHandle, + ChildHandle, + &gEfiIsaIoProtocolGuid + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Get the Serial I/O Protocol from the child handle + // + Status = gBS->OpenProtocol ( + ChildHandle, + &gEfiSerialIoProtocolGuid, + (VOID **) &SerialIo, + gSerialControllerDriver.DriverBindingHandle, + ChildHandle, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Get the Serial Controller's Device structure + // + SerialDevice = SERIAL_DEV_FROM_THIS (SerialIo); + ControllerNameTable = SerialDevice->ControllerNameTable; } - // - // Get the Serial Controller's Device structure - // - SerialDevice = SERIAL_DEV_FROM_THIS (SerialIo); return LookupUnicodeString2 ( Language, This->SupportedLanguages, - SerialDevice->ControllerNameTable, + ControllerNameTable, ControllerName, (BOOLEAN)(This == &gIsaSerialComponentName) ); -- 2.39.2