diff options
Diffstat (limited to 'net/bluetooth/hidp/core.c')
| -rw-r--r-- | net/bluetooth/hidp/core.c | 16 | 
1 files changed, 14 insertions, 2 deletions
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index 292e619db896..d9fb93451442 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c @@ -430,6 +430,16 @@ static void hidp_del_timer(struct hidp_session *session)  		del_timer(&session->timer);  } +static void hidp_process_report(struct hidp_session *session, +				int type, const u8 *data, int len, int intr) +{ +	if (len > HID_MAX_BUFFER_SIZE) +		len = HID_MAX_BUFFER_SIZE; + +	memcpy(session->input_buf, data, len); +	hid_input_report(session->hid, type, session->input_buf, len, intr); +} +  static void hidp_process_handshake(struct hidp_session *session,  					unsigned char param)  { @@ -502,7 +512,8 @@ static int hidp_process_data(struct hidp_session *session, struct sk_buff *skb,  			hidp_input_report(session, skb);  		if (session->hid) -			hid_input_report(session->hid, HID_INPUT_REPORT, skb->data, skb->len, 0); +			hidp_process_report(session, HID_INPUT_REPORT, +					    skb->data, skb->len, 0);  		break;  	case HIDP_DATA_RTYPE_OTHER: @@ -584,7 +595,8 @@ static void hidp_recv_intr_frame(struct hidp_session *session,  			hidp_input_report(session, skb);  		if (session->hid) { -			hid_input_report(session->hid, HID_INPUT_REPORT, skb->data, skb->len, 1); +			hidp_process_report(session, HID_INPUT_REPORT, +					    skb->data, skb->len, 1);  			BT_DBG("report len %d", skb->len);  		}  	} else {  | 
