diff --git a/MdeModulePkg/Universal/SerialDxe/SerialIo.c b/MdeModulePkg/Universal/SerialDxe/SerialIo.c index d2383e56dd..43d33dba0c 100644 --- a/MdeModulePkg/Universal/SerialDxe/SerialIo.c +++ b/MdeModulePkg/Universal/SerialDxe/SerialIo.c @@ -465,11 +465,25 @@ SerialRead ( ) { UINTN Count; + UINTN TimeOut; Count = 0; - if (SerialPortPoll ()) { - Count = SerialPortRead (Buffer, *BufferSize); + while (Count < *BufferSize) { + TimeOut = 0; + while (TimeOut < mSerialIoMode.Timeout) { + if (SerialPortPoll ()) { + break; + } + gBS->Stall (10); + TimeOut += 10; + } + if (TimeOut >= mSerialIoMode.Timeout) { + break; + } + SerialPortRead (Buffer, 1); + Count++; + Buffer = (VOID *) ((UINT8 *) Buffer + 1); } if (Count != *BufferSize) {