On 13/09/12 20:29, Stefan Hajnoczi wrote:
On Thu, Sep 13, 2012 at 9:51 AM, Amos Kong <ak...@redhat.com> wrote:
From: Jason Wang <jasow...@redhat.com>
Add a link status chang callback and change the link status bit in BMSR
& MSR accordingly. Tested in Linux/Windows guests.
The link status bit of MediaStatus is infered from BasicModeStatus,
they are reverse.
Signed-off-by: Jason Wang <jasow...@redhat.com>
Signed-off-by: Amos Kong <ak...@redhat.com>
---
v2: don't add MediaState in RTL8139State to avoid migration trouble
---
hw/rtl8139.c | 19 +++++++++++++++++--
1 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/hw/rtl8139.c b/hw/rtl8139.c
index 844f1b8..fa949ca 100644
--- a/hw/rtl8139.c
+++ b/hw/rtl8139.c
@@ -167,7 +167,7 @@ enum IntrStatusBits {
PCIErr = 0x8000,
PCSTimeout = 0x4000,
RxFIFOOver = 0x40,
- RxUnderrun = 0x20,
+ RxUnderrun = 0x20, /* Packet Underrun / Link Change */
RxOverflow = 0x10,
TxErr = 0x08,
TxOK = 0x04,
@@ -3007,7 +3007,7 @@ static uint32_t rtl8139_io_readb(void *opaque, uint8_t
addr)
break;
case MediaStatus:
- ret = 0xd0;
+ ret = 0xd0 | ~(s->BasicModeStatus & 0x0004);
DPRINTF("MediaStatus read 0x%x\n", ret);
break;
This does not give any hint that BMSR & 0x4 is the link status
(inverted).
only mentioned in the commitlog, will add a comment here.
I suggest adding an enum like the other constants at the
top of the file:
ret = 0xd0 | (nc->link_down ? MSRLinkDown : 0);
Ok, I will update the patch.
Regarding migration: do we migrate the NetClient->link_down field? If
we only migrate the status register value then the link may actually
be up at the net.c level.
I tried to add 'MediaStatus' to 'struct RTL8139State', and update
'VMStateDescription vmstate_rtl8139', then the value of MediaStatus
will be migrated.
But the idea in v2 is better.
Stefan
Thanks.
--
Amos.