diff options
Diffstat (limited to 'net/nfc/hci')
-rw-r--r-- | net/nfc/hci/Makefile | 2 | ||||
-rw-r--r-- | net/nfc/hci/llc.c | 2 | ||||
-rw-r--r-- | net/nfc/hci/llc.h | 2 | ||||
-rw-r--r-- | net/nfc/hci/llc_nop.c | 101 |
4 files changed, 105 insertions, 2 deletions
diff --git a/net/nfc/hci/Makefile b/net/nfc/hci/Makefile index b44686b581af..2ec4e5876f6b 100644 --- a/net/nfc/hci/Makefile +++ b/net/nfc/hci/Makefile | |||
@@ -4,5 +4,5 @@ | |||
4 | 4 | ||
5 | obj-$(CONFIG_NFC_HCI) += hci.o | 5 | obj-$(CONFIG_NFC_HCI) += hci.o |
6 | 6 | ||
7 | hci-y := core.o hcp.o command.o llc.o | 7 | hci-y := core.o hcp.o command.o llc.o llc_nop.o |
8 | hci-$(CONFIG_NFC_SHDLC) += shdlc.o | 8 | hci-$(CONFIG_NFC_SHDLC) += shdlc.o |
diff --git a/net/nfc/hci/llc.c b/net/nfc/hci/llc.c index 73c42785ce84..32002e5339c0 100644 --- a/net/nfc/hci/llc.c +++ b/net/nfc/hci/llc.c | |||
@@ -28,7 +28,7 @@ int nfc_llc_init(void) | |||
28 | { | 28 | { |
29 | INIT_LIST_HEAD(&llc_engines); | 29 | INIT_LIST_HEAD(&llc_engines); |
30 | 30 | ||
31 | return 0; | 31 | return nfc_llc_nop_register(); |
32 | } | 32 | } |
33 | EXPORT_SYMBOL(nfc_llc_init); | 33 | EXPORT_SYMBOL(nfc_llc_init); |
34 | 34 | ||
diff --git a/net/nfc/hci/llc.h b/net/nfc/hci/llc.h index b2c7285b0309..acdd8d1bbae5 100644 --- a/net/nfc/hci/llc.h +++ b/net/nfc/hci/llc.h | |||
@@ -55,4 +55,6 @@ void *nfc_llc_get_data(struct nfc_llc *llc); | |||
55 | int nfc_llc_register(const char *name, struct nfc_llc_ops *ops); | 55 | int nfc_llc_register(const char *name, struct nfc_llc_ops *ops); |
56 | void nfc_llc_unregister(const char *name); | 56 | void nfc_llc_unregister(const char *name); |
57 | 57 | ||
58 | int nfc_llc_nop_register(void); | ||
59 | |||
58 | #endif /* __LOCAL_LLC_H_ */ | 60 | #endif /* __LOCAL_LLC_H_ */ |
diff --git a/net/nfc/hci/llc_nop.c b/net/nfc/hci/llc_nop.c new file mode 100644 index 000000000000..ec627cee12cd --- /dev/null +++ b/net/nfc/hci/llc_nop.c | |||
@@ -0,0 +1,101 @@ | |||
1 | /* | ||
2 | * nop (passthrough) Link Layer Control | ||
3 | * | ||
4 | * Copyright (C) 2012 Intel Corporation. All rights reserved. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms and conditions of the GNU General Public License, | ||
8 | * version 2, as published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the | ||
17 | * Free Software Foundation, Inc., | ||
18 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | |||
21 | #include <linux/types.h> | ||
22 | #include <linux/export.h> | ||
23 | |||
24 | #include "llc.h" | ||
25 | |||
26 | struct llc_nop { | ||
27 | struct nfc_hci_dev *hdev; | ||
28 | xmit_to_drv_t xmit_to_drv; | ||
29 | rcv_to_hci_t rcv_to_hci; | ||
30 | int tx_headroom; | ||
31 | int tx_tailroom; | ||
32 | llc_failure_t llc_failure; | ||
33 | }; | ||
34 | |||
35 | static void *llc_nop_init(struct nfc_hci_dev *hdev, xmit_to_drv_t xmit_to_drv, | ||
36 | rcv_to_hci_t rcv_to_hci, int tx_headroom, | ||
37 | int tx_tailroom, int *rx_headroom, int *rx_tailroom, | ||
38 | llc_failure_t llc_failure) | ||
39 | { | ||
40 | struct llc_nop *llc_nop; | ||
41 | |||
42 | *rx_headroom = 0; | ||
43 | *rx_tailroom = 0; | ||
44 | |||
45 | llc_nop = kzalloc(sizeof(struct llc_nop), GFP_KERNEL); | ||
46 | if (llc_nop == NULL) | ||
47 | return NULL; | ||
48 | |||
49 | llc_nop->hdev = hdev; | ||
50 | llc_nop->xmit_to_drv = xmit_to_drv; | ||
51 | llc_nop->rcv_to_hci = rcv_to_hci; | ||
52 | llc_nop->tx_headroom = tx_headroom; | ||
53 | llc_nop->tx_tailroom = tx_tailroom; | ||
54 | llc_nop->llc_failure = llc_failure; | ||
55 | |||
56 | return llc_nop; | ||
57 | } | ||
58 | |||
59 | static void llc_nop_deinit(struct nfc_llc *llc) | ||
60 | { | ||
61 | kfree(nfc_llc_get_data(llc)); | ||
62 | } | ||
63 | |||
64 | static int llc_nop_start(struct nfc_llc *llc) | ||
65 | { | ||
66 | return 0; | ||
67 | } | ||
68 | |||
69 | static int llc_nop_stop(struct nfc_llc *llc) | ||
70 | { | ||
71 | return 0; | ||
72 | } | ||
73 | |||
74 | static void llc_nop_rcv_from_drv(struct nfc_llc *llc, struct sk_buff *skb) | ||
75 | { | ||
76 | struct llc_nop *llc_nop = nfc_llc_get_data(llc); | ||
77 | |||
78 | llc_nop->rcv_to_hci(llc_nop->hdev, skb); | ||
79 | } | ||
80 | |||
81 | static int llc_nop_xmit_from_hci(struct nfc_llc *llc, struct sk_buff *skb) | ||
82 | { | ||
83 | struct llc_nop *llc_nop = nfc_llc_get_data(llc); | ||
84 | |||
85 | return llc_nop->xmit_to_drv(llc_nop->hdev, skb); | ||
86 | } | ||
87 | |||
88 | static struct nfc_llc_ops llc_nop_ops = { | ||
89 | .init = llc_nop_init, | ||
90 | .deinit = llc_nop_deinit, | ||
91 | .start = llc_nop_start, | ||
92 | .stop = llc_nop_stop, | ||
93 | .rcv_from_drv = llc_nop_rcv_from_drv, | ||
94 | .xmit_from_hci = llc_nop_xmit_from_hci, | ||
95 | }; | ||
96 | |||
97 | int nfc_llc_nop_register() | ||
98 | { | ||
99 | return nfc_llc_register(LLC_NOP_NAME, &llc_nop_ops); | ||
100 | } | ||
101 | EXPORT_SYMBOL(nfc_llc_nop_register); | ||