X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FSerialDxe%2FSerialIo.c;h=ee10ec7e05eadcb1a5ffc2fc3bd8d0a8d678851e;hb=13d378fc82d4c10eff48bec383cd679cec6c4fdb;hp=ebcd92726314a83935c56c266bd694314c56ddec;hpb=91cc526b15ffbbbdec5a57906596f37e059f80be;p=mirror_edk2.git diff --git a/MdeModulePkg/Universal/SerialDxe/SerialIo.c b/MdeModulePkg/Universal/SerialDxe/SerialIo.c index ebcd927263..ee10ec7e05 100644 --- a/MdeModulePkg/Universal/SerialDxe/SerialIo.c +++ b/MdeModulePkg/Universal/SerialDxe/SerialIo.c @@ -66,8 +66,9 @@ SerialReset ( value of DefaultStopBits will use the device's default number of stop bits. - @retval EFI_SUCCESS The device was reset. - @retval EFI_DEVICE_ERROR The serial device could not be reset. + @retval EFI_SUCCESS The device was reset. + @retval EFI_INVALID_PARAMETER One or more attributes has an unsupported value. + @retval EFI_DEVICE_ERROR The serial device is not functioning correctly. **/ EFI_STATUS @@ -264,8 +265,9 @@ SerialReset ( value of DefaultStopBits will use the device's default number of stop bits. - @retval EFI_SUCCESS The device was reset. - @retval EFI_DEVICE_ERROR The serial device could not be reset. + @retval EFI_SUCCESS The device was reset. + @retval EFI_INVALID_PARAMETER One or more attributes has an unsupported value. + @retval EFI_DEVICE_ERROR The serial device is not functioning correctly. **/ EFI_STATUS @@ -280,12 +282,54 @@ SerialSetAttributes ( IN EFI_STOP_BITS_TYPE StopBits ) { - EFI_STATUS Status; - EFI_TPL Tpl; + EFI_STATUS Status; + EFI_TPL Tpl; + UINT64 OriginalBaudRate; + UINT32 OriginalReceiveFifoDepth; + UINT32 OriginalTimeout; + EFI_PARITY_TYPE OriginalParity; + UINT8 OriginalDataBits; + EFI_STOP_BITS_TYPE OriginalStopBits; + // + // Preserve the original input values in case + // SerialPortSetAttributes() updates the input/output + // parameters even on error. + // + OriginalBaudRate = BaudRate; + OriginalReceiveFifoDepth = ReceiveFifoDepth; + OriginalTimeout = Timeout; + OriginalParity = Parity; + OriginalDataBits = DataBits; + OriginalStopBits = StopBits; Status = SerialPortSetAttributes (&BaudRate, &ReceiveFifoDepth, &Timeout, &Parity, &DataBits, &StopBits); if (EFI_ERROR (Status)) { - return Status; + // + // If it is just to set Timeout value and unsupported is returned, + // do not return error. + // + if ((Status == EFI_UNSUPPORTED) && + (This->Mode->Timeout != OriginalTimeout) && + (This->Mode->ReceiveFifoDepth == OriginalReceiveFifoDepth) && + (This->Mode->BaudRate == OriginalBaudRate) && + (This->Mode->DataBits == (UINT32) OriginalDataBits) && + (This->Mode->Parity == (UINT32) OriginalParity) && + (This->Mode->StopBits == (UINT32) OriginalStopBits)) { + // + // Restore to the original input values. + // + BaudRate = OriginalBaudRate; + ReceiveFifoDepth = OriginalReceiveFifoDepth; + Timeout = OriginalTimeout; + Parity = OriginalParity; + DataBits = OriginalDataBits; + StopBits = OriginalStopBits; + Status = EFI_SUCCESS; + } else if (Status == EFI_INVALID_PARAMETER || Status == EFI_UNSUPPORTED) { + return EFI_INVALID_PARAMETER; + } else { + return EFI_DEVICE_ERROR; + } } //