[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v1 08/11] char/cadence_uart: Fix can_receive logic
From: |
Peter Crosthwaite |
Subject: |
[Qemu-devel] [PATCH v1 08/11] char/cadence_uart: Fix can_receive logic |
Date: |
Mon, 16 Dec 2013 17:44:28 -0800 |
The can_receive logic was only taking into account the RxFIFO
occupancy. RxFIFO population is only used for the echo and normal modes
however. Improve the logic to correctly return the true number of
receivable characters based on the current mode:
Normal mode: RxFIFO vacancy.
Remote loopback: TxFIFO vacancy.
Echo mode: The min of the TxFIFO and RxFIFO vacancies.
Local Loopback: Return non-zero (to implement droppage)
Signed-off-by: Peter Crosthwaite <address@hidden>
---
hw/char/cadence_uart.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/hw/char/cadence_uart.c b/hw/char/cadence_uart.c
index f28e503..85e9a00 100644
--- a/hw/char/cadence_uart.c
+++ b/hw/char/cadence_uart.c
@@ -233,8 +233,16 @@ static void uart_parameters_setup(UartState *s)
static int uart_can_receive(void *opaque)
{
UartState *s = (UartState *)opaque;
+ int ret = MAX(RX_FIFO_SIZE, TX_FIFO_SIZE);
+ uint32_t ch_mode = s->r[R_MR] & UART_MR_CHMODE;
- return RX_FIFO_SIZE - s->rx_count;
+ if (ch_mode == NORMAL_MODE || ch_mode == ECHO_MODE) {
+ ret = MIN(ret, RX_FIFO_SIZE - s->rx_count);
+ }
+ if (ch_mode == REMOTE_LOOPBACK || ch_mode == ECHO_MODE) {
+ ret = MIN(ret, TX_FIFO_SIZE - s->tx_count);
+ }
+ return ret;
}
static void uart_ctrl_update(UartState *s)
--
1.8.5.1
- [Qemu-devel] [PATCH v1 00/11] Cadence UART cleanups and Tx path fixes, Peter Crosthwaite, 2013/12/16
- [Qemu-devel] [PATCH v1 01/11] char/cadence_uart: Mark struct fields as public/private, Peter Crosthwaite, 2013/12/16
- [Qemu-devel] [PATCH v1 02/11] char/cadence_uart: Add missing uart_update_state, Peter Crosthwaite, 2013/12/16
- [Qemu-devel] [PATCH v1 03/11] char/cadence_uart: Fix reset., Peter Crosthwaite, 2013/12/16
- [Qemu-devel] [PATCH v1 04/11] char/cadence_uart: s/r_fifo/rx_fifo, Peter Crosthwaite, 2013/12/16
- [Qemu-devel] [PATCH v1 05/11] char/cadence_uart: Simplify status generation, Peter Crosthwaite, 2013/12/16
- [Qemu-devel] [PATCH v1 06/11] char/cadence_uart: Define Missing SR/ISR fields, Peter Crosthwaite, 2013/12/16
- [Qemu-devel] [PATCH v1 07/11] char/cadence_uart: Remove TX timer & add TX FIFO state, Peter Crosthwaite, 2013/12/16
- [Qemu-devel] [PATCH v1 08/11] char/cadence_uart: Fix can_receive logic,
Peter Crosthwaite <=
- [Qemu-devel] [PATCH v1 09/11] char/cadence_uart: Use the TX fifo for transmission, Peter Crosthwaite, 2013/12/16
- [Qemu-devel] [PATCH v1 10/11] char/cadence_uart: Delete redundant rx rst logic, Peter Crosthwaite, 2013/12/16
- [Qemu-devel] [PATCH v1 11/11] char/cadence_uart: Implement Tx flow control, Peter Crosthwaite, 2013/12/16