core.c revision 0a85b964e141a4b8db6eaf500ceace12f8f52f93
1/*
2   HIDP implementation for Linux Bluetooth stack (BlueZ).
3   Copyright (C) 2003-2004 Marcel Holtmann <marcel@holtmann.org>
4
5   This program is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License version 2 as
7   published by the Free Software Foundation;
8
9   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
10   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
11   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
12   IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
13   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
14   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
18   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
19   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
20   SOFTWARE IS DISCLAIMED.
21*/
22
23#include <linux/module.h>
24
25#include <linux/types.h>
26#include <linux/errno.h>
27#include <linux/kernel.h>
28#include <linux/sched.h>
29#include <linux/slab.h>
30#include <linux/poll.h>
31#include <linux/fcntl.h>
32#include <linux/skbuff.h>
33#include <linux/socket.h>
34#include <linux/ioctl.h>
35#include <linux/file.h>
36#include <linux/init.h>
37#include <linux/wait.h>
38#include <net/sock.h>
39
40#include <linux/input.h>
41
42#include <net/bluetooth/bluetooth.h>
43#include <net/bluetooth/hci_core.h>
44#include <net/bluetooth/l2cap.h>
45
46#include "hidp.h"
47
48#ifndef CONFIG_BT_HIDP_DEBUG
49#undef  BT_DBG
50#define BT_DBG(D...)
51#endif
52
53#define VERSION "1.1"
54
55static DECLARE_RWSEM(hidp_session_sem);
56static LIST_HEAD(hidp_session_list);
57
58static unsigned char hidp_keycode[256] = {
59	  0,  0,  0,  0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,
60	 50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44,  2,  3,
61	  4,  5,  6,  7,  8,  9, 10, 11, 28,  1, 14, 15, 57, 12, 13, 26,
62	 27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64,
63	 65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106,
64	105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71,
65	 72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190,
66	191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113,
67	115,114,  0,  0,  0,121,  0, 89, 93,124, 92, 94, 95,  0,  0,  0,
68	122,123, 90, 91, 85,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
69	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
70	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
71	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
72	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
73	 29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,
74	150,158,159,128,136,177,178,176,142,152,173,140
75};
76
77static unsigned char hidp_mkeyspat[] = { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };
78
79static struct hidp_session *__hidp_get_session(bdaddr_t *bdaddr)
80{
81	struct hidp_session *session;
82	struct list_head *p;
83
84	BT_DBG("");
85
86	list_for_each(p, &hidp_session_list) {
87		session = list_entry(p, struct hidp_session, list);
88		if (!bacmp(bdaddr, &session->bdaddr))
89			return session;
90	}
91	return NULL;
92}
93
94static void __hidp_link_session(struct hidp_session *session)
95{
96	__module_get(THIS_MODULE);
97	list_add(&session->list, &hidp_session_list);
98}
99
100static void __hidp_unlink_session(struct hidp_session *session)
101{
102	list_del(&session->list);
103	module_put(THIS_MODULE);
104}
105
106static void __hidp_copy_session(struct hidp_session *session, struct hidp_conninfo *ci)
107{
108	bacpy(&ci->bdaddr, &session->bdaddr);
109
110	ci->flags = session->flags;
111	ci->state = session->state;
112
113	ci->vendor  = 0x0000;
114	ci->product = 0x0000;
115	ci->version = 0x0000;
116	memset(ci->name, 0, 128);
117
118	if (session->input) {
119		ci->vendor  = session->input->id.vendor;
120		ci->product = session->input->id.product;
121		ci->version = session->input->id.version;
122		if (session->input->name)
123			strncpy(ci->name, session->input->name, 128);
124		else
125			strncpy(ci->name, "HID Boot Device", 128);
126	}
127}
128
129static int hidp_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
130{
131	struct hidp_session *session = dev->private;
132	struct sk_buff *skb;
133	unsigned char newleds;
134
135	BT_DBG("input %p type %d code %d value %d", dev, type, code, value);
136
137	if (type != EV_LED)
138		return -1;
139
140	newleds = (!!test_bit(LED_KANA,    dev->led) << 3) |
141		  (!!test_bit(LED_COMPOSE, dev->led) << 3) |
142		  (!!test_bit(LED_SCROLLL, dev->led) << 2) |
143		  (!!test_bit(LED_CAPSL,   dev->led) << 1) |
144		  (!!test_bit(LED_NUML,    dev->led));
145
146	if (session->leds == newleds)
147		return 0;
148
149	session->leds = newleds;
150
151	if (!(skb = alloc_skb(3, GFP_ATOMIC))) {
152		BT_ERR("Can't allocate memory for new frame");
153		return -ENOMEM;
154	}
155
156	*skb_put(skb, 1) = HIDP_TRANS_DATA | HIDP_DATA_RTYPE_OUPUT;
157	*skb_put(skb, 1) = 0x01;
158	*skb_put(skb, 1) = newleds;
159
160	skb_queue_tail(&session->intr_transmit, skb);
161
162	hidp_schedule(session);
163
164	return 0;
165}
166
167static void hidp_input_report(struct hidp_session *session, struct sk_buff *skb)
168{
169	struct input_dev *dev = session->input;
170	unsigned char *keys = session->keys;
171	unsigned char *udata = skb->data + 1;
172	signed char *sdata = skb->data + 1;
173	int i, size = skb->len - 1;
174
175	switch (skb->data[0]) {
176	case 0x01:	/* Keyboard report */
177		for (i = 0; i < 8; i++)
178			input_report_key(dev, hidp_keycode[i + 224], (udata[0] >> i) & 1);
179
180		/* If all the key codes have been set to 0x01, it means
181		 * too many keys were pressed at the same time. */
182		if (!memcmp(udata + 2, hidp_mkeyspat, 6))
183			break;
184
185		for (i = 2; i < 8; i++) {
186			if (keys[i] > 3 && memscan(udata + 2, keys[i], 6) == udata + 8) {
187				if (hidp_keycode[keys[i]])
188					input_report_key(dev, hidp_keycode[keys[i]], 0);
189				else
190					BT_ERR("Unknown key (scancode %#x) released.", keys[i]);
191			}
192
193			if (udata[i] > 3 && memscan(keys + 2, udata[i], 6) == keys + 8) {
194				if (hidp_keycode[udata[i]])
195					input_report_key(dev, hidp_keycode[udata[i]], 1);
196				else
197					BT_ERR("Unknown key (scancode %#x) pressed.", udata[i]);
198			}
199		}
200
201		memcpy(keys, udata, 8);
202		break;
203
204	case 0x02:	/* Mouse report */
205		input_report_key(dev, BTN_LEFT,   sdata[0] & 0x01);
206		input_report_key(dev, BTN_RIGHT,  sdata[0] & 0x02);
207		input_report_key(dev, BTN_MIDDLE, sdata[0] & 0x04);
208		input_report_key(dev, BTN_SIDE,   sdata[0] & 0x08);
209		input_report_key(dev, BTN_EXTRA,  sdata[0] & 0x10);
210
211		input_report_rel(dev, REL_X, sdata[1]);
212		input_report_rel(dev, REL_Y, sdata[2]);
213
214		if (size > 3)
215			input_report_rel(dev, REL_WHEEL, sdata[3]);
216		break;
217	}
218
219	input_sync(dev);
220}
221
222static void hidp_idle_timeout(unsigned long arg)
223{
224	struct hidp_session *session = (struct hidp_session *) arg;
225
226	atomic_inc(&session->terminate);
227	hidp_schedule(session);
228}
229
230static inline void hidp_set_timer(struct hidp_session *session)
231{
232	if (session->idle_to > 0)
233		mod_timer(&session->timer, jiffies + HZ * session->idle_to);
234}
235
236static inline void hidp_del_timer(struct hidp_session *session)
237{
238	if (session->idle_to > 0)
239		del_timer(&session->timer);
240}
241
242static int __hidp_send_ctrl_message(struct hidp_session *session,
243			unsigned char hdr, unsigned char *data, int size)
244{
245	struct sk_buff *skb;
246
247	BT_DBG("session %p data %p size %d", session, data, size);
248
249	if (!(skb = alloc_skb(size + 1, GFP_ATOMIC))) {
250		BT_ERR("Can't allocate memory for new frame");
251		return -ENOMEM;
252	}
253
254	*skb_put(skb, 1) = hdr;
255	if (data && size > 0)
256		memcpy(skb_put(skb, size), data, size);
257
258	skb_queue_tail(&session->ctrl_transmit, skb);
259
260	return 0;
261}
262
263static int inline hidp_send_ctrl_message(struct hidp_session *session,
264			unsigned char hdr, unsigned char *data, int size)
265{
266	int err;
267
268	err = __hidp_send_ctrl_message(session, hdr, data, size);
269
270	hidp_schedule(session);
271
272	return err;
273}
274
275static inline void hidp_process_handshake(struct hidp_session *session, unsigned char param)
276{
277	BT_DBG("session %p param 0x%02x", session, param);
278
279	switch (param) {
280	case HIDP_HSHK_SUCCESSFUL:
281		/* FIXME: Call into SET_ GET_ handlers here */
282		break;
283
284	case HIDP_HSHK_NOT_READY:
285	case HIDP_HSHK_ERR_INVALID_REPORT_ID:
286	case HIDP_HSHK_ERR_UNSUPPORTED_REQUEST:
287	case HIDP_HSHK_ERR_INVALID_PARAMETER:
288		/* FIXME: Call into SET_ GET_ handlers here */
289		break;
290
291	case HIDP_HSHK_ERR_UNKNOWN:
292		break;
293
294	case HIDP_HSHK_ERR_FATAL:
295		/* Device requests a reboot, as this is the only way this error
296 		 * can be recovered. */
297		__hidp_send_ctrl_message(session,
298			HIDP_TRANS_HID_CONTROL | HIDP_CTRL_SOFT_RESET, NULL, 0);
299		break;
300
301	default:
302		__hidp_send_ctrl_message(session,
303			HIDP_TRANS_HANDSHAKE | HIDP_HSHK_ERR_INVALID_PARAMETER, NULL, 0);
304		break;
305	}
306}
307
308static inline void hidp_process_hid_control(struct hidp_session *session, unsigned char param)
309{
310	BT_DBG("session %p param 0x%02x", session, param);
311
312	switch (param) {
313	case HIDP_CTRL_NOP:
314		break;
315
316	case HIDP_CTRL_VIRTUAL_CABLE_UNPLUG:
317		/* Flush the transmit queues */
318		skb_queue_purge(&session->ctrl_transmit);
319		skb_queue_purge(&session->intr_transmit);
320
321		/* Kill session thread */
322		atomic_inc(&session->terminate);
323		break;
324
325	case HIDP_CTRL_HARD_RESET:
326	case HIDP_CTRL_SOFT_RESET:
327	case HIDP_CTRL_SUSPEND:
328	case HIDP_CTRL_EXIT_SUSPEND:
329		/* FIXME: We have to parse these and return no error */
330		break;
331
332	default:
333		__hidp_send_ctrl_message(session,
334			HIDP_TRANS_HANDSHAKE | HIDP_HSHK_ERR_INVALID_PARAMETER, NULL, 0);
335		break;
336	}
337}
338
339static inline void hidp_process_data(struct hidp_session *session, struct sk_buff *skb, unsigned char param)
340{
341	BT_DBG("session %p skb %p len %d param 0x%02x", session, skb, skb->len, param);
342
343	switch (param) {
344	case HIDP_DATA_RTYPE_INPUT:
345		hidp_set_timer(session);
346
347		if (session->input)
348			hidp_input_report(session, skb);
349		break;
350
351	case HIDP_DATA_RTYPE_OTHER:
352	case HIDP_DATA_RTYPE_OUPUT:
353	case HIDP_DATA_RTYPE_FEATURE:
354		break;
355
356	default:
357		__hidp_send_ctrl_message(session,
358			HIDP_TRANS_HANDSHAKE | HIDP_HSHK_ERR_INVALID_PARAMETER, NULL, 0);
359	}
360}
361
362static inline void hidp_recv_ctrl_frame(struct hidp_session *session, struct sk_buff *skb)
363{
364	unsigned char hdr, type, param;
365
366	BT_DBG("session %p skb %p len %d", session, skb, skb->len);
367
368	hdr = skb->data[0];
369	skb_pull(skb, 1);
370
371	type = hdr & HIDP_HEADER_TRANS_MASK;
372	param = hdr & HIDP_HEADER_PARAM_MASK;
373
374	switch (type) {
375	case HIDP_TRANS_HANDSHAKE:
376		hidp_process_handshake(session, param);
377		break;
378
379	case HIDP_TRANS_HID_CONTROL:
380		hidp_process_hid_control(session, param);
381		break;
382
383	case HIDP_TRANS_DATA:
384		hidp_process_data(session, skb, param);
385		break;
386
387	default:
388		__hidp_send_ctrl_message(session,
389			HIDP_TRANS_HANDSHAKE | HIDP_HSHK_ERR_UNSUPPORTED_REQUEST, NULL, 0);
390		break;
391	}
392
393	kfree_skb(skb);
394}
395
396static inline void hidp_recv_intr_frame(struct hidp_session *session, struct sk_buff *skb)
397{
398	unsigned char hdr;
399
400	BT_DBG("session %p skb %p len %d", session, skb, skb->len);
401
402	hdr = skb->data[0];
403	skb_pull(skb, 1);
404
405	if (hdr == (HIDP_TRANS_DATA | HIDP_DATA_RTYPE_INPUT)) {
406		hidp_set_timer(session);
407		if (session->input)
408			hidp_input_report(session, skb);
409	} else {
410		BT_DBG("Unsupported protocol header 0x%02x", hdr);
411	}
412
413	kfree_skb(skb);
414}
415
416static int hidp_send_frame(struct socket *sock, unsigned char *data, int len)
417{
418	struct kvec iv = { data, len };
419	struct msghdr msg;
420
421	BT_DBG("sock %p data %p len %d", sock, data, len);
422
423	if (!len)
424		return 0;
425
426	memset(&msg, 0, sizeof(msg));
427
428	return kernel_sendmsg(sock, &msg, &iv, 1, len);
429}
430
431static void hidp_process_transmit(struct hidp_session *session)
432{
433	struct sk_buff *skb;
434
435	BT_DBG("session %p", session);
436
437	while ((skb = skb_dequeue(&session->ctrl_transmit))) {
438		if (hidp_send_frame(session->ctrl_sock, skb->data, skb->len) < 0) {
439			skb_queue_head(&session->ctrl_transmit, skb);
440			break;
441		}
442
443		hidp_set_timer(session);
444		kfree_skb(skb);
445	}
446
447	while ((skb = skb_dequeue(&session->intr_transmit))) {
448		if (hidp_send_frame(session->intr_sock, skb->data, skb->len) < 0) {
449			skb_queue_head(&session->intr_transmit, skb);
450			break;
451		}
452
453		hidp_set_timer(session);
454		kfree_skb(skb);
455	}
456}
457
458static int hidp_session(void *arg)
459{
460	struct hidp_session *session = arg;
461	struct sock *ctrl_sk = session->ctrl_sock->sk;
462	struct sock *intr_sk = session->intr_sock->sk;
463	struct sk_buff *skb;
464	int vendor = 0x0000, product = 0x0000;
465	wait_queue_t ctrl_wait, intr_wait;
466
467	BT_DBG("session %p", session);
468
469	if (session->input) {
470		vendor  = session->input->id.vendor;
471		product = session->input->id.product;
472	}
473
474	daemonize("khidpd_%04x%04x", vendor, product);
475	set_user_nice(current, -15);
476	current->flags |= PF_NOFREEZE;
477
478	init_waitqueue_entry(&ctrl_wait, current);
479	init_waitqueue_entry(&intr_wait, current);
480	add_wait_queue(ctrl_sk->sk_sleep, &ctrl_wait);
481	add_wait_queue(intr_sk->sk_sleep, &intr_wait);
482	while (!atomic_read(&session->terminate)) {
483		set_current_state(TASK_INTERRUPTIBLE);
484
485		if (ctrl_sk->sk_state != BT_CONNECTED || intr_sk->sk_state != BT_CONNECTED)
486			break;
487
488		while ((skb = skb_dequeue(&ctrl_sk->sk_receive_queue))) {
489			skb_orphan(skb);
490			hidp_recv_ctrl_frame(session, skb);
491		}
492
493		while ((skb = skb_dequeue(&intr_sk->sk_receive_queue))) {
494			skb_orphan(skb);
495			hidp_recv_intr_frame(session, skb);
496		}
497
498		hidp_process_transmit(session);
499
500		schedule();
501	}
502	set_current_state(TASK_RUNNING);
503	remove_wait_queue(intr_sk->sk_sleep, &intr_wait);
504	remove_wait_queue(ctrl_sk->sk_sleep, &ctrl_wait);
505
506	down_write(&hidp_session_sem);
507
508	hidp_del_timer(session);
509
510	if (intr_sk->sk_state != BT_CONNECTED)
511		wait_event_timeout(*(ctrl_sk->sk_sleep), (ctrl_sk->sk_state == BT_CLOSED), HZ);
512
513	fput(session->ctrl_sock->file);
514
515	wait_event_timeout(*(intr_sk->sk_sleep), (intr_sk->sk_state == BT_CLOSED), HZ);
516
517	fput(session->intr_sock->file);
518
519	__hidp_unlink_session(session);
520
521	if (session->input) {
522		input_unregister_device(session->input);
523		session->input = NULL;
524	}
525
526	up_write(&hidp_session_sem);
527
528	kfree(session);
529	return 0;
530}
531
532static struct device *hidp_get_device(struct hidp_session *session)
533{
534	bdaddr_t *src = &bt_sk(session->ctrl_sock->sk)->src;
535	bdaddr_t *dst = &bt_sk(session->ctrl_sock->sk)->dst;
536	struct hci_dev *hdev;
537	struct hci_conn *conn;
538
539	hdev = hci_get_route(dst, src);
540	if (!hdev)
541		return NULL;
542
543	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst);
544	if (!conn)
545		return NULL;
546
547	hci_dev_put(hdev);
548
549	return &conn->dev;
550}
551
552static inline void hidp_setup_input(struct hidp_session *session, struct hidp_connadd_req *req)
553{
554	struct input_dev *input = session->input;
555	int i;
556
557	input->private = session;
558
559	input->name = "Bluetooth HID Boot Protocol Device";
560
561	input->id.bustype = BUS_BLUETOOTH;
562	input->id.vendor  = req->vendor;
563	input->id.product = req->product;
564	input->id.version = req->version;
565
566	if (req->subclass & 0x40) {
567		set_bit(EV_KEY, input->evbit);
568		set_bit(EV_LED, input->evbit);
569		set_bit(EV_REP, input->evbit);
570
571		set_bit(LED_NUML,    input->ledbit);
572		set_bit(LED_CAPSL,   input->ledbit);
573		set_bit(LED_SCROLLL, input->ledbit);
574		set_bit(LED_COMPOSE, input->ledbit);
575		set_bit(LED_KANA,    input->ledbit);
576
577		for (i = 0; i < sizeof(hidp_keycode); i++)
578			set_bit(hidp_keycode[i], input->keybit);
579		clear_bit(0, input->keybit);
580	}
581
582	if (req->subclass & 0x80) {
583		input->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
584		input->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
585		input->relbit[0] = BIT(REL_X) | BIT(REL_Y);
586		input->keybit[LONG(BTN_MOUSE)] |= BIT(BTN_SIDE) | BIT(BTN_EXTRA);
587		input->relbit[0] |= BIT(REL_WHEEL);
588	}
589
590	input->cdev.dev = hidp_get_device(session);
591
592	input->event = hidp_input_event;
593
594	input_register_device(input);
595}
596
597int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, struct socket *intr_sock)
598{
599	struct hidp_session *session, *s;
600	int err;
601
602	BT_DBG("");
603
604	if (bacmp(&bt_sk(ctrl_sock->sk)->src, &bt_sk(intr_sock->sk)->src) ||
605			bacmp(&bt_sk(ctrl_sock->sk)->dst, &bt_sk(intr_sock->sk)->dst))
606		return -ENOTUNIQ;
607
608	session = kzalloc(sizeof(struct hidp_session), GFP_KERNEL);
609	if (!session)
610		return -ENOMEM;
611
612	session->input = input_allocate_device();
613	if (!session->input) {
614		kfree(session);
615		return -ENOMEM;
616	}
617
618	down_write(&hidp_session_sem);
619
620	s = __hidp_get_session(&bt_sk(ctrl_sock->sk)->dst);
621	if (s && s->state == BT_CONNECTED) {
622		err = -EEXIST;
623		goto failed;
624	}
625
626	bacpy(&session->bdaddr, &bt_sk(ctrl_sock->sk)->dst);
627
628	session->ctrl_mtu = min_t(uint, l2cap_pi(ctrl_sock->sk)->omtu, l2cap_pi(ctrl_sock->sk)->imtu);
629	session->intr_mtu = min_t(uint, l2cap_pi(intr_sock->sk)->omtu, l2cap_pi(intr_sock->sk)->imtu);
630
631	BT_DBG("ctrl mtu %d intr mtu %d", session->ctrl_mtu, session->intr_mtu);
632
633	session->ctrl_sock = ctrl_sock;
634	session->intr_sock = intr_sock;
635	session->state     = BT_CONNECTED;
636
637	init_timer(&session->timer);
638
639	session->timer.function = hidp_idle_timeout;
640	session->timer.data     = (unsigned long) session;
641
642	skb_queue_head_init(&session->ctrl_transmit);
643	skb_queue_head_init(&session->intr_transmit);
644
645	session->flags   = req->flags & (1 << HIDP_BLUETOOTH_VENDOR_ID);
646	session->idle_to = req->idle_to;
647
648	if (session->input)
649		hidp_setup_input(session, req);
650
651	__hidp_link_session(session);
652
653	hidp_set_timer(session);
654
655	err = kernel_thread(hidp_session, session, CLONE_KERNEL);
656	if (err < 0)
657		goto unlink;
658
659	if (session->input) {
660		hidp_send_ctrl_message(session,
661			HIDP_TRANS_SET_PROTOCOL | HIDP_PROTO_BOOT, NULL, 0);
662		session->flags |= (1 << HIDP_BOOT_PROTOCOL_MODE);
663
664		session->leds = 0xff;
665		hidp_input_event(session->input, EV_LED, 0, 0);
666	}
667
668	up_write(&hidp_session_sem);
669	return 0;
670
671unlink:
672	hidp_del_timer(session);
673
674	__hidp_unlink_session(session);
675
676	if (session->input) {
677		input_unregister_device(session->input);
678		session->input = NULL; /* don't try to free it here */
679	}
680
681failed:
682	up_write(&hidp_session_sem);
683
684	kfree(session->input);
685	kfree(session);
686	return err;
687}
688
689int hidp_del_connection(struct hidp_conndel_req *req)
690{
691	struct hidp_session *session;
692	int err = 0;
693
694	BT_DBG("");
695
696	down_read(&hidp_session_sem);
697
698	session = __hidp_get_session(&req->bdaddr);
699	if (session) {
700		if (req->flags & (1 << HIDP_VIRTUAL_CABLE_UNPLUG)) {
701			hidp_send_ctrl_message(session,
702				HIDP_TRANS_HID_CONTROL | HIDP_CTRL_VIRTUAL_CABLE_UNPLUG, NULL, 0);
703		} else {
704			/* Flush the transmit queues */
705			skb_queue_purge(&session->ctrl_transmit);
706			skb_queue_purge(&session->intr_transmit);
707
708			/* Kill session thread */
709			atomic_inc(&session->terminate);
710			hidp_schedule(session);
711		}
712	} else
713		err = -ENOENT;
714
715	up_read(&hidp_session_sem);
716	return err;
717}
718
719int hidp_get_connlist(struct hidp_connlist_req *req)
720{
721	struct list_head *p;
722	int err = 0, n = 0;
723
724	BT_DBG("");
725
726	down_read(&hidp_session_sem);
727
728	list_for_each(p, &hidp_session_list) {
729		struct hidp_session *session;
730		struct hidp_conninfo ci;
731
732		session = list_entry(p, struct hidp_session, list);
733
734		__hidp_copy_session(session, &ci);
735
736		if (copy_to_user(req->ci, &ci, sizeof(ci))) {
737			err = -EFAULT;
738			break;
739		}
740
741		if (++n >= req->cnum)
742			break;
743
744		req->ci++;
745	}
746	req->cnum = n;
747
748	up_read(&hidp_session_sem);
749	return err;
750}
751
752int hidp_get_conninfo(struct hidp_conninfo *ci)
753{
754	struct hidp_session *session;
755	int err = 0;
756
757	down_read(&hidp_session_sem);
758
759	session = __hidp_get_session(&ci->bdaddr);
760	if (session)
761		__hidp_copy_session(session, ci);
762	else
763		err = -ENOENT;
764
765	up_read(&hidp_session_sem);
766	return err;
767}
768
769static int __init hidp_init(void)
770{
771	l2cap_load();
772
773	BT_INFO("HIDP (Human Interface Emulation) ver %s", VERSION);
774
775	return hidp_init_sockets();
776}
777
778static void __exit hidp_exit(void)
779{
780	hidp_cleanup_sockets();
781}
782
783module_init(hidp_init);
784module_exit(hidp_exit);
785
786MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
787MODULE_DESCRIPTION("Bluetooth HIDP ver " VERSION);
788MODULE_VERSION(VERSION);
789MODULE_LICENSE("GPL");
790MODULE_ALIAS("bt-proto-6");
791