diff options
| author | Bjorn Helgaas <bhelgaas@google.com> | 2023-02-22 13:47:24 -0600 |
|---|---|---|
| committer | Bjorn Helgaas <bhelgaas@google.com> | 2023-02-22 13:47:24 -0600 |
| commit | a17613298f5df5bfaf66b403ed082da93abc05ce (patch) | |
| tree | 8ace633d7fa4147dbbd699e796a961e72c4a874c /drivers/pci/pci.c | |
| parent | f900e4441c657d976bf875fc83e7a3b8e4d4b45a (diff) | |
| parent | 6fffbc7ae1373e10b989afe23a9eeb9c49fe15c3 (diff) | |
Merge branch 'pci/enumeration'
- Implement portdrv .shutdown() method that calls service driver .remove()
methods (which disables interrupt generation as required by .shutdown()),
but doesn't disable bus mastering (which hangs on Loongson LS7A because
of a hardware defect) (Huacai Chen)
- Prevent MRRS increases for devices below Loongson LS7A to avoid hardware
limitations (Huacai Chen)
- Ignore devices with a firmware (DT/ACPI) node that says the device is
disabled (Rob Herring)
* pci/enumeration:
PCI: Honor firmware's device disabled status
PCI: loongson: Add more devices that need MRRS quirk
PCI: loongson: Prevent LS7A MRRS increases
PCI/portdrv: Prevent LS7A Bus Master clearing on shutdown
Diffstat (limited to 'drivers/pci/pci.c')
| -rw-r--r-- | drivers/pci/pci.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index fba95486caaf..9d98bba72af9 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -6033,6 +6033,7 @@ int pcie_set_readrq(struct pci_dev *dev, int rq) { u16 v; int ret; + struct pci_host_bridge *bridge = pci_find_host_bridge(dev->bus); if (rq < 128 || rq > 4096 || !is_power_of_2(rq)) return -EINVAL; @@ -6051,6 +6052,15 @@ int pcie_set_readrq(struct pci_dev *dev, int rq) v = (ffs(rq) - 8) << 12; + if (bridge->no_inc_mrrs) { + int max_mrrs = pcie_get_readrq(dev); + + if (rq > max_mrrs) { + pci_info(dev, "can't set Max_Read_Request_Size to %d; max is %d\n", rq, max_mrrs); + return -EINVAL; + } + } + ret = pcie_capability_clear_and_set_word(dev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_READRQ, v); |
