mirror of https://github.com/acidanthera/audk.git
MdeModulePkg/SerialDxe: Fix not able to change serial attributes
Issue : When try to change serial attributes using sermode command, the default values are set with the execute flow as below. The sermode command calls SerialSetAttributes, which sets H/W attributes of Serial device. After that the SerialIo protocol is reinstalled, which causes MdeModulePkg/Universal/Console/TerminalDxe and MdeModulePkg/Universal/Console/ConPlatformDxe drivers' bindings to stop and then start. This in turn calls SerialReset, which undoes changes of SerialSetAttributes. Cause : The SerialReset command resets the attributes' values to default. Fix : Serial Reset command should set the attributes which have been changed by user after calling SerialSetAttributes. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Pankaj Bansal <pankaj.bansal@nxp.com> Regression-tested-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Star Zeng <star.zeng@intel.com>
This commit is contained in:
parent
7f2f96f1a8
commit
91cc526b15
|
@ -220,7 +220,6 @@ SerialReset (
|
|||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL Tpl;
|
||||
|
||||
Status = SerialPortInitialize ();
|
||||
if (EFI_ERROR (Status)) {
|
||||
|
@ -228,50 +227,18 @@ SerialReset (
|
|||
}
|
||||
|
||||
//
|
||||
// Set the Serial I/O mode and update the device path
|
||||
// Go set the current attributes
|
||||
//
|
||||
|
||||
Tpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
|
||||
//
|
||||
// Set the Serial I/O mode
|
||||
//
|
||||
This->Mode->ReceiveFifoDepth = PcdGet16 (PcdUartDefaultReceiveFifoDepth);
|
||||
This->Mode->Timeout = 1000 * 1000;
|
||||
This->Mode->BaudRate = PcdGet64 (PcdUartDefaultBaudRate);
|
||||
This->Mode->DataBits = (UINT32) PcdGet8 (PcdUartDefaultDataBits);
|
||||
This->Mode->Parity = (UINT32) PcdGet8 (PcdUartDefaultParity);
|
||||
This->Mode->StopBits = (UINT32) PcdGet8 (PcdUartDefaultStopBits);
|
||||
|
||||
//
|
||||
// Check if the device path has actually changed
|
||||
//
|
||||
if (mSerialDevicePath.Uart.BaudRate == This->Mode->BaudRate &&
|
||||
mSerialDevicePath.Uart.DataBits == (UINT8) This->Mode->DataBits &&
|
||||
mSerialDevicePath.Uart.Parity == (UINT8) This->Mode->Parity &&
|
||||
mSerialDevicePath.Uart.StopBits == (UINT8) This->Mode->StopBits
|
||||
) {
|
||||
gBS->RestoreTPL (Tpl);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
//
|
||||
// Update the device path
|
||||
//
|
||||
mSerialDevicePath.Uart.BaudRate = This->Mode->BaudRate;
|
||||
mSerialDevicePath.Uart.DataBits = (UINT8) This->Mode->DataBits;
|
||||
mSerialDevicePath.Uart.Parity = (UINT8) This->Mode->Parity;
|
||||
mSerialDevicePath.Uart.StopBits = (UINT8) This->Mode->StopBits;
|
||||
|
||||
Status = gBS->ReinstallProtocolInterface (
|
||||
mSerialHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
&mSerialDevicePath,
|
||||
&mSerialDevicePath
|
||||
Status = This->SetAttributes (
|
||||
This,
|
||||
This->Mode->BaudRate,
|
||||
This->Mode->ReceiveFifoDepth,
|
||||
This->Mode->Timeout,
|
||||
(EFI_PARITY_TYPE) This->Mode->Parity,
|
||||
(UINT8) This->Mode->DataBits,
|
||||
(EFI_STOP_BITS_TYPE) This->Mode->StopBits
|
||||
);
|
||||
|
||||
gBS->RestoreTPL (Tpl);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -513,11 +480,6 @@ SerialDxeInitialize (
|
|||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = SerialPortInitialize ();
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
mSerialIoMode.BaudRate = PcdGet64 (PcdUartDefaultBaudRate);
|
||||
mSerialIoMode.DataBits = (UINT32) PcdGet8 (PcdUartDefaultDataBits);
|
||||
mSerialIoMode.Parity = (UINT32) PcdGet8 (PcdUartDefaultParity);
|
||||
|
@ -528,6 +490,14 @@ SerialDxeInitialize (
|
|||
mSerialDevicePath.Uart.Parity = PcdGet8 (PcdUartDefaultParity);
|
||||
mSerialDevicePath.Uart.StopBits = PcdGet8 (PcdUartDefaultStopBits);
|
||||
|
||||
//
|
||||
// Issue a reset to initialize the Serial Port
|
||||
//
|
||||
Status = mSerialIoTemplate.Reset (&mSerialIoTemplate);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Make a new handle with Serial IO protocol and its device path on it.
|
||||
//
|
||||
|
|
Loading…
Reference in New Issue