Lines Matching refs:session
78 struct hidp_session *session; in __hidp_get_session() local
84 session = list_entry(p, struct hidp_session, list); in __hidp_get_session()
85 if (!bacmp(bdaddr, &session->bdaddr)) in __hidp_get_session()
86 return session; in __hidp_get_session()
91 static void __hidp_link_session(struct hidp_session *session) in __hidp_link_session() argument
94 list_add(&session->list, &hidp_session_list); in __hidp_link_session()
97 static void __hidp_unlink_session(struct hidp_session *session) in __hidp_unlink_session() argument
99 list_del(&session->list); in __hidp_unlink_session()
103 static void __hidp_copy_session(struct hidp_session *session, struct hidp_conninfo *ci) in __hidp_copy_session() argument
105 bacpy(&ci->bdaddr, &session->bdaddr); in __hidp_copy_session()
107 ci->flags = session->flags; in __hidp_copy_session()
108 ci->state = session->state; in __hidp_copy_session()
115 if (session->input) { in __hidp_copy_session()
116 ci->vendor = session->input->id.vendor; in __hidp_copy_session()
117 ci->product = session->input->id.product; in __hidp_copy_session()
118 ci->version = session->input->id.version; in __hidp_copy_session()
119 if (session->input->name) in __hidp_copy_session()
120 strncpy(ci->name, session->input->name, 128); in __hidp_copy_session()
125 if (session->hid) { in __hidp_copy_session()
126 ci->vendor = session->hid->vendor; in __hidp_copy_session()
127 ci->product = session->hid->product; in __hidp_copy_session()
128 ci->version = session->hid->version; in __hidp_copy_session()
129 strncpy(ci->name, session->hid->name, 128); in __hidp_copy_session()
133 static int hidp_queue_event(struct hidp_session *session, struct input_dev *dev, in hidp_queue_event() argument
139 BT_DBG("session %p type %d code %d value %d", session, type, code, value); in hidp_queue_event()
150 if (session->leds == newleds) in hidp_queue_event()
153 session->leds = newleds; in hidp_queue_event()
164 skb_queue_tail(&session->intr_transmit, skb); in hidp_queue_event()
166 hidp_schedule(session); in hidp_queue_event()
174 struct hidp_session *session = hid->driver_data; in hidp_hidinput_event() local
176 return hidp_queue_event(session, dev, type, code, value); in hidp_hidinput_event()
181 struct hidp_session *session = input_get_drvdata(dev); in hidp_input_event() local
183 return hidp_queue_event(session, dev, type, code, value); in hidp_input_event()
186 static void hidp_input_report(struct hidp_session *session, struct sk_buff *skb) in hidp_input_report() argument
188 struct input_dev *dev = session->input; in hidp_input_report()
189 unsigned char *keys = session->keys; in hidp_input_report()
241 static int hidp_queue_report(struct hidp_session *session, in hidp_queue_report() argument
246 BT_DBG("session %p hid %p data %p size %d", session, session->hid, data, size); in hidp_queue_report()
257 skb_queue_tail(&session->intr_transmit, skb); in hidp_queue_report()
259 hidp_schedule(session); in hidp_queue_report()
264 static int hidp_send_report(struct hidp_session *session, struct hid_report *report) in hidp_send_report() argument
275 return hidp_queue_report(session, buf, rsize); in hidp_send_report()
280 struct hidp_session *session = (struct hidp_session *) arg; in hidp_idle_timeout() local
282 atomic_inc(&session->terminate); in hidp_idle_timeout()
283 hidp_schedule(session); in hidp_idle_timeout()
286 static void hidp_set_timer(struct hidp_session *session) in hidp_set_timer() argument
288 if (session->idle_to > 0) in hidp_set_timer()
289 mod_timer(&session->timer, jiffies + HZ * session->idle_to); in hidp_set_timer()
292 static inline void hidp_del_timer(struct hidp_session *session) in hidp_del_timer() argument
294 if (session->idle_to > 0) in hidp_del_timer()
295 del_timer(&session->timer); in hidp_del_timer()
298 static int __hidp_send_ctrl_message(struct hidp_session *session, in __hidp_send_ctrl_message() argument
303 BT_DBG("session %p data %p size %d", session, data, size); in __hidp_send_ctrl_message()
314 skb_queue_tail(&session->ctrl_transmit, skb); in __hidp_send_ctrl_message()
319 static inline int hidp_send_ctrl_message(struct hidp_session *session, in hidp_send_ctrl_message() argument
324 err = __hidp_send_ctrl_message(session, hdr, data, size); in hidp_send_ctrl_message()
326 hidp_schedule(session); in hidp_send_ctrl_message()
331 static void hidp_process_handshake(struct hidp_session *session, in hidp_process_handshake() argument
334 BT_DBG("session %p param 0x%02x", session, param); in hidp_process_handshake()
354 __hidp_send_ctrl_message(session, in hidp_process_handshake()
359 __hidp_send_ctrl_message(session, in hidp_process_handshake()
365 static void hidp_process_hid_control(struct hidp_session *session, in hidp_process_hid_control() argument
368 BT_DBG("session %p param 0x%02x", session, param); in hidp_process_hid_control()
372 skb_queue_purge(&session->ctrl_transmit); in hidp_process_hid_control()
373 skb_queue_purge(&session->intr_transmit); in hidp_process_hid_control()
376 atomic_inc(&session->terminate); in hidp_process_hid_control()
380 static void hidp_process_data(struct hidp_session *session, struct sk_buff *skb, in hidp_process_data() argument
383 BT_DBG("session %p skb %p len %d param 0x%02x", session, skb, skb->len, param); in hidp_process_data()
387 hidp_set_timer(session); in hidp_process_data()
389 if (session->input) in hidp_process_data()
390 hidp_input_report(session, skb); in hidp_process_data()
392 if (session->hid) in hidp_process_data()
393 hid_input_report(session->hid, HID_INPUT_REPORT, skb->data, skb->len, 0); in hidp_process_data()
403 __hidp_send_ctrl_message(session, in hidp_process_data()
408 static void hidp_recv_ctrl_frame(struct hidp_session *session, in hidp_recv_ctrl_frame() argument
413 BT_DBG("session %p skb %p len %d", session, skb, skb->len); in hidp_recv_ctrl_frame()
423 hidp_process_handshake(session, param); in hidp_recv_ctrl_frame()
427 hidp_process_hid_control(session, param); in hidp_recv_ctrl_frame()
431 hidp_process_data(session, skb, param); in hidp_recv_ctrl_frame()
435 __hidp_send_ctrl_message(session, in hidp_recv_ctrl_frame()
443 static void hidp_recv_intr_frame(struct hidp_session *session, in hidp_recv_intr_frame() argument
448 BT_DBG("session %p skb %p len %d", session, skb, skb->len); in hidp_recv_intr_frame()
454 hidp_set_timer(session); in hidp_recv_intr_frame()
456 if (session->input) in hidp_recv_intr_frame()
457 hidp_input_report(session, skb); in hidp_recv_intr_frame()
459 if (session->hid) { in hidp_recv_intr_frame()
460 hid_input_report(session->hid, HID_INPUT_REPORT, skb->data, skb->len, 1); in hidp_recv_intr_frame()
485 static void hidp_process_transmit(struct hidp_session *session) in hidp_process_transmit() argument
489 BT_DBG("session %p", session); in hidp_process_transmit()
491 while ((skb = skb_dequeue(&session->ctrl_transmit))) { in hidp_process_transmit()
492 if (hidp_send_frame(session->ctrl_sock, skb->data, skb->len) < 0) { in hidp_process_transmit()
493 skb_queue_head(&session->ctrl_transmit, skb); in hidp_process_transmit()
497 hidp_set_timer(session); in hidp_process_transmit()
501 while ((skb = skb_dequeue(&session->intr_transmit))) { in hidp_process_transmit()
502 if (hidp_send_frame(session->intr_sock, skb->data, skb->len) < 0) { in hidp_process_transmit()
503 skb_queue_head(&session->intr_transmit, skb); in hidp_process_transmit()
507 hidp_set_timer(session); in hidp_process_transmit()
514 struct hidp_session *session = arg; in hidp_session() local
515 struct sock *ctrl_sk = session->ctrl_sock->sk; in hidp_session()
516 struct sock *intr_sk = session->intr_sock->sk; in hidp_session()
521 BT_DBG("session %p", session); in hidp_session()
523 if (session->input) { in hidp_session()
524 vendor = session->input->id.vendor; in hidp_session()
525 product = session->input->id.product; in hidp_session()
528 if (session->hid) { in hidp_session()
529 vendor = session->hid->vendor; in hidp_session()
530 product = session->hid->product; in hidp_session()
540 while (!atomic_read(&session->terminate)) { in hidp_session()
548 hidp_recv_ctrl_frame(session, skb); in hidp_session()
553 hidp_recv_intr_frame(session, skb); in hidp_session()
556 hidp_process_transmit(session); in hidp_session()
566 hidp_del_timer(session); in hidp_session()
568 if (session->input) { in hidp_session()
569 input_unregister_device(session->input); in hidp_session()
570 session->input = NULL; in hidp_session()
573 if (session->hid) { in hidp_session()
574 if (session->hid->claimed & HID_CLAIMED_INPUT) in hidp_session()
575 hidinput_disconnect(session->hid); in hidp_session()
576 hid_destroy_device(session->hid); in hidp_session()
580 session->intr_sock->sk->sk_err = EUNATCH; in hidp_session()
581 session->ctrl_sock->sk->sk_err = EUNATCH; in hidp_session()
583 hidp_schedule(session); in hidp_session()
585 fput(session->intr_sock->file); in hidp_session()
590 fput(session->ctrl_sock->file); in hidp_session()
592 __hidp_unlink_session(session); in hidp_session()
596 kfree(session); in hidp_session()
600 static struct device *hidp_get_device(struct hidp_session *session) in hidp_get_device() argument
602 bdaddr_t *src = &bt_sk(session->ctrl_sock->sk)->src; in hidp_get_device()
603 bdaddr_t *dst = &bt_sk(session->ctrl_sock->sk)->dst; in hidp_get_device()
618 static int hidp_setup_input(struct hidp_session *session, in hidp_setup_input() argument
628 session->input = input; in hidp_setup_input()
630 input_set_drvdata(input, session); in hidp_setup_input()
665 input->dev.parent = hidp_get_device(session); in hidp_setup_input()
683 struct hidp_session *session = hid->driver_data; in hidp_parse() local
684 struct hidp_connadd_req *req = session->req; in hidp_parse()
697 ret = hid_parse_report(session->hid, buf, req->rd_size); in hidp_parse()
704 session->req = NULL; in hidp_parse()
711 struct hidp_session *session = hid->driver_data; in hidp_start() local
716 hidp_send_report(session, report); in hidp_start()
720 hidp_send_report(session, report); in hidp_start()
727 struct hidp_session *session = hid->driver_data; in hidp_stop() local
729 skb_queue_purge(&session->ctrl_transmit); in hidp_stop()
730 skb_queue_purge(&session->intr_transmit); in hidp_stop()
746 static int hidp_setup_hid(struct hidp_session *session, in hidp_setup_hid() argument
755 ret = PTR_ERR(session->hid); in hidp_setup_hid()
759 session->hid = hid; in hidp_setup_hid()
760 session->req = req; in hidp_setup_hid()
761 hid->driver_data = session; in hidp_setup_hid()
763 baswap(&src, &bt_sk(session->ctrl_sock->sk)->src); in hidp_setup_hid()
764 baswap(&dst, &bt_sk(session->ctrl_sock->sk)->dst); in hidp_setup_hid()
776 hid->dev.parent = hidp_get_device(session); in hidp_setup_hid()
786 session->hid = NULL; in hidp_setup_hid()
793 struct hidp_session *session, *s; in hidp_add_connection() local
802 session = kzalloc(sizeof(struct hidp_session), GFP_KERNEL); in hidp_add_connection()
803 if (!session) in hidp_add_connection()
816 bacpy(&session->bdaddr, &bt_sk(ctrl_sock->sk)->dst); in hidp_add_connection()
818 session->ctrl_mtu = min_t(uint, l2cap_pi(ctrl_sock->sk)->omtu, l2cap_pi(ctrl_sock->sk)->imtu); in hidp_add_connection()
819 session->intr_mtu = min_t(uint, l2cap_pi(intr_sock->sk)->omtu, l2cap_pi(intr_sock->sk)->imtu); in hidp_add_connection()
821 BT_DBG("ctrl mtu %d intr mtu %d", session->ctrl_mtu, session->intr_mtu); in hidp_add_connection()
823 session->ctrl_sock = ctrl_sock; in hidp_add_connection()
824 session->intr_sock = intr_sock; in hidp_add_connection()
825 session->state = BT_CONNECTED; in hidp_add_connection()
827 setup_timer(&session->timer, hidp_idle_timeout, (unsigned long)session); in hidp_add_connection()
829 skb_queue_head_init(&session->ctrl_transmit); in hidp_add_connection()
830 skb_queue_head_init(&session->intr_transmit); in hidp_add_connection()
832 session->flags = req->flags & (1 << HIDP_BLUETOOTH_VENDOR_ID); in hidp_add_connection()
833 session->idle_to = req->idle_to; in hidp_add_connection()
836 err = hidp_setup_hid(session, req); in hidp_add_connection()
841 if (!session->hid) { in hidp_add_connection()
842 err = hidp_setup_input(session, req); in hidp_add_connection()
847 __hidp_link_session(session); in hidp_add_connection()
849 hidp_set_timer(session); in hidp_add_connection()
851 err = kernel_thread(hidp_session, session, CLONE_KERNEL); in hidp_add_connection()
855 if (session->input) { in hidp_add_connection()
856 hidp_send_ctrl_message(session, in hidp_add_connection()
858 session->flags |= (1 << HIDP_BOOT_PROTOCOL_MODE); in hidp_add_connection()
860 session->leds = 0xff; in hidp_add_connection()
861 hidp_input_event(session->input, EV_LED, 0, 0); in hidp_add_connection()
868 hidp_del_timer(session); in hidp_add_connection()
870 __hidp_unlink_session(session); in hidp_add_connection()
872 if (session->input) in hidp_add_connection()
873 input_unregister_device(session->input); in hidp_add_connection()
874 if (session->hid) in hidp_add_connection()
875 hid_destroy_device(session->hid); in hidp_add_connection()
877 skb_queue_purge(&session->ctrl_transmit); in hidp_add_connection()
878 skb_queue_purge(&session->intr_transmit); in hidp_add_connection()
882 input_free_device(session->input); in hidp_add_connection()
883 kfree(session); in hidp_add_connection()
889 struct hidp_session *session; in hidp_del_connection() local
896 session = __hidp_get_session(&req->bdaddr); in hidp_del_connection()
897 if (session) { in hidp_del_connection()
899 hidp_send_ctrl_message(session, in hidp_del_connection()
903 skb_queue_purge(&session->ctrl_transmit); in hidp_del_connection()
904 skb_queue_purge(&session->intr_transmit); in hidp_del_connection()
907 session->intr_sock->sk->sk_err = EUNATCH; in hidp_del_connection()
908 session->ctrl_sock->sk->sk_err = EUNATCH; in hidp_del_connection()
911 atomic_inc(&session->terminate); in hidp_del_connection()
912 hidp_schedule(session); in hidp_del_connection()
931 struct hidp_session *session; in hidp_get_connlist() local
934 session = list_entry(p, struct hidp_session, list); in hidp_get_connlist()
936 __hidp_copy_session(session, &ci); in hidp_get_connlist()
956 struct hidp_session *session; in hidp_get_conninfo() local
961 session = __hidp_get_session(&ci->bdaddr); in hidp_get_conninfo()
962 if (session) in hidp_get_conninfo()
963 __hidp_copy_session(session, ci); in hidp_get_conninfo()