Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 9 Mar 2009 08:18:40 +0000 (UTC)
From:      Robert Noland <rnoland@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r189568 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb dev/pci
Message-ID:  <200903090818.n298Ie9S014684@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rnoland
Date: Mon Mar  9 08:18:40 2009
New Revision: 189568
URL: http://svn.freebsd.org/changeset/base/189568

Log:
  Merge r189285
  
  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.

Modified:
  stable/7/sys/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)
  stable/7/sys/dev/ath/ath_hal/   (props changed)
  stable/7/sys/dev/cxgb/   (props changed)
  stable/7/sys/dev/pci/pci.c
  stable/7/sys/dev/pci/pcireg.h

Modified: stable/7/sys/dev/pci/pci.c
==============================================================================
--- stable/7/sys/dev/pci/pci.c	Mon Mar  9 08:17:46 2009	(r189567)
+++ stable/7/sys/dev/pci/pci.c	Mon Mar  9 08:18:40 2009	(r189568)
@@ -2845,6 +2845,8 @@ pci_setup_intr(device_t dev, device_t ch
 			}
 			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,
@@ -2899,6 +2901,8 @@ pci_teardown_intr(device_t dev, device_t
 			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)

Modified: stable/7/sys/dev/pci/pcireg.h
==============================================================================
--- stable/7/sys/dev/pci/pcireg.h	Mon Mar  9 08:17:46 2009	(r189567)
+++ stable/7/sys/dev/pci/pcireg.h	Mon Mar  9 08:18:40 2009	(r189568)
@@ -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



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