Skip to contentSkip to conversation

trackpoint dead after S3 suspend

DISCUSSION Brian Perkins 4 participants 8 messages Nov 13, 2003 – Nov 24, 2003 6 messages not in the archive

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

Suspend is becoming downright usable on my Thinkpad R32 under 2.6.0-test9, but I still have a showstopper:

http://bugme.osdl.org/show_bug.cgi?id=1279

describes the mouse being dead after resume. Reloading the psmouse modules doesn't work for me either, but I don't get the same error message for some reason.

Looks to me that this bug was improperly filed under "other" instead of ACPI.

Any thoughts?

I also noticed that ACPID stopped receicing events for some, reason.

I have the exact same behavior of S4 susepend, FWIW.

My DSDT, in case it is of interest:
http://throb.netspace.org/~bperk/dsdt-IBMR32.dsl

-------------------------------------------------------
This SF.Net email sponsored by: ApacheCon 2003, 16-19 November in Las Vegas. Learn firsthand the latest developments in Apache, PHP, Perl, XML, Java, MySQL, WebDAV, and more! http://www.apachecon.com/

A message that is not in the archive (sent off-list or not yet received): [email protected]

#2 lore raw

Thus wrote Brian Perkins:

Quoted 11 lines

Suspend is becoming downright usable on my Thinkpad R32 under 2.6.0-test9, but I still have a showstopper:

http://bugme.osdl.org/show_bug.cgi?id=1279

describes the mouse being dead after resume. Reloading the psmouse modules doesn't work for me either, but I don't get the same error message for some reason.

Looks to me that this bug was improperly filed under "other" instead of ACPI.

This may be well related to the input core not supporting suspend / resume.

FYI: my keyboard and touchpad will not work after S3 resume. Reloading atkbd.ko helps for the keyboard, don't know for the touchpad though. Vojtek says it's on his todo-lit, but this particular problem has gone unfixed for more than half a year... see if reloading the whole serio and input core helps, it might.

Also, do a cat /proc/interrupts to see if there are any serio interrupts after resume.

Best regards,

Signature · 9 lines
Karol 'sziwan' Kozimor
sziwan-DETuoxkZsSqrDJvtcaxF/[email protected]


-------------------------------------------------------
This SF.Net email sponsored by: ApacheCon 2003,
16-19 November in Las Vegas. Learn firsthand the latest
developments in Apache, PHP, Perl, XML, Java, MySQL,
WebDAV, and more! http://www.apachecon.com/
#3 lore raw
In reply to a message not in the archive

Hi!

Quoted 11 lines

Suspend is becoming downright usable on my Thinkpad R32 under 2.6.0-test9, but I still have a showstopper:

http://bugme.osdl.org/show_bug.cgi?id=1279

describes the mouse being dead after resume. Reloading the psmouse modules doesn't work for me either, but I don't get the same error message for some reason.

Looks to me that this bug was improperly filed under "other" instead of ACPI.

Its actually input problem. This might help, (untested!).
Pavel

drivers/input/serio/i8042.c +42 -4
@@ -18,6 +18,7 @@
 #include <linux/reboot.h>
 #include <linux/init.h>
 #include <linux/serio.h>
+#include <linux/sysdev.h>
 
 #include <asm/io.h>
 
@@ -398,18 +399,15 @@
  * desired.
  */
 	
-static int __init i8042_controller_init(void)
+static int i8042_controller_init(void)
 {
-
 /*
  * Test the i8042. We need to know if it thinks it's working correctly
  * before doing anything else.
  */
 
 	i8042_flush();
-
 	if (i8042_reset) {
-
 		unsigned char param;
 
 		if (i8042_command(&param, I8042_CMD_CTL_TEST)) {
@@ -783,6 +781,38 @@
 	values->mux = index;
 }
 
+static int i8042_resume_port(struct serio *port)
+{
+	struct serio_dev *dev = port->dev;
+	if (dev) {
+#if 0
+		dev->disconnect(port);
+		dev->connect(port, dev);
+#endif
+		serio_close(port);
+		serio_open(port, dev);
+	}	
+}
+
+static int i8042_resume(struct sys_device *dev)
+{
+	if (i8042_controller_init())
+		printk(KERN_ERR "i8042: resume failed\n");
+	i8042_resume_port(&i8042_aux_port);
+	i8042_resume_port(&i8042_kbd_port);
+	return 0;
+}
+
+static struct sysdev_class kbc_sysclass = {
+	set_kset_name("i8042"),
+	.resume = i8042_resume,
+};
+
+static struct sys_device device_i8042 = {
+	.id	= 0,
+	.cls	= &kbc_sysclass,
+};
+
 int __init i8042_init(void)
 {
 	int i;
@@ -819,6 +849,14 @@
 
 	register_reboot_notifier(&i8042_notifier);
 
+	{
+		int error = sysdev_class_register(&kbc_sysclass);
+		if (!error)
+			error = sys_device_register(&device_i8042);
+		if (error)
+			printk(KERN_CRIT "Unable to register i8042 to driver model\n");
+	}
+
 	return 0;
 }
 
Signature · 9 lines
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]


-------------------------------------------------------
This SF. Net email is sponsored by: GoToMyPC
GoToMyPC is the fast, easy and secure way to access your computer from
any Web browser or wireless device. Click here to Try it Free!
https://www.gotomypc.com/tr/OSDN/AW/Q4_2003/t/g22lp?Target=mm/g22lp.tmpl

A message that is not in the archive (sent off-list or not yet received): 20031116225331.GA206-I/[email protected]

#5 lore raw

Thus wrote Pavel Machek:

Quoted 1 line

Its actually input problem. This might help, (untested!).

This actually makes my keyboard *not* work after any suspend, including the previously-OK S1. Your last patch was better for my system, it seems. Best regards,

Signature · 9 lines
Karol 'sziwan' Kozimor
sziwan-DETuoxkZsSqrDJvtcaxF/[email protected]


-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive?  Does it
help you create better code?  SHARE THE LOVE, and help us help
YOU!  Click Here: http://sourceforge.net/donate/

A message that is not in the archive (sent off-list or not yet received): 20031119145809.GA14399-DETuoxkZsSqrDJvtcaxF/[email protected]

#7 lore raw

Hi!

Quoted 4 lines
Quoted 1 line

Its actually input problem. This might help, (untested!).

This actually makes my keyboard *not* work after any suspend, including the previously-OK S1. Your last patch was better for my system, it seems.

Does at least your mouse work after S1?

If so you probably want to comment out resume of aux port.

Signature · 10 lines
				Pavel
Written on sharp zaurus, because my Velo1 broke. If you have Velo you don't need...



-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive?  Does it
help you create better code?  SHARE THE LOVE, and help us help
YOU!  Click Here: http://sourceforge.net/donate/
#8 lore raw
In reply to a message not in the archive
Quoted 13 lines · Karol Kozimor

Thus wrote Pavel Machek:

Quoted 3 lines

Its actually input problem. This might help, (untested!).

This actually makes my keyboard *not* work after any suspend, including the previously-OK S1. Your last patch was better for my system, it seems. Best regards,

I tried a very naive hack, which gets a step closer to fixing things.
I essentially copied i8042_init to the resume function. It's terribly ugly, and incorrect in a myriad of ways, but the mouse is responding. Unfortunately it appears that the mouse is still not generating interrupts, so the mouse response is slow and jerky. I fooled around quite a bit, but wasn't able to do any better than this.

Probably not very helpful, but I thought I pass this on.

===== i8042.c 1.32 vs 1.34 =====

drivers/input/serio/i8042.c Sun Nov 23 01:33:42 2003 renamed from drivers/input/serio/i8042.c Fri Sep 26 02:56:26 2003 +0 -0
@@ -18,6 +18,7 @@

#include <linux/reboot.h>
#include <linux/init.h>
#include <linux/serio.h>
+#include <linux/sysdev.h>

#include <asm/io.h>

@@ -398,18 +399,15 @@
* desired.
*/

-static int __init i8042_controller_init(void)
+static int i8042_controller_init(void)
{
-
/*
* Test the i8042. We need to know if it thinks it's working correctly
* before doing anything else.
*/

    i8042_flush();
-
    if (i8042_reset) {
-
        unsigned char param;

        if (i8042_command(&param, I8042_CMD_CTL_TEST)) {
@@ -683,7 +681,7 @@
static int __init i8042_port_register(struct i8042_values *values, struct serio *port)
{
    values->exists = 1;
-
+   
    i8042_ctr &= ~values->disable;

    if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
@@ -783,6 +781,83 @@
    values->mux = index;
}

+static int i8042_resume_port(struct serio *port)
+{
+ struct serio_dev *dev = port->dev;
+ if (dev) {
+#if 1
+ dev->disconnect(port);
+ dev->connect(port, dev);
+#endif

+        serio_close(port);
+        serio_open(port, dev);
+        serio_rescan(port);  +    }   +}

+
+static int i8042_resume(struct sys_device *dev)
+{
+ if (i8042_controller_init())
+ printk(KERN_ERR "i8042: resume failed\n");

+    i8042_resume_port(&i8042_aux_port);
+    i8042_resume_port(&i8042_kbd_port);
+    return 0;

+}
+
+static int i8042_resume2(struct sys_device *dev) +{
+
+ int i;
+ printk(KERN_ERR "i8042_resume2 line:%d\n",__LINE__); +
+ if (i8042_platform_init())
+ return -EBUSY;
+ printk(KERN_ERR "i8042_resume2 line:%d\n",__LINE__);
+ i8042_aux_values.irq = I8042_AUX_IRQ;
+ i8042_kbd_values.irq = I8042_KBD_IRQ;
+ printk(KERN_ERR "i8042_resume2 line:%d\n",__LINE__);
+ if (i8042_controller_init())
+ return -ENODEV;
+ printk(KERN_ERR "i8042_resume2 line:%d\n",__LINE__);
+ if (i8042_dumbkbd)
+ i8042_kbd_port.write = NULL;
+ printk(KERN_ERR "i8042_resume2 line:%d\n",__LINE__); +
+ for (i = 0; i < 4; i++)
+ i8042_init_mux_values(i8042_mux_values + i, i8042_mux_port + i, i);
+
+ if (!i8042_nomux && !i8042_check_mux(&i8042_aux_values))
+ for (i = 0; i < 4; i++)
+ i8042_port_register(i8042_mux_values + i, i8042_mux_port + i);
+ else
+ if (!i8042_noaux && !i8042_check_aux(&i8042_aux_values))
+ i8042_port_register(&i8042_aux_values, &i8042_aux_port);
+
+ i8042_port_register(&i8042_kbd_values, &i8042_kbd_port);
+ init_timer(&i8042_timer);
+ printk(KERN_ERR "i8042_resume2 line:%d\n",__LINE__);
+ i8042_timer.function = i8042_timer_func;
+ printk(KERN_ERR "i8042_resume2 line:%d\n",__LINE__);
+ mod_timer(&i8042_timer, jiffies + I8042_POLL_PERIOD);
+ printk(KERN_ERR "i8042_resume2 line:%d\n",__LINE__); +
+ i8042_resume_port(&i8042_aux_port);
+ i8042_resume_port(&i8042_kbd_port);
+
+
+ return 0;
+}
+
+static struct sysdev_class kbc_sysclass = {
+ set_kset_name("i8042"),
+ .resume = i8042_resume2,
+};
+
+static struct sys_device device_i8042 = {
+ .id = 0,
+ .cls = &kbc_sysclass,
+};
+
int __init i8042_init(void)

{
    int i;
@@ -818,6 +893,14 @@
    mod_timer(&i8042_timer, jiffies + I8042_POLL_PERIOD);

    register_reboot_notifier(&i8042_notifier);

+
+ {
+ int error = sysdev_class_register(&kbc_sysclass);
+ if (!error)
+ error = sys_device_register(&device_i8042);
+ if (error)
+ printk(KERN_CRIT "Unable to register i8042 to driver model\n");
+ }

    return 0;
}

-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program. Does SourceForge.net help you be more productive? Does it help you create better code? SHARE THE LOVE, and help us help YOU! Click Here: http://sourceforge.net/donate/

A message that is not in the archive (sent off-list or not yet received): [email protected]

#10 lore raw

Hi!

Quoted 10 lines
Quoted 10 lines
Quoted 3 lines

Its actually input problem. This might help, (untested!).

This actually makes my keyboard *not* work after any suspend, including the previously-OK S1. Your last patch was better for my system, it seems. Best regards,

Quoted 8 lines

I tried a very naive hack, which gets a step closer to fixing things. I essentially copied i8042_init to the resume function. It's terribly ugly, and incorrect in a myriad of ways, but the mouse is responding. Unfortunately it appears that the mouse is still not generating interrupts, so the mouse response is slow and jerky.
I fooled around quite a bit, but wasn't able to do any better than this.

Probably not very helpful, but I thought I pass this on.

Uhmm, yes this is really way too ugly. See l-k to find similar code done less ugly way... (I did it yesterday).
Pavel

Signature · 9 lines
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]


-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive?  Does it
help you create better code?  SHARE THE LOVE, and help us help
YOU!  Click Here: http://sourceforge.net/donate/

A message that is not in the archive (sent off-list or not yet received): [email protected]

A message that is not in the archive (sent off-list or not yet received): [email protected]

#13 lore raw

Hi!

Quoted 7 lines

the patch you posted to l-k still doesn't work.
It wasn't clean, so I had to hand patch it against the current bk tree. I'm not sure if I might have been missing another patch. Anyway, the following patch to i8042.c(instead of yours) causes my keyboard to work.
It's not a major modification, mostly it saves the control register before suspending, and then resetting it on resume.

It is at least whitespace-damaged... [And I do not like the approach... You only reinit single register; is it possible that it breaks on another system where other registers are forgotten over suspend?]

Pavel

Signature · 9 lines
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]


-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive?  Does it
help you create better code?  SHARE THE LOVE, and help us help
YOU!  Click Here: http://sourceforge.net/donate/