summaryrefslogtreecommitdiffstats
path: root/sys/dev/pci/pci.c
diff options
context:
space:
mode:
authorrnoland <rnoland@FreeBSD.org>2009-03-02 19:00:41 +0000
committerrnoland <rnoland@FreeBSD.org>2009-03-02 19:00:41 +0000
commitdac11360f1f6bc0d720a3b9083fe037c2bcb6d74 (patch)
tree34e309d229993a18a27654764c3f79708bdbbf56 /sys/dev/pci/pci.c
parent453adb14fb8994d00a14b341bcf886ca9aad1d9e (diff)
downloadFreeBSD-src-dac11360f1f6bc0d720a3b9083fe037c2bcb6d74.zip
FreeBSD-src-dac11360f1f6bc0d720a3b9083fe037c2bcb6d74.tar.gz
Disable INTx when enabling MSI/MSIX
This addresses interrupt storms that were noticed after enabling MSI in drm. I think this is due to a loose interpretation of the PCI 2.3 spec, which states that a function using MSI is prohibitted from using INTx. It appears that some vendors interpretted that to mean that they should handle it in hardware, while others felt it was the drivers responsibility. This fix will also likely resolve interrupt storm related issues with devices other than drm. Reviewed by: jhb@ MFC after: 3 days
Diffstat (limited to 'sys/dev/pci/pci.c')
-rw-r--r--sys/dev/pci/pci.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 8f1e51f..c3a6441 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -2864,6 +2864,8 @@ pci_setup_intr(device_t dev, device_t child, struct resource *irq, int flags,
}
mte->mte_handlers++;
}
+ /* Disable INTx if we are using MSI/MSIX */
+ pci_set_command_bit(dev, child, PCIM_CMD_INTxDIS);
bad:
if (error) {
(void)bus_generic_teardown_intr(dev, child, irq,
@@ -2918,6 +2920,8 @@ pci_teardown_intr(device_t dev, device_t child, struct resource *irq,
if (mte->mte_handlers == 0)
pci_mask_msix(child, rid - 1);
}
+ /* Restore INTx capability for MSI/MSIX */
+ pci_clear_command_bit(dev, child, PCIM_CMD_INTxDIS);
}
error = bus_generic_teardown_intr(dev, child, irq, cookie);
if (device_get_parent(child) == dev && rid > 0)
OpenPOWER on IntegriCloud