From c5c56bd1bf83f088692f3117126a1e0569740e9d Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 11 Mar 2013 14:03:58 -0700 Subject: [PATCH] 3.4-stable patches added patches: hid-logitech-dj-do-not-directly-call-hid_output_raw_report-during-probe.patch --- ...l-hid_output_raw_report-during-probe.patch | 71 +++++++++++++++++++ queue-3.4/series | 1 + 2 files changed, 72 insertions(+) create mode 100644 queue-3.4/hid-logitech-dj-do-not-directly-call-hid_output_raw_report-during-probe.patch diff --git a/queue-3.4/hid-logitech-dj-do-not-directly-call-hid_output_raw_report-during-probe.patch b/queue-3.4/hid-logitech-dj-do-not-directly-call-hid_output_raw_report-during-probe.patch new file mode 100644 index 00000000000..0dd6f69aea2 --- /dev/null +++ b/queue-3.4/hid-logitech-dj-do-not-directly-call-hid_output_raw_report-during-probe.patch @@ -0,0 +1,71 @@ +From dcd9006b1b053c7b1cebe81333261d4fd492ffeb Mon Sep 17 00:00:00 2001 +From: Benjamin Tissoires +Date: Tue, 5 Mar 2013 17:09:00 +0100 +Subject: HID: logitech-dj: do not directly call hid_output_raw_report() during probe + +From: Benjamin Tissoires + +commit dcd9006b1b053c7b1cebe81333261d4fd492ffeb upstream. + +hid_output_raw_report() makes a direct call to usb_control_msg(). However, +some USB3 boards have shown that the usb device is not ready during the +.probe(). This blocks the entire usb device, and the paired mice, keyboards +are not functional. The dmesg output is the following: + +[ 11.912287] logitech-djreceiver 0003:046D:C52B.0003: hiddev0,hidraw0: USB HID v1.11 Device [Logitech USB Receiver] on usb-0000:00:14.0-2/input2 +[ 11.912537] logitech-djreceiver 0003:046D:C52B.0003: logi_dj_probe:logi_dj_recv_query_paired_devices error:-32 +[ 11.912636] logitech-djreceiver: probe of 0003:046D:C52B.0003 failed with error -32 + +Relying on the scheduled call to usbhid_submit_report() fixes the problem. + +related bugs: +https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1072082 +https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1039143 +https://bugzilla.redhat.com/show_bug.cgi?id=840391 +https://bugzilla.kernel.org/show_bug.cgi?id=49781 + +Reported-and-tested-by: Bob Bowles +Signed-off-by: Benjamin Tissoires +Signed-off-by: Jiri Kosina +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/hid/hid-logitech-dj.c | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +--- a/drivers/hid/hid-logitech-dj.c ++++ b/drivers/hid/hid-logitech-dj.c +@@ -451,19 +451,25 @@ static int logi_dj_recv_send_report(stru + struct dj_report *dj_report) + { + struct hid_device *hdev = djrcv_dev->hdev; +- int sent_bytes; ++ struct hid_report *report; ++ struct hid_report_enum *output_report_enum; ++ u8 *data = (u8 *)(&dj_report->device_index); ++ int i; + +- if (!hdev->hid_output_raw_report) { +- dev_err(&hdev->dev, "%s:" +- "hid_output_raw_report is null\n", __func__); ++ output_report_enum = &hdev->report_enum[HID_OUTPUT_REPORT]; ++ report = output_report_enum->report_id_hash[REPORT_ID_DJ_SHORT]; ++ ++ if (!report) { ++ dev_err(&hdev->dev, "%s: unable to find dj report\n", __func__); + return -ENODEV; + } + +- sent_bytes = hdev->hid_output_raw_report(hdev, (u8 *) dj_report, +- sizeof(struct dj_report), +- HID_OUTPUT_REPORT); ++ for (i = 0; i < report->field[0]->report_count; i++) ++ report->field[0]->value[i] = data[i]; ++ ++ usbhid_submit_report(hdev, report, USB_DIR_OUT); + +- return (sent_bytes < 0) ? sent_bytes : 0; ++ return 0; + } + + static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev) diff --git a/queue-3.4/series b/queue-3.4/series index 43a5f4ab065..f74c36f3bf9 100644 --- a/queue-3.4/series +++ b/queue-3.4/series @@ -24,3 +24,4 @@ arm-7663-1-perf-fix-armv7-evtype_mask-to-include-nsh-bit.patch alsa-ice1712-initialize-card-private_data-properly.patch alsa-vmaster-fix-slave-change-notification.patch e1000e-fix-pci-device-enable-counter-balance.patch +hid-logitech-dj-do-not-directly-call-hid_output_raw_report-during-probe.patch -- 2.47.3