--- /dev/null
+From dcd9006b1b053c7b1cebe81333261d4fd492ffeb Mon Sep 17 00:00:00 2001
+From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
+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 <benjamin.tissoires@redhat.com>
+
+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 <bobjohnbowles@gmail.com>
+Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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)