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: Mon, 10 Sep 2012 16:15:37 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.1) Gecko/20120210 Thunderbird/10.0.1

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?
@@ -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]