return ret;
 }
 
-static void iproc_pcie_paxc_v2_msi_steer(struct iproc_pcie *pcie, u64 msi_addr)
+static void iproc_pcie_paxc_v2_msi_steer(struct iproc_pcie *pcie, u64 msi_addr,
+                                        bool enable)
 {
        u32 val;
 
+       if (!enable) {
+               /*
+                * Disable PAXC MSI steering. All write transfers will be
+                * treated as non-MSI transfers
+                */
+               val = iproc_pcie_read_reg(pcie, IPROC_PCIE_MSI_EN_CFG);
+               val &= ~MSI_ENABLE_CFG;
+               iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_EN_CFG, val);
+               return;
+       }
+
        /*
         * Program bits [43:13] of address of GITS_TRANSLATER register into
         * bits [30:0] of the MSI base address register.  In fact, in all iProc
                        return ret;
                break;
        case IPROC_PCIE_PAXC_V2:
-               iproc_pcie_paxc_v2_msi_steer(pcie, msi_addr);
+               iproc_pcie_paxc_v2_msi_steer(pcie, msi_addr, true);
                break;
        default:
                return -EINVAL;
 }
 EXPORT_SYMBOL(iproc_pcie_remove);
 
+/*
+ * The MSI parsing logic in certain revisions of Broadcom PAXC based root
+ * complex does not work and needs to be disabled
+ */
+static void quirk_paxc_disable_msi_parsing(struct pci_dev *pdev)
+{
+       struct iproc_pcie *pcie = iproc_data(pdev->bus);
+
+       if (pdev->hdr_type == PCI_HEADER_TYPE_BRIDGE)
+               iproc_pcie_paxc_v2_msi_steer(pcie, 0, false);
+}
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0x16f0,
+                       quirk_paxc_disable_msi_parsing);
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0xd802,
+                       quirk_paxc_disable_msi_parsing);
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0xd804,
+                       quirk_paxc_disable_msi_parsing);
+
 MODULE_AUTHOR("Ray Jui <rjui@broadcom.com>");
 MODULE_DESCRIPTION("Broadcom iPROC PCIe common driver");
 MODULE_LICENSE("GPL v2");