diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-12-22 16:16:36 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-12-22 16:16:36 +0100 |
commit | c404fd9d6f46f90e4420d0b268215ef719e25796 (patch) | |
tree | 1298ac4c57324560696217bc710fde3ee8d83261 /sys/src/9/pc/sdvirtio.c | |
parent | e0c221eea6b68c87f89eb073d7204851398fc5d8 (diff) |
sdvirtio: provide enable() and disable() functions so it can be switched off
Diffstat (limited to 'sys/src/9/pc/sdvirtio.c')
-rw-r--r-- | sys/src/9/pc/sdvirtio.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/sys/src/9/pc/sdvirtio.c b/sys/src/9/pc/sdvirtio.c index 17cab9cc3..64c43ddf3 100644 --- a/sys/src/9/pc/sdvirtio.c +++ b/sys/src/9/pc/sdvirtio.c @@ -563,11 +563,29 @@ vioverify(SDunit *u) SDifc sdvirtioifc; -static void -vdevenable(Vdev *vd) +static int +vioenable(SDev *sd) { - intrenable(vd->pci->intl, viointerrupt, vd, vd->pci->tbdf, "virtio"); + char name[32]; + Vdev *vd; + + vd = sd->ctlr; + 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); + return 0; +} + +static int +viodisable(SDev *sd) +{ + char name[32]; + Vdev *vd; + + vd = sd->ctlr; + snprint(name, sizeof(name), "%s (%s)", sd->name, sd->ifc->name); + intrdisable(vd->pci->intl, viointerrupt, vd, vd->pci->tbdf, name); + return 0; } static SDev* @@ -584,8 +602,6 @@ viopnp(void) if(vd->nqueue != 1) continue; - vdevenable(vd); - if((s = malloc(sizeof(*s))) == nil) break; s->ctlr = vd; @@ -630,8 +646,6 @@ viopnp(void) continue; } vd->cfg = cfg; - - vdevenable(vd); if((s = malloc(sizeof(*s))) == nil) break; @@ -654,8 +668,8 @@ SDifc sdvirtioifc = { viopnp, /* pnp */ nil, /* legacy */ - nil, /* enable */ - nil, /* disable */ + vioenable, /* enable */ + viodisable, /* disable */ vioverify, /* verify */ vioonline, /* online */ |