提交 3fd3d0b4 编写于 作者: S Stefan Weil 提交者: Michael S. Tsirkin

eepro100: Support byte/word writes to port address

port is a 32 bit register, but may be written using 8 or 16 bit writes.
Add support for byte/word writes.
Signed-off-by: NStefan Weil <weil@mail.berlios.de>
Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
上级 e5e23ab8
...@@ -1317,8 +1317,9 @@ static uint32_t eepro100_read_port(EEPRO100State * s) ...@@ -1317,8 +1317,9 @@ static uint32_t eepro100_read_port(EEPRO100State * s)
return 0; return 0;
} }
static void eepro100_write_port(EEPRO100State * s, uint32_t val) static void eepro100_write_port(EEPRO100State *s)
{ {
uint32_t val = e100_read_reg4(s, SCBPort);
uint32_t address = (val & ~PORT_SELECTION_MASK); uint32_t address = (val & ~PORT_SELECTION_MASK);
uint8_t selection = (val & PORT_SELECTION_MASK); uint8_t selection = (val & PORT_SELECTION_MASK);
switch (selection) { switch (selection) {
...@@ -1472,7 +1473,15 @@ static void eepro100_write1(EEPRO100State * s, uint32_t addr, uint8_t val) ...@@ -1472,7 +1473,15 @@ static void eepro100_write1(EEPRO100State * s, uint32_t addr, uint8_t val)
} }
eepro100_interrupt(s, 0); eepro100_interrupt(s, 0);
break; break;
case SCBPort:
case SCBPort + 1:
case SCBPort + 2:
TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
break;
case SCBPort + 3: case SCBPort + 3:
TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
eepro100_write_port(s);
break;
case SCBFlow: /* does not exist on 82557 */ case SCBFlow: /* does not exist on 82557 */
case SCBFlow + 1: case SCBFlow + 1:
case SCBFlow + 2: case SCBFlow + 2:
...@@ -1507,6 +1516,13 @@ static void eepro100_write2(EEPRO100State * s, uint32_t addr, uint16_t val) ...@@ -1507,6 +1516,13 @@ static void eepro100_write2(EEPRO100State * s, uint32_t addr, uint16_t val)
eepro100_write_command(s, val); eepro100_write_command(s, val);
eepro100_write1(s, SCBIntmask, val >> 8); eepro100_write1(s, SCBIntmask, val >> 8);
break; break;
case SCBPort:
TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
break;
case SCBPort + 2:
TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
eepro100_write_port(s);
break;
case SCBeeprom: case SCBeeprom:
TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val)); TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
eepro100_write_eeprom(s->eeprom, val); eepro100_write_eeprom(s->eeprom, val);
...@@ -1529,7 +1545,7 @@ static void eepro100_write4(EEPRO100State * s, uint32_t addr, uint32_t val) ...@@ -1529,7 +1545,7 @@ static void eepro100_write4(EEPRO100State * s, uint32_t addr, uint32_t val)
break; break;
case SCBPort: case SCBPort:
TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val)); TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
eepro100_write_port(s, val); eepro100_write_port(s);
break; break;
case SCBCtrlMDI: case SCBCtrlMDI:
eepro100_write_mdi(s, val); eepro100_write_mdi(s, val);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册