]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SerialDxe/SerialIo.c
MdeModulePkg SerialDxe: Handle Timeout change more robustly
[mirror_edk2.git] / MdeModulePkg / Universal / SerialDxe / SerialIo.c
index ebcd92726314a83935c56c266bd694314c56ddec..964d0329f4fbcc3f90992ef9f49fb167ec2d6d65 100644 (file)
@@ -280,12 +280,52 @@ 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 {\r
+      return Status;\r
+    }\r
   }\r
 \r
   //\r