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