[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [linux-2.6.18-xen] Backport: PCI: fix ARI code to be compatible with mixed ARI/non-ARI



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1236930083 0
# Node ID 44fd32e157f23d0a620b22ec32705fa0f5e04295
# Parent  36d8c23b75745c2bd8dd906eb7d2294df3d966b2
Backport: PCI: fix ARI code to be compatible with mixed ARI/non-ARI
systems

    commit 8113587c2d14d3be2414190845b2e2617c0aa33b
    Author: Zhao, Yu <yu.zhao@xxxxxxxxx>
    Date:   Thu Oct 23 13:15:39 2008 +0800

    PCI: fix ARI code to be compatible with mixed ARI/non-ARI systems

    The original ARI support code has a compatibility problem with
    non-ARI
    devices.  If a device doesn't support ARI, turning on ARI
    forwarding on
    its upper level bridge will cause undefined behavior.

    This fix turns on ARI forwarding only when the subordinate devices
    support it.

    Tested-by: Suresh Siddha <suresh.b.siddha@xxxxxxxxx>
    Signed-off-by: Yu Zhao <yu.zhao@xxxxxxxxx>
    Signed-off-by: Jesse Barnes <jbarnes@xxxxxxxxxxxxxxxx>

Signed-off-by: Yu Zhao <yu.zhao@xxxxxxxxx>
---
 drivers/pci/pci.c |   29 +++++++++++++++++------------
 1 files changed, 17 insertions(+), 12 deletions(-)

diff -r 36d8c23b7574 -r 44fd32e157f2 drivers/pci/pci.c
--- a/drivers/pci/pci.c Fri Mar 13 07:40:54 2009 +0000
+++ b/drivers/pci/pci.c Fri Mar 13 07:41:23 2009 +0000
@@ -638,27 +638,32 @@ void pci_enable_ari(struct pci_dev *dev)
        int pos;
        u32 cap;
        u16 ctrl;
-
-       if (!dev->is_pcie)
+       struct pci_dev *bridge;
+
+       if (dev->devfn)
                return;
 
-       if (dev->pcie_type != PCI_EXP_TYPE_ROOT_PORT &&
-           dev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM)
-               return;
-
-       pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
+       pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI);
        if (!pos)
                return;
 
-       pci_read_config_dword(dev, pos + PCI_EXP_DEVCAP2, &cap);
+       bridge = dev->bus->self;
+       if (!bridge)
+               return;
+
+       pos = pci_find_capability(bridge, PCI_CAP_ID_EXP);
+       if (!pos)
+               return;
+
+       pci_read_config_dword(bridge, pos + PCI_EXP_DEVCAP2, &cap);
        if (!(cap & PCI_EXP_DEVCAP2_ARI))
                return;
 
-       pci_read_config_word(dev, pos + PCI_EXP_DEVCTL2, &ctrl);
+       pci_read_config_word(bridge, pos + PCI_EXP_DEVCTL2, &ctrl);
        ctrl |= PCI_EXP_DEVCTL2_ARI;
-       pci_write_config_word(dev, pos + PCI_EXP_DEVCTL2, ctrl);
-
-       dev->ari_enabled = 1;
+       pci_write_config_word(bridge, pos + PCI_EXP_DEVCTL2, ctrl);
+
+       bridge->ari_enabled = 1;
 }
 
 int

_______________________________________________
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®.