Lines Matching refs:hdev
49 void nfc_hci_reset_pipes(struct nfc_hci_dev *hdev) in nfc_hci_reset_pipes() argument
54 hdev->pipes[i].gate = NFC_HCI_INVALID_GATE; in nfc_hci_reset_pipes()
55 hdev->pipes[i].dest_host = NFC_HCI_INVALID_HOST; in nfc_hci_reset_pipes()
57 memset(hdev->gate2pipe, NFC_HCI_INVALID_PIPE, sizeof(hdev->gate2pipe)); in nfc_hci_reset_pipes()
61 void nfc_hci_reset_pipes_per_host(struct nfc_hci_dev *hdev, u8 host) in nfc_hci_reset_pipes_per_host() argument
66 if (hdev->pipes[i].dest_host != host) in nfc_hci_reset_pipes_per_host()
69 hdev->pipes[i].gate = NFC_HCI_INVALID_GATE; in nfc_hci_reset_pipes_per_host()
70 hdev->pipes[i].dest_host = NFC_HCI_INVALID_HOST; in nfc_hci_reset_pipes_per_host()
77 struct nfc_hci_dev *hdev = container_of(work, struct nfc_hci_dev, in nfc_hci_msg_tx_work() local
83 mutex_lock(&hdev->msg_tx_mutex); in nfc_hci_msg_tx_work()
84 if (hdev->shutting_down) in nfc_hci_msg_tx_work()
87 if (hdev->cmd_pending_msg) { in nfc_hci_msg_tx_work()
88 if (timer_pending(&hdev->cmd_timer) == 0) { in nfc_hci_msg_tx_work()
89 if (hdev->cmd_pending_msg->cb) in nfc_hci_msg_tx_work()
90 hdev->cmd_pending_msg->cb(hdev-> in nfc_hci_msg_tx_work()
95 kfree(hdev->cmd_pending_msg); in nfc_hci_msg_tx_work()
96 hdev->cmd_pending_msg = NULL; in nfc_hci_msg_tx_work()
103 if (list_empty(&hdev->msg_tx_queue)) in nfc_hci_msg_tx_work()
106 msg = list_first_entry(&hdev->msg_tx_queue, struct hci_msg, msg_l); in nfc_hci_msg_tx_work()
111 r = nfc_llc_xmit_from_hci(hdev->llc, skb); in nfc_hci_msg_tx_work()
130 hdev->cmd_pending_msg = msg; in nfc_hci_msg_tx_work()
131 mod_timer(&hdev->cmd_timer, jiffies + in nfc_hci_msg_tx_work()
132 msecs_to_jiffies(hdev->cmd_pending_msg->completion_delay)); in nfc_hci_msg_tx_work()
135 mutex_unlock(&hdev->msg_tx_mutex); in nfc_hci_msg_tx_work()
140 struct nfc_hci_dev *hdev = container_of(work, struct nfc_hci_dev, in nfc_hci_msg_rx_work() local
148 while ((skb = skb_dequeue(&hdev->msg_rx_queue)) != NULL) { in nfc_hci_msg_rx_work()
156 nfc_hci_hcp_message_rx(hdev, pipe, type, instruction, skb); in nfc_hci_msg_rx_work()
160 static void __nfc_hci_cmd_completion(struct nfc_hci_dev *hdev, int err, in __nfc_hci_cmd_completion() argument
163 del_timer_sync(&hdev->cmd_timer); in __nfc_hci_cmd_completion()
165 if (hdev->cmd_pending_msg->cb) in __nfc_hci_cmd_completion()
166 hdev->cmd_pending_msg->cb(hdev->cmd_pending_msg->cb_context, in __nfc_hci_cmd_completion()
171 kfree(hdev->cmd_pending_msg); in __nfc_hci_cmd_completion()
172 hdev->cmd_pending_msg = NULL; in __nfc_hci_cmd_completion()
174 schedule_work(&hdev->msg_tx_work); in __nfc_hci_cmd_completion()
177 void nfc_hci_resp_received(struct nfc_hci_dev *hdev, u8 result, in nfc_hci_resp_received() argument
180 mutex_lock(&hdev->msg_tx_mutex); in nfc_hci_resp_received()
182 if (hdev->cmd_pending_msg == NULL) { in nfc_hci_resp_received()
187 __nfc_hci_cmd_completion(hdev, nfc_hci_result_to_errno(result), skb); in nfc_hci_resp_received()
190 mutex_unlock(&hdev->msg_tx_mutex); in nfc_hci_resp_received()
193 void nfc_hci_cmd_received(struct nfc_hci_dev *hdev, u8 pipe, u8 cmd, in nfc_hci_cmd_received() argument
196 u8 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()
235 hdev->pipes[delete_info->pipe].gate = NFC_HCI_INVALID_GATE; in nfc_hci_cmd_received()
236 hdev->pipes[delete_info->pipe].dest_host = NFC_HCI_INVALID_HOST; in nfc_hci_cmd_received()
245 nfc_hci_reset_pipes_per_host(hdev, cleared_info->host); in nfc_hci_cmd_received()
252 if (hdev->ops->cmd_received) in nfc_hci_cmd_received()
253 hdev->ops->cmd_received(hdev, pipe, cmd, skb); in nfc_hci_cmd_received()
256 nfc_hci_hcp_message_tx(hdev, pipe, NFC_HCI_HCP_RESPONSE, in nfc_hci_cmd_received()
279 int nfc_hci_target_discovered(struct nfc_hci_dev *hdev, u8 gate) in nfc_hci_target_discovered() argument
295 r = nfc_hci_get_param(hdev, NFC_HCI_RF_READER_A_GATE, in nfc_hci_target_discovered()
300 r = nfc_hci_get_param(hdev, NFC_HCI_RF_READER_A_GATE, in nfc_hci_target_discovered()
320 r = nfc_hci_get_param(hdev, NFC_HCI_RF_READER_A_GATE, in nfc_hci_target_discovered()
333 if (hdev->ops->complete_target_discovered) { in nfc_hci_target_discovered()
334 r = hdev->ops->complete_target_discovered(hdev, gate, in nfc_hci_target_discovered()
344 if (hdev->ops->target_from_gate) in nfc_hci_target_discovered()
345 r = hdev->ops->target_from_gate(hdev, gate, targets); in nfc_hci_target_discovered()
351 if (hdev->ops->complete_target_discovered) { in nfc_hci_target_discovered()
352 r = hdev->ops->complete_target_discovered(hdev, gate, in nfc_hci_target_discovered()
364 r = nfc_targets_found(hdev->ndev, targets, 1); in nfc_hci_target_discovered()
376 void nfc_hci_event_received(struct nfc_hci_dev *hdev, u8 pipe, u8 event, in nfc_hci_event_received() argument
380 u8 gate = hdev->pipes[pipe].gate; in nfc_hci_event_received()
387 if (hdev->ops->event_received) { in nfc_hci_event_received()
388 r = hdev->ops->event_received(hdev, pipe, event, skb); in nfc_hci_event_received()
415 r = nfc_hci_target_discovered(hdev, gate); in nfc_hci_event_received()
428 nfc_hci_driver_failure(hdev, r); in nfc_hci_event_received()
433 struct nfc_hci_dev *hdev = (struct nfc_hci_dev *)data; in nfc_hci_cmd_timeout() local
435 schedule_work(&hdev->msg_tx_work); in nfc_hci_cmd_timeout()
438 static int hci_dev_connect_gates(struct nfc_hci_dev *hdev, u8 gate_count, in hci_dev_connect_gates() argument
443 r = nfc_hci_connect_gate(hdev, NFC_HCI_HOST_CONTROLLER_ID, in hci_dev_connect_gates()
453 static int hci_dev_session_init(struct nfc_hci_dev *hdev) in hci_dev_session_init() argument
458 if (hdev->init_data.gates[0].gate != NFC_HCI_ADMIN_GATE) in hci_dev_session_init()
461 r = nfc_hci_connect_gate(hdev, NFC_HCI_HOST_CONTROLLER_ID, in hci_dev_session_init()
462 hdev->init_data.gates[0].gate, in hci_dev_session_init()
463 hdev->init_data.gates[0].pipe); in hci_dev_session_init()
467 r = nfc_hci_get_param(hdev, NFC_HCI_ADMIN_GATE, in hci_dev_session_init()
472 if (skb->len && skb->len == strlen(hdev->init_data.session_id) && in hci_dev_session_init()
473 (memcmp(hdev->init_data.session_id, skb->data, in hci_dev_session_init()
474 skb->len) == 0) && hdev->ops->load_session) { in hci_dev_session_init()
477 r = hdev->ops->load_session(hdev); in hci_dev_session_init()
483 r = nfc_hci_disconnect_all_gates(hdev); in hci_dev_session_init()
487 r = hci_dev_connect_gates(hdev, hdev->init_data.gate_count, in hci_dev_session_init()
488 hdev->init_data.gates); in hci_dev_session_init()
492 r = nfc_hci_set_param(hdev, NFC_HCI_ADMIN_GATE, in hci_dev_session_init()
494 hdev->init_data.session_id, in hci_dev_session_init()
495 strlen(hdev->init_data.session_id)); in hci_dev_session_init()
501 nfc_hci_disconnect_all_gates(hdev); in hci_dev_session_init()
509 static int hci_dev_version(struct nfc_hci_dev *hdev) in hci_dev_version() argument
514 r = nfc_hci_get_param(hdev, NFC_HCI_ID_MGMT_GATE, in hci_dev_version()
528 hdev->sw_romlib = (skb->data[0] & 0xf0) >> 4; in hci_dev_version()
529 hdev->sw_patch = skb->data[0] & 0x0f; in hci_dev_version()
530 hdev->sw_flashlib_major = skb->data[1]; in hci_dev_version()
531 hdev->sw_flashlib_minor = skb->data[2]; in hci_dev_version()
535 r = nfc_hci_get_param(hdev, NFC_HCI_ID_MGMT_GATE, in hci_dev_version()
545 hdev->hw_derivative = (skb->data[0] & 0xe0) >> 5; in hci_dev_version()
546 hdev->hw_version = skb->data[0] & 0x1f; in hci_dev_version()
547 hdev->hw_mpw = (skb->data[1] & 0xc0) >> 6; in hci_dev_version()
548 hdev->hw_software = skb->data[1] & 0x3f; in hci_dev_version()
549 hdev->hw_bsid = skb->data[2]; in hci_dev_version()
554 pr_info("RomLib : %d\n", hdev->sw_romlib); in hci_dev_version()
555 pr_info("Patch : %d\n", hdev->sw_patch); in hci_dev_version()
556 pr_info("FlashLib Major : %d\n", hdev->sw_flashlib_major); in hci_dev_version()
557 pr_info("FlashLib Minor : %d\n", hdev->sw_flashlib_minor); in hci_dev_version()
559 pr_info("Derivative : %d\n", hdev->hw_derivative); in hci_dev_version()
560 pr_info("HW Version : %d\n", hdev->hw_version); in hci_dev_version()
561 pr_info("#MPW : %d\n", hdev->hw_mpw); in hci_dev_version()
562 pr_info("Software : %d\n", hdev->hw_software); in hci_dev_version()
563 pr_info("BSID Version : %d\n", hdev->hw_bsid); in hci_dev_version()
570 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_dev_up() local
573 if (hdev->ops->open) { in hci_dev_up()
574 r = hdev->ops->open(hdev); in hci_dev_up()
579 r = nfc_llc_start(hdev->llc); in hci_dev_up()
583 r = hci_dev_session_init(hdev); in hci_dev_up()
587 r = nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE, in hci_dev_up()
592 if (hdev->ops->hci_ready) { in hci_dev_up()
593 r = hdev->ops->hci_ready(hdev); in hci_dev_up()
598 r = hci_dev_version(hdev); in hci_dev_up()
605 nfc_llc_stop(hdev->llc); in hci_dev_up()
608 if (hdev->ops->close) in hci_dev_up()
609 hdev->ops->close(hdev); in hci_dev_up()
616 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_dev_down() local
618 nfc_llc_stop(hdev->llc); in hci_dev_down()
620 if (hdev->ops->close) in hci_dev_down()
621 hdev->ops->close(hdev); in hci_dev_down()
623 nfc_hci_reset_pipes(hdev); in hci_dev_down()
631 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_start_poll() local
633 if (hdev->ops->start_poll) in hci_start_poll()
634 return hdev->ops->start_poll(hdev, im_protocols, tm_protocols); in hci_start_poll()
636 return nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE, in hci_start_poll()
643 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_stop_poll() local
645 if (hdev->ops->stop_poll) in hci_stop_poll()
646 hdev->ops->stop_poll(hdev); in hci_stop_poll()
648 nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE, in hci_stop_poll()
655 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_dep_link_up() local
657 if (!hdev->ops->dep_link_up) in hci_dep_link_up()
660 return hdev->ops->dep_link_up(hdev, target, comm_mode, in hci_dep_link_up()
666 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_dep_link_down() local
668 if (!hdev->ops->dep_link_down) in hci_dep_link_down()
671 return hdev->ops->dep_link_down(hdev); in hci_dep_link_down()
690 struct nfc_hci_dev *hdev = context; in hci_transceive_cb() local
692 switch (hdev->async_cb_type) { in hci_transceive_cb()
702 hdev->async_cb(hdev->async_cb_context, skb, err); in hci_transceive_cb()
715 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_transceive() local
723 if (hdev->ops->im_transceive) { in hci_transceive()
724 r = hdev->ops->im_transceive(hdev, target, skb, cb, in hci_transceive()
732 hdev->async_cb_type = HCI_CB_TYPE_TRANSCEIVE; in hci_transceive()
733 hdev->async_cb = cb; in hci_transceive()
734 hdev->async_cb_context = cb_context; in hci_transceive()
736 r = nfc_hci_send_cmd_async(hdev, target->hci_reader_gate, in hci_transceive()
738 skb->len, hci_transceive_cb, hdev); in hci_transceive()
741 if (hdev->ops->im_transceive) { in hci_transceive()
742 r = hdev->ops->im_transceive(hdev, target, skb, cb, in hci_transceive()
759 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_tm_send() local
761 if (!hdev->ops->tm_send) { in hci_tm_send()
766 return hdev->ops->tm_send(hdev, skb); in hci_tm_send()
772 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_check_presence() local
774 if (!hdev->ops->check_presence) in hci_check_presence()
777 return hdev->ops->check_presence(hdev, target); in hci_check_presence()
782 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_discover_se() local
784 if (hdev->ops->discover_se) in hci_discover_se()
785 return hdev->ops->discover_se(hdev); in hci_discover_se()
792 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_enable_se() local
794 if (hdev->ops->enable_se) in hci_enable_se()
795 return hdev->ops->enable_se(hdev, se_idx); in hci_enable_se()
802 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_disable_se() local
804 if (hdev->ops->disable_se) in hci_disable_se()
805 return hdev->ops->disable_se(hdev, se_idx); in hci_disable_se()
814 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_se_io() local
816 if (hdev->ops->se_io) in hci_se_io()
817 return hdev->ops->se_io(hdev, se_idx, apdu, in hci_se_io()
823 static void nfc_hci_failure(struct nfc_hci_dev *hdev, int err) in nfc_hci_failure() argument
825 mutex_lock(&hdev->msg_tx_mutex); in nfc_hci_failure()
827 if (hdev->cmd_pending_msg == NULL) { in nfc_hci_failure()
828 nfc_driver_failure(hdev->ndev, err); in nfc_hci_failure()
832 __nfc_hci_cmd_completion(hdev, err, NULL); in nfc_hci_failure()
835 mutex_unlock(&hdev->msg_tx_mutex); in nfc_hci_failure()
838 static void nfc_hci_llc_failure(struct nfc_hci_dev *hdev, int err) in nfc_hci_llc_failure() argument
840 nfc_hci_failure(hdev, err); in nfc_hci_llc_failure()
843 static void nfc_hci_recv_from_llc(struct nfc_hci_dev *hdev, struct sk_buff *skb) in nfc_hci_recv_from_llc() argument
855 skb_queue_tail(&hdev->rx_hcp_frags, skb); in nfc_hci_recv_from_llc()
860 if (skb_queue_len(&hdev->rx_hcp_frags)) { in nfc_hci_recv_from_llc()
862 skb_queue_tail(&hdev->rx_hcp_frags, skb); in nfc_hci_recv_from_llc()
865 skb_queue_walk(&hdev->rx_hcp_frags, frag_skb) { in nfc_hci_recv_from_llc()
873 nfc_hci_failure(hdev, -ENOMEM); in nfc_hci_recv_from_llc()
879 skb_queue_walk(&hdev->rx_hcp_frags, frag_skb) { in nfc_hci_recv_from_llc()
886 skb_queue_purge(&hdev->rx_hcp_frags); in nfc_hci_recv_from_llc()
903 nfc_hci_hcp_message_rx(hdev, pipe, type, instruction, hcp_skb); in nfc_hci_recv_from_llc()
905 skb_queue_tail(&hdev->msg_rx_queue, hcp_skb); in nfc_hci_recv_from_llc()
906 schedule_work(&hdev->msg_rx_work); in nfc_hci_recv_from_llc()
912 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_fw_download() local
914 if (!hdev->ops->fw_download) in hci_fw_download()
917 return hdev->ops->fw_download(hdev, firmware_name); in hci_fw_download()
948 struct nfc_hci_dev *hdev; in nfc_hci_allocate_device() local
956 hdev = kzalloc(sizeof(struct nfc_hci_dev), GFP_KERNEL); in nfc_hci_allocate_device()
957 if (hdev == NULL) in nfc_hci_allocate_device()
960 hdev->llc = nfc_llc_allocate(llc_name, hdev, ops->xmit, in nfc_hci_allocate_device()
963 if (hdev->llc == NULL) { in nfc_hci_allocate_device()
964 kfree(hdev); in nfc_hci_allocate_device()
968 hdev->ndev = nfc_allocate_device(&hci_nfc_ops, protocols, in nfc_hci_allocate_device()
971 if (!hdev->ndev) { in nfc_hci_allocate_device()
972 nfc_llc_free(hdev->llc); in nfc_hci_allocate_device()
973 kfree(hdev); in nfc_hci_allocate_device()
977 hdev->ops = ops; in nfc_hci_allocate_device()
978 hdev->max_data_link_payload = max_link_payload; in nfc_hci_allocate_device()
979 hdev->init_data = *init_data; in nfc_hci_allocate_device()
981 nfc_set_drvdata(hdev->ndev, hdev); in nfc_hci_allocate_device()
983 nfc_hci_reset_pipes(hdev); in nfc_hci_allocate_device()
985 hdev->quirks = quirks; in nfc_hci_allocate_device()
987 return hdev; in nfc_hci_allocate_device()
991 void nfc_hci_free_device(struct nfc_hci_dev *hdev) in nfc_hci_free_device() argument
993 nfc_free_device(hdev->ndev); in nfc_hci_free_device()
994 nfc_llc_free(hdev->llc); in nfc_hci_free_device()
995 kfree(hdev); in nfc_hci_free_device()
999 int nfc_hci_register_device(struct nfc_hci_dev *hdev) in nfc_hci_register_device() argument
1001 mutex_init(&hdev->msg_tx_mutex); in nfc_hci_register_device()
1003 INIT_LIST_HEAD(&hdev->msg_tx_queue); in nfc_hci_register_device()
1005 INIT_WORK(&hdev->msg_tx_work, nfc_hci_msg_tx_work); in nfc_hci_register_device()
1007 init_timer(&hdev->cmd_timer); in nfc_hci_register_device()
1008 hdev->cmd_timer.data = (unsigned long)hdev; in nfc_hci_register_device()
1009 hdev->cmd_timer.function = nfc_hci_cmd_timeout; in nfc_hci_register_device()
1011 skb_queue_head_init(&hdev->rx_hcp_frags); in nfc_hci_register_device()
1013 INIT_WORK(&hdev->msg_rx_work, nfc_hci_msg_rx_work); in nfc_hci_register_device()
1015 skb_queue_head_init(&hdev->msg_rx_queue); in nfc_hci_register_device()
1017 return nfc_register_device(hdev->ndev); in nfc_hci_register_device()
1021 void nfc_hci_unregister_device(struct nfc_hci_dev *hdev) in nfc_hci_unregister_device() argument
1025 mutex_lock(&hdev->msg_tx_mutex); in nfc_hci_unregister_device()
1027 if (hdev->cmd_pending_msg) { in nfc_hci_unregister_device()
1028 if (hdev->cmd_pending_msg->cb) in nfc_hci_unregister_device()
1029 hdev->cmd_pending_msg->cb( in nfc_hci_unregister_device()
1030 hdev->cmd_pending_msg->cb_context, in nfc_hci_unregister_device()
1032 kfree(hdev->cmd_pending_msg); in nfc_hci_unregister_device()
1033 hdev->cmd_pending_msg = NULL; in nfc_hci_unregister_device()
1036 hdev->shutting_down = true; in nfc_hci_unregister_device()
1038 mutex_unlock(&hdev->msg_tx_mutex); in nfc_hci_unregister_device()
1040 del_timer_sync(&hdev->cmd_timer); in nfc_hci_unregister_device()
1041 cancel_work_sync(&hdev->msg_tx_work); in nfc_hci_unregister_device()
1043 cancel_work_sync(&hdev->msg_rx_work); in nfc_hci_unregister_device()
1045 nfc_unregister_device(hdev->ndev); in nfc_hci_unregister_device()
1047 skb_queue_purge(&hdev->rx_hcp_frags); in nfc_hci_unregister_device()
1048 skb_queue_purge(&hdev->msg_rx_queue); in nfc_hci_unregister_device()
1050 list_for_each_entry_safe(msg, n, &hdev->msg_tx_queue, msg_l) { in nfc_hci_unregister_device()
1058 void nfc_hci_set_clientdata(struct nfc_hci_dev *hdev, void *clientdata) in nfc_hci_set_clientdata() argument
1060 hdev->clientdata = clientdata; in nfc_hci_set_clientdata()
1064 void *nfc_hci_get_clientdata(struct nfc_hci_dev *hdev) in nfc_hci_get_clientdata() argument
1066 return hdev->clientdata; in nfc_hci_get_clientdata()
1070 void nfc_hci_driver_failure(struct nfc_hci_dev *hdev, int err) in nfc_hci_driver_failure() argument
1072 nfc_hci_failure(hdev, err); in nfc_hci_driver_failure()
1076 void nfc_hci_recv_frame(struct nfc_hci_dev *hdev, struct sk_buff *skb) in nfc_hci_recv_frame() argument
1078 nfc_llc_rcv_from_drv(hdev->llc, skb); in nfc_hci_recv_frame()