ref: ad37339a1c39c90f51d273abe60f552d3900f752
parent: f58d99aa7a97ba5f79af89f38b78d5924d4e35a2
author: cinap_lenrek <[email protected]>
date: Sun Jul 11 08:12:51 EDT 2021
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).
--- a/sys/src/cmd/vmx/virtio.c
+++ b/sys/src/cmd/vmx/virtio.c
@@ -311,6 +311,17 @@
}
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)
{
int i;
@@ -325,6 +336,7 @@
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 @@
q->size = sz;
q->d = d;
q->notify = fn;
+ vioqreset(q);
return q;
}