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()
222 hdev->gate2pipe[create_info->dest_gate] = create_info->pipe; in nfc_hci_cmd_received()
223 hdev->pipes[create_info->pipe].gate = create_info->dest_gate; in nfc_hci_cmd_received()
224 hdev->pipes[create_info->pipe].dest_host = in nfc_hci_cmd_received()
245 hdev->pipes[delete_info->pipe].gate = NFC_HCI_INVALID_GATE; in nfc_hci_cmd_received()
246 hdev->pipes[delete_info->pipe].dest_host = NFC_HCI_INVALID_HOST; in nfc_hci_cmd_received()
255 nfc_hci_reset_pipes_per_host(hdev, cleared_info->host); in nfc_hci_cmd_received()
262 if (hdev->ops->cmd_received) in nfc_hci_cmd_received()
263 hdev->ops->cmd_received(hdev, pipe, cmd, skb); in nfc_hci_cmd_received()
266 nfc_hci_hcp_message_tx(hdev, pipe, NFC_HCI_HCP_RESPONSE, in nfc_hci_cmd_received()
289 int nfc_hci_target_discovered(struct nfc_hci_dev *hdev, u8 gate) in nfc_hci_target_discovered() argument
305 r = nfc_hci_get_param(hdev, NFC_HCI_RF_READER_A_GATE, in nfc_hci_target_discovered()
310 r = nfc_hci_get_param(hdev, NFC_HCI_RF_READER_A_GATE, in nfc_hci_target_discovered()
330 r = nfc_hci_get_param(hdev, NFC_HCI_RF_READER_A_GATE, in nfc_hci_target_discovered()
343 if (hdev->ops->complete_target_discovered) { in nfc_hci_target_discovered()
344 r = hdev->ops->complete_target_discovered(hdev, gate, in nfc_hci_target_discovered()
354 if (hdev->ops->target_from_gate) in nfc_hci_target_discovered()
355 r = hdev->ops->target_from_gate(hdev, gate, targets); in nfc_hci_target_discovered()
361 if (hdev->ops->complete_target_discovered) { in nfc_hci_target_discovered()
362 r = hdev->ops->complete_target_discovered(hdev, gate, in nfc_hci_target_discovered()
374 r = nfc_targets_found(hdev->ndev, targets, 1); in nfc_hci_target_discovered()
386 void nfc_hci_event_received(struct nfc_hci_dev *hdev, u8 pipe, u8 event, in nfc_hci_event_received() argument
390 u8 gate = hdev->pipes[pipe].gate; in nfc_hci_event_received()
397 if (hdev->ops->event_received) { in nfc_hci_event_received()
398 r = hdev->ops->event_received(hdev, pipe, event, skb); in nfc_hci_event_received()
425 r = nfc_hci_target_discovered(hdev, gate); in nfc_hci_event_received()
438 nfc_hci_driver_failure(hdev, r); in nfc_hci_event_received()
443 struct nfc_hci_dev *hdev = from_timer(hdev, t, cmd_timer); in nfc_hci_cmd_timeout() local
445 schedule_work(&hdev->msg_tx_work); in nfc_hci_cmd_timeout()
448 static int hci_dev_connect_gates(struct nfc_hci_dev *hdev, u8 gate_count, in hci_dev_connect_gates() argument
453 r = nfc_hci_connect_gate(hdev, NFC_HCI_HOST_CONTROLLER_ID, in hci_dev_connect_gates()
463 static int hci_dev_session_init(struct nfc_hci_dev *hdev) in hci_dev_session_init() argument
468 if (hdev->init_data.gates[0].gate != NFC_HCI_ADMIN_GATE) in hci_dev_session_init()
471 r = nfc_hci_connect_gate(hdev, NFC_HCI_HOST_CONTROLLER_ID, in hci_dev_session_init()
472 hdev->init_data.gates[0].gate, in hci_dev_session_init()
473 hdev->init_data.gates[0].pipe); in hci_dev_session_init()
477 r = nfc_hci_get_param(hdev, NFC_HCI_ADMIN_GATE, in hci_dev_session_init()
482 if (skb->len && skb->len == strlen(hdev->init_data.session_id) && in hci_dev_session_init()
483 (memcmp(hdev->init_data.session_id, skb->data, in hci_dev_session_init()
484 skb->len) == 0) && hdev->ops->load_session) { in hci_dev_session_init()
487 r = hdev->ops->load_session(hdev); in hci_dev_session_init()
493 r = nfc_hci_disconnect_all_gates(hdev); in hci_dev_session_init()
497 r = hci_dev_connect_gates(hdev, hdev->init_data.gate_count, in hci_dev_session_init()
498 hdev->init_data.gates); in hci_dev_session_init()
502 r = nfc_hci_set_param(hdev, NFC_HCI_ADMIN_GATE, in hci_dev_session_init()
504 hdev->init_data.session_id, in hci_dev_session_init()
505 strlen(hdev->init_data.session_id)); in hci_dev_session_init()
511 nfc_hci_disconnect_all_gates(hdev); in hci_dev_session_init()
519 static int hci_dev_version(struct nfc_hci_dev *hdev) in hci_dev_version() argument
524 r = nfc_hci_get_param(hdev, NFC_HCI_ID_MGMT_GATE, in hci_dev_version()
538 hdev->sw_romlib = (skb->data[0] & 0xf0) >> 4; in hci_dev_version()
539 hdev->sw_patch = skb->data[0] & 0x0f; in hci_dev_version()
540 hdev->sw_flashlib_major = skb->data[1]; in hci_dev_version()
541 hdev->sw_flashlib_minor = skb->data[2]; in hci_dev_version()
545 r = nfc_hci_get_param(hdev, NFC_HCI_ID_MGMT_GATE, in hci_dev_version()
555 hdev->hw_derivative = (skb->data[0] & 0xe0) >> 5; in hci_dev_version()
556 hdev->hw_version = skb->data[0] & 0x1f; in hci_dev_version()
557 hdev->hw_mpw = (skb->data[1] & 0xc0) >> 6; in hci_dev_version()
558 hdev->hw_software = skb->data[1] & 0x3f; in hci_dev_version()
559 hdev->hw_bsid = skb->data[2]; in hci_dev_version()
564 pr_info("RomLib : %d\n", hdev->sw_romlib); in hci_dev_version()
565 pr_info("Patch : %d\n", hdev->sw_patch); in hci_dev_version()
566 pr_info("FlashLib Major : %d\n", hdev->sw_flashlib_major); in hci_dev_version()
567 pr_info("FlashLib Minor : %d\n", hdev->sw_flashlib_minor); in hci_dev_version()
569 pr_info("Derivative : %d\n", hdev->hw_derivative); in hci_dev_version()
570 pr_info("HW Version : %d\n", hdev->hw_version); in hci_dev_version()
571 pr_info("#MPW : %d\n", hdev->hw_mpw); in hci_dev_version()
572 pr_info("Software : %d\n", hdev->hw_software); in hci_dev_version()
573 pr_info("BSID Version : %d\n", hdev->hw_bsid); in hci_dev_version()
580 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_dev_up() local
583 if (hdev->ops->open) { in hci_dev_up()
584 r = hdev->ops->open(hdev); in hci_dev_up()
589 r = nfc_llc_start(hdev->llc); in hci_dev_up()
593 r = hci_dev_session_init(hdev); in hci_dev_up()
597 r = nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE, in hci_dev_up()
602 if (hdev->ops->hci_ready) { in hci_dev_up()
603 r = hdev->ops->hci_ready(hdev); in hci_dev_up()
608 r = hci_dev_version(hdev); in hci_dev_up()
615 nfc_llc_stop(hdev->llc); in hci_dev_up()
618 if (hdev->ops->close) in hci_dev_up()
619 hdev->ops->close(hdev); in hci_dev_up()
626 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_dev_down() local
628 nfc_llc_stop(hdev->llc); in hci_dev_down()
630 if (hdev->ops->close) in hci_dev_down()
631 hdev->ops->close(hdev); in hci_dev_down()
633 nfc_hci_reset_pipes(hdev); in hci_dev_down()
641 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_start_poll() local
643 if (hdev->ops->start_poll) in hci_start_poll()
644 return hdev->ops->start_poll(hdev, im_protocols, tm_protocols); in hci_start_poll()
646 return nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE, in hci_start_poll()
653 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_stop_poll() local
655 if (hdev->ops->stop_poll) in hci_stop_poll()
656 hdev->ops->stop_poll(hdev); in hci_stop_poll()
658 nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE, in hci_stop_poll()
665 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_dep_link_up() local
667 if (!hdev->ops->dep_link_up) in hci_dep_link_up()
670 return hdev->ops->dep_link_up(hdev, target, comm_mode, in hci_dep_link_up()
676 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_dep_link_down() local
678 if (!hdev->ops->dep_link_down) in hci_dep_link_down()
681 return hdev->ops->dep_link_down(hdev); in hci_dep_link_down()
700 struct nfc_hci_dev *hdev = context; in hci_transceive_cb() local
702 switch (hdev->async_cb_type) { in hci_transceive_cb()
712 hdev->async_cb(hdev->async_cb_context, skb, err); in hci_transceive_cb()
725 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_transceive() local
733 if (hdev->ops->im_transceive) { in hci_transceive()
734 r = hdev->ops->im_transceive(hdev, target, skb, cb, in hci_transceive()
742 hdev->async_cb_type = HCI_CB_TYPE_TRANSCEIVE; in hci_transceive()
743 hdev->async_cb = cb; in hci_transceive()
744 hdev->async_cb_context = cb_context; in hci_transceive()
746 r = nfc_hci_send_cmd_async(hdev, target->hci_reader_gate, in hci_transceive()
748 skb->len, hci_transceive_cb, hdev); in hci_transceive()
751 if (hdev->ops->im_transceive) { in hci_transceive()
752 r = hdev->ops->im_transceive(hdev, target, skb, cb, in hci_transceive()
769 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_tm_send() local
771 if (!hdev->ops->tm_send) { in hci_tm_send()
776 return hdev->ops->tm_send(hdev, skb); in hci_tm_send()
782 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_check_presence() local
784 if (!hdev->ops->check_presence) in hci_check_presence()
787 return hdev->ops->check_presence(hdev, target); in hci_check_presence()
792 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_discover_se() local
794 if (hdev->ops->discover_se) in hci_discover_se()
795 return hdev->ops->discover_se(hdev); in hci_discover_se()
802 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_enable_se() local
804 if (hdev->ops->enable_se) in hci_enable_se()
805 return hdev->ops->enable_se(hdev, se_idx); in hci_enable_se()
812 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_disable_se() local
814 if (hdev->ops->disable_se) in hci_disable_se()
815 return hdev->ops->disable_se(hdev, se_idx); in hci_disable_se()
824 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_se_io() local
826 if (hdev->ops->se_io) in hci_se_io()
827 return hdev->ops->se_io(hdev, se_idx, apdu, in hci_se_io()
833 static void nfc_hci_failure(struct nfc_hci_dev *hdev, int err) in nfc_hci_failure() argument
835 mutex_lock(&hdev->msg_tx_mutex); in nfc_hci_failure()
837 if (hdev->cmd_pending_msg == NULL) { in nfc_hci_failure()
838 nfc_driver_failure(hdev->ndev, err); in nfc_hci_failure()
842 __nfc_hci_cmd_completion(hdev, err, NULL); in nfc_hci_failure()
845 mutex_unlock(&hdev->msg_tx_mutex); in nfc_hci_failure()
848 static void nfc_hci_llc_failure(struct nfc_hci_dev *hdev, int err) in nfc_hci_llc_failure() argument
850 nfc_hci_failure(hdev, err); in nfc_hci_llc_failure()
853 static void nfc_hci_recv_from_llc(struct nfc_hci_dev *hdev, struct sk_buff *skb) in nfc_hci_recv_from_llc() argument
865 skb_queue_tail(&hdev->rx_hcp_frags, skb); in nfc_hci_recv_from_llc()
870 if (skb_queue_len(&hdev->rx_hcp_frags)) { in nfc_hci_recv_from_llc()
872 skb_queue_tail(&hdev->rx_hcp_frags, skb); in nfc_hci_recv_from_llc()
875 skb_queue_walk(&hdev->rx_hcp_frags, frag_skb) { in nfc_hci_recv_from_llc()
883 nfc_hci_failure(hdev, -ENOMEM); in nfc_hci_recv_from_llc()
889 skb_queue_walk(&hdev->rx_hcp_frags, frag_skb) { in nfc_hci_recv_from_llc()
896 skb_queue_purge(&hdev->rx_hcp_frags); in nfc_hci_recv_from_llc()
913 nfc_hci_hcp_message_rx(hdev, pipe, type, instruction, hcp_skb); in nfc_hci_recv_from_llc()
915 skb_queue_tail(&hdev->msg_rx_queue, hcp_skb); in nfc_hci_recv_from_llc()
916 schedule_work(&hdev->msg_rx_work); in nfc_hci_recv_from_llc()
922 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); in hci_fw_download() local
924 if (!hdev->ops->fw_download) in hci_fw_download()
927 return hdev->ops->fw_download(hdev, firmware_name); in hci_fw_download()
958 struct nfc_hci_dev *hdev; in nfc_hci_allocate_device() local
966 hdev = kzalloc(sizeof(struct nfc_hci_dev), GFP_KERNEL); in nfc_hci_allocate_device()
967 if (hdev == NULL) in nfc_hci_allocate_device()
970 hdev->llc = nfc_llc_allocate(llc_name, hdev, ops->xmit, in nfc_hci_allocate_device()
973 if (hdev->llc == NULL) { in nfc_hci_allocate_device()
974 kfree(hdev); in nfc_hci_allocate_device()
978 hdev->ndev = nfc_allocate_device(&hci_nfc_ops, protocols, in nfc_hci_allocate_device()
981 if (!hdev->ndev) { in nfc_hci_allocate_device()
982 nfc_llc_free(hdev->llc); in nfc_hci_allocate_device()
983 kfree(hdev); in nfc_hci_allocate_device()
987 hdev->ops = ops; in nfc_hci_allocate_device()
988 hdev->max_data_link_payload = max_link_payload; in nfc_hci_allocate_device()
989 hdev->init_data = *init_data; in nfc_hci_allocate_device()
991 nfc_set_drvdata(hdev->ndev, hdev); in nfc_hci_allocate_device()
993 nfc_hci_reset_pipes(hdev); in nfc_hci_allocate_device()
995 hdev->quirks = quirks; in nfc_hci_allocate_device()
997 return hdev; in nfc_hci_allocate_device()
1001 void nfc_hci_free_device(struct nfc_hci_dev *hdev) in nfc_hci_free_device() argument
1003 nfc_free_device(hdev->ndev); in nfc_hci_free_device()
1004 nfc_llc_free(hdev->llc); in nfc_hci_free_device()
1005 kfree(hdev); in nfc_hci_free_device()
1009 int nfc_hci_register_device(struct nfc_hci_dev *hdev) in nfc_hci_register_device() argument
1011 mutex_init(&hdev->msg_tx_mutex); in nfc_hci_register_device()
1013 INIT_LIST_HEAD(&hdev->msg_tx_queue); in nfc_hci_register_device()
1015 INIT_WORK(&hdev->msg_tx_work, nfc_hci_msg_tx_work); in nfc_hci_register_device()
1017 timer_setup(&hdev->cmd_timer, nfc_hci_cmd_timeout, 0); in nfc_hci_register_device()
1019 skb_queue_head_init(&hdev->rx_hcp_frags); in nfc_hci_register_device()
1021 INIT_WORK(&hdev->msg_rx_work, nfc_hci_msg_rx_work); in nfc_hci_register_device()
1023 skb_queue_head_init(&hdev->msg_rx_queue); in nfc_hci_register_device()
1025 return nfc_register_device(hdev->ndev); in nfc_hci_register_device()
1029 void nfc_hci_unregister_device(struct nfc_hci_dev *hdev) in nfc_hci_unregister_device() argument
1033 mutex_lock(&hdev->msg_tx_mutex); in nfc_hci_unregister_device()
1035 if (hdev->cmd_pending_msg) { in nfc_hci_unregister_device()
1036 if (hdev->cmd_pending_msg->cb) in nfc_hci_unregister_device()
1037 hdev->cmd_pending_msg->cb( in nfc_hci_unregister_device()
1038 hdev->cmd_pending_msg->cb_context, in nfc_hci_unregister_device()
1040 kfree(hdev->cmd_pending_msg); in nfc_hci_unregister_device()
1041 hdev->cmd_pending_msg = NULL; in nfc_hci_unregister_device()
1044 hdev->shutting_down = true; in nfc_hci_unregister_device()
1046 mutex_unlock(&hdev->msg_tx_mutex); in nfc_hci_unregister_device()
1048 del_timer_sync(&hdev->cmd_timer); in nfc_hci_unregister_device()
1049 cancel_work_sync(&hdev->msg_tx_work); in nfc_hci_unregister_device()
1051 cancel_work_sync(&hdev->msg_rx_work); in nfc_hci_unregister_device()
1053 nfc_unregister_device(hdev->ndev); in nfc_hci_unregister_device()
1055 skb_queue_purge(&hdev->rx_hcp_frags); in nfc_hci_unregister_device()
1056 skb_queue_purge(&hdev->msg_rx_queue); in nfc_hci_unregister_device()
1058 list_for_each_entry_safe(msg, n, &hdev->msg_tx_queue, msg_l) { in nfc_hci_unregister_device()
1066 void nfc_hci_set_clientdata(struct nfc_hci_dev *hdev, void *clientdata) in nfc_hci_set_clientdata() argument
1068 hdev->clientdata = clientdata; in nfc_hci_set_clientdata()
1072 void *nfc_hci_get_clientdata(struct nfc_hci_dev *hdev) in nfc_hci_get_clientdata() argument
1074 return hdev->clientdata; in nfc_hci_get_clientdata()
1078 void nfc_hci_driver_failure(struct nfc_hci_dev *hdev, int err) in nfc_hci_driver_failure() argument
1080 nfc_hci_failure(hdev, err); in nfc_hci_driver_failure()
1084 void nfc_hci_recv_frame(struct nfc_hci_dev *hdev, struct sk_buff *skb) in nfc_hci_recv_frame() argument
1086 nfc_llc_rcv_from_drv(hdev->llc, skb); in nfc_hci_recv_frame()