diff options
author | David Herrmann <dh.herrmann@gmail.com> | 2013-04-06 14:28:51 -0400 |
---|---|---|
committer | Gustavo Padovan <gustavo.padovan@collabora.co.uk> | 2013-04-17 02:04:12 -0400 |
commit | af87b3d0151e39f23e795d327e25019be687d8c0 (patch) | |
tree | 7cf9da1fbe096f0b1288595787e5952ba4ee56ff /net/bluetooth | |
parent | 41edc0c034160408feaa78c9a50cc5e91a5928c7 (diff) |
Bluetooth: hidp: don't send boot-protocol messages as HID-reports
If a device is registered as HID device, it is always in Report-Mode.
Therefore, we must not send Boot-Protocol messages on
hidinput_input_event() callbacks. This confuses devices and may cause
disconnects on protocol errors.
We disable the hidinput_input_event() callback for now. We can implement
it properly later, but lets first fix the current code by disabling it.
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')
-rw-r--r-- | net/bluetooth/hidp/core.c | 24 |
1 files changed, 5 insertions, 19 deletions
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index 5fcc0389d929..13a0a0590947 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c | |||
@@ -143,13 +143,15 @@ static int hidp_send_intr_message(struct hidp_session *session, | |||
143 | &session->intr_transmit, hdr, data, size); | 143 | &session->intr_transmit, hdr, data, size); |
144 | } | 144 | } |
145 | 145 | ||
146 | static int hidp_queue_event(struct hidp_session *session, struct input_dev *dev, | 146 | static int hidp_input_event(struct input_dev *dev, unsigned int type, |
147 | unsigned int type, unsigned int code, int value) | 147 | unsigned int code, int value) |
148 | { | 148 | { |
149 | struct hidp_session *session = input_get_drvdata(dev); | ||
149 | unsigned char newleds; | 150 | unsigned char newleds; |
150 | unsigned char hdr, data[2]; | 151 | unsigned char hdr, data[2]; |
151 | 152 | ||
152 | BT_DBG("session %p type %d code %d value %d", session, type, code, value); | 153 | BT_DBG("session %p type %d code %d value %d", |
154 | session, type, code, value); | ||
153 | 155 | ||
154 | if (type != EV_LED) | 156 | if (type != EV_LED) |
155 | return -1; | 157 | return -1; |
@@ -172,21 +174,6 @@ static int hidp_queue_event(struct hidp_session *session, struct input_dev *dev, | |||
172 | return hidp_send_intr_message(session, hdr, data, 2); | 174 | return hidp_send_intr_message(session, hdr, data, 2); |
173 | } | 175 | } |
174 | 176 | ||
175 | static int hidp_hidinput_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) | ||
176 | { | ||
177 | struct hid_device *hid = input_get_drvdata(dev); | ||
178 | struct hidp_session *session = hid->driver_data; | ||
179 | |||
180 | return hidp_queue_event(session, dev, type, code, value); | ||
181 | } | ||
182 | |||
183 | static int hidp_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) | ||
184 | { | ||
185 | struct hidp_session *session = input_get_drvdata(dev); | ||
186 | |||
187 | return hidp_queue_event(session, dev, type, code, value); | ||
188 | } | ||
189 | |||
190 | static void hidp_input_report(struct hidp_session *session, struct sk_buff *skb) | 177 | static void hidp_input_report(struct hidp_session *session, struct sk_buff *skb) |
191 | { | 178 | { |
192 | struct input_dev *dev = session->input; | 179 | struct input_dev *dev = session->input; |
@@ -732,7 +719,6 @@ static struct hid_ll_driver hidp_hid_driver = { | |||
732 | .stop = hidp_stop, | 719 | .stop = hidp_stop, |
733 | .open = hidp_open, | 720 | .open = hidp_open, |
734 | .close = hidp_close, | 721 | .close = hidp_close, |
735 | .hidinput_input_event = hidp_hidinput_event, | ||
736 | }; | 722 | }; |
737 | 723 | ||
738 | /* This function sets up the hid device. It does not add it | 724 | /* This function sets up the hid device. It does not add it |