If baud_divisor is not set (i.e. == -1), we should use the baud divisor
already in use for flushing the xmit register. If we don't flush the
xmit register, then SPL will hang.

Signed-off-by: Patrik Dahlström <ri...@dalakolonin.se>
---
 drivers/serial/ns16550.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c
index 754b6e9921..d9da7f799c 100644
--- a/drivers/serial/ns16550.c
+++ b/drivers/serial/ns16550.c
@@ -170,6 +170,13 @@ void NS16550_init(NS16550_t com_port, int baud_divisor)
             == UART_LSR_THRE) {
                if (baud_divisor != -1)
                        NS16550_setbrg(com_port, baud_divisor);
+               else {
+                       // Re-use old baud rate divisor to flush transmit reg.
+                       const int dll = serial_in(&com_port->dll);
+                       const int dlm = serial_in(&com_port->dlm);
+                       const int divisor = dll | (dlm << 8);
+                       NS16550_setbrg(com_port, divisor);
+               }
                serial_out(0, &com_port->mdr1);
        }
 #endif
-- 
2.17.1

Reply via email to