Messages in this thread Patch in this message | | | Subject | Re: [PATCH] PCI patches for 2.6.10 | Date | Mon, 10 Jan 2005 09:20:57 -0800 | From | Greg KH <> |
| |
ChangeSet 1.1938.447.7, 2004/12/17 13:44:10-08:00, dhowells@redhat.com
[PATCH] PCI: Make pci_set_power_state() check register version
The attached patch makes pci_set_power_state() check the PM register version and ignore non-version 2 registers. Trampling on earlier version PM registers such as are sported by the Promise 20269 IDE card can cause the system to hang.
Signed-Off-By: David Howells <dhowells@redhat.com> Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
drivers/pci/pci.c | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-)
diff -Nru a/drivers/pci/pci.c b/drivers/pci/pci.c --- a/drivers/pci/pci.c 2005-01-10 09:03:28 -08:00 +++ b/drivers/pci/pci.c 2005-01-10 09:03:28 -08:00 @@ -245,7 +245,7 @@ pci_set_power_state(struct pci_dev *dev, int state) { int pm; - u16 pmcsr; + u16 pmcsr, pmc; /* bound the state we're entering */ if (state > 3) state = 3; @@ -265,10 +265,16 @@ /* abort if the device doesn't support PM capabilities */ if (!pm) return -EIO; + pci_read_config_word(dev,pm + PCI_PM_PMC,&pmc); + if ((pmc & PCI_PM_CAP_VER_MASK) != 2) { + printk(KERN_WARNING + "PCI: %s has unsupported PM cap regs version (%u)\n", + dev->slot_name, pmc & PCI_PM_CAP_VER_MASK); + return -EIO; + } + /* check if this device supports the desired state */ if (state == 1 || state == 2) { - u16 pmc; - pci_read_config_word(dev,pm + PCI_PM_PMC,&pmc); if (state == 1 && !(pmc & PCI_PM_CAP_D1)) return -EIO; else if (state == 2 && !(pmc & PCI_PM_CAP_D2)) return -EIO; } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |