Lines Matching full:session
72 static void hidp_copy_session(struct hidp_session *session, struct hidp_conninfo *ci) in hidp_copy_session() argument
76 bacpy(&ci->bdaddr, &session->bdaddr); in hidp_copy_session()
78 ci->flags = session->flags & valid_flags; in hidp_copy_session()
81 if (session->input) { in hidp_copy_session()
82 ci->vendor = session->input->id.vendor; in hidp_copy_session()
83 ci->product = session->input->id.product; in hidp_copy_session()
84 ci->version = session->input->id.version; in hidp_copy_session()
85 if (session->input->name) in hidp_copy_session()
86 strscpy(ci->name, session->input->name, 128); in hidp_copy_session()
89 } else if (session->hid) { in hidp_copy_session()
90 ci->vendor = session->hid->vendor; in hidp_copy_session()
91 ci->product = session->hid->product; in hidp_copy_session()
92 ci->version = session->hid->version; in hidp_copy_session()
93 strscpy(ci->name, session->hid->name, 128); in hidp_copy_session()
97 /* assemble skb, queue message on @transmit and wake up the session thread */
98 static int hidp_send_message(struct hidp_session *session, struct socket *sock, in hidp_send_message() argument
106 BT_DBG("session %p data %p size %d", session, data, size); in hidp_send_message()
108 if (atomic_read(&session->terminate)) in hidp_send_message()
131 static int hidp_send_ctrl_message(struct hidp_session *session, in hidp_send_ctrl_message() argument
135 return hidp_send_message(session, session->ctrl_sock, in hidp_send_ctrl_message()
136 &session->ctrl_transmit, hdr, data, size); in hidp_send_ctrl_message()
139 static int hidp_send_intr_message(struct hidp_session *session, in hidp_send_intr_message() argument
143 return hidp_send_message(session, session->intr_sock, in hidp_send_intr_message()
144 &session->intr_transmit, hdr, data, size); in hidp_send_intr_message()
150 struct hidp_session *session = input_get_drvdata(dev); in hidp_input_event() local
154 BT_DBG("session %p type %d code %d value %d", in hidp_input_event()
155 session, type, code, value); in hidp_input_event()
166 if (session->leds == newleds) in hidp_input_event()
169 session->leds = newleds; in hidp_input_event()
175 return hidp_send_intr_message(session, hdr, data, 2); in hidp_input_event()
178 static void hidp_input_report(struct hidp_session *session, struct sk_buff *skb) in hidp_input_report() argument
180 struct input_dev *dev = session->input; in hidp_input_report()
181 unsigned char *keys = session->keys; in hidp_input_report()
251 struct hidp_session *session = hid->driver_data; in hidp_get_raw_report() local
257 if (atomic_read(&session->terminate)) in hidp_get_raw_report()
274 if (mutex_lock_interruptible(&session->report_mutex)) in hidp_get_raw_report()
278 session->waiting_report_type = report_type & HIDP_DATA_RTYPE_MASK; in hidp_get_raw_report()
279 session->waiting_report_number = numbered_reports ? report_number : -1; in hidp_get_raw_report()
280 set_bit(HIDP_WAITING_FOR_RETURN, &session->flags); in hidp_get_raw_report()
282 ret = hidp_send_ctrl_message(session, report_type, data, 1); in hidp_get_raw_report()
287 gets put in session->report_return. */ in hidp_get_raw_report()
288 while (test_bit(HIDP_WAITING_FOR_RETURN, &session->flags) && in hidp_get_raw_report()
289 !atomic_read(&session->terminate)) { in hidp_get_raw_report()
292 res = wait_event_interruptible_timeout(session->report_queue, in hidp_get_raw_report()
293 !test_bit(HIDP_WAITING_FOR_RETURN, &session->flags) in hidp_get_raw_report()
294 || atomic_read(&session->terminate), in hidp_get_raw_report()
308 skb = session->report_return; in hidp_get_raw_report()
314 session->report_return = NULL; in hidp_get_raw_report()
320 clear_bit(HIDP_WAITING_FOR_RETURN, &session->flags); in hidp_get_raw_report()
321 mutex_unlock(&session->report_mutex); in hidp_get_raw_report()
326 clear_bit(HIDP_WAITING_FOR_RETURN, &session->flags); in hidp_get_raw_report()
327 mutex_unlock(&session->report_mutex); in hidp_get_raw_report()
335 struct hidp_session *session = hid->driver_data; in hidp_set_raw_report() local
352 if (mutex_lock_interruptible(&session->report_mutex)) in hidp_set_raw_report()
357 set_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags); in hidp_set_raw_report()
358 ret = hidp_send_ctrl_message(session, report_type, data, count); in hidp_set_raw_report()
363 while (test_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags) && in hidp_set_raw_report()
364 !atomic_read(&session->terminate)) { in hidp_set_raw_report()
367 res = wait_event_interruptible_timeout(session->report_queue, in hidp_set_raw_report()
368 !test_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags) in hidp_set_raw_report()
369 || atomic_read(&session->terminate), in hidp_set_raw_report()
383 if (!session->output_report_success) { in hidp_set_raw_report()
391 clear_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags); in hidp_set_raw_report()
392 mutex_unlock(&session->report_mutex); in hidp_set_raw_report()
398 struct hidp_session *session = hid->driver_data; in hidp_output_report() local
400 return hidp_send_intr_message(session, in hidp_output_report()
421 struct hidp_session *session = timer_container_of(session, t, timer); in hidp_idle_timeout() local
432 session->intr_sock->sk->sk_err = EUNATCH; in hidp_idle_timeout()
433 session->ctrl_sock->sk->sk_err = EUNATCH; in hidp_idle_timeout()
434 wake_up_interruptible(sk_sleep(session->intr_sock->sk)); in hidp_idle_timeout()
435 wake_up_interruptible(sk_sleep(session->ctrl_sock->sk)); in hidp_idle_timeout()
437 hidp_session_terminate(session); in hidp_idle_timeout()
440 static void hidp_set_timer(struct hidp_session *session) in hidp_set_timer() argument
442 if (session->idle_to > 0) in hidp_set_timer()
443 mod_timer(&session->timer, jiffies + HZ * session->idle_to); in hidp_set_timer()
446 static void hidp_del_timer(struct hidp_session *session) in hidp_del_timer() argument
448 if (session->idle_to > 0) in hidp_del_timer()
449 timer_delete_sync(&session->timer); in hidp_del_timer()
452 static void hidp_process_report(struct hidp_session *session, int type, in hidp_process_report() argument
458 memcpy(session->input_buf, data, len); in hidp_process_report()
459 hid_input_report(session->hid, type, session->input_buf, len, intr); in hidp_process_report()
462 static void hidp_process_handshake(struct hidp_session *session, in hidp_process_handshake() argument
465 BT_DBG("session %p param 0x%02x", session, param); in hidp_process_handshake()
466 session->output_report_success = 0; /* default condition */ in hidp_process_handshake()
471 session->output_report_success = 1; in hidp_process_handshake()
478 if (test_and_clear_bit(HIDP_WAITING_FOR_RETURN, &session->flags)) in hidp_process_handshake()
479 wake_up_interruptible(&session->report_queue); in hidp_process_handshake()
490 hidp_send_ctrl_message(session, in hidp_process_handshake()
495 hidp_send_ctrl_message(session, in hidp_process_handshake()
501 if (test_and_clear_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags)) in hidp_process_handshake()
502 wake_up_interruptible(&session->report_queue); in hidp_process_handshake()
505 static void hidp_process_hid_control(struct hidp_session *session, in hidp_process_hid_control() argument
508 BT_DBG("session %p param 0x%02x", session, param); in hidp_process_hid_control()
512 skb_queue_purge(&session->ctrl_transmit); in hidp_process_hid_control()
513 skb_queue_purge(&session->intr_transmit); in hidp_process_hid_control()
515 hidp_session_terminate(session); in hidp_process_hid_control()
520 static int hidp_process_data(struct hidp_session *session, struct sk_buff *skb, in hidp_process_data() argument
524 BT_DBG("session %p skb %p len %u param 0x%02x", session, skb, skb->len, param); in hidp_process_data()
528 hidp_set_timer(session); in hidp_process_data()
530 if (session->input) in hidp_process_data()
531 hidp_input_report(session, skb); in hidp_process_data()
533 if (session->hid) in hidp_process_data()
534 hidp_process_report(session, HID_INPUT_REPORT, in hidp_process_data()
544 hidp_send_ctrl_message(session, in hidp_process_data()
548 if (test_bit(HIDP_WAITING_FOR_RETURN, &session->flags) && in hidp_process_data()
549 param == session->waiting_report_type) { in hidp_process_data()
550 if (session->waiting_report_number < 0 || in hidp_process_data()
551 session->waiting_report_number == skb->data[0]) { in hidp_process_data()
553 session->report_return = skb; in hidp_process_data()
555 clear_bit(HIDP_WAITING_FOR_RETURN, &session->flags); in hidp_process_data()
556 wake_up_interruptible(&session->report_queue); in hidp_process_data()
563 static void hidp_recv_ctrl_frame(struct hidp_session *session, in hidp_recv_ctrl_frame() argument
569 BT_DBG("session %p skb %p len %u", session, skb, skb->len); in hidp_recv_ctrl_frame()
579 hidp_process_handshake(session, param); in hidp_recv_ctrl_frame()
583 hidp_process_hid_control(session, param); in hidp_recv_ctrl_frame()
587 free_skb = hidp_process_data(session, skb, param); in hidp_recv_ctrl_frame()
591 hidp_send_ctrl_message(session, in hidp_recv_ctrl_frame()
600 static void hidp_recv_intr_frame(struct hidp_session *session, in hidp_recv_intr_frame() argument
605 BT_DBG("session %p skb %p len %u", session, skb, skb->len); in hidp_recv_intr_frame()
611 hidp_set_timer(session); in hidp_recv_intr_frame()
613 if (session->input) in hidp_recv_intr_frame()
614 hidp_input_report(session, skb); in hidp_recv_intr_frame()
616 if (session->hid) { in hidp_recv_intr_frame()
617 hidp_process_report(session, HID_INPUT_REPORT, in hidp_recv_intr_frame()
644 static void hidp_process_transmit(struct hidp_session *session, in hidp_process_transmit() argument
651 BT_DBG("session %p", session); in hidp_process_transmit()
659 hidp_session_terminate(session); in hidp_process_transmit()
664 hidp_set_timer(session); in hidp_process_transmit()
669 static int hidp_setup_input(struct hidp_session *session, in hidp_setup_input() argument
679 session->input = input; in hidp_setup_input()
681 input_set_drvdata(input, session); in hidp_setup_input()
716 input->dev.parent = &session->conn->hcon->dev; in hidp_setup_input()
734 struct hidp_session *session = hid->driver_data; in hidp_parse() local
736 return hid_parse_report(session->hid, session->rd_data, in hidp_parse()
737 session->rd_size); in hidp_parse()
747 struct hidp_session *session = hid->driver_data; in hidp_stop() local
749 skb_queue_purge(&session->ctrl_transmit); in hidp_stop()
750 skb_queue_purge(&session->intr_transmit); in hidp_stop()
767 static int hidp_setup_hid(struct hidp_session *session, in hidp_setup_hid() argument
773 session->rd_data = memdup_user(req->rd_data, req->rd_size); in hidp_setup_hid()
774 if (IS_ERR(session->rd_data)) in hidp_setup_hid()
775 return PTR_ERR(session->rd_data); in hidp_setup_hid()
777 session->rd_size = req->rd_size; in hidp_setup_hid()
785 session->hid = hid; in hidp_setup_hid()
787 hid->driver_data = session; in hidp_setup_hid()
798 &l2cap_pi(session->ctrl_sock->sk)->chan->src); in hidp_setup_hid()
804 &l2cap_pi(session->ctrl_sock->sk)->chan->dst); in hidp_setup_hid()
806 hid->dev.parent = &session->conn->hcon->dev; in hidp_setup_hid()
811 hid_destroy_device(session->hid); in hidp_setup_hid()
812 session->hid = NULL; in hidp_setup_hid()
819 kfree(session->rd_data); in hidp_setup_hid()
820 session->rd_data = NULL; in hidp_setup_hid()
825 /* initialize session devices */
826 static int hidp_session_dev_init(struct hidp_session *session, in hidp_session_dev_init() argument
832 ret = hidp_setup_hid(session, req); in hidp_session_dev_init()
837 if (!session->hid) { in hidp_session_dev_init()
838 ret = hidp_setup_input(session, req); in hidp_session_dev_init()
846 /* destroy session devices */
847 static void hidp_session_dev_destroy(struct hidp_session *session) in hidp_session_dev_destroy() argument
849 if (session->hid) in hidp_session_dev_destroy()
850 put_device(&session->hid->dev); in hidp_session_dev_destroy()
851 else if (session->input) in hidp_session_dev_destroy()
852 input_put_device(session->input); in hidp_session_dev_destroy()
854 kfree(session->rd_data); in hidp_session_dev_destroy()
855 session->rd_data = NULL; in hidp_session_dev_destroy()
859 static int hidp_session_dev_add(struct hidp_session *session) in hidp_session_dev_add() argument
868 if (session->hid) { in hidp_session_dev_add()
869 ret = hid_add_device(session->hid); in hidp_session_dev_add()
872 get_device(&session->hid->dev); in hidp_session_dev_add()
873 } else if (session->input) { in hidp_session_dev_add()
874 ret = input_register_device(session->input); in hidp_session_dev_add()
877 input_get_device(session->input); in hidp_session_dev_add()
884 static void hidp_session_dev_del(struct hidp_session *session) in hidp_session_dev_del() argument
886 if (session->hid) in hidp_session_dev_del()
887 hid_destroy_device(session->hid); in hidp_session_dev_del()
888 else if (session->input) in hidp_session_dev_del()
889 input_unregister_device(session->input); in hidp_session_dev_del()
898 * successfully. This will then add the devices and increase session state
899 * on success, otherwise it will terminate the session thread.
903 struct hidp_session *session = container_of(work, in hidp_session_dev_work() local
908 ret = hidp_session_dev_add(session); in hidp_session_dev_work()
910 atomic_inc(&session->state); in hidp_session_dev_work()
912 hidp_session_terminate(session); in hidp_session_dev_work()
916 * Create new session object
917 * Allocate session object, initialize static fields, copy input data into the
919 * This returns 0 on success and puts a pointer to the new session object in
921 * The new session object has an initial ref-count of 1.
929 struct hidp_session *session; in hidp_session_new() local
936 session = kzalloc_obj(*session); in hidp_session_new()
937 if (!session) in hidp_session_new()
941 kref_init(&session->ref); in hidp_session_new()
942 atomic_set(&session->state, HIDP_SESSION_IDLING); in hidp_session_new()
943 init_waitqueue_head(&session->state_queue); in hidp_session_new()
944 session->flags = req->flags & BIT(HIDP_BLUETOOTH_VENDOR_ID); in hidp_session_new()
947 bacpy(&session->bdaddr, bdaddr); in hidp_session_new()
948 session->conn = l2cap_conn_get(conn); in hidp_session_new()
949 session->user.probe = hidp_session_probe; in hidp_session_new()
950 session->user.remove = hidp_session_remove; in hidp_session_new()
951 INIT_LIST_HEAD(&session->user.list); in hidp_session_new()
952 session->ctrl_sock = ctrl_sock; in hidp_session_new()
953 session->intr_sock = intr_sock; in hidp_session_new()
954 skb_queue_head_init(&session->ctrl_transmit); in hidp_session_new()
955 skb_queue_head_init(&session->intr_transmit); in hidp_session_new()
956 session->ctrl_mtu = min_t(uint, l2cap_pi(ctrl)->chan->omtu, in hidp_session_new()
958 session->intr_mtu = min_t(uint, l2cap_pi(intr)->chan->omtu, in hidp_session_new()
960 session->idle_to = req->idle_to; in hidp_session_new()
963 INIT_WORK(&session->dev_init, hidp_session_dev_work); in hidp_session_new()
964 timer_setup(&session->timer, hidp_idle_timeout, 0); in hidp_session_new()
966 /* session data */ in hidp_session_new()
967 mutex_init(&session->report_mutex); in hidp_session_new()
968 init_waitqueue_head(&session->report_queue); in hidp_session_new()
970 ret = hidp_session_dev_init(session, req); in hidp_session_new()
974 get_file(session->intr_sock->file); in hidp_session_new()
975 get_file(session->ctrl_sock->file); in hidp_session_new()
976 *out = session; in hidp_session_new()
980 l2cap_conn_put(session->conn); in hidp_session_new()
981 kfree(session); in hidp_session_new()
985 /* increase ref-count of the given session by one */
986 static void hidp_session_get(struct hidp_session *session) in hidp_session_get() argument
988 kref_get(&session->ref); in hidp_session_get()
994 struct hidp_session *session = container_of(ref, struct hidp_session, in session_free() local
997 hidp_session_dev_destroy(session); in session_free()
998 skb_queue_purge(&session->ctrl_transmit); in session_free()
999 skb_queue_purge(&session->intr_transmit); in session_free()
1000 fput(session->intr_sock->file); in session_free()
1001 fput(session->ctrl_sock->file); in session_free()
1002 if (session->conn) in session_free()
1003 l2cap_conn_put(session->conn); in session_free()
1004 kfree(session); in session_free()
1007 /* decrease ref-count of the given session by one */
1008 static void hidp_session_put(struct hidp_session *session) in hidp_session_put() argument
1010 kref_put(&session->ref, session_free); in hidp_session_put()
1014 * Search the list of active sessions for a session with target address
1016 * you do not release this lock, the session objects cannot vanish and you can
1017 * safely take a reference to the session yourself.
1021 struct hidp_session *session; in __hidp_session_find() local
1023 list_for_each_entry(session, &hidp_session_list, list) { in __hidp_session_find()
1024 if (!bacmp(bdaddr, &session->bdaddr)) in __hidp_session_find()
1025 return session; in __hidp_session_find()
1033 * reference of the returned session (if non-NULL) so you must drop this
1038 struct hidp_session *session; in hidp_session_find() local
1042 session = __hidp_session_find(bdaddr); in hidp_session_find()
1043 if (session) in hidp_session_find()
1044 hidp_session_get(session); in hidp_session_find()
1048 return session; in hidp_session_find()
1052 * Consume session->conn: clear the member under hidp_session_sem, then
1057 static void hidp_session_unregister_conn(struct hidp_session *session) in hidp_session_unregister_conn() argument
1062 conn = session->conn; in hidp_session_unregister_conn()
1064 session->conn = NULL; in hidp_session_unregister_conn()
1068 l2cap_unregister_user(conn, &session->user); in hidp_session_unregister_conn()
1074 * Start session synchronously
1075 * This starts a session thread and waits until initialization
1077 * If this returns 0 the session thread is up and running. You must call
1080 static int hidp_session_start_sync(struct hidp_session *session) in hidp_session_start_sync() argument
1084 if (session->hid) { in hidp_session_start_sync()
1085 vendor = session->hid->vendor; in hidp_session_start_sync()
1086 product = session->hid->product; in hidp_session_start_sync()
1087 } else if (session->input) { in hidp_session_start_sync()
1088 vendor = session->input->id.vendor; in hidp_session_start_sync()
1089 product = session->input->id.product; in hidp_session_start_sync()
1095 session->task = kthread_run(hidp_session_thread, session, in hidp_session_start_sync()
1097 if (IS_ERR(session->task)) in hidp_session_start_sync()
1098 return PTR_ERR(session->task); in hidp_session_start_sync()
1100 while (atomic_read(&session->state) <= HIDP_SESSION_IDLING) in hidp_session_start_sync()
1101 wait_event(session->state_queue, in hidp_session_start_sync()
1102 atomic_read(&session->state) > HIDP_SESSION_IDLING); in hidp_session_start_sync()
1108 * Terminate session thread
1109 * Wake up session thread and notify it to stop. This is asynchronous and
1111 * the session to stop.
1114 static void hidp_session_terminate(struct hidp_session *session) in hidp_session_terminate() argument
1116 atomic_inc(&session->terminate); in hidp_session_terminate()
1125 * Probe HIDP session
1127 * to the hci-connection. We get the session via the \user object and can now
1128 * start the session thread, link it into the global session list and
1130 * The global session-list owns its own reference to the session object so you
1136 struct hidp_session *session = container_of(user, in hidp_session_probe() local
1144 /* check that no other session for this device exists */ in hidp_session_probe()
1145 s = __hidp_session_find(&session->bdaddr); in hidp_session_probe()
1151 if (session->input) { in hidp_session_probe()
1152 ret = hidp_session_dev_add(session); in hidp_session_probe()
1157 ret = hidp_session_start_sync(session); in hidp_session_probe()
1162 if (session->input) in hidp_session_probe()
1163 atomic_inc(&session->state); in hidp_session_probe()
1165 schedule_work(&session->dev_init); in hidp_session_probe()
1167 hidp_session_get(session); in hidp_session_probe()
1168 list_add(&session->list, &hidp_session_list); in hidp_session_probe()
1173 if (session->input) in hidp_session_probe()
1174 hidp_session_dev_del(session); in hidp_session_probe()
1181 * Remove HIDP session
1184 * We signal the hidp-session thread to shut down, unregister the HID/input
1185 * devices and unlink the session from the global list.
1186 * This drops the reference to the session that is owned by the global
1187 * session-list.
1188 * Note: We _must_ not synchronosly wait for the session-thread to shut down.
1189 * This is, because the session-thread might be waiting for an HCI lock that is
1191 * notify the session-thread to terminate. The thread itself owns a reference
1192 * to the session object so it can safely shut down.
1197 struct hidp_session *session = container_of(user, in hidp_session_remove() local
1207 if (session->conn) { in hidp_session_remove()
1208 l2cap_conn_put(session->conn); in hidp_session_remove()
1209 session->conn = NULL; in hidp_session_remove()
1212 hidp_session_terminate(session); in hidp_session_remove()
1214 cancel_work_sync(&session->dev_init); in hidp_session_remove()
1215 if (session->input || in hidp_session_remove()
1216 atomic_read(&session->state) > HIDP_SESSION_PREPARING) in hidp_session_remove()
1217 hidp_session_dev_del(session); in hidp_session_remove()
1219 list_del(&session->list); in hidp_session_remove()
1223 hidp_session_put(session); in hidp_session_remove()
1227 * Session Worker
1232 static void hidp_session_run(struct hidp_session *session) in hidp_session_run() argument
1234 struct sock *ctrl_sk = session->ctrl_sock->sk; in hidp_session_run()
1235 struct sock *intr_sk = session->intr_sock->sk; in hidp_session_run()
1244 * session->terminate flag and wakes this thread up. in hidp_session_run()
1249 if (atomic_read(&session->terminate)) in hidp_session_run()
1260 hidp_recv_intr_frame(session, skb); in hidp_session_run()
1266 hidp_process_transmit(session, &session->intr_transmit, in hidp_session_run()
1267 session->intr_sock); in hidp_session_run()
1273 hidp_recv_ctrl_frame(session, skb); in hidp_session_run()
1279 hidp_process_transmit(session, &session->ctrl_transmit, in hidp_session_run()
1280 session->ctrl_sock); in hidp_session_run()
1290 atomic_inc(&session->terminate); in hidp_session_run()
1302 * HIDP session thread
1303 * This thread runs the I/O for a single HIDP session. Startup is synchronous
1310 struct hidp_session *session = arg; in hidp_session_thread() local
1314 BT_DBG("session %p", session); in hidp_session_thread()
1317 hidp_session_get(session); in hidp_session_thread()
1320 hidp_set_timer(session); in hidp_session_thread()
1322 add_wait_queue(sk_sleep(session->ctrl_sock->sk), &ctrl_wait); in hidp_session_thread()
1323 add_wait_queue(sk_sleep(session->intr_sock->sk), &intr_wait); in hidp_session_thread()
1329 atomic_inc(&session->state); in hidp_session_thread()
1330 wake_up(&session->state_queue); in hidp_session_thread()
1332 /* run session */ in hidp_session_thread()
1333 hidp_session_run(session); in hidp_session_thread()
1336 remove_wait_queue(sk_sleep(session->intr_sock->sk), &intr_wait); in hidp_session_thread()
1337 remove_wait_queue(sk_sleep(session->ctrl_sock->sk), &ctrl_wait); in hidp_session_thread()
1338 wake_up_interruptible(&session->report_queue); in hidp_session_thread()
1339 hidp_del_timer(session); in hidp_session_thread()
1343 * unregister our own session here to avoid having it linger until the in hidp_session_thread()
1347 * delete the session. in hidp_session_thread()
1349 hidp_session_unregister_conn(session); in hidp_session_thread()
1351 hidp_session_put(session); in hidp_session_thread()
1362 struct hidp_session *session; in hidp_verify_sockets() local
1381 /* early session check, we check again during session registration */ in hidp_verify_sockets()
1382 session = hidp_session_find(&ctrl_chan->dst); in hidp_verify_sockets()
1383 if (session) { in hidp_verify_sockets()
1384 hidp_session_put(session); in hidp_verify_sockets()
1397 struct hidp_session *session; in hidp_connection_add() local
1419 ret = hidp_session_new(&session, &chan->dst, ctrl_sock, in hidp_connection_add()
1424 ret = l2cap_register_user(conn, &session->user); in hidp_connection_add()
1431 hidp_session_put(session); in hidp_connection_add()
1440 struct hidp_session *session; in hidp_connection_del() local
1445 session = hidp_session_find(&req->bdaddr); in hidp_connection_del()
1446 if (!session) in hidp_connection_del()
1450 hidp_send_ctrl_message(session, in hidp_connection_del()
1455 hidp_session_unregister_conn(session); in hidp_connection_del()
1457 hidp_session_put(session); in hidp_connection_del()
1464 struct hidp_session *session; in hidp_get_connlist() local
1471 list_for_each_entry(session, &hidp_session_list, list) { in hidp_get_connlist()
1474 hidp_copy_session(session, &ci); in hidp_get_connlist()
1494 struct hidp_session *session; in hidp_get_conninfo() local
1496 session = hidp_session_find(&ci->bdaddr); in hidp_get_conninfo()
1497 if (session) { in hidp_get_conninfo()
1498 hidp_copy_session(session, ci); in hidp_get_conninfo()
1499 hidp_session_put(session); in hidp_get_conninfo()
1502 return session ? 0 : -ENOENT; in hidp_get_conninfo()