From ad37339a1c39c90f51d273abe60f552d3900f752 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sun, 11 Jul 2021 12:12:51 +0000 Subject: [PATCH] vmx: reset virtio queue state on device reset when a virtio device gets reset, we have to also reset the device shadow indices: availableidx and usedidx. for extra safetly, we also reset the buffer descriptor table addresses. this is accomplished by adding a vioqreset(VIOQueue*) function that brings the queue to its initial reset state. this fixes non functional ethernet after reboot(8). --- sys/src/cmd/vmx/virtio.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/sys/src/cmd/vmx/virtio.c b/sys/src/cmd/vmx/virtio.c index 6451eeef5..da0558320 100644 --- a/sys/src/cmd/vmx/virtio.c +++ b/sys/src/cmd/vmx/virtio.c @@ -310,6 +310,17 @@ vioqaddrset(VIOQueue *q, u64int addr) qunlock(q); } +static void +vioqreset(VIOQueue *q) +{ + q->desc = nil; + q->avail = nil; + q->used = nil; + q->addr = 0; + q->availidx = 0; + q->usedidx = 0; +} + static void viodevstatset(VIODev *v, u32int val) { @@ -325,6 +336,7 @@ viodevstatset(VIODev *v, u32int val) qlock(&v->qu[i]); while(v->qu[i].livebuf > 0) rsleep(&v->qu[i].livebufrend); + vioqreset(&v->qu[i]); qunlock(&v->qu[i]); } }else{ @@ -396,6 +408,7 @@ mkvioqueue(VIODev *d, int sz, void (*fn)(VIOQueue*)) q->size = sz; q->d = d; q->notify = fn; + vioqreset(q); return q; } -- 2.44.0