Some drivers set RDT=RDH. Oddly, this works on real hardware. To work around this, autodecrement RDT when this happens.
Signed-off-by: Richard Tollerton <rich.toller...@ni.com> Signed-off-by: Jeff Westfahl <jeff.westf...@ni.com> --- hw/net/e1000.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/net/e1000.c b/hw/net/e1000.c index 44ae3a8..b8cbfc1 100644 --- a/hw/net/e1000.c +++ b/hw/net/e1000.c @@ -1152,6 +1152,12 @@ mac_writereg(E1000State *s, int index, uint32_t val) static void set_rdt(E1000State *s, int index, uint32_t val) { + if (val == s->mac_reg[RDH]) { /* Decrement RDT if it's too big */ + if (val == 0) { + val = s->mac_reg[RDLEN] / sizeof(struct e1000_rx_desc); + } + val--; + } s->mac_reg[index] = val & 0xffff; if (e1000_has_rxbufs(s, 1)) { qemu_flush_queued_packets(qemu_get_queue(s->nic)); -- 2.1.3