|
@@ -1186,12 +1186,27 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
|
|
|
}
|
|
|
|
|
|
/* Bytes 2 - pktsize should have 0 in the highest bit */
|
|
|
- if ((priv->proto_version < ALPS_PROTO_V5) &&
|
|
|
+ if (priv->proto_version < ALPS_PROTO_V5 &&
|
|
|
psmouse->pktcnt >= 2 && psmouse->pktcnt <= psmouse->pktsize &&
|
|
|
(psmouse->packet[psmouse->pktcnt - 1] & 0x80)) {
|
|
|
psmouse_dbg(psmouse, "refusing packet[%i] = %x\n",
|
|
|
psmouse->pktcnt - 1,
|
|
|
psmouse->packet[psmouse->pktcnt - 1]);
|
|
|
+
|
|
|
+ if (priv->proto_version == ALPS_PROTO_V3 &&
|
|
|
+ psmouse->pktcnt == psmouse->pktsize) {
|
|
|
+ /*
|
|
|
+ * Some Dell boxes, such as Latitude E6440 or E7440
|
|
|
+ * with closed lid, quite often smash last byte of
|
|
|
+ * otherwise valid packet with 0xff. Given that the
|
|
|
+ * next packet is very likely to be valid let's
|
|
|
+ * report PSMOUSE_FULL_PACKET but not process data,
|
|
|
+ * rather than reporting PSMOUSE_BAD_DATA and
|
|
|
+ * filling the logs.
|
|
|
+ */
|
|
|
+ return PSMOUSE_FULL_PACKET;
|
|
|
+ }
|
|
|
+
|
|
|
return PSMOUSE_BAD_DATA;
|
|
|
}
|
|
|
|