diff options
Diffstat (limited to 'net/bluetooth/hidp/core.c')
-rw-r--r-- | net/bluetooth/hidp/core.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index 46c6a148f0b3..212980ff99b9 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c | |||
@@ -231,17 +231,21 @@ static void hidp_input_report(struct hidp_session *session, struct sk_buff *skb) | |||
231 | 231 | ||
232 | static int hidp_send_report(struct hidp_session *session, struct hid_report *report) | 232 | static int hidp_send_report(struct hidp_session *session, struct hid_report *report) |
233 | { | 233 | { |
234 | unsigned char buf[32], hdr; | 234 | unsigned char hdr; |
235 | int rsize; | 235 | u8 *buf; |
236 | int rsize, ret; | ||
236 | 237 | ||
237 | rsize = ((report->size - 1) >> 3) + 1 + (report->id > 0); | 238 | buf = hid_alloc_report_buf(report, GFP_ATOMIC); |
238 | if (rsize > sizeof(buf)) | 239 | if (!buf) |
239 | return -EIO; | 240 | return -EIO; |
240 | 241 | ||
241 | hid_output_report(report, buf); | 242 | hid_output_report(report, buf); |
242 | hdr = HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUPUT; | 243 | hdr = HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUPUT; |
243 | 244 | ||
244 | return hidp_send_intr_message(session, hdr, buf, rsize); | 245 | ret = hidp_send_intr_message(session, hdr, buf, rsize); |
246 | |||
247 | kfree(buf); | ||
248 | return ret; | ||
245 | } | 249 | } |
246 | 250 | ||
247 | static int hidp_get_raw_report(struct hid_device *hid, | 251 | static int hidp_get_raw_report(struct hid_device *hid, |