aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth/hidp/core.c
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2013-04-06 14:28:52 -0400
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>2013-04-17 02:04:17 -0400
commite73dcfbf061b524fe9aaef56cf3c2e234a45ec19 (patch)
tree2de97e0729940dc1bfd85a01286e4953713a76b9 /net/bluetooth/hidp/core.c
parentaf87b3d0151e39f23e795d327e25019be687d8c0 (diff)
Bluetooth: hidp: fix sending output reports on intr channel
According to the specifications, data output reports must be sent on the interrupt channel. See also usbhid implementation. Sending these reports on the control channel breaks newer Wii Remotes. Note that this will make output reports asynchronous. However, that's how hid_output_raw_report() is supposed to work with HID_OUTPUT_REPORT as report type. There are no responses to output reports. Signed-off-by: David Herrmann <dh.herrmann@gmail.com> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Diffstat (limited to 'net/bluetooth/hidp/core.c')
-rw-r--r--net/bluetooth/hidp/core.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c
index 13a0a0590947..940f5acb6694 100644
--- a/net/bluetooth/hidp/core.c
+++ b/net/bluetooth/hidp/core.c
@@ -335,14 +335,11 @@ static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data, s
335 struct hidp_session *session = hid->driver_data; 335 struct hidp_session *session = hid->driver_data;
336 int ret; 336 int ret;
337 337
338 switch (report_type) { 338 if (report_type == HID_OUTPUT_REPORT) {
339 case HID_FEATURE_REPORT:
340 report_type = HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE;
341 break;
342 case HID_OUTPUT_REPORT:
343 report_type = HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUPUT; 339 report_type = HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUPUT;
344 break; 340 return hidp_send_intr_message(session, report_type,
345 default: 341 data, count);
342 } else if (report_type != HID_FEATURE_REPORT) {
346 return -EINVAL; 343 return -EINVAL;
347 } 344 }
348 345
@@ -351,6 +348,7 @@ static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data, s
351 348
352 /* Set up our wait, and send the report request to the device. */ 349 /* Set up our wait, and send the report request to the device. */
353 set_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags); 350 set_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags);
351 report_type = HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE;
354 ret = hidp_send_ctrl_message(session, report_type, data, count); 352 ret = hidp_send_ctrl_message(session, report_type, data, count);
355 if (ret) 353 if (ret)
356 goto err; 354 goto err;