RTL8139: Latch C+ mode state instead of inferring it from C+ Command register (Avi...
authoraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>
Tue, 13 Jan 2009 15:20:14 +0000 (15:20 +0000)
committeraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>
Tue, 13 Jan 2009 15:20:14 +0000 (15:20 +0000)
commit2c3891ab7feb9f1ed3e09f405866585d89efa243
treec6a97616ea5a58c5268436e54dddfd1a0803d90d
parentf094a78220187996e33ba5adce29789326cf6c3c
RTL8139: Latch C+ mode state instead of inferring it from C+ Command register (Avi Kivity)

It was observed that Windows 2003 x64 hangs when shutting down if an
RTL8139 NIC and a USB device tablet are both present.  What seems to be
happening is:

- the guest shuts down the transmitter and receiver
- time passes
- the guest requests a tally counter dump

As it happens, the tally counter command register overlaps the transmit
status register in C mode.  Qemu determines whether the chip is in C or C+
mode by looking at the C+ transmit enable bit; as this is now unset, the
dump tally counter command is interpreted as a C mode transmit command.  The
guest doesn't think so, however, and continues to poll for completion of the
tally counter dump command.  This never occurs, so the guest hangs.

Fix by redefining C+ mode as "a write to the C+ command register has occurred
since the last reset".  The data sheet is silent on the matter.

Signed-off-by: Avi Kivity <avi@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6279 c046a42c-6fe2-441c-8c8c-71466251a162
hw/rtl8139.c