[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [Bug 1086745] TEMT comes too early (QEMU/KVM)
From: |
Kees Schoenmakers |
Subject: |
[Qemu-devel] [Bug 1086745] TEMT comes too early (QEMU/KVM) |
Date: |
Wed, 05 Dec 2012 19:37:32 -0000 |
Hello,
It is a Linux host and a Linux guest. One serial port (/dev/ttyS0) is
passed from the host to the guest.
The application (on the guest) does Hart (r) communication, This is
done with a 1200 baud simplex modem (one side at a time).
The application raises RTS so that the modem goes in transmit state,
it writes a couple of bytes. Only after _all_ bytes are written in
reality the RTS is to be de-activated which puts the modem in receive
state. Normally a loop like
int parm =0;
while (!parm)
ioctl(devicefd,TIOCSERGETLSR , &parm);
is executed, The loop exits when parm is not zero (TEMT is set);
The current implementation of TIOCSERGETLSR only checks fifo count
which is nowhere a accurate way of checking if the device in the host
has written all its characters, thus the function
ioctl(devicefd,TIOCSERGETLSR , &parm) returns parms set already when
the second character is transmitted and thus the whole communication
cycle is disrupted.
One possible solution is having ioctl(.... TIOCSERGETLSR ...) in the
guest to check the result of ioctl(..... TIOCSERGETLSR....) in the
host. Another way is timing of the transmission, that is for each
character written the guest needs to add the charactertime to a timer
and only when the timer timesout TEMT is to be set.
does this help to understand the problem?
best regards
Kees
--
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/1086745
Title:
serial port data THRE comes too early
Status in QEMU:
New
Bug description:
When using a serial port with a Linux guest (and host) and the
application uses hardware handshake, this fails because the handling
of TEMT and/or THRE is not operating properly in such cases.
As long as it takes _time_ for the 'real' port to output the data TEMT
may not return true. After writing characters to a real port, the
driver should timeout the transmission and after the total time
expired, TEMT can be set.
Some applications i.e. with a simplex modem do: RTS_on, WRITE_data, repeat
IOCTL(GET_LSR_INFO), RTS_off, READ_data.
At the moment this fails because very early in the transmission, GET_LSR_INFO
returns true and the modem transmitter is switched off.
I looked in the source (git) and found that 'char_transmit_time' is present.
My skills fail to implement it myself.
I build and ran the latest git version and found it to fail as decribed
above. I hope someone can solve it.
To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/1086745/+subscriptions
[Prev in Thread] |
Current Thread |
[Next in Thread] |