svn commit: r273362 - stable/9/sys/dev/pci

Pyun YongHyeon yongari at FreeBSD.org
Tue Oct 21 01:49:08 UTC 2014


Author: yongari
Date: Tue Oct 21 01:49:07 2014
New Revision: 273362
URL: https://svnweb.freebsd.org/changeset/base/273362

Log:
  MFC r272729,272732:
    Add new quirk PCI_QUIRK_MSI_INTX_BUG to pci(4).
    QAC AR816x/E2200 controller has a silicon bug that MSI interrupt
    does not assert if PCIM_CMD_INTxDIS bit of command register is set.

Modified:
  stable/9/sys/dev/pci/pci.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/dev/   (props changed)

Modified: stable/9/sys/dev/pci/pci.c
==============================================================================
--- stable/9/sys/dev/pci/pci.c	Tue Oct 21 01:48:19 2014	(r273361)
+++ stable/9/sys/dev/pci/pci.c	Tue Oct 21 01:49:07 2014	(r273362)
@@ -209,6 +209,7 @@ struct pci_quirk {
 #define	PCI_QUIRK_ENABLE_MSI_VM	3 /* Older chipset in VM where MSI works */
 #define	PCI_QUIRK_UNMAP_REG	4 /* Ignore PCI map register */
 #define	PCI_QUIRK_DISABLE_MSIX	5 /* MSI-X doesn't work */
+#define	PCI_QUIRK_MSI_INTX_BUG	6 /* PCIM_CMD_INTxDIS disables MSI */
 	int	arg1;
 	int	arg2;
 };
@@ -268,6 +269,15 @@ static const struct pci_quirk pci_quirks
 	 */
 	{ 0x43851002, PCI_QUIRK_UNMAP_REG,	0x14,	0 },
 
+	/*
+	 * Atheros AR8161/AR8162/E2200 ethernet controller has a bug that
+	 * MSI interrupt does not assert if PCIM_CMD_INTxDIS bit of the
+	 * command register is set.
+	 */
+	{ 0x10911969, PCI_QUIRK_MSI_INTX_BUG,	0,	0 },
+	{ 0xE0911969, PCI_QUIRK_MSI_INTX_BUG,	0,	0 },
+	{ 0x10901969, PCI_QUIRK_MSI_INTX_BUG,	0,	0 },
+
 	{ 0 }
 };
 
@@ -3557,8 +3567,14 @@ pci_setup_intr(device_t dev, device_t ch
 			mte->mte_handlers++;
 		}
 
-		/* Make sure that INTx is disabled if we are using MSI/MSIX */
-		pci_set_command_bit(dev, child, PCIM_CMD_INTxDIS);
+		if (!pci_has_quirk(pci_get_devid(dev),
+		    PCI_QUIRK_MSI_INTX_BUG)) {
+			/*
+			 * Make sure that INTx is disabled 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,


More information about the svn-src-all mailing list