#include "dat.h"
#include "fns.h"
#include "io.h"
+#include "../port/pci.h"
#include "ureg.h"
#include "../port/error.h"
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);
}
vd->typ = typ;
vd->pci = p;
+ pcienable(p);
/* reset */
outb(vd->port+Status, 0);
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);
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;
}
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)