- //\r
- // If the SerialIo instance specified by RemainingDevicePath is already created,\r
- // update the attributes/control.\r
- //\r
- if ((SerialDeviceCount != 0) && (RemainingDevicePath != NULL)) {\r
- Uart = (UART_DEVICE_PATH *) SkipControllerDevicePathNode (RemainingDevicePath, &ContainsControllerNode, &ControllerNumber);\r
- for (Index = 0; Index < SerialDeviceCount; Index++) {\r
- ASSERT ((SerialDevices != NULL) && (SerialDevices[Index] != NULL));\r
- if ((!SerialDevices[Index]->ContainsControllerNode && !ContainsControllerNode) ||\r
- (SerialDevices[Index]->ContainsControllerNode && ContainsControllerNode && SerialDevices[Index]->Instance == ControllerNumber)\r
- ) {\r
- SerialIo = &SerialDevices[Index]->SerialIo;\r
- Status = EFI_INVALID_PARAMETER;\r
- //\r
- // Pass NULL ActualBaudRate to VerifyUartParameters to disallow baudrate degrade.\r
- // DriverBindingStart() shouldn't create a handle with different UART device path.\r
- //\r
- if (VerifyUartParameters (SerialDevices[Index]->ClockRate, Uart->BaudRate, Uart->DataBits,\r
- (EFI_PARITY_TYPE) Uart->Parity, (EFI_STOP_BITS_TYPE) Uart->StopBits, NULL, NULL)) {\r
- Status = SerialIo->SetAttributes (\r
- SerialIo,\r
- Uart->BaudRate,\r
- SerialIo->Mode->ReceiveFifoDepth,\r
- SerialIo->Mode->Timeout,\r
- (EFI_PARITY_TYPE) Uart->Parity,\r
- Uart->DataBits,\r
- (EFI_STOP_BITS_TYPE) Uart->StopBits\r
- );\r
- }\r
- FlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (Uart);\r
- if (!EFI_ERROR (Status) && IsUartFlowControlDevicePathNode (FlowControl)) {\r
- Status = SerialIo->GetControl (SerialIo, &Control);\r
- if (!EFI_ERROR (Status)) {\r
- if (ReadUnaligned32 (&FlowControl->FlowControlMap) == UART_FLOW_CONTROL_HARDWARE) {\r
- Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;\r
- } else {\r
- Control &= ~EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;\r
+\r
+ if (SerialDeviceCount != 0) {\r
+ if (RemainingDevicePath == NULL) {\r
+ //\r
+ // If the SerialIo instance is already created, NULL as RemainingDevicePath is treated\r
+ // as to create the same SerialIo instance.\r
+ //\r
+ return EFI_SUCCESS;\r
+ } else {\r
+ //\r
+ // Update the attributes/control of the SerialIo instance specified by RemainingDevicePath.\r
+ //\r
+ Uart = (UART_DEVICE_PATH *) SkipControllerDevicePathNode (RemainingDevicePath, &ContainsControllerNode, &ControllerNumber);\r
+ for (Index = 0; Index < SerialDeviceCount; Index++) {\r
+ ASSERT ((SerialDevices != NULL) && (SerialDevices[Index] != NULL));\r
+ if ((!SerialDevices[Index]->ContainsControllerNode && !ContainsControllerNode) ||\r
+ (SerialDevices[Index]->ContainsControllerNode && ContainsControllerNode && SerialDevices[Index]->Instance == ControllerNumber)\r
+ ) {\r
+ SerialIo = &SerialDevices[Index]->SerialIo;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ //\r
+ // Pass NULL ActualBaudRate to VerifyUartParameters to disallow baudrate degrade.\r
+ // DriverBindingStart() shouldn't create a handle with different UART device path.\r
+ //\r
+ if (VerifyUartParameters (SerialDevices[Index]->ClockRate, Uart->BaudRate, Uart->DataBits,\r
+ (EFI_PARITY_TYPE) Uart->Parity, (EFI_STOP_BITS_TYPE) Uart->StopBits, NULL, NULL)) {\r
+ Status = SerialIo->SetAttributes (\r
+ SerialIo,\r
+ Uart->BaudRate,\r
+ SerialIo->Mode->ReceiveFifoDepth,\r
+ SerialIo->Mode->Timeout,\r
+ (EFI_PARITY_TYPE) Uart->Parity,\r
+ Uart->DataBits,\r
+ (EFI_STOP_BITS_TYPE) Uart->StopBits\r
+ );\r
+ }\r
+ FlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (Uart);\r
+ if (!EFI_ERROR (Status) && IsUartFlowControlDevicePathNode (FlowControl)) {\r
+ Status = SerialIo->GetControl (SerialIo, &Control);\r
+ if (!EFI_ERROR (Status)) {\r
+ if (ReadUnaligned32 (&FlowControl->FlowControlMap) == UART_FLOW_CONTROL_HARDWARE) {\r
+ Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;\r
+ } else {\r
+ Control &= ~EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;\r
+ }\r
+ //\r
+ // Clear the bits that are not allowed to pass to SetControl\r
+ //\r
+ Control &= (EFI_SERIAL_REQUEST_TO_SEND | EFI_SERIAL_DATA_TERMINAL_READY |\r
+ EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE | EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE |\r
+ EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE);\r
+ Status = SerialIo->SetControl (SerialIo, Control);\r