]> git.lizzy.rs Git - plan9front.git/commitdiff
virtio: set FeaturesOk flag after feature negotiation, and enable queues before Drive...
authorcinap_lenrek <cinap_lenrek@felloff.net>
Sun, 11 Jul 2021 21:49:15 +0000 (21:49 +0000)
committercinap_lenrek <cinap_lenrek@felloff.net>
Sun, 11 Jul 2021 21:49:15 +0000 (21:49 +0000)
sys/src/9/pc/ethervirtio10.c
sys/src/9/pc/sdvirtio10.c

index 03108cad92d9d5559c1300e1f28a30d935192070..2f38f860520902cd9175729f37810de2674ed602 100644 (file)
@@ -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; i<nelem(c->queue); i++){
                        cfg->queuesel = i;
                        n = cfg->queuesize;
index df25df87aea97183239013bb7e06255f7ed6e639..e678e33833efbaa43d5c9e3e5478748b026de7dc 100644 (file)
@@ -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; i<nelem(vd->queue); 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;
 }