code: plan9front

Download patch

ref: ad37339a1c39c90f51d273abe60f552d3900f752
parent: f58d99aa7a97ba5f79af89f38b78d5924d4e35a2
author: cinap_lenrek <cinap_lenrek@felloff.net>
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;
 }