qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] rtl8139: implement 8139cp link status


From: Jason Wang
Subject: Re: [Qemu-devel] [PATCH] rtl8139: implement 8139cp link status
Date: Thu, 13 Sep 2012 16:48:26 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.1) Gecko/20120210 Thunderbird/10.0.1

On 09/10/2012 04:15 PM, Jason Wang wrote:
On 09/10/2012 03:59 PM, Amos Kong wrote:
From: Jason Wang<address@hidden>

Add a link status chang callback and change the link status bit in BMSR
&  MSR accordingly. Tested in Linux/Windows guests.

Signed-off-by: Jason Wang<address@hidden>
Signed-off-by: Amos Kong<address@hidden>
---
  hw/rtl8139.c |   23 +++++++++++++++++++++--
  1 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/hw/rtl8139.c b/hw/rtl8139.c
index 844f1b8..3c33908 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,
@@ -452,6 +452,7 @@ typedef struct RTL8139State {
      uint8_t  Config0;
      uint8_t  Config1;
      uint8_t  Config3;
+    uint8_t  MediaStatus;
      uint8_t  Config4;
      uint8_t  Config5;

So the content of this register would be lost after migration?

Or you can do some hack to avoid hanling migration, e.g infer the the link status bit of MediaStatus from BasicModeStatus.
@@ -1246,6 +1247,7 @@ static void rtl8139_reset(DeviceState *d)
      /* set initial state data */
      s->Config0 = 0x0; /* No boot ROM */
s->Config1 = 0xC; /* IO mapped and MEM mapped registers available */ + s->MediaStatus = 0xd0; /* Power is present, TX/RX flow control enable */
      s->Config3 = 0x1; /* fast back-to-back compatible */
      s->Config5 = 0x0;

@@ -3007,7 +3009,7 @@ static uint32_t rtl8139_io_readb(void *opaque, uint8_t addr)
              break;

          case MediaStatus:
-            ret = 0xd0;
+            ret = s->MediaStatus;
              DPRINTF("MediaStatus read 0x%x\n", ret);
              break;

@@ -3453,12 +3455,29 @@ static void pci_rtl8139_uninit(PCIDevice *dev)
      qemu_del_net_client(&s->nic->nc);
  }

+static void rtl8139_set_link_status(NetClientState *nc)
+{
+    RTL8139State *s = DO_UPCAST(NICState, nc, nc)->opaque;
+
+    if (nc->link_down) {
+        s->BasicModeStatus&= ~0x0004;
+        s->MediaStatus |= 0x0004;
+    } else {
+        s->BasicModeStatus |= 0x0004;
+        s->MediaStatus&= ~0x0004;
+    }
+
+    s->IntrStatus |= RxUnderrun;
+    rtl8139_update_irq(s);
+}
+
  static NetClientInfo net_rtl8139_info = {
      .type = NET_CLIENT_OPTIONS_KIND_NIC,
      .size = sizeof(NICState),
      .can_receive = rtl8139_can_receive,
      .receive = rtl8139_receive,
      .cleanup = rtl8139_cleanup,
+    .link_status_changed = rtl8139_set_link_status,
  };

  static int pci_rtl8139_init(PCIDevice *dev)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]