}
 EXPORT_SYMBOL(pcie_capability_write_dword);
 
-int pcie_capability_clear_and_set_word(struct pci_dev *dev, int pos,
-                                      u16 clear, u16 set)
+int pcie_capability_clear_and_set_word_unlocked(struct pci_dev *dev, int pos,
+                                               u16 clear, u16 set)
 {
        int ret;
        u16 val;
 
        return ret;
 }
-EXPORT_SYMBOL(pcie_capability_clear_and_set_word);
+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);
 
 int pcie_capability_clear_and_set_dword(struct pci_dev *dev, int pos,
                                        u32 clear, u32 set)
 
        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? */
 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(struct pci_dev *dev, int pos,
-                                      u16 clear, u16 set);
+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_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)
 {