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
294 return digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN_MDAA, NULL, params, in digital_tg_listen_mdaa()
298 static int digital_tg_listen_md(struct nfc_digital_dev *ddev, u8 rf_tech) in digital_tg_listen_md() argument
300 return digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN_MD, NULL, NULL, 500, in digital_tg_listen_md()
304 int digital_target_found(struct nfc_digital_dev *ddev, in digital_target_found() argument
314 rf_tech = ddev->poll_techs[ddev->poll_tech_index].rf_tech; in digital_target_found()
372 ddev->curr_rf_tech = rf_tech; in digital_target_found()
374 if (DIGITAL_DRV_CAPS_IN_CRC(ddev)) { in digital_target_found()
375 ddev->skb_add_crc = digital_skb_add_crc_none; in digital_target_found()
376 ddev->skb_check_crc = digital_skb_check_crc_none; in digital_target_found()
378 ddev->skb_add_crc = add_crc; in digital_target_found()
379 ddev->skb_check_crc = check_crc; in digital_target_found()
382 rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING, framing); in digital_target_found()
388 poll_tech_count = ddev->poll_tech_count; in digital_target_found()
389 ddev->poll_tech_count = 0; in digital_target_found()
391 rc = nfc_targets_found(ddev->nfc_dev, target, 1); in digital_target_found()
393 ddev->poll_tech_count = poll_tech_count; in digital_target_found()
400 void digital_poll_next_tech(struct nfc_digital_dev *ddev) in digital_poll_next_tech() argument
404 digital_switch_rf(ddev, 0); in digital_poll_next_tech()
406 mutex_lock(&ddev->poll_lock); in digital_poll_next_tech()
408 if (!ddev->poll_tech_count) { in digital_poll_next_tech()
409 mutex_unlock(&ddev->poll_lock); in digital_poll_next_tech()
414 ddev->poll_tech_index = rand_mod % ddev->poll_tech_count; in digital_poll_next_tech()
416 mutex_unlock(&ddev->poll_lock); in digital_poll_next_tech()
418 schedule_delayed_work(&ddev->poll_work, in digital_poll_next_tech()
426 struct nfc_digital_dev *ddev = container_of(work, in digital_wq_poll() local
429 mutex_lock(&ddev->poll_lock); in digital_wq_poll()
431 if (!ddev->poll_tech_count) { in digital_wq_poll()
432 mutex_unlock(&ddev->poll_lock); in digital_wq_poll()
436 poll_tech = &ddev->poll_techs[ddev->poll_tech_index]; in digital_wq_poll()
438 mutex_unlock(&ddev->poll_lock); in digital_wq_poll()
440 rc = poll_tech->poll_func(ddev, poll_tech->rf_tech); in digital_wq_poll()
442 digital_poll_next_tech(ddev); in digital_wq_poll()
445 static void digital_add_poll_tech(struct nfc_digital_dev *ddev, u8 rf_tech, in digital_add_poll_tech() argument
450 if (ddev->poll_tech_count >= NFC_DIGITAL_POLL_MODE_COUNT_MAX) in digital_add_poll_tech()
453 poll_tech = &ddev->poll_techs[ddev->poll_tech_count++]; in digital_add_poll_tech()
471 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_start_poll() local
475 tm_protocols, ddev->protocols); in digital_start_poll()
477 matching_im_protocols = ddev->protocols & im_protocols; in digital_start_poll()
478 matching_tm_protocols = ddev->protocols & tm_protocols; in digital_start_poll()
485 if (ddev->poll_tech_count) { in digital_start_poll()
490 if (ddev->curr_protocol) { in digital_start_poll()
495 ddev->poll_tech_count = 0; in digital_start_poll()
496 ddev->poll_tech_index = 0; in digital_start_poll()
499 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_106A, in digital_start_poll()
503 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_106B, in digital_start_poll()
507 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_212F, in digital_start_poll()
510 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_424F, in digital_start_poll()
515 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_ISO15693, in digital_start_poll()
519 if (ddev->ops->tg_listen_mdaa) { in digital_start_poll()
520 digital_add_poll_tech(ddev, 0, in digital_start_poll()
522 } else if (ddev->ops->tg_listen_md) { in digital_start_poll()
523 digital_add_poll_tech(ddev, 0, in digital_start_poll()
526 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_106A, in digital_start_poll()
529 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_212F, in digital_start_poll()
532 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_424F, in digital_start_poll()
537 if (!ddev->poll_tech_count) { in digital_start_poll()
543 schedule_delayed_work(&ddev->poll_work, 0); in digital_start_poll()
550 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_stop_poll() local
552 mutex_lock(&ddev->poll_lock); in digital_stop_poll()
554 if (!ddev->poll_tech_count) { in digital_stop_poll()
556 mutex_unlock(&ddev->poll_lock); in digital_stop_poll()
560 ddev->poll_tech_count = 0; in digital_stop_poll()
562 mutex_unlock(&ddev->poll_lock); in digital_stop_poll()
564 cancel_delayed_work_sync(&ddev->poll_work); in digital_stop_poll()
566 digital_abort_cmd(ddev); in digital_stop_poll()
571 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_dev_up() local
573 digital_switch_rf(ddev, 1); in digital_dev_up()
580 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_dev_down() local
582 digital_switch_rf(ddev, 0); in digital_dev_down()
591 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_dep_link_up() local
594 rc = digital_in_send_atr_req(ddev, target, comm_mode, gb, gb_len); in digital_dep_link_up()
597 ddev->curr_protocol = NFC_PROTO_NFC_DEP; in digital_dep_link_up()
604 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_dep_link_down() local
606 digital_abort_cmd(ddev); in digital_dep_link_down()
608 ddev->curr_protocol = 0; in digital_dep_link_down()
616 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_activate_target() local
618 if (ddev->poll_tech_count) { in digital_activate_target()
623 if (ddev->curr_protocol) { in digital_activate_target()
628 ddev->curr_protocol = protocol; in digital_activate_target()
637 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_deactivate_target() local
639 if (!ddev->curr_protocol) { in digital_deactivate_target()
644 digital_abort_cmd(ddev); in digital_deactivate_target()
645 ddev->curr_protocol = 0; in digital_deactivate_target()
650 struct nfc_digital_dev *ddev = nfc_get_drvdata(dev); in digital_tg_send() local
652 return digital_tg_send_dep_res(ddev, skb); in digital_tg_send()
655 static void digital_in_send_complete(struct nfc_digital_dev *ddev, void *arg, in digital_in_send_complete() argument
667 if (ddev->curr_protocol == NFC_PROTO_MIFARE) { in digital_in_send_complete()
673 if ((ddev->curr_protocol == NFC_PROTO_ISO14443) || in digital_in_send_complete()
674 (ddev->curr_protocol == NFC_PROTO_ISO14443_B)) { in digital_in_send_complete()
675 rc = digital_in_iso_dep_pull_sod(ddev, resp); in digital_in_send_complete()
680 rc = ddev->skb_check_crc(resp); in digital_in_send_complete()
697 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); in digital_in_send() local
708 if (ddev->curr_protocol == NFC_PROTO_NFC_DEP) { in digital_in_send()
709 rc = digital_in_send_dep_req(ddev, target, skb, data_exch); in digital_in_send()
713 if ((ddev->curr_protocol == NFC_PROTO_ISO14443) || in digital_in_send()
714 (ddev->curr_protocol == NFC_PROTO_ISO14443_B)) { in digital_in_send()
715 rc = digital_in_iso_dep_push_sod(ddev, skb); in digital_in_send()
720 ddev->skb_add_crc(skb); in digital_in_send()
722 rc = digital_in_send_cmd(ddev, skb, 500, digital_in_send_complete, in digital_in_send()
750 struct nfc_digital_dev *ddev; in nfc_digital_allocate_device() local
757 ddev = kzalloc(sizeof(*ddev), GFP_KERNEL); in nfc_digital_allocate_device()
758 if (!ddev) in nfc_digital_allocate_device()
761 ddev->driver_capabilities = driver_capabilities; in nfc_digital_allocate_device()
762 ddev->ops = ops; in nfc_digital_allocate_device()
764 mutex_init(&ddev->cmd_lock); in nfc_digital_allocate_device()
765 INIT_LIST_HEAD(&ddev->cmd_queue); in nfc_digital_allocate_device()
767 INIT_WORK(&ddev->cmd_work, digital_wq_cmd); in nfc_digital_allocate_device()
768 INIT_WORK(&ddev->cmd_complete_work, digital_wq_cmd_complete); in nfc_digital_allocate_device()
770 mutex_init(&ddev->poll_lock); in nfc_digital_allocate_device()
771 INIT_DELAYED_WORK(&ddev->poll_work, digital_wq_poll); in nfc_digital_allocate_device()
774 ddev->protocols |= NFC_PROTO_JEWEL_MASK; in nfc_digital_allocate_device()
776 ddev->protocols |= NFC_PROTO_MIFARE_MASK; in nfc_digital_allocate_device()
778 ddev->protocols |= NFC_PROTO_FELICA_MASK; in nfc_digital_allocate_device()
780 ddev->protocols |= NFC_PROTO_NFC_DEP_MASK; in nfc_digital_allocate_device()
782 ddev->protocols |= NFC_PROTO_ISO15693_MASK; in nfc_digital_allocate_device()
784 ddev->protocols |= NFC_PROTO_ISO14443_MASK; in nfc_digital_allocate_device()
786 ddev->protocols |= NFC_PROTO_ISO14443_B_MASK; in nfc_digital_allocate_device()
788 ddev->tx_headroom = tx_headroom + DIGITAL_MAX_HEADER_LEN; in nfc_digital_allocate_device()
789 ddev->tx_tailroom = tx_tailroom + DIGITAL_CRC_LEN; in nfc_digital_allocate_device()
791 ddev->nfc_dev = nfc_allocate_device(&digital_nfc_ops, ddev->protocols, in nfc_digital_allocate_device()
792 ddev->tx_headroom, in nfc_digital_allocate_device()
793 ddev->tx_tailroom); in nfc_digital_allocate_device()
794 if (!ddev->nfc_dev) { in nfc_digital_allocate_device()
799 nfc_set_drvdata(ddev->nfc_dev, ddev); in nfc_digital_allocate_device()
801 return ddev; in nfc_digital_allocate_device()
804 kfree(ddev); in nfc_digital_allocate_device()
810 void nfc_digital_free_device(struct nfc_digital_dev *ddev) in nfc_digital_free_device() argument
812 nfc_free_device(ddev->nfc_dev); in nfc_digital_free_device()
813 kfree(ddev); in nfc_digital_free_device()
817 int nfc_digital_register_device(struct nfc_digital_dev *ddev) in nfc_digital_register_device() argument
819 return nfc_register_device(ddev->nfc_dev); in nfc_digital_register_device()
823 void nfc_digital_unregister_device(struct nfc_digital_dev *ddev) in nfc_digital_unregister_device() argument
827 nfc_unregister_device(ddev->nfc_dev); in nfc_digital_unregister_device()
829 mutex_lock(&ddev->poll_lock); in nfc_digital_unregister_device()
830 ddev->poll_tech_count = 0; in nfc_digital_unregister_device()
831 mutex_unlock(&ddev->poll_lock); in nfc_digital_unregister_device()
833 cancel_delayed_work_sync(&ddev->poll_work); in nfc_digital_unregister_device()
834 cancel_work_sync(&ddev->cmd_work); in nfc_digital_unregister_device()
835 cancel_work_sync(&ddev->cmd_complete_work); in nfc_digital_unregister_device()
837 list_for_each_entry_safe(cmd, n, &ddev->cmd_queue, queue) { in nfc_digital_unregister_device()
845 cmd->cmd_cb(ddev, cmd->cb_context, ERR_PTR(-ENODEV)); in nfc_digital_unregister_device()