aboutsummaryrefslogtreecommitdiffstats
path: root/net/nfc
diff options
context:
space:
mode:
authorEric Lapuyade <eric.lapuyade@linux.intel.com>2012-06-05 08:42:11 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-07-09 16:42:12 -0400
commita10d595b1074d04446f77161eea165e5809e163c (patch)
tree4ba305673685b1602cc4ec66083a7c06a1d0b06e /net/nfc
parenteae202aa2083eb6f7fdb686e2c42d7db4ef63632 (diff)
NFC: Allow HCI driver to pre-open pipes to some gates
Some NFC chips will statically create and open pipes for both standard and proprietary gates. The driver can now pass this information to HCI such that HCI will not attempt to create and open them, but will instead directly use the passed pipe ids. Signed-off-by: Eric Lapuyade <eric.lapuyade@intel.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'net/nfc')
-rw-r--r--net/nfc/hci/command.c8
-rw-r--r--net/nfc/hci/core.c23
-rw-r--r--net/nfc/hci/hci.h5
3 files changed, 15 insertions, 21 deletions
diff --git a/net/nfc/hci/command.c b/net/nfc/hci/command.c
index 12cd6f3f77ec..46362ef979db 100644
--- a/net/nfc/hci/command.c
+++ b/net/nfc/hci/command.c
@@ -299,9 +299,9 @@ int nfc_hci_disconnect_all_gates(struct nfc_hci_dev *hdev)
299} 299}
300EXPORT_SYMBOL(nfc_hci_disconnect_all_gates); 300EXPORT_SYMBOL(nfc_hci_disconnect_all_gates);
301 301
302int nfc_hci_connect_gate(struct nfc_hci_dev *hdev, u8 dest_host, u8 dest_gate) 302int nfc_hci_connect_gate(struct nfc_hci_dev *hdev, u8 dest_host, u8 dest_gate,
303 u8 pipe)
303{ 304{
304 u8 pipe = NFC_HCI_INVALID_PIPE;
305 bool pipe_created = false; 305 bool pipe_created = false;
306 int r; 306 int r;
307 307
@@ -310,6 +310,9 @@ int nfc_hci_connect_gate(struct nfc_hci_dev *hdev, u8 dest_host, u8 dest_gate)
310 if (hdev->gate2pipe[dest_gate] != NFC_HCI_INVALID_PIPE) 310 if (hdev->gate2pipe[dest_gate] != NFC_HCI_INVALID_PIPE)
311 return -EADDRINUSE; 311 return -EADDRINUSE;
312 312
313 if (pipe != NFC_HCI_INVALID_PIPE)
314 goto pipe_is_open;
315
313 switch (dest_gate) { 316 switch (dest_gate) {
314 case NFC_HCI_LINK_MGMT_GATE: 317 case NFC_HCI_LINK_MGMT_GATE:
315 pipe = NFC_HCI_LINK_MGMT_PIPE; 318 pipe = NFC_HCI_LINK_MGMT_PIPE;
@@ -335,6 +338,7 @@ int nfc_hci_connect_gate(struct nfc_hci_dev *hdev, u8 dest_host, u8 dest_gate)
335 return r; 338 return r;
336 } 339 }
337 340
341pipe_is_open:
338 hdev->gate2pipe[dest_gate] = pipe; 342 hdev->gate2pipe[dest_gate] = pipe;
339 343
340 return 0; 344 return 0;
diff --git a/net/nfc/hci/core.c b/net/nfc/hci/core.c
index e6b2df3981b6..4ccc518f56eb 100644
--- a/net/nfc/hci/core.c
+++ b/net/nfc/hci/core.c
@@ -315,15 +315,15 @@ static void nfc_hci_cmd_timeout(unsigned long data)
315} 315}
316 316
317static int hci_dev_connect_gates(struct nfc_hci_dev *hdev, u8 gate_count, 317static int hci_dev_connect_gates(struct nfc_hci_dev *hdev, u8 gate_count,
318 u8 gates[]) 318 struct nfc_hci_gate *gates)
319{ 319{
320 int r; 320 int r;
321 u8 *p = gates;
322 while (gate_count--) { 321 while (gate_count--) {
323 r = nfc_hci_connect_gate(hdev, NFC_HCI_HOST_CONTROLLER_ID, *p); 322 r = nfc_hci_connect_gate(hdev, NFC_HCI_HOST_CONTROLLER_ID,
323 gates->gate, gates->pipe);
324 if (r < 0) 324 if (r < 0)
325 return r; 325 return r;
326 p++; 326 gates++;
327 } 327 }
328 328
329 return 0; 329 return 0;
@@ -333,14 +333,13 @@ static int hci_dev_session_init(struct nfc_hci_dev *hdev)
333{ 333{
334 struct sk_buff *skb = NULL; 334 struct sk_buff *skb = NULL;
335 int r; 335 int r;
336 u8 hci_gates[] = { /* NFC_HCI_ADMIN_GATE MUST be first */ 336
337 NFC_HCI_ADMIN_GATE, NFC_HCI_LOOPBACK_GATE, 337 if (hdev->init_data.gates[0].gate != NFC_HCI_ADMIN_GATE)
338 NFC_HCI_ID_MGMT_GATE, NFC_HCI_LINK_MGMT_GATE, 338 return -EPROTO;
339 NFC_HCI_RF_READER_B_GATE, NFC_HCI_RF_READER_A_GATE
340 };
341 339
342 r = nfc_hci_connect_gate(hdev, NFC_HCI_HOST_CONTROLLER_ID, 340 r = nfc_hci_connect_gate(hdev, NFC_HCI_HOST_CONTROLLER_ID,
343 NFC_HCI_ADMIN_GATE); 341 hdev->init_data.gates[0].gate,
342 hdev->init_data.gates[0].pipe);
344 if (r < 0) 343 if (r < 0)
345 goto exit; 344 goto exit;
346 345
@@ -368,10 +367,6 @@ static int hci_dev_session_init(struct nfc_hci_dev *hdev)
368 if (r < 0) 367 if (r < 0)
369 goto exit; 368 goto exit;
370 369
371 r = hci_dev_connect_gates(hdev, sizeof(hci_gates), hci_gates);
372 if (r < 0)
373 goto disconnect_all;
374
375 r = hci_dev_connect_gates(hdev, hdev->init_data.gate_count, 370 r = hci_dev_connect_gates(hdev, hdev->init_data.gate_count,
376 hdev->init_data.gates); 371 hdev->init_data.gates);
377 if (r < 0) 372 if (r < 0)
diff --git a/net/nfc/hci/hci.h b/net/nfc/hci/hci.h
index d3cde075ba60..fa9a21e92239 100644
--- a/net/nfc/hci/hci.h
+++ b/net/nfc/hci/hci.h
@@ -132,9 +132,4 @@ void nfc_hci_hcp_message_rx(struct nfc_hci_dev *hdev, u8 pipe, u8 type,
132#define NFC_HCI_ANY_E_REG_ACCESS_DENIED 0x0a 132#define NFC_HCI_ANY_E_REG_ACCESS_DENIED 0x0a
133#define NFC_HCI_ANY_E_PIPE_ACCESS_DENIED 0x0b 133#define NFC_HCI_ANY_E_PIPE_ACCESS_DENIED 0x0b
134 134
135/* Pipes */
136#define NFC_HCI_INVALID_PIPE 0x80
137#define NFC_HCI_LINK_MGMT_PIPE 0x00
138#define NFC_HCI_ADMIN_PIPE 0x01
139
140#endif /* __LOCAL_HCI_H */ 135#endif /* __LOCAL_HCI_H */