From: Vojtech Pavlik <vojtech@suse.cz>
To: torvalds@osdl.org, vojtech@ucw.cz, linux-kernel@vger.kernel.org
Subject: [PATCH 17/44] Automatically decide how strictly to check the protocol in synaptics
Date: Tue, 16 Mar 2004 15:19:37 +0100 [thread overview]
Message-ID: <10794467772247@twilight.ucw.cz> (raw)
In-Reply-To: <10794467772503@twilight.ucw.cz>
You can pull this changeset from:
bk://kernel.bkbits.net/vojtech/input
===================================================================
ChangeSet@1.1608.54.3, 2004-03-03 00:29:09-05:00, dtor_core@ameritech.net
Input: Switch between strict/relaxed synaptics protocol checks based on
data in the first full data packet. Having strict checks helps
getting rid of bad data after losing sync, but not all harware
implements strict protocol.
synaptics.c | 53 +++++++++++++++++++++++++++++++++++++++++------------
synaptics.h | 7 +++++++
2 files changed, 48 insertions(+), 12 deletions(-)
===================================================================
diff -Nru a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
--- a/drivers/input/mouse/synaptics.c Tue Mar 16 13:19:03 2004
+++ b/drivers/input/mouse/synaptics.c Tue Mar 16 13:19:03 2004
@@ -435,6 +435,8 @@
goto init_fail;
}
+ priv->pkt_type = SYN_MODEL_NEWABS(priv->model_id) ? SYN_NEWABS : SYN_OLDABS;
+
if (SYN_CAP_EXTENDED(priv->capabilities) && SYN_CAP_PASS_THROUGH(priv->capabilities))
synaptics_pt_create(psmouse);
@@ -602,19 +604,42 @@
input_sync(dev);
}
-static int synaptics_validate_byte(struct psmouse *psmouse)
+static int synaptics_validate_byte(unsigned char packet[], int idx, unsigned char pkt_type)
{
- static unsigned char newabs_mask[] = { 0xC0, 0x00, 0x00, 0xC0, 0x00 };
- static unsigned char newabs_rslt[] = { 0x80, 0x00, 0x00, 0xC0, 0x00 };
- static unsigned char oldabs_mask[] = { 0xC0, 0x60, 0x00, 0xC0, 0x60 };
- static unsigned char oldabs_rslt[] = { 0xC0, 0x00, 0x00, 0x80, 0x00 };
- struct synaptics_data *priv = psmouse->private;
- int idx = psmouse->pktcnt - 1;
+ static unsigned char newabs_mask[] = { 0xC8, 0x00, 0x00, 0xC8, 0x00 };
+ static unsigned char newabs_rel_mask[] = { 0xC0, 0x00, 0x00, 0xC0, 0x00 };
+ static unsigned char newabs_rslt[] = { 0x80, 0x00, 0x00, 0xC0, 0x00 };
+ static unsigned char oldabs_mask[] = { 0xC0, 0x60, 0x00, 0xC0, 0x60 };
+ static unsigned char oldabs_rslt[] = { 0xC0, 0x00, 0x00, 0x80, 0x00 };
+
+ switch (pkt_type) {
+ case SYN_NEWABS:
+ case SYN_NEWABS_RELAXED:
+ return (packet[idx] & newabs_rel_mask[idx]) == newabs_rslt[idx];
+
+ case SYN_NEWABS_STRICT:
+ return (packet[idx] & newabs_mask[idx]) == newabs_rslt[idx];
+
+ case SYN_OLDABS:
+ return (packet[idx] & oldabs_mask[idx]) == oldabs_rslt[idx];
- if (SYN_MODEL_NEWABS(priv->model_id))
- return (psmouse->packet[idx] & newabs_mask[idx]) == newabs_rslt[idx];
- else
- return (psmouse->packet[idx] & oldabs_mask[idx]) == oldabs_rslt[idx];
+ default:
+ printk(KERN_ERR "synaptics: unknown packet type %d\n", pkt_type);
+ return 0;
+ }
+}
+
+static unsigned char synaptics_detect_pkt_type(struct psmouse *psmouse)
+{
+ int i;
+
+ for (i = 0; i < 5; i++)
+ if (!synaptics_validate_byte(psmouse->packet, i, SYN_NEWABS_STRICT)) {
+ printk(KERN_INFO "synaptics: using relaxed packet validation\n");
+ return SYN_NEWABS_RELAXED;
+ }
+
+ return SYN_NEWABS_STRICT;
}
void synaptics_process_byte(struct psmouse *psmouse, struct pt_regs *regs)
@@ -630,13 +655,17 @@
printk(KERN_NOTICE "Synaptics driver resynced.\n");
}
+ if (unlikely(priv->pkt_type == SYN_NEWABS))
+ priv->pkt_type = synaptics_detect_pkt_type(psmouse);
+
if (psmouse->ptport && psmouse->ptport->serio.dev && synaptics_is_pt_packet(psmouse->packet))
synaptics_pass_pt_packet(&psmouse->ptport->serio, psmouse->packet);
else
synaptics_process_packet(psmouse);
psmouse->pktcnt = 0;
- } else if (psmouse->pktcnt && !synaptics_validate_byte(psmouse)) {
+ } else if (psmouse->pktcnt &&
+ !synaptics_validate_byte(psmouse->packet, psmouse->pktcnt - 1, priv->pkt_type)) {
printk(KERN_WARNING "Synaptics driver lost sync at byte %d\n", psmouse->pktcnt);
psmouse->pktcnt = 0;
if (++priv->out_of_sync == psmouse_resetafter) {
diff -Nru a/drivers/input/mouse/synaptics.h b/drivers/input/mouse/synaptics.h
--- a/drivers/input/mouse/synaptics.h Tue Mar 16 13:19:03 2004
+++ b/drivers/input/mouse/synaptics.h Tue Mar 16 13:19:03 2004
@@ -70,6 +70,12 @@
#define SYN_PS_SET_MODE2 0x14
#define SYN_PS_CLIENT_CMD 0x28
+/* synaptics packet types */
+#define SYN_NEWABS 0
+#define SYN_NEWABS_STRICT 1
+#define SYN_NEWABS_RELAXED 2
+#define SYN_OLDABS 3
+
/*
* A structure to describe the state of the touchpad hardware (buttons and pad)
*/
@@ -103,6 +109,7 @@
/* Data for normal processing */
unsigned int out_of_sync; /* # of packets out of sync */
int old_w; /* Previous w value */
+ unsigned char pkt_type; /* packet type - old, new, etc */
};
#endif /* _SYNAPTICS_H */
next prev parent reply other threads:[~2004-03-16 14:38 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-03-16 14:17 [44 patches] Input update Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 1/44] Fix hid-core for devices with #usages < #values Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 2/44] Add ioctl to hiddev to set multiple usages at once Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 3/44] HID quirk (badpad) for Saitek Rumblepad Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 4/44] HID quirk for another A4Tech dual-wheel mouse Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 5/44] .ko module names for acm.txt Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 6/44] Fix sunkbd.c to work with serport Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 7/44] request_region() instead of check_region() in ns558.c Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 8/44] Don't reinitialize scancode map after sleep in atkbd.c Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 9/44] Support for scroll wheel on Office keyboards Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 10/44] Make enabling IBM RapidAccess special features its own option Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 11/44] Convert HP/PARISC Lasi/Dino PS/2 driver to a serio driver Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 12/44] Credit to Panagiotis Issaris for Graphire 3 support Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 13/44] Remove the obsolete busmouse.c helper driver Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 14/44] Fix a warning in i8042.c Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 15/44] Add serio entries for LK keyboards Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 16/44] Whitespace in atkbd.c Vojtech Pavlik
2004-03-16 14:19 ` Vojtech Pavlik [this message]
2004-03-16 14:19 ` [PATCH 18/44] Whitespace fixes in psmouse.c Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 19/44] Don't fail when mouse reset doesn't work Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 20/44] Add module_parm_array() helper Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 21/44] Convert joystick drivers to new module parameters Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 22/44] Create __obsolete_setup() macro to warn users about obsolete kernel params Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 23/44] Use __obsolete_setup() in input drivers to warn " Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 24/44] Workaround i8042 chips with broken MUX mode Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 25/44] Only reprobe on PS/2 HW when the HW sends 0xaa Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 26/44] Always assume i8042 is in XLATE mode Vojtech Pavlik
2004-03-16 14:19 ` [PATCH 27/44] Add DEC LK201/LK401 keyboard support Vojtech Pavlik
2004-03-17 19:08 ` Maciej W. Rozycki
2004-03-16 18:46 ` [PATCH 9/44] Support for scroll wheel on Office keyboards Aubin LaBrosse
2004-03-19 14:00 ` Vojtech Pavlik
2004-03-27 19:55 ` Andries Brouwer
2004-03-30 13:09 ` Pavel Machek
2004-03-30 17:05 ` Paul Wagland
2004-03-30 18:55 ` Vojtech Pavlik
2004-03-30 18:53 ` Vojtech Pavlik
2004-05-29 14:36 ` Vojtech Pavlik
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=10794467772247@twilight.ucw.cz \
--to=vojtech@suse.cz \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@osdl.org \
--cc=vojtech@ucw.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox