Lines Matching refs:ddev

42 struct sk_buff *digital_skb_alloc(struct nfc_digital_dev *ddev,  in digital_skb_alloc()  argument
47 skb = alloc_skb(len + ddev->tx_headroom + ddev->tx_tailroom, in digital_skb_alloc()
50 skb_reserve(skb, ddev->tx_headroom); in digital_skb_alloc()
100 static inline void digital_switch_rf(struct nfc_digital_dev *ddev, bool on) in digital_switch_rf() argument
102 ddev->ops->switch_rf(ddev, on); in digital_switch_rf()
105 static inline void digital_abort_cmd(struct nfc_digital_dev *ddev) in digital_abort_cmd() argument
107 ddev->ops->abort_cmd(ddev); in digital_abort_cmd()
113 struct nfc_digital_dev *ddev = container_of(work, in digital_wq_cmd_complete() local
117 mutex_lock(&ddev->cmd_lock); in digital_wq_cmd_complete()
119 cmd = list_first_entry_or_null(&ddev->cmd_queue, struct digital_cmd, in digital_wq_cmd_complete()
122 mutex_unlock(&ddev->cmd_lock); in digital_wq_cmd_complete()
128 mutex_unlock(&ddev->cmd_lock); in digital_wq_cmd_complete()
134 cmd->cmd_cb(ddev, cmd->cb_context, cmd->resp); in digital_wq_cmd_complete()
139 schedule_work(&ddev->cmd_work); in digital_wq_cmd_complete()
142 static void digital_send_cmd_complete(struct nfc_digital_dev *ddev, in digital_send_cmd_complete() argument
149 schedule_work(&ddev->cmd_complete_work); in digital_send_cmd_complete()
157 struct nfc_digital_dev *ddev = container_of(work, in digital_wq_cmd() local
161 mutex_lock(&ddev->cmd_lock); in digital_wq_cmd()
163 cmd = list_first_entry_or_null(&ddev->cmd_queue, struct digital_cmd, in digital_wq_cmd()
166 mutex_unlock(&ddev->cmd_lock); in digital_wq_cmd()
172 mutex_unlock(&ddev->cmd_lock); in digital_wq_cmd()
180 rc = ddev->ops->in_send_cmd(ddev, cmd->req, cmd->timeout, in digital_wq_cmd()
185 rc = ddev->ops->tg_send_cmd(ddev, cmd->req, cmd->timeout, in digital_wq_cmd()
190 rc = ddev->ops->tg_listen(ddev, cmd->timeout, in digital_wq_cmd()
197 rc = ddev->ops->tg_listen_mdaa(ddev, params, cmd->timeout, in digital_wq_cmd()
202 rc = ddev->ops->tg_listen_md(ddev, cmd->timeout, in digital_wq_cmd()
216 mutex_lock(&ddev->cmd_lock); in digital_wq_cmd()
218 mutex_unlock(&ddev->cmd_lock); in digital_wq_cmd()
224 schedule_work(&ddev->cmd_work); in digital_wq_cmd()
227 int digital_send_cmd(struct nfc_digital_dev *ddev, u8 cmd_type, in digital_send_cmd() argument
246 mutex_lock(&ddev->cmd_lock); in digital_send_cmd()
247 list_add_tail(&cmd->queue, &ddev->cmd_queue); in digital_send_cmd()
248 mutex_unlock(&ddev->cmd_lock); in digital_send_cmd()
250 schedule_work(&ddev->cmd_work); in digital_send_cmd()
255 int digital_in_configure_hw(struct nfc_digital_dev *ddev, int type, int param) in digital_in_configure_hw() argument
259 rc = ddev->ops->in_configure_hw(ddev, type, param); in digital_in_configure_hw()
266 int digital_tg_configure_hw(struct nfc_digital_dev *ddev, int type, int param) in digital_tg_configure_hw() argument
270 rc = ddev->ops->tg_configure_hw(ddev, type, param); in digital_tg_configure_hw()
277 static int digital_tg_listen_mdaa(struct nfc_digital_dev *ddev, u8 rf_tech) in digital_tg_listen_mdaa() argument
295 rc = digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN_MDAA, NULL, params, in digital_tg_listen_mdaa()
303 static int digital_tg_listen_md(struct nfc_digital_dev *ddev, u8 rf_tech) in digital_tg_listen_md() argument
305 return digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN_MD, NULL, NULL, 500, in digital_tg_listen_md()
309 int digital_target_found(struct nfc_digital_dev *ddev, in digital_target_found() argument
319 rf_tech = ddev->poll_techs[ddev->poll_tech_index].rf_tech; in digital_target_found()
377 ddev->curr_rf_tech = rf_tech; in digital_target_found()
379 if (DIGITAL_DRV_CAPS_IN_CRC(ddev)) { in digital_target_found()
380 ddev->skb_add_crc = digital_skb_add_crc_none; in digital_target_found()
381 ddev->skb_check_crc = digital_skb_check_crc_none; in digital_target_found()
383 ddev->skb_add_crc = add_crc; in digital_target_found()
384 ddev->skb_check_crc = check_crc; in digital_target_found()
387 rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING, framing); in digital_target_found()
393 poll_tech_count = ddev->poll_tech_count; in digital_target_found()
394 ddev->poll_tech_count = 0; in digital_target_found()
396 rc = nfc_targets_found(ddev->nfc_dev, target, 1); in digital_target_found()
398 ddev->poll_tech_count = poll_tech_count; in digital_target_found()
405 void digital_poll_next_tech(struct nfc_digital_dev *ddev) in digital_poll_next_tech() argument
409 digital_switch_rf(ddev, 0); in digital_poll_next_tech()
411 mutex_lock(&ddev->poll_lock); in digital_poll_next_tech()
413 if (!ddev->poll_tech_count) { in digital_poll_next_tech()
414 mutex_unlock(&ddev->poll_lock); in digital_poll_next_tech()
419 ddev->poll_tech_index = rand_mod % ddev->poll_tech_count; in digital_poll_next_tech()
421 mutex_unlock(&ddev->poll_lock); in digital_poll_next_tech()
423 schedule_delayed_work(&ddev->poll_work, in digital_poll_next_tech()
431 struct nfc_digital_dev *ddev = container_of(work, in digital_wq_poll() local
434 mutex_lock(&ddev->poll_lock); in digital_wq_poll()
436 if (!ddev->poll_tech_count) { in digital_wq_poll()
437 mutex_unlock(&ddev->poll_lock); in digital_wq_poll()
441 poll_tech = &ddev->poll_techs[ddev->poll_tech_index]; in digital_wq_poll()
443 mutex_unlock(&ddev->poll_lock); in digital_wq_poll()
445 rc = poll_tech->poll_func(ddev, poll_tech->rf_tech); in digital_wq_poll()
447 digital_poll_next_tech(ddev); in digital_wq_poll()
450 static void digital_add_poll_tech(struct nfc_digital_dev *ddev, u8 rf_tech, in digital_add_poll_tech() argument
455 if (ddev->poll_tech_count >= NFC_DIGITAL_POLL_MODE_COUNT_MAX) in digital_add_poll_tech()
458 poll_tech = &ddev->poll_techs[ddev->poll_tech_count++]; in digital_add_poll_tech()
479 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_start_poll() local
483 tm_protocols, ddev->protocols); in digital_start_poll()
485 matching_im_protocols = ddev->protocols & im_protocols; in digital_start_poll()
486 matching_tm_protocols = ddev->protocols & tm_protocols; in digital_start_poll()
493 if (ddev->poll_tech_count) { in digital_start_poll()
498 if (ddev->curr_protocol) { in digital_start_poll()
503 ddev->poll_tech_count = 0; in digital_start_poll()
504 ddev->poll_tech_index = 0; in digital_start_poll()
507 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_106A, in digital_start_poll()
511 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_106B, in digital_start_poll()
515 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_212F, in digital_start_poll()
518 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_424F, in digital_start_poll()
523 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_ISO15693, in digital_start_poll()
527 if (ddev->ops->tg_listen_mdaa) { in digital_start_poll()
528 digital_add_poll_tech(ddev, 0, in digital_start_poll()
530 } else if (ddev->ops->tg_listen_md) { in digital_start_poll()
531 digital_add_poll_tech(ddev, 0, in digital_start_poll()
534 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_106A, in digital_start_poll()
537 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_212F, in digital_start_poll()
540 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_424F, in digital_start_poll()
545 if (!ddev->poll_tech_count) { in digital_start_poll()
551 schedule_delayed_work(&ddev->poll_work, 0); in digital_start_poll()
558 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_stop_poll() local
560 mutex_lock(&ddev->poll_lock); in digital_stop_poll()
562 if (!ddev->poll_tech_count) { in digital_stop_poll()
564 mutex_unlock(&ddev->poll_lock); in digital_stop_poll()
568 ddev->poll_tech_count = 0; in digital_stop_poll()
570 mutex_unlock(&ddev->poll_lock); in digital_stop_poll()
572 cancel_delayed_work_sync(&ddev->poll_work); in digital_stop_poll()
574 digital_abort_cmd(ddev); in digital_stop_poll()
579 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_dev_up() local
581 digital_switch_rf(ddev, 1); in digital_dev_up()
588 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_dev_down() local
590 digital_switch_rf(ddev, 0); in digital_dev_down()
599 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_dep_link_up() local
602 rc = digital_in_send_atr_req(ddev, target, comm_mode, gb, gb_len); in digital_dep_link_up()
605 ddev->curr_protocol = NFC_PROTO_NFC_DEP; in digital_dep_link_up()
612 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_dep_link_down() local
614 digital_abort_cmd(ddev); in digital_dep_link_down()
616 ddev->curr_protocol = 0; in digital_dep_link_down()
624 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_activate_target() local
626 if (ddev->poll_tech_count) { in digital_activate_target()
631 if (ddev->curr_protocol) { in digital_activate_target()
636 ddev->curr_protocol = protocol; in digital_activate_target()
645 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_deactivate_target() local
647 if (!ddev->curr_protocol) { in digital_deactivate_target()
652 digital_abort_cmd(ddev); in digital_deactivate_target()
653 ddev->curr_protocol = 0; in digital_deactivate_target()
658 struct nfc_digital_dev *ddev = nfc_get_drvdata(dev); in digital_tg_send() local
660 return digital_tg_send_dep_res(ddev, skb); in digital_tg_send()
663 static void digital_in_send_complete(struct nfc_digital_dev *ddev, void *arg, in digital_in_send_complete() argument
675 if (ddev->curr_protocol == NFC_PROTO_MIFARE) { in digital_in_send_complete()
681 if ((ddev->curr_protocol == NFC_PROTO_ISO14443) || in digital_in_send_complete()
682 (ddev->curr_protocol == NFC_PROTO_ISO14443_B)) { in digital_in_send_complete()
683 rc = digital_in_iso_dep_pull_sod(ddev, resp); in digital_in_send_complete()
688 rc = ddev->skb_check_crc(resp); in digital_in_send_complete()
705 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_in_send() local
716 if (ddev->curr_protocol == NFC_PROTO_NFC_DEP) { in digital_in_send()
717 rc = digital_in_send_dep_req(ddev, target, skb, data_exch); in digital_in_send()
721 if ((ddev->curr_protocol == NFC_PROTO_ISO14443) || in digital_in_send()
722 (ddev->curr_protocol == NFC_PROTO_ISO14443_B)) { in digital_in_send()
723 rc = digital_in_iso_dep_push_sod(ddev, skb); in digital_in_send()
728 ddev->skb_add_crc(skb); in digital_in_send()
730 rc = digital_in_send_cmd(ddev, skb, 500, digital_in_send_complete, in digital_in_send()
758 struct nfc_digital_dev *ddev; in nfc_digital_allocate_device() local
765 ddev = kzalloc(sizeof(*ddev), GFP_KERNEL); in nfc_digital_allocate_device()
766 if (!ddev) in nfc_digital_allocate_device()
769 ddev->driver_capabilities = driver_capabilities; in nfc_digital_allocate_device()
770 ddev->ops = ops; in nfc_digital_allocate_device()
772 mutex_init(&ddev->cmd_lock); in nfc_digital_allocate_device()
773 INIT_LIST_HEAD(&ddev->cmd_queue); in nfc_digital_allocate_device()
775 INIT_WORK(&ddev->cmd_work, digital_wq_cmd); in nfc_digital_allocate_device()
776 INIT_WORK(&ddev->cmd_complete_work, digital_wq_cmd_complete); in nfc_digital_allocate_device()
778 mutex_init(&ddev->poll_lock); in nfc_digital_allocate_device()
779 INIT_DELAYED_WORK(&ddev->poll_work, digital_wq_poll); in nfc_digital_allocate_device()
782 ddev->protocols |= NFC_PROTO_JEWEL_MASK; in nfc_digital_allocate_device()
784 ddev->protocols |= NFC_PROTO_MIFARE_MASK; in nfc_digital_allocate_device()
786 ddev->protocols |= NFC_PROTO_FELICA_MASK; in nfc_digital_allocate_device()
788 ddev->protocols |= NFC_PROTO_NFC_DEP_MASK; in nfc_digital_allocate_device()
790 ddev->protocols |= NFC_PROTO_ISO15693_MASK; in nfc_digital_allocate_device()
792 ddev->protocols |= NFC_PROTO_ISO14443_MASK; in nfc_digital_allocate_device()
794 ddev->protocols |= NFC_PROTO_ISO14443_B_MASK; in nfc_digital_allocate_device()
796 ddev->tx_headroom = tx_headroom + DIGITAL_MAX_HEADER_LEN; in nfc_digital_allocate_device()
797 ddev->tx_tailroom = tx_tailroom + DIGITAL_CRC_LEN; in nfc_digital_allocate_device()
799 ddev->nfc_dev = nfc_allocate_device(&digital_nfc_ops, ddev->protocols, in nfc_digital_allocate_device()
800 ddev->tx_headroom, in nfc_digital_allocate_device()
801 ddev->tx_tailroom); in nfc_digital_allocate_device()
802 if (!ddev->nfc_dev) { in nfc_digital_allocate_device()
807 nfc_set_drvdata(ddev->nfc_dev, ddev); in nfc_digital_allocate_device()
809 return ddev; in nfc_digital_allocate_device()
812 kfree(ddev); in nfc_digital_allocate_device()
818 void nfc_digital_free_device(struct nfc_digital_dev *ddev) in nfc_digital_free_device() argument
820 nfc_free_device(ddev->nfc_dev); in nfc_digital_free_device()
821 kfree(ddev); in nfc_digital_free_device()
825 int nfc_digital_register_device(struct nfc_digital_dev *ddev) in nfc_digital_register_device() argument
827 return nfc_register_device(ddev->nfc_dev); in nfc_digital_register_device()
831 void nfc_digital_unregister_device(struct nfc_digital_dev *ddev) in nfc_digital_unregister_device() argument
835 nfc_unregister_device(ddev->nfc_dev); in nfc_digital_unregister_device()
837 mutex_lock(&ddev->poll_lock); in nfc_digital_unregister_device()
838 ddev->poll_tech_count = 0; in nfc_digital_unregister_device()
839 mutex_unlock(&ddev->poll_lock); in nfc_digital_unregister_device()
841 cancel_delayed_work_sync(&ddev->poll_work); in nfc_digital_unregister_device()
842 cancel_work_sync(&ddev->cmd_work); in nfc_digital_unregister_device()
843 cancel_work_sync(&ddev->cmd_complete_work); in nfc_digital_unregister_device()
845 list_for_each_entry_safe(cmd, n, &ddev->cmd_queue, queue) { in nfc_digital_unregister_device()
853 cmd->cmd_cb(ddev, cmd->cb_context, ERR_PTR(-ENODEV)); in nfc_digital_unregister_device()