Re: 35022: hid-magicmouse broken

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 19 May 2011, Chase Douglas wrote:

> >> [  195.491735] Bluetooth: HIDP (Human Interface Emulation) ver 1.2
> >> [  222.693947] input: cndougla’s trackpad as
> >> /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.3/1-1.3.3/1-1.3.3:1.0/bluetooth/hci0/hci0:12/input16
> >> [  222.694119] magicmouse 0005:05AC:030E.0005: input,hidraw3: BLUETOOTH
> >> HID v1.60 Mouse [cndougla’s trackpad] on 50:63:13:90:AF:A4
> >> [  222.694128] hidp_output_raw_report, report_type: 2
> >> [  222.808111] session ffff88012d9b1200 param 0x02
> >> [  222.808198] hidp: returnign -EIO because of !output_report_success
> >> [  222.808209] magicmouse 0005:05AC:030E.0005: unable to request touch
> >> data (-5)
> >> [  222.809358] session ffff88012d9b1200 param 0x02
> >> [  222.810606] session ffff88012d9b1200 param 0x02
> >> [  222.813113] session ffff88012d9b1200 param 0x00
> >> [  223.045363] magicmouse: probe of 0005:05AC:030E.0005 failed with error -5
> > 
> > Ok, so what is happening here is that magicmouse_probe() sends the { 0xd7, 
> > 0x01 } feature report to the device, and it responds with 
> > HIDP_HSHK_ERR_INVALID_REPORT_ID.
> > 
> > That's why the _raw callback (correctly) returns error.
> > 
> > So the question to the driver authors is -- what is the point behind the { 
> > 0xd7, 0x01 } report? Clearly the device doesn't like it during probe 
> > because of invalid report ID.
> > And it never did, we just silently ignored the error with the older 
> > kernels.
> 
> The feature report is what flips the devices (magic mouse, magic
> trackpad) into multitouch mode. Without the report, the mouse will not
> emit the location of any touches on its surface, and the trackpad will
> only emit single touch data.
> 
> What do you think we should do? We can't get rid of the report. Should
> we silently ignore the error?

Hmm, I am afraid that it's the only option (apart from thowing the whole 
'waiting for ack' infrastructure away, which would be sad, as it's a good 
thing in principle).

So how about the patch below? :/ Could you please verify that it makes 
hid-magicmouse work again? Thanks.



From: Jiri Kosina <jkosina@xxxxxxx>
Subject: [PATCH] HID: magicmouse: ignore 'ivalid report id' while switching modes

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

Signed-off-by: Jiri Kosina <jkosina@xxxxxxx>
---
 drivers/hid/hid-magicmouse.c |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c
index 0ec91c1..a5eda4c 100644
--- a/drivers/hid/hid-magicmouse.c
+++ b/drivers/hid/hid-magicmouse.c
@@ -501,9 +501,17 @@ static int magicmouse_probe(struct hid_device *hdev,
 	}
 	report->size = 6;
 
+	/*
+	 * The device reponds 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) {
 		hid_err(hdev, "unable to request touch data (%d)\n", ret);
 		goto err_stop_hw;
 	}
-- 
1.7.3.1

--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux