Bläddra i källkod

PCI: create common pcibios_err_to_errno

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>
Alex Williamson 13 år sedan
förälder
incheckning
a696165140
2 ändrade filer med 29 tillägg och 3 borttagningar
  1. 3 3
      drivers/xen/xen-pciback/conf_space.c
  2. 26 0
      include/linux/pci.h

+ 3 - 3
drivers/xen/xen-pciback/conf_space.c

@@ -124,7 +124,7 @@ static inline u32 merge_value(u32 val, u32 new_val, u32 new_val_mask,
 	return val;
 	return val;
 }
 }
 
 
-static int pcibios_err_to_errno(int err)
+static int xen_pcibios_err_to_errno(int err)
 {
 {
 	switch (err) {
 	switch (err) {
 	case PCIBIOS_SUCCESSFUL:
 	case PCIBIOS_SUCCESSFUL:
@@ -202,7 +202,7 @@ out:
 		       pci_name(dev), size, offset, value);
 		       pci_name(dev), size, offset, value);
 
 
 	*ret_val = 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)
 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)
 void xen_pcibk_config_free_dyn_fields(struct pci_dev *dev)

+ 26 - 0
include/linux/pci.h

@@ -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_SET_FAILED		0x88
 #define PCIBIOS_BUFFER_TOO_SMALL	0x89
 #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 */
 /* Low-level architecture-dependent routines */
 
 
 struct pci_ops {
 struct pci_ops {