Skip to content

Commit

Permalink
[ACPI] S3 Suspend to RAM: interrupt resume fix
Browse files Browse the repository at this point in the history
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=3469

Signed-off-by: David Shaohua Li <shaohua.li@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
  • Loading branch information
David Shaohua Li authored and Len Brown committed Jul 12, 2005
1 parent 5ae947e commit 362b06b
Showing 1 changed file with 14 additions and 22 deletions.
36 changes: 14 additions & 22 deletions drivers/acpi/pci_link.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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,
};


Expand Down

0 comments on commit 362b06b

Please sign in to comment.