Index: sys/external/bsd/drm2/pci/drm_pci.c =================================================================== RCS file: /cvsroot/src/sys/external/bsd/drm2/pci/drm_pci.c,v retrieving revision 1.17 diff -p -u -r1.17 drm_pci.c --- sys/external/bsd/drm2/pci/drm_pci.c 1 Jun 2017 02:45:12 -0000 1.17 +++ sys/external/bsd/drm2/pci/drm_pci.c 16 Jul 2017 09:01:23 -0000 @@ -244,10 +244,11 @@ drm_pci_irq_install(struct drm_device *d if (dev->pdev->msi_enabled) { irq_cookie->intr_handles = dev->pdev->intr_handles; - dev->pdev->intr_handles = NULL; } else { - if (pci_intx_alloc(pa, &irq_cookie->intr_handles)) + if (pci_intx_alloc(pa, &irq_cookie->intr_handles)) { + kmem_free(irq_cookie, sizeof(*irq_cookie)); return -ENOENT; + } } intrstr = pci_intr_string(pa->pa_pc, irq_cookie->intr_handles[0], @@ -257,6 +258,9 @@ drm_pci_irq_install(struct drm_device *d if (irq_cookie->ih_cookie == NULL) { aprint_error_dev(dev->dev, "couldn't establish interrupt at %s (%s)\n", intrstr, name); + if (!dev->pdev->msi_enabled) + pci_intr_release(pa->pa_pc, irq_cookie->intr_handles, 1); + kmem_free(irq_cookie, sizeof(*irq_cookie)); return -ENOENT; } @@ -271,7 +275,8 @@ drm_pci_irq_uninstall(struct drm_device const struct pci_attach_args *pa = drm_pci_attach_args(dev); pci_intr_disestablish(pa->pa_pc, cookie->ih_cookie); - pci_intr_release(pa->pa_pc, cookie->intr_handles, 1); + if (!dev->pdev->msi_enabled) + pci_intr_release(pa->pa_pc, cookie->intr_handles, 1); kmem_free(cookie, sizeof(*cookie)); } .