diff options
Diffstat (limited to 'riscv/ns16550.cc')
-rw-r--r-- | riscv/ns16550.cc | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/riscv/ns16550.cc b/riscv/ns16550.cc index 7bc1d20..8d7e4de 100644 --- a/riscv/ns16550.cc +++ b/riscv/ns16550.cc @@ -71,7 +71,7 @@ ns16550_t::ns16550_t(class bus_t *bus, abstract_interrupt_controller_t *intctrl, uint32_t interrupt_id, uint32_t reg_shift, uint32_t reg_io_width) - : bus(bus), intctrl(intctrl), interrupt_id(interrupt_id), reg_shift(reg_shift), reg_io_width(reg_io_width) + : bus(bus), intctrl(intctrl), interrupt_id(interrupt_id), reg_shift(reg_shift), reg_io_width(reg_io_width), backoff_counter(0) { ier = 0; iir = UART_IIR_NO_INT; @@ -300,11 +300,19 @@ void ns16550_t::tick(void) return; } + if (backoff_counter > 0 && backoff_counter < MAX_BACKOFF) { + backoff_counter++; + return; + } + int rc = canonical_terminal_t::read(); if (rc < 0) { + backoff_counter = 1; return; } + backoff_counter = 0; + rx_queue.push((uint8_t)rc); lsr |= UART_LSR_DR; update_interrupt(); |