Commit 362b06bb authored by David Shaohua Li's avatar David Shaohua Li Committed by Len Brown

[ACPI] S3 Suspend to RAM: interrupt resume fix

Delete PCI Interrupt Link Device .resume method --
it is the device driver's job to request interrupts,
not the Link's job to remember what the devices want.

This addresses the issue of attempting to run
the ACPI interpreter too early in resume, when
interrupts are still disabled.

http://bugzilla.kernel.org/show_bug.cgi?id=3469Signed-off-by: default avatarDavid Shaohua Li <shaohua.li@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 5ae947ec
......@@ -72,10 +72,12 @@ struct acpi_pci_link_irq {
u8 active; /* Current IRQ */
u8 edge_level; /* All IRQs */
u8 active_high_low; /* All IRQs */
u8 initialized;
u8 resource_type;
u8 possible_count;
u8 possible[ACPI_PCI_LINK_MAX_POSSIBLE];
u8 initialized:1;
u8 suspend_resume:1;
u8 reserved:6;
};
struct acpi_pci_link {
......@@ -530,6 +532,10 @@ static int acpi_pci_link_allocate(
ACPI_FUNCTION_TRACE("acpi_pci_link_allocate");
if (link->irq.suspend_resume) {
acpi_pci_link_set(link, link->irq.active);
link->irq.suspend_resume = 0;
}
if (link->irq.initialized)
return_VALUE(0);
......@@ -713,38 +719,24 @@ acpi_pci_link_add (
return_VALUE(result);
}
static int
acpi_pci_link_resume (
struct acpi_pci_link *link)
{
ACPI_FUNCTION_TRACE("acpi_pci_link_resume");
if (link->irq.active && link->irq.initialized)
return_VALUE(acpi_pci_link_set(link, link->irq.active));
else
return_VALUE(0);
}
static int
irqrouter_resume(
struct sys_device *dev)
irqrouter_suspend(
struct sys_device *dev,
u32 state)
{
struct list_head *node = NULL;
struct acpi_pci_link *link = NULL;
ACPI_FUNCTION_TRACE("irqrouter_resume");
ACPI_FUNCTION_TRACE("irqrouter_suspend");
list_for_each(node, &acpi_link.entries) {
link = list_entry(node, struct acpi_pci_link, node);
if (!link) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid link context\n"));
continue;
}
acpi_pci_link_resume(link);
if (link->irq.active && link->irq.initialized)
link->irq.suspend_resume = 1;
}
return_VALUE(0);
}
......@@ -856,7 +848,7 @@ __setup("acpi_irq_balance", acpi_irq_balance_set);
static struct sysdev_class irqrouter_sysdev_class = {
set_kset_name("irqrouter"),
.resume = irqrouter_resume,
.suspend = irqrouter_suspend,
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment