DF-4538 / fix.diff
--- a/sys/dev/sound/pci/cs4281.c +++ b/sys/dev/sound/pci/cs4281.c @@ -890,10 +890,13 @@ /* power off */ cs4281_power(sc, 3); - bus_release_resource(dev, sc->regtype, sc->regid, sc->reg); - bus_release_resource(dev, SYS_RES_MEMORY, sc->memid, sc->mem); + /* Tear the interrupt handler down before releasing the register + * mappings it reads (shared-IRQ window otherwise touches freed rman + * resources from cs4281_intr -> cs4281_rd(HISR/HDSR)). */ bus_teardown_intr(dev, sc->irq, sc->ih); bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq); + bus_release_resource(dev, sc->regtype, sc->regid, sc->reg); + bus_release_resource(dev, SYS_RES_MEMORY, sc->memid, sc->mem); bus_dma_tag_destroy(sc->parent_dmat); kfree(sc, M_DEVBUF); |