Lines Matching refs:hdev
37 void nfc_hci_reset_pipes(struct nfc_hci_dev *hdev) in nfc_hci_reset_pipes() argument
42 hdev->pipes[i].gate = NFC_HCI_INVALID_GATE; in nfc_hci_reset_pipes()
43 hdev->pipes[i].dest_host = NFC_HCI_INVALID_HOST; in nfc_hci_reset_pipes()
45 memset(hdev->gate2pipe, NFC_HCI_INVALID_PIPE, sizeof(hdev->gate2pipe)); in nfc_hci_reset_pipes()
49 void nfc_hci_reset_pipes_per_host(struct nfc_hci_dev *hdev, u8 host) in nfc_hci_reset_pipes_per_host() argument
54 if (hdev->pipes[i].dest_host != host) in nfc_hci_reset_pipes_per_host()
57 hdev->pipes[i].gate = NFC_HCI_INVALID_GATE; in nfc_hci_reset_pipes_per_host()
58 hdev->pipes[i].dest_host = NFC_HCI_INVALID_HOST; in nfc_hci_reset_pipes_per_host()
65 struct nfc_hci_dev *hdev = container_of(work, struct nfc_hci_dev, in nfc_hci_msg_tx_work() local
71 mutex_lock(&hdev->msg_tx_mutex); in nfc_hci_msg_tx_work()
72 if (hdev->shutting_down) in nfc_hci_msg_tx_work()
75 if (hdev->cmd_pending_msg) { in nfc_hci_msg_tx_work()
76 if (timer_pending(&hdev->cmd_timer) == 0) { in nfc_hci_msg_tx_work()
77 if (hdev->cmd_pending_msg->cb) in nfc_hci_msg_tx_work()
78 hdev->cmd_pending_msg->cb(hdev-> in nfc_hci_msg_tx_work()
83 kfree(hdev->cmd_pending_msg); in nfc_hci_msg_tx_work()
84 hdev->cmd_pending_msg = NULL; in nfc_hci_msg_tx_work()
91 if (list_empty(&hdev->msg_tx_queue)) in nfc_hci_msg_tx_work()
94 msg = list_first_entry(&hdev->msg_tx_queue, struct hci_msg, msg_l); in nfc_hci_msg_tx_work()
99 r = nfc_llc_xmit_from_hci(hdev->llc, skb); in nfc_hci_msg_tx_work()
118 hdev->cmd_pending_msg = msg; in nfc_hci_msg_tx_work()
119 mod_timer(&hdev->cmd_timer, jiffies + in nfc_hci_msg_tx_work()
120 msecs_to_jiffies(hdev->cmd_pending_msg->completion_delay)); in nfc_hci_msg_tx_work()
123 mutex_unlock(&hdev->msg_tx_mutex); in nfc_hci_msg_tx_work()
128 struct nfc_hci_dev *hdev = container_of(work, struct nfc_hci_dev, in nfc_hci_msg_rx_work() local
136 while ((skb = skb_dequeue(&hdev->msg_rx_queue)) != NULL) { in nfc_hci_msg_rx_work()
144 nfc_hci_hcp_message_rx(hdev, pipe, type, instruction, skb); in nfc_hci_msg_rx_work()
148 static void __nfc_hci_cmd_completion(struct nfc_hci_dev *hdev, int err, in __nfc_hci_cmd_completion() argument
151 del_timer_sync(&hdev->cmd_timer); in __nfc_hci_cmd_completion()
153 if (hdev->cmd_pending_msg->cb) in __nfc_hci_cmd_completion()
154 hdev->cmd_pending_msg->cb(hdev->cmd_pending_msg->cb_context, in __nfc_hci_cmd_completion()
159 kfree(hdev->cmd_pending_msg); in __nfc_hci_cmd_completion()
160 hdev->cmd_pending_msg = NULL; in __nfc_hci_cmd_completion()
162 schedule_work(&hdev->msg_tx_work); in __nfc_hci_cmd_completion()
165 void nfc_hci_resp_received(struct nfc_hci_dev *hdev, u8 result, in nfc_hci_resp_received() argument
168 mutex_lock(&hdev->msg_tx_mutex); in nfc_hci_resp_received()
170 if (hdev->cmd_pending_msg == NULL) { in nfc_hci_resp_received()
175 __nfc_hci_cmd_completion(hdev, nfc_hci_result_to_errno(result), skb); in nfc_hci_resp_received()
178 mutex_unlock(&hdev->msg_tx_mutex); in nfc_hci_resp_received()
181 void nfc_hci_cmd_received(struct nfc_hci_dev *hdev, u8 pipe, u8 cmd, in nfc_hci_cmd_received() argument
197 gate = hdev->pipes[pipe].gate; in nfc_hci_cmd_received()
217 hdev->gate2pipe[create_info->dest_gate] = create_info->pipe; in nfc_hci_cmd_received()
218 hdev->pipes[create_info->pipe].gate = create_info->dest_gate; in nfc_hci_cmd_received()
219 hdev->pipes[create_info->pipe].dest_host = in nfc_hci_cmd_received()
240 hdev->pipes[delete_info->pipe].gate = NFC_HCI_INVALID_GATE; in nfc_hci_cmd_received()
241 hdev->pipes[delete_info->pipe].dest_host = NFC_HCI_INVALID_HOST; in nfc_hci_cmd_received()
250 nfc_hci_reset_pipes_per_host(hdev, cleared_info->host); in nfc_hci_cmd_received()
257 if (hdev->ops->cmd_received) in nfc_hci_cmd_received()
258 hdev->ops->cmd_received(hdev, pipe, cmd, skb); in nfc_hci_cmd_received()
261 nfc_hci_hcp_message_tx(hdev, pipe, NFC_HCI_HCP_RESPONSE, in nfc_hci_cmd_received()
284 int nfc_hci_target_discovered(struct nfc_hci_dev *hdev, u8 gate) in nfc_hci_target_discovered() argument
300 r = nfc_hci_get_param(hdev, NFC_HCI_RF_READER_A_GATE, in nfc_hci_target_discovered()
305 r = nfc_hci_get_param(hdev, NFC_HCI_RF_READER_A_GATE, in nfc_hci_target_discovered()
325 r = nfc_hci_get_param(hdev, NFC_HCI_RF_READER_A_GATE, in nfc_hci_target_discovered()
338 if (hdev->ops->complete_target_discovered) { in nfc_hci_target_discovered()
339 r = hdev->ops->complete_target_discovered(hdev, gate, in nfc_hci_target_discovered()
349 if (hdev->ops->target_from_gate) in nfc_hci_target_discovered()
350 r = hdev->ops->target_from_gate(hdev, gate, targets); in nfc_hci_target_discovered()
356 if (hdev->ops->complete_target_discovered) { in nfc_hci_target_discovered()
357 r = hdev->ops->complete_target_discovered(hdev, gate, in nfc_hci_target_discovered()
369 r = nfc_targets_found(hdev->ndev, targets, 1); in nfc_hci_target_discovered()
381 void nfc_hci_event_received(struct nfc_hci_dev *hdev, u8 pipe, u8 event, in nfc_hci_event_received() argument
392 gate = hdev->pipes[pipe].gate; in nfc_hci_event_received()
398 if (hdev->ops->event_received) { in nfc_hci_event_received()
399 r = hdev->ops->event_received(hdev, pipe, event, skb); in nfc_hci_event_received()
426 r = nfc_hci_target_discovered(hdev, gate); in nfc_hci_event_received()
439 nfc_hci_driver_failure(hdev, r); in nfc_hci_event_received()
444 struct nfc_hci_dev *hdev = from_timer(hdev, t, cmd_timer); in nfc_hci_cmd_timeout() local
446 schedule_work(&hdev->msg_tx_work); in nfc_hci_cmd_timeout()
449 static int hci_dev_connect_gates(struct nfc_hci_dev *hdev, u8 gate_count, in hci_dev_connect_gates() argument
454 r = nfc_hci_connect_gate(hdev, NFC_HCI_HOST_CONTROLLER_ID, in hci_dev_connect_gates()
464 static int hci_dev_session_init(struct nfc_hci_dev *hdev) in hci_dev_session_init() argument
469 if (hdev->init_data.gates[0].gate != NFC_HCI_ADMIN_GATE) in hci_dev_session_init()
472 r = nfc_hci_connect_gate(hdev, NFC_HCI_HOST_CONTROLLER_ID, in hci_dev_session_init()
473 hdev->init_data.gates[0].gate, in hci_dev_session_init()
474 hdev->init_data.gates[0].pipe); in hci_dev_session_init()
478 r = nfc_hci_get_param(hdev, NFC_HCI_ADMIN_GATE, in hci_dev_session_init()
483 if (skb->len && skb->len == strlen(hdev->init_data.session_id) && in hci_dev_session_init()
484 (memcmp(hdev->init_data.session_id, skb->data, in hci_dev_session_init()
485 skb->len) == 0) && hdev->ops->load_session) { in hci_dev_session_init()
488 r = hdev->ops->load_session(hdev); in hci_dev_session_init()
494 r = nfc_hci_disconnect_all_gates(hdev); in hci_dev_session_init()
498 r = hci_dev_connect_gates(hdev, hdev->init_data.gate_count, in hci_dev_session_init()
499 hdev->init_data.gates); in hci_dev_session_init()
503 r = nfc_hci_set_param(hdev, NFC_HCI_ADMIN_GATE, in hci_dev_session_init()
505 hdev->init_data.session_id, in hci_dev_session_init()
506 strlen(hdev->init_data.session_id)); in hci_dev_session_init()
512 nfc_hci_disconnect_all_gates(hdev); in hci_dev_session_init()
520 static int hci_dev_version(struct nfc_hci_dev *hdev) in hci_dev_version() argument
525 r = nfc_hci_get_param(hdev, NFC_HCI_ID_MGMT_GATE, in hci_dev_version()
539 hdev->sw_romlib = (skb->data[0] & 0xf0) >> 4; in hci_dev_version()
540 hdev->sw_patch = skb->data[0] & 0x0f; in hci_dev_version()
541 hdev->sw_flashlib_major = skb->data[1]; in hci_dev_version()
542 hdev->sw_flashlib_minor = skb->data[2]; in hci_dev_version()
546 r = nfc_hci_get_param(hdev, NFC_HCI_ID_MGMT_GATE, in hci_dev_version()
556 hdev->hw_derivative = (skb->data[0] & 0xe0) >> 5; in hci_dev_version()
557 hdev->hw_version = skb->data[0] & 0x1f; in hci_dev_version()
558 hdev->hw_mpw = (skb->data[1] & 0xc0) >> 6; in hci_dev_version()
559 hdev->hw_software = skb->data[1] & 0x3f; in hci_dev_version()
560 hdev->hw_bsid = skb->data[2]; in hci_dev_version()
565 pr_info("RomLib : %d\n", hdev->sw_romlib); in hci_dev_version()
566 pr_info("Patch : %d\n", hdev->sw_patch); in hci_dev_version()
567 pr_info("FlashLib Major : %d\n", hdev->sw_flashlib_major); in hci_dev_version()
568 pr_info("FlashLib Minor : %d\n", hdev->sw_flashlib_minor); in hci_dev_version()
570 pr_info("Derivative : %d\n", hdev->hw_derivative); in hci_dev_version()
571 pr_info("HW Version : %d\n", hdev->hw_version); in hci_dev_version()
572 pr_info("#MPW : %d\n", hdev->hw_mpw); in hci_dev_version()
573 pr_info("Software : %d\n", hdev->hw_software); in hci_dev_version()
574 pr_info("BSID Version : %d\n", hdev->hw_bsid); in hci_dev_version()
581 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_dev_up() local
584 if (hdev->ops->open) { in hci_dev_up()
585 r = hdev->ops->open(hdev); in hci_dev_up()
590 r = nfc_llc_start(hdev->llc); in hci_dev_up()
594 r = hci_dev_session_init(hdev); in hci_dev_up()
598 r = nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE, in hci_dev_up()
603 if (hdev->ops->hci_ready) { in hci_dev_up()
604 r = hdev->ops->hci_ready(hdev); in hci_dev_up()
609 r = hci_dev_version(hdev); in hci_dev_up()
616 nfc_llc_stop(hdev->llc); in hci_dev_up()
619 if (hdev->ops->close) in hci_dev_up()
620 hdev->ops->close(hdev); in hci_dev_up()
627 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_dev_down() local
629 nfc_llc_stop(hdev->llc); in hci_dev_down()
631 if (hdev->ops->close) in hci_dev_down()
632 hdev->ops->close(hdev); in hci_dev_down()
634 nfc_hci_reset_pipes(hdev); in hci_dev_down()
642 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_start_poll() local
644 if (hdev->ops->start_poll) in hci_start_poll()
645 return hdev->ops->start_poll(hdev, im_protocols, tm_protocols); in hci_start_poll()
647 return nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE, in hci_start_poll()
654 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_stop_poll() local
656 if (hdev->ops->stop_poll) in hci_stop_poll()
657 hdev->ops->stop_poll(hdev); in hci_stop_poll()
659 nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE, in hci_stop_poll()
666 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_dep_link_up() local
668 if (!hdev->ops->dep_link_up) in hci_dep_link_up()
671 return hdev->ops->dep_link_up(hdev, target, comm_mode, in hci_dep_link_up()
677 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_dep_link_down() local
679 if (!hdev->ops->dep_link_down) in hci_dep_link_down()
682 return hdev->ops->dep_link_down(hdev); in hci_dep_link_down()
701 struct nfc_hci_dev *hdev = context; in hci_transceive_cb() local
703 switch (hdev->async_cb_type) { in hci_transceive_cb()
713 hdev->async_cb(hdev->async_cb_context, skb, err); in hci_transceive_cb()
726 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_transceive() local
734 if (hdev->ops->im_transceive) { in hci_transceive()
735 r = hdev->ops->im_transceive(hdev, target, skb, cb, in hci_transceive()
743 hdev->async_cb_type = HCI_CB_TYPE_TRANSCEIVE; in hci_transceive()
744 hdev->async_cb = cb; in hci_transceive()
745 hdev->async_cb_context = cb_context; in hci_transceive()
747 r = nfc_hci_send_cmd_async(hdev, target->hci_reader_gate, in hci_transceive()
749 skb->len, hci_transceive_cb, hdev); in hci_transceive()
752 if (hdev->ops->im_transceive) { in hci_transceive()
753 r = hdev->ops->im_transceive(hdev, target, skb, cb, in hci_transceive()
770 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_tm_send() local
772 if (!hdev->ops->tm_send) { in hci_tm_send()
777 return hdev->ops->tm_send(hdev, skb); in hci_tm_send()
783 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_check_presence() local
785 if (!hdev->ops->check_presence) in hci_check_presence()
788 return hdev->ops->check_presence(hdev, target); in hci_check_presence()
793 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_discover_se() local
795 if (hdev->ops->discover_se) in hci_discover_se()
796 return hdev->ops->discover_se(hdev); in hci_discover_se()
803 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_enable_se() local
805 if (hdev->ops->enable_se) in hci_enable_se()
806 return hdev->ops->enable_se(hdev, se_idx); in hci_enable_se()
813 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_disable_se() local
815 if (hdev->ops->disable_se) in hci_disable_se()
816 return hdev->ops->disable_se(hdev, se_idx); in hci_disable_se()
825 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_se_io() local
827 if (hdev->ops->se_io) in hci_se_io()
828 return hdev->ops->se_io(hdev, se_idx, apdu, in hci_se_io()
834 static void nfc_hci_failure(struct nfc_hci_dev *hdev, int err) in nfc_hci_failure() argument
836 mutex_lock(&hdev->msg_tx_mutex); in nfc_hci_failure()
838 if (hdev->cmd_pending_msg == NULL) { in nfc_hci_failure()
839 nfc_driver_failure(hdev->ndev, err); in nfc_hci_failure()
843 __nfc_hci_cmd_completion(hdev, err, NULL); in nfc_hci_failure()
846 mutex_unlock(&hdev->msg_tx_mutex); in nfc_hci_failure()
849 static void nfc_hci_llc_failure(struct nfc_hci_dev *hdev, int err) in nfc_hci_llc_failure() argument
851 nfc_hci_failure(hdev, err); in nfc_hci_llc_failure()
854 static void nfc_hci_recv_from_llc(struct nfc_hci_dev *hdev, struct sk_buff *skb) in nfc_hci_recv_from_llc() argument
866 skb_queue_tail(&hdev->rx_hcp_frags, skb); in nfc_hci_recv_from_llc()
871 if (skb_queue_len(&hdev->rx_hcp_frags)) { in nfc_hci_recv_from_llc()
873 skb_queue_tail(&hdev->rx_hcp_frags, skb); in nfc_hci_recv_from_llc()
876 skb_queue_walk(&hdev->rx_hcp_frags, frag_skb) { in nfc_hci_recv_from_llc()
884 nfc_hci_failure(hdev, -ENOMEM); in nfc_hci_recv_from_llc()
890 skb_queue_walk(&hdev->rx_hcp_frags, frag_skb) { in nfc_hci_recv_from_llc()
897 skb_queue_purge(&hdev->rx_hcp_frags); in nfc_hci_recv_from_llc()
914 nfc_hci_hcp_message_rx(hdev, pipe, type, instruction, hcp_skb); in nfc_hci_recv_from_llc()
916 skb_queue_tail(&hdev->msg_rx_queue, hcp_skb); in nfc_hci_recv_from_llc()
917 schedule_work(&hdev->msg_rx_work); in nfc_hci_recv_from_llc()
923 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_fw_download() local
925 if (!hdev->ops->fw_download) in hci_fw_download()
928 return hdev->ops->fw_download(hdev, firmware_name); in hci_fw_download()
959 struct nfc_hci_dev *hdev; in nfc_hci_allocate_device() local
967 hdev = kzalloc(sizeof(struct nfc_hci_dev), GFP_KERNEL); in nfc_hci_allocate_device()
968 if (hdev == NULL) in nfc_hci_allocate_device()
971 hdev->llc = nfc_llc_allocate(llc_name, hdev, ops->xmit, in nfc_hci_allocate_device()
974 if (hdev->llc == NULL) { in nfc_hci_allocate_device()
975 kfree(hdev); in nfc_hci_allocate_device()
979 hdev->ndev = nfc_allocate_device(&hci_nfc_ops, protocols, in nfc_hci_allocate_device()
982 if (!hdev->ndev) { in nfc_hci_allocate_device()
983 nfc_llc_free(hdev->llc); in nfc_hci_allocate_device()
984 kfree(hdev); in nfc_hci_allocate_device()
988 hdev->ops = ops; in nfc_hci_allocate_device()
989 hdev->max_data_link_payload = max_link_payload; in nfc_hci_allocate_device()
990 hdev->init_data = *init_data; in nfc_hci_allocate_device()
992 nfc_set_drvdata(hdev->ndev, hdev); in nfc_hci_allocate_device()
994 nfc_hci_reset_pipes(hdev); in nfc_hci_allocate_device()
996 hdev->quirks = quirks; in nfc_hci_allocate_device()
998 return hdev; in nfc_hci_allocate_device()
1002 void nfc_hci_free_device(struct nfc_hci_dev *hdev) in nfc_hci_free_device() argument
1004 nfc_free_device(hdev->ndev); in nfc_hci_free_device()
1005 nfc_llc_free(hdev->llc); in nfc_hci_free_device()
1006 kfree(hdev); in nfc_hci_free_device()
1010 int nfc_hci_register_device(struct nfc_hci_dev *hdev) in nfc_hci_register_device() argument
1012 mutex_init(&hdev->msg_tx_mutex); in nfc_hci_register_device()
1014 INIT_LIST_HEAD(&hdev->msg_tx_queue); in nfc_hci_register_device()
1016 INIT_WORK(&hdev->msg_tx_work, nfc_hci_msg_tx_work); in nfc_hci_register_device()
1018 timer_setup(&hdev->cmd_timer, nfc_hci_cmd_timeout, 0); in nfc_hci_register_device()
1020 skb_queue_head_init(&hdev->rx_hcp_frags); in nfc_hci_register_device()
1022 INIT_WORK(&hdev->msg_rx_work, nfc_hci_msg_rx_work); in nfc_hci_register_device()
1024 skb_queue_head_init(&hdev->msg_rx_queue); in nfc_hci_register_device()
1026 return nfc_register_device(hdev->ndev); in nfc_hci_register_device()
1030 void nfc_hci_unregister_device(struct nfc_hci_dev *hdev) in nfc_hci_unregister_device() argument
1034 mutex_lock(&hdev->msg_tx_mutex); in nfc_hci_unregister_device()
1036 if (hdev->cmd_pending_msg) { in nfc_hci_unregister_device()
1037 if (hdev->cmd_pending_msg->cb) in nfc_hci_unregister_device()
1038 hdev->cmd_pending_msg->cb( in nfc_hci_unregister_device()
1039 hdev->cmd_pending_msg->cb_context, in nfc_hci_unregister_device()
1041 kfree(hdev->cmd_pending_msg); in nfc_hci_unregister_device()
1042 hdev->cmd_pending_msg = NULL; in nfc_hci_unregister_device()
1045 hdev->shutting_down = true; in nfc_hci_unregister_device()
1047 mutex_unlock(&hdev->msg_tx_mutex); in nfc_hci_unregister_device()
1049 del_timer_sync(&hdev->cmd_timer); in nfc_hci_unregister_device()
1050 cancel_work_sync(&hdev->msg_tx_work); in nfc_hci_unregister_device()
1052 cancel_work_sync(&hdev->msg_rx_work); in nfc_hci_unregister_device()
1054 nfc_unregister_device(hdev->ndev); in nfc_hci_unregister_device()
1056 skb_queue_purge(&hdev->rx_hcp_frags); in nfc_hci_unregister_device()
1057 skb_queue_purge(&hdev->msg_rx_queue); in nfc_hci_unregister_device()
1059 list_for_each_entry_safe(msg, n, &hdev->msg_tx_queue, msg_l) { in nfc_hci_unregister_device()
1067 void nfc_hci_set_clientdata(struct nfc_hci_dev *hdev, void *clientdata) in nfc_hci_set_clientdata() argument
1069 hdev->clientdata = clientdata; in nfc_hci_set_clientdata()
1073 void *nfc_hci_get_clientdata(struct nfc_hci_dev *hdev) in nfc_hci_get_clientdata() argument
1075 return hdev->clientdata; in nfc_hci_get_clientdata()
1079 void nfc_hci_driver_failure(struct nfc_hci_dev *hdev, int err) in nfc_hci_driver_failure() argument
1081 nfc_hci_failure(hdev, err); in nfc_hci_driver_failure()
1085 void nfc_hci_recv_frame(struct nfc_hci_dev *hdev, struct sk_buff *skb) in nfc_hci_recv_frame() argument
1087 nfc_llc_rcv_from_drv(hdev->llc, skb); in nfc_hci_recv_frame()