]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/pc/sdvirtio.c
sdvirtio: accept multi-queue devices
[plan9front.git] / sys / src / 9 / pc / sdvirtio.c
index ecda117788d2d8f9aea126fa7f10eb298c22e26a..4b422766717ab2ca3b638b691c1401956870d6db 100644 (file)
@@ -4,6 +4,7 @@
 #include "dat.h"
 #include "fns.h"
 #include "io.h"
+#include "../port/pci.h"
 #include "ureg.h"
 #include "../port/error.h"
 
@@ -203,13 +204,15 @@ viopnpdevs(int typ)
                        continue;
                if(p->rid != 0)
                        continue;
+               if((p->mem[0].bar & 1) == 0)
+                       continue;
                if(pcicfgr16(p, 0x2E) != typ)
                        continue;
                if((vd = malloc(sizeof(*vd))) == nil){
                        print("virtio: no memory for Vdev\n");
                        break;
                }
-               vd->port = p->mem[0].bar & ~0x1;
+               vd->port = p->mem[0].bar & ~3;
                if(ioalloc(vd->port, p->mem[0].size, 0, "virtio") < 0){
                        print("virtio: port %lux in use\n", vd->port);
                        free(vd);
@@ -217,6 +220,7 @@ viopnpdevs(int typ)
                }
                vd->typ = typ;
                vd->pci = p;
+               pcienable(p);
 
                /* reset */
                outb(vd->port+Status, 0);
@@ -576,6 +580,7 @@ vioenable(SDev *sd)
        Vdev *vd;
 
        vd = sd->ctlr;
+       pcisetbme(vd->pci);
        snprint(name, sizeof(name), "%s (%s)", sd->name, sd->ifc->name);
        intrenable(vd->pci->intl, viointerrupt, vd, vd->pci->tbdf, name);
        outb(vd->port+Status, inb(vd->port+Status) | DriverOk);
@@ -591,6 +596,7 @@ viodisable(SDev *sd)
        vd = sd->ctlr;
        snprint(name, sizeof(name), "%s (%s)", sd->name, sd->ifc->name);
        intrdisable(vd->pci->intl, viointerrupt, vd, vd->pci->tbdf, name);
+       pciclrbme(vd->pci);
        return 1;
 }
 
@@ -605,7 +611,7 @@ viopnp(void)
 
        id = 'F';
        for(vd =  viopnpdevs(TypBlk); vd; vd = vd->next){
-               if(vd->nqueue != 1)
+               if(vd->nqueue == 0)
                        continue;
 
                if((s = malloc(sizeof(*s))) == nil)