Re: elantech touchpad driver miss-recognising logitech mice

From: Arjan Opmeer
Date: Thu Feb 05 2009 - 00:05:42 EST


On Fri, Jan 30, 2009 at 03:23:30PM -0800, Andrew Morton wrote:
>
> blah.

Very eloquent and very motivational...

> Please propose a final patch for me to stash away, lest the issue get
> forgotten about.

How about you stash away my original proposal? Andy has proof that it works.
Some of the debug messages can always be removed later when no other
regressions surface and people find the current detection routine too
verbose.

From: Arjan Opmeer <arjan@xxxxxxxxxx>

Some Logitech mice react to the magic knock like an Elantech touchpad would.
This leads to those mice being misdetected as Elantech touchpads. Add a
version query to elantech_detect() to distinguish the two.

Signed-off-by: Arjan Opmeer <arjan@xxxxxxxxxx>
---
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
index b9a25d5..5abc5f7 100644
--- a/drivers/input/mouse/elantech.c
+++ b/drivers/input/mouse/elantech.c
@@ -556,6 +556,22 @@ int elantech_detect(struct psmouse *psmouse, int set_properties)
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 *psmouse)
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];

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