Produces Simple Text Input Protocol, Simple Text Input Extended Protocol and\r
Simple Text Output Protocol upon Serial IO Protocol.\r
\r
-Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
-\r
#include "Terminal.h"\r
\r
//\r
// Globals\r
//\r
-EFI_DRIVER_BINDING_PROTOCOL gTerminalDriverBinding = {\r
+EFI_DRIVER_BINDING_PROTOCOL gTerminalDriverBinding = {\r
TerminalDriverBindingSupported,\r
TerminalDriverBindingStart,\r
TerminalDriverBindingStop,\r
NULL\r
};\r
\r
-\r
EFI_GUID *mTerminalType[] = {\r
&gEfiPcAnsiGuid,\r
&gEfiVT100Guid,\r
&gEfiVT100PlusGuid,\r
&gEfiVTUTF8Guid,\r
- &gEfiTtyTermGuid\r
+ &gEfiTtyTermGuid,\r
+ &gEdkiiLinuxTermGuid,\r
+ &gEdkiiXtermR6Guid,\r
+ &gEdkiiVT400Guid,\r
+ &gEdkiiSCOTermGuid\r
};\r
\r
-\r
-CHAR16 *mSerialConsoleNames[] = {\r
+CHAR16 *mSerialConsoleNames[] = {\r
L"PC-ANSI Serial Console",\r
L"VT-100 Serial Console",\r
L"VT-100+ Serial Console",\r
L"VT-UTF8 Serial Console",\r
- L"Tty Terminal Serial Console"\r
+ L"Tty Terminal Serial Console",\r
+ L"Linux Terminal Serial Console",\r
+ L"Xterm R6 Serial Console",\r
+ L"VT-400 Serial Console",\r
+ L"SCO Terminal Serial Console"\r
};\r
\r
TERMINAL_DEV mTerminalDevTemplate = {\r
TerminalConOutEnableCursor,\r
NULL\r
},\r
- { // SimpleTextOutputMode\r
- 1, // MaxMode\r
- 0, // Mode\r
- EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK), // Attribute\r
- 0, // CursorColumn\r
- 0, // CursorRow\r
- TRUE // CursorVisible\r
+ { // SimpleTextOutputMode\r
+ 1, // MaxMode\r
+ 0, // Mode\r
+ EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK), // Attribute\r
+ 0, // CursorColumn\r
+ 0, // CursorRow\r
+ TRUE // CursorVisible\r
},\r
NULL, // TerminalConsoleModeData\r
- 0, // SerialInTimeOut\r
+ 0, // SerialInTimeOut\r
\r
NULL, // RawFifo\r
NULL, // UnicodeFiFo\r
INPUT_STATE_DEFAULT,\r
RESET_STATE_DEFAULT,\r
{\r
- 0,\r
- 0,\r
- 0\r
+ 0,\r
+ 0,\r
+ 0\r
},\r
0,\r
FALSE,\r
NULL // KeyNotifyProcessEvent\r
};\r
\r
-TERMINAL_CONSOLE_MODE_DATA mTerminalConsoleModeData[] = {\r
- {80, 25},\r
- {80, 50},\r
- {100, 31},\r
+TERMINAL_CONSOLE_MODE_DATA mTerminalConsoleModeData[] = {\r
+ { 80, 25 },\r
+ { 80, 50 },\r
+ { 100, 31 },\r
//\r
// New modes can be added here.\r
//\r
**/\r
TERMINAL_TYPE\r
TerminalTypeFromGuid (\r
- IN EFI_GUID *Guid\r
-)\r
+ IN EFI_GUID *Guid\r
+ )\r
{\r
- TERMINAL_TYPE Type;\r
+ TERMINAL_TYPE Type;\r
\r
for (Type = 0; Type < ARRAY_SIZE (mTerminalType); Type++) {\r
if (CompareGuid (Guid, mTerminalType[Type])) {\r
break;\r
}\r
}\r
+\r
return Type;\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
TerminalDriverBindingSupported (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Controller,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
{\r
EFI_STATUS Status;\r
// If RemainingDevicePath isn't the End of Device Path Node,\r
// check its validation\r
//\r
- Node = (VENDOR_DEVICE_PATH *) RemainingDevicePath;\r
-\r
- if (Node->Header.Type != MESSAGING_DEVICE_PATH ||\r
- Node->Header.SubType != MSG_VENDOR_DP ||\r
- DevicePathNodeLength(&Node->Header) != sizeof(VENDOR_DEVICE_PATH)) {\r
+ Node = (VENDOR_DEVICE_PATH *)RemainingDevicePath;\r
\r
+ if ((Node->Header.Type != MESSAGING_DEVICE_PATH) ||\r
+ (Node->Header.SubType != MSG_VENDOR_DP) ||\r
+ (DevicePathNodeLength (&Node->Header) != sizeof (VENDOR_DEVICE_PATH)))\r
+ {\r
return EFI_UNSUPPORTED;\r
-\r
}\r
+\r
//\r
- // only supports PC ANSI, VT100, VT100+, VT-UTF8, and TtyTerm terminal types\r
+ // only supports PC ANSI, VT100, VT100+, VT-UTF8, TtyTerm\r
+ // Linux, XtermR6, VT400 and SCO terminal types\r
//\r
if (TerminalTypeFromGuid (&Node->Guid) == ARRAY_SIZE (mTerminalType)) {\r
return EFI_UNSUPPORTED;\r
}\r
}\r
}\r
+\r
//\r
// Open the IO Abstraction(s) needed to perform the supported test\r
// The Controller must support the Serial I/O Protocol.\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiSerialIoProtocolGuid,\r
- (VOID **) &SerialIo,\r
+ (VOID **)&SerialIo,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
// Close the I/O Abstraction(s) used to perform the supported test\r
//\r
gBS->CloseProtocol (\r
- Controller,\r
- &gEfiSerialIoProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
+ Controller,\r
+ &gEfiSerialIoProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
\r
//\r
// Open the EFI Device Path protocol needed to perform the supported test\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiDevicePathProtocolGuid,\r
- (VOID **) &ParentDevicePath,\r
+ (VOID **)&ParentDevicePath,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
// Close protocol, don't use device path protocol in the Support() function\r
//\r
gBS->CloseProtocol (\r
- Controller,\r
- &gEfiDevicePathProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
+ Controller,\r
+ &gEfiDevicePathProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
\r
return Status;\r
}\r
\r
-\r
/**\r
Free notify functions list.\r
\r
**/\r
EFI_STATUS\r
TerminalFreeNotifyList (\r
- IN OUT LIST_ENTRY *ListHead\r
+ IN OUT LIST_ENTRY *ListHead\r
)\r
{\r
- TERMINAL_CONSOLE_IN_EX_NOTIFY *NotifyNode;\r
+ TERMINAL_CONSOLE_IN_EX_NOTIFY *NotifyNode;\r
\r
if (ListHead == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
while (!IsListEmpty (ListHead)) {\r
NotifyNode = CR (\r
ListHead->ForwardLink,\r
**/\r
TERMINAL_CONSOLE_MODE_DATA *\r
InitializeTerminalConsoleTextMode (\r
- OUT INT32 *TextModeCount\r
-)\r
+ OUT INT32 *TextModeCount\r
+ )\r
{\r
TERMINAL_CONSOLE_MODE_DATA *TextModeData;\r
\r
if (TextModeData == NULL) {\r
return NULL;\r
}\r
+\r
*TextModeCount = ARRAY_SIZE (mTerminalConsoleModeData);\r
\r
- DEBUG_CODE (\r
- INT32 Index;\r
- for (Index = 0; Index < *TextModeCount; Index++) {\r
- DEBUG ((DEBUG_INFO, "Terminal - Mode %d, Column = %d, Row = %d\n",\r
- Index, TextModeData[Index].Columns, TextModeData[Index].Rows));\r
- }\r
- );\r
+ DEBUG_CODE_BEGIN ();\r
+ INT32 Index;\r
+\r
+ for (Index = 0; Index < *TextModeCount; Index++) {\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "Terminal - Mode %d, Column = %d, Row = %d\n",\r
+ Index,\r
+ TextModeData[Index].Columns,\r
+ TextModeData[Index].Rows\r
+ ));\r
+ }\r
+\r
+ DEBUG_CODE_END ();\r
return TextModeData;\r
}\r
\r
**/\r
VOID\r
StopTerminalStateMachine (\r
- TERMINAL_DEV *TerminalDevice\r
+ TERMINAL_DEV *TerminalDevice\r
)\r
{\r
- EFI_TPL OriginalTpl;\r
+ EFI_TPL OriginalTpl;\r
\r
OriginalTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
\r
**/\r
VOID\r
StartTerminalStateMachine (\r
- TERMINAL_DEV *TerminalDevice\r
+ TERMINAL_DEV *TerminalDevice\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
+\r
Status = gBS->CreateEvent (\r
EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
TPL_NOTIFY,\r
InitializeControllerNameTable (\r
TERMINAL_TYPE TerminalType,\r
EFI_UNICODE_STRING_TABLE **ControllerNameTable\r
-)\r
+ )\r
{\r
EFI_STATUS Status;\r
EFI_UNICODE_STRING_TABLE *Table;\r
\r
ASSERT (TerminalType < ARRAY_SIZE (mTerminalType));\r
- Table = NULL;\r
+ Table = NULL;\r
Status = AddUnicodeString2 (\r
"eng",\r
gTerminalComponentName.SupportedLanguages,\r
FreeUnicodeStringTable (Table);\r
}\r
}\r
+\r
if (!EFI_ERROR (Status)) {\r
*ControllerNameTable = Table;\r
}\r
+\r
return Status;\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
TerminalDriverBindingStart (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Controller,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_SERIAL_IO_PROTOCOL *SerialIo;\r
- EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *Vendor;\r
- EFI_HANDLE SerialIoHandle;\r
- EFI_SERIAL_IO_MODE *Mode;\r
- UINTN SerialInTimeOut;\r
- TERMINAL_DEV *TerminalDevice;\r
- UINT8 TerminalType;\r
- EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;\r
- UINTN EntryCount;\r
- UINTN Index;\r
- EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOutput;\r
- EFI_SIMPLE_TEXT_INPUT_PROTOCOL *SimpleTextInput;\r
- EFI_UNICODE_STRING_TABLE *ControllerNameTable;\r
+ EFI_STATUS Status;\r
+ EFI_SERIAL_IO_PROTOCOL *SerialIo;\r
+ EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL *Vendor;\r
+ EFI_HANDLE SerialIoHandle;\r
+ EFI_SERIAL_IO_MODE *Mode;\r
+ UINTN SerialInTimeOut;\r
+ TERMINAL_DEV *TerminalDevice;\r
+ UINT8 TerminalType;\r
+ EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;\r
+ UINTN EntryCount;\r
+ UINTN Index;\r
+ EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOutput;\r
+ EFI_SIMPLE_TEXT_INPUT_PROTOCOL *SimpleTextInput;\r
+ EFI_UNICODE_STRING_TABLE *ControllerNameTable;\r
\r
//\r
// Get the Device Path Protocol to build the device path of the child device\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiDevicePathProtocolGuid,\r
- (VOID **) &ParentDevicePath,\r
+ (VOID **)&ParentDevicePath,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
ASSERT ((Status == EFI_SUCCESS) || (Status == EFI_ALREADY_STARTED));\r
+ if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {\r
+ return Status;\r
+ }\r
\r
//\r
// Open the Serial I/O Protocol BY_DRIVER. It might already be started.\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiSerialIoProtocolGuid,\r
- (VOID **) &SerialIo,\r
+ (VOID **)&SerialIo,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
ASSERT ((Status == EFI_SUCCESS) || (Status == EFI_ALREADY_STARTED));\r
+ if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {\r
+ return Status;\r
+ }\r
\r
if (!IsHotPlugDevice (ParentDevicePath)) {\r
//\r
}\r
\r
if (Status == EFI_ALREADY_STARTED) {\r
-\r
if (RemainingDevicePath == NULL) {\r
//\r
// If RemainingDevicePath is NULL or is the End of Device Path Node\r
Status = gBS->OpenProtocol (\r
OpenInfoBuffer[Index].ControllerHandle,\r
&gEfiSimpleTextInProtocolGuid,\r
- (VOID **) &SimpleTextInput,\r
+ (VOID **)&SimpleTextInput,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
);\r
if (!EFI_ERROR (Status)) {\r
TerminalDevice = TERMINAL_CON_IN_DEV_FROM_THIS (SimpleTextInput);\r
- TerminalType = TerminalTypeFromGuid (&((VENDOR_DEVICE_PATH *) RemainingDevicePath)->Guid);\r
+ TerminalType = TerminalTypeFromGuid (&((VENDOR_DEVICE_PATH *)RemainingDevicePath)->Guid);\r
ASSERT (TerminalType < ARRAY_SIZE (mTerminalType));\r
if (TerminalDevice->TerminalType != TerminalType) {\r
Status = InitializeControllerNameTable (TerminalType, &ControllerNameTable);\r
Vendor = TerminalDevice->DevicePath;\r
Status = gBS->LocateDevicePath (&gEfiSerialIoProtocolGuid, &Vendor, &SerialIoHandle);\r
ASSERT_EFI_ERROR (Status);\r
- CopyGuid (&((VENDOR_DEVICE_PATH *) Vendor)->Guid, mTerminalType[TerminalType]);\r
+ CopyGuid (&((VENDOR_DEVICE_PATH *)Vendor)->Guid, mTerminalType[TerminalType]);\r
Status = gBS->ReinstallProtocolInterface (\r
TerminalDevice->Handle,\r
&gEfiDevicePathProtocolGuid,\r
//\r
// Restore the device path on failure\r
//\r
- CopyGuid (&((VENDOR_DEVICE_PATH *) Vendor)->Guid, mTerminalType[TerminalDevice->TerminalType]);\r
+ CopyGuid (&((VENDOR_DEVICE_PATH *)Vendor)->Guid, mTerminalType[TerminalDevice->TerminalType]);\r
FreeUnicodeStringTable (ControllerNameTable);\r
}\r
}\r
}\r
}\r
+\r
break;\r
}\r
}\r
+\r
FreePool (OpenInfoBuffer);\r
}\r
+\r
return Status;\r
}\r
\r
// If RemainingDevicePath isn't the End of Device Path Node,\r
// Use the RemainingDevicePath to determine the terminal type\r
//\r
- TerminalDevice->TerminalType = TerminalTypeFromGuid (&((VENDOR_DEVICE_PATH *) RemainingDevicePath)->Guid);\r
+ TerminalDevice->TerminalType = TerminalTypeFromGuid (&((VENDOR_DEVICE_PATH *)RemainingDevicePath)->Guid);\r
}\r
+\r
ASSERT (TerminalDevice->TerminalType < ARRAY_SIZE (mTerminalType));\r
TerminalDevice->SerialIo = SerialIo;\r
\r
if (TerminalDevice->RawFiFo == NULL) {\r
goto FreeResources;\r
}\r
+\r
TerminalDevice->UnicodeFiFo = AllocateZeroPool (sizeof (UNICODE_FIFO));\r
if (TerminalDevice->UnicodeFiFo == NULL) {\r
goto FreeResources;\r
}\r
+\r
TerminalDevice->EfiKeyFiFo = AllocateZeroPool (sizeof (EFI_KEY_FIFO));\r
if (TerminalDevice->EfiKeyFiFo == NULL) {\r
goto FreeResources;\r
}\r
+\r
TerminalDevice->EfiKeyFiFoForNotify = AllocateZeroPool (sizeof (EFI_KEY_FIFO));\r
if (TerminalDevice->EfiKeyFiFoForNotify == NULL) {\r
goto FreeResources;\r
\r
SerialInTimeOut = 0;\r
if (Mode->BaudRate != 0) {\r
- SerialInTimeOut = (1 + Mode->DataBits + Mode->StopBits) * 2 * 1000000 / (UINTN) Mode->BaudRate;\r
+ SerialInTimeOut = (1 + Mode->DataBits + Mode->StopBits) * 2 * 1000000 / (UINTN)Mode->BaudRate;\r
}\r
\r
Status = TerminalDevice->SerialIo->SetAttributes (\r
TerminalDevice->SerialIo,\r
Mode->BaudRate,\r
Mode->ReceiveFifoDepth,\r
- (UINT32) SerialInTimeOut,\r
- (EFI_PARITY_TYPE) (Mode->Parity),\r
- (UINT8) Mode->DataBits,\r
- (EFI_STOP_BITS_TYPE) (Mode->StopBits)\r
+ (UINT32)SerialInTimeOut,\r
+ (EFI_PARITY_TYPE)(Mode->Parity),\r
+ (UINT8)Mode->DataBits,\r
+ (EFI_STOP_BITS_TYPE)(Mode->StopBits)\r
);\r
if (EFI_ERROR (Status)) {\r
//\r
}\r
\r
SimpleTextOutput = &TerminalDevice->SimpleTextOutput;\r
- SimpleTextInput = &TerminalDevice->SimpleInput;\r
+ SimpleTextInput = &TerminalDevice->SimpleInput;\r
\r
//\r
// Initialize SimpleTextOut instance\r
//\r
- SimpleTextOutput->Mode = &TerminalDevice->SimpleTextOutputMode;\r
+ SimpleTextOutput->Mode = &TerminalDevice->SimpleTextOutputMode;\r
TerminalDevice->TerminalConsoleModeData = InitializeTerminalConsoleTextMode (\r
- &SimpleTextOutput->Mode->MaxMode\r
- );\r
+ &SimpleTextOutput->Mode->MaxMode\r
+ );\r
if (TerminalDevice->TerminalConsoleModeData == NULL) {\r
goto FreeResources;\r
}\r
+\r
//\r
// For terminal devices, cursor is always visible\r
//\r
SimpleTextOutput->Mode->CursorVisible = TRUE;\r
- Status = SimpleTextOutput->SetAttribute (SimpleTextOutput, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
+ Status = SimpleTextOutput->SetAttribute (SimpleTextOutput, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
if (!EFI_ERROR (Status)) {\r
Status = SimpleTextOutput->Reset (SimpleTextOutput, FALSE);\r
}\r
+\r
if (EFI_ERROR (Status)) {\r
goto ReportError;\r
}\r
\r
Status = gBS->InstallMultipleProtocolInterfaces (\r
&TerminalDevice->Handle,\r
- &gEfiSimpleTextInProtocolGuid, &TerminalDevice->SimpleInput,\r
- &gEfiSimpleTextInputExProtocolGuid, &TerminalDevice->SimpleInputEx,\r
- &gEfiSimpleTextOutProtocolGuid, &TerminalDevice->SimpleTextOutput,\r
- &gEfiDevicePathProtocolGuid, TerminalDevice->DevicePath,\r
+ &gEfiSimpleTextInProtocolGuid,\r
+ &TerminalDevice->SimpleInput,\r
+ &gEfiSimpleTextInputExProtocolGuid,\r
+ &TerminalDevice->SimpleInputEx,\r
+ &gEfiSimpleTextOutProtocolGuid,\r
+ &TerminalDevice->SimpleTextOutput,\r
+ &gEfiDevicePathProtocolGuid,\r
+ TerminalDevice->DevicePath,\r
NULL\r
);\r
if (!EFI_ERROR (Status)) {\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiSerialIoProtocolGuid,\r
- (VOID **) &TerminalDevice->SerialIo,\r
+ (VOID **)&TerminalDevice->SerialIo,\r
This->DriverBindingHandle,\r
TerminalDevice->Handle,\r
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
if (TerminalDevice->SimpleInput.WaitForKey != NULL) {\r
gBS->CloseEvent (TerminalDevice->SimpleInput.WaitForKey);\r
}\r
+\r
if (TerminalDevice->SimpleInputEx.WaitForKeyEx != NULL) {\r
gBS->CloseEvent (TerminalDevice->SimpleInputEx.WaitForKeyEx);\r
}\r
+\r
if (TerminalDevice->KeyNotifyProcessEvent != NULL) {\r
gBS->CloseEvent (TerminalDevice->KeyNotifyProcessEvent);\r
}\r
if (TerminalDevice->RawFiFo != NULL) {\r
FreePool (TerminalDevice->RawFiFo);\r
}\r
+\r
if (TerminalDevice->UnicodeFiFo != NULL) {\r
FreePool (TerminalDevice->UnicodeFiFo);\r
}\r
+\r
if (TerminalDevice->EfiKeyFiFo != NULL) {\r
FreePool (TerminalDevice->EfiKeyFiFo);\r
}\r
+\r
if (TerminalDevice->EfiKeyFiFoForNotify != NULL) {\r
FreePool (TerminalDevice->EfiKeyFiFoForNotify);\r
}\r
EFI_STATUS\r
EFIAPI\r
TerminalDriverBindingStop (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN UINTN NumberOfChildren,\r
- IN EFI_HANDLE *ChildHandleBuffer\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Controller,\r
+ IN UINTN NumberOfChildren,\r
+ IN EFI_HANDLE *ChildHandleBuffer\r
)\r
{\r
EFI_STATUS Status;\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiDevicePathProtocolGuid,\r
- (VOID **) &ParentDevicePath,\r
+ (VOID **)&ParentDevicePath,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
TerminalRemoveConsoleDevVariable (EFI_ERR_OUT_DEV_VARIABLE_NAME, ParentDevicePath);\r
\r
gBS->CloseProtocol (\r
- Controller,\r
- &gEfiSerialIoProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
+ Controller,\r
+ &gEfiSerialIoProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
\r
gBS->CloseProtocol (\r
- Controller,\r
- &gEfiDevicePathProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
+ Controller,\r
+ &gEfiDevicePathProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
\r
return EFI_SUCCESS;\r
}\r
AllChildrenStopped = TRUE;\r
\r
for (Index = 0; Index < NumberOfChildren; Index++) {\r
-\r
Status = gBS->OpenProtocol (\r
ChildHandleBuffer[Index],\r
&gEfiSimpleTextOutProtocolGuid,\r
- (VOID **) &SimpleTextOutput,\r
+ (VOID **)&SimpleTextOutput,\r
This->DriverBindingHandle,\r
ChildHandleBuffer[Index],\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
);\r
if (!EFI_ERROR (Status)) {\r
-\r
TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (SimpleTextOutput);\r
\r
gBS->CloseProtocol (\r
- Controller,\r
- &gEfiSerialIoProtocolGuid,\r
- This->DriverBindingHandle,\r
- ChildHandleBuffer[Index]\r
- );\r
+ Controller,\r
+ &gEfiSerialIoProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ ChildHandleBuffer[Index]\r
+ );\r
\r
Status = gBS->UninstallMultipleProtocolInterfaces (\r
ChildHandleBuffer[Index],\r
);\r
if (EFI_ERROR (Status)) {\r
gBS->OpenProtocol (\r
- Controller,\r
- &gEfiSerialIoProtocolGuid,\r
- (VOID **) &SerialIo,\r
- This->DriverBindingHandle,\r
- ChildHandleBuffer[Index],\r
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
- );\r
+ Controller,\r
+ &gEfiSerialIoProtocolGuid,\r
+ (VOID **)&SerialIo,\r
+ This->DriverBindingHandle,\r
+ ChildHandleBuffer[Index],\r
+ EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
+ );\r
} else {\r
-\r
FreeUnicodeStringTable (TerminalDevice->ControllerNameTable);\r
StopTerminalStateMachine (TerminalDevice);\r
gBS->CloseEvent (TerminalDevice->SimpleInput.WaitForKey);\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Compare a device path data structure to that of all the nodes of a\r
+ second device path instance.\r
+\r
+ @param Multi A pointer to a multi-instance device path data structure.\r
+ @param Single A pointer to a single-instance device path data structure.\r
+\r
+ @retval TRUE If the Single is contained within Multi.\r
+ @retval FALSE The Single is not match within Multi.\r
+\r
+**/\r
+BOOLEAN\r
+MatchDevicePaths (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *Multi,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *Single\r
+ )\r
+{\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePathInst;\r
+ UINTN Size;\r
+\r
+ DevicePath = Multi;\r
+ DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size);\r
+ //\r
+ // Search for the match of 'Single' in 'Multi'\r
+ //\r
+ while (DevicePathInst != NULL) {\r
+ //\r
+ // If the single device path is found in multiple device paths,\r
+ // return success\r
+ //\r
+ if (CompareMem (Single, DevicePathInst, Size) == 0) {\r
+ FreePool (DevicePathInst);\r
+ return TRUE;\r
+ }\r
+\r
+ FreePool (DevicePathInst);\r
+ DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size);\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
/**\r
Update terminal device path in Console Device Environment Variables.\r
\r
IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN NameSize;\r
- UINTN VariableSize;\r
- TERMINAL_TYPE TerminalType;\r
- EFI_DEVICE_PATH_PROTOCOL *Variable;\r
- EFI_DEVICE_PATH_PROTOCOL *NewVariable;\r
- EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;\r
- EDKII_SET_VARIABLE_STATUS *SetVariableStatus;\r
+ EFI_STATUS Status;\r
+ UINTN NameSize;\r
+ UINTN VariableSize;\r
+ TERMINAL_TYPE TerminalType;\r
+ EFI_DEVICE_PATH_PROTOCOL *Variable;\r
+ EFI_DEVICE_PATH_PROTOCOL *NewVariable;\r
+ EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;\r
+ EDKII_SET_VARIABLE_STATUS *SetVariableStatus;\r
\r
//\r
// Get global variable and its size according to the name given.\r
//\r
- GetEfiGlobalVariable2 (VariableName, (VOID**)&Variable, NULL);\r
- if (Variable == NULL) {\r
+ Status = GetEfiGlobalVariable2 (VariableName, (VOID **)&Variable, NULL);\r
+ if (Status == EFI_NOT_FOUND) {\r
+ Status = EFI_SUCCESS;\r
+ Variable = NULL;\r
+ }\r
+\r
+ if (EFI_ERROR (Status)) {\r
return;\r
}\r
\r
//\r
for (TerminalType = 0; TerminalType < ARRAY_SIZE (mTerminalType); TerminalType++) {\r
SetTerminalDevicePath (TerminalType, ParentDevicePath, &TempDevicePath);\r
- NewVariable = AppendDevicePathInstance (Variable, TempDevicePath);\r
- ASSERT (NewVariable != NULL);\r
- if (Variable != NULL) {\r
- FreePool (Variable);\r
- }\r
\r
if (TempDevicePath != NULL) {\r
+ if (!MatchDevicePaths (Variable, TempDevicePath)) {\r
+ NewVariable = AppendDevicePathInstance (Variable, TempDevicePath);\r
+ if (NewVariable != NULL) {\r
+ if (Variable != NULL) {\r
+ FreePool (Variable);\r
+ }\r
+\r
+ Variable = NewVariable;\r
+ }\r
+ }\r
+\r
FreePool (TempDevicePath);\r
}\r
-\r
- Variable = NewVariable;\r
}\r
\r
VariableSize = GetDevicePathSize (Variable);\r
);\r
\r
if (EFI_ERROR (Status)) {\r
- NameSize = StrSize (VariableName);\r
+ NameSize = StrSize (VariableName);\r
SetVariableStatus = AllocatePool (sizeof (EDKII_SET_VARIABLE_STATUS) + NameSize + VariableSize);\r
if (SetVariableStatus != NULL) {\r
CopyGuid (&SetVariableStatus->Guid, &gEfiGlobalVariableGuid);\r
SetVariableStatus->DataSize = VariableSize;\r
SetVariableStatus->SetStatus = Status;\r
SetVariableStatus->Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS;\r
- CopyMem (SetVariableStatus + 1, VariableName, NameSize);\r
- CopyMem (((UINT8 *) (SetVariableStatus + 1)) + NameSize, Variable, VariableSize);\r
+ CopyMem (SetVariableStatus + 1, VariableName, NameSize);\r
+ CopyMem (((UINT8 *)(SetVariableStatus + 1)) + NameSize, Variable, VariableSize);\r
\r
REPORT_STATUS_CODE_EX (\r
EFI_ERROR_CODE,\r
\r
FreePool (Variable);\r
\r
- return ;\r
+ return;\r
}\r
\r
-\r
/**\r
Remove terminal device path from Console Device Environment Variables.\r
\r
EFI_DEVICE_PATH_PROTOCOL *SavedNewVariable;\r
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;\r
\r
- Instance = NULL;\r
+ Instance = NULL;\r
\r
//\r
// Get global variable and its size according to the name given.\r
//\r
- GetEfiGlobalVariable2 (VariableName, (VOID**)&Variable, NULL);\r
+ GetEfiGlobalVariable2 (VariableName, (VOID **)&Variable, NULL);\r
if (Variable == NULL) {\r
- return ;\r
+ return;\r
}\r
\r
- FoundOne = FALSE;\r
- OriginalVariable = Variable;\r
- NewVariable = NULL;\r
+ FoundOne = FALSE;\r
+ OriginalVariable = Variable;\r
+ NewVariable = NULL;\r
\r
//\r
// Get first device path instance from Variable\r
Instance = GetNextDevicePathInstance (&Variable, &InstanceSize);\r
if (Instance == NULL) {\r
FreePool (OriginalVariable);\r
- return ;\r
+ return;\r
}\r
+\r
//\r
// Loop through all the device path instances of Variable\r
//\r
//\r
Match = FALSE;\r
for (TerminalType = 0; TerminalType < ARRAY_SIZE (mTerminalType); TerminalType++) {\r
-\r
SetTerminalDevicePath (TerminalType, ParentDevicePath, &TempDevicePath);\r
\r
//\r
//\r
if (TempDevicePath != NULL) {\r
if (CompareMem (Instance, TempDevicePath, InstanceSize) == 0) {\r
- Match = TRUE;\r
- FoundOne = TRUE;\r
+ Match = TRUE;\r
+ FoundOne = TRUE;\r
}\r
\r
FreePool (TempDevicePath);\r
}\r
}\r
+\r
//\r
// If a match was not found, then keep the current device path instance\r
//\r
if (!Match) {\r
- SavedNewVariable = NewVariable;\r
- NewVariable = AppendDevicePathInstance (NewVariable, Instance);\r
+ SavedNewVariable = NewVariable;\r
+ NewVariable = AppendDevicePathInstance (NewVariable, Instance);\r
if (SavedNewVariable != NULL) {\r
FreePool (SavedNewVariable);\r
}\r
}\r
+\r
//\r
// Get next device path instance from Variable\r
//\r
FreePool (NewVariable);\r
}\r
\r
- return ;\r
+ return;\r
}\r
\r
/**\r
**/\r
EFI_STATUS\r
SetTerminalDevicePath (\r
- IN TERMINAL_TYPE TerminalType,\r
- IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath,\r
- OUT EFI_DEVICE_PATH_PROTOCOL **TerminalDevicePath\r
+ IN TERMINAL_TYPE TerminalType,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath,\r
+ OUT EFI_DEVICE_PATH_PROTOCOL **TerminalDevicePath\r
)\r
{\r
VENDOR_DEVICE_PATH Node;\r
ASSERT (TerminalType < ARRAY_SIZE (mTerminalType));\r
Node.Header.Type = MESSAGING_DEVICE_PATH;\r
Node.Header.SubType = MSG_VENDOR_DP;\r
- SetDevicePathNodeLength (&Node, sizeof (VENDOR_DEVICE_PATH));\r
+ SetDevicePathNodeLength (&Node.Header, sizeof (VENDOR_DEVICE_PATH));\r
CopyGuid (&Node.Guid, mTerminalType[TerminalType]);\r
\r
//\r
//\r
*TerminalDevicePath = AppendDevicePathNode (\r
ParentDevicePath,\r
- (EFI_DEVICE_PATH_PROTOCOL *) &Node\r
+ (EFI_DEVICE_PATH_PROTOCOL *)&Node\r
);\r
if (*TerminalDevicePath == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
**/\r
EFI_STATUS\r
EFIAPI\r
-InitializeTerminal(\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
+InitializeTerminal (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
//\r
// Install driver model protocol(s).\r
**/\r
BOOLEAN\r
IsHotPlugDevice (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
- EFI_DEVICE_PATH_PROTOCOL *CheckDevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL *CheckDevicePath;\r
\r
CheckDevicePath = DevicePath;\r
while (!IsDevicePathEnd (CheckDevicePath)) {\r
// Check device whether is hot plug device or not throught Device Path\r
//\r
if ((DevicePathType (CheckDevicePath) == MESSAGING_DEVICE_PATH) &&\r
- (DevicePathSubType (CheckDevicePath) == MSG_USB_DP ||\r
- DevicePathSubType (CheckDevicePath) == MSG_USB_CLASS_DP ||\r
- DevicePathSubType (CheckDevicePath) == MSG_USB_WWID_DP)) {\r
+ ((DevicePathSubType (CheckDevicePath) == MSG_USB_DP) ||\r
+ (DevicePathSubType (CheckDevicePath) == MSG_USB_CLASS_DP) ||\r
+ (DevicePathSubType (CheckDevicePath) == MSG_USB_WWID_DP)))\r
+ {\r
//\r
// If Device is USB device\r
//\r
return TRUE;\r
}\r
+\r
if ((DevicePathType (CheckDevicePath) == HARDWARE_DEVICE_PATH) &&\r
- (DevicePathSubType (CheckDevicePath) == HW_PCCARD_DP)) {\r
+ (DevicePathSubType (CheckDevicePath) == HW_PCCARD_DP))\r
+ {\r
//\r
// If Device is PCCard\r
//\r
\r
return FALSE;\r
}\r
-\r