Skip to contentSkip to conversation

elantech: fix for newer hardware versions (v7)

PATCH RESEND Applied Matteo Delfino 2 participants 2 messages Jul 6, 2013 – Jul 7, 2013

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

PATCH RESEND 1/1 elantech: fix for newer hardware versions (v7)

* Fix version recognition in elantech_set_properties

The new hardware reports itself as v7 but the packets' structure is unaltered.

* Fix packet type recognition in elantech_packet_check_v4

The bitmask used for v6 is too wide, only the last three bits of the third byte in a packet (packet[3] & 0x03) are actually used to distinguish between packet types.
Starting from v7, additional information (to be interpreted) is stored in the remaining bits (packets[3] & 0x1c).
In addition, the value stored in (packet[0] & 0x0c) is no longer a constant but contains additional information yet to be deciphered. This change should be backwards compatible with v6 hardware.

Additional-author: Giovanni Frigione <[email protected]>

---
 drivers/input/mouse/elantech.c |   17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)
drivers/input/mouse/elantech.c +9 -8
index e2a9867..1c792c9 100644
@@ -677,18 +677,18 @@ static int elantech_packet_check_v3(struct psmouse *psmouse)
 static int elantech_packet_check_v4(struct psmouse *psmouse)
 {
 	unsigned char *packet = psmouse->packet;
+	unsigned char packet_type = packet[3] & 0x03;
 
-	if ((packet[0] & 0x0c) == 0x04 &&
-	    (packet[3] & 0x1f) == 0x11)
+	switch (packet_type) {
+	case 0:
+		return PACKET_V4_STATUS;
+
+	case 1:
 		return PACKET_V4_HEAD;
 
-	if ((packet[0] & 0x0c) == 0x04 &&
-	    (packet[3] & 0x1f) == 0x12)
+	case 2:
 		return PACKET_V4_MOTION;
-
-	if ((packet[0] & 0x0c) == 0x04 &&
-	    (packet[3] & 0x1f) == 0x10)
-		return PACKET_V4_STATUS;
+	}
 
 	return PACKET_UNKNOWN;
 }
@@ -1226,6 +1226,7 @@ static int elantech_set_properties(struct elantech_data *etd)
 			etd->hw_version = 3;
 			break;
 		case 6:
+		case 7:
 			etd->hw_version = 4;
 			break;
 		default:
Signature · 1 line
1.7.10.4
maintainer Applied
#1 lore raw
Quoted 16 lines · Matteo Delfino

* Fix version recognition in elantech_set_properties

The new hardware reports itself as v7 but the packets' structure is unaltered.

* Fix packet type recognition in elantech_packet_check_v4

The bitmask used for v6 is too wide, only the last three bits of the third byte in a packet (packet[3] & 0x03) are actually used to distinguish between packet types.
Starting from v7, additional information (to be interpreted) is stored in the remaining bits (packets[3] & 0x1c).
In addition, the value stored in (packet[0] & 0x0c) is no longer a constant but contains additional information yet to be deciphered. This change should be backwards compatible with v6 hardware.

Quoted 2 lines

Additional-author: Giovanni Frigione <[email protected]>

Applied, thank you.

Quoted 45 lines
---
 drivers/input/mouse/elantech.c |   17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)
drivers/input/mouse/elantech.c +9 -8
index e2a9867..1c792c9 100644
@@ -677,18 +677,18 @@ static int elantech_packet_check_v3(struct psmouse *psmouse)
 static int elantech_packet_check_v4(struct psmouse *psmouse)
 {
 	unsigned char *packet = psmouse->packet;
+	unsigned char packet_type = packet[3] & 0x03;
 
-	if ((packet[0] & 0x0c) == 0x04 &&
-	    (packet[3] & 0x1f) == 0x11)
+	switch (packet_type) {
+	case 0:
+		return PACKET_V4_STATUS;
+
+	case 1:
 		return PACKET_V4_HEAD;
 
-	if ((packet[0] & 0x0c) == 0x04 &&
-	    (packet[3] & 0x1f) == 0x12)
+	case 2:
 		return PACKET_V4_MOTION;
-
-	if ((packet[0] & 0x0c) == 0x04 &&
-	    (packet[3] & 0x1f) == 0x10)
-		return PACKET_V4_STATUS;
+	}
 
 	return PACKET_UNKNOWN;
 }
@@ -1226,6 +1226,7 @@ static int elantech_set_properties(struct elantech_data *etd)
 			etd->hw_version = 3;
 			break;
 		case 6:
+		case 7:
 			etd->hw_version = 4;
 			break;
 		default:
Signature · 1 line
1.7.10.4
Signature · 1 line
Dmitry