Re: 2.6.12-rc1-mm3: box hangs solid on resume from disk while resuming device drivers

From: Rafael J. Wysocki
Date: Fri Mar 25 2005 - 06:31:28 EST


Hi,

On Friday, 25 of March 2005 09:21, Andrew Morton wrote:
>
> ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.12-rc1/2.6.12-rc1-mm3/
>
> - Mainly a bunch of fixes relative to 2.6.12-rc1-mm2.

First, rmmod works again (thanks ;-)).

> - Again, we'd like people who have had recent DRM and USB resume problems to
> test and report, please.

My box is still hanged solid on resume (swsusp) by the drivers:

ohci_hcd
ehci_hcd
yenta_socket

possibly others, too. To avoid this, I had to revert the following patch from
the Len's tree:

diff -Naru a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
--- a/drivers/acpi/pci_link.c 2005-03-24 04:57:27 -08:00
+++ b/drivers/acpi/pci_link.c 2005-03-24 04:57:27 -08:00
@@ -72,10 +72,12 @@
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 @@

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 @@
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 @@

static struct sysdev_class irqrouter_sysdev_class = {
set_kset_name("irqrouter"),
- .resume = irqrouter_resume,
+ .suspend = irqrouter_suspend,
};


# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
# 2005/03/18 16:30:29-05:00 len.brown@xxxxxxxxx
# [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=3469
#
# Signed-off-by: David Shaohua Li <shaohua.li@xxxxxxxxx>
# Signed-off-by: Len Brown <len.brown@xxxxxxxxx>
#
# drivers/acpi/pci_link.c
# 2005/03/02 22:23:50-05:00 len.brown@xxxxxxxxx +14 -22
# Delete PCI Interrupt Link .resume method
#

Greets,
Rafael


--
- Would you tell me, please, which way I ought to go from here?
- That depends a good deal on where you want to get to.
-- Lewis Carroll "Alice's Adventures in Wonderland"
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/