[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [linux-2.6.18-xen] pciback: Fix SRIOV VF passthru
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1267204545 0 # Node ID 693c40564c8de65e32f48168bd8733918f661d7e # Parent efae51e0fa91a9ef3f0497dcba19e7ade60397c5 pciback: Fix SRIOV VF passthru Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> --- drivers/xen/pciback/conf_space_header.c | 57 +++++++++++++++++++------------- 1 files changed, 34 insertions(+), 23 deletions(-) diff -r efae51e0fa91 -r 693c40564c8d drivers/xen/pciback/conf_space_header.c --- a/drivers/xen/pciback/conf_space_header.c Wed Feb 24 11:05:02 2010 +0000 +++ b/drivers/xen/pciback/conf_space_header.c Fri Feb 26 17:15:45 2010 +0000 @@ -73,17 +73,7 @@ static int rom_write(struct pci_dev *dev /* A write to obtain the length must happen as a 32-bit write. * This does not (yet) support writing individual bytes */ - if (value == ~PCI_ROM_ADDRESS_ENABLE) - bar->which = 1; - else { - u32 tmpval; - pci_read_config_dword(dev, offset, &tmpval); - if (tmpval != bar->val && value == bar->val) { - /* Allow restoration of bar value. */ - pci_write_config_dword(dev, offset, bar->val); - } - bar->which = 0; - } + bar->which = (value == ~PCI_ROM_ADDRESS_ENABLE); /* Do we need to support enabling/disabling the rom address here? */ @@ -107,17 +97,7 @@ static int bar_write(struct pci_dev *dev /* A write to obtain the length must happen as a 32-bit write. * This does not (yet) support writing individual bytes */ - if (value == ~0) - bar->which = 1; - else { - u32 tmpval; - pci_read_config_dword(dev, offset, &tmpval); - if (tmpval != bar->val && value == bar->val) { - /* Allow restoration of bar value. */ - pci_write_config_dword(dev, offset, bar->val); - } - bar->which = 0; - } + bar->which = (value == ~0); return 0; } @@ -125,6 +105,10 @@ static int bar_read(struct pci_dev *dev, static int bar_read(struct pci_dev *dev, int offset, u32 * value, void *data) { struct pci_bar_info *bar = data; + int idx = (offset - 0x10) >> 2; + + if (idx > PCI_STD_RESOURCE_END ) + idx = PCI_ROM_RESOURCE; if (unlikely(!bar)) { printk(KERN_WARNING "pciback: driver data not found for %s\n", @@ -132,7 +116,8 @@ static int bar_read(struct pci_dev *dev, return XEN_PCI_ERR_op_failed; } - *value = bar->which ? bar->len_val : bar->val; + *value = bar->which ? ~(pci_resource_len(dev, idx)-1) : pci_resource_start(dev, idx); + *value |= pci_resource_flags(dev, idx) & 0xf; return 0; } @@ -193,6 +178,22 @@ static int interrupt_read(struct pci_dev return 0; } +static int vendor_read(struct pci_dev *dev, int offset, u16 * value, + void *data) +{ + *value = dev->vendor; + + return 0; +} + +static int device_read(struct pci_dev *dev, int offset, u16 * value, + void *data) +{ + *value = dev->device; + + return 0; +} + static int bist_write(struct pci_dev *dev, int offset, u8 value, void *data) { u8 cur_value; @@ -211,6 +212,16 @@ static int bist_write(struct pci_dev *de } static const struct config_field header_common[] = { + { + .offset = PCI_VENDOR_ID, + .size = 2, + .u.w.read = vendor_read + }, + { + .offset = PCI_DEVICE_ID, + .size = 2, + .u.w.read = device_read + }, { .offset = PCI_COMMAND, .size = 2, _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog |
Lists.xenproject.org is hosted with RackSpace, monitoring our |