PCI: create common pcibios_err_to_errno
authorAlex Williamson <alex.williamson@redhat.com>
Mon, 11 Jun 2012 05:27:33 +0000 (05:27 +0000)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 12 Jun 2012 15:21:42 +0000 (09:21 -0600)
For returning errors out to non-PCI code.  Re-name xen's version.

Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/xen/xen-pciback/conf_space.c
include/linux/pci.h

index 30d7be0..46ae0f9 100644 (file)
@@ -124,7 +124,7 @@ static inline u32 merge_value(u32 val, u32 new_val, u32 new_val_mask,
        return val;
 }
 
-static int pcibios_err_to_errno(int err)
+static int xen_pcibios_err_to_errno(int err)
 {
        switch (err) {
        case PCIBIOS_SUCCESSFUL:
@@ -202,7 +202,7 @@ out:
                       pci_name(dev), size, offset, value);
 
        *ret_val = value;
-       return pcibios_err_to_errno(err);
+       return xen_pcibios_err_to_errno(err);
 }
 
 int xen_pcibk_config_write(struct pci_dev *dev, int offset, int size, u32 value)
@@ -290,7 +290,7 @@ int xen_pcibk_config_write(struct pci_dev *dev, int offset, int size, u32 value)
                }
        }
 
-       return pcibios_err_to_errno(err);
+       return xen_pcibios_err_to_errno(err);
 }
 
 void xen_pcibk_config_free_dyn_fields(struct pci_dev *dev)
index 9d04599..a691f62 100644 (file)
@@ -474,6 +474,32 @@ static inline bool pci_dev_msi_enabled(struct pci_dev *pci_dev) { return false;
 #define PCIBIOS_SET_FAILED             0x88
 #define PCIBIOS_BUFFER_TOO_SMALL       0x89
 
+/*
+ * Translate above to generic errno for passing back through non-pci.
+ */
+static inline int pcibios_err_to_errno(int err)
+{
+       if (err <= PCIBIOS_SUCCESSFUL)
+               return err; /* Assume already errno */
+
+       switch (err) {
+       case PCIBIOS_FUNC_NOT_SUPPORTED:
+               return -ENOENT;
+       case PCIBIOS_BAD_VENDOR_ID:
+               return -EINVAL;
+       case PCIBIOS_DEVICE_NOT_FOUND:
+               return -ENODEV;
+       case PCIBIOS_BAD_REGISTER_NUMBER:
+               return -EFAULT;
+       case PCIBIOS_SET_FAILED:
+               return -EIO;
+       case PCIBIOS_BUFFER_TOO_SMALL:
+               return -ENOSPC;
+       }
+
+       return -ENOTTY;
+}
+
 /* Low-level architecture-dependent routines */
 
 struct pci_ops {