Blame view

net/nfc/hci/llc.c 3.55 KB
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  /*
   * Link Layer Control manager
   *
   * Copyright (C) 2012  Intel Corporation. All rights reserved.
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms and conditions of the GNU General Public License,
   * version 2, as published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
98b32decc   Jeff Kirsher   nfc: Fix FSF addr...
16
   * along with this program; if not, see <http://www.gnu.org/licenses/>.
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
17
   */
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
18
  #include <net/nfc/llc.h>
f4f20d065   Samuel Ortiz   NFC: Remove unnee...
19

67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
20
  #include "llc.h"
0b51fc563   Axel Lin   NFC: Use LIST_HEA...
21
  static LIST_HEAD(llc_engines);
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
22
23
24
  
  int nfc_llc_init(void)
  {
4a61cd668   Eric Lapuyade   NFC: Add an shdlc...
25
  	int r;
4a61cd668   Eric Lapuyade   NFC: Add an shdlc...
26
27
28
29
30
31
32
33
34
35
36
37
38
  	r = nfc_llc_nop_register();
  	if (r)
  		goto exit;
  
  	r = nfc_llc_shdlc_register();
  	if (r)
  		goto exit;
  
  	return 0;
  
  exit:
  	nfc_llc_exit();
  	return r;
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
39
  }
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
40
41
42
43
44
45
46
47
48
49
50
  
  void nfc_llc_exit(void)
  {
  	struct nfc_llc_engine *llc_engine, *n;
  
  	list_for_each_entry_safe(llc_engine, n, &llc_engines, entry) {
  		list_del(&llc_engine->entry);
  		kfree(llc_engine->name);
  		kfree(llc_engine);
  	}
  }
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
  
  int nfc_llc_register(const char *name, struct nfc_llc_ops *ops)
  {
  	struct nfc_llc_engine *llc_engine;
  
  	llc_engine = kzalloc(sizeof(struct nfc_llc_engine), GFP_KERNEL);
  	if (llc_engine == NULL)
  		return -ENOMEM;
  
  	llc_engine->name = kstrdup(name, GFP_KERNEL);
  	if (llc_engine->name == NULL) {
  		kfree(llc_engine);
  		return -ENOMEM;
  	}
  	llc_engine->ops = ops;
  
  	INIT_LIST_HEAD(&llc_engine->entry);
0f4507722   Szymon Janc   NFC: Fix some cod...
68
  	list_add_tail(&llc_engine->entry, &llc_engines);
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
69
70
71
  
  	return 0;
  }
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
  
  static struct nfc_llc_engine *nfc_llc_name_to_engine(const char *name)
  {
  	struct nfc_llc_engine *llc_engine;
  
  	list_for_each_entry(llc_engine, &llc_engines, entry) {
  		if (strcmp(llc_engine->name, name) == 0)
  			return llc_engine;
  	}
  
  	return NULL;
  }
  
  void nfc_llc_unregister(const char *name)
  {
  	struct nfc_llc_engine *llc_engine;
  
  	llc_engine = nfc_llc_name_to_engine(name);
  	if (llc_engine == NULL)
  		return;
  
  	list_del(&llc_engine->entry);
  	kfree(llc_engine->name);
  	kfree(llc_engine);
  }
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
  
  struct nfc_llc *nfc_llc_allocate(const char *name, struct nfc_hci_dev *hdev,
  				 xmit_to_drv_t xmit_to_drv,
  				 rcv_to_hci_t rcv_to_hci, int tx_headroom,
  				 int tx_tailroom, llc_failure_t llc_failure)
  {
  	struct nfc_llc_engine *llc_engine;
  	struct nfc_llc *llc;
  
  	llc_engine = nfc_llc_name_to_engine(name);
  	if (llc_engine == NULL)
  		return NULL;
  
  	llc = kzalloc(sizeof(struct nfc_llc), GFP_KERNEL);
  	if (llc == NULL)
  		return NULL;
  
  	llc->data = llc_engine->ops->init(hdev, xmit_to_drv, rcv_to_hci,
  					  tx_headroom, tx_tailroom,
  					  &llc->rx_headroom, &llc->rx_tailroom,
  					  llc_failure);
  	if (llc->data == NULL) {
  		kfree(llc);
  		return NULL;
  	}
  	llc->ops = llc_engine->ops;
  
  	return llc;
  }
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
126
127
128
129
130
131
  
  void nfc_llc_free(struct nfc_llc *llc)
  {
  	llc->ops->deinit(llc);
  	kfree(llc);
  }
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
132
133
134
135
136
137
138
  
  inline void nfc_llc_get_rx_head_tail_room(struct nfc_llc *llc, int *rx_headroom,
  					  int *rx_tailroom)
  {
  	*rx_headroom = llc->rx_headroom;
  	*rx_tailroom = llc->rx_tailroom;
  }
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
139
140
141
142
143
  
  inline int nfc_llc_start(struct nfc_llc *llc)
  {
  	return llc->ops->start(llc);
  }
15d17170b   Christophe Ricard   NFC: st21nfca: Ad...
144
  EXPORT_SYMBOL(nfc_llc_start);
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
145
146
147
148
149
  
  inline int nfc_llc_stop(struct nfc_llc *llc)
  {
  	return llc->ops->stop(llc);
  }
15d17170b   Christophe Ricard   NFC: st21nfca: Ad...
150
  EXPORT_SYMBOL(nfc_llc_stop);
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
151
152
153
154
155
  
  inline void nfc_llc_rcv_from_drv(struct nfc_llc *llc, struct sk_buff *skb)
  {
  	llc->ops->rcv_from_drv(llc, skb);
  }
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
156
157
158
159
160
  
  inline int nfc_llc_xmit_from_hci(struct nfc_llc *llc, struct sk_buff *skb)
  {
  	return llc->ops->xmit_from_hci(llc, skb);
  }
67cccfe17   Eric Lapuyade   NFC: Add an LLC C...
161
162
163
164
165
  
  inline void *nfc_llc_get_data(struct nfc_llc *llc)
  {
  	return llc->data;
  }