Lines Matching refs:ndev

53 struct nci_conn_info *nci_get_conn_info_by_conn_id(struct nci_dev *ndev,  in nci_get_conn_info_by_conn_id()  argument
58 list_for_each_entry(conn_info, &ndev->conn_info_list, list) { in nci_get_conn_info_by_conn_id()
68 void nci_req_complete(struct nci_dev *ndev, int result) in nci_req_complete() argument
70 if (ndev->req_status == NCI_REQ_PEND) { in nci_req_complete()
71 ndev->req_result = result; in nci_req_complete()
72 ndev->req_status = NCI_REQ_DONE; in nci_req_complete()
73 complete(&ndev->req_completion); in nci_req_complete()
77 static void nci_req_cancel(struct nci_dev *ndev, int err) in nci_req_cancel() argument
79 if (ndev->req_status == NCI_REQ_PEND) { in nci_req_cancel()
80 ndev->req_result = err; in nci_req_cancel()
81 ndev->req_status = NCI_REQ_CANCELED; in nci_req_cancel()
82 complete(&ndev->req_completion); in nci_req_cancel()
87 static int __nci_request(struct nci_dev *ndev, in __nci_request() argument
88 void (*req)(struct nci_dev *ndev, unsigned long opt), in __nci_request() argument
94 ndev->req_status = NCI_REQ_PEND; in __nci_request()
96 reinit_completion(&ndev->req_completion); in __nci_request()
97 req(ndev, opt); in __nci_request()
99 wait_for_completion_interruptible_timeout(&ndev->req_completion, in __nci_request()
105 switch (ndev->req_status) { in __nci_request()
107 rc = nci_to_errno(ndev->req_result); in __nci_request()
111 rc = -ndev->req_result; in __nci_request()
125 ndev->req_status = ndev->req_result = 0; in __nci_request()
130 inline int nci_request(struct nci_dev *ndev, in nci_request() argument
131 void (*req)(struct nci_dev *ndev, in nci_request() argument
137 if (!test_bit(NCI_UP, &ndev->flags)) in nci_request()
141 mutex_lock(&ndev->req_lock); in nci_request()
142 rc = __nci_request(ndev, req, opt, timeout); in nci_request()
143 mutex_unlock(&ndev->req_lock); in nci_request()
148 static void nci_reset_req(struct nci_dev *ndev, unsigned long opt) in nci_reset_req() argument
153 nci_send_cmd(ndev, NCI_OP_CORE_RESET_CMD, 1, &cmd); in nci_reset_req()
156 static void nci_init_req(struct nci_dev *ndev, unsigned long opt) in nci_init_req() argument
158 nci_send_cmd(ndev, NCI_OP_CORE_INIT_CMD, 0, NULL); in nci_init_req()
161 static void nci_init_complete_req(struct nci_dev *ndev, unsigned long opt) in nci_init_complete_req() argument
172 for (i = 0; i < ndev->num_supported_rf_interfaces; i++) { in nci_init_complete_req()
173 if (ndev->supported_rf_interfaces[i] == in nci_init_complete_req()
180 } else if (ndev->supported_rf_interfaces[i] == in nci_init_complete_req()
193 nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_MAP_CMD, in nci_init_complete_req()
203 static void nci_set_config_req(struct nci_dev *ndev, unsigned long opt) in nci_set_config_req() argument
215 nci_send_cmd(ndev, NCI_OP_CORE_SET_CONFIG_CMD, (3 + param->len), &cmd); in nci_set_config_req()
223 static void nci_rf_discover_req(struct nci_dev *ndev, unsigned long opt) in nci_rf_discover_req() argument
279 nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_CMD, in nci_rf_discover_req()
289 static void nci_rf_discover_select_req(struct nci_dev *ndev, unsigned long opt) in nci_rf_discover_select_req() argument
312 nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_SELECT_CMD, in nci_rf_discover_select_req()
316 static void nci_rf_deactivate_req(struct nci_dev *ndev, unsigned long opt) in nci_rf_deactivate_req() argument
322 nci_send_cmd(ndev, NCI_OP_RF_DEACTIVATE_CMD, in nci_rf_deactivate_req()
326 static int nci_open_device(struct nci_dev *ndev) in nci_open_device() argument
330 mutex_lock(&ndev->req_lock); in nci_open_device()
332 if (test_bit(NCI_UP, &ndev->flags)) { in nci_open_device()
337 if (ndev->ops->open(ndev)) { in nci_open_device()
342 atomic_set(&ndev->cmd_cnt, 1); in nci_open_device()
344 set_bit(NCI_INIT, &ndev->flags); in nci_open_device()
346 rc = __nci_request(ndev, nci_reset_req, 0, in nci_open_device()
349 if (ndev->ops->setup) in nci_open_device()
350 ndev->ops->setup(ndev); in nci_open_device()
353 rc = __nci_request(ndev, nci_init_req, 0, in nci_open_device()
358 rc = __nci_request(ndev, nci_init_complete_req, 0, in nci_open_device()
362 clear_bit(NCI_INIT, &ndev->flags); in nci_open_device()
365 set_bit(NCI_UP, &ndev->flags); in nci_open_device()
366 nci_clear_target_list(ndev); in nci_open_device()
367 atomic_set(&ndev->state, NCI_IDLE); in nci_open_device()
370 skb_queue_purge(&ndev->cmd_q); in nci_open_device()
371 skb_queue_purge(&ndev->rx_q); in nci_open_device()
372 skb_queue_purge(&ndev->tx_q); in nci_open_device()
374 ndev->ops->close(ndev); in nci_open_device()
375 ndev->flags = 0; in nci_open_device()
379 mutex_unlock(&ndev->req_lock); in nci_open_device()
383 static int nci_close_device(struct nci_dev *ndev) in nci_close_device() argument
385 nci_req_cancel(ndev, ENODEV); in nci_close_device()
386 mutex_lock(&ndev->req_lock); in nci_close_device()
388 if (!test_and_clear_bit(NCI_UP, &ndev->flags)) { in nci_close_device()
389 del_timer_sync(&ndev->cmd_timer); in nci_close_device()
390 del_timer_sync(&ndev->data_timer); in nci_close_device()
391 mutex_unlock(&ndev->req_lock); in nci_close_device()
396 skb_queue_purge(&ndev->rx_q); in nci_close_device()
397 skb_queue_purge(&ndev->tx_q); in nci_close_device()
400 flush_workqueue(ndev->rx_wq); in nci_close_device()
401 flush_workqueue(ndev->tx_wq); in nci_close_device()
404 skb_queue_purge(&ndev->cmd_q); in nci_close_device()
405 atomic_set(&ndev->cmd_cnt, 1); in nci_close_device()
407 set_bit(NCI_INIT, &ndev->flags); in nci_close_device()
408 __nci_request(ndev, nci_reset_req, 0, in nci_close_device()
410 clear_bit(NCI_INIT, &ndev->flags); in nci_close_device()
412 del_timer_sync(&ndev->cmd_timer); in nci_close_device()
415 flush_workqueue(ndev->cmd_wq); in nci_close_device()
419 ndev->ops->close(ndev); in nci_close_device()
422 ndev->flags = 0; in nci_close_device()
424 mutex_unlock(&ndev->req_lock); in nci_close_device()
432 struct nci_dev *ndev = (void *) arg; in nci_cmd_timer() local
434 atomic_set(&ndev->cmd_cnt, 1); in nci_cmd_timer()
435 queue_work(ndev->cmd_wq, &ndev->cmd_work); in nci_cmd_timer()
441 struct nci_dev *ndev = (void *) arg; in nci_data_timer() local
443 set_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags); in nci_data_timer()
444 queue_work(ndev->rx_wq, &ndev->rx_work); in nci_data_timer()
449 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_dev_up() local
451 return nci_open_device(ndev); in nci_dev_up()
456 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_dev_down() local
458 return nci_close_device(ndev); in nci_dev_down()
461 int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, __u8 *val) in nci_set_config() argument
472 return __nci_request(ndev, nci_set_config_req, (unsigned long)&param, in nci_set_config()
477 static void nci_nfcee_discover_req(struct nci_dev *ndev, unsigned long opt) in nci_nfcee_discover_req() argument
484 nci_send_cmd(ndev, NCI_OP_NFCEE_DISCOVER_CMD, 1, &cmd); in nci_nfcee_discover_req()
487 int nci_nfcee_discover(struct nci_dev *ndev, u8 action) in nci_nfcee_discover() argument
489 return nci_request(ndev, nci_nfcee_discover_req, action, in nci_nfcee_discover()
494 static void nci_nfcee_mode_set_req(struct nci_dev *ndev, unsigned long opt) in nci_nfcee_mode_set_req() argument
499 nci_send_cmd(ndev, NCI_OP_NFCEE_MODE_SET_CMD, in nci_nfcee_mode_set_req()
503 int nci_nfcee_mode_set(struct nci_dev *ndev, u8 nfcee_id, u8 nfcee_mode) in nci_nfcee_mode_set() argument
510 return nci_request(ndev, nci_nfcee_mode_set_req, (unsigned long)&cmd, in nci_nfcee_mode_set()
515 static void nci_core_conn_create_req(struct nci_dev *ndev, unsigned long opt) in nci_core_conn_create_req() argument
520 nci_send_cmd(ndev, NCI_OP_CORE_CONN_CREATE_CMD, data->length, data->cmd); in nci_core_conn_create_req()
523 int nci_core_conn_create(struct nci_dev *ndev, u8 destination_type, in nci_core_conn_create() argument
542 ndev->cur_id = params->value[DEST_SPEC_PARAMS_ID_INDEX]; in nci_core_conn_create()
544 r = __nci_request(ndev, nci_core_conn_create_req, in nci_core_conn_create()
552 static void nci_core_conn_close_req(struct nci_dev *ndev, unsigned long opt) in nci_core_conn_close_req() argument
556 nci_send_cmd(ndev, NCI_OP_CORE_CONN_CLOSE_CMD, 1, &conn_id); in nci_core_conn_close_req()
559 int nci_core_conn_close(struct nci_dev *ndev, u8 conn_id) in nci_core_conn_close() argument
561 return nci_request(ndev, nci_core_conn_close_req, conn_id, in nci_core_conn_close()
568 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_set_local_general_bytes() local
581 rc = nci_request(ndev, nci_set_config_req, (unsigned long)&param, in nci_set_local_general_bytes()
588 return nci_request(ndev, nci_set_config_req, (unsigned long)&param, in nci_set_local_general_bytes()
594 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_set_listen_parameters() local
600 rc = nci_set_config(ndev, NCI_LA_SEL_INFO, 1, &val); in nci_set_listen_parameters()
606 rc = nci_set_config(ndev, NCI_LF_PROTOCOL_TYPE, 1, &val); in nci_set_listen_parameters()
612 return nci_set_config(ndev, NCI_LF_CON_BITR_F, 1, &val); in nci_set_listen_parameters()
618 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_start_poll() local
622 if ((atomic_read(&ndev->state) == NCI_DISCOVERY) || in nci_start_poll()
623 (atomic_read(&ndev->state) == NCI_W4_ALL_DISCOVERIES)) { in nci_start_poll()
628 if (ndev->target_active_prot) { in nci_start_poll()
633 if ((atomic_read(&ndev->state) == NCI_W4_HOST_SELECT) || in nci_start_poll()
634 (atomic_read(&ndev->state) == NCI_POLL_ACTIVE)) { in nci_start_poll()
637 rc = nci_request(ndev, nci_rf_deactivate_req, in nci_start_poll()
660 rc = nci_request(ndev, nci_rf_discover_req, (unsigned long)&param, in nci_start_poll()
664 ndev->poll_prots = im_protocols; in nci_start_poll()
671 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_stop_poll() local
673 if ((atomic_read(&ndev->state) != NCI_DISCOVERY) && in nci_stop_poll()
674 (atomic_read(&ndev->state) != NCI_W4_ALL_DISCOVERIES)) { in nci_stop_poll()
679 nci_request(ndev, nci_rf_deactivate_req, NCI_DEACTIVATE_TYPE_IDLE_MODE, in nci_stop_poll()
686 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_activate_target() local
694 if ((atomic_read(&ndev->state) != NCI_W4_HOST_SELECT) && in nci_activate_target()
695 (atomic_read(&ndev->state) != NCI_POLL_ACTIVE)) { in nci_activate_target()
700 if (ndev->target_active_prot) { in nci_activate_target()
705 for (i = 0; i < ndev->n_targets; i++) { in nci_activate_target()
706 if (ndev->targets[i].idx == target->idx) { in nci_activate_target()
707 nci_target = &ndev->targets[i]; in nci_activate_target()
723 if (atomic_read(&ndev->state) == NCI_W4_HOST_SELECT) { in nci_activate_target()
738 rc = nci_request(ndev, nci_rf_discover_select_req, in nci_activate_target()
744 ndev->target_active_prot = protocol; in nci_activate_target()
752 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_deactivate_target() local
756 if (!ndev->target_active_prot) { in nci_deactivate_target()
761 ndev->target_active_prot = 0; in nci_deactivate_target()
763 if (atomic_read(&ndev->state) == NCI_POLL_ACTIVE) { in nci_deactivate_target()
764 nci_request(ndev, nci_rf_deactivate_req, in nci_deactivate_target()
773 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_dep_link_up() local
782 rc = nfc_set_remote_general_bytes(nfc_dev, ndev->remote_gb, in nci_dep_link_up()
783 ndev->remote_gb_len); in nci_dep_link_up()
793 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_dep_link_down() local
801 if (atomic_read(&ndev->state) == NCI_LISTEN_ACTIVE || in nci_dep_link_down()
802 atomic_read(&ndev->state) == NCI_DISCOVERY) { in nci_dep_link_down()
803 nci_request(ndev, nci_rf_deactivate_req, 0, in nci_dep_link_down()
820 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_transceive() local
824 conn_info = ndev->rf_conn_info; in nci_transceive()
830 if (!ndev->target_active_prot) { in nci_transceive()
835 if (test_and_set_bit(NCI_DATA_EXCHANGE, &ndev->flags)) in nci_transceive()
842 rc = nci_send_data(ndev, NCI_STATIC_RF_CONN_ID, skb); in nci_transceive()
844 clear_bit(NCI_DATA_EXCHANGE, &ndev->flags); in nci_transceive()
851 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_tm_send() local
854 rc = nci_send_data(ndev, NCI_STATIC_RF_CONN_ID, skb); in nci_tm_send()
863 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_enable_se() local
865 if (ndev->ops->enable_se) in nci_enable_se()
866 return ndev->ops->enable_se(ndev, se_idx); in nci_enable_se()
873 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_disable_se() local
875 if (ndev->ops->disable_se) in nci_disable_se()
876 return ndev->ops->disable_se(ndev, se_idx); in nci_disable_se()
884 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_discover_se() local
886 if (ndev->ops->discover_se) { in nci_discover_se()
887 r = nci_nfcee_discover(ndev, NCI_NFCEE_DISCOVERY_ACTION_ENABLE); in nci_discover_se()
891 return ndev->ops->discover_se(ndev); in nci_discover_se()
901 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_se_io() local
903 if (ndev->ops->se_io) in nci_se_io()
904 return ndev->ops->se_io(ndev, se_idx, apdu, in nci_se_io()
912 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); in nci_fw_download() local
914 if (!ndev->ops->fw_download) in nci_fw_download()
917 return ndev->ops->fw_download(ndev, firmware_name); in nci_fw_download()
949 struct nci_dev *ndev; in nci_allocate_device() local
959 ndev = kzalloc(sizeof(struct nci_dev), GFP_KERNEL); in nci_allocate_device()
960 if (!ndev) in nci_allocate_device()
963 ndev->ops = ops; in nci_allocate_device()
964 ndev->tx_headroom = tx_headroom; in nci_allocate_device()
965 ndev->tx_tailroom = tx_tailroom; in nci_allocate_device()
966 init_completion(&ndev->req_completion); in nci_allocate_device()
968 ndev->nfc_dev = nfc_allocate_device(&nci_nfc_ops, in nci_allocate_device()
972 if (!ndev->nfc_dev) in nci_allocate_device()
975 ndev->hci_dev = nci_hci_allocate(ndev); in nci_allocate_device()
976 if (!ndev->hci_dev) in nci_allocate_device()
979 nfc_set_drvdata(ndev->nfc_dev, ndev); in nci_allocate_device()
981 return ndev; in nci_allocate_device()
984 kfree(ndev->nfc_dev); in nci_allocate_device()
987 kfree(ndev); in nci_allocate_device()
997 void nci_free_device(struct nci_dev *ndev) in nci_free_device() argument
999 nfc_free_device(ndev->nfc_dev); in nci_free_device()
1000 kfree(ndev); in nci_free_device()
1009 int nci_register_device(struct nci_dev *ndev) in nci_register_device() argument
1012 struct device *dev = &ndev->nfc_dev->dev; in nci_register_device()
1015 ndev->flags = 0; in nci_register_device()
1017 INIT_WORK(&ndev->cmd_work, nci_cmd_work); in nci_register_device()
1019 ndev->cmd_wq = create_singlethread_workqueue(name); in nci_register_device()
1020 if (!ndev->cmd_wq) { in nci_register_device()
1025 INIT_WORK(&ndev->rx_work, nci_rx_work); in nci_register_device()
1027 ndev->rx_wq = create_singlethread_workqueue(name); in nci_register_device()
1028 if (!ndev->rx_wq) { in nci_register_device()
1033 INIT_WORK(&ndev->tx_work, nci_tx_work); in nci_register_device()
1035 ndev->tx_wq = create_singlethread_workqueue(name); in nci_register_device()
1036 if (!ndev->tx_wq) { in nci_register_device()
1041 skb_queue_head_init(&ndev->cmd_q); in nci_register_device()
1042 skb_queue_head_init(&ndev->rx_q); in nci_register_device()
1043 skb_queue_head_init(&ndev->tx_q); in nci_register_device()
1045 setup_timer(&ndev->cmd_timer, nci_cmd_timer, in nci_register_device()
1046 (unsigned long) ndev); in nci_register_device()
1047 setup_timer(&ndev->data_timer, nci_data_timer, in nci_register_device()
1048 (unsigned long) ndev); in nci_register_device()
1050 mutex_init(&ndev->req_lock); in nci_register_device()
1051 INIT_LIST_HEAD(&ndev->conn_info_list); in nci_register_device()
1053 rc = nfc_register_device(ndev->nfc_dev); in nci_register_device()
1060 destroy_workqueue(ndev->rx_wq); in nci_register_device()
1063 destroy_workqueue(ndev->cmd_wq); in nci_register_device()
1075 void nci_unregister_device(struct nci_dev *ndev) in nci_unregister_device() argument
1079 nci_close_device(ndev); in nci_unregister_device()
1081 destroy_workqueue(ndev->cmd_wq); in nci_unregister_device()
1082 destroy_workqueue(ndev->rx_wq); in nci_unregister_device()
1083 destroy_workqueue(ndev->tx_wq); in nci_unregister_device()
1085 list_for_each_entry_safe(conn_info, n, &ndev->conn_info_list, list) { in nci_unregister_device()
1090 nfc_unregister_device(ndev->nfc_dev); in nci_unregister_device()
1100 int nci_recv_frame(struct nci_dev *ndev, struct sk_buff *skb) in nci_recv_frame() argument
1104 if (!ndev || (!test_bit(NCI_UP, &ndev->flags) && in nci_recv_frame()
1105 !test_bit(NCI_INIT, &ndev->flags))) { in nci_recv_frame()
1111 skb_queue_tail(&ndev->rx_q, skb); in nci_recv_frame()
1112 queue_work(ndev->rx_wq, &ndev->rx_work); in nci_recv_frame()
1118 static int nci_send_frame(struct nci_dev *ndev, struct sk_buff *skb) in nci_send_frame() argument
1122 if (!ndev) { in nci_send_frame()
1131 nfc_send_to_raw_sock(ndev->nfc_dev, skb, in nci_send_frame()
1134 return ndev->ops->send(ndev, skb); in nci_send_frame()
1138 int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, void *payload) in nci_send_cmd() argument
1145 skb = nci_skb_alloc(ndev, (NCI_CTRL_HDR_SIZE + plen), GFP_KERNEL); in nci_send_cmd()
1162 skb_queue_tail(&ndev->cmd_q, skb); in nci_send_cmd()
1163 queue_work(ndev->cmd_wq, &ndev->cmd_work); in nci_send_cmd()
1172 struct nci_dev *ndev = container_of(work, struct nci_dev, tx_work); in nci_tx_work() local
1176 conn_info = nci_get_conn_info_by_conn_id(ndev, ndev->cur_conn_id); in nci_tx_work()
1184 skb = skb_dequeue(&ndev->tx_q); in nci_tx_work()
1198 nci_send_frame(ndev, skb); in nci_tx_work()
1200 mod_timer(&ndev->data_timer, in nci_tx_work()
1209 struct nci_dev *ndev = container_of(work, struct nci_dev, rx_work); in nci_rx_work() local
1212 while ((skb = skb_dequeue(&ndev->rx_q))) { in nci_rx_work()
1215 nfc_send_to_raw_sock(ndev->nfc_dev, skb, in nci_rx_work()
1221 nci_rsp_packet(ndev, skb); in nci_rx_work()
1225 nci_ntf_packet(ndev, skb); in nci_rx_work()
1229 nci_rx_data_packet(ndev, skb); in nci_rx_work()
1240 if (test_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags)) { in nci_rx_work()
1242 if (test_bit(NCI_DATA_EXCHANGE, &ndev->flags)) in nci_rx_work()
1243 nci_data_exchange_complete(ndev, NULL, in nci_rx_work()
1244 ndev->cur_conn_id, in nci_rx_work()
1247 clear_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags); in nci_rx_work()
1255 struct nci_dev *ndev = container_of(work, struct nci_dev, cmd_work); in nci_cmd_work() local
1258 pr_debug("cmd_cnt %d\n", atomic_read(&ndev->cmd_cnt)); in nci_cmd_work()
1261 if (atomic_read(&ndev->cmd_cnt)) { in nci_cmd_work()
1262 skb = skb_dequeue(&ndev->cmd_q); in nci_cmd_work()
1266 atomic_dec(&ndev->cmd_cnt); in nci_cmd_work()
1274 nci_send_frame(ndev, skb); in nci_cmd_work()
1276 mod_timer(&ndev->cmd_timer, in nci_cmd_work()