diff options
author | Takashi Iwai <tiwai@suse.de> | 2017-10-05 15:08:57 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2017-10-05 15:08:57 +0200 |
commit | 3a9fce327ff9cabf7f89d3f20616a83af28393da (patch) | |
tree | c516d3e7023e7fe2dc8d4cf60e2ec03f3c9b5958 /drivers/xen/xen-pciback/conf_space_header.c | |
parent | e195a331c4124a6527e5e1b6fbd93a6b4a984d7b (diff) | |
parent | 394ca81cb4c1518e9463fe342fb1ae8a9f46a82d (diff) |
Merge branch 'topic/timer-api' into for-next
Diffstat (limited to 'drivers/xen/xen-pciback/conf_space_header.c')
-rw-r--r-- | drivers/xen/xen-pciback/conf_space_header.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/xen/xen-pciback/conf_space_header.c b/drivers/xen/xen-pciback/conf_space_header.c index 5fbfd9cfb6d6..5b3d57fc82d3 100644 --- a/drivers/xen/xen-pciback/conf_space_header.c +++ b/drivers/xen/xen-pciback/conf_space_header.c @@ -169,6 +169,9 @@ static int rom_write(struct pci_dev *dev, int offset, u32 value, void *data) static int bar_write(struct pci_dev *dev, int offset, u32 value, void *data) { struct pci_bar_info *bar = data; + unsigned int pos = (offset - PCI_BASE_ADDRESS_0) / 4; + const struct resource *res = dev->resource; + u32 mask; if (unlikely(!bar)) { pr_warn(DRV_NAME ": driver data not found for %s\n", @@ -179,7 +182,13 @@ static int bar_write(struct pci_dev *dev, int offset, u32 value, void *data) /* A write to obtain the length must happen as a 32-bit write. * This does not (yet) support writing individual bytes */ - if (value == ~0) + if (res[pos].flags & IORESOURCE_IO) + mask = ~PCI_BASE_ADDRESS_IO_MASK; + else if (pos && (res[pos - 1].flags & IORESOURCE_MEM_64)) + mask = 0; + else + mask = ~PCI_BASE_ADDRESS_MEM_MASK; + if ((value | mask) == ~0U) bar->which = 1; else { u32 tmpval; |