PCI: Fix return value from pci_user_{read,write}_config_*()
authorGavin Shan <gwshan@linux.vnet.ibm.com>
Wed, 21 May 2014 05:23:30 +0000 (15:23 +1000)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 27 May 2014 23:10:16 +0000 (17:10 -0600)
The PCI user-space config accessors pci_user_{read,write}_config_*() return
negative error numbers, which were introduced by commit 34e3207205ef
("PCI: handle positive error codes").  That patch converted all positive
error numbers from platform-specific PCI config accessors to -EINVAL, which
means the callers don't know anything about the specific cause of the
failure.

The patch fixes the issue by converting the positive PCIBIOS_* error values
to generic negative error numbers with pcibios_err_to_errno().

[bhelgaas: changelog]
Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Greg Thelen <gthelen@google.com>
drivers/pci/access.c
include/linux/pci.h

index 7f8b78c08879cf7911fa68db21cfbe5f29394d56..8c148f39e8d76870cc5f8fc1b6be71c4511a3480 100644 (file)
@@ -148,7 +148,7 @@ static noinline void pci_wait_cfg(struct pci_dev *dev)
 int pci_user_read_config_##size                                                \
        (struct pci_dev *dev, int pos, type *val)                       \
 {                                                                      \
-       int ret = 0;                                                    \
+       int ret = PCIBIOS_SUCCESSFUL;                                   \
        u32 data = -1;                                                  \
        if (PCI_##size##_BAD)                                           \
                return -EINVAL;                                         \
@@ -159,9 +159,7 @@ int pci_user_read_config_##size                                             \
                                        pos, sizeof(type), &data);      \
        raw_spin_unlock_irq(&pci_lock);                         \
        *val = (type)data;                                              \
-       if (ret > 0)                                                    \
-               ret = -EINVAL;                                          \
-       return ret;                                                     \
+       return pcibios_err_to_errno(ret);                               \
 }                                                                      \
 EXPORT_SYMBOL_GPL(pci_user_read_config_##size);
 
@@ -170,7 +168,7 @@ EXPORT_SYMBOL_GPL(pci_user_read_config_##size);
 int pci_user_write_config_##size                                       \
        (struct pci_dev *dev, int pos, type val)                        \
 {                                                                      \
-       int ret = -EIO;                                                 \
+       int ret = PCIBIOS_SUCCESSFUL;                                   \
        if (PCI_##size##_BAD)                                           \
                return -EINVAL;                                         \
        raw_spin_lock_irq(&pci_lock);                           \
@@ -179,9 +177,7 @@ int pci_user_write_config_##size                                    \
        ret = dev->bus->ops->write(dev->bus, dev->devfn,                \
                                        pos, sizeof(type), val);        \
        raw_spin_unlock_irq(&pci_lock);                         \
-       if (ret > 0)                                                    \
-               ret = -EINVAL;                                          \
-       return ret;                                                     \
+       return pcibios_err_to_errno(ret);                               \
 }                                                                      \
 EXPORT_SYMBOL_GPL(pci_user_write_config_##size);
 
index 018877b8b4e8bfcd5661e5d130ddb505fb78a765..322335aaa7e11869648eaf09657d6fb2f7393974 100644 (file)
@@ -518,7 +518,7 @@ static inline int pcibios_err_to_errno(int err)
        case PCIBIOS_FUNC_NOT_SUPPORTED:
                return -ENOENT;
        case PCIBIOS_BAD_VENDOR_ID:
-               return -EINVAL;
+               return -ENOTTY;
        case PCIBIOS_DEVICE_NOT_FOUND:
                return -ENODEV;
        case PCIBIOS_BAD_REGISTER_NUMBER:
@@ -529,7 +529,7 @@ static inline int pcibios_err_to_errno(int err)
                return -ENOSPC;
        }
 
-       return -ENOTTY;
+       return -ERANGE;
 }
 
 /* Low-level architecture-dependent routines */