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