| From 35d851df23b093ee027f827fed2213ae5e88fc7a Mon Sep 17 00:00:00 2001 |
| From: Jiri Kosina <jkosina@suse.cz> |
| Date: Thu, 25 Aug 2011 14:21:37 +0200 |
| Subject: HID: magicmouse: ignore 'ivalid report id' while switching modes, v2 |
| |
| From: Jiri Kosina <jkosina@suse.cz> |
| |
| commit 35d851df23b093ee027f827fed2213ae5e88fc7a upstream. |
| |
| This is basically a more generic respin of 23746a6 ("HID: magicmouse: ignore |
| 'ivalid report id' while switching modes") which got reverted later by |
| c3a492. |
| |
| It turns out that on some configurations, this is actually still the case |
| and we are not able to detect in runtime. |
| |
| The device reponds with 'invalid report id' when feature report switching it |
| into multitouch mode is sent to it. |
| |
| This has been silently ignored before 0825411ade ("HID: bt: Wait for ACK |
| on Sent Reports"), but since this commit, it propagates -EIO from the _raw |
| callback . |
| |
| So let the driver ignore -EIO as response to 0xd7,0x01 report, as that's |
| how the device reacts in normal mode. |
| |
| Sad, but following reality. |
| |
| This fixes https://bugzilla.kernel.org/show_bug.cgi?id=35022 |
| |
| Reported-by: Chase Douglas <chase.douglas@canonical.com> |
| Reported-by: Jaikumar Ganesh <jaikumarg@android.com> |
| Tested-by: Chase Douglas <chase.douglas@canonical.com> |
| Tested-by: Jaikumar Ganesh <jaikumarg@android.com> |
| Signed-off-by: Jiri Kosina <jkosina@suse.cz> |
| Cc: Josh Boyer <jwboyer@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/hid/hid-magicmouse.c | 10 +++++++++- |
| 1 file changed, 9 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/hid/hid-magicmouse.c |
| +++ b/drivers/hid/hid-magicmouse.c |
| @@ -501,9 +501,17 @@ static int magicmouse_probe(struct hid_d |
| } |
| report->size = 6; |
| |
| + /* |
| + * Some devices repond with 'invalid report id' when feature |
| + * report switching it into multitouch mode is sent to it. |
| + * |
| + * This results in -EIO from the _raw low-level transport callback, |
| + * but there seems to be no other way of switching the mode. |
| + * Thus the super-ugly hacky success check below. |
| + */ |
| ret = hdev->hid_output_raw_report(hdev, feature, sizeof(feature), |
| HID_FEATURE_REPORT); |
| - if (ret != sizeof(feature)) { |
| + if (ret != -EIO && ret != sizeof(feature)) { |
| hid_err(hdev, "unable to request touch data (%d)\n", ret); |
| goto err_stop_hw; |
| } |