Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

NFC: Changed HCI and PN544 HCI driver to use the new HCI LLC Core

The previous shdlc HCI driver and its header are removed from the tree.
PN544 now registers directly with HCI and passes the name of the llc it
requires (shdlc).
HCI instantiation now allocates the required llc instance. The llc is
started when the HCI device is brought up.

Signed-off-by: Eric Lapuyade <eric.lapuyade@intel.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>

authored by

Eric Lapuyade and committed by
Samuel Ortiz
412fda53 4a61cd66

+201 -1189
+1 -1
drivers/nfc/Kconfig
··· 19 19 20 20 config PN544_HCI_NFC 21 21 tristate "HCI PN544 NFC driver" 22 - depends on I2C && NFC_SHDLC 22 + depends on I2C && NFC_HCI && NFC_SHDLC 23 23 select CRC_CCITT 24 24 default n 25 25 ---help---
+37 -36
drivers/nfc/pn544_hci.c
··· 29 29 30 30 #include <linux/nfc.h> 31 31 #include <net/nfc/hci.h> 32 - #include <net/nfc/shdlc.h> 32 + #include <net/nfc/llc.h> 33 33 34 34 #include <linux/nfc/pn544.h> 35 35 ··· 133 133 134 134 struct pn544_hci_info { 135 135 struct i2c_client *i2c_dev; 136 - struct nfc_shdlc *shdlc; 136 + struct nfc_hci_dev *hdev; 137 137 138 138 enum pn544_state state; 139 139 ··· 362 362 if (r == -EREMOTEIO) { 363 363 info->hard_fault = r; 364 364 365 - nfc_shdlc_recv_frame(info->shdlc, NULL); 365 + nfc_hci_recv_frame(info->hdev, NULL); 366 366 367 367 return IRQ_HANDLED; 368 368 } else if ((r == -ENOMEM) || (r == -EBADMSG)) { 369 369 return IRQ_HANDLED; 370 370 } 371 371 372 - nfc_shdlc_recv_frame(info->shdlc, skb); 372 + nfc_hci_recv_frame(info->hdev, skb); 373 373 374 374 return IRQ_HANDLED; 375 375 } 376 376 377 - static int pn544_hci_open(struct nfc_shdlc *shdlc) 377 + static int pn544_hci_open(struct nfc_hci_dev *hdev) 378 378 { 379 - struct pn544_hci_info *info = nfc_shdlc_get_clientdata(shdlc); 379 + struct pn544_hci_info *info = nfc_hci_get_clientdata(hdev); 380 380 int r = 0; 381 381 382 382 mutex_lock(&info->info_lock); ··· 396 396 return r; 397 397 } 398 398 399 - static void pn544_hci_close(struct nfc_shdlc *shdlc) 399 + static void pn544_hci_close(struct nfc_hci_dev *hdev) 400 400 { 401 - struct pn544_hci_info *info = nfc_shdlc_get_clientdata(shdlc); 401 + struct pn544_hci_info *info = nfc_hci_get_clientdata(hdev); 402 402 403 403 mutex_lock(&info->info_lock); 404 404 ··· 413 413 mutex_unlock(&info->info_lock); 414 414 } 415 415 416 - static int pn544_hci_ready(struct nfc_shdlc *shdlc) 416 + static int pn544_hci_ready(struct nfc_hci_dev *hdev) 417 417 { 418 - struct nfc_hci_dev *hdev = nfc_shdlc_get_hci_dev(shdlc); 419 418 struct sk_buff *skb; 420 419 static struct hw_config { 421 420 u8 adr[2]; ··· 600 601 skb_trim(skb, PN544_FRAME_TAILROOM); 601 602 } 602 603 603 - static int pn544_hci_xmit(struct nfc_shdlc *shdlc, struct sk_buff *skb) 604 + static int pn544_hci_xmit(struct nfc_hci_dev *hdev, struct sk_buff *skb) 604 605 { 605 - struct pn544_hci_info *info = nfc_shdlc_get_clientdata(shdlc); 606 + struct pn544_hci_info *info = nfc_hci_get_clientdata(hdev); 606 607 struct i2c_client *client = info->i2c_dev; 607 608 int r; 608 609 ··· 616 617 return r; 617 618 } 618 619 619 - static int pn544_hci_start_poll(struct nfc_shdlc *shdlc, 620 + static int pn544_hci_start_poll(struct nfc_hci_dev *hdev, 620 621 u32 im_protocols, u32 tm_protocols) 621 622 { 622 - struct nfc_hci_dev *hdev = nfc_shdlc_get_hci_dev(shdlc); 623 623 u8 phases = 0; 624 624 int r; 625 625 u8 duration[2]; ··· 669 671 return r; 670 672 } 671 673 672 - static int pn544_hci_target_from_gate(struct nfc_shdlc *shdlc, u8 gate, 674 + static int pn544_hci_target_from_gate(struct nfc_hci_dev *hdev, u8 gate, 673 675 struct nfc_target *target) 674 676 { 675 677 switch (gate) { ··· 687 689 return 0; 688 690 } 689 691 690 - static int pn544_hci_complete_target_discovered(struct nfc_shdlc *shdlc, 692 + static int pn544_hci_complete_target_discovered(struct nfc_hci_dev *hdev, 691 693 u8 gate, 692 694 struct nfc_target *target) 693 695 { 694 - struct nfc_hci_dev *hdev = nfc_shdlc_get_hci_dev(shdlc); 695 696 struct sk_buff *uid_skb; 696 697 int r = 0; 697 698 ··· 762 765 * <= 0: driver handled the data exchange 763 766 * 1: driver doesn't especially handle, please do standard processing 764 767 */ 765 - static int pn544_hci_data_exchange(struct nfc_shdlc *shdlc, 768 + static int pn544_hci_data_exchange(struct nfc_hci_dev *hdev, 766 769 struct nfc_target *target, 767 770 struct sk_buff *skb, data_exchange_cb_t cb, 768 771 void *cb_context) 769 772 { 770 - struct pn544_hci_info *info = nfc_shdlc_get_clientdata(shdlc); 771 - struct nfc_hci_dev *hdev = nfc_shdlc_get_hci_dev(shdlc); 773 + struct pn544_hci_info *info = nfc_hci_get_clientdata(hdev); 772 774 773 775 pr_info(DRIVER_DESC ": %s for gate=%d\n", __func__, 774 776 target->hci_reader_gate); ··· 820 824 } 821 825 } 822 826 823 - static int pn544_hci_check_presence(struct nfc_shdlc *shdlc, 827 + static int pn544_hci_check_presence(struct nfc_hci_dev *hdev, 824 828 struct nfc_target *target) 825 829 { 826 - struct nfc_hci_dev *hdev = nfc_shdlc_get_hci_dev(shdlc); 827 - 828 830 return nfc_hci_send_cmd(hdev, target->hci_reader_gate, 829 831 PN544_RF_READER_CMD_PRESENCE_CHECK, 830 832 NULL, 0, NULL); 831 833 } 832 834 833 - static struct nfc_shdlc_ops pn544_shdlc_ops = { 835 + static struct nfc_hci_ops pn544_hci_ops = { 834 836 .open = pn544_hci_open, 835 837 .close = pn544_hci_close, 836 838 .hci_ready = pn544_hci_ready, ··· 920 926 NFC_PROTO_ISO14443_B_MASK | 921 927 NFC_PROTO_NFC_DEP_MASK; 922 928 923 - info->shdlc = nfc_shdlc_allocate(&pn544_shdlc_ops, 924 - &init_data, protocols, 925 - PN544_FRAME_HEADROOM + PN544_CMDS_HEADROOM, 926 - PN544_FRAME_TAILROOM, 927 - PN544_HCI_LLC_MAX_PAYLOAD, 928 - dev_name(&client->dev)); 929 - if (!info->shdlc) { 930 - dev_err(&client->dev, "Cannot allocate nfc shdlc.\n"); 929 + info->hdev = nfc_hci_allocate_device(&pn544_hci_ops, &init_data, 930 + protocols, LLC_SHDLC_NAME, 931 + PN544_FRAME_HEADROOM + 932 + PN544_CMDS_HEADROOM, 933 + PN544_FRAME_TAILROOM, 934 + PN544_HCI_LLC_MAX_PAYLOAD); 935 + if (!info->hdev) { 936 + dev_err(&client->dev, "Cannot allocate nfc hdev.\n"); 931 937 r = -ENOMEM; 932 - goto err_allocshdlc; 938 + goto err_alloc_hdev; 933 939 } 934 940 935 - nfc_shdlc_set_clientdata(info->shdlc, info); 941 + nfc_hci_set_clientdata(info->hdev, info); 942 + 943 + r = nfc_hci_register_device(info->hdev); 944 + if (r) 945 + goto err_regdev; 936 946 937 947 return 0; 938 948 939 - err_allocshdlc: 949 + err_regdev: 950 + nfc_hci_free_device(info->hdev); 951 + 952 + err_alloc_hdev: 940 953 free_irq(client->irq, info); 941 954 942 955 err_rti: ··· 964 963 965 964 dev_dbg(&client->dev, "%s\n", __func__); 966 965 967 - nfc_shdlc_free(info->shdlc); 966 + nfc_hci_free_device(info->hdev); 968 967 969 968 if (info->state != PN544_ST_COLD) { 970 969 if (pdata->disable)
+3
include/net/nfc/hci.h
··· 87 87 88 88 struct nfc_hci_ops *ops; 89 89 90 + struct nfc_llc *llc; 91 + 90 92 struct nfc_hci_init_data init_data; 91 93 92 94 void *clientdata; ··· 115 113 struct nfc_hci_dev *nfc_hci_allocate_device(struct nfc_hci_ops *ops, 116 114 struct nfc_hci_init_data *init_data, 117 115 u32 protocols, 116 + const char *llc_name, 118 117 int tx_headroom, 119 118 int tx_tailroom, 120 119 int max_link_payload);
-106
include/net/nfc/shdlc.h
··· 1 - /* 2 - * Copyright (C) 2012 Intel Corporation. All rights reserved. 3 - * 4 - * This program is free software; you can redistribute it and/or modify 5 - * it under the terms of the GNU General Public License as published by 6 - * the Free Software Foundation; either version 2 of the License, or 7 - * (at your option) any later version. 8 - * 9 - * This program is distributed in the hope that it will be useful, 10 - * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 - * GNU General Public License for more details. 13 - * 14 - * You should have received a copy of the GNU General Public License 15 - * along with this program; if not, write to the 16 - * Free Software Foundation, Inc., 17 - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 - */ 19 - 20 - #ifndef __NFC_SHDLC_H 21 - #define __NFC_SHDLC_H 22 - 23 - struct nfc_shdlc; 24 - 25 - struct nfc_shdlc_ops { 26 - int (*open) (struct nfc_shdlc *shdlc); 27 - void (*close) (struct nfc_shdlc *shdlc); 28 - int (*hci_ready) (struct nfc_shdlc *shdlc); 29 - int (*xmit) (struct nfc_shdlc *shdlc, struct sk_buff *skb); 30 - int (*start_poll) (struct nfc_shdlc *shdlc, 31 - u32 im_protocols, u32 tm_protocols); 32 - int (*target_from_gate) (struct nfc_shdlc *shdlc, u8 gate, 33 - struct nfc_target *target); 34 - int (*complete_target_discovered) (struct nfc_shdlc *shdlc, u8 gate, 35 - struct nfc_target *target); 36 - int (*data_exchange) (struct nfc_shdlc *shdlc, 37 - struct nfc_target *target, struct sk_buff *skb, 38 - data_exchange_cb_t cb, void *cb_context); 39 - int (*check_presence)(struct nfc_shdlc *shdlc, 40 - struct nfc_target *target); 41 - }; 42 - 43 - enum shdlc_state { 44 - SHDLC_DISCONNECTED = 0, 45 - SHDLC_CONNECTING = 1, 46 - SHDLC_NEGOCIATING = 2, 47 - SHDLC_CONNECTED = 3 48 - }; 49 - 50 - struct nfc_shdlc { 51 - struct mutex state_mutex; 52 - enum shdlc_state state; 53 - int hard_fault; 54 - 55 - struct nfc_hci_dev *hdev; 56 - 57 - wait_queue_head_t *connect_wq; 58 - int connect_tries; 59 - int connect_result; 60 - struct timer_list connect_timer;/* aka T3 in spec 10.6.1 */ 61 - 62 - u8 w; /* window size */ 63 - bool srej_support; 64 - 65 - struct timer_list t1_timer; /* send ack timeout */ 66 - bool t1_active; 67 - 68 - struct timer_list t2_timer; /* guard/retransmit timeout */ 69 - bool t2_active; 70 - 71 - int ns; /* next seq num for send */ 72 - int nr; /* next expected seq num for receive */ 73 - int dnr; /* oldest sent unacked seq num */ 74 - 75 - struct sk_buff_head rcv_q; 76 - 77 - struct sk_buff_head send_q; 78 - bool rnr; /* other side is not ready to receive */ 79 - 80 - struct sk_buff_head ack_pending_q; 81 - 82 - struct work_struct sm_work; 83 - 84 - struct nfc_shdlc_ops *ops; 85 - 86 - int client_headroom; 87 - int client_tailroom; 88 - 89 - void *clientdata; 90 - }; 91 - 92 - void nfc_shdlc_recv_frame(struct nfc_shdlc *shdlc, struct sk_buff *skb); 93 - 94 - struct nfc_shdlc *nfc_shdlc_allocate(struct nfc_shdlc_ops *ops, 95 - struct nfc_hci_init_data *init_data, 96 - u32 protocols, 97 - int tx_headroom, int tx_tailroom, 98 - int max_link_payload, const char *devname); 99 - 100 - void nfc_shdlc_free(struct nfc_shdlc *shdlc); 101 - 102 - void nfc_shdlc_set_clientdata(struct nfc_shdlc *shdlc, void *clientdata); 103 - void *nfc_shdlc_get_clientdata(struct nfc_shdlc *shdlc); 104 - struct nfc_hci_dev *nfc_shdlc_get_hci_dev(struct nfc_shdlc *shdlc); 105 - 106 - #endif /* __NFC_SHDLC_H */
+1 -1
net/nfc/hci/Makefile
··· 5 5 obj-$(CONFIG_NFC_HCI) += hci.o 6 6 7 7 hci-y := core.o hcp.o command.o llc.o llc_nop.o 8 - hci-$(CONFIG_NFC_SHDLC) += shdlc.o llc_shdlc.o 8 + hci-$(CONFIG_NFC_SHDLC) += llc_shdlc.o
+158 -126
net/nfc/hci/core.c
··· 78 78 79 79 pr_debug("msg_tx_queue has a cmd to send\n"); 80 80 while ((skb = skb_dequeue(&msg->msg_frags)) != NULL) { 81 - r = hdev->ops->xmit(hdev, skb); 81 + r = nfc_llc_xmit_from_hci(hdev->llc, skb); 82 82 if (r < 0) { 83 83 kfree_skb(skb); 84 84 skb_queue_purge(&msg->msg_frags); ··· 469 469 return r; 470 470 } 471 471 472 + r = nfc_llc_start(hdev->llc); 473 + if (r < 0) 474 + goto exit_close; 475 + 472 476 r = hci_dev_session_init(hdev); 473 477 if (r < 0) 474 - goto exit; 478 + goto exit_llc; 475 479 476 480 r = nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE, 477 481 NFC_HCI_EVT_END_OPERATION, NULL, 0); 478 482 if (r < 0) 479 - goto exit; 483 + goto exit_llc; 480 484 481 485 if (hdev->ops->hci_ready) { 482 486 r = hdev->ops->hci_ready(hdev); 483 487 if (r < 0) 484 - goto exit; 488 + goto exit_llc; 485 489 } 486 490 487 491 r = hci_dev_version(hdev); 488 492 if (r < 0) 489 - goto exit; 493 + goto exit_llc; 490 494 491 - exit: 492 - if (r < 0) 493 - if (hdev->ops->close) 494 - hdev->ops->close(hdev); 495 + return 0; 496 + 497 + exit_llc: 498 + nfc_llc_stop(hdev->llc); 499 + 500 + exit_close: 501 + if (hdev->ops->close) 502 + hdev->ops->close(hdev); 503 + 495 504 return r; 496 505 } 497 506 498 507 static int hci_dev_down(struct nfc_dev *nfc_dev) 499 508 { 500 509 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); 510 + 511 + nfc_llc_stop(hdev->llc); 501 512 502 513 if (hdev->ops->close) 503 514 hdev->ops->close(hdev); ··· 631 620 return 0; 632 621 } 633 622 634 - static struct nfc_ops hci_nfc_ops = { 635 - .dev_up = hci_dev_up, 636 - .dev_down = hci_dev_down, 637 - .start_poll = hci_start_poll, 638 - .stop_poll = hci_stop_poll, 639 - .activate_target = hci_activate_target, 640 - .deactivate_target = hci_deactivate_target, 641 - .im_transceive = hci_transceive, 642 - .check_presence = hci_check_presence, 643 - }; 644 - 645 - struct nfc_hci_dev *nfc_hci_allocate_device(struct nfc_hci_ops *ops, 646 - struct nfc_hci_init_data *init_data, 647 - u32 protocols, 648 - int tx_headroom, 649 - int tx_tailroom, 650 - int max_link_payload) 651 - { 652 - struct nfc_hci_dev *hdev; 653 - 654 - if (ops->xmit == NULL) 655 - return NULL; 656 - 657 - if (protocols == 0) 658 - return NULL; 659 - 660 - hdev = kzalloc(sizeof(struct nfc_hci_dev), GFP_KERNEL); 661 - if (hdev == NULL) 662 - return NULL; 663 - 664 - hdev->ndev = nfc_allocate_device(&hci_nfc_ops, protocols, 665 - tx_headroom + HCI_CMDS_HEADROOM, 666 - tx_tailroom); 667 - if (!hdev->ndev) { 668 - kfree(hdev); 669 - return NULL; 670 - } 671 - 672 - hdev->ops = ops; 673 - hdev->max_data_link_payload = max_link_payload; 674 - hdev->init_data = *init_data; 675 - 676 - nfc_set_drvdata(hdev->ndev, hdev); 677 - 678 - memset(hdev->gate2pipe, NFC_HCI_INVALID_PIPE, sizeof(hdev->gate2pipe)); 679 - 680 - return hdev; 681 - } 682 - EXPORT_SYMBOL(nfc_hci_allocate_device); 683 - 684 - void nfc_hci_free_device(struct nfc_hci_dev *hdev) 685 - { 686 - nfc_free_device(hdev->ndev); 687 - kfree(hdev); 688 - } 689 - EXPORT_SYMBOL(nfc_hci_free_device); 690 - 691 - int nfc_hci_register_device(struct nfc_hci_dev *hdev) 692 - { 693 - mutex_init(&hdev->msg_tx_mutex); 694 - 695 - INIT_LIST_HEAD(&hdev->msg_tx_queue); 696 - 697 - INIT_WORK(&hdev->msg_tx_work, nfc_hci_msg_tx_work); 698 - 699 - init_timer(&hdev->cmd_timer); 700 - hdev->cmd_timer.data = (unsigned long)hdev; 701 - hdev->cmd_timer.function = nfc_hci_cmd_timeout; 702 - 703 - skb_queue_head_init(&hdev->rx_hcp_frags); 704 - 705 - INIT_WORK(&hdev->msg_rx_work, nfc_hci_msg_rx_work); 706 - 707 - skb_queue_head_init(&hdev->msg_rx_queue); 708 - 709 - return nfc_register_device(hdev->ndev); 710 - } 711 - EXPORT_SYMBOL(nfc_hci_register_device); 712 - 713 - void nfc_hci_unregister_device(struct nfc_hci_dev *hdev) 714 - { 715 - struct hci_msg *msg, *n; 716 - 717 - skb_queue_purge(&hdev->rx_hcp_frags); 718 - skb_queue_purge(&hdev->msg_rx_queue); 719 - 720 - list_for_each_entry_safe(msg, n, &hdev->msg_tx_queue, msg_l) { 721 - list_del(&msg->msg_l); 722 - skb_queue_purge(&msg->msg_frags); 723 - kfree(msg); 724 - } 725 - 726 - del_timer_sync(&hdev->cmd_timer); 727 - 728 - nfc_unregister_device(hdev->ndev); 729 - 730 - cancel_work_sync(&hdev->msg_tx_work); 731 - cancel_work_sync(&hdev->msg_rx_work); 732 - } 733 - EXPORT_SYMBOL(nfc_hci_unregister_device); 734 - 735 - void nfc_hci_set_clientdata(struct nfc_hci_dev *hdev, void *clientdata) 736 - { 737 - hdev->clientdata = clientdata; 738 - } 739 - EXPORT_SYMBOL(nfc_hci_set_clientdata); 740 - 741 - void *nfc_hci_get_clientdata(struct nfc_hci_dev *hdev) 742 - { 743 - return hdev->clientdata; 744 - } 745 - EXPORT_SYMBOL(nfc_hci_get_clientdata); 746 - 747 623 static void nfc_hci_failure(struct nfc_hci_dev *hdev, int err) 748 624 { 749 625 mutex_lock(&hdev->msg_tx_mutex); ··· 646 748 mutex_unlock(&hdev->msg_tx_mutex); 647 749 } 648 750 649 - void nfc_hci_driver_failure(struct nfc_hci_dev *hdev, int err) 751 + static void nfc_hci_llc_failure(struct nfc_hci_dev *hdev, int err) 650 752 { 651 753 nfc_hci_failure(hdev, err); 652 754 } 653 - EXPORT_SYMBOL(nfc_hci_driver_failure); 654 755 655 - void nfc_hci_recv_frame(struct nfc_hci_dev *hdev, struct sk_buff *skb) 756 + static void nfc_hci_recv_from_llc(struct nfc_hci_dev *hdev, struct sk_buff *skb) 656 757 { 657 758 struct hcp_packet *packet; 658 759 u8 type; ··· 717 820 queue_work(system_nrt_wq, &hdev->msg_rx_work); 718 821 } 719 822 } 823 + 824 + static struct nfc_ops hci_nfc_ops = { 825 + .dev_up = hci_dev_up, 826 + .dev_down = hci_dev_down, 827 + .start_poll = hci_start_poll, 828 + .stop_poll = hci_stop_poll, 829 + .activate_target = hci_activate_target, 830 + .deactivate_target = hci_deactivate_target, 831 + .im_transceive = hci_transceive, 832 + .check_presence = hci_check_presence, 833 + }; 834 + 835 + struct nfc_hci_dev *nfc_hci_allocate_device(struct nfc_hci_ops *ops, 836 + struct nfc_hci_init_data *init_data, 837 + u32 protocols, 838 + const char *llc_name, 839 + int tx_headroom, 840 + int tx_tailroom, 841 + int max_link_payload) 842 + { 843 + struct nfc_hci_dev *hdev; 844 + 845 + if (ops->xmit == NULL) 846 + return NULL; 847 + 848 + if (protocols == 0) 849 + return NULL; 850 + 851 + hdev = kzalloc(sizeof(struct nfc_hci_dev), GFP_KERNEL); 852 + if (hdev == NULL) 853 + return NULL; 854 + 855 + hdev->llc = nfc_llc_allocate(llc_name, hdev, ops->xmit, 856 + nfc_hci_recv_from_llc, tx_headroom, 857 + tx_tailroom, nfc_hci_llc_failure); 858 + if (hdev->llc == NULL) { 859 + kfree(hdev); 860 + return NULL; 861 + } 862 + 863 + hdev->ndev = nfc_allocate_device(&hci_nfc_ops, protocols, 864 + tx_headroom + HCI_CMDS_HEADROOM, 865 + tx_tailroom); 866 + if (!hdev->ndev) { 867 + nfc_llc_free(hdev->llc); 868 + kfree(hdev); 869 + return NULL; 870 + } 871 + 872 + hdev->ops = ops; 873 + hdev->max_data_link_payload = max_link_payload; 874 + hdev->init_data = *init_data; 875 + 876 + nfc_set_drvdata(hdev->ndev, hdev); 877 + 878 + memset(hdev->gate2pipe, NFC_HCI_INVALID_PIPE, sizeof(hdev->gate2pipe)); 879 + 880 + return hdev; 881 + } 882 + EXPORT_SYMBOL(nfc_hci_allocate_device); 883 + 884 + void nfc_hci_free_device(struct nfc_hci_dev *hdev) 885 + { 886 + nfc_free_device(hdev->ndev); 887 + nfc_llc_free(hdev->llc); 888 + kfree(hdev); 889 + } 890 + EXPORT_SYMBOL(nfc_hci_free_device); 891 + 892 + int nfc_hci_register_device(struct nfc_hci_dev *hdev) 893 + { 894 + mutex_init(&hdev->msg_tx_mutex); 895 + 896 + INIT_LIST_HEAD(&hdev->msg_tx_queue); 897 + 898 + INIT_WORK(&hdev->msg_tx_work, nfc_hci_msg_tx_work); 899 + 900 + init_timer(&hdev->cmd_timer); 901 + hdev->cmd_timer.data = (unsigned long)hdev; 902 + hdev->cmd_timer.function = nfc_hci_cmd_timeout; 903 + 904 + skb_queue_head_init(&hdev->rx_hcp_frags); 905 + 906 + INIT_WORK(&hdev->msg_rx_work, nfc_hci_msg_rx_work); 907 + 908 + skb_queue_head_init(&hdev->msg_rx_queue); 909 + 910 + return nfc_register_device(hdev->ndev); 911 + } 912 + EXPORT_SYMBOL(nfc_hci_register_device); 913 + 914 + void nfc_hci_unregister_device(struct nfc_hci_dev *hdev) 915 + { 916 + struct hci_msg *msg, *n; 917 + 918 + skb_queue_purge(&hdev->rx_hcp_frags); 919 + skb_queue_purge(&hdev->msg_rx_queue); 920 + 921 + list_for_each_entry_safe(msg, n, &hdev->msg_tx_queue, msg_l) { 922 + list_del(&msg->msg_l); 923 + skb_queue_purge(&msg->msg_frags); 924 + kfree(msg); 925 + } 926 + 927 + del_timer_sync(&hdev->cmd_timer); 928 + 929 + nfc_unregister_device(hdev->ndev); 930 + 931 + cancel_work_sync(&hdev->msg_tx_work); 932 + cancel_work_sync(&hdev->msg_rx_work); 933 + } 934 + EXPORT_SYMBOL(nfc_hci_unregister_device); 935 + 936 + void nfc_hci_set_clientdata(struct nfc_hci_dev *hdev, void *clientdata) 937 + { 938 + hdev->clientdata = clientdata; 939 + } 940 + EXPORT_SYMBOL(nfc_hci_set_clientdata); 941 + 942 + void *nfc_hci_get_clientdata(struct nfc_hci_dev *hdev) 943 + { 944 + return hdev->clientdata; 945 + } 946 + EXPORT_SYMBOL(nfc_hci_get_clientdata); 947 + 948 + void nfc_hci_driver_failure(struct nfc_hci_dev *hdev, int err) 949 + { 950 + nfc_hci_failure(hdev, err); 951 + } 952 + EXPORT_SYMBOL(nfc_hci_driver_failure); 953 + 954 + void inline nfc_hci_recv_frame(struct nfc_hci_dev *hdev, struct sk_buff *skb) 955 + { 956 + nfc_llc_rcv_from_drv(hdev->llc, skb); 957 + } 720 958 EXPORT_SYMBOL(nfc_hci_recv_frame); 721 959 722 960 static int __init nfc_hci_init(void) ··· 864 832 nfc_llc_exit(); 865 833 } 866 834 867 - module_init(nfc_hci_init); 835 + subsys_initcall(nfc_hci_init); 868 836 module_exit(nfc_hci_exit); 869 837 870 838 MODULE_LICENSE("GPL");
+1 -1
net/nfc/hci/llc_shdlc.c
··· 535 535 536 536 pr_debug("Sending I-Frame %d, waiting to rcv %d\n", shdlc->ns, 537 537 shdlc->nr); 538 - /* SHDLC_DUMP_SKB("shdlc frame written", skb); */ 538 + SHDLC_DUMP_SKB("shdlc frame written", skb); 539 539 540 540 r = shdlc->xmit_to_drv(shdlc->hdev, skb); 541 541 if (r < 0) {
-918
net/nfc/hci/shdlc.c
··· 1 - /* 2 - * Copyright (C) 2012 Intel Corporation. All rights reserved. 3 - * 4 - * This program is free software; you can redistribute it and/or modify 5 - * it under the terms of the GNU General Public License as published by 6 - * the Free Software Foundation; either version 2 of the License, or 7 - * (at your option) any later version. 8 - * 9 - * This program is distributed in the hope that it will be useful, 10 - * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 - * GNU General Public License for more details. 13 - * 14 - * You should have received a copy of the GNU General Public License 15 - * along with this program; if not, write to the 16 - * Free Software Foundation, Inc., 17 - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 - */ 19 - 20 - #define pr_fmt(fmt) "shdlc: %s: " fmt, __func__ 21 - 22 - #include <linux/sched.h> 23 - #include <linux/export.h> 24 - #include <linux/wait.h> 25 - #include <linux/slab.h> 26 - #include <linux/skbuff.h> 27 - 28 - #include <net/nfc/hci.h> 29 - #include <net/nfc/shdlc.h> 30 - 31 - #define SHDLC_LLC_HEAD_ROOM 2 32 - 33 - #define SHDLC_MAX_WINDOW 4 34 - #define SHDLC_SREJ_SUPPORT false 35 - 36 - #define SHDLC_CONTROL_HEAD_MASK 0xe0 37 - #define SHDLC_CONTROL_HEAD_I 0x80 38 - #define SHDLC_CONTROL_HEAD_I2 0xa0 39 - #define SHDLC_CONTROL_HEAD_S 0xc0 40 - #define SHDLC_CONTROL_HEAD_U 0xe0 41 - 42 - #define SHDLC_CONTROL_NS_MASK 0x38 43 - #define SHDLC_CONTROL_NR_MASK 0x07 44 - #define SHDLC_CONTROL_TYPE_MASK 0x18 45 - 46 - #define SHDLC_CONTROL_M_MASK 0x1f 47 - 48 - enum sframe_type { 49 - S_FRAME_RR = 0x00, 50 - S_FRAME_REJ = 0x01, 51 - S_FRAME_RNR = 0x02, 52 - S_FRAME_SREJ = 0x03 53 - }; 54 - 55 - enum uframe_modifier { 56 - U_FRAME_UA = 0x06, 57 - U_FRAME_RSET = 0x19 58 - }; 59 - 60 - #define SHDLC_CONNECT_VALUE_MS 5 61 - #define SHDLC_T1_VALUE_MS(w) ((5 * w) / 4) 62 - #define SHDLC_T2_VALUE_MS 300 63 - 64 - #define SHDLC_DUMP_SKB(info, skb) \ 65 - do { \ 66 - pr_debug("%s:\n", info); \ 67 - print_hex_dump(KERN_DEBUG, "shdlc: ", DUMP_PREFIX_OFFSET, \ 68 - 16, 1, skb->data, skb->len, 0); \ 69 - } while (0) 70 - 71 - /* checks x < y <= z modulo 8 */ 72 - static bool nfc_shdlc_x_lt_y_lteq_z(int x, int y, int z) 73 - { 74 - if (x < z) 75 - return ((x < y) && (y <= z)) ? true : false; 76 - else 77 - return ((y > x) || (y <= z)) ? true : false; 78 - } 79 - 80 - /* checks x <= y < z modulo 8 */ 81 - static bool nfc_shdlc_x_lteq_y_lt_z(int x, int y, int z) 82 - { 83 - if (x <= z) 84 - return ((x <= y) && (y < z)) ? true : false; 85 - else /* x > z -> z+8 > x */ 86 - return ((y >= x) || (y < z)) ? true : false; 87 - } 88 - 89 - static struct sk_buff *nfc_shdlc_alloc_skb(struct nfc_shdlc *shdlc, 90 - int payload_len) 91 - { 92 - struct sk_buff *skb; 93 - 94 - skb = alloc_skb(shdlc->client_headroom + SHDLC_LLC_HEAD_ROOM + 95 - shdlc->client_tailroom + payload_len, GFP_KERNEL); 96 - if (skb) 97 - skb_reserve(skb, shdlc->client_headroom + SHDLC_LLC_HEAD_ROOM); 98 - 99 - return skb; 100 - } 101 - 102 - /* immediately sends an S frame. */ 103 - static int nfc_shdlc_send_s_frame(struct nfc_shdlc *shdlc, 104 - enum sframe_type sframe_type, int nr) 105 - { 106 - int r; 107 - struct sk_buff *skb; 108 - 109 - pr_debug("sframe_type=%d nr=%d\n", sframe_type, nr); 110 - 111 - skb = nfc_shdlc_alloc_skb(shdlc, 0); 112 - if (skb == NULL) 113 - return -ENOMEM; 114 - 115 - *skb_push(skb, 1) = SHDLC_CONTROL_HEAD_S | (sframe_type << 3) | nr; 116 - 117 - r = shdlc->ops->xmit(shdlc, skb); 118 - 119 - kfree_skb(skb); 120 - 121 - return r; 122 - } 123 - 124 - /* immediately sends an U frame. skb may contain optional payload */ 125 - static int nfc_shdlc_send_u_frame(struct nfc_shdlc *shdlc, 126 - struct sk_buff *skb, 127 - enum uframe_modifier uframe_modifier) 128 - { 129 - int r; 130 - 131 - pr_debug("uframe_modifier=%d\n", uframe_modifier); 132 - 133 - *skb_push(skb, 1) = SHDLC_CONTROL_HEAD_U | uframe_modifier; 134 - 135 - r = shdlc->ops->xmit(shdlc, skb); 136 - 137 - kfree_skb(skb); 138 - 139 - return r; 140 - } 141 - 142 - /* 143 - * Free ack_pending frames until y_nr - 1, and reset t2 according to 144 - * the remaining oldest ack_pending frame sent time 145 - */ 146 - static void nfc_shdlc_reset_t2(struct nfc_shdlc *shdlc, int y_nr) 147 - { 148 - struct sk_buff *skb; 149 - int dnr = shdlc->dnr; /* MUST initially be < y_nr */ 150 - 151 - pr_debug("release ack pending up to frame %d excluded\n", y_nr); 152 - 153 - while (dnr != y_nr) { 154 - pr_debug("release ack pending frame %d\n", dnr); 155 - 156 - skb = skb_dequeue(&shdlc->ack_pending_q); 157 - kfree_skb(skb); 158 - 159 - dnr = (dnr + 1) % 8; 160 - } 161 - 162 - if (skb_queue_empty(&shdlc->ack_pending_q)) { 163 - if (shdlc->t2_active) { 164 - del_timer_sync(&shdlc->t2_timer); 165 - shdlc->t2_active = false; 166 - 167 - pr_debug 168 - ("All sent frames acked. Stopped T2(retransmit)\n"); 169 - } 170 - } else { 171 - skb = skb_peek(&shdlc->ack_pending_q); 172 - 173 - mod_timer(&shdlc->t2_timer, *(unsigned long *)skb->cb + 174 - msecs_to_jiffies(SHDLC_T2_VALUE_MS)); 175 - shdlc->t2_active = true; 176 - 177 - pr_debug 178 - ("Start T2(retransmit) for remaining unacked sent frames\n"); 179 - } 180 - } 181 - 182 - /* 183 - * Receive validated frames from lower layer. skb contains HCI payload only. 184 - * Handle according to algorithm at spec:10.8.2 185 - */ 186 - static void nfc_shdlc_rcv_i_frame(struct nfc_shdlc *shdlc, 187 - struct sk_buff *skb, int ns, int nr) 188 - { 189 - int x_ns = ns; 190 - int y_nr = nr; 191 - 192 - pr_debug("recvd I-frame %d, remote waiting frame %d\n", ns, nr); 193 - 194 - if (shdlc->state != SHDLC_CONNECTED) 195 - goto exit; 196 - 197 - if (x_ns != shdlc->nr) { 198 - nfc_shdlc_send_s_frame(shdlc, S_FRAME_REJ, shdlc->nr); 199 - goto exit; 200 - } 201 - 202 - if (shdlc->t1_active == false) { 203 - shdlc->t1_active = true; 204 - mod_timer(&shdlc->t1_timer, 205 - msecs_to_jiffies(SHDLC_T1_VALUE_MS(shdlc->w))); 206 - pr_debug("(re)Start T1(send ack)\n"); 207 - } 208 - 209 - if (skb->len) { 210 - nfc_hci_recv_frame(shdlc->hdev, skb); 211 - skb = NULL; 212 - } 213 - 214 - shdlc->nr = (shdlc->nr + 1) % 8; 215 - 216 - if (nfc_shdlc_x_lt_y_lteq_z(shdlc->dnr, y_nr, shdlc->ns)) { 217 - nfc_shdlc_reset_t2(shdlc, y_nr); 218 - 219 - shdlc->dnr = y_nr; 220 - } 221 - 222 - exit: 223 - kfree_skb(skb); 224 - } 225 - 226 - static void nfc_shdlc_rcv_ack(struct nfc_shdlc *shdlc, int y_nr) 227 - { 228 - pr_debug("remote acked up to frame %d excluded\n", y_nr); 229 - 230 - if (nfc_shdlc_x_lt_y_lteq_z(shdlc->dnr, y_nr, shdlc->ns)) { 231 - nfc_shdlc_reset_t2(shdlc, y_nr); 232 - shdlc->dnr = y_nr; 233 - } 234 - } 235 - 236 - static void nfc_shdlc_requeue_ack_pending(struct nfc_shdlc *shdlc) 237 - { 238 - struct sk_buff *skb; 239 - 240 - pr_debug("ns reset to %d\n", shdlc->dnr); 241 - 242 - while ((skb = skb_dequeue_tail(&shdlc->ack_pending_q))) { 243 - skb_pull(skb, 1); /* remove control field */ 244 - skb_queue_head(&shdlc->send_q, skb); 245 - } 246 - shdlc->ns = shdlc->dnr; 247 - } 248 - 249 - static void nfc_shdlc_rcv_rej(struct nfc_shdlc *shdlc, int y_nr) 250 - { 251 - struct sk_buff *skb; 252 - 253 - pr_debug("remote asks retransmition from frame %d\n", y_nr); 254 - 255 - if (nfc_shdlc_x_lteq_y_lt_z(shdlc->dnr, y_nr, shdlc->ns)) { 256 - if (shdlc->t2_active) { 257 - del_timer_sync(&shdlc->t2_timer); 258 - shdlc->t2_active = false; 259 - pr_debug("Stopped T2(retransmit)\n"); 260 - } 261 - 262 - if (shdlc->dnr != y_nr) { 263 - while ((shdlc->dnr = ((shdlc->dnr + 1) % 8)) != y_nr) { 264 - skb = skb_dequeue(&shdlc->ack_pending_q); 265 - kfree_skb(skb); 266 - } 267 - } 268 - 269 - nfc_shdlc_requeue_ack_pending(shdlc); 270 - } 271 - } 272 - 273 - /* See spec RR:10.8.3 REJ:10.8.4 */ 274 - static void nfc_shdlc_rcv_s_frame(struct nfc_shdlc *shdlc, 275 - enum sframe_type s_frame_type, int nr) 276 - { 277 - struct sk_buff *skb; 278 - 279 - if (shdlc->state != SHDLC_CONNECTED) 280 - return; 281 - 282 - switch (s_frame_type) { 283 - case S_FRAME_RR: 284 - nfc_shdlc_rcv_ack(shdlc, nr); 285 - if (shdlc->rnr == true) { /* see SHDLC 10.7.7 */ 286 - shdlc->rnr = false; 287 - if (shdlc->send_q.qlen == 0) { 288 - skb = nfc_shdlc_alloc_skb(shdlc, 0); 289 - if (skb) 290 - skb_queue_tail(&shdlc->send_q, skb); 291 - } 292 - } 293 - break; 294 - case S_FRAME_REJ: 295 - nfc_shdlc_rcv_rej(shdlc, nr); 296 - break; 297 - case S_FRAME_RNR: 298 - nfc_shdlc_rcv_ack(shdlc, nr); 299 - shdlc->rnr = true; 300 - break; 301 - default: 302 - break; 303 - } 304 - } 305 - 306 - static void nfc_shdlc_connect_complete(struct nfc_shdlc *shdlc, int r) 307 - { 308 - pr_debug("result=%d\n", r); 309 - 310 - del_timer_sync(&shdlc->connect_timer); 311 - 312 - if (r == 0) { 313 - shdlc->ns = 0; 314 - shdlc->nr = 0; 315 - shdlc->dnr = 0; 316 - 317 - shdlc->state = SHDLC_CONNECTED; 318 - } else { 319 - shdlc->state = SHDLC_DISCONNECTED; 320 - } 321 - 322 - shdlc->connect_result = r; 323 - 324 - wake_up(shdlc->connect_wq); 325 - } 326 - 327 - static int nfc_shdlc_connect_initiate(struct nfc_shdlc *shdlc) 328 - { 329 - struct sk_buff *skb; 330 - 331 - pr_debug("\n"); 332 - 333 - skb = nfc_shdlc_alloc_skb(shdlc, 2); 334 - if (skb == NULL) 335 - return -ENOMEM; 336 - 337 - *skb_put(skb, 1) = SHDLC_MAX_WINDOW; 338 - *skb_put(skb, 1) = SHDLC_SREJ_SUPPORT ? 1 : 0; 339 - 340 - return nfc_shdlc_send_u_frame(shdlc, skb, U_FRAME_RSET); 341 - } 342 - 343 - static int nfc_shdlc_connect_send_ua(struct nfc_shdlc *shdlc) 344 - { 345 - struct sk_buff *skb; 346 - 347 - pr_debug("\n"); 348 - 349 - skb = nfc_shdlc_alloc_skb(shdlc, 0); 350 - if (skb == NULL) 351 - return -ENOMEM; 352 - 353 - return nfc_shdlc_send_u_frame(shdlc, skb, U_FRAME_UA); 354 - } 355 - 356 - static void nfc_shdlc_rcv_u_frame(struct nfc_shdlc *shdlc, 357 - struct sk_buff *skb, 358 - enum uframe_modifier u_frame_modifier) 359 - { 360 - u8 w = SHDLC_MAX_WINDOW; 361 - bool srej_support = SHDLC_SREJ_SUPPORT; 362 - int r; 363 - 364 - pr_debug("u_frame_modifier=%d\n", u_frame_modifier); 365 - 366 - switch (u_frame_modifier) { 367 - case U_FRAME_RSET: 368 - if (shdlc->state == SHDLC_NEGOCIATING) { 369 - /* we sent RSET, but chip wants to negociate */ 370 - if (skb->len > 0) 371 - w = skb->data[0]; 372 - 373 - if (skb->len > 1) 374 - srej_support = skb->data[1] & 0x01 ? true : 375 - false; 376 - 377 - if ((w <= SHDLC_MAX_WINDOW) && 378 - (SHDLC_SREJ_SUPPORT || (srej_support == false))) { 379 - shdlc->w = w; 380 - shdlc->srej_support = srej_support; 381 - r = nfc_shdlc_connect_send_ua(shdlc); 382 - nfc_shdlc_connect_complete(shdlc, r); 383 - } 384 - } else if (shdlc->state == SHDLC_CONNECTED) { 385 - /* 386 - * Chip wants to reset link. This is unexpected and 387 - * unsupported. 388 - */ 389 - shdlc->hard_fault = -ECONNRESET; 390 - } 391 - break; 392 - case U_FRAME_UA: 393 - if ((shdlc->state == SHDLC_CONNECTING && 394 - shdlc->connect_tries > 0) || 395 - (shdlc->state == SHDLC_NEGOCIATING)) 396 - nfc_shdlc_connect_complete(shdlc, 0); 397 - break; 398 - default: 399 - break; 400 - } 401 - 402 - kfree_skb(skb); 403 - } 404 - 405 - static void nfc_shdlc_handle_rcv_queue(struct nfc_shdlc *shdlc) 406 - { 407 - struct sk_buff *skb; 408 - u8 control; 409 - int nr; 410 - int ns; 411 - enum sframe_type s_frame_type; 412 - enum uframe_modifier u_frame_modifier; 413 - 414 - if (shdlc->rcv_q.qlen) 415 - pr_debug("rcvQlen=%d\n", shdlc->rcv_q.qlen); 416 - 417 - while ((skb = skb_dequeue(&shdlc->rcv_q)) != NULL) { 418 - control = skb->data[0]; 419 - skb_pull(skb, 1); 420 - switch (control & SHDLC_CONTROL_HEAD_MASK) { 421 - case SHDLC_CONTROL_HEAD_I: 422 - case SHDLC_CONTROL_HEAD_I2: 423 - ns = (control & SHDLC_CONTROL_NS_MASK) >> 3; 424 - nr = control & SHDLC_CONTROL_NR_MASK; 425 - nfc_shdlc_rcv_i_frame(shdlc, skb, ns, nr); 426 - break; 427 - case SHDLC_CONTROL_HEAD_S: 428 - s_frame_type = (control & SHDLC_CONTROL_TYPE_MASK) >> 3; 429 - nr = control & SHDLC_CONTROL_NR_MASK; 430 - nfc_shdlc_rcv_s_frame(shdlc, s_frame_type, nr); 431 - kfree_skb(skb); 432 - break; 433 - case SHDLC_CONTROL_HEAD_U: 434 - u_frame_modifier = control & SHDLC_CONTROL_M_MASK; 435 - nfc_shdlc_rcv_u_frame(shdlc, skb, u_frame_modifier); 436 - break; 437 - default: 438 - pr_err("UNKNOWN Control=%d\n", control); 439 - kfree_skb(skb); 440 - break; 441 - } 442 - } 443 - } 444 - 445 - static int nfc_shdlc_w_used(int ns, int dnr) 446 - { 447 - int unack_count; 448 - 449 - if (dnr <= ns) 450 - unack_count = ns - dnr; 451 - else 452 - unack_count = 8 - dnr + ns; 453 - 454 - return unack_count; 455 - } 456 - 457 - /* Send frames according to algorithm at spec:10.8.1 */ 458 - static void nfc_shdlc_handle_send_queue(struct nfc_shdlc *shdlc) 459 - { 460 - struct sk_buff *skb; 461 - int r; 462 - unsigned long time_sent; 463 - 464 - if (shdlc->send_q.qlen) 465 - pr_debug 466 - ("sendQlen=%d ns=%d dnr=%d rnr=%s w_room=%d unackQlen=%d\n", 467 - shdlc->send_q.qlen, shdlc->ns, shdlc->dnr, 468 - shdlc->rnr == false ? "false" : "true", 469 - shdlc->w - nfc_shdlc_w_used(shdlc->ns, shdlc->dnr), 470 - shdlc->ack_pending_q.qlen); 471 - 472 - while (shdlc->send_q.qlen && shdlc->ack_pending_q.qlen < shdlc->w && 473 - (shdlc->rnr == false)) { 474 - 475 - if (shdlc->t1_active) { 476 - del_timer_sync(&shdlc->t1_timer); 477 - shdlc->t1_active = false; 478 - pr_debug("Stopped T1(send ack)\n"); 479 - } 480 - 481 - skb = skb_dequeue(&shdlc->send_q); 482 - 483 - *skb_push(skb, 1) = SHDLC_CONTROL_HEAD_I | (shdlc->ns << 3) | 484 - shdlc->nr; 485 - 486 - pr_debug("Sending I-Frame %d, waiting to rcv %d\n", shdlc->ns, 487 - shdlc->nr); 488 - /* SHDLC_DUMP_SKB("shdlc frame written", skb); */ 489 - 490 - r = shdlc->ops->xmit(shdlc, skb); 491 - if (r < 0) { 492 - shdlc->hard_fault = r; 493 - break; 494 - } 495 - 496 - shdlc->ns = (shdlc->ns + 1) % 8; 497 - 498 - time_sent = jiffies; 499 - *(unsigned long *)skb->cb = time_sent; 500 - 501 - skb_queue_tail(&shdlc->ack_pending_q, skb); 502 - 503 - if (shdlc->t2_active == false) { 504 - shdlc->t2_active = true; 505 - mod_timer(&shdlc->t2_timer, time_sent + 506 - msecs_to_jiffies(SHDLC_T2_VALUE_MS)); 507 - pr_debug("Started T2 (retransmit)\n"); 508 - } 509 - } 510 - } 511 - 512 - static void nfc_shdlc_connect_timeout(unsigned long data) 513 - { 514 - struct nfc_shdlc *shdlc = (struct nfc_shdlc *)data; 515 - 516 - pr_debug("\n"); 517 - 518 - queue_work(system_nrt_wq, &shdlc->sm_work); 519 - } 520 - 521 - static void nfc_shdlc_t1_timeout(unsigned long data) 522 - { 523 - struct nfc_shdlc *shdlc = (struct nfc_shdlc *)data; 524 - 525 - pr_debug("SoftIRQ: need to send ack\n"); 526 - 527 - queue_work(system_nrt_wq, &shdlc->sm_work); 528 - } 529 - 530 - static void nfc_shdlc_t2_timeout(unsigned long data) 531 - { 532 - struct nfc_shdlc *shdlc = (struct nfc_shdlc *)data; 533 - 534 - pr_debug("SoftIRQ: need to retransmit\n"); 535 - 536 - queue_work(system_nrt_wq, &shdlc->sm_work); 537 - } 538 - 539 - static void nfc_shdlc_sm_work(struct work_struct *work) 540 - { 541 - struct nfc_shdlc *shdlc = container_of(work, struct nfc_shdlc, sm_work); 542 - int r; 543 - 544 - pr_debug("\n"); 545 - 546 - mutex_lock(&shdlc->state_mutex); 547 - 548 - switch (shdlc->state) { 549 - case SHDLC_DISCONNECTED: 550 - skb_queue_purge(&shdlc->rcv_q); 551 - skb_queue_purge(&shdlc->send_q); 552 - skb_queue_purge(&shdlc->ack_pending_q); 553 - break; 554 - case SHDLC_CONNECTING: 555 - if (shdlc->hard_fault) { 556 - nfc_shdlc_connect_complete(shdlc, shdlc->hard_fault); 557 - break; 558 - } 559 - 560 - if (shdlc->connect_tries++ < 5) 561 - r = nfc_shdlc_connect_initiate(shdlc); 562 - else 563 - r = -ETIME; 564 - if (r < 0) 565 - nfc_shdlc_connect_complete(shdlc, r); 566 - else { 567 - mod_timer(&shdlc->connect_timer, jiffies + 568 - msecs_to_jiffies(SHDLC_CONNECT_VALUE_MS)); 569 - 570 - shdlc->state = SHDLC_NEGOCIATING; 571 - } 572 - break; 573 - case SHDLC_NEGOCIATING: 574 - if (timer_pending(&shdlc->connect_timer) == 0) { 575 - shdlc->state = SHDLC_CONNECTING; 576 - queue_work(system_nrt_wq, &shdlc->sm_work); 577 - } 578 - 579 - nfc_shdlc_handle_rcv_queue(shdlc); 580 - 581 - if (shdlc->hard_fault) { 582 - nfc_shdlc_connect_complete(shdlc, shdlc->hard_fault); 583 - break; 584 - } 585 - break; 586 - case SHDLC_CONNECTED: 587 - nfc_shdlc_handle_rcv_queue(shdlc); 588 - nfc_shdlc_handle_send_queue(shdlc); 589 - 590 - if (shdlc->t1_active && timer_pending(&shdlc->t1_timer) == 0) { 591 - pr_debug 592 - ("Handle T1(send ack) elapsed (T1 now inactive)\n"); 593 - 594 - shdlc->t1_active = false; 595 - r = nfc_shdlc_send_s_frame(shdlc, S_FRAME_RR, 596 - shdlc->nr); 597 - if (r < 0) 598 - shdlc->hard_fault = r; 599 - } 600 - 601 - if (shdlc->t2_active && timer_pending(&shdlc->t2_timer) == 0) { 602 - pr_debug 603 - ("Handle T2(retransmit) elapsed (T2 inactive)\n"); 604 - 605 - shdlc->t2_active = false; 606 - 607 - nfc_shdlc_requeue_ack_pending(shdlc); 608 - nfc_shdlc_handle_send_queue(shdlc); 609 - } 610 - 611 - if (shdlc->hard_fault) { 612 - nfc_hci_driver_failure(shdlc->hdev, shdlc->hard_fault); 613 - } 614 - break; 615 - default: 616 - break; 617 - } 618 - mutex_unlock(&shdlc->state_mutex); 619 - } 620 - 621 - /* 622 - * Called from syscall context to establish shdlc link. Sleeps until 623 - * link is ready or failure. 624 - */ 625 - static int nfc_shdlc_connect(struct nfc_shdlc *shdlc) 626 - { 627 - DECLARE_WAIT_QUEUE_HEAD_ONSTACK(connect_wq); 628 - 629 - pr_debug("\n"); 630 - 631 - mutex_lock(&shdlc->state_mutex); 632 - 633 - shdlc->state = SHDLC_CONNECTING; 634 - shdlc->connect_wq = &connect_wq; 635 - shdlc->connect_tries = 0; 636 - shdlc->connect_result = 1; 637 - 638 - mutex_unlock(&shdlc->state_mutex); 639 - 640 - queue_work(system_nrt_wq, &shdlc->sm_work); 641 - 642 - wait_event(connect_wq, shdlc->connect_result != 1); 643 - 644 - return shdlc->connect_result; 645 - } 646 - 647 - static void nfc_shdlc_disconnect(struct nfc_shdlc *shdlc) 648 - { 649 - pr_debug("\n"); 650 - 651 - mutex_lock(&shdlc->state_mutex); 652 - 653 - shdlc->state = SHDLC_DISCONNECTED; 654 - 655 - mutex_unlock(&shdlc->state_mutex); 656 - 657 - queue_work(system_nrt_wq, &shdlc->sm_work); 658 - } 659 - 660 - /* 661 - * Receive an incoming shdlc frame. Frame has already been crc-validated. 662 - * skb contains only LLC header and payload. 663 - * If skb == NULL, it is a notification that the link below is dead. 664 - */ 665 - void nfc_shdlc_recv_frame(struct nfc_shdlc *shdlc, struct sk_buff *skb) 666 - { 667 - if (skb == NULL) { 668 - pr_err("NULL Frame -> link is dead\n"); 669 - shdlc->hard_fault = -EREMOTEIO; 670 - } else { 671 - SHDLC_DUMP_SKB("incoming frame", skb); 672 - skb_queue_tail(&shdlc->rcv_q, skb); 673 - } 674 - 675 - queue_work(system_nrt_wq, &shdlc->sm_work); 676 - } 677 - EXPORT_SYMBOL(nfc_shdlc_recv_frame); 678 - 679 - static int nfc_shdlc_open(struct nfc_hci_dev *hdev) 680 - { 681 - struct nfc_shdlc *shdlc = nfc_hci_get_clientdata(hdev); 682 - int r; 683 - 684 - pr_debug("\n"); 685 - 686 - if (shdlc->ops->open) { 687 - r = shdlc->ops->open(shdlc); 688 - if (r < 0) 689 - return r; 690 - } 691 - 692 - r = nfc_shdlc_connect(shdlc); 693 - if (r < 0 && shdlc->ops->close) 694 - shdlc->ops->close(shdlc); 695 - 696 - return r; 697 - } 698 - 699 - static void nfc_shdlc_close(struct nfc_hci_dev *hdev) 700 - { 701 - struct nfc_shdlc *shdlc = nfc_hci_get_clientdata(hdev); 702 - 703 - pr_debug("\n"); 704 - 705 - nfc_shdlc_disconnect(shdlc); 706 - 707 - if (shdlc->ops->close) 708 - shdlc->ops->close(shdlc); 709 - } 710 - 711 - static int nfc_shdlc_hci_ready(struct nfc_hci_dev *hdev) 712 - { 713 - struct nfc_shdlc *shdlc = nfc_hci_get_clientdata(hdev); 714 - int r = 0; 715 - 716 - pr_debug("\n"); 717 - 718 - if (shdlc->ops->hci_ready) 719 - r = shdlc->ops->hci_ready(shdlc); 720 - 721 - return r; 722 - } 723 - 724 - static int nfc_shdlc_xmit(struct nfc_hci_dev *hdev, struct sk_buff *skb) 725 - { 726 - struct nfc_shdlc *shdlc = nfc_hci_get_clientdata(hdev); 727 - 728 - SHDLC_DUMP_SKB("queuing HCP packet to shdlc", skb); 729 - 730 - skb_queue_tail(&shdlc->send_q, skb); 731 - 732 - queue_work(system_nrt_wq, &shdlc->sm_work); 733 - 734 - return 0; 735 - } 736 - 737 - static int nfc_shdlc_start_poll(struct nfc_hci_dev *hdev, 738 - u32 im_protocols, u32 tm_protocols) 739 - { 740 - struct nfc_shdlc *shdlc = nfc_hci_get_clientdata(hdev); 741 - 742 - pr_debug("\n"); 743 - 744 - if (shdlc->ops->start_poll) 745 - return shdlc->ops->start_poll(shdlc, 746 - im_protocols, tm_protocols); 747 - 748 - return 0; 749 - } 750 - 751 - static int nfc_shdlc_target_from_gate(struct nfc_hci_dev *hdev, u8 gate, 752 - struct nfc_target *target) 753 - { 754 - struct nfc_shdlc *shdlc = nfc_hci_get_clientdata(hdev); 755 - 756 - if (shdlc->ops->target_from_gate) 757 - return shdlc->ops->target_from_gate(shdlc, gate, target); 758 - 759 - return -EPERM; 760 - } 761 - 762 - static int nfc_shdlc_complete_target_discovered(struct nfc_hci_dev *hdev, 763 - u8 gate, 764 - struct nfc_target *target) 765 - { 766 - struct nfc_shdlc *shdlc = nfc_hci_get_clientdata(hdev); 767 - 768 - pr_debug("\n"); 769 - 770 - if (shdlc->ops->complete_target_discovered) 771 - return shdlc->ops->complete_target_discovered(shdlc, gate, 772 - target); 773 - 774 - return 0; 775 - } 776 - 777 - static int nfc_shdlc_data_exchange(struct nfc_hci_dev *hdev, 778 - struct nfc_target *target, 779 - struct sk_buff *skb, 780 - data_exchange_cb_t cb, void *cb_context) 781 - { 782 - struct nfc_shdlc *shdlc = nfc_hci_get_clientdata(hdev); 783 - 784 - if (shdlc->ops->data_exchange) 785 - return shdlc->ops->data_exchange(shdlc, target, skb, cb, 786 - cb_context); 787 - 788 - return -EPERM; 789 - } 790 - 791 - static int nfc_shdlc_check_presence(struct nfc_hci_dev *hdev, 792 - struct nfc_target *target) 793 - { 794 - struct nfc_shdlc *shdlc = nfc_hci_get_clientdata(hdev); 795 - 796 - if (shdlc->ops->check_presence) 797 - return shdlc->ops->check_presence(shdlc, target); 798 - 799 - return 0; 800 - } 801 - 802 - static struct nfc_hci_ops shdlc_ops = { 803 - .open = nfc_shdlc_open, 804 - .close = nfc_shdlc_close, 805 - .hci_ready = nfc_shdlc_hci_ready, 806 - .xmit = nfc_shdlc_xmit, 807 - .start_poll = nfc_shdlc_start_poll, 808 - .target_from_gate = nfc_shdlc_target_from_gate, 809 - .complete_target_discovered = nfc_shdlc_complete_target_discovered, 810 - .data_exchange = nfc_shdlc_data_exchange, 811 - .check_presence = nfc_shdlc_check_presence, 812 - }; 813 - 814 - struct nfc_shdlc *nfc_shdlc_allocate(struct nfc_shdlc_ops *ops, 815 - struct nfc_hci_init_data *init_data, 816 - u32 protocols, 817 - int tx_headroom, int tx_tailroom, 818 - int max_link_payload, const char *devname) 819 - { 820 - struct nfc_shdlc *shdlc; 821 - int r; 822 - 823 - if (ops->xmit == NULL) 824 - return NULL; 825 - 826 - shdlc = kzalloc(sizeof(struct nfc_shdlc), GFP_KERNEL); 827 - if (shdlc == NULL) 828 - return NULL; 829 - 830 - mutex_init(&shdlc->state_mutex); 831 - shdlc->ops = ops; 832 - shdlc->state = SHDLC_DISCONNECTED; 833 - 834 - init_timer(&shdlc->connect_timer); 835 - shdlc->connect_timer.data = (unsigned long)shdlc; 836 - shdlc->connect_timer.function = nfc_shdlc_connect_timeout; 837 - 838 - init_timer(&shdlc->t1_timer); 839 - shdlc->t1_timer.data = (unsigned long)shdlc; 840 - shdlc->t1_timer.function = nfc_shdlc_t1_timeout; 841 - 842 - init_timer(&shdlc->t2_timer); 843 - shdlc->t2_timer.data = (unsigned long)shdlc; 844 - shdlc->t2_timer.function = nfc_shdlc_t2_timeout; 845 - 846 - shdlc->w = SHDLC_MAX_WINDOW; 847 - shdlc->srej_support = SHDLC_SREJ_SUPPORT; 848 - 849 - skb_queue_head_init(&shdlc->rcv_q); 850 - skb_queue_head_init(&shdlc->send_q); 851 - skb_queue_head_init(&shdlc->ack_pending_q); 852 - 853 - INIT_WORK(&shdlc->sm_work, nfc_shdlc_sm_work); 854 - 855 - shdlc->client_headroom = tx_headroom; 856 - shdlc->client_tailroom = tx_tailroom; 857 - 858 - shdlc->hdev = nfc_hci_allocate_device(&shdlc_ops, init_data, protocols, 859 - tx_headroom + SHDLC_LLC_HEAD_ROOM, 860 - tx_tailroom, 861 - max_link_payload); 862 - if (shdlc->hdev == NULL) 863 - goto err_allocdev; 864 - 865 - nfc_hci_set_clientdata(shdlc->hdev, shdlc); 866 - 867 - r = nfc_hci_register_device(shdlc->hdev); 868 - if (r < 0) 869 - goto err_regdev; 870 - 871 - return shdlc; 872 - 873 - err_regdev: 874 - nfc_hci_free_device(shdlc->hdev); 875 - 876 - err_allocdev: 877 - kfree(shdlc); 878 - 879 - return NULL; 880 - } 881 - EXPORT_SYMBOL(nfc_shdlc_allocate); 882 - 883 - void nfc_shdlc_free(struct nfc_shdlc *shdlc) 884 - { 885 - pr_debug("\n"); 886 - 887 - nfc_hci_unregister_device(shdlc->hdev); 888 - nfc_hci_free_device(shdlc->hdev); 889 - 890 - cancel_work_sync(&shdlc->sm_work); 891 - 892 - skb_queue_purge(&shdlc->rcv_q); 893 - skb_queue_purge(&shdlc->send_q); 894 - skb_queue_purge(&shdlc->ack_pending_q); 895 - 896 - kfree(shdlc); 897 - } 898 - EXPORT_SYMBOL(nfc_shdlc_free); 899 - 900 - void nfc_shdlc_set_clientdata(struct nfc_shdlc *shdlc, void *clientdata) 901 - { 902 - pr_debug("\n"); 903 - 904 - shdlc->clientdata = clientdata; 905 - } 906 - EXPORT_SYMBOL(nfc_shdlc_set_clientdata); 907 - 908 - void *nfc_shdlc_get_clientdata(struct nfc_shdlc *shdlc) 909 - { 910 - return shdlc->clientdata; 911 - } 912 - EXPORT_SYMBOL(nfc_shdlc_get_clientdata); 913 - 914 - struct nfc_hci_dev *nfc_shdlc_get_hci_dev(struct nfc_shdlc *shdlc) 915 - { 916 - return shdlc->hdev; 917 - } 918 - EXPORT_SYMBOL(nfc_shdlc_get_hci_dev);