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.

Reply via email to