When using QEMU in some terminal environments, char back-ends for serial devices can return EAGAIN for non trivial periods. This coupled with use of qemu_chr_fe_write_all() is a leading cause of:
main-loop: WARNING: I/O thread spun for 1000 iterations This series fixes this for cadence_uart by replacing the open loop tx-write logic with a proper closed-loop that is responsive to the back-end short return. Various trivial cleanups are at the front of the series. Last patch is the main event. There is also a major performance increase with removal of the tx timer logic (P7). As a test, I've been using QEMU in a terminal over trans-pacific SSH. Before this series: $ time ./qemu-build/arm-softmmu/qemu-system-arm -M xilinx-zynq-a9 ... main-loop: WARNING: I/O thread spun for 1000 iterations Booting Linux on physical CPU 0x0 ... PetaLinux v2013.04 (Yocto 1.3) zynq ttyPS0 zynq login: QEMU: Terminated real 2m26.908s user 1m41.430s sys 1m7.116s And after: $ time ./qemu-build/arm-softmmu/qemu-system-arm -M xilinx-zynq-a9 ... Booting Linux on physical CPU 0x0 ... PetaLinux v2013.04 (Yocto 1.3) zynq ttyPS0 zynq login: QEMU: Terminated real 0m16.149s user 0m10.357s sys 0m0.164s Peter Crosthwaite (11): char/cadence_uart: Mark struct fields as public/private char/cadence_uart: Add missing uart_update_state char/cadence_uart: Fix reset. char/cadence_uart: s/r_fifo/rx_fifo char/cadence_uart: Simplify status generation char/cadence_uart: Define Missing SR/ISR fields char/cadence_uart: Remove TX timer & add TX FIFO state char/cadence_uart: Fix can_receive logic char/cadence_uart: Use the TX fifo for transmission char/cadence_uart: Delete redundant rx rst logic char/cadence_uart: Implement Tx flow control hw/char/cadence_uart.c | 153 ++++++++++++++++++++++++++++--------------------- 1 file changed, 87 insertions(+), 66 deletions(-) -- 1.8.5.1