summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJason Wang <jasowang@redhat.com>2012-03-05 11:08:59 +0800
committerMichael S. Tsirkin <mst@redhat.com>2012-03-16 01:04:51 +0200
commiteb46c5eda7d8b38c1407dd55f67cf4a6aa3b7b23 (patch)
tree7e05acadec1cee8610bb358976d993a6df9e28f2
parent7fc8d918b9674c3e9233d6d25da2457345d414a0 (diff)
downloadfocaccia-qemu-eb46c5eda7d8b38c1407dd55f67cf4a6aa3b7b23.tar.gz
focaccia-qemu-eb46c5eda7d8b38c1407dd55f67cf4a6aa3b7b23.zip
rtl8139: correctly check the opmode
According to the spec, only when opmode is "Config. Register Write
Enable" could driver write to CONFIG0,1,3,4 and bits 13,12,8 of BMCR.

Currently, we allow modifying to those registers also when 8139 is in
"Auto-load" mode and "93C46 (93C56) Programming" mode. This patch
fixes this.

Signed-off-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-rw-r--r--hw/rtl8139.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/hw/rtl8139.c b/hw/rtl8139.c
index 5b608f53ec..f3322ea167 100644
--- a/hw/rtl8139.c
+++ b/hw/rtl8139.c
@@ -332,8 +332,10 @@ enum CSCRBits {
 };
 
 enum Cfg9346Bits {
-    Cfg9346_Lock = 0x00,
-    Cfg9346_Unlock = 0xC0,
+    Cfg9346_Normal = 0x00,
+    Cfg9346_Autoload = 0x40,
+    Cfg9346_Programming = 0x80,
+    Cfg9346_ConfigWrite = 0xC0,
 };
 
 typedef enum {
@@ -1451,7 +1453,7 @@ static uint32_t rtl8139_IntrMitigate_read(RTL8139State *s)
 
 static int rtl8139_config_writable(RTL8139State *s)
 {
-    if (s->Cfg9346 & Cfg9346_Unlock)
+    if ((s->Cfg9346 & Chip9346_op_mask) == Cfg9346_ConfigWrite)
     {
         return 1;
     }