From e8259861da3a55c03491904e4d11c5c15b7577c5 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sun, 11 Jul 2021 21:49:15 +0000 Subject: [PATCH] virtio: set FeaturesOk flag after feature negotiation, and enable queues before DriverOk flag --- sys/src/9/pc/ethervirtio10.c | 11 +++++++---- sys/src/9/pc/sdvirtio10.c | 4 +++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/sys/src/9/pc/ethervirtio10.c b/sys/src/9/pc/ethervirtio10.c index 03108cad9..2f38f8605 100644 --- a/sys/src/9/pc/ethervirtio10.c +++ b/sys/src/9/pc/ethervirtio10.c @@ -40,7 +40,7 @@ enum { Sacknowledge = 1, Sdriver = 2, Sdriverok = 4, - Sfeatureok = 8, + Sfeaturesok = 8, Sfailed = 128, /* flags in Qnetstatus */ @@ -466,14 +466,15 @@ attach(Ether* edev) } 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 */ @@ -692,6 +693,8 @@ pciprobe(void) cfg->drvfeatsel = 0; cfg->drvfeat = c->feat[0] & (Fmac|Fctrlvq|Fctrlrx); + cfg->status |= Sfeaturesok; + for(i=0; iqueue); i++){ cfg->queuesel = i; n = cfg->queuesize; diff --git a/sys/src/9/pc/sdvirtio10.c b/sys/src/9/pc/sdvirtio10.c index df25df87a..e678e3383 100644 --- a/sys/src/9/pc/sdvirtio10.c +++ b/sys/src/9/pc/sdvirtio10.c @@ -46,6 +46,7 @@ enum { enum { Acknowledge = 1, Driver = 2, + FeaturesOk = 8, DriverOk = 4, Failed = 0x80, }; @@ -335,6 +336,7 @@ Baddev: cfg->drvfeat = vd->feat[1] & 1; cfg->drvfeatsel = 0; cfg->drvfeat = 0; + cfg->status |= FeaturesOk; for(i=0; iqueue); i++){ cfg->queuesel = i; @@ -698,11 +700,11 @@ vioenable(SDev *sd) 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; } -- 2.44.0