]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/Serial.c
Fix minor coding style issue.
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Isa / IsaSerialDxe / Serial.c
index 846d863c308aaaaa6c29c36306dddfc42ce41c1e..317ac78fcd3302bec26418613678acf8215a076d 100644 (file)
@@ -1,14 +1,14 @@
-/**@file\r
-       Serial driver for standard UARTS on an ISA bus.\r
+/** @file\r
+  Serial driver for standard UARTS on an ISA bus.\r
 \r
-  Copyright (c) 2006 - 2007, Intel Corporation<BR>\r
-  All rights reserved. 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
+Copyright (c) 2006 - 2010, Intel Corporation<BR>\r
+All rights reserved. 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
+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
 \r
 **/\r
 \r
@@ -41,7 +41,7 @@ SERIAL_DEV  gSerialDevTempate = {
     NULL\r
   },\r
   { // SerialMode\r
-    SERIAL_PORT_DEFAULT_CONTROL_MASK,\r
+    SERIAL_PORT_SUPPORT_CONTROL_MASK,\r
     SERIAL_PORT_DEFAULT_TIMEOUT,\r
     FixedPcdGet64 (PcdUartDefaultBaudRate),     // BaudRate\r
     SERIAL_PORT_DEFAULT_RECEIVE_FIFO_DEPTH,\r
@@ -82,10 +82,55 @@ SERIAL_DEV  gSerialDevTempate = {
   },\r
   FALSE,\r
   FALSE,\r
-  UART16550A,\r
+  Uart16550A,\r
   NULL\r
 };\r
 \r
+/**\r
+  Check the device path node whether it's the Flow Control node or not.\r
+\r
+  @param[in] FlowControl    The device path node to be checked.\r
+  \r
+  @retval TRUE              It's the Flow Control node.\r
+  @retval FALSE             It's not.\r
+\r
+**/\r
+BOOLEAN\r
+IsUartFlowControlNode (\r
+  IN UART_FLOW_CONTROL_DEVICE_PATH *FlowControl\r
+  )\r
+{\r
+  return (BOOLEAN) (\r
+           (DevicePathType (FlowControl) == MESSAGING_DEVICE_PATH) &&\r
+           (DevicePathSubType (FlowControl) == MSG_VENDOR_DP) &&\r
+           (CompareGuid (&FlowControl->Guid, &gEfiUartDevicePathGuid))\r
+           );\r
+}\r
+\r
+/**\r
+  Check the device path node whether it contains Flow Control node or not.\r
+\r
+  @param[in] DevicePath     The device path to be checked.\r
+  \r
+  @retval TRUE              It contains the Flow Control node.\r
+  @retval FALSE             It doesn't.\r
+\r
+**/\r
+BOOLEAN\r
+ContainsFlowControl (\r
+  IN EFI_DEVICE_PATH_PROTOCOL      *DevicePath\r
+  )\r
+{\r
+  while (!IsDevicePathEnd (DevicePath)) {\r
+    if (IsUartFlowControlNode ((UART_FLOW_CONTROL_DEVICE_PATH *) DevicePath)) {\r
+      return TRUE;\r
+    }\r
+    DevicePath = NextDevicePathNode (DevicePath);\r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
 /**\r
   The user Entry Point for module IsaSerial. The user code starts with this function.\r
 \r
@@ -108,14 +153,13 @@ InitializeIsaSerial (
   //\r
   // Install driver model protocol(s).\r
   //\r
-  Status = EfiLibInstallAllDriverProtocols (\r
+  Status = EfiLibInstallDriverBindingComponentName2 (\r
              ImageHandle,\r
              SystemTable,\r
              &gSerialControllerDriver,\r
              ImageHandle,\r
              &gIsaSerialComponentName,\r
-             NULL,\r
-             NULL\r
+             &gIsaSerialComponentName2\r
              );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -123,7 +167,16 @@ InitializeIsaSerial (
   return Status;\r
 }\r
 \r
+/**\r
+  Check to see if this driver supports the given controller\r
+\r
+  @param  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.\r
+  @param  Controller           The handle of the controller to test.\r
+  @param  RemainingDevicePath  A pointer to the remaining portion of a device path.\r
 \r
+  @return EFI_SUCCESS          This driver can support the given controller\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 SerialControllerDriverSupported (\r
@@ -131,67 +184,159 @@ SerialControllerDriverSupported (
   IN EFI_HANDLE                     Controller,\r
   IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Check to see if this driver supports the given controller\r
-\r
-  Arguments:\r
-\r
-    This - A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.\r
-    Controller - The handle of the controller to test.\r
-    RemainingDevicePath - A pointer to the remaining portion of a device path.\r
-\r
-  Returns:\r
 \r
-    EFI_SUCCESS - This driver can support the given controller\r
-\r
---*/\r
 {\r
   EFI_STATUS                                Status;\r
   EFI_DEVICE_PATH_PROTOCOL                  *ParentDevicePath;\r
   EFI_ISA_IO_PROTOCOL                       *IsaIo;\r
-  UART_DEVICE_PATH                          UartNode;\r
+  UART_DEVICE_PATH                          *UartNode;\r
+  EFI_DEVICE_PATH_PROTOCOL                  *DevicePath;\r
+  UART_FLOW_CONTROL_DEVICE_PATH             *FlowControlNode;\r
+  EFI_OPEN_PROTOCOL_INFORMATION_ENTRY       *OpenInfoBuffer;\r
+  UINTN                                     EntryCount;\r
+  UINTN                                     Index;\r
+  BOOLEAN                                   HasFlowControl;\r
 \r
   //\r
-  // Ignore the RemainingDevicePath\r
+  // Check RemainingDevicePath validation\r
   //\r
+  if (RemainingDevicePath != NULL) {\r
+    //\r
+    // Check if RemainingDevicePath is the End of Device Path Node, \r
+    // if yes, go on checking other conditions\r
+    //\r
+    if (!IsDevicePathEnd (RemainingDevicePath)) {\r
+      //\r
+      // If RemainingDevicePath isn't the End of Device Path Node,\r
+      // check its validation\r
+      //\r
+      Status = EFI_UNSUPPORTED;\r
+\r
+      UartNode = (UART_DEVICE_PATH *) RemainingDevicePath;\r
+      if (UartNode->Header.Type != MESSAGING_DEVICE_PATH ||\r
+          UartNode->Header.SubType != MSG_UART_DP ||\r
+          sizeof (UART_DEVICE_PATH) != DevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *) UartNode)\r
+                                        ) {\r
+        goto Error;\r
+      }\r
+  \r
+      if (UartNode->BaudRate > SERIAL_PORT_MAX_BAUD_RATE) {\r
+        goto Error;\r
+      }\r
+  \r
+      if (UartNode->Parity < NoParity || UartNode->Parity > SpaceParity) {\r
+        goto Error;\r
+      }\r
+  \r
+      if (UartNode->DataBits < 5 || UartNode->DataBits > 8) {\r
+        goto Error;\r
+      }\r
+  \r
+      if (UartNode->StopBits < OneStopBit || UartNode->StopBits > TwoStopBits) {\r
+        goto Error;\r
+      }\r
+  \r
+      if ((UartNode->DataBits == 5) && (UartNode->StopBits == TwoStopBits)) {\r
+        goto Error;\r
+      }\r
+  \r
+      if ((UartNode->DataBits >= 6) && (UartNode->DataBits <= 8) && (UartNode->StopBits == OneFiveStopBits)) {\r
+        goto Error;\r
+      }\r
+\r
+      FlowControlNode = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (UartNode);\r
+      if (IsUartFlowControlNode (FlowControlNode)) {\r
+        //\r
+        // If the second node is Flow Control Node,\r
+        //   return error when it request other than hardware flow control.\r
+        //\r
+        if ((ReadUnaligned32 (&FlowControlNode->FlowControlMap) & ~UART_FLOW_CONTROL_HARDWARE) != 0) {\r
+          goto Error;\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
   //\r
   // Open the IO Abstraction(s) needed to perform the supported test\r
   //\r
   Status = gBS->OpenProtocol (\r
                   Controller,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  (VOID **) &ParentDevicePath,\r
+                  &gEfiIsaIoProtocolGuid,\r
+                  (VOID **) &IsaIo,\r
                   This->DriverBindingHandle,\r
                   Controller,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
                   );\r
   if (Status == EFI_ALREADY_STARTED) {\r
-    return EFI_SUCCESS;\r
+    if (RemainingDevicePath == NULL || IsDevicePathEnd (RemainingDevicePath)) {\r
+      //\r
+      // If RemainingDevicePath is NULL or is the End of Device Path Node\r
+      //\r
+      return EFI_SUCCESS;\r
+    }\r
+    //\r
+    // When the driver has produced device path with flow control node but RemainingDevicePath only contains UART node,\r
+    //   return unsupported, and vice versa.\r
+    //\r
+    Status = gBS->OpenProtocolInformation (\r
+                    Controller,\r
+                    &gEfiIsaIoProtocolGuid,\r
+                    &OpenInfoBuffer,\r
+                    &EntryCount\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+\r
+    for (Index = 0; Index < EntryCount; Index++) {\r
+      if ((OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
+        Status = gBS->OpenProtocol (\r
+                        OpenInfoBuffer[Index].ControllerHandle,\r
+                        &gEfiDevicePathProtocolGuid,\r
+                        (VOID **) &DevicePath,\r
+                        This->DriverBindingHandle,\r
+                        Controller,\r
+                        EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                        );\r
+        if (!EFI_ERROR (Status)) {\r
+          HasFlowControl = ContainsFlowControl (RemainingDevicePath);\r
+          if (HasFlowControl ^ ContainsFlowControl (DevicePath)) {\r
+            Status = EFI_UNSUPPORTED;\r
+          }\r
+        }\r
+        break;\r
+      }\r
+    }\r
+    FreePool (OpenInfoBuffer);\r
+    return Status;\r
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
 \r
+  //\r
+  // Close the I/O Abstraction(s) used to perform the supported test\r
+  //\r
   gBS->CloseProtocol (\r
          Controller,\r
-         &gEfiDevicePathProtocolGuid,\r
+         &gEfiIsaIoProtocolGuid,\r
          This->DriverBindingHandle,\r
          Controller\r
          );\r
 \r
+  //\r
+  // Open the EFI Device Path protocol needed to perform the supported test\r
+  //\r
   Status = gBS->OpenProtocol (\r
                   Controller,\r
-                  &gEfiIsaIoProtocolGuid,\r
-                  (VOID **) &IsaIo,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  (VOID **) &ParentDevicePath,\r
                   This->DriverBindingHandle,\r
                   Controller,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
                   );\r
-\r
   if (Status == EFI_ALREADY_STARTED) {\r
     return EFI_SUCCESS;\r
   }\r
@@ -208,57 +353,14 @@ SerialControllerDriverSupported (
     Status = EFI_UNSUPPORTED;\r
     goto Error;\r
   }\r
-  //\r
-  // Make sure RemainingDevicePath is valid\r
-  //\r
-  if (RemainingDevicePath != NULL) {\r
-    Status = EFI_UNSUPPORTED;\r
-    CopyMem (\r
-      &UartNode,\r
-      (UART_DEVICE_PATH *) RemainingDevicePath,\r
-      sizeof (UART_DEVICE_PATH)\r
-      );\r
-    if (UartNode.Header.Type != MESSAGING_DEVICE_PATH ||\r
-        UartNode.Header.SubType != MSG_UART_DP ||\r
-        sizeof (UART_DEVICE_PATH) != DevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *) &UartNode)\r
-                                      ) {\r
-      goto Error;\r
-    }\r
-\r
-    if (UartNode.BaudRate > SERIAL_PORT_MAX_BAUD_RATE) {\r
-      goto Error;\r
-    }\r
-\r
-    if (UartNode.Parity < NoParity || UartNode.Parity > SpaceParity) {\r
-      goto Error;\r
-    }\r
-\r
-    if (UartNode.DataBits < 5 || UartNode.DataBits > 8) {\r
-      goto Error;\r
-    }\r
-\r
-    if (UartNode.StopBits < OneStopBit || UartNode.StopBits > TwoStopBits) {\r
-      goto Error;\r
-    }\r
-\r
-    if ((UartNode.DataBits == 5) && (UartNode.StopBits == TwoStopBits)) {\r
-      goto Error;\r
-    }\r
-\r
-    if ((UartNode.DataBits >= 6) && (UartNode.DataBits <= 8) && (UartNode.StopBits == OneFiveStopBits)) {\r
-      goto Error;\r
-    }\r
-\r
-    Status = EFI_SUCCESS;\r
-  }\r
 \r
 Error:\r
   //\r
-  // Close the I/O Abstraction(s) used to perform the supported test\r
+  // Close protocol, don't use device path protocol in the Support() function\r
   //\r
   gBS->CloseProtocol (\r
          Controller,\r
-         &gEfiIsaIoProtocolGuid,\r
+         &gEfiDevicePathProtocolGuid,\r
          This->DriverBindingHandle,\r
          Controller\r
          );\r
@@ -266,6 +368,16 @@ Error:
   return Status;\r
 }\r
 \r
+/**\r
+  Start to management the controller passed in\r
+\r
+  @param  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.\r
+  @param  Controller           The handle of the controller to test.\r
+  @param  RemainingDevicePath  A pointer to the remaining portion of a device path.\r
+\r
+  @return EFI_SUCCESS   Driver is started successfully\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 SerialControllerDriverStart (\r
@@ -273,33 +385,21 @@ SerialControllerDriverStart (
   IN EFI_HANDLE                     Controller,\r
   IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Start to management the controller passed in\r
-\r
-  Arguments:\r
-\r
-    This - A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.\r
-    Controller - The handle of the controller to test.\r
-    RemainingDevicePath - A pointer to the remaining portion of a device path.\r
-\r
-  Returns:\r
-\r
-    EFI_SUCCESS - Driver is started successfully\r
 \r
---*/\r
 {\r
   EFI_STATUS                          Status;\r
   EFI_ISA_IO_PROTOCOL                 *IsaIo;\r
   SERIAL_DEV                          *SerialDevice;\r
   UINTN                               Index;\r
-  UART_DEVICE_PATH                    Node;\r
   EFI_DEVICE_PATH_PROTOCOL            *ParentDevicePath;\r
   EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;\r
   UINTN                               EntryCount;\r
   EFI_SERIAL_IO_PROTOCOL              *SerialIo;\r
+  UART_DEVICE_PATH                    *Uart;\r
+  UINT32                              FlowControlMap;\r
+  UART_FLOW_CONTROL_DEVICE_PATH       *FlowControl;\r
+  EFI_DEVICE_PATH_PROTOCOL            *TempDevicePath;\r
+  UINT32                              Control;\r
 \r
   SerialDevice = NULL;\r
   //\r
@@ -342,9 +442,13 @@ SerialControllerDriverStart (
 \r
   if (Status == EFI_ALREADY_STARTED) {\r
 \r
-    if (RemainingDevicePath == NULL) {\r
+    if (RemainingDevicePath == NULL || IsDevicePathEnd (RemainingDevicePath)) {\r
+      //\r
+      // If RemainingDevicePath is NULL or is the End of Device Path Node\r
+      //\r
       return EFI_SUCCESS;\r
     }\r
+\r
     //\r
     // Make sure a child handle does not already exist.  This driver can only\r
     // produce one child per serial port.\r
@@ -361,7 +465,7 @@ SerialControllerDriverStart (
 \r
     Status = EFI_ALREADY_STARTED;\r
     for (Index = 0; Index < EntryCount; Index++) {\r
-      if (OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {\r
+      if ((OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
         Status = gBS->OpenProtocol (\r
                         OpenInfoBuffer[Index].ControllerHandle,\r
                         &gEfiSerialIoProtocolGuid,\r
@@ -371,24 +475,54 @@ SerialControllerDriverStart (
                         EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
                         );\r
         if (!EFI_ERROR (Status)) {\r
-          CopyMem (&Node, RemainingDevicePath, sizeof (UART_DEVICE_PATH));\r
+          Uart   = (UART_DEVICE_PATH *) RemainingDevicePath;\r
           Status = SerialIo->SetAttributes (\r
                                SerialIo,\r
-                               Node.BaudRate,\r
+                               Uart->BaudRate,\r
                                SerialIo->Mode->ReceiveFifoDepth,\r
                                SerialIo->Mode->Timeout,\r
-                               (EFI_PARITY_TYPE) Node.Parity,\r
-                               Node.DataBits,\r
-                               (EFI_STOP_BITS_TYPE) Node.StopBits\r
+                               (EFI_PARITY_TYPE) Uart->Parity,\r
+                               Uart->DataBits,\r
+                               (EFI_STOP_BITS_TYPE) Uart->StopBits\r
                                );\r
+\r
+          FlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (Uart);\r
+          if (!EFI_ERROR (Status) && IsUartFlowControlNode (FlowControl)) {\r
+            Status = SerialIo->GetControl (SerialIo, &Control);\r
+            if (!EFI_ERROR (Status)) {\r
+              if (ReadUnaligned32 (&FlowControl->FlowControlMap) == UART_FLOW_CONTROL_HARDWARE) {\r
+                Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;\r
+              } else {\r
+                Control &= ~EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;\r
+              }\r
+              //\r
+              // Clear the bits that are not allowed to pass to SetControl\r
+              //\r
+              Control &= (EFI_SERIAL_REQUEST_TO_SEND | EFI_SERIAL_DATA_TERMINAL_READY |\r
+                          EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE | EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE | \r
+                          EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE);\r
+              Status = SerialIo->SetControl (SerialIo, Control);\r
+            }\r
+          }\r
         }\r
         break;\r
       }\r
     }\r
 \r
-    gBS->FreePool (OpenInfoBuffer);\r
+    FreePool (OpenInfoBuffer);\r
     return Status;\r
   }\r
+\r
+  if (RemainingDevicePath != NULL) {\r
+    if (IsDevicePathEnd (RemainingDevicePath)) {\r
+      //\r
+      // If RemainingDevicePath is the End of Device Path Node,\r
+      // skip enumerate any device and return EFI_SUCESSS\r
+      // \r
+      return EFI_SUCCESS;\r
+    }\r
+  }\r
+\r
   //\r
   // Initialize the serial device instance\r
   //\r
@@ -401,14 +535,40 @@ SerialControllerDriverStart (
   SerialDevice->SerialIo.Mode       = &(SerialDevice->SerialMode);\r
   SerialDevice->IsaIo               = IsaIo;\r
   SerialDevice->ParentDevicePath    = ParentDevicePath;\r
+  FlowControl                       = NULL;\r
+  FlowControlMap                    = 0;\r
 \r
-  ADD_SERIAL_NAME (SerialDevice, IsaIo);\r
+  //\r
+  // Check if RemainingDevicePath is NULL, \r
+  // if yes, use the values from the gSerialDevTempate as no remaining device path was\r
+  // passed in.\r
+  //\r
+  if (RemainingDevicePath != NULL) {\r
+    //\r
+    // If RemainingDevicePath isn't NULL, \r
+    // match the configuration of the RemainingDevicePath. IsHandleSupported()\r
+    // already checked to make sure the RemainingDevicePath contains settings\r
+    // that we can support.\r
+    //\r
+    CopyMem (&SerialDevice->UartDevicePath, RemainingDevicePath, sizeof (UART_DEVICE_PATH));\r
+    FlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (RemainingDevicePath);\r
+    if (IsUartFlowControlNode (FlowControl)) {\r
+      FlowControlMap = ReadUnaligned32 (&FlowControl->FlowControlMap);\r
+    } else {\r
+      FlowControl    = NULL;\r
+    }\r
+  }\r
+\r
+  AddName (SerialDevice, IsaIo);\r
 \r
   for (Index = 0; SerialDevice->IsaIo->ResourceList->ResourceItem[Index].Type != EfiIsaAcpiResourceEndOfList; Index++) {\r
     if (SerialDevice->IsaIo->ResourceList->ResourceItem[Index].Type == EfiIsaAcpiResourceIo) {\r
       SerialDevice->BaseAddress = (UINT16) SerialDevice->IsaIo->ResourceList->ResourceItem[Index].StartRange;\r
     }\r
   }\r
+  \r
+  SerialDevice->HardwareFlowControl = (BOOLEAN) (FlowControlMap == UART_FLOW_CONTROL_HARDWARE);\r
+\r
   //\r
   // Report status code the serial present\r
   //\r
@@ -428,30 +588,30 @@ SerialControllerDriverStart (
     goto Error;\r
   }\r
 \r
-  if (RemainingDevicePath != NULL) {\r
-    //\r
-    // Match the configuration of the RemainingDevicePath. IsHandleSupported()\r
-    // already checked to make sure the RemainingDevicePath contains settings\r
-    // that we can support.\r
-    //\r
-    CopyMem (&SerialDevice->UartDevicePath, RemainingDevicePath, sizeof (UART_DEVICE_PATH));\r
-  } else {\r
-    //\r
-    // Use the values from the gSerialDevTempate as no remaining device path was\r
-    // passed in.\r
-    //\r
-  }\r
   //\r
-  // Build the device path by appending the UART node to the ParentDevicePath\r
-  // from the WinNtIo handle. The Uart setings are zero here, since\r
-  // SetAttribute() will update them to match the current setings.\r
+  // Build the device path by appending the UART node to the ParentDevicePath.\r
+  // The Uart setings are zero here, since  SetAttribute() will update them to match \r
+  // the default setings.\r
   //\r
   SerialDevice->DevicePath = AppendDevicePathNode (\r
                                ParentDevicePath,\r
-                               (EFI_DEVICE_PATH_PROTOCOL *)&SerialDevice->UartDevicePath\r
+                               (EFI_DEVICE_PATH_PROTOCOL *) &SerialDevice->UartDevicePath\r
                                );\r
+  //\r
+  // Only produce the Flow Control node when remaining device path has it\r
+  //\r
+  if (FlowControl != NULL) {\r
+    TempDevicePath = SerialDevice->DevicePath;\r
+    if (TempDevicePath != NULL) {\r
+      SerialDevice->DevicePath = AppendDevicePathNode (\r
+                                   TempDevicePath,\r
+                                   (EFI_DEVICE_PATH_PROTOCOL *) FlowControl\r
+                                   );\r
+      FreePool (TempDevicePath);\r
+    }\r
+  }\r
   if (SerialDevice->DevicePath == NULL) {\r
-    Status = EFI_DEVICE_ERROR;\r
+    Status = EFI_OUT_OF_RESOURCES;\r
     goto Error;\r
   }\r
 \r
@@ -515,8 +675,8 @@ Error:
            This->DriverBindingHandle,\r
            Controller\r
            );\r
-    if (SerialDevice) {\r
-      if (SerialDevice->DevicePath) {\r
+    if (SerialDevice != NULL) {\r
+      if (SerialDevice->DevicePath != NULL) {\r
         gBS->FreePool (SerialDevice->DevicePath);\r
       }\r
 \r
@@ -528,6 +688,18 @@ Error:
   return Status;\r
 }\r
 \r
+/**\r
+  Disconnect this driver with the controller, uninstall related protocol instance\r
+\r
+  @param  This                  A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.\r
+  @param  Controller            The handle of the controller to test.\r
+  @param  NumberOfChildren      Number of child device.\r
+  @param  ChildHandleBuffer     A pointer to the remaining portion of a device path.\r
+\r
+  @retval EFI_SUCCESS           Operation successfully\r
+  @retval EFI_DEVICE_ERROR      Cannot stop the driver successfully\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 SerialControllerDriverStop (\r
@@ -536,25 +708,7 @@ SerialControllerDriverStop (
   IN  UINTN                          NumberOfChildren,\r
   IN  EFI_HANDLE                     *ChildHandleBuffer\r
   )\r
-/*++\r
 \r
-  Routine Description:\r
-\r
-    Disconnect this driver with the controller, uninstall related protocol instance\r
-\r
-  Arguments:\r
-\r
-    This                - A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.\r
-    Controller          - The handle of the controller to test.\r
-    NumberOfChildren    - Number of child device.\r
-    RemainingDevicePath - A pointer to the remaining portion of a device path.\r
-\r
-  Returns:\r
-\r
-    EFI_SUCCESS         - Operation successfully\r
-    EFI_DEVICE_ERROR    - Cannot stop the driver successfully\r
-\r
---*/\r
 {\r
   EFI_STATUS                          Status;\r
   UINTN                               Index;\r
@@ -644,7 +798,7 @@ SerialControllerDriverStop (
                EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
                );\r
       } else {\r
-        if (SerialDevice->DevicePath) {\r
+        if (SerialDevice->DevicePath != NULL) {\r
           gBS->FreePool (SerialDevice->DevicePath);\r
         }\r
 \r
@@ -665,26 +819,19 @@ SerialControllerDriverStop (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Detect whether specific FIFO is full or not.\r
+\r
+  @param Fifo    A pointer to the Data Structure SERIAL_DEV_FIFO\r
+\r
+  @return whether specific FIFO is full or not\r
+\r
+**/\r
 BOOLEAN\r
 IsaSerialFifoFull (\r
   IN SERIAL_DEV_FIFO *Fifo\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Detect whether specific FIFO is full or not\r
 \r
-  Arguments:\r
-\r
-    Fifo  - A pointer to the Data Structure SERIAL_DEV_FIFO\r
-\r
-  Returns:\r
-\r
-    TRUE  - the FIFO is full\r
-    FALSE - the FIFO is not full\r
-\r
---*/\r
 {\r
   if (Fifo->Surplus == 0) {\r
     return TRUE;\r
@@ -693,26 +840,19 @@ IsaSerialFifoFull (
   return FALSE;\r
 }\r
 \r
+/**\r
+  Detect whether specific FIFO is empty or not.\r
\r
+  @param  Fifo    A pointer to the Data Structure SERIAL_DEV_FIFO\r
+\r
+  @return whether specific FIFO is empty or not\r
+\r
+**/\r
 BOOLEAN\r
 IsaSerialFifoEmpty (\r
   IN SERIAL_DEV_FIFO *Fifo\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Detect whether specific FIFO is empty or not\r
-\r
-  Arguments:\r
-\r
-    Fifo  - A pointer to the Data Structure SERIAL_DEV_FIFO\r
-\r
-  Returns:\r
 \r
-    TRUE  - the FIFO is empty\r
-    FALSE - the FIFO is not empty\r
-\r
---*/\r
 {\r
   if (Fifo->Surplus == SERIAL_MAX_BUFFER_SIZE) {\r
     return TRUE;\r
@@ -721,28 +861,22 @@ IsaSerialFifoEmpty (
   return FALSE;\r
 }\r
 \r
+/**\r
+  Add data to specific FIFO.\r
+\r
+  @param Fifo                  A pointer to the Data Structure SERIAL_DEV_FIFO\r
+  @param Data                  the data added to FIFO\r
+\r
+  @retval EFI_SUCCESS           Add data to specific FIFO successfully\r
+  @retval EFI_OUT_OF_RESOURCE   Failed to add data because FIFO is already full\r
+\r
+**/\r
 EFI_STATUS\r
 IsaSerialFifoAdd (\r
   IN SERIAL_DEV_FIFO *Fifo,\r
   IN UINT8           Data\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
 \r
-    Add data to specific FIFO\r
-\r
-  Arguments:\r
-\r
-    Fifo                - A pointer to the Data Structure SERIAL_DEV_FIFO\r
-    Data                - the data added to FIFO\r
-\r
-  Returns:\r
-\r
-    EFI_SUCCESS         - Add data to specific FIFO successfully\r
-    EFI_OUT_OF_RESOURCE - Failed to add data because FIFO is already full\r
-\r
---*/\r
 {\r
   //\r
   // if FIFO full can not add data\r
@@ -763,27 +897,22 @@ IsaSerialFifoAdd (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Remove data from specific FIFO.\r
+\r
+  @param Fifo                  A pointer to the Data Structure SERIAL_DEV_FIFO\r
+  @param Data                  the data removed from FIFO\r
+\r
+  @retval EFI_SUCCESS           Remove data from specific FIFO successfully\r
+  @retval EFI_OUT_OF_RESOURCE   Failed to remove data because FIFO is empty\r
+\r
+**/\r
 EFI_STATUS\r
 IsaSerialFifoRemove (\r
   IN  SERIAL_DEV_FIFO *Fifo,\r
   OUT UINT8           *Data\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Remove data from specific FIFO\r
-\r
-  Arguments:\r
-\r
-    Fifo                - A pointer to the Data Structure SERIAL_DEV_FIFO\r
-    Data                - the data removed from FIFO\r
 \r
-  Returns:\r
-    EFI_SUCCESS         - Remove data from specific FIFO successfully\r
-    EFI_OUT_OF_RESOURCE - Failed to remove data because FIFO is empty\r
-\r
---*/\r
 {\r
   //\r
   // if FIFO is empty, no data can remove\r
@@ -804,27 +933,21 @@ IsaSerialFifoRemove (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Reads and writes all avaliable data.\r
+\r
+  @param SerialDevice           The device to flush\r
+\r
+  @retval EFI_SUCCESS           Data was read/written successfully.\r
+  @retval EFI_OUT_OF_RESOURCE   Failed because software receive FIFO is full.  Note, when\r
+                                this happens, pending writes are not done.\r
+\r
+**/\r
 EFI_STATUS\r
 IsaSerialReceiveTransmit (\r
   IN SERIAL_DEV *SerialDevice\r
   )\r
-/*++\r
 \r
-  Routine Description:\r
-\r
-    Reads and writes all avaliable data.\r
-\r
-  Arguments:\r
-\r
-    SerialDevice        - The device to flush\r
-\r
-  Returns:\r
-\r
-    EFI_SUCCESS         - Data was read/written successfully.\r
-    EFI_OUT_OF_RESOURCE - Failed because software receive FIFO is full.  Note, when\r
-                          this happens, pending writes are not done.\r
-\r
---*/\r
 {\r
   SERIAL_PORT_LSR Lsr;\r
   UINT8           Data;\r
@@ -852,55 +975,56 @@ IsaSerialReceiveTransmit (
     } while (!IsaSerialFifoEmpty (&SerialDevice->Transmit));\r
   } else {\r
     ReceiveFifoFull = IsaSerialFifoFull (&SerialDevice->Receive);\r
+    //\r
+    // For full handshake flow control, tell the peer to send data\r
+    // if receive buffer is available.\r
+    //\r
+    if (SerialDevice->HardwareFlowControl &&\r
+        !FeaturePcdGet(PcdIsaBusSerialUseHalfHandshake)&&\r
+        !ReceiveFifoFull\r
+        ) {\r
+      Mcr.Data     = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
+      Mcr.Bits.Rts = 1;\r
+      WRITE_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Mcr.Data);\r
+    }\r
     do {\r
       Lsr.Data = READ_LSR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
 \r
-      if (FeaturePcdGet (PcdNtEmulatorEnable)) {\r
-        //\r
-        // This is required for NT to avoid a forever-spin...\r
-        // This would be better if READ_LSR was a polling operation\r
-        // that would timeout.\r
-        //\r
-        Lsr.Bits.THRE = 1;\r
-      }\r
       //\r
       // Flush incomming data to prevent a an overrun during a long write\r
       //\r
-      if (Lsr.Bits.DR && !ReceiveFifoFull) {\r
+      if ((Lsr.Bits.Dr == 1) && !ReceiveFifoFull) {\r
         ReceiveFifoFull = IsaSerialFifoFull (&SerialDevice->Receive);\r
         if (!ReceiveFifoFull) {\r
-          if (Lsr.Bits.FIFOE || Lsr.Bits.OE || Lsr.Bits.PE || Lsr.Bits.FE || Lsr.Bits.BI) {\r
+          if (Lsr.Bits.FIFOe == 1 || Lsr.Bits.Oe == 1 || Lsr.Bits.Pe == 1 || Lsr.Bits.Fe == 1 || Lsr.Bits.Bi == 1) {\r
             REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
               EFI_ERROR_CODE,\r
               EFI_P_EC_INPUT_ERROR | EFI_PERIPHERAL_SERIAL_PORT,\r
               SerialDevice->DevicePath\r
               );\r
-            if (Lsr.Bits.FIFOE || Lsr.Bits.PE || Lsr.Bits.FE || Lsr.Bits.BI) {\r
+            if (Lsr.Bits.FIFOe == 1 || Lsr.Bits.Pe == 1|| Lsr.Bits.Fe == 1 || Lsr.Bits.Bi == 1) {\r
               Data = READ_RBR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
               continue;\r
             }\r
           }\r
-          //\r
-          // Make sure the receive data will not be missed, Assert DTR\r
-          //\r
-          if (SerialDevice->HardwareFlowControl) {\r
-            Mcr.Data = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
-            Mcr.Bits.DTRC &= 0;\r
-            WRITE_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Mcr.Data);\r
-          }\r
 \r
           Data = READ_RBR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
 \r
+          IsaSerialFifoAdd (&SerialDevice->Receive, Data);\r
+          \r
           //\r
-          // Deassert DTR\r
+          // For full handshake flow control, if receive buffer full\r
+          // tell the peer to stop sending data.\r
           //\r
-          if (SerialDevice->HardwareFlowControl) {\r
-            Mcr.Data = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
-            Mcr.Bits.DTRC |= 1;\r
+          if (SerialDevice->HardwareFlowControl &&\r
+              !FeaturePcdGet(PcdIsaBusSerialUseHalfHandshake)   &&\r
+              IsaSerialFifoFull (&SerialDevice->Receive)\r
+              ) {\r
+            Mcr.Data     = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
+            Mcr.Bits.Rts = 0;\r
             WRITE_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Mcr.Data);\r
           }\r
 \r
-          IsaSerialFifoAdd (&SerialDevice->Receive, Data);\r
 \r
           continue;\r
         } else {\r
@@ -914,23 +1038,25 @@ IsaSerialReceiveTransmit (
       //\r
       // Do the write\r
       //\r
-      if (Lsr.Bits.THRE && !IsaSerialFifoEmpty (&SerialDevice->Transmit)) {\r
+      if (Lsr.Bits.Thre == 1 && !IsaSerialFifoEmpty (&SerialDevice->Transmit)) {\r
         //\r
         // Make sure the transmit data will not be missed\r
         //\r
         if (SerialDevice->HardwareFlowControl) {\r
           //\r
-          // Send RTS\r
+          // For half handshake flow control assert RTS before sending.\r
           //\r
-          Mcr.Data = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
-          Mcr.Bits.RTS |= 1;\r
-          WRITE_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Mcr.Data);\r
+          if (FeaturePcdGet(PcdIsaBusSerialUseHalfHandshake)) {\r
+            Mcr.Data     = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
+            Mcr.Bits.Rts= 0;\r
+            WRITE_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Mcr.Data);\r
+          }\r
           //\r
           // Wait for CTS\r
           //\r
           TimeOut   = 0;\r
           Msr.Data  = READ_MSR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
-          while (!Msr.Bits.CTS) {\r
+          while ((Msr.Bits.Dcd == 1) && ((Msr.Bits.Cts == 0) ^ FeaturePcdGet(PcdIsaBusSerialUseHalfHandshake))) {\r
             gBS->Stall (TIMEOUT_STALL_INTERVAL);\r
             TimeOut++;\r
             if (TimeOut > 5) {\r
@@ -940,59 +1066,47 @@ IsaSerialReceiveTransmit (
             Msr.Data = READ_MSR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
           }\r
 \r
-          if (Msr.Bits.CTS) {\r
+          if ((Msr.Bits.Dcd == 0) || ((Msr.Bits.Cts == 1) ^ FeaturePcdGet(PcdIsaBusSerialUseHalfHandshake))) {\r
             IsaSerialFifoRemove (&SerialDevice->Transmit, &Data);\r
             WRITE_THR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Data);\r
           }\r
-        }\r
-        //\r
-        // write the data out\r
-        //\r
-        if (!SerialDevice->HardwareFlowControl) {\r
-          IsaSerialFifoRemove (&SerialDevice->Transmit, &Data);\r
-          WRITE_THR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Data);\r
-        }\r
-        //\r
-        // Make sure the transmit data will not be missed\r
-        //\r
-        if (SerialDevice->HardwareFlowControl) {\r
+\r
           //\r
-          // Assert RTS\r
+          // For half handshake flow control, tell DCE we are done.\r
           //\r
-          Mcr.Data = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
-          Mcr.Bits.RTS &= 0;\r
-          WRITE_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Mcr.Data);\r
+          if (FeaturePcdGet(PcdIsaBusSerialUseHalfHandshake)) {\r
+            Mcr.Data = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
+            Mcr.Bits.Rts = 1;\r
+            WRITE_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Mcr.Data);\r
+          }\r
+        } else {\r
+          IsaSerialFifoRemove (&SerialDevice->Transmit, &Data);\r
+          WRITE_THR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Data);\r
         }\r
       }\r
-    } while (Lsr.Bits.THRE && !IsaSerialFifoEmpty (&SerialDevice->Transmit));\r
+    } while (Lsr.Bits.Thre == 1 && !IsaSerialFifoEmpty (&SerialDevice->Transmit));\r
   }\r
 \r
   return EFI_SUCCESS;\r
 }\r
+\r
 //\r
 // Interface Functions\r
 //\r
+/**\r
+  Reset serial device.\r
+\r
+  @param This               Pointer to EFI_SERIAL_IO_PROTOCOL\r
+\r
+  @retval EFI_SUCCESS        Reset successfully\r
+  @retval EFI_DEVICE_ERROR   Failed to reset\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 IsaSerialReset (\r
   IN EFI_SERIAL_IO_PROTOCOL  *This\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Reset serial device\r
-\r
-  Arguments:\r
-\r
-    This             - Pointer to EFI_SERIAL_IO_PROTOCOL\r
-\r
-  Returns:\r
-\r
-    EFI_SUCCESS      - Reset successfully\r
-    EFI_DEVICE_ERROR - Failed to reset\r
-\r
---*/\r
 {\r
   EFI_STATUS      Status;\r
   SERIAL_DEV      *SerialDevice;\r
@@ -1001,6 +1115,7 @@ IsaSerialReset (
   SERIAL_PORT_MCR Mcr;\r
   SERIAL_PORT_FCR Fcr;\r
   EFI_TPL         Tpl;\r
+  UINT32          Control;\r
 \r
   SerialDevice = SERIAL_DEV_FROM_THIS (This);\r
 \r
@@ -1019,32 +1134,32 @@ IsaSerialReset (
   // Make sure DLAB is 0.\r
   //\r
   Lcr.Data      = READ_LCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
-  Lcr.Bits.DLAB = 0;\r
+  Lcr.Bits.DLab = 0;\r
   WRITE_LCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Lcr.Data);\r
 \r
   //\r
   // Turn off all interrupts\r
   //\r
   Ier.Data        = READ_IER (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
-  Ier.Bits.RAVIE  = 0;\r
-  Ier.Bits.THEIE  = 0;\r
-  Ier.Bits.RIE    = 0;\r
-  Ier.Bits.MIE    = 0;\r
+  Ier.Bits.Ravie  = 0;\r
+  Ier.Bits.Theie  = 0;\r
+  Ier.Bits.Rie    = 0;\r
+  Ier.Bits.Mie    = 0;\r
   WRITE_IER (SerialDevice->IsaIo, SerialDevice->BaseAddress, Ier.Data);\r
 \r
   //\r
   // Disable the FIFO.\r
   //\r
-  Fcr.Bits.TRFIFOE = 0;\r
+  Fcr.Bits.TrFIFOE = 0;\r
   WRITE_FCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Fcr.Data);\r
 \r
   //\r
   // Turn off loopback and disable device interrupt.\r
   //\r
   Mcr.Data      = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
-  Mcr.Bits.OUT1 = 0;\r
-  Mcr.Bits.OUT2 = 0;\r
-  Mcr.Bits.LME  = 0;\r
+  Mcr.Bits.Out1 = 0;\r
+  Mcr.Bits.Out2 = 0;\r
+  Mcr.Bits.Lme  = 0;\r
   WRITE_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Mcr.Data);\r
 \r
   //\r
@@ -1072,9 +1187,16 @@ IsaSerialReset (
   //\r
   // Go set the current control bits\r
   //\r
+  Control = 0;\r
+  if (SerialDevice->HardwareFlowControl) {\r
+    Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;\r
+  }\r
+  if (SerialDevice->SoftwareLoopbackEnable) {\r
+    Control |= EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE;\r
+  }\r
   Status = This->SetControl (\r
                    This,\r
-                   This->Mode->ControlMask\r
+                   Control\r
                    );\r
 \r
   if (EFI_ERROR (Status)) {\r
@@ -1084,9 +1206,9 @@ IsaSerialReset (
   //\r
   // for 16550A enable FIFO, 16550 disable FIFO\r
   //\r
-  Fcr.Bits.TRFIFOE  = 1;\r
-  Fcr.Bits.RESETRF  = 1;\r
-  Fcr.Bits.RESETTF  = 1;\r
+  Fcr.Bits.TrFIFOE  = 1;\r
+  Fcr.Bits.ResetRF  = 1;\r
+  Fcr.Bits.ResetTF  = 1;\r
   WRITE_FCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Fcr.Data);\r
 \r
   //\r
@@ -1107,6 +1229,23 @@ IsaSerialReset (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Set new attributes to a serial device.\r
+\r
+  @param This                     Pointer to EFI_SERIAL_IO_PROTOCOL\r
+  @param  BaudRate                 The baudrate of the serial device\r
+  @param  ReceiveFifoDepth         The depth of receive FIFO buffer\r
+  @param  Timeout                  The request timeout for a single char\r
+  @param  Parity                   The type of parity used in serial device\r
+  @param  DataBits                 Number of databits used in serial device\r
+  @param  StopBits                 Number of stopbits used in serial device\r
+\r
+  @retval  EFI_SUCCESS              The new attributes were set\r
+  @retval  EFI_INVALID_PARAMETERS   One or more attributes have an unsupported value\r
+  @retval  EFI_UNSUPPORTED          Data Bits can not set to 5 or 6\r
+  @retval  EFI_DEVICE_ERROR         The serial device is not functioning correctly (no return)\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 IsaSerialSetAttributes (\r
@@ -1118,37 +1257,13 @@ IsaSerialSetAttributes (
   IN UINT8                   DataBits,\r
   IN EFI_STOP_BITS_TYPE      StopBits\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Set new attributes to a serial device\r
-\r
-  Arguments:\r
-\r
-    This                   - Pointer to EFI_SERIAL_IO_PROTOCOL\r
-    BaudRate               - The baudrate of the serial device\r
-    ReceiveFifoDepth       - The depth of receive FIFO buffer\r
-    Timeout                - The request timeout for a single char\r
-    Parity                 - The type of parity used in serial device\r
-    DataBits               - Number of databits used in serial device\r
-    StopBits               - Number of stopbits used in serial device\r
-\r
-  Returns:\r
-\r
-    EFI_SUCCESS            - The new attributes were set\r
-    EFI_INVALID_PARAMETERS - One or more attributes have an unsupported value\r
-    EFI_UNSUPPORTED        - Data Bits can not set to 5 or 6\r
-    EFI_DEVICE_ERROR       - The serial device is not functioning correctly (no return)\r
-\r
---*/\r
 {\r
   EFI_STATUS                Status;\r
   SERIAL_DEV                *SerialDevice;\r
   UINT32                    Divisor;\r
   UINT32                    Remained;\r
   SERIAL_PORT_LCR           Lcr;\r
-  EFI_DEVICE_PATH_PROTOCOL  *NewDevicePath;\r
+  UART_DEVICE_PATH          *Uart;\r
   EFI_TPL                   Tpl;\r
 \r
   SerialDevice = SERIAL_DEV_FROM_THIS (This);\r
@@ -1157,7 +1272,7 @@ IsaSerialSetAttributes (
   // Check for default settings and fill in actual values.\r
   //\r
   if (BaudRate == 0) {\r
-    BaudRate = FixedPcdGet64 (PcdUartDefaultBaudRate);\r
+    BaudRate = PcdGet64 (PcdUartDefaultBaudRate);\r
   }\r
 \r
   if (ReceiveFifoDepth == 0) {\r
@@ -1169,15 +1284,15 @@ IsaSerialSetAttributes (
   }\r
 \r
   if (Parity == DefaultParity) {\r
-    Parity = (EFI_PARITY_TYPE)FixedPcdGet8 (PcdUartDefaultParity);\r
+    Parity = (EFI_PARITY_TYPE)PcdGet8 (PcdUartDefaultParity);\r
   }\r
 \r
   if (DataBits == 0) {\r
-    DataBits = FixedPcdGet8 (PcdUartDefaultDataBits);\r
+    DataBits = PcdGet8 (PcdUartDefaultDataBits);\r
   }\r
 \r
   if (StopBits == DefaultStopBits) {\r
-    StopBits = (EFI_STOP_BITS_TYPE) FixedPcdGet8 (PcdUartDefaultStopBits);\r
+    StopBits = (EFI_STOP_BITS_TYPE) PcdGet8 (PcdUartDefaultStopBits);\r
   }\r
   //\r
   // 5 and 6 data bits can not be verified on a 16550A UART\r
@@ -1255,12 +1370,7 @@ IsaSerialSetAttributes (
   if ((StopBits < OneStopBit) || (StopBits > TwoStopBits)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
-  //\r
-  // for DataBits = 5, StopBits can not set TwoStopBits\r
-  //\r
-  // if ((DataBits == 5) && (StopBits == TwoStopBits)) {\r
-  //  return EFI_INVALID_PARAMETER;\r
-  // }\r
+\r
   //\r
   // for DataBits = 6,7,8, StopBits can not set OneFiveStopBits\r
   //\r
@@ -1276,11 +1386,11 @@ IsaSerialSetAttributes (
                        ((UINT32) BaudRate * 16),\r
                        &Remained\r
                        );\r
-  if (Remained) {\r
+  if (Remained != 0) {\r
     Divisor += 1;\r
   }\r
 \r
-  if ((Divisor == 0) || (Divisor & 0xffff0000)) {\r
+  if ((Divisor == 0) || ((Divisor & 0xffff0000) != 0)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -1295,7 +1405,7 @@ IsaSerialSetAttributes (
   // Put serial port on Divisor Latch Mode\r
   //\r
   Lcr.Data      = READ_LCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
-  Lcr.Bits.DLAB = 1;\r
+  Lcr.Bits.DLab = 1;\r
   WRITE_LCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Lcr.Data);\r
 \r
   //\r
@@ -1307,37 +1417,37 @@ IsaSerialSetAttributes (
   //\r
   // Put serial port back in normal mode and set remaining attributes.\r
   //\r
-  Lcr.Bits.DLAB = 0;\r
+  Lcr.Bits.DLab = 0;\r
 \r
   switch (Parity) {\r
   case NoParity:\r
-    Lcr.Bits.PAREN    = 0;\r
-    Lcr.Bits.EVENPAR  = 0;\r
-    Lcr.Bits.STICPAR  = 0;\r
+    Lcr.Bits.ParEn    = 0;\r
+    Lcr.Bits.EvenPar  = 0;\r
+    Lcr.Bits.SticPar  = 0;\r
     break;\r
 \r
   case EvenParity:\r
-    Lcr.Bits.PAREN    = 1;\r
-    Lcr.Bits.EVENPAR  = 1;\r
-    Lcr.Bits.STICPAR  = 0;\r
+    Lcr.Bits.ParEn    = 1;\r
+    Lcr.Bits.EvenPar  = 1;\r
+    Lcr.Bits.SticPar  = 0;\r
     break;\r
 \r
   case OddParity:\r
-    Lcr.Bits.PAREN    = 1;\r
-    Lcr.Bits.EVENPAR  = 0;\r
-    Lcr.Bits.STICPAR  = 0;\r
+    Lcr.Bits.ParEn    = 1;\r
+    Lcr.Bits.EvenPar  = 0;\r
+    Lcr.Bits.SticPar  = 0;\r
     break;\r
 \r
   case SpaceParity:\r
-    Lcr.Bits.PAREN    = 1;\r
-    Lcr.Bits.EVENPAR  = 1;\r
-    Lcr.Bits.STICPAR  = 1;\r
+    Lcr.Bits.ParEn    = 1;\r
+    Lcr.Bits.EvenPar  = 1;\r
+    Lcr.Bits.SticPar  = 1;\r
     break;\r
 \r
   case MarkParity:\r
-    Lcr.Bits.PAREN    = 1;\r
-    Lcr.Bits.EVENPAR  = 0;\r
-    Lcr.Bits.STICPAR  = 1;\r
+    Lcr.Bits.ParEn    = 1;\r
+    Lcr.Bits.EvenPar  = 0;\r
+    Lcr.Bits.SticPar  = 1;\r
     break;\r
 \r
   default:\r
@@ -1346,12 +1456,12 @@ IsaSerialSetAttributes (
 \r
   switch (StopBits) {\r
   case OneStopBit:\r
-    Lcr.Bits.STOPB = 0;\r
+    Lcr.Bits.StopB = 0;\r
     break;\r
 \r
   case OneFiveStopBits:\r
   case TwoStopBits:\r
-    Lcr.Bits.STOPB = 1;\r
+    Lcr.Bits.StopB = 1;\r
     break;\r
 \r
   default:\r
@@ -1360,7 +1470,7 @@ IsaSerialSetAttributes (
   //\r
   // DataBits\r
   //\r
-  Lcr.Bits.SERIALDB = (UINT8) ((DataBits - 5) & 0x03);\r
+  Lcr.Bits.SerialDB = (UINT8) ((DataBits - 5) & 0x03);\r
   WRITE_LCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Lcr.Data);\r
 \r
   //\r
@@ -1392,66 +1502,49 @@ IsaSerialSetAttributes (
   SerialDevice->UartDevicePath.Parity   = (UINT8) Parity;\r
   SerialDevice->UartDevicePath.StopBits = (UINT8) StopBits;\r
 \r
-  NewDevicePath = AppendDevicePathNode (\r
-                    SerialDevice->ParentDevicePath,\r
-                    (EFI_DEVICE_PATH_PROTOCOL *) &SerialDevice->UartDevicePath\r
-                    );\r
-  if (NewDevicePath == NULL) {\r
-    gBS->RestoreTPL (Tpl);\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-\r
+  Status = EFI_SUCCESS;\r
   if (SerialDevice->Handle != NULL) {\r
+    Uart = (UART_DEVICE_PATH *) (\r
+             (UINTN) SerialDevice->DevicePath\r
+             + GetDevicePathSize (SerialDevice->ParentDevicePath)\r
+             - END_DEVICE_PATH_LENGTH\r
+             );\r
+    CopyMem (Uart, &SerialDevice->UartDevicePath, sizeof (UART_DEVICE_PATH));\r
     Status = gBS->ReinstallProtocolInterface (\r
                     SerialDevice->Handle,\r
                     &gEfiDevicePathProtocolGuid,\r
                     SerialDevice->DevicePath,\r
-                    NewDevicePath\r
+                    SerialDevice->DevicePath\r
                     );\r
-    if (EFI_ERROR (Status)) {\r
-      gBS->RestoreTPL (Tpl);\r
-      return Status;\r
-    }\r
-  }\r
-\r
-  if (SerialDevice->DevicePath) {\r
-    gBS->FreePool (SerialDevice->DevicePath);\r
   }\r
 \r
-  SerialDevice->DevicePath = NewDevicePath;\r
-\r
   gBS->RestoreTPL (Tpl);\r
 \r
-  return EFI_SUCCESS;\r
+  return Status;\r
 }\r
 \r
+/**\r
+  Set Control Bits.\r
+\r
+  @param This              Pointer to EFI_SERIAL_IO_PROTOCOL\r
+  @param Control           Control bits that can be settable\r
+\r
+  @retval EFI_SUCCESS       New Control bits were set successfully\r
+  @retval EFI_UNSUPPORTED   The Control bits wanted to set are not supported\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 IsaSerialSetControl (\r
   IN EFI_SERIAL_IO_PROTOCOL  *This,\r
   IN UINT32                  Control\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Set Control Bits\r
-\r
-  Arguments:\r
-\r
-    This            - Pointer to EFI_SERIAL_IO_PROTOCOL\r
-    Control         - Control bits that can be settable\r
-\r
-  Returns:\r
-\r
-    EFI_SUCCESS     - New Control bits were set successfully\r
-    EFI_UNSUPPORTED - The Control bits wanted to set are not supported\r
-\r
---*/\r
 {\r
-  SERIAL_DEV      *SerialDevice;\r
-  SERIAL_PORT_MCR Mcr;\r
-  EFI_TPL         Tpl;\r
+  SERIAL_DEV                    *SerialDevice;\r
+  SERIAL_PORT_MCR               Mcr;\r
+  EFI_TPL                       Tpl;\r
+  UART_FLOW_CONTROL_DEVICE_PATH *FlowControl;\r
+  EFI_STATUS                    Status;\r
 \r
   //\r
   // The control bits that can be set are :\r
@@ -1459,74 +1552,93 @@ IsaSerialSetControl (
   //     EFI_SERIAL_REQUEST_TO_SEND: 0x0002  // WO\r
   //     EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE: 0x1000  // RW\r
   //     EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE: 0x2000  // RW\r
+  //     EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE: 0x4000 // RW\r
   //\r
   SerialDevice = SERIAL_DEV_FROM_THIS (This);\r
 \r
   //\r
   // first determine the parameter is invalid\r
   //\r
-  if (Control & 0xffff8ffc) {\r
+  if ((Control & (~(EFI_SERIAL_REQUEST_TO_SEND | EFI_SERIAL_DATA_TERMINAL_READY |\r
+                    EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE | EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE | \r
+                    EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE))) != 0) {\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
   Tpl = gBS->RaiseTPL (TPL_NOTIFY);\r
 \r
   Mcr.Data = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
-  Mcr.Bits.DTRC = 0;\r
-  Mcr.Bits.RTS = 0;\r
-  Mcr.Bits.LME = 0;\r
+  Mcr.Bits.DtrC = 0;\r
+  Mcr.Bits.Rts = 0;\r
+  Mcr.Bits.Lme = 0;\r
   SerialDevice->SoftwareLoopbackEnable = FALSE;\r
   SerialDevice->HardwareFlowControl = FALSE;\r
 \r
-  if (Control & EFI_SERIAL_DATA_TERMINAL_READY) {\r
-    Mcr.Bits.DTRC = 1;\r
+  if ((Control & EFI_SERIAL_DATA_TERMINAL_READY) == EFI_SERIAL_DATA_TERMINAL_READY) {\r
+    Mcr.Bits.DtrC = 1;\r
   }\r
 \r
-  if (Control & EFI_SERIAL_REQUEST_TO_SEND) {\r
-    Mcr.Bits.RTS = 1;\r
+  if ((Control & EFI_SERIAL_REQUEST_TO_SEND) == EFI_SERIAL_REQUEST_TO_SEND) {\r
+    Mcr.Bits.Rts = 1;\r
   }\r
 \r
-  if (Control & EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE) {\r
-    Mcr.Bits.LME = 1;\r
+  if ((Control & EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE) == EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE) {\r
+    Mcr.Bits.Lme = 1;\r
   }\r
 \r
-  if (Control & EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) {\r
+  if ((Control & EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) == EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) {\r
     SerialDevice->HardwareFlowControl = TRUE;\r
   }\r
 \r
   WRITE_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Mcr.Data);\r
 \r
-  if (Control & EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE) {\r
+  if ((Control & EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE) == EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE) {\r
     SerialDevice->SoftwareLoopbackEnable = TRUE;\r
   }\r
 \r
+  Status = EFI_SUCCESS;\r
+  if (SerialDevice->Handle != NULL) {\r
+    FlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) (\r
+                    (UINTN) SerialDevice->DevicePath\r
+                    + GetDevicePathSize (SerialDevice->ParentDevicePath)\r
+                    - END_DEVICE_PATH_LENGTH\r
+                    + sizeof (UART_DEVICE_PATH)\r
+                    );\r
+    if (IsUartFlowControlNode (FlowControl) &&\r
+        ((ReadUnaligned32 (&FlowControl->FlowControlMap) == UART_FLOW_CONTROL_HARDWARE) ^ SerialDevice->HardwareFlowControl)) {\r
+      //\r
+      // Flow Control setting is changed, need to reinstall device path protocol\r
+      //\r
+      WriteUnaligned32 (&FlowControl->FlowControlMap, SerialDevice->HardwareFlowControl ? UART_FLOW_CONTROL_HARDWARE : 0);\r
+      Status = gBS->ReinstallProtocolInterface (\r
+                      SerialDevice->Handle,\r
+                      &gEfiDevicePathProtocolGuid,\r
+                      SerialDevice->DevicePath,\r
+                      SerialDevice->DevicePath\r
+                      );\r
+    }\r
+  }\r
+\r
   gBS->RestoreTPL (Tpl);\r
 \r
-  return EFI_SUCCESS;\r
+  return Status;\r
 }\r
 \r
+/**\r
+  Get ControlBits.\r
+\r
+  @param This          Pointer to EFI_SERIAL_IO_PROTOCOL\r
+  @param Control       Control signals of the serial device\r
+\r
+  @retval EFI_SUCCESS   Get Control signals successfully\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 IsaSerialGetControl (\r
   IN EFI_SERIAL_IO_PROTOCOL  *This,\r
   OUT UINT32                 *Control\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Get ControlBits\r
-\r
-  Arguments:\r
-\r
-    This        - Pointer to EFI_SERIAL_IO_PROTOCOL\r
-    Control     - Control signals of the serial device\r
-\r
-  Returns:\r
-\r
-    EFI_SUCCESS - Get Control signals successfully\r
-\r
---*/\r
 {\r
   SERIAL_DEV      *SerialDevice;\r
   SERIAL_PORT_MSR Msr;\r
@@ -1544,19 +1656,19 @@ IsaSerialGetControl (
   //\r
   Msr.Data = READ_MSR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
 \r
-  if (Msr.Bits.CTS) {\r
+  if (Msr.Bits.Cts == 1) {\r
     *Control |= EFI_SERIAL_CLEAR_TO_SEND;\r
   }\r
 \r
-  if (Msr.Bits.DSR) {\r
+  if (Msr.Bits.Dsr == 1) {\r
     *Control |= EFI_SERIAL_DATA_SET_READY;\r
   }\r
 \r
-  if (Msr.Bits.RI) {\r
+  if (Msr.Bits.Ri == 1) {\r
     *Control |= EFI_SERIAL_RING_INDICATE;\r
   }\r
 \r
-  if (Msr.Bits.DCD) {\r
+  if (Msr.Bits.Dcd == 1) {\r
     *Control |= EFI_SERIAL_CARRIER_DETECT;\r
   }\r
   //\r
@@ -1564,15 +1676,15 @@ IsaSerialGetControl (
   //\r
   Mcr.Data = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
 \r
-  if (Mcr.Bits.DTRC) {\r
+  if (Mcr.Bits.DtrC == 1) {\r
     *Control |= EFI_SERIAL_DATA_TERMINAL_READY;\r
   }\r
 \r
-  if (Mcr.Bits.RTS) {\r
+  if (Mcr.Bits.Rts == 1) {\r
     *Control |= EFI_SERIAL_REQUEST_TO_SEND;\r
   }\r
 \r
-  if (Mcr.Bits.LME) {\r
+  if (Mcr.Bits.Lme == 1) {\r
     *Control |= EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE;\r
   }\r
 \r
@@ -1605,6 +1717,19 @@ IsaSerialGetControl (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Write the specified number of bytes to serial device.\r
+\r
+  @param This               Pointer to EFI_SERIAL_IO_PROTOCOL\r
+  @param  BufferSize         On input the size of Buffer, on output the amount of\r
+                       data actually written\r
+  @param  Buffer             The buffer of data to write\r
+\r
+  @retval EFI_SUCCESS        The data were written successfully\r
+  @retval EFI_DEVICE_ERROR   The device reported an error\r
+  @retval EFI_TIMEOUT        The write operation was stopped due to timeout\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 IsaSerialWrite (\r
@@ -1612,26 +1737,6 @@ IsaSerialWrite (
   IN OUT UINTN               *BufferSize,\r
   IN VOID                    *Buffer\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Write the specified number of bytes to serial device\r
-\r
-  Arguments:\r
-\r
-    This             - Pointer to EFI_SERIAL_IO_PROTOCOL\r
-    BufferSize       - On input the size of Buffer, on output the amount of\r
-                       data actually written\r
-    Buffer           - The buffer of data to write\r
-\r
-  Returns:\r
-\r
-    EFI_SUCCESS      - The data were written successfully\r
-    EFI_DEVICE_ERROR - The device reported an error\r
-    EFI_TIMEOUT      - The write operation was stopped due to timeout\r
-\r
---*/\r
 {\r
   SERIAL_DEV  *SerialDevice;\r
   UINT8       *CharBuffer;\r
@@ -1648,7 +1753,7 @@ IsaSerialWrite (
     return EFI_SUCCESS;\r
   }\r
 \r
-  if (!Buffer) {\r
+  if (Buffer == NULL) {\r
     REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
       EFI_ERROR_CODE,\r
       EFI_P_EC_OUTPUT_ERROR | EFI_PERIPHERAL_SERIAL_PORT,\r
@@ -1693,6 +1798,19 @@ IsaSerialWrite (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Read the specified number of bytes from serial device.\r
+\r
+  @param This               Pointer to EFI_SERIAL_IO_PROTOCOL\r
+  @param BufferSize         On input the size of Buffer, on output the amount of\r
+                            data returned in buffer\r
+  @param Buffer             The buffer to return the data into\r
+\r
+  @retval EFI_SUCCESS        The data were read successfully\r
+  @retval EFI_DEVICE_ERROR   The device reported an error\r
+  @retval EFI_TIMEOUT        The read operation was stopped due to timeout\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 IsaSerialRead (\r
@@ -1700,26 +1818,6 @@ IsaSerialRead (
   IN OUT UINTN               *BufferSize,\r
   OUT VOID                   *Buffer\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Read the specified number of bytes from serial device\r
-\r
-  Arguments:\r
-\r
-    This             - Pointer to EFI_SERIAL_IO_PROTOCOL\r
-    BufferSize       - On input the size of Buffer, on output the amount of\r
-                       data returned in buffer\r
-    Buffer           -  The buffer to return the data into\r
-\r
-  Returns:\r
-\r
-    EFI_SUCCESS      - The data were read successfully\r
-    EFI_DEVICE_ERROR - The device reported an error\r
-    EFI_TIMEOUT      - The read operation was stopped due to timeout\r
-\r
---*/\r
 {\r
   SERIAL_DEV  *SerialDevice;\r
   UINT32      Index;\r
@@ -1735,7 +1833,7 @@ IsaSerialRead (
     return EFI_SUCCESS;\r
   }\r
 \r
-  if (!Buffer) {\r
+  if (Buffer == NULL) {\r
     return EFI_DEVICE_ERROR;\r
   }\r
 \r
@@ -1794,26 +1892,18 @@ IsaSerialRead (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Use scratchpad register to test if this serial port is present.\r
+\r
+  @param SerialDevice   Pointer to serial device structure\r
+\r
+  @return if this serial port is present\r
+**/\r
 BOOLEAN\r
 IsaSerialPortPresent (\r
   IN SERIAL_DEV *SerialDevice\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Use scratchpad register to test if this serial port is present\r
-\r
-  Arguments:\r
-\r
-    SerialDevice - Pointer to serial device structure\r
-\r
-  Returns:\r
 \r
-    TRUE         - The serial port is present\r
-    FALSE        - The serial port is NOT present\r
-\r
---*/\r
 {\r
   UINT8   Temp;\r
   BOOLEAN Status;\r
@@ -1827,17 +1917,13 @@ IsaSerialPortPresent (
   WRITE_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, 0xAA);\r
 \r
   if (READ_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress) != 0xAA) {\r
-    if (!FeaturePcdGet (PcdNtEmulatorEnable)) {\r
-      Status = FALSE;\r
-    }\r
+    Status = FALSE;\r
   }\r
 \r
   WRITE_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, 0x55);\r
 \r
   if (READ_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress) != 0x55) {\r
-    if (!FeaturePcdGet (PcdNtEmulatorEnable)) {\r
-      Status = FALSE;\r
-    }\r
+    Status = FALSE;\r
   }\r
   //\r
   // Restore SCR\r
@@ -1846,29 +1932,22 @@ IsaSerialPortPresent (
   return Status;\r
 }\r
 \r
+/**\r
+  Use IsaIo protocol to read serial port.\r
+\r
+  @param IsaIo         Pointer to EFI_ISA_IO_PROTOCOL instance\r
+  @param BaseAddress   Serial port register group base address\r
+  @param Offset        Offset in register group\r
+\r
+  @return Data read from serial port\r
+\r
+**/\r
 UINT8\r
 IsaSerialReadPort (\r
   IN EFI_ISA_IO_PROTOCOL                   *IsaIo,\r
   IN UINT16                                BaseAddress,\r
   IN UINT32                                Offset\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Use IsaIo protocol to read serial port\r
-\r
-  Arguments:\r
-\r
-    IsaIo       - Pointer to EFI_ISA_IO_PROTOCOL instance\r
-    BaseAddress - Serial port register group base address\r
-    Offset      - Offset in register group\r
-\r
-  Returns:\r
-\r
-    Data read from serial port\r
-\r
---*/\r
 {\r
   UINT8 Data;\r
 \r
@@ -1885,6 +1964,15 @@ IsaSerialReadPort (
   return Data;\r
 }\r
 \r
+/**\r
+  Use IsaIo protocol to write serial port.\r
+\r
+  @param  IsaIo         Pointer to EFI_ISA_IO_PROTOCOL instance\r
+  @param  BaseAddress   Serial port register group base address\r
+  @param  Offset        Offset in register group\r
+  @param  Data          data which is to be written to some serial port register\r
+\r
+**/\r
 VOID\r
 IsaSerialWritePort (\r
   IN EFI_ISA_IO_PROTOCOL                 *IsaIo,\r
@@ -1892,24 +1980,6 @@ IsaSerialWritePort (
   IN UINT32                              Offset,\r
   IN UINT8                               Data\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Use IsaIo protocol to write serial port\r
-\r
-  Arguments:\r
-\r
-    IsaIo       - Pointer to EFI_ISA_IO_PROTOCOL instance\r
-    BaseAddress - Serial port register group base address\r
-    Offset      - Offset in register group\r
-    Data        - data which is to be written to some serial port register\r
-\r
-  Returns:\r
-\r
-    None\r
-\r
---*/\r
 {\r
   //\r
   // Use IsaIo to access IO\r