Merge tag 'pci-v6.10-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci
[linux-2.6-block.git] / drivers / pci / access.c
index 6449056b57dd3032b0a1fbd991f4248be0801d84..30f031de9cfe8c879a702a534d985bf8204f57a2 100644 (file)
@@ -36,10 +36,13 @@ DEFINE_RAW_SPINLOCK(pci_lock);
 int noinline pci_bus_read_config_##size \
        (struct pci_bus *bus, unsigned int devfn, int pos, type *value) \
 {                                                                      \
-       int res;                                                        \
        unsigned long flags;                                            \
        u32 data = 0;                                                   \
-       if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER;       \
+       int res;                                                        \
+                                                                       \
+       if (PCI_##size##_BAD)                                           \
+               return PCIBIOS_BAD_REGISTER_NUMBER;                     \
+                                                                       \
        pci_lock_config(flags);                                         \
        res = bus->ops->read(bus, devfn, pos, len, &data);              \
        if (res)                                                        \
@@ -47,6 +50,7 @@ int noinline pci_bus_read_config_##size \
        else                                                            \
                *value = (type)data;                                    \
        pci_unlock_config(flags);                                       \
+                                                                       \
        return res;                                                     \
 }
 
@@ -54,12 +58,16 @@ int noinline pci_bus_read_config_##size \
 int noinline pci_bus_write_config_##size \
        (struct pci_bus *bus, unsigned int devfn, int pos, type value)  \
 {                                                                      \
-       int res;                                                        \
        unsigned long flags;                                            \
-       if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER;       \
+       int res;                                                        \
+                                                                       \
+       if (PCI_##size##_BAD)                                           \
+               return PCIBIOS_BAD_REGISTER_NUMBER;                     \
+                                                                       \
        pci_lock_config(flags);                                         \
        res = bus->ops->write(bus, devfn, pos, len, value);             \
        pci_unlock_config(flags);                                       \
+                                                                       \
        return res;                                                     \
 }
 
@@ -216,24 +224,27 @@ static noinline void pci_wait_cfg(struct pci_dev *dev)
 }
 
 /* Returns 0 on success, negative values indicate error. */
-#define PCI_USER_READ_CONFIG(size, type)                                       \
+#define PCI_USER_READ_CONFIG(size, type)                               \
 int pci_user_read_config_##size                                                \
        (struct pci_dev *dev, int pos, type *val)                       \
 {                                                                      \
-       int ret = PCIBIOS_SUCCESSFUL;                                   \
        u32 data = -1;                                                  \
+       int ret;                                                        \
+                                                                       \
        if (PCI_##size##_BAD)                                           \
                return -EINVAL;                                         \
-       raw_spin_lock_irq(&pci_lock);                           \
+                                                                       \
+       raw_spin_lock_irq(&pci_lock);                                   \
        if (unlikely(dev->block_cfg_access))                            \
                pci_wait_cfg(dev);                                      \
        ret = dev->bus->ops->read(dev->bus, dev->devfn,                 \
-                                       pos, sizeof(type), &data);      \
-       raw_spin_unlock_irq(&pci_lock);                         \
+                                 pos, sizeof(type), &data);            \
+       raw_spin_unlock_irq(&pci_lock);                                 \
        if (ret)                                                        \
                PCI_SET_ERROR_RESPONSE(val);                            \
        else                                                            \
                *val = (type)data;                                      \
+                                                                       \
        return pcibios_err_to_errno(ret);                               \
 }                                                                      \
 EXPORT_SYMBOL_GPL(pci_user_read_config_##size);
@@ -243,15 +254,18 @@ EXPORT_SYMBOL_GPL(pci_user_read_config_##size);
 int pci_user_write_config_##size                                       \
        (struct pci_dev *dev, int pos, type val)                        \
 {                                                                      \
-       int ret = PCIBIOS_SUCCESSFUL;                                   \
+       int ret;                                                        \
+                                                                       \
        if (PCI_##size##_BAD)                                           \
                return -EINVAL;                                         \
-       raw_spin_lock_irq(&pci_lock);                           \
+                                                                       \
+       raw_spin_lock_irq(&pci_lock);                                   \
        if (unlikely(dev->block_cfg_access))                            \
                pci_wait_cfg(dev);                                      \
        ret = dev->bus->ops->write(dev->bus, dev->devfn,                \
-                                       pos, sizeof(type), val);        \
-       raw_spin_unlock_irq(&pci_lock);                         \
+                                  pos, sizeof(type), val);             \
+       raw_spin_unlock_irq(&pci_lock);                                 \
+                                                                       \
        return pcibios_err_to_errno(ret);                               \
 }                                                                      \
 EXPORT_SYMBOL_GPL(pci_user_write_config_##size);
@@ -275,6 +289,8 @@ void pci_cfg_access_lock(struct pci_dev *dev)
 {
        might_sleep();
 
+       lock_map_acquire(&dev->cfg_access_lock);
+
        raw_spin_lock_irq(&pci_lock);
        if (dev->block_cfg_access)
                pci_wait_cfg(dev);
@@ -329,6 +345,8 @@ void pci_cfg_access_unlock(struct pci_dev *dev)
        raw_spin_unlock_irqrestore(&pci_lock, flags);
 
        wake_up_all(&pci_cfg_wait);
+
+       lock_map_release(&dev->cfg_access_lock);
 }
 EXPORT_SYMBOL_GPL(pci_cfg_access_unlock);