Author: yongari
Date: Tue Oct 21 01:48:19 2014
New Revision: 273361
URL: https://svnweb.freebsd.org/changeset/base/273361

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/10/sys/dev/pci/pci.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/pci/pci.c
==============================================================================
--- stable/10/sys/dev/pci/pci.c Tue Oct 21 01:34:18 2014        (r273360)
+++ stable/10/sys/dev/pci/pci.c Tue Oct 21 01:48:19 2014        (r273361)
@@ -196,6 +196,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;
 };
@@ -255,6 +256,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 }
 };
 
@@ -3624,8 +3634,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,
_______________________________________________
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