]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SerialDxe/SerialIo.c
MdeModulePkg/SerialDxe: Fix return valued in SerialSetAttributes
[mirror_edk2.git] / MdeModulePkg / Universal / SerialDxe / SerialIo.c
index ebcd92726314a83935c56c266bd694314c56ddec..ee10ec7e05eadcb1a5ffc2fc3bd8d0a8d678851e 100644 (file)
@@ -66,8 +66,9 @@ SerialReset (
                            value of DefaultStopBits will use the device's default number of\r
                            stop bits.\r
 \r
-  @retval EFI_SUCCESS      The device was reset.\r
-  @retval EFI_DEVICE_ERROR The serial device could not be reset.\r
+  @retval EFI_SUCCESS           The device was reset.\r
+  @retval EFI_INVALID_PARAMETER One or more attributes has an unsupported value.\r
+  @retval EFI_DEVICE_ERROR      The serial device is not functioning correctly.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -264,8 +265,9 @@ SerialReset (
                            value of DefaultStopBits will use the device's default number of\r
                            stop bits.\r
 \r
-  @retval EFI_SUCCESS      The device was reset.\r
-  @retval EFI_DEVICE_ERROR The serial device could not be reset.\r
+  @retval EFI_SUCCESS           The device was reset.\r
+  @retval EFI_INVALID_PARAMETER One or more attributes has an unsupported value.\r
+  @retval EFI_DEVICE_ERROR      The serial device is not functioning correctly.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -280,12 +282,54 @@ SerialSetAttributes (
   IN EFI_STOP_BITS_TYPE     StopBits\r
   )\r
 {\r
-  EFI_STATUS    Status;\r
-  EFI_TPL       Tpl;\r
+  EFI_STATUS                Status;\r
+  EFI_TPL                   Tpl;\r
+  UINT64                    OriginalBaudRate;\r
+  UINT32                    OriginalReceiveFifoDepth;\r
+  UINT32                    OriginalTimeout;\r
+  EFI_PARITY_TYPE           OriginalParity;\r
+  UINT8                     OriginalDataBits;\r
+  EFI_STOP_BITS_TYPE        OriginalStopBits;\r
 \r
+  //\r
+  // Preserve the original input values in case\r
+  // SerialPortSetAttributes() updates the input/output\r
+  // parameters even on error.\r
+  //\r
+  OriginalBaudRate = BaudRate;\r
+  OriginalReceiveFifoDepth = ReceiveFifoDepth;\r
+  OriginalTimeout = Timeout;\r
+  OriginalParity = Parity;\r
+  OriginalDataBits = DataBits;\r
+  OriginalStopBits = StopBits;\r
   Status = SerialPortSetAttributes (&BaudRate, &ReceiveFifoDepth, &Timeout, &Parity, &DataBits, &StopBits);\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    //\r
+    // If it is just to set Timeout value and unsupported is returned,\r
+    // do not return error.\r
+    //\r
+    if ((Status == EFI_UNSUPPORTED) &&\r
+        (This->Mode->Timeout          != OriginalTimeout) &&\r
+        (This->Mode->ReceiveFifoDepth == OriginalReceiveFifoDepth) &&\r
+        (This->Mode->BaudRate         == OriginalBaudRate) &&\r
+        (This->Mode->DataBits         == (UINT32) OriginalDataBits) &&\r
+        (This->Mode->Parity           == (UINT32) OriginalParity) &&\r
+        (This->Mode->StopBits         == (UINT32) OriginalStopBits)) {\r
+      //\r
+      // Restore to the original input values.\r
+      //\r
+      BaudRate = OriginalBaudRate;\r
+      ReceiveFifoDepth = OriginalReceiveFifoDepth;\r
+      Timeout = OriginalTimeout;\r
+      Parity = OriginalParity;\r
+      DataBits = OriginalDataBits;\r
+      StopBits = OriginalStopBits;\r
+      Status = EFI_SUCCESS;\r
+    } else if (Status == EFI_INVALID_PARAMETER || Status == EFI_UNSUPPORTED) {\r
+      return EFI_INVALID_PARAMETER;\r
+    } else {\r
+      return EFI_DEVICE_ERROR;\r
+    }\r
   }\r
 \r
   //\r