]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
MdeModulePkg: Apply uncrustify changes
[mirror_edk2.git] / MdeModulePkg / Universal / Console / TerminalDxe / Terminal.c
index 6ccbc28e85c12e257e472aec90a774abd2164c4f..e2d779c783784e7a06745e55c9f04548c8c5a652 100644 (file)
@@ -2,24 +2,17 @@
   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
@@ -28,22 +21,28 @@ EFI_DRIVER_BINDING_PROTOCOL gTerminalDriverBinding = {
   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
@@ -69,16 +68,16 @@ TERMINAL_DEV  mTerminalDevTemplate = {
     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
@@ -91,9 +90,9 @@ TERMINAL_DEV  mTerminalDevTemplate = {
   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
@@ -112,10 +111,10 @@ TERMINAL_DEV  mTerminalDevTemplate = {
   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
@@ -130,16 +129,17 @@ TERMINAL_CONSOLE_MODE_DATA mTerminalConsoleModeData[] = {
 **/\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
@@ -159,9 +159,9 @@ TerminalTypeFromGuid (
 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
@@ -183,23 +183,25 @@ TerminalDriverBindingSupported (
       // 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
@@ -209,7 +211,7 @@ TerminalDriverBindingSupported (
   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
@@ -226,11 +228,11 @@ TerminalDriverBindingSupported (
   // 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
@@ -238,7 +240,7 @@ TerminalDriverBindingSupported (
   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
@@ -255,16 +257,15 @@ TerminalDriverBindingSupported (
   // 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
@@ -276,14 +277,15 @@ TerminalDriverBindingSupported (
 **/\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
@@ -311,8 +313,8 @@ TerminalFreeNotifyList (
 **/\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
@@ -322,15 +324,23 @@ InitializeTerminalConsoleTextMode (
   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
@@ -341,10 +351,10 @@ InitializeTerminalConsoleTextMode (
 **/\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
@@ -361,10 +371,11 @@ StopTerminalStateMachine (
 **/\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
@@ -404,13 +415,13 @@ EFI_STATUS
 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
@@ -430,9 +441,11 @@ InitializeControllerNameTable (
       FreeUnicodeStringTable (Table);\r
     }\r
   }\r
+\r
   if (!EFI_ERROR (Status)) {\r
     *ControllerNameTable = Table;\r
   }\r
+\r
   return Status;\r
 }\r
 \r
@@ -455,26 +468,26 @@ InitializeControllerNameTable (
 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
@@ -482,12 +495,15 @@ TerminalDriverBindingStart (
   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
@@ -495,12 +511,15 @@ TerminalDriverBindingStart (
   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
@@ -520,7 +539,6 @@ TerminalDriverBindingStart (
   }\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
@@ -545,14 +563,14 @@ TerminalDriverBindingStart (
           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
@@ -564,7 +582,7 @@ TerminalDriverBindingStart (
                 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
@@ -580,17 +598,20 @@ TerminalDriverBindingStart (
                   //\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
@@ -617,8 +638,9 @@ TerminalDriverBindingStart (
     // 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
@@ -673,14 +695,17 @@ TerminalDriverBindingStart (
   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
@@ -693,17 +718,17 @@ TerminalDriverBindingStart (
 \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
@@ -719,26 +744,28 @@ TerminalDriverBindingStart (
   }\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
@@ -753,17 +780,21 @@ TerminalDriverBindingStart (
 \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
@@ -786,9 +817,11 @@ FreeResources:
   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
@@ -796,12 +829,15 @@ FreeResources:
   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
@@ -866,10 +902,10 @@ CloseProtocols:
 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
@@ -891,7 +927,7 @@ TerminalDriverBindingStop (
     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
@@ -907,18 +943,18 @@ TerminalDriverBindingStop (
     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
@@ -926,25 +962,23 @@ TerminalDriverBindingStop (
   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
@@ -960,15 +994,14 @@ TerminalDriverBindingStop (
                       );\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
@@ -993,6 +1026,49 @@ TerminalDriverBindingStop (
   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
@@ -1006,20 +1082,25 @@ TerminalUpdateConsoleDevVariable (
   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
@@ -1028,17 +1109,21 @@ TerminalUpdateConsoleDevVariable (
   //\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
@@ -1052,7 +1137,7 @@ TerminalUpdateConsoleDevVariable (
                   );\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
@@ -1060,8 +1145,8 @@ TerminalUpdateConsoleDevVariable (
       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
@@ -1079,10 +1164,9 @@ TerminalUpdateConsoleDevVariable (
 \r
   FreePool (Variable);\r
 \r
-  return ;\r
+  return;\r
 }\r
 \r
-\r
 /**\r
   Remove terminal device path from Console Device Environment Variables.\r
 \r
@@ -1109,19 +1193,19 @@ TerminalRemoveConsoleDevVariable (
   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
@@ -1129,8 +1213,9 @@ TerminalRemoveConsoleDevVariable (
   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
@@ -1140,7 +1225,6 @@ TerminalRemoveConsoleDevVariable (
     //\r
     Match = FALSE;\r
     for (TerminalType = 0; TerminalType < ARRAY_SIZE (mTerminalType); TerminalType++) {\r
-\r
       SetTerminalDevicePath (TerminalType, ParentDevicePath, &TempDevicePath);\r
 \r
       //\r
@@ -1148,23 +1232,25 @@ TerminalRemoveConsoleDevVariable (
       //\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
@@ -1194,7 +1280,7 @@ TerminalRemoveConsoleDevVariable (
     FreePool (NewVariable);\r
   }\r
 \r
-  return ;\r
+  return;\r
 }\r
 \r
 /**\r
@@ -1211,9 +1297,9 @@ TerminalRemoveConsoleDevVariable (
 **/\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
@@ -1221,7 +1307,7 @@ SetTerminalDevicePath (
   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
@@ -1230,7 +1316,7 @@ SetTerminalDevicePath (
   //\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
@@ -1251,12 +1337,12 @@ SetTerminalDevicePath (
 **/\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
@@ -1288,10 +1374,10 @@ InitializeTerminal(
 **/\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
@@ -1299,16 +1385,19 @@ IsHotPlugDevice (
     // 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
@@ -1320,4 +1409,3 @@ IsHotPlugDevice (
 \r
   return FALSE;\r
 }\r
-\r