diff options
author | Jason Gerecke <killertofu@gmail.com> | 2015-10-07 19:54:21 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2015-10-21 07:13:11 -0400 |
commit | 499522c8c015de995aabce3d0f0bf4b9b17f44c3 (patch) | |
tree | 71ee15c9be4502d28e4618e7316ce29299f606a7 | |
parent | e8e88438008375b17561dcc6a22abc24decf04ac (diff) |
HID: wacom: Tie cached HID_DG_CONTACTCOUNT indices to report ID
The cached indicies 'cc_index' and 'cc_value_index' introduced in 1b5d514
are only valid for a single report ID. If a touchscreen has multiple
reports with a HID_DG_CONTACTCOUNT usage, its possible that the values
will not be correct for the report we're handling, resulting in an
incorrect value for 'num_expected'. This has been observed with the Cintiq
Companion 2.
To address this, we store the ID of the report those indicies are valid
for in a new 'cc_report' variable. Before using them to get the expected
contact count, we first check if the ID of the report we're processing
matches 'cc_report'. If it doesn't, we update the indicies to point to
the HID_DG_CONTACTCOUNT usage of the current report (if it has one).
Cc: stable@vger.kernel.org
Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r-- | drivers/hid/wacom_wac.c | 26 | ||||
-rw-r--r-- | drivers/hid/wacom_wac.h | 1 |
2 files changed, 27 insertions, 0 deletions
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c index 0215ab62bb93..9c3b14496c97 100644 --- a/drivers/hid/wacom_wac.c +++ b/drivers/hid/wacom_wac.c | |||
@@ -1628,6 +1628,7 @@ static void wacom_wac_finger_usage_mapping(struct hid_device *hdev, | |||
1628 | wacom_map_usage(input, usage, field, EV_KEY, BTN_TOUCH, 0); | 1628 | wacom_map_usage(input, usage, field, EV_KEY, BTN_TOUCH, 0); |
1629 | break; | 1629 | break; |
1630 | case HID_DG_CONTACTCOUNT: | 1630 | case HID_DG_CONTACTCOUNT: |
1631 | wacom_wac->hid_data.cc_report = field->report->id; | ||
1631 | wacom_wac->hid_data.cc_index = field->index; | 1632 | wacom_wac->hid_data.cc_index = field->index; |
1632 | wacom_wac->hid_data.cc_value_index = usage->usage_index; | 1633 | wacom_wac->hid_data.cc_value_index = usage->usage_index; |
1633 | break; | 1634 | break; |
@@ -1715,6 +1716,31 @@ static void wacom_wac_finger_pre_report(struct hid_device *hdev, | |||
1715 | struct wacom_wac *wacom_wac = &wacom->wacom_wac; | 1716 | struct wacom_wac *wacom_wac = &wacom->wacom_wac; |
1716 | struct hid_data* hid_data = &wacom_wac->hid_data; | 1717 | struct hid_data* hid_data = &wacom_wac->hid_data; |
1717 | 1718 | ||
1719 | if (hid_data->cc_report != 0 && | ||
1720 | hid_data->cc_report != report->id) { | ||
1721 | int i; | ||
1722 | |||
1723 | hid_data->cc_report = report->id; | ||
1724 | hid_data->cc_index = -1; | ||
1725 | hid_data->cc_value_index = -1; | ||
1726 | |||
1727 | for (i = 0; i < report->maxfield; i++) { | ||
1728 | struct hid_field *field = report->field[i]; | ||
1729 | int j; | ||
1730 | |||
1731 | for (j = 0; j < field->maxusage; j++) { | ||
1732 | if (field->usage[j].hid == HID_DG_CONTACTCOUNT) { | ||
1733 | hid_data->cc_index = i; | ||
1734 | hid_data->cc_value_index = j; | ||
1735 | |||
1736 | /* break */ | ||
1737 | i = report->maxfield; | ||
1738 | j = field->maxusage; | ||
1739 | } | ||
1740 | } | ||
1741 | } | ||
1742 | } | ||
1743 | |||
1718 | if (hid_data->cc_index >= 0) { | 1744 | if (hid_data->cc_index >= 0) { |
1719 | struct hid_field *field = report->field[hid_data->cc_index]; | 1745 | struct hid_field *field = report->field[hid_data->cc_index]; |
1720 | int value = field->value[hid_data->cc_value_index]; | 1746 | int value = field->value[hid_data->cc_value_index]; |
diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h index 1e270d401e18..809c03e34f74 100644 --- a/drivers/hid/wacom_wac.h +++ b/drivers/hid/wacom_wac.h | |||
@@ -198,6 +198,7 @@ struct hid_data { | |||
198 | int width; | 198 | int width; |
199 | int height; | 199 | int height; |
200 | int id; | 200 | int id; |
201 | int cc_report; | ||
201 | int cc_index; | 202 | int cc_index; |
202 | int cc_value_index; | 203 | int cc_value_index; |
203 | int num_expected; | 204 | int num_expected; |