2008-12-27 09:08:12

by Alexander E. Patrakov

[permalink] [raw]
Subject: 2.6.28 thinks that my PS/2 mouse is a touchpad

Hello.

Linux-2.6.28, as compiled by Arch Linux developers, thinks that my PS/2 mouse (a cheap M-BT58 optical wheel mouse by Logitech) is actually a touchpad. This makes it unusable. Adding the "proto=imps" parameter to the psmouse module helps.

Dmesg output and config are attached.

--
Alexander E. Patrakov


Attachments:
config (90.60 kB)
dmesg.txt (59.30 kB)
Download all attachments

2008-12-28 06:22:08

by Andrew Morton

[permalink] [raw]
Subject: Re: 2.6.28 thinks that my PS/2 mouse is a touchpad

On Sat, 27 Dec 2008 14:06:29 +0500 "Alexander E. Patrakov" <[email protected]> wrote:

> Linux-2.6.28, as compiled by Arch Linux developers, thinks that my PS/2 mouse (a cheap M-BT58 optical wheel mouse by Logitech) is actually a touchpad. This makes it unusable. Adding the "proto=imps" parameter to the psmouse module helps.
>
> Dmesg output and config are attached.

(cc linux-input)

2008-12-29 19:18:22

by Arjan Opmeer

[permalink] [raw]
Subject: Re: 2.6.28 thinks that my PS/2 mouse is a touchpad

On Sat, Dec 27, 2008 at 02:06:29PM +0500, Alexander E. Patrakov wrote:
>
> Linux-2.6.28, as compiled by Arch Linux developers, thinks that my PS/2
> mouse (a cheap M-BT58 optical wheel mouse by Logitech) is actually a
> touchpad. This makes it unusable. Adding the "proto=imps" parameter to
> the psmouse module helps.

> CONFIG_MOUSE_PS2_ELANTECH=y

Oh dear. The first victim of this driver... :(

As we can see below the mouse gets detected as an Elantech touchpad. This
means that it reacts to the Elantech magic knock with the exact same
response we expect from a real Elantech touchpad.

I see no way to prevent this from happening.

> elantech.c: Elantech version query result 0x00, 0x01, 0x64.
> elantech.c: assuming hardware version 1, firmware version 0.100
> elantech.c: Synaptics capabilities query result 0x00, 0x02, 0x64.

However, all version query results I have seen from Elantech touchpads have
a non-zero first byte and a zero second byte. So we could test for that to
prevent this mouse from being detected as a touchpad.

Dmitry, do you think something like this is sufficient?

--- elantech.c.ORIG 2008-12-29 19:35:01.000000000 +0100
+++ elantech.c.NEW 2008-12-29 19:38:59.000000000 +0100
@@ -618,6 +618,10 @@ int elantech_init(struct psmouse *psmous
}
pr_info("elantech.c: Elantech version query result 0x%02x, 0x%02x, 0x%02x.\n",
param[0], param[1], param[2]);
+ if (param[0] == 0 || param[1] != 0) {
+ pr_info("elantech.c: Probably not a real Elantech touchpad. Aborting.\n");
+ goto init_fail;
+ }
etd->fw_version_maj = param[0];
etd->fw_version_min = param[2];


Arjan

2008-12-30 06:04:41

by Alexander E. Patrakov

[permalink] [raw]
Subject: Re: 2.6.28 thinks that my PS/2 mouse is a touchpad

Arjan Opmeer wrote:
> On Sat, Dec 27, 2008 at 02:06:29PM +0500, Alexander E. Patrakov wrote:
>> elantech.c: Elantech version query result 0x00, 0x01, 0x64.
>> elantech.c: assuming hardware version 1, firmware version 0.100
>> elantech.c: Synaptics capabilities query result 0x00, 0x02, 0x64.
>
> However, all version query results I have seen from Elantech touchpads have
> a non-zero first byte and a zero second byte. So we could test for that to
> prevent this mouse from being detected as a touchpad.
>
> Dmitry, do you think something like this is sufficient?
>
> --- elantech.c.ORIG 2008-12-29 19:35:01.000000000 +0100
> +++ elantech.c.NEW 2008-12-29 19:38:59.000000000 +0100
> @@ -618,6 +618,10 @@ int elantech_init(struct psmouse *psmous
> }
> pr_info("elantech.c: Elantech version query result 0x%02x, 0x%02x, 0x%02x.\n",
> param[0], param[1], param[2]);
> + if (param[0] == 0 || param[1] != 0) {
> + pr_info("elantech.c: Probably not a real Elantech touchpad. Aborting.\n");
> + goto init_fail;
> + }
> etd->fw_version_maj = param[0];
> etd->fw_version_min = param[2];

This is still slightly wrong. The mouse does work, but is misnamed in
the dmesg output and in /proc/bus/input/devices:

psmouse serio1: ID: 10 00 64<6>elantech.c: Elantech version query result
0x00, 0x01, 0x64.
elantech.c: Probably not a real Elantech touchpad. Aborting.
input: ImExPS/2 Elantech Touchpad as /class/input/input8

I: Bus=0011 Vendor=0002 Product=0006 Version=0000
N: Name="ImExPS/2 Elantech Touchpad"
P: Phys=isa0060/serio1/input0
S: Sysfs=/class/input/input8
U: Uniq=
H: Handlers=mouse1 event6
B: EV=7
B: KEY=1f0000 0 0 0 0 0 0 0 0
B: REL=143

--
Alexander E. Patrakov

2008-12-30 09:15:44

by Dmitry Torokhov

[permalink] [raw]
Subject: Re: 2.6.28 thinks that my PS/2 mouse is a touchpad

On Monday 29 December 2008 22:03:35 Alexander E. Patrakov wrote:
> Arjan Opmeer wrote:
> > On Sat, Dec 27, 2008 at 02:06:29PM +0500, Alexander E. Patrakov wrote:
> >> elantech.c: Elantech version query result 0x00, 0x01, 0x64.
> >> elantech.c: assuming hardware version 1, firmware version 0.100
> >> elantech.c: Synaptics capabilities query result 0x00, 0x02, 0x64.
> >
> > However, all version query results I have seen from Elantech touchpads
> > have a non-zero first byte and a zero second byte. So we could test for
> > that to prevent this mouse from being detected as a touchpad.
> >
> > Dmitry, do you think something like this is sufficient?
> >
> > --- elantech.c.ORIG 2008-12-29 19:35:01.000000000 +0100
> > +++ elantech.c.NEW 2008-12-29 19:38:59.000000000 +0100
> > @@ -618,6 +618,10 @@ int elantech_init(struct psmouse *psmous
> > }
> > pr_info("elantech.c: Elantech version query result 0x%02x, 0x%02x,
> > 0x%02x.\n", param[0], param[1], param[2]);
> > + if (param[0] == 0 || param[1] != 0) {
> > + pr_info("elantech.c: Probably not a real Elantech touchpad.
> > Aborting.\n"); + goto init_fail;
> > + }
> > etd->fw_version_maj = param[0];
> > etd->fw_version_min = param[2];
>
> This is still slightly wrong. The mouse does work, but is misnamed in
> the dmesg output and in /proc/bus/input/devices:
>
> psmouse serio1: ID: 10 00 64<6>elantech.c: Elantech version query result
> 0x00, 0x01, 0x64.
> elantech.c: Probably not a real Elantech touchpad. Aborting.
> input: ImExPS/2 Elantech Touchpad as /class/input/input8
>

Yeah, elantech_init() is too late, we need to do something in
elantech_detect()... What did /proc/bus/input/devices show before
2.6.28? Logitech, right? Maybe we need to pull part of Logitech check (number
of buttons for example) from logips2pp.c. We'd need to test with real elantech
touchpads too though.

--
Dmitry

2008-12-30 14:29:20

by Arjan Opmeer

[permalink] [raw]
Subject: Re: 2.6.28 thinks that my PS/2 mouse is a touchpad

On Tue, Dec 30, 2008 at 01:15:01AM -0800, Dmitry Torokhov wrote:
> On Monday 29 December 2008 22:03:35 Alexander E. Patrakov wrote:
> >
> > This is still slightly wrong. The mouse does work, but is misnamed in
> > the dmesg output and in /proc/bus/input/devices:
> >
> > psmouse serio1: ID: 10 00 64<6>elantech.c: Elantech version query result
> > 0x00, 0x01, 0x64.
> > elantech.c: Probably not a real Elantech touchpad. Aborting.
> > input: ImExPS/2 Elantech Touchpad as /class/input/input8
>
> Yeah, elantech_init() is too late, we need to do something in
> elantech_detect()...

Well, we could also move that Elantech version query and test for sane
values into elantech_detect(). However, because we have no private data
structure at that time it would mean we have to do the same query again in
elantech_init() to store fw_version_maj and fw_version_min.

> Maybe we need to pull part of Logitech check (number of buttons for
> example) from logips2pp.c.

I think the solution above is simpler although maybe not as pretty... :)


Arjan

2009-01-02 00:08:19

by Denys Vlasenko

[permalink] [raw]
Subject: Re: 2.6.28 thinks that my PS/2 mouse is a touchpad

On Monday 29 December 2008 19:56, Arjan Opmeer wrote:
> On Sat, Dec 27, 2008 at 02:06:29PM +0500, Alexander E. Patrakov wrote:
> >
> > Linux-2.6.28, as compiled by Arch Linux developers, thinks that my PS/2
> > mouse (a cheap M-BT58 optical wheel mouse by Logitech) is actually a
> > touchpad. This makes it unusable. Adding the "proto=imps" parameter to
> > the psmouse module helps.
>
> > CONFIG_MOUSE_PS2_ELANTECH=y
>
> Oh dear. The first victim of this driver... :(
>
> As we can see below the mouse gets detected as an Elantech touchpad. This
> means that it reacts to the Elantech magic knock with the exact same
> response we expect from a real Elantech touchpad.

I am affected too. I am getting:

2009-01-01_23:15:29.11109 kern.info: input: AT Translated Set 2 keyboard as /class/input/input2
2009-01-01_23:15:29.11113 kern.info: elantech.c: Elantech version query result 0x00, 0x01, 0x64.
2009-01-01_23:15:29.11118 kern.info: elantech.c: assuming hardware version 1, firmware version 0.100
2009-01-01_23:15:29.11123 kern.info: elantech.c: Synaptics capabilities query result 0x00, 0x02, 0x64.
2009-01-01_23:15:29.11128 kern.info: input: ETPS/2 Elantech Touchpad as /class/input/input3

and then on attempts to use the mouse:

...
2009-01-01_23:16:08.68831 kern.warn: psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
2009-01-01_23:16:08.70630 kern.warn: psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
2009-01-01_23:16:08.71730 kern.warn: psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
2009-01-01_23:16:08.72918 kern.notice: psmouse.c: Touchpad at isa0060/serio1/input0 - driver resynched.
2009-01-01_23:16:08.74732 kern.warn: psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
2009-01-01_23:16:08.75832 kern.warn: psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
2009-01-01_23:16:08.76932 kern.warn: psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
2009-01-01_23:16:08.78732 kern.warn: psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
2009-01-01_23:16:08.79832 kern.warn: psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
2009-01-01_23:16:08.79844 kern.notice: psmouse.c: issuing reconnect request
...

On old kernel it was:

2008-10-30_07:37:01.41484 kern.info: input: ImExPS/2 Logitech Wheel Mouse as /class/input/input3

--
vda

2009-01-02 18:37:29

by Arjan Opmeer

[permalink] [raw]
Subject: Re: 2.6.28 thinks that my PS/2 mouse is a touchpad

On Fri, Jan 02, 2009 at 01:07:54AM +0100, Denys Vlasenko wrote:
> On Monday 29 December 2008 19:56, Arjan Opmeer wrote:
> > On Sat, Dec 27, 2008 at 02:06:29PM +0500, Alexander E. Patrakov wrote:
> > >
> > > Linux-2.6.28, as compiled by Arch Linux developers, thinks that my
> > > PS/2 mouse (a cheap M-BT58 optical wheel mouse by Logitech) is
> > > actually a touchpad. This makes it unusable. Adding the "proto=imps"
> > > parameter to the psmouse module helps.
> >
> > > CONFIG_MOUSE_PS2_ELANTECH=y
> >
> > Oh dear. The first victim of this driver... :(
> >
> > As we can see below the mouse gets detected as an Elantech touchpad.
> > This means that it reacts to the Elantech magic knock with the exact
> > same response we expect from a real Elantech touchpad.
>
> I am affected too. I am getting:
>
> input: AT Translated Set 2 keyboard as /class/input/input2
> elantech.c: Elantech version query result 0x00, 0x01, 0x64.
> elantech.c: assuming hardware version 1, firmware version 0.100
> elantech.c: Synaptics capabilities query result 0x00, 0x02, 0x64.
> input: ETPS/2 Elantech Touchpad as /class/input/input3

So how about we try to solve it by duplicating the version query in
elantech_detect() and check for sane values. Dmitry, do you think something
like this would be acceptable?


Arjan

--- elantech.c.ORIG 2008-12-29 19:35:01.000000000 +0100
+++ elantech.c.NEW2 2009-01-02 19:26:01.000000000 +0100
@@ -556,6 +556,22 @@ int elantech_detect(struct psmouse *psmo
return -1;
}

+ /*
+ * There are Logitech mice that react to the magic knock exactly
+ * like an Elantech touchpad would, so do a version query here to
+ * try to distinguish the two
+ */
+ if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) {
+ pr_err("elantech.c: failed to query firmware version.\n");
+ return -1;
+ }
+ pr_info("elantech.c: Elantech version query result 0x%02x, 0x%02x, 0x%02x.\n",
+ param[0], param[1], param[2]);
+ if (param[0] == 0 || param[1] != 0) {
+ pr_info("elantech.c: Probably not a real Elantech touchpad. Aborting.\n");
+ return -1;
+ }
+
if (set_properties) {
psmouse->vendor = "Elantech";
psmouse->name = "Touchpad";
@@ -610,14 +626,12 @@ int elantech_init(struct psmouse *psmous
etd->parity[i] = etd->parity[i & (i - 1)] ^ 1;

/*
- * Find out what version hardware this is
+ * Do the version query again so we can store the result
*/
if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) {
pr_err("elantech.c: failed to query firmware version.\n");
goto init_fail;
}
- pr_info("elantech.c: Elantech version query result 0x%02x, 0x%02x, 0x%02x.\n",
- param[0], param[1], param[2]);
etd->fw_version_maj = param[0];
etd->fw_version_min = param[2];