qemu-devel
[Top][All Lists]
Advanced

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

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


From: Amos Kong
Subject: [Qemu-devel] [PATCH] rtl8139: implement 8139cp link status
Date: Mon, 10 Sep 2012 15:59:19 +0800

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;
 
@@ -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)
-- 
1.7.1




reply via email to

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