NetBSD-Bugs archive

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

kern/39832: sony vaio vgn t250p does not resume



>Number:         39832
>Category:       kern
>Synopsis:       sony vaio vgn t250p does not resume
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Oct 30 03:05:00 +0000 2008
>Originator:     Christos Zoulas
>Release:        NetBSD 4.99.73
>Organization:
        Belt and Suspenders, Inc.
>Environment:
System: NetBSD shiny.astron.com 4.99.73 NetBSD 4.99.73 (SHINY) #51: Wed Oct 29 
22:15:44 EDT 2008 
christos%shiny.astron.com@localhost:/usr/src/sys/arch/i386/compile/SHINY i386
Architecture: i386
Machine: i386
>Description:
        My vaio suspends but when it resumes it panics with:
        cpu_switchto: switching above IPL_SCHED (%d)
>How-To-Repeat:
        suspend and resume.
>Fix:
The following patch from jmcneill fixes the problem.

Index: acpi_ec.c
===================================================================
RCS file: /cvsroot/src/sys/dev/acpi/acpi_ec.c,v
retrieving revision 1.52
diff -u -p -r1.52 acpi_ec.c
--- acpi_ec.c   3 Jun 2008 15:12:39 -0000       1.52
+++ acpi_ec.c   30 Oct 2008 00:37:26 -0000
@@ -150,6 +150,7 @@ static void acpiec_common_attach(device_
 
 static bool acpiec_resume(device_t PMF_FN_PROTO);
 static bool acpiec_suspend(device_t PMF_FN_PROTO);
+static bool acpiec_shutdown(device_t, int);
 
 static bool acpiec_parse_gpe_package(device_t, ACPI_HANDLE,
     ACPI_HANDLE *, uint8_t *);
@@ -170,7 +171,7 @@ CFATTACH_DECL_NEW(acpiecdt, sizeof(struc
     acpiecdt_match, acpiecdt_attach, NULL, NULL);
 
 static device_t ec_singleton = NULL;
-static bool acpiec_cold = false;
+bool acpiec_cold = false;
 
 static bool
 acpiecdt_find(device_t parent, ACPI_HANDLE *ec_handle,
@@ -380,7 +381,8 @@ acpiec_common_attach(device_t parent, de
 
        ec_singleton = self;
 
-       if (!pmf_device_register(self, acpiec_suspend, acpiec_resume))
+       if (!pmf_device_register1(self,
+           acpiec_suspend, acpiec_resume, acpiec_shutdown))
                aprint_error_dev(self, "couldn't establish power handler\n");
 
        return;
@@ -412,6 +414,14 @@ acpiec_resume(device_t dv PMF_FN_ARGS)
 }
 
 static bool
+acpiec_shutdown(device_t dv, int how)
+{
+       acpiec_cold = true;
+
+       return true;
+}
+
+static bool
 acpiec_parse_gpe_package(device_t self, ACPI_HANDLE ec_handle,
     ACPI_HANDLE *gpe_handle, uint8_t *gpebit)
 {
Index: acpica/OsdSchedule.c
===================================================================
RCS file: /cvsroot/src/sys/dev/acpi/acpica/OsdSchedule.c,v
retrieving revision 1.8
diff -u -p -r1.8 OsdSchedule.c
--- acpica/OsdSchedule.c        31 May 2008 21:38:02 -0000      1.8
+++ acpica/OsdSchedule.c        30 Oct 2008 00:37:26 -0000
@@ -61,6 +61,8 @@ __KERNEL_RCSID(0, "$NetBSD: OsdSchedule.
 #define        _COMPONENT      ACPI_OS_SERVICES
 ACPI_MODULE_NAME("SCHEDULE")
 
+extern bool acpiec_cold;
+
 static kcondvar_t      acpi_osd_sleep_cv;
 static kmutex_t                acpi_osd_sleep_mtx;
 
@@ -163,7 +165,7 @@ AcpiOsSleep(ACPI_INTEGER Milliseconds)
 {
        ACPI_FUNCTION_TRACE(__func__);
 
-       if (cold)
+       if (cold || acpiec_cold)
                DELAY(Milliseconds * 1000);
        else {
                mutex_enter(&acpi_osd_sleep_mtx);
Index: acpica/OsdSynch.c
===================================================================
RCS file: /cvsroot/src/sys/dev/acpi/acpica/OsdSynch.c,v
retrieving revision 1.10
diff -u -p -r1.10 OsdSynch.c
--- acpica/OsdSynch.c   15 Dec 2007 00:39:25 -0000      1.10
+++ acpica/OsdSynch.c   30 Oct 2008 00:37:26 -0000
@@ -85,6 +85,8 @@ MALLOC_DECLARE(M_ACPI);
 #define        _COMPONENT      ACPI_OS_SERVICES
 ACPI_MODULE_NAME("SYNCH")
 
+extern bool acpiec_cold;
+
 /*
  * Simple counting semaphore implemented using a mutex.  This is
  * subsequently used in the OSI code to implement a mutex.  Go figure.
@@ -181,7 +183,7 @@ AcpiOsWaitSemaphore(ACPI_SEMAPHORE Handl
 
        if (as == NULL)
                return_ACPI_STATUS(AE_BAD_PARAMETER);
-       if (cold)
+       if (cold || acpiec_cold)
                return_ACPI_STATUS(AE_OK);
 
        /* A timeout of 0xFFFF means "forever". */



Home | Main Index | Thread Index | Old Index