[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] qemu-dm: Limit transmit retries from virtual UART FIFO.
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1196937670 0 # Node ID 90f02ca762448d7af4106b1552ded64cbea5919a # Parent 8ba08f2244b29ec2a1436467b4d5dc30e770accb qemu-dm: Limit transmit retries from virtual UART FIFO. Signed-off-by: Trolle Selander <trolle.selander@xxxxxxxxx> --- tools/ioemu/hw/serial.c | 15 +++++++++------ 1 files changed, 9 insertions(+), 6 deletions(-) diff -r 8ba08f2244b2 -r 90f02ca76244 tools/ioemu/hw/serial.c --- a/tools/ioemu/hw/serial.c Wed Dec 05 17:56:13 2007 +0000 +++ b/tools/ioemu/hw/serial.c Thu Dec 06 10:41:10 2007 +0000 @@ -96,6 +96,7 @@ #define XMIT_FIFO 0 #define RECV_FIFO 1 +#define MAX_XMIT_RETRY 4 struct SerialFIFO { uint8_t data[UART_FIFO_LENGTH]; @@ -136,7 +137,7 @@ struct SerialState { struct QEMUTimer *fifo_timeout_timer; int timeout_ipending; /* timeout interrupt pending state */ - struct QEMUTimer *fifo_transmit_timer; + struct QEMUTimer *transmit_timer; uint64_t char_transmit_time; /* time to transmit a char in ticks*/ @@ -370,15 +371,17 @@ static void serial_xmit(void *opaque) { if ( qemu_chr_write(s->chr, &s->tsr, 1) != 1 ) { s->tsr_retry++; - qemu_mod_timer(s->fifo_transmit_timer, new_xmit_ts + s->char_transmit_time ); - return; + if ( s->tsr_retry <= MAX_XMIT_RETRY ) { + qemu_mod_timer(s->transmit_timer, new_xmit_ts + s->char_transmit_time ); + return; + } } s->tsr_retry = 0; s->last_xmit_ts = qemu_get_clock(vm_clock); - if ( s->xmit_fifo.count > 0 ) - qemu_mod_timer(s->fifo_transmit_timer, s->last_xmit_ts + s->char_transmit_time ); + if ( !(s->lsr & UART_LSR_THRE) ) + qemu_mod_timer(s->transmit_timer, s->last_xmit_ts + s->char_transmit_time ); if ( s->lsr & UART_LSR_THRE ) { s->lsr |= UART_LSR_TEMT; @@ -752,7 +755,7 @@ SerialState *serial_init(SetIRQFunc *set fifo_clear(s,XMIT_FIFO); s->last_xmit_ts = qemu_get_clock(vm_clock); s->fifo_timeout_timer = qemu_new_timer(vm_clock, ( QEMUTimerCB *) fifo_timeout_int, s); - s->fifo_transmit_timer = qemu_new_timer(vm_clock, ( QEMUTimerCB *) serial_xmit, s); + s->transmit_timer = qemu_new_timer(vm_clock, ( QEMUTimerCB *) serial_xmit, s); register_savevm("serial", base, 2, serial_save, serial_load, s); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |