Lines Matching full:local

34 static void nfc_llcp_socket_release(struct nfc_llcp_local *local)  in nfc_llcp_socket_release()  argument
41 mutex_lock(&local->socket_lock); in nfc_llcp_socket_release()
44 parent = local->sockets[i]; in nfc_llcp_socket_release()
97 mutex_unlock(&local->socket_lock); in nfc_llcp_socket_release()
102 struct nfc_llcp_local *local = container_of(work, struct nfc_llcp_local, in nfc_llcp_timeout_work() local
105 nfc_dep_link_down(local->dev); in nfc_llcp_timeout_work()
110 struct nfc_llcp_local *local = (struct nfc_llcp_local *) data; in nfc_llcp_symm_timer() local
114 queue_work(local->timeout_wq, &local->timeout_work); in nfc_llcp_symm_timer()
119 struct nfc_llcp_local *local, *n; in nfc_llcp_find_local() local
121 list_for_each_entry_safe(local, n, &llcp_devices, list) in nfc_llcp_find_local()
122 if (local->dev == dev) in nfc_llcp_find_local()
123 return local; in nfc_llcp_find_local()
160 u8 nfc_llcp_get_sdp_ssap(struct nfc_llcp_local *local, in nfc_llcp_get_sdp_ssap() argument
163 mutex_lock(&local->sdp_lock); in nfc_llcp_get_sdp_ssap()
173 if (local->local_wks & BIT(ssap)) { in nfc_llcp_get_sdp_ssap()
174 mutex_unlock(&local->sdp_lock); in nfc_llcp_get_sdp_ssap()
179 set_bit(BIT(ssap), &local->local_wks); in nfc_llcp_get_sdp_ssap()
180 mutex_unlock(&local->sdp_lock); in nfc_llcp_get_sdp_ssap()
187 * we should try to find a local SDP free spot in nfc_llcp_get_sdp_ssap()
189 ssap = find_first_zero_bit(&local->local_sdp, LLCP_SDP_NUM_SAP); in nfc_llcp_get_sdp_ssap()
191 mutex_unlock(&local->sdp_lock); in nfc_llcp_get_sdp_ssap()
198 set_bit(BIT(ssap), &local->local_sdp); in nfc_llcp_get_sdp_ssap()
199 mutex_unlock(&local->sdp_lock); in nfc_llcp_get_sdp_ssap()
205 if (!(local->local_wks & BIT(sock->ssap))) { in nfc_llcp_get_sdp_ssap()
206 set_bit(BIT(sock->ssap), &local->local_wks); in nfc_llcp_get_sdp_ssap()
207 mutex_unlock(&local->sdp_lock); in nfc_llcp_get_sdp_ssap()
213 if (!(local->local_sdp & in nfc_llcp_get_sdp_ssap()
216 &local->local_sdp); in nfc_llcp_get_sdp_ssap()
217 mutex_unlock(&local->sdp_lock); in nfc_llcp_get_sdp_ssap()
224 mutex_unlock(&local->sdp_lock); in nfc_llcp_get_sdp_ssap()
229 u8 nfc_llcp_get_local_ssap(struct nfc_llcp_local *local) in nfc_llcp_get_local_ssap() argument
233 mutex_lock(&local->sdp_lock); in nfc_llcp_get_local_ssap()
235 local_ssap = find_first_zero_bit(&local->local_sap, LLCP_LOCAL_NUM_SAP); in nfc_llcp_get_local_ssap()
237 mutex_unlock(&local->sdp_lock); in nfc_llcp_get_local_ssap()
241 set_bit(BIT(local_ssap), &local->local_sap); in nfc_llcp_get_local_ssap()
243 mutex_unlock(&local->sdp_lock); in nfc_llcp_get_local_ssap()
248 void nfc_llcp_put_ssap(struct nfc_llcp_local *local, u8 ssap) in nfc_llcp_put_ssap() argument
255 sdp = &local->local_wks; in nfc_llcp_put_ssap()
258 sdp = &local->local_sdp; in nfc_llcp_put_ssap()
261 sdp = &local->local_sap; in nfc_llcp_put_ssap()
266 mutex_lock(&local->sdp_lock); in nfc_llcp_put_ssap()
270 mutex_unlock(&local->sdp_lock); in nfc_llcp_put_ssap()
275 struct nfc_llcp_local *local; in nfc_llcp_general_bytes() local
277 local = nfc_llcp_find_local(dev); in nfc_llcp_general_bytes()
278 if (local == NULL) { in nfc_llcp_general_bytes()
283 *general_bytes_len = local->gb_len; in nfc_llcp_general_bytes()
285 return local->gb; in nfc_llcp_general_bytes()
288 static int nfc_llcp_build_gb(struct nfc_llcp_local *local) in nfc_llcp_build_gb() argument
305 pr_debug("Local wks 0x%lx\n", local->local_wks); in nfc_llcp_build_gb()
306 wks_tlv = nfc_llcp_build_tlv(LLCP_TLV_WKS, (u8 *)&local->local_wks, 2, in nfc_llcp_build_gb()
317 gb_cur = local->gb; in nfc_llcp_build_gb()
334 local->gb_len = gb_len; in nfc_llcp_build_gb()
341 struct nfc_llcp_local *local = nfc_llcp_find_local(dev); in nfc_llcp_set_remote_gb() local
343 if (local == NULL) { in nfc_llcp_set_remote_gb()
348 memset(local->remote_gb, 0, NFC_MAX_GT_LEN); in nfc_llcp_set_remote_gb()
349 memcpy(local->remote_gb, gb, gb_len); in nfc_llcp_set_remote_gb()
350 local->remote_gb_len = gb_len; in nfc_llcp_set_remote_gb()
352 if (local->remote_gb == NULL || in nfc_llcp_set_remote_gb()
353 local->remote_gb_len == 0) in nfc_llcp_set_remote_gb()
356 if (memcmp(local->remote_gb, llcp_magic, 3)) { in nfc_llcp_set_remote_gb()
361 return nfc_llcp_parse_tlv(local, in nfc_llcp_set_remote_gb()
362 &local->remote_gb[3], local->remote_gb_len - 3); in nfc_llcp_set_remote_gb()
367 struct nfc_llcp_local *local = container_of(work, struct nfc_llcp_local, in nfc_llcp_tx_work() local
371 skb = skb_dequeue(&local->tx_queue); in nfc_llcp_tx_work()
374 nfc_data_exchange(local->dev, local->target_idx, in nfc_llcp_tx_work()
375 skb, nfc_llcp_recv, local); in nfc_llcp_tx_work()
377 nfc_llcp_send_symm(local->dev); in nfc_llcp_tx_work()
380 mod_timer(&local->link_timer, in nfc_llcp_tx_work()
381 jiffies + msecs_to_jiffies(local->remote_lto)); in nfc_llcp_tx_work()
416 static struct nfc_llcp_sock *nfc_llcp_sock_get(struct nfc_llcp_local *local, in nfc_llcp_sock_get() argument
424 mutex_lock(&local->socket_lock); in nfc_llcp_sock_get()
425 sock = local->sockets[ssap]; in nfc_llcp_sock_get()
427 mutex_unlock(&local->socket_lock); in nfc_llcp_sock_get()
435 mutex_unlock(&local->socket_lock); in nfc_llcp_sock_get()
444 mutex_unlock(&local->socket_lock); in nfc_llcp_sock_get()
451 mutex_unlock(&local->socket_lock); in nfc_llcp_sock_get()
484 static void nfc_llcp_recv_connect(struct nfc_llcp_local *local, in nfc_llcp_recv_connect() argument
496 nfc_llcp_parse_tlv(local, &skb->data[LLCP_HEADER_SIZE], in nfc_llcp_recv_connect()
502 mutex_lock(&local->socket_lock); in nfc_llcp_recv_connect()
503 sock = local->sockets[dsap]; in nfc_llcp_recv_connect()
505 mutex_unlock(&local->socket_lock); in nfc_llcp_recv_connect()
511 mutex_unlock(&local->socket_lock); in nfc_llcp_recv_connect()
530 mutex_lock(&local->socket_lock); in nfc_llcp_recv_connect()
533 sock = local->sockets[bound_sap]; in nfc_llcp_recv_connect()
550 mutex_unlock(&local->socket_lock); in nfc_llcp_recv_connect()
557 mutex_unlock(&local->socket_lock); in nfc_llcp_recv_connect()
583 new_sock->dev = local->dev; in nfc_llcp_recv_connect()
584 new_sock->local = local; in nfc_llcp_recv_connect()
596 nfc_get_device(local->dev->idx); in nfc_llcp_recv_connect()
613 nfc_llcp_send_dm(local, dsap, ssap, reason); in nfc_llcp_recv_connect()
619 static void nfc_llcp_recv_hdlc(struct nfc_llcp_local *local, in nfc_llcp_recv_hdlc() argument
634 llcp_sock = nfc_llcp_sock_get(local, dsap, ssap); in nfc_llcp_recv_hdlc()
636 nfc_llcp_send_dm(local, dsap, ssap, LLCP_DM_NOCONN); in nfc_llcp_recv_hdlc()
678 skb_queue_len(&llcp_sock->tx_pending_queue) <= local->remote_rw) { in nfc_llcp_recv_hdlc()
690 skb_queue_tail(&local->tx_queue, pdu); in nfc_llcp_recv_hdlc()
698 static void nfc_llcp_recv_disc(struct nfc_llcp_local *local, in nfc_llcp_recv_disc() argument
708 llcp_sock = nfc_llcp_sock_get(local, dsap, ssap); in nfc_llcp_recv_disc()
710 nfc_llcp_send_dm(local, dsap, ssap, LLCP_DM_NOCONN); in nfc_llcp_recv_disc()
723 nfc_put_device(local->dev); in nfc_llcp_recv_disc()
728 nfc_llcp_send_dm(local, dsap, ssap, LLCP_DM_DISC); in nfc_llcp_recv_disc()
734 static void nfc_llcp_recv_cc(struct nfc_llcp_local *local, in nfc_llcp_recv_cc() argument
744 llcp_sock = nfc_llcp_sock_get(local, dsap, ssap); in nfc_llcp_recv_cc()
747 llcp_sock = nfc_llcp_sock_get(local, dsap, LLCP_SAP_SDP); in nfc_llcp_recv_cc()
751 nfc_llcp_send_dm(local, dsap, ssap, LLCP_DM_NOCONN); in nfc_llcp_recv_cc()
758 nfc_llcp_parse_tlv(local, &skb->data[LLCP_HEADER_SIZE], in nfc_llcp_recv_cc()
766 struct nfc_llcp_local *local = container_of(work, struct nfc_llcp_local, in nfc_llcp_rx_work() local
771 skb = local->rx_pending; in nfc_llcp_rx_work()
790 nfc_llcp_recv_connect(local, skb); in nfc_llcp_rx_work()
795 nfc_llcp_recv_disc(local, skb); in nfc_llcp_rx_work()
800 nfc_llcp_recv_cc(local, skb); in nfc_llcp_rx_work()
806 nfc_llcp_recv_hdlc(local, skb); in nfc_llcp_rx_work()
811 queue_work(local->tx_wq, &local->tx_work); in nfc_llcp_rx_work()
812 kfree_skb(local->rx_pending); in nfc_llcp_rx_work()
813 local->rx_pending = NULL; in nfc_llcp_rx_work()
820 struct nfc_llcp_local *local = (struct nfc_llcp_local *) data; in nfc_llcp_recv() local
828 local->rx_pending = skb_get(skb); in nfc_llcp_recv()
829 del_timer(&local->link_timer); in nfc_llcp_recv()
830 queue_work(local->rx_wq, &local->rx_work); in nfc_llcp_recv()
837 struct nfc_llcp_local *local; in nfc_llcp_mac_is_down() local
839 local = nfc_llcp_find_local(dev); in nfc_llcp_mac_is_down()
840 if (local == NULL) in nfc_llcp_mac_is_down()
844 nfc_llcp_socket_release(local); in nfc_llcp_mac_is_down()
850 struct nfc_llcp_local *local; in nfc_llcp_mac_is_up() local
854 local = nfc_llcp_find_local(dev); in nfc_llcp_mac_is_up()
855 if (local == NULL) in nfc_llcp_mac_is_up()
858 local->target_idx = target_idx; in nfc_llcp_mac_is_up()
859 local->comm_mode = comm_mode; in nfc_llcp_mac_is_up()
860 local->rf_mode = rf_mode; in nfc_llcp_mac_is_up()
865 queue_work(local->tx_wq, &local->tx_work); in nfc_llcp_mac_is_up()
867 mod_timer(&local->link_timer, in nfc_llcp_mac_is_up()
868 jiffies + msecs_to_jiffies(local->remote_lto)); in nfc_llcp_mac_is_up()
875 struct nfc_llcp_local *local; in nfc_llcp_register_device() local
879 local = kzalloc(sizeof(struct nfc_llcp_local), GFP_KERNEL); in nfc_llcp_register_device()
880 if (local == NULL) in nfc_llcp_register_device()
883 local->dev = ndev; in nfc_llcp_register_device()
884 INIT_LIST_HEAD(&local->list); in nfc_llcp_register_device()
885 mutex_init(&local->sdp_lock); in nfc_llcp_register_device()
886 mutex_init(&local->socket_lock); in nfc_llcp_register_device()
887 init_timer(&local->link_timer); in nfc_llcp_register_device()
888 local->link_timer.data = (unsigned long) local; in nfc_llcp_register_device()
889 local->link_timer.function = nfc_llcp_symm_timer; in nfc_llcp_register_device()
891 skb_queue_head_init(&local->tx_queue); in nfc_llcp_register_device()
892 INIT_WORK(&local->tx_work, nfc_llcp_tx_work); in nfc_llcp_register_device()
894 local->tx_wq = alloc_workqueue(name, in nfc_llcp_register_device()
896 if (local->tx_wq == NULL) { in nfc_llcp_register_device()
901 local->rx_pending = NULL; in nfc_llcp_register_device()
902 INIT_WORK(&local->rx_work, nfc_llcp_rx_work); in nfc_llcp_register_device()
904 local->rx_wq = alloc_workqueue(name, in nfc_llcp_register_device()
906 if (local->rx_wq == NULL) { in nfc_llcp_register_device()
911 INIT_WORK(&local->timeout_work, nfc_llcp_timeout_work); in nfc_llcp_register_device()
913 local->timeout_wq = alloc_workqueue(name, in nfc_llcp_register_device()
915 if (local->timeout_wq == NULL) { in nfc_llcp_register_device()
920 nfc_llcp_build_gb(local); in nfc_llcp_register_device()
922 local->remote_miu = LLCP_DEFAULT_MIU; in nfc_llcp_register_device()
923 local->remote_lto = LLCP_DEFAULT_LTO; in nfc_llcp_register_device()
924 local->remote_rw = LLCP_DEFAULT_RW; in nfc_llcp_register_device()
926 list_add(&llcp_devices, &local->list); in nfc_llcp_register_device()
931 destroy_workqueue(local->rx_wq); in nfc_llcp_register_device()
934 destroy_workqueue(local->tx_wq); in nfc_llcp_register_device()
937 kfree(local); in nfc_llcp_register_device()
944 struct nfc_llcp_local *local = nfc_llcp_find_local(dev); in nfc_llcp_unregister_device() local
946 if (local == NULL) { in nfc_llcp_unregister_device()
951 list_del(&local->list); in nfc_llcp_unregister_device()
952 nfc_llcp_socket_release(local); in nfc_llcp_unregister_device()
953 del_timer_sync(&local->link_timer); in nfc_llcp_unregister_device()
954 skb_queue_purge(&local->tx_queue); in nfc_llcp_unregister_device()
955 destroy_workqueue(local->tx_wq); in nfc_llcp_unregister_device()
956 destroy_workqueue(local->rx_wq); in nfc_llcp_unregister_device()
957 kfree_skb(local->rx_pending); in nfc_llcp_unregister_device()
958 kfree(local); in nfc_llcp_unregister_device()