From 79dd1a60c7055021ae09d1ae47f0d64438e9dc3f Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 12 Oct 2023 12:04:03 +0000 Subject: [PATCH] Revert "PCI: Add locking to RMW PCI Express Capability Register accessors" This reverts commit f2d7da8fafed03cf468cd399cec7d80fbe4bab11 which is commit 5e70d0acf0825f439079736080350371f8d6699a upstream. It breaks the Android API and is not needed for any Android-specific platforms, so it can be dropped for now. If it is needed in the future, it can be brought back in an abi-safe way. Bug: 161946584 Change-Id: Ic12bc34085f8c7ecea1899f7e14b6ba2a920beba Signed-off-by: Greg Kroah-Hartman --- drivers/pci/access.c | 20 +++----------------- drivers/pci/probe.c | 1 - include/linux/pci.h | 34 ++-------------------------------- 3 files changed, 5 insertions(+), 50 deletions(-) diff --git a/drivers/pci/access.c b/drivers/pci/access.c index 3d20f9c51efe..708c7529647f 100644 --- a/drivers/pci/access.c +++ b/drivers/pci/access.c @@ -491,8 +491,8 @@ int pcie_capability_write_dword(struct pci_dev *dev, int pos, u32 val) } EXPORT_SYMBOL(pcie_capability_write_dword); -int pcie_capability_clear_and_set_word_unlocked(struct pci_dev *dev, int pos, - u16 clear, u16 set) +int pcie_capability_clear_and_set_word(struct pci_dev *dev, int pos, + u16 clear, u16 set) { int ret; u16 val; @@ -506,21 +506,7 @@ int pcie_capability_clear_and_set_word_unlocked(struct pci_dev *dev, int pos, return ret; } -EXPORT_SYMBOL(pcie_capability_clear_and_set_word_unlocked); - -int pcie_capability_clear_and_set_word_locked(struct pci_dev *dev, int pos, - u16 clear, u16 set) -{ - unsigned long flags; - int ret; - - spin_lock_irqsave(&dev->pcie_cap_lock, flags); - ret = pcie_capability_clear_and_set_word_unlocked(dev, pos, clear, set); - spin_unlock_irqrestore(&dev->pcie_cap_lock, flags); - - return ret; -} -EXPORT_SYMBOL(pcie_capability_clear_and_set_word_locked); +EXPORT_SYMBOL(pcie_capability_clear_and_set_word); int pcie_capability_clear_and_set_dword(struct pci_dev *dev, int pos, u32 clear, u32 set) diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 0945f50fe94f..7783d381e324 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -2313,7 +2313,6 @@ struct pci_dev *pci_alloc_dev(struct pci_bus *bus) .end = -1, }; - spin_lock_init(&dev->pcie_cap_lock); #ifdef CONFIG_PCI_MSI raw_spin_lock_init(&dev->msi_lock); #endif diff --git a/include/linux/pci.h b/include/linux/pci.h index 0db9c25c48ea..c9328c7fce40 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -467,7 +467,6 @@ struct pci_dev { pci_dev_flags_t dev_flags; atomic_t enable_cnt; /* pci_enable_device has been called */ - spinlock_t pcie_cap_lock; /* Protects RMW ops in capability accessors */ u32 saved_config_space[16]; /* Config space saved at suspend time */ struct hlist_head saved_cap_space; int rom_attr_enabled; /* Display of ROM attribute enabled? */ @@ -1234,40 +1233,11 @@ int pcie_capability_read_word(struct pci_dev *dev, int pos, u16 *val); int pcie_capability_read_dword(struct pci_dev *dev, int pos, u32 *val); int pcie_capability_write_word(struct pci_dev *dev, int pos, u16 val); int pcie_capability_write_dword(struct pci_dev *dev, int pos, u32 val); -int pcie_capability_clear_and_set_word_unlocked(struct pci_dev *dev, int pos, - u16 clear, u16 set); -int pcie_capability_clear_and_set_word_locked(struct pci_dev *dev, int pos, - u16 clear, u16 set); +int pcie_capability_clear_and_set_word(struct pci_dev *dev, int pos, + u16 clear, u16 set); int pcie_capability_clear_and_set_dword(struct pci_dev *dev, int pos, u32 clear, u32 set); -/** - * pcie_capability_clear_and_set_word - RMW accessor for PCI Express Capability Registers - * @dev: PCI device structure of the PCI Express device - * @pos: PCI Express Capability Register - * @clear: Clear bitmask - * @set: Set bitmask - * - * Perform a Read-Modify-Write (RMW) operation using @clear and @set - * bitmasks on PCI Express Capability Register at @pos. Certain PCI Express - * Capability Registers are accessed concurrently in RMW fashion, hence - * require locking which is handled transparently to the caller. - */ -static inline int pcie_capability_clear_and_set_word(struct pci_dev *dev, - int pos, - u16 clear, u16 set) -{ - switch (pos) { - case PCI_EXP_LNKCTL: - case PCI_EXP_RTCTL: - return pcie_capability_clear_and_set_word_locked(dev, pos, - clear, set); - default: - return pcie_capability_clear_and_set_word_unlocked(dev, pos, - clear, set); - } -} - static inline int pcie_capability_set_word(struct pci_dev *dev, int pos, u16 set) {