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()
238 struct hidp_session *session = hid->driver_data; in hidp_get_raw_report() local
244 if (atomic_read(&session->terminate)) in hidp_get_raw_report()
261 if (mutex_lock_interruptible(&session->report_mutex)) in hidp_get_raw_report()
265 session->waiting_report_type = report_type & HIDP_DATA_RTYPE_MASK; in hidp_get_raw_report()
266 session->waiting_report_number = numbered_reports ? report_number : -1; in hidp_get_raw_report()
267 set_bit(HIDP_WAITING_FOR_RETURN, &session->flags); in hidp_get_raw_report()
269 ret = hidp_send_ctrl_message(session, report_type, data, 1); in hidp_get_raw_report()
274 gets put in session->report_return. */ in hidp_get_raw_report()
275 while (test_bit(HIDP_WAITING_FOR_RETURN, &session->flags) && in hidp_get_raw_report()
276 !atomic_read(&session->terminate)) { in hidp_get_raw_report()
279 res = wait_event_interruptible_timeout(session->report_queue, in hidp_get_raw_report()
280 !test_bit(HIDP_WAITING_FOR_RETURN, &session->flags) in hidp_get_raw_report()
281 || atomic_read(&session->terminate), in hidp_get_raw_report()
295 skb = session->report_return; in hidp_get_raw_report()
301 session->report_return = NULL; in hidp_get_raw_report()
307 clear_bit(HIDP_WAITING_FOR_RETURN, &session->flags); in hidp_get_raw_report()
308 mutex_unlock(&session->report_mutex); in hidp_get_raw_report()
313 clear_bit(HIDP_WAITING_FOR_RETURN, &session->flags); in hidp_get_raw_report()
314 mutex_unlock(&session->report_mutex); in hidp_get_raw_report()
322 struct hidp_session *session = hid->driver_data; in hidp_set_raw_report() local
339 if (mutex_lock_interruptible(&session->report_mutex)) in hidp_set_raw_report()
344 set_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags); in hidp_set_raw_report()
345 ret = hidp_send_ctrl_message(session, report_type, data, count); in hidp_set_raw_report()
350 while (test_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags) && in hidp_set_raw_report()
351 !atomic_read(&session->terminate)) { in hidp_set_raw_report()
354 res = wait_event_interruptible_timeout(session->report_queue, in hidp_set_raw_report()
355 !test_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags) in hidp_set_raw_report()
356 || atomic_read(&session->terminate), in hidp_set_raw_report()
370 if (!session->output_report_success) { in hidp_set_raw_report()
378 clear_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags); in hidp_set_raw_report()
379 mutex_unlock(&session->report_mutex); in hidp_set_raw_report()
385 struct hidp_session *session = hid->driver_data; in hidp_output_report() local
387 return hidp_send_intr_message(session, in hidp_output_report()
408 struct hidp_session *session = from_timer(session, t, timer); in hidp_idle_timeout() local
419 session->intr_sock->sk->sk_err = EUNATCH; in hidp_idle_timeout()
420 session->ctrl_sock->sk->sk_err = EUNATCH; in hidp_idle_timeout()
421 wake_up_interruptible(sk_sleep(session->intr_sock->sk)); in hidp_idle_timeout()
422 wake_up_interruptible(sk_sleep(session->ctrl_sock->sk)); in hidp_idle_timeout()
424 hidp_session_terminate(session); in hidp_idle_timeout()
427 static void hidp_set_timer(struct hidp_session *session) in hidp_set_timer() argument
429 if (session->idle_to > 0) in hidp_set_timer()
430 mod_timer(&session->timer, jiffies + HZ * session->idle_to); in hidp_set_timer()
433 static void hidp_del_timer(struct hidp_session *session) in hidp_del_timer() argument
435 if (session->idle_to > 0) in hidp_del_timer()
436 del_timer_sync(&session->timer); in hidp_del_timer()
439 static void hidp_process_report(struct hidp_session *session, int type, in hidp_process_report() argument
445 memcpy(session->input_buf, data, len); in hidp_process_report()
446 hid_input_report(session->hid, type, session->input_buf, len, intr); in hidp_process_report()
449 static void hidp_process_handshake(struct hidp_session *session, in hidp_process_handshake() argument
452 BT_DBG("session %p param 0x%02x", session, param); in hidp_process_handshake()
453 session->output_report_success = 0; /* default condition */ in hidp_process_handshake()
458 session->output_report_success = 1; in hidp_process_handshake()
465 if (test_and_clear_bit(HIDP_WAITING_FOR_RETURN, &session->flags)) in hidp_process_handshake()
466 wake_up_interruptible(&session->report_queue); in hidp_process_handshake()
477 hidp_send_ctrl_message(session, in hidp_process_handshake()
482 hidp_send_ctrl_message(session, in hidp_process_handshake()
488 if (test_and_clear_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags)) in hidp_process_handshake()
489 wake_up_interruptible(&session->report_queue); in hidp_process_handshake()
492 static void hidp_process_hid_control(struct hidp_session *session, in hidp_process_hid_control() argument
495 BT_DBG("session %p param 0x%02x", session, param); in hidp_process_hid_control()
499 skb_queue_purge(&session->ctrl_transmit); in hidp_process_hid_control()
500 skb_queue_purge(&session->intr_transmit); in hidp_process_hid_control()
502 hidp_session_terminate(session); in hidp_process_hid_control()
507 static int hidp_process_data(struct hidp_session *session, struct sk_buff *skb, in hidp_process_data() argument
511 BT_DBG("session %p skb %p len %u param 0x%02x", session, skb, skb->len, param); in hidp_process_data()
515 hidp_set_timer(session); in hidp_process_data()
517 if (session->input) in hidp_process_data()
518 hidp_input_report(session, skb); in hidp_process_data()
520 if (session->hid) in hidp_process_data()
521 hidp_process_report(session, HID_INPUT_REPORT, in hidp_process_data()
531 hidp_send_ctrl_message(session, in hidp_process_data()
535 if (test_bit(HIDP_WAITING_FOR_RETURN, &session->flags) && in hidp_process_data()
536 param == session->waiting_report_type) { in hidp_process_data()
537 if (session->waiting_report_number < 0 || in hidp_process_data()
538 session->waiting_report_number == skb->data[0]) { in hidp_process_data()
540 session->report_return = skb; in hidp_process_data()
542 clear_bit(HIDP_WAITING_FOR_RETURN, &session->flags); in hidp_process_data()
543 wake_up_interruptible(&session->report_queue); in hidp_process_data()
550 static void hidp_recv_ctrl_frame(struct hidp_session *session, in hidp_recv_ctrl_frame() argument
556 BT_DBG("session %p skb %p len %u", session, skb, skb->len); in hidp_recv_ctrl_frame()
566 hidp_process_handshake(session, param); in hidp_recv_ctrl_frame()
570 hidp_process_hid_control(session, param); in hidp_recv_ctrl_frame()
574 free_skb = hidp_process_data(session, skb, param); in hidp_recv_ctrl_frame()
578 hidp_send_ctrl_message(session, in hidp_recv_ctrl_frame()
587 static void hidp_recv_intr_frame(struct hidp_session *session, in hidp_recv_intr_frame() argument
592 BT_DBG("session %p skb %p len %u", session, skb, skb->len); in hidp_recv_intr_frame()
598 hidp_set_timer(session); in hidp_recv_intr_frame()
600 if (session->input) in hidp_recv_intr_frame()
601 hidp_input_report(session, skb); in hidp_recv_intr_frame()
603 if (session->hid) { in hidp_recv_intr_frame()
604 hidp_process_report(session, HID_INPUT_REPORT, in hidp_recv_intr_frame()
631 static void hidp_process_transmit(struct hidp_session *session, in hidp_process_transmit() argument
638 BT_DBG("session %p", session); in hidp_process_transmit()
646 hidp_session_terminate(session); in hidp_process_transmit()
651 hidp_set_timer(session); in hidp_process_transmit()
656 static int hidp_setup_input(struct hidp_session *session, in hidp_setup_input() argument
666 session->input = input; in hidp_setup_input()
668 input_set_drvdata(input, session); in hidp_setup_input()
703 input->dev.parent = &session->conn->hcon->dev; in hidp_setup_input()
721 struct hidp_session *session = hid->driver_data; in hidp_parse() local
723 return hid_parse_report(session->hid, session->rd_data, in hidp_parse()
724 session->rd_size); in hidp_parse()
734 struct hidp_session *session = hid->driver_data; in hidp_stop() local
736 skb_queue_purge(&session->ctrl_transmit); in hidp_stop()
737 skb_queue_purge(&session->intr_transmit); in hidp_stop()
754 static int hidp_setup_hid(struct hidp_session *session, in hidp_setup_hid() argument
760 session->rd_data = memdup_user(req->rd_data, req->rd_size); in hidp_setup_hid()
761 if (IS_ERR(session->rd_data)) in hidp_setup_hid()
762 return PTR_ERR(session->rd_data); in hidp_setup_hid()
764 session->rd_size = req->rd_size; in hidp_setup_hid()
772 session->hid = hid; in hidp_setup_hid()
774 hid->driver_data = session; in hidp_setup_hid()
785 &l2cap_pi(session->ctrl_sock->sk)->chan->src); in hidp_setup_hid()
791 &l2cap_pi(session->ctrl_sock->sk)->chan->dst); in hidp_setup_hid()
793 hid->dev.parent = &session->conn->hcon->dev; in hidp_setup_hid()
798 hid_destroy_device(session->hid); in hidp_setup_hid()
799 session->hid = NULL; in hidp_setup_hid()
806 kfree(session->rd_data); in hidp_setup_hid()
807 session->rd_data = NULL; in hidp_setup_hid()
812 /* initialize session devices */
813 static int hidp_session_dev_init(struct hidp_session *session, in hidp_session_dev_init() argument
819 ret = hidp_setup_hid(session, req); in hidp_session_dev_init()
824 if (!session->hid) { in hidp_session_dev_init()
825 ret = hidp_setup_input(session, req); in hidp_session_dev_init()
833 /* destroy session devices */
834 static void hidp_session_dev_destroy(struct hidp_session *session) in hidp_session_dev_destroy() argument
836 if (session->hid) in hidp_session_dev_destroy()
837 put_device(&session->hid->dev); in hidp_session_dev_destroy()
838 else if (session->input) in hidp_session_dev_destroy()
839 input_put_device(session->input); in hidp_session_dev_destroy()
841 kfree(session->rd_data); in hidp_session_dev_destroy()
842 session->rd_data = NULL; in hidp_session_dev_destroy()
846 static int hidp_session_dev_add(struct hidp_session *session) in hidp_session_dev_add() argument
855 if (session->hid) { in hidp_session_dev_add()
856 ret = hid_add_device(session->hid); in hidp_session_dev_add()
859 get_device(&session->hid->dev); in hidp_session_dev_add()
860 } else if (session->input) { in hidp_session_dev_add()
861 ret = input_register_device(session->input); in hidp_session_dev_add()
864 input_get_device(session->input); in hidp_session_dev_add()
871 static void hidp_session_dev_del(struct hidp_session *session) in hidp_session_dev_del() argument
873 if (session->hid) in hidp_session_dev_del()
874 hid_destroy_device(session->hid); in hidp_session_dev_del()
875 else if (session->input) in hidp_session_dev_del()
876 input_unregister_device(session->input); in hidp_session_dev_del()
885 * successfully. This will then add the devices and increase session state
886 * on success, otherwise it will terminate the session thread.
890 struct hidp_session *session = container_of(work, in hidp_session_dev_work() local
895 ret = hidp_session_dev_add(session); in hidp_session_dev_work()
897 atomic_inc(&session->state); in hidp_session_dev_work()
899 hidp_session_terminate(session); in hidp_session_dev_work()
903 * Create new session object
904 * Allocate session object, initialize static fields, copy input data into the
906 * This returns 0 on success and puts a pointer to the new session object in
908 * The new session object has an initial ref-count of 1.
916 struct hidp_session *session; in hidp_session_new() local
923 session = kzalloc(sizeof(*session), GFP_KERNEL); in hidp_session_new()
924 if (!session) in hidp_session_new()
928 kref_init(&session->ref); in hidp_session_new()
929 atomic_set(&session->state, HIDP_SESSION_IDLING); in hidp_session_new()
930 init_waitqueue_head(&session->state_queue); in hidp_session_new()
931 session->flags = req->flags & BIT(HIDP_BLUETOOTH_VENDOR_ID); in hidp_session_new()
934 bacpy(&session->bdaddr, bdaddr); in hidp_session_new()
935 session->conn = l2cap_conn_get(conn); in hidp_session_new()
936 session->user.probe = hidp_session_probe; in hidp_session_new()
937 session->user.remove = hidp_session_remove; in hidp_session_new()
938 INIT_LIST_HEAD(&session->user.list); in hidp_session_new()
939 session->ctrl_sock = ctrl_sock; in hidp_session_new()
940 session->intr_sock = intr_sock; in hidp_session_new()
941 skb_queue_head_init(&session->ctrl_transmit); in hidp_session_new()
942 skb_queue_head_init(&session->intr_transmit); in hidp_session_new()
943 session->ctrl_mtu = min_t(uint, l2cap_pi(ctrl)->chan->omtu, in hidp_session_new()
945 session->intr_mtu = min_t(uint, l2cap_pi(intr)->chan->omtu, in hidp_session_new()
947 session->idle_to = req->idle_to; in hidp_session_new()
950 INIT_WORK(&session->dev_init, hidp_session_dev_work); in hidp_session_new()
951 timer_setup(&session->timer, hidp_idle_timeout, 0); in hidp_session_new()
953 /* session data */ in hidp_session_new()
954 mutex_init(&session->report_mutex); in hidp_session_new()
955 init_waitqueue_head(&session->report_queue); in hidp_session_new()
957 ret = hidp_session_dev_init(session, req); in hidp_session_new()
961 get_file(session->intr_sock->file); in hidp_session_new()
962 get_file(session->ctrl_sock->file); in hidp_session_new()
963 *out = session; in hidp_session_new()
967 l2cap_conn_put(session->conn); in hidp_session_new()
968 kfree(session); in hidp_session_new()
972 /* increase ref-count of the given session by one */
973 static void hidp_session_get(struct hidp_session *session) in hidp_session_get() argument
975 kref_get(&session->ref); in hidp_session_get()
981 struct hidp_session *session = container_of(ref, struct hidp_session, in session_free() local
984 hidp_session_dev_destroy(session); in session_free()
985 skb_queue_purge(&session->ctrl_transmit); in session_free()
986 skb_queue_purge(&session->intr_transmit); in session_free()
987 fput(session->intr_sock->file); in session_free()
988 fput(session->ctrl_sock->file); in session_free()
989 l2cap_conn_put(session->conn); in session_free()
990 kfree(session); in session_free()
993 /* decrease ref-count of the given session by one */
994 static void hidp_session_put(struct hidp_session *session) in hidp_session_put() argument
996 kref_put(&session->ref, session_free); in hidp_session_put()
1000 * Search the list of active sessions for a session with target address
1002 * you do not release this lock, the session objects cannot vanish and you can
1003 * safely take a reference to the session yourself.
1007 struct hidp_session *session; in __hidp_session_find() local
1009 list_for_each_entry(session, &hidp_session_list, list) { in __hidp_session_find()
1010 if (!bacmp(bdaddr, &session->bdaddr)) in __hidp_session_find()
1011 return session; in __hidp_session_find()
1019 * reference of the returned session (if non-NULL) so you must drop this
1024 struct hidp_session *session; in hidp_session_find() local
1028 session = __hidp_session_find(bdaddr); in hidp_session_find()
1029 if (session) in hidp_session_find()
1030 hidp_session_get(session); in hidp_session_find()
1034 return session; in hidp_session_find()
1038 * Start session synchronously
1039 * This starts a session thread and waits until initialization
1041 * If this returns 0 the session thread is up and running. You must call
1044 static int hidp_session_start_sync(struct hidp_session *session) in hidp_session_start_sync() argument
1048 if (session->hid) { in hidp_session_start_sync()
1049 vendor = session->hid->vendor; in hidp_session_start_sync()
1050 product = session->hid->product; in hidp_session_start_sync()
1051 } else if (session->input) { in hidp_session_start_sync()
1052 vendor = session->input->id.vendor; in hidp_session_start_sync()
1053 product = session->input->id.product; in hidp_session_start_sync()
1059 session->task = kthread_run(hidp_session_thread, session, in hidp_session_start_sync()
1061 if (IS_ERR(session->task)) in hidp_session_start_sync()
1062 return PTR_ERR(session->task); in hidp_session_start_sync()
1064 while (atomic_read(&session->state) <= HIDP_SESSION_IDLING) in hidp_session_start_sync()
1065 wait_event(session->state_queue, in hidp_session_start_sync()
1066 atomic_read(&session->state) > HIDP_SESSION_IDLING); in hidp_session_start_sync()
1072 * Terminate session thread
1073 * Wake up session thread and notify it to stop. This is asynchronous and
1075 * the session to stop.
1078 static void hidp_session_terminate(struct hidp_session *session) in hidp_session_terminate() argument
1080 atomic_inc(&session->terminate); in hidp_session_terminate()
1089 * Probe HIDP session
1091 * to the hci-connection. We get the session via the \user object and can now
1092 * start the session thread, link it into the global session list and
1094 * The global session-list owns its own reference to the session object so you
1100 struct hidp_session *session = container_of(user, in hidp_session_probe() local
1108 /* check that no other session for this device exists */ in hidp_session_probe()
1109 s = __hidp_session_find(&session->bdaddr); in hidp_session_probe()
1115 if (session->input) { in hidp_session_probe()
1116 ret = hidp_session_dev_add(session); in hidp_session_probe()
1121 ret = hidp_session_start_sync(session); in hidp_session_probe()
1126 if (session->input) in hidp_session_probe()
1127 atomic_inc(&session->state); in hidp_session_probe()
1129 schedule_work(&session->dev_init); in hidp_session_probe()
1131 hidp_session_get(session); in hidp_session_probe()
1132 list_add(&session->list, &hidp_session_list); in hidp_session_probe()
1137 if (session->input) in hidp_session_probe()
1138 hidp_session_dev_del(session); in hidp_session_probe()
1145 * Remove HIDP session
1148 * We signal the hidp-session thread to shut down, unregister the HID/input
1149 * devices and unlink the session from the global list.
1150 * This drops the reference to the session that is owned by the global
1151 * session-list.
1152 * Note: We _must_ not synchronosly wait for the session-thread to shut down.
1153 * This is, because the session-thread might be waiting for an HCI lock that is
1155 * notify the session-thread to terminate. The thread itself owns a reference
1156 * to the session object so it can safely shut down.
1161 struct hidp_session *session = container_of(user, in hidp_session_remove() local
1167 hidp_session_terminate(session); in hidp_session_remove()
1169 cancel_work_sync(&session->dev_init); in hidp_session_remove()
1170 if (session->input || in hidp_session_remove()
1171 atomic_read(&session->state) > HIDP_SESSION_PREPARING) in hidp_session_remove()
1172 hidp_session_dev_del(session); in hidp_session_remove()
1174 list_del(&session->list); in hidp_session_remove()
1178 hidp_session_put(session); in hidp_session_remove()
1182 * Session Worker
1187 static void hidp_session_run(struct hidp_session *session) in hidp_session_run() argument
1189 struct sock *ctrl_sk = session->ctrl_sock->sk; in hidp_session_run()
1190 struct sock *intr_sk = session->intr_sock->sk; in hidp_session_run()
1199 * session->terminate flag and wakes this thread up. in hidp_session_run()
1204 if (atomic_read(&session->terminate)) in hidp_session_run()
1215 hidp_recv_intr_frame(session, skb); in hidp_session_run()
1221 hidp_process_transmit(session, &session->intr_transmit, in hidp_session_run()
1222 session->intr_sock); in hidp_session_run()
1228 hidp_recv_ctrl_frame(session, skb); in hidp_session_run()
1234 hidp_process_transmit(session, &session->ctrl_transmit, in hidp_session_run()
1235 session->ctrl_sock); in hidp_session_run()
1245 atomic_inc(&session->terminate); in hidp_session_run()
1257 * HIDP session thread
1258 * This thread runs the I/O for a single HIDP session. Startup is synchronous
1265 struct hidp_session *session = arg; in hidp_session_thread() local
1269 BT_DBG("session %p", session); in hidp_session_thread()
1272 hidp_session_get(session); in hidp_session_thread()
1275 hidp_set_timer(session); in hidp_session_thread()
1277 add_wait_queue(sk_sleep(session->ctrl_sock->sk), &ctrl_wait); in hidp_session_thread()
1278 add_wait_queue(sk_sleep(session->intr_sock->sk), &intr_wait); in hidp_session_thread()
1284 atomic_inc(&session->state); in hidp_session_thread()
1285 wake_up(&session->state_queue); in hidp_session_thread()
1287 /* run session */ in hidp_session_thread()
1288 hidp_session_run(session); in hidp_session_thread()
1291 remove_wait_queue(sk_sleep(session->intr_sock->sk), &intr_wait); in hidp_session_thread()
1292 remove_wait_queue(sk_sleep(session->ctrl_sock->sk), &ctrl_wait); in hidp_session_thread()
1293 wake_up_interruptible(&session->report_queue); in hidp_session_thread()
1294 hidp_del_timer(session); in hidp_session_thread()
1298 * unregister our own session here to avoid having it linger until the in hidp_session_thread()
1302 * delete the session. in hidp_session_thread()
1304 l2cap_unregister_user(session->conn, &session->user); in hidp_session_thread()
1305 hidp_session_put(session); in hidp_session_thread()
1316 struct hidp_session *session; in hidp_verify_sockets() local
1335 /* early session check, we check again during session registration */ in hidp_verify_sockets()
1336 session = hidp_session_find(&ctrl_chan->dst); in hidp_verify_sockets()
1337 if (session) { in hidp_verify_sockets()
1338 hidp_session_put(session); in hidp_verify_sockets()
1351 struct hidp_session *session; in hidp_connection_add() local
1373 ret = hidp_session_new(&session, &chan->dst, ctrl_sock, in hidp_connection_add()
1378 ret = l2cap_register_user(conn, &session->user); in hidp_connection_add()
1385 hidp_session_put(session); in hidp_connection_add()
1394 struct hidp_session *session; in hidp_connection_del() local
1399 session = hidp_session_find(&req->bdaddr); in hidp_connection_del()
1400 if (!session) in hidp_connection_del()
1404 hidp_send_ctrl_message(session, in hidp_connection_del()
1409 l2cap_unregister_user(session->conn, &session->user); in hidp_connection_del()
1411 hidp_session_put(session); in hidp_connection_del()
1418 struct hidp_session *session; in hidp_get_connlist() local
1425 list_for_each_entry(session, &hidp_session_list, list) { in hidp_get_connlist()
1428 hidp_copy_session(session, &ci); in hidp_get_connlist()
1448 struct hidp_session *session; in hidp_get_conninfo() local
1450 session = hidp_session_find(&ci->bdaddr); in hidp_get_conninfo()
1451 if (session) { in hidp_get_conninfo()
1452 hidp_copy_session(session, ci); in hidp_get_conninfo()
1453 hidp_session_put(session); in hidp_get_conninfo()
1456 return session ? 0 : -ENOENT; in hidp_get_conninfo()