xen-pciback: also support disabling of bus-mastering and memory-write-invalidate
authorJan Beulich <JBeulich@suse.com>
Wed, 11 Mar 2015 13:52:00 +0000 (13:52 +0000)
committerDavid Vrabel <david.vrabel@citrix.com>
Mon, 16 Mar 2015 14:51:35 +0000 (14:51 +0000)
It's not clear to me why only the enabling operation got handled so
far.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
drivers/xen/xen-pciback/conf_space_header.c

index 2d7369391472fd572dd3f5b837be3a2625ab4a93..c2260a0456c94fa1f73b6ef96777b4565aaef61e 100644 (file)
@@ -88,9 +88,15 @@ static int command_write(struct pci_dev *dev, int offset, u16 value, void *data)
                        printk(KERN_DEBUG DRV_NAME ": %s: set bus master\n",
                               pci_name(dev));
                pci_set_master(dev);
+       } else if (dev->is_busmaster && !is_master_cmd(value)) {
+               if (unlikely(verbose_request))
+                       printk(KERN_DEBUG DRV_NAME ": %s: clear bus master\n",
+                              pci_name(dev));
+               pci_clear_master(dev);
        }
 
-       if (value & PCI_COMMAND_INVALIDATE) {
+       if (!(cmd->val & PCI_COMMAND_INVALIDATE) &&
+           (value & PCI_COMMAND_INVALIDATE)) {
                if (unlikely(verbose_request))
                        printk(KERN_DEBUG
                               DRV_NAME ": %s: enable memory-write-invalidate\n",
@@ -101,6 +107,13 @@ static int command_write(struct pci_dev *dev, int offset, u16 value, void *data)
                                pci_name(dev), err);
                        value &= ~PCI_COMMAND_INVALIDATE;
                }
+       } else if ((cmd->val & PCI_COMMAND_INVALIDATE) &&
+                  !(value & PCI_COMMAND_INVALIDATE)) {
+               if (unlikely(verbose_request))
+                       printk(KERN_DEBUG
+                              DRV_NAME ": %s: disable memory-write-invalidate\n",
+                              pci_name(dev));
+               pci_clear_mwi(dev);
        }
 
        cmd->val = value;