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

[Xen-devel] [patch] PCI: fix for quirk_e100_interrupt()



From: Ivan Kokshaysky <ink@xxxxxxxxxxxxxxxxxxxx>

PCI: fix for quirk_e100_interrupt()

Check that the e100 is in the D0 power state. If it's not, it won't
respond to MMIO accesses and we end up with master-abort machine
checks on some platforms.

Signed-off-by: Ivan Kokshaysky <ink@xxxxxxxxxxxxxxxxxxxx>
Cc: Auke Kok <auke-jan.h.kok@xxxxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxx>
Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>

--- 

This is a trivial backport of an upstream-linux patch to xen-linux.
It is needed in order for an kexec to work on an HP rx2620 ia64 machine
when the old Donald Becker driver is used for an eepro100 card. The
Intel e100 driver works both with and without this patch.

The original patch is here:
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=e64aeccbeca1f7e22174ca3a12ec35a8f5566515

Without it kexec of linux on the machine in question doesn't work
with either the e100 or eepro100 driver.

I have not been able to test this change on x86 hardware.

Note that kexec isn't actually merged for ia64 xen yet. For the game,
please see http://lists.infradead.org/pipermail/kexec/2008-March/001497.html.
I am working on the HVM problem :-)

Index: linux-2.6.18-xen.hg/drivers/pci/quirks.c
===================================================================
--- linux-2.6.18-xen.hg.orig/drivers/pci/quirks.c       2008-04-01 
18:28:15.000000000 +0900
+++ linux-2.6.18-xen.hg/drivers/pci/quirks.c    2008-04-04 15:13:19.000000000 
+0900
@@ -1528,10 +1528,11 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_N
 
 static void __devinit quirk_e100_interrupt(struct pci_dev *dev)
 {
-       u16 command;
+       u16 command, pmcsr;
        u32 bar;
        u8 __iomem *csr;
        u8 cmd_hi;
+       int pm;
 
        switch (dev->device) {
        /* PCI IDs taken from drivers/net/e100.c */
@@ -1566,6 +1567,17 @@ static void __devinit quirk_e100_interru
        if (!(command & PCI_COMMAND_MEMORY) || !bar)
                return;
 
+        /*
+         * Check that the device is in the D0 power state. If it's not,
+         * there is no point to look any further.
+         */
+        pm = pci_find_capability(dev, PCI_CAP_ID_PM);
+        if (pm) {
+                pci_read_config_word(dev, pm + PCI_PM_CTRL, &pmcsr);
+                if ((pmcsr & PCI_PM_CTRL_STATE_MASK) != PCI_D0)
+                        return;
+        }
+
        csr = ioremap(bar, 8);
        if (!csr) {
                printk(KERN_WARNING "PCI: Can't map %s e100 registers\n",

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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