]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
PCI: cpqphp: Use PCI_POSSIBLE_ERROR() to check config reads
authorweiyufeng <weiyufeng@kylinos.cn>
Tue, 6 Aug 2024 06:50:50 +0000 (14:50 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Dec 2024 09:59:35 +0000 (10:59 +0100)
[ Upstream commit a18a025c2fb5fbf2d1d0606ea0d7441ac90e9c39 ]

When config pci_ops.read() can detect failed PCI transactions, the data
returned to the CPU is PCI_ERROR_RESPONSE (~0 or 0xffffffff).

Obviously a successful PCI config read may *also* return that data if a
config register happens to contain ~0, so it doesn't definitively indicate
an error unless we know the register cannot contain ~0.

Use PCI_POSSIBLE_ERROR() to check the response we get when we read data
from hardware.  This unifies PCI error response checking and makes error
checks consistent and easier to find.

Link: https://lore.kernel.org/r/b12005c0d57bb9d4c8b486724d078b7bd92f8321.1637243717.git.naveennaidu479@gmail.com
Signed-off-by: Naveen Naidu <naveennaidu479@gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Stable-dep-of: e2226dbc4a49 ("PCI: cpqphp: Fix PCIBIOS_* return value confusion")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/pci/hotplug/cpqphp_pci.c

index 1b2b3f3b648bca17d637a7b265ad502b91134452..a20875da4ec70f9e6f116f410981daa20ec906ff 100644 (file)
@@ -138,7 +138,7 @@ static int PCI_RefinedAccessConfig(struct pci_bus *bus, unsigned int devfn, u8 o
 
        if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &vendID) == -1)
                return -1;
-       if (vendID == 0xffffffff)
+       if (PCI_POSSIBLE_ERROR(vendID))
                return -1;
        return pci_bus_read_config_dword(bus, devfn, offset, value);
 }
@@ -251,7 +251,7 @@ static int PCI_GetBusDevHelper(struct controller *ctrl, u8 *bus_num, u8 *dev_num
                        *dev_num = tdevice;
                        ctrl->pci_bus->number = tbus;
                        pci_bus_read_config_dword(ctrl->pci_bus, *dev_num, PCI_VENDOR_ID, &work);
-                       if (!nobridge || (work == 0xffffffff))
+                       if (!nobridge || PCI_POSSIBLE_ERROR(work))
                                return 0;
 
                        dbg("bus_num %d devfn %d\n", *bus_num, *dev_num);