e1000 spec says CTRL.RST write should have the same effect as bus reset, except that is preserves PCI Config. Reset device registers and interrupts.
Fix suggested by Andy Gospodarek <a...@greyhouse.net> Similar fix proposed by Anthony PERARD <anthony.per...@citrix.com> Signed-off-by: Michael S. Tsirkin <m...@redhat.com> --- hw/e1000.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/hw/e1000.c b/hw/e1000.c index 87a1104..b51e089 100644 --- a/hw/e1000.c +++ b/hw/e1000.c @@ -241,8 +241,13 @@ static void e1000_reset(void *opaque) static void set_ctrl(E1000State *s, int index, uint32_t val) { - /* RST is self clearing */ - s->mac_reg[CTRL] = val & ~E1000_CTRL_RST; + if (val & E1000_CTRL_RST) { + e1000_reset(s); + qemu_set_irq(s->dev.irq[0], 0); + return; + } + + s->mac_reg[CTRL] = val; } static void -- 1.7.5.53.gc233e