rk: revert to v3.10
[firefly-linux-kernel-4.4.55.git] / drivers / xen / xen-pciback / conf_space_header.c
index a5bb81a600f766bcab25d3617bff5cd72eb8de83..3daf862d739da94719c6378f924ca4c2cf3719c1 100644 (file)
@@ -9,10 +9,6 @@
 #include "pciback.h"
 #include "conf_space.h"
 
-struct pci_cmd_info {
-       u16 val;
-};
-
 struct pci_bar_info {
        u32 val;
        u32 len_val;
@@ -22,35 +18,21 @@ struct pci_bar_info {
 #define is_enable_cmd(value) ((value)&(PCI_COMMAND_MEMORY|PCI_COMMAND_IO))
 #define is_master_cmd(value) ((value)&PCI_COMMAND_MASTER)
 
-/* Bits guests are allowed to control in permissive mode. */
-#define PCI_COMMAND_GUEST (PCI_COMMAND_MASTER|PCI_COMMAND_SPECIAL| \
-                          PCI_COMMAND_INVALIDATE|PCI_COMMAND_VGA_PALETTE| \
-                          PCI_COMMAND_WAIT|PCI_COMMAND_FAST_BACK)
-
-static void *command_init(struct pci_dev *dev, int offset)
-{
-       struct pci_cmd_info *cmd = kmalloc(sizeof(*cmd), GFP_KERNEL);
-       int err;
-
-       if (!cmd)
-               return ERR_PTR(-ENOMEM);
-
-       err = pci_read_config_word(dev, PCI_COMMAND, &cmd->val);
-       if (err) {
-               kfree(cmd);
-               return ERR_PTR(err);
-       }
-
-       return cmd;
-}
-
 static int command_read(struct pci_dev *dev, int offset, u16 *value, void *data)
 {
-       int ret = pci_read_config_word(dev, offset, value);
-       const struct pci_cmd_info *cmd = data;
-
-       *value &= PCI_COMMAND_GUEST;
-       *value |= cmd->val & ~PCI_COMMAND_GUEST;
+       int i;
+       int ret;
+
+       ret = xen_pcibk_read_config_word(dev, offset, value, data);
+       if (!pci_is_enabled(dev))
+               return ret;
+
+       for (i = 0; i < PCI_ROM_RESOURCE; i++) {
+               if (dev->resource[i].flags & IORESOURCE_IO)
+                       *value |= PCI_COMMAND_IO;
+               if (dev->resource[i].flags & IORESOURCE_MEM)
+                       *value |= PCI_COMMAND_MEMORY;
+       }
 
        return ret;
 }
@@ -59,8 +41,6 @@ static int command_write(struct pci_dev *dev, int offset, u16 value, void *data)
 {
        struct xen_pcibk_dev_data *dev_data;
        int err;
-       u16 val;
-       struct pci_cmd_info *cmd = data;
 
        dev_data = pci_get_drvdata(dev);
        if (!pci_is_enabled(dev) && is_enable_cmd(value)) {
@@ -103,19 +83,6 @@ static int command_write(struct pci_dev *dev, int offset, u16 value, void *data)
                }
        }
 
-       cmd->val = value;
-
-       if (!permissive && (!dev_data || !dev_data->permissive))
-               return 0;
-
-       /* Only allow the guest to control certain bits. */
-       err = pci_read_config_word(dev, offset, &val);
-       if (err || val == value)
-               return err;
-
-       value &= PCI_COMMAND_GUEST;
-       value |= val & ~PCI_COMMAND_GUEST;
-
        return pci_write_config_word(dev, offset, value);
 }
 
@@ -315,8 +282,6 @@ static const struct config_field header_common[] = {
        {
         .offset    = PCI_COMMAND,
         .size      = 2,
-        .init      = command_init,
-        .release   = bar_release,
         .u.w.read  = command_read,
         .u.w.write = command_write,
        },