summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/pci/pci.c4
-rw-r--r--sys/dev/pci/pcireg.h1
2 files changed, 5 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)
diff --git a/sys/dev/pci/pcireg.h b/sys/dev/pci/pcireg.h
index 0b83584..04e0f35 100644
--- a/sys/dev/pci/pcireg.h
+++ b/sys/dev/pci/pcireg.h
@@ -60,6 +60,7 @@
#define PCIM_CMD_PERRESPEN 0x0040
#define PCIM_CMD_SERRESPEN 0x0100
#define PCIM_CMD_BACKTOBACK 0x0200
+#define PCIM_CMD_INTxDIS 0x0400
#define PCIR_STATUS 0x06
#define PCIM_STATUS_CAPPRESENT 0x0010
#define PCIM_STATUS_66CAPABLE 0x0020
OpenPOWER on IntegriCloud