[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.