@@ -333,6 +333,30 @@ static int synaptics_identify(struct psmouse *psmouse)
return -1;
}
+struct fw_version {
+ unsigned char major;
+ unsigned char minor;
+};
+
+static const struct fw_version safe_fw_list[] = {
+ {8, 1}, /* safe for SYN_QUE_EXT_MIN_COORDS */
+ { }
+};
+
+static bool synaptics_is_safe_fw(struct psmouse *psmouse)
+{
+ struct synaptics_data *priv = psmouse->private;
+ int i;
+
+ for (i = 0; safe_fw_list[i].major; i++) {
+ if (safe_fw_list[i].major == SYN_ID_MAJOR(priv->identity) &&
+ safe_fw_list[i].minor == SYN_ID_MINOR(priv->identity))
+ return true;
+ }
+
+ return false;
+}
+
/*
* Read touchpad resolution and maximum reported coordinates
* Resolution is left zero if touchpad does not support the query
@@ -368,7 +392,8 @@ static int synaptics_resolution(struct psmouse *psmouse)
}
}
- if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 7 &&
+ if ((SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 7 ||
+ synaptics_is_safe_fw(psmouse)) &&
SYN_CAP_MIN_DIMENSIONS(priv->ext_cap_0c)) {
if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_MIN_COORDS, resp)) {
psmouse_warn(psmouse,