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
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to