[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH target-arm v2 08/11] char/cadence_uart: Fix can_rece
From: |
Peter Crosthwaite |
Subject: |
[Qemu-devel] [PATCH target-arm v2 08/11] char/cadence_uart: Fix can_receive logic |
Date: |
Wed, 1 Jan 2014 18:02:36 -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 3eeadb1..3bcaf29 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.2
- [Qemu-devel] [PATCH target-arm v2 00/11] Cadence UART cleanups and Tx path fixes, Peter Crosthwaite, 2014/01/01
- [Qemu-devel] [PATCH target-arm v2 01/11] char/cadence_uart: Mark struct fields as public/private, Peter Crosthwaite, 2014/01/01
- [Qemu-devel] [PATCH target-arm v2 02/11] char/cadence_uart: Add missing uart_update_state, Peter Crosthwaite, 2014/01/01
- [Qemu-devel] [PATCH target-arm v2 03/11] char/cadence_uart: Fix reset., Peter Crosthwaite, 2014/01/01
- [Qemu-devel] [PATCH target-arm v2 04/11] char/cadence_uart: s/r_fifo/rx_fifo, Peter Crosthwaite, 2014/01/01
- [Qemu-devel] [PATCH target-arm v2 05/11] char/cadence_uart: Simplify status generation, Peter Crosthwaite, 2014/01/01
- [Qemu-devel] [PATCH target-arm v2 06/11] char/cadence_uart: Define Missing SR/ISR fields, Peter Crosthwaite, 2014/01/01
- [Qemu-devel] [PATCH target-arm v2 07/11] char/cadence_uart: Remove TX timer & add TX FIFO state, Peter Crosthwaite, 2014/01/01
- [Qemu-devel] [PATCH target-arm v2 08/11] char/cadence_uart: Fix can_receive logic,
Peter Crosthwaite <=
- [Qemu-devel] [PATCH target-arm v2 09/11] char/cadence_uart: Use the TX fifo for transmission, Peter Crosthwaite, 2014/01/01
- [Qemu-devel] [PATCH target-arm v2 10/11] char/cadence_uart: Delete redundant rx rst logic, Peter Crosthwaite, 2014/01/01
- [Qemu-devel] [PATCH target-arm v2 11/11] char/cadence_uart: Implement Tx flow control, Peter Crosthwaite, 2014/01/01
- Re: [Qemu-devel] [PATCH target-arm v2 00/11] Cadence UART cleanups and Tx path fixes, Peter Maydell, 2014/01/06