Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Oct 2014 01:49:08 +0000 (UTC)
From:      Pyun YongHyeon <yongari@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r273362 - stable/9/sys/dev/pci
Message-ID:  <201410210149.s9L1n8gT035760@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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,



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201410210149.s9L1n8gT035760>