ref: e8259861da3a55c03491904e4d11c5c15b7577c5
parent: ad37339a1c39c90f51d273abe60f552d3900f752
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Jul 11 17:49:15 EDT 2021
virtio: set FeaturesOk flag after feature negotiation, and enable queues before DriverOk flag
--- a/sys/src/9/pc/ethervirtio10.c
+++ b/sys/src/9/pc/ethervirtio10.c
@@ -40,7 +40,7 @@
Sacknowledge = 1,
Sdriver = 2,
Sdriverok = 4,
- Sfeatureok = 8,
+ Sfeaturesok = 8,
Sfailed = 128,
/* flags in Qnetstatus */
@@ -466,14 +466,15 @@
}
ctlr->attached = 1;
- /* driver is ready */
- ctlr->cfg->status |= Sdriverok;
-
/* enable the queues */
for(i = 0; i < ctlr->nqueue; i++){
ctlr->cfg->queuesel = i;
ctlr->cfg->queueenable = 1;
}
+
+ /* driver is ready */
+ ctlr->cfg->status |= Sdriverok;
+
iunlock(ctlr);
/* start kprocs */
@@ -691,6 +692,8 @@
cfg->drvfeatsel = 0;
cfg->drvfeat = c->feat[0] & (Fmac|Fctrlvq|Fctrlrx);
+
+ cfg->status |= Sfeaturesok;
for(i=0; i<nelem(c->queue); i++){
cfg->queuesel = i;
--- a/sys/src/9/pc/sdvirtio10.c
+++ b/sys/src/9/pc/sdvirtio10.c
@@ -46,6 +46,7 @@
enum {
Acknowledge = 1,
Driver = 2,
+ FeaturesOk = 8,
DriverOk = 4,
Failed = 0x80,
};
@@ -335,6 +336,7 @@
cfg->drvfeat = vd->feat[1] & 1;
cfg->drvfeatsel = 0;
cfg->drvfeat = 0;
+ cfg->status |= FeaturesOk;
for(i=0; i<nelem(vd->queue); i++){
cfg->queuesel = i;
@@ -698,11 +700,11 @@
intrenable(vd->pci->intl, viointerrupt, vd, vd->pci->tbdf, name);
coherence();
- vd->cfg->status |= DriverOk;
for(i = 0; i < vd->nqueue; i++){
vd->cfg->queuesel = i;
vd->cfg->queueenable = 1;
}
+ vd->cfg->status |= DriverOk;
return 1;
}