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));
 }
 
