aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hw/eepro100.c185
1 files changed, 126 insertions, 59 deletions
diff --git a/hw/eepro100.c b/hw/eepro100.c
index 0f07b702e4..43a9060254 100644
--- a/hw/eepro100.c
+++ b/hw/eepro100.c
@@ -154,11 +154,13 @@ typedef struct {
uint16_t tcb_bytes; /* transmit command block byte count (in lower 14 bits */
uint8_t tx_threshold; /* transmit threshold */
uint8_t tbd_count; /* TBD number */
- //~ /* This constitutes two "TBD" entries: hdr and data */
- //~ uint32_t tx_buf_addr0; /* void *, header of frame to be transmitted. */
- //~ int32_t tx_buf_size0; /* Length of Tx hdr. */
- //~ uint32_t tx_buf_addr1; /* void *, data to be transmitted. */
- //~ int32_t tx_buf_size1; /* Length of Tx data. */
+#if 0
+ /* This constitutes two "TBD" entries: hdr and data */
+ uint32_t tx_buf_addr0; /* void *, header of frame to be transmitted. */
+ int32_t tx_buf_size0; /* Length of Tx hdr. */
+ uint32_t tx_buf_addr1; /* void *, data to be transmitted. */
+ int32_t tx_buf_size1; /* Length of Tx data. */
+#endif
} eepro100_tx_t;
/* Receive frame descriptor. */
@@ -398,7 +400,9 @@ static void eepro100_interrupt(EEPRO100State * s, uint8_t status)
s->mem[SCBAck] |= status;
status = s->scb_stat = s->mem[SCBAck];
status &= (mask | 0x0f);
- //~ status &= (~s->mem[SCBIntmask] | 0x0xf);
+#if 0
+ status &= (~s->mem[SCBIntmask] | 0x0xf);
+#endif
if (status && (mask & 0x01)) {
/* SCB mask and SCB Bit M do not disable interrupt. */
enable_interrupt(s);
@@ -477,9 +481,11 @@ static void pci_reset(EEPRO100State * s)
pci_config_set_class(pci_conf, PCI_CLASS_NETWORK_ETHERNET);
/* PCI Cache Line Size */
/* check cache line size!!! */
- //~ PCI_CONFIG_8(0x0c, 0x00);
+#if 0
+ PCI_CONFIG_8(0x0c, 0x00);
+#endif
/* PCI Latency Timer */
- PCI_CONFIG_8(PCI_LATENCY_TIMER, 0x20); // latency timer = 32 clocks
+ PCI_CONFIG_8(PCI_LATENCY_TIMER, 0x20); /* latency timer = 32 clocks */
/* PCI Header Type */
/* BIST (built-in self test) */
/* Expansion ROM Base Address (depends on boot disable!!!) */
@@ -492,7 +498,7 @@ static void pci_reset(EEPRO100State * s)
/* Interrupt Line */
/* Interrupt Pin */
/* TODO: RST# value should be 0 */
- PCI_CONFIG_8(PCI_INTERRUPT_PIN, 1); // interrupt pin 0
+ PCI_CONFIG_8(PCI_INTERRUPT_PIN, 1); /* interrupt pin 0 */
/* Minimum Grant */
PCI_CONFIG_8(PCI_MIN_GNT, 0x08);
/* Maximum Latency */
@@ -500,20 +506,20 @@ static void pci_reset(EEPRO100State * s)
switch (device) {
case i82550:
- // TODO: check device id.
+ /* TODO: check device id. */
pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_INTEL_82551IT);
/* Revision ID: 0x0c, 0x0d, 0x0e. */
PCI_CONFIG_8(PCI_REVISION_ID, 0x0e);
- // TODO: check size of statistical counters.
+ /* TODO: check size of statistical counters. */
s->stats_size = 80;
- // TODO: check extended tcb support.
+ /* TODO: check extended tcb support. */
s->has_extended_tcb_support = 1;
break;
case i82551:
pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_INTEL_82551IT);
/* Revision ID: 0x0f, 0x10. */
PCI_CONFIG_8(PCI_REVISION_ID, 0x0f);
- // TODO: check size of statistical counters.
+ /* TODO: check size of statistical counters. */
s->stats_size = 80;
s->has_extended_tcb_support = 1;
break;
@@ -572,7 +578,7 @@ static void pci_reset(EEPRO100State * s)
PCI_CONFIG_16(PCI_STATUS, PCI_STATUS_DEVSEL_MEDIUM |
PCI_STATUS_FAST_BACK | PCI_STATUS_CAP_LIST);
PCI_CONFIG_8(PCI_REVISION_ID, 0x08);
- // TODO: Windows wants revision id 0x0c.
+ /* TODO: Windows wants revision id 0x0c. */
PCI_CONFIG_8(PCI_REVISION_ID, 0x0c);
#if EEPROM_SIZE > 0
PCI_CONFIG_16(PCI_SUBSYSTEM_VENDOR_ID, 0x8086);
@@ -590,7 +596,7 @@ static void pci_reset(EEPRO100State * s)
s->has_extended_tcb_support = 1;
break;
case i82562:
- // TODO: check device id.
+ /* TODO: check device id. */
pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_INTEL_82551IT);
/* TODO: wrong revision id. */
PCI_CONFIG_8(PCI_REVISION_ID, 0x0e);
@@ -637,14 +643,16 @@ static void pci_reset(EEPRO100State * s)
#if EEPROM_SIZE > 0
if (device == i82557C || device == i82558B || device == i82559C) {
- // TODO: get vendor id from EEPROM for i82557C or later.
- // TODO: get device id from EEPROM for i82557C or later.
- // TODO: status bit 4 can be disabled by EEPROM for i82558, i82559.
- // TODO: header type is determined by EEPROM for i82559.
- // TODO: get subsystem id from EEPROM for i82557C or later.
- // TODO: get subsystem vendor id from EEPROM for i82557C or later.
- // TODO: exp. rom baddr depends on a bit in EEPROM for i82558 or later.
- // TODO: capability pointer depends on EEPROM for i82558.
+ /*
+ TODO: get vendor id from EEPROM for i82557C or later.
+ TODO: get device id from EEPROM for i82557C or later.
+ TODO: status bit 4 can be disabled by EEPROM for i82558, i82559.
+ TODO: header type is determined by EEPROM for i82559.
+ TODO: get subsystem id from EEPROM for i82557C or later.
+ TODO: get subsystem vendor id from EEPROM for i82557C or later.
+ TODO: exp. rom baddr depends on a bit in EEPROM for i82558 or later.
+ TODO: capability pointer depends on EEPROM for i82558.
+ */
logout("Get device id and revision from EEPROM!!!\n");
}
#endif /* EEPROM_SIZE > 0 */
@@ -654,7 +662,9 @@ static void nic_selective_reset(EEPRO100State * s)
{
size_t i;
uint16_t *eeprom_contents = eeprom93xx_data(s->eeprom);
- //~ eeprom93xx_reset(s->eeprom);
+#if 0
+ eeprom93xx_reset(s->eeprom);
+#endif
memcpy(eeprom_contents, s->conf.macaddr.a, 6);
eeprom_contents[EEPROM_ID] = EEPROM_ID_VALID;
if (s->device == i82557B || s->device == i82557C)
@@ -738,7 +748,7 @@ static void eepro100_write_status(EEPRO100State * s, uint16_t val)
static uint16_t eepro100_read_command(EEPRO100State * s)
{
uint16_t val = 0xffff;
- //~ TRACE(OTHER, logout("val=0x%04x\n", val));
+ TRACE(OTHER, logout("val=0x%04x\n", val));
return val;
}
#endif
@@ -793,9 +803,11 @@ static void dump_statistics(EEPRO100State * s)
stl_le_phys(s->statsaddr + 36, s->statistics.rx_good_frames);
stl_le_phys(s->statsaddr + 48, s->statistics.rx_resource_errors);
stl_le_phys(s->statsaddr + 60, s->statistics.rx_short_frame_errors);
- //~ stw_le_phys(s->statsaddr + 76, s->statistics.xmt_tco_frames);
- //~ stw_le_phys(s->statsaddr + 78, s->statistics.rcv_tco_frames);
- //~ missing("CU dump statistical counters");
+#if 0
+ stw_le_phys(s->statsaddr + 76, s->statistics.xmt_tco_frames);
+ stw_le_phys(s->statsaddr + 78, s->statistics.rcv_tco_frames);
+ missing("CU dump statistical counters");
+#endif
}
static void read_cb(EEPRO100State *s)
@@ -832,7 +844,9 @@ static void tx_command(EEPRO100State *s)
while (size < tcb_bytes) {
uint32_t tx_buffer_address = ldl_phys(tbd_address);
uint16_t tx_buffer_size = lduw_phys(tbd_address + 4);
- //~ uint16_t tx_buffer_el = lduw_phys(tbd_address + 6);
+#if 0
+ uint16_t tx_buffer_el = lduw_phys(tbd_address + 6);
+#endif
tbd_address += 8;
TRACE(RXTX, logout
("TBD (simplified mode): buffer address 0x%08x, size 0x%04x\n",
@@ -889,7 +903,9 @@ static void tx_command(EEPRO100State *s)
s->statistics.tx_good_frames++;
/* Transmit with bad status would raise an CX/TNO interrupt.
* (82557 only). Emulation never has bad status. */
- //~ eepro100_cx_interrupt(s);
+#if 0
+ eepro100_cx_interrupt(s);
+#endif
}
static void set_multicast_list(EEPRO100State *s)
@@ -1016,7 +1032,9 @@ static void eepro100_cu_command(EEPRO100State * s, uint8_t val)
logout("bad CU resume from CU state %u\n", get_cu_state(s));
/* Workaround for bad Linux eepro100 driver which resumes
* from idle state. */
- //~ missing("cu resume");
+#if 0
+ missing("cu resume");
+#endif
set_cu_state(s, cu_suspended);
}
if (get_cu_state(s) == cu_suspended) {
@@ -1067,7 +1085,9 @@ static void eepro100_ru_command(EEPRO100State * s, uint8_t val)
/* RU start. */
if (get_ru_state(s) != ru_idle) {
logout("RU state is %u, should be %u\n", get_ru_state(s), ru_idle);
- //~ assert(!"wrong RU state");
+#if 0
+ assert(!"wrong RU state");
+#endif
}
set_ru_state(s, ru_ready);
s->ru_offset = s->pointer;
@@ -1078,7 +1098,9 @@ static void eepro100_ru_command(EEPRO100State * s, uint8_t val)
if (get_ru_state(s) != ru_suspended) {
logout("RU state is %u, should be %u\n", get_ru_state(s),
ru_suspended);
- //~ assert(!"wrong RU state");
+#if 0
+ assert(!"wrong RU state");
+#endif
}
set_ru_state(s, ru_ready);
break;
@@ -1140,7 +1162,9 @@ static void eepro100_write_eeprom(eeprom_t * eeprom, uint8_t val)
TRACE(EEPROM, logout("val=0x%02x\n", val));
/* mask unwriteable bits */
- //~ val = SET_MASKED(val, 0x31, eeprom->value);
+#if 0
+ val = SET_MASKED(val, 0x31, eeprom->value);
+#endif
int eecs = ((val & EEPROM_CS) != 0);
int eesk = ((val & EEPROM_SK) != 0);
@@ -1222,7 +1246,9 @@ static void eepro100_write_mdi(EEPRO100State * s, uint32_t val)
val, raiseint, mdi_op_name[opcode], phy, reg2name(reg), data));
if (phy != 1) {
/* Unsupported PHY address. */
- //~ logout("phy must be 1 but is %u\n", phy);
+#if 0
+ logout("phy must be 1 but is %u\n", phy);
+#endif
data = 0;
} else if (opcode != 1 && opcode != 2) {
/* Unsupported opcode. */
@@ -1368,16 +1394,22 @@ static uint8_t eepro100_read1(EEPRO100State * s, uint32_t addr)
switch (addr) {
case SCBStatus:
- //~ val = eepro100_read_status(s);
+#if 0
+ val = eepro100_read_status(s);
+#endif
TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
break;
case SCBAck:
- //~ val = eepro100_read_status(s);
+#if 0
+ val = eepro100_read_status(s);
+#endif
TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
break;
case SCBCmd:
TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
- //~ val = eepro100_read_command(s);
+#if 0
+ val = eepro100_read_command(s);
+#endif
break;
case SCBIntmask:
TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
@@ -1413,7 +1445,9 @@ static uint16_t eepro100_read2(EEPRO100State * s, uint32_t addr)
switch (addr) {
case SCBStatus:
- //~ val = eepro100_read_status(s);
+#if 0
+ val = eepro100_read_status(s);
+#endif
case SCBCmd:
TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
break;
@@ -1437,11 +1471,15 @@ static uint32_t eepro100_read4(EEPRO100State * s, uint32_t addr)
switch (addr) {
case SCBStatus:
- //~ val = eepro100_read_status(s);
+#if 0
+ val = eepro100_read_status(s);
+#endif
TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
break;
case SCBPointer:
- //~ val = eepro100_read_pointer(s);
+#if 0
+ val = eepro100_read_pointer(s);
+#endif
TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
break;
case SCBPort:
@@ -1468,7 +1506,9 @@ static void eepro100_write1(EEPRO100State * s, uint32_t addr, uint8_t val)
switch (addr) {
case SCBStatus:
- //~ eepro100_write_status(s, val);
+#if 0
+ eepro100_write_status(s, val);
+#endif
break;
case SCBAck:
eepro100_acknowledge(s);
@@ -1508,7 +1548,9 @@ static void eepro100_write2(EEPRO100State * s, uint32_t addr, uint16_t val)
switch (addr) {
case SCBStatus:
- //~ eepro100_write_status(s, val);
+#if 0
+ eepro100_write_status(s, val);
+#endif
eepro100_acknowledge(s);
break;
case SCBCmd:
@@ -1556,7 +1598,9 @@ static void eepro100_write4(EEPRO100State * s, uint32_t addr, uint32_t val)
static uint32_t ioport_read1(void *opaque, uint32_t addr)
{
EEPRO100State *s = opaque;
- //~ logout("addr=%s\n", regname(addr));
+#if 0
+ logout("addr=%s\n", regname(addr));
+#endif
return eepro100_read1(s, addr - s->region[1]);
}
@@ -1575,7 +1619,9 @@ static uint32_t ioport_read4(void *opaque, uint32_t addr)
static void ioport_write1(void *opaque, uint32_t addr, uint32_t val)
{
EEPRO100State *s = opaque;
- //~ logout("addr=%s val=0x%02x\n", regname(addr), val);
+#if 0
+ logout("addr=%s val=0x%02x\n", regname(addr), val);
+#endif
eepro100_write1(s, addr - s->region[1], val);
}
@@ -1623,42 +1669,54 @@ static void pci_map(PCIDevice * pci_dev, int region_num,
static void pci_mmio_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
{
EEPRO100State *s = opaque;
- //~ logout("addr=%s val=0x%02x\n", regname(addr), val);
+#if 0
+ logout("addr=%s val=0x%02x\n", regname(addr), val);
+#endif
eepro100_write1(s, addr, val);
}
static void pci_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
{
EEPRO100State *s = opaque;
- //~ logout("addr=%s val=0x%02x\n", regname(addr), val);
+#if 0
+ logout("addr=%s val=0x%02x\n", regname(addr), val);
+#endif
eepro100_write2(s, addr, val);
}
static void pci_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
{
EEPRO100State *s = opaque;
- //~ logout("addr=%s val=0x%02x\n", regname(addr), val);
+#if 0
+ logout("addr=%s val=0x%02x\n", regname(addr), val);
+#endif
eepro100_write4(s, addr, val);
}
static uint32_t pci_mmio_readb(void *opaque, target_phys_addr_t addr)
{
EEPRO100State *s = opaque;
- //~ logout("addr=%s\n", regname(addr));
+#if 0
+ logout("addr=%s\n", regname(addr));
+#endif
return eepro100_read1(s, addr);
}
static uint32_t pci_mmio_readw(void *opaque, target_phys_addr_t addr)
{
EEPRO100State *s = opaque;
- //~ logout("addr=%s\n", regname(addr));
+#if 0
+ logout("addr=%s\n", regname(addr));
+#endif
return eepro100_read2(s, addr);
}
static uint32_t pci_mmio_readl(void *opaque, target_phys_addr_t addr)
{
EEPRO100State *s = opaque;
- //~ logout("addr=%s\n", regname(addr));
+#if 0
+ logout("addr=%s\n", regname(addr));
+#endif
return eepro100_read4(s, addr);
}
@@ -1695,7 +1753,9 @@ static int nic_can_receive(VLANClientState *nc)
EEPRO100State *s = DO_UPCAST(NICState, nc, nc)->opaque;
TRACE(RXTX, logout("%p\n", s));
return get_ru_state(s) == ru_ready;
- //~ return !eepro100_buffer_full(s);
+#if 0
+ return !eepro100_buffer_full(s);
+#endif
}
static ssize_t nic_receive(VLANClientState *nc, const uint8_t * buf, size_t size)
@@ -1724,13 +1784,15 @@ static ssize_t nic_receive(VLANClientState *nc, const uint8_t * buf, size_t size
* Short frame is discarded */
logout("%p received short frame (%zu byte)\n", s, size);
s->statistics.rx_short_frame_errors++;
- //~ return -1;
+#if 0
+ return -1;
+#endif
} else if ((size > MAX_ETH_FRAME_SIZE + 4) && !(s->configuration[18] & BIT(3))) {
/* Long frame and configuration byte 18/3 (long receive ok) not set:
* Long frames are discarded. */
logout("%p received long frame (%zu byte), ignored\n", s, size);
return -1;
- } else if (memcmp(buf, s->conf.macaddr.a, 6) == 0) { // !!!
+ } else if (memcmp(buf, s->conf.macaddr.a, 6) == 0) { /* !!! */
/* Frame matches individual address. */
/* TODO: check configuration byte 15/4 (ignore U/L). */
TRACE(RXTX, logout("%p received frame for me, len=%zu\n", s, size));
@@ -1774,11 +1836,12 @@ static ssize_t nic_receive(VLANClientState *nc, const uint8_t * buf, size_t size
/* TODO: RNR interrupt only at first failed frame? */
eepro100_rnr_interrupt(s);
s->statistics.rx_resource_errors++;
- //~ assert(!"no resources");
+#if 0
+ assert(!"no resources");
+#endif
return -1;
}
- //~ !!!
-//~ $3 = {status = 0x0, command = 0xc000, link = 0x2d220, rx_buf_addr = 0x207dc, count = 0x0, size = 0x5f8, packet = {0x0 <repeats 1518 times>}}
+ /* !!! */
eepro100_rx_t rx;
cpu_physical_memory_read(s->ru_base + s->ru_offset, (uint8_t *) & rx,
offsetof(eepro100_rx_t, packet));
@@ -1799,14 +1862,18 @@ static ssize_t nic_receive(VLANClientState *nc, const uint8_t * buf, size_t size
rfd_status);
stw_phys(s->ru_base + s->ru_offset + offsetof(eepro100_rx_t, count), size);
/* Early receive interrupt not supported. */
- //~ eepro100_er_interrupt(s);
+#if 0
+ eepro100_er_interrupt(s);
+#endif
/* Receive CRC Transfer not supported. */
if (s->configuration[18] & BIT(2)) {
missing("Receive CRC Transfer");
return -1;
}
/* TODO: check stripping enable bit. */
- //~ assert(!(s->configuration[17] & BIT(0)));
+#if 0
+ assert(!(s->configuration[17] & BIT(0)));
+#endif
cpu_physical_memory_write(s->ru_base + s->ru_offset +
offsetof(eepro100_rx_t, packet), buf, size);
s->statistics.rx_good_frames++;