diff options
author | Denys Drozdov <denys.drozdov@toradex.com> | 2022-01-10 14:21:09 +0200 |
---|---|---|
committer | Denys Drozdov <denys.drozdov@toradex.com> | 2022-01-10 14:21:09 +0200 |
commit | fdd91487f014d6f66a7db03f135056ada3552f27 (patch) | |
tree | 7cc4ea3c8804027ab1a366726bd89970484b36ea /drivers/pci | |
parent | 905e3a2de88e6fbf0e2c0d3f1ae4217a6f75e126 (diff) | |
parent | 5c088fba39aff97ae9175948356ef3292369671c (diff) |
Merge tag 'v5.4.161' into HEAD
This is the 5.4.161 stable release
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/msi.c | 27 | ||||
-rw-r--r-- | drivers/pci/quirks.c | 6 |
2 files changed, 21 insertions, 12 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index c8bd243717b7..d0cc6c0d74d6 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c @@ -395,18 +395,6 @@ static void free_msi_irqs(struct pci_dev *dev) for (i = 0; i < entry->nvec_used; i++) BUG_ON(irq_has_action(entry->irq + i)); - pci_msi_teardown_msi_irqs(dev); - - list_for_each_entry_safe(entry, tmp, msi_list, list) { - if (entry->msi_attrib.is_msix) { - if (list_is_last(&entry->list, msi_list)) - iounmap(entry->mask_base); - } - - list_del(&entry->list); - free_msi_entry(entry); - } - if (dev->msi_irq_groups) { sysfs_remove_groups(&dev->dev.kobj, dev->msi_irq_groups); msi_attrs = dev->msi_irq_groups[0]->attrs; @@ -422,6 +410,18 @@ static void free_msi_irqs(struct pci_dev *dev) kfree(dev->msi_irq_groups); dev->msi_irq_groups = NULL; } + + pci_msi_teardown_msi_irqs(dev); + + list_for_each_entry_safe(entry, tmp, msi_list, list) { + if (entry->msi_attrib.is_msix) { + if (list_is_last(&entry->list, msi_list)) + iounmap(entry->mask_base); + } + + list_del(&entry->list); + free_msi_entry(entry); + } } static void pci_intx_for_msi(struct pci_dev *dev, int enable) @@ -591,6 +591,9 @@ msi_setup_entry(struct pci_dev *dev, int nvec, struct irq_affinity *affd) goto out; pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control); + /* Lies, damned lies, and MSIs */ + if (dev->dev_flags & PCI_DEV_FLAGS_HAS_MSI_MASKING) + control |= PCI_MSI_FLAGS_MASKBIT; entry->msi_attrib.is_msix = 0; entry->msi_attrib.is_64 = !!(control & PCI_MSI_FLAGS_64BIT); diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 2a5a4f3255e4..1d37394f036d 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -5813,3 +5813,9 @@ static void apex_pci_fixup_class(struct pci_dev *pdev) } DECLARE_PCI_FIXUP_CLASS_HEADER(0x1ac1, 0x089a, PCI_CLASS_NOT_DEFINED, 8, apex_pci_fixup_class); + +static void nvidia_ion_ahci_fixup(struct pci_dev *pdev) +{ + pdev->dev_flags |= PCI_DEV_FLAGS_HAS_MSI_MASKING; +} +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, 0x0ab8, nvidia_ion_ahci_fixup); |