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).
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)
{
qlock(&v->qu[i]);
while(v->qu[i].livebuf > 0)
rsleep(&v->qu[i].livebufrend);
+ vioqreset(&v->qu[i]);
qunlock(&v->qu[i]);
}
}else{
q->size = sz;
q->d = d;
q->notify = fn;
+ vioqreset(q);
return q;
}