aboutsummaryrefslogtreecommitdiff
path: root/riscv/ns16550.cc
diff options
context:
space:
mode:
Diffstat (limited to 'riscv/ns16550.cc')
-rw-r--r--riscv/ns16550.cc10
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();