diff options
author | Vincent Cuissard <cuissard@marvell.com> | 2014-07-22 13:48:38 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2014-09-01 08:40:31 -0400 |
commit | cfdbeeafdbbdbc006f700e92cbad2cb5d4529f3d (patch) | |
tree | ecf3fc7d4cf0203573369febdedd3baced9a1593 /net/nfc/nci | |
parent | f23b73526b82ca2ef333362e704a51d817c1ffc1 (diff) |
NFC: NCI: Add support of ISO15693
Update nci.h to respect latest NCI specification proposal
(stop using proprietary opcodes). Handle ISO15693 parameters
in NCI_RF_ACTIVATED_NTF handler.
Signed-off-by: Vincent Cuissard <cuissard@marvell.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'net/nfc/nci')
-rw-r--r-- | net/nfc/nci/core.c | 8 | ||||
-rw-r--r-- | net/nfc/nci/ntf.c | 31 |
2 files changed, 39 insertions, 0 deletions
diff --git a/net/nfc/nci/core.c b/net/nfc/nci/core.c index 2b400e1a8695..860080803a3e 100644 --- a/net/nfc/nci/core.c +++ b/net/nfc/nci/core.c | |||
@@ -231,6 +231,14 @@ static void nci_rf_discover_req(struct nci_dev *ndev, unsigned long opt) | |||
231 | cmd.num_disc_configs++; | 231 | cmd.num_disc_configs++; |
232 | } | 232 | } |
233 | 233 | ||
234 | if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) && | ||
235 | (protocols & NFC_PROTO_ISO15693_MASK)) { | ||
236 | cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode = | ||
237 | NCI_NFC_V_PASSIVE_POLL_MODE; | ||
238 | cmd.disc_configs[cmd.num_disc_configs].frequency = 1; | ||
239 | cmd.num_disc_configs++; | ||
240 | } | ||
241 | |||
234 | nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_CMD, | 242 | nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_CMD, |
235 | (1 + (cmd.num_disc_configs * sizeof(struct disc_config))), | 243 | (1 + (cmd.num_disc_configs * sizeof(struct disc_config))), |
236 | &cmd); | 244 | &cmd); |
diff --git a/net/nfc/nci/ntf.c b/net/nfc/nci/ntf.c index df91bb95b12a..25e44cebd60a 100644 --- a/net/nfc/nci/ntf.c +++ b/net/nfc/nci/ntf.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * The NFC Controller Interface is the communication protocol between an | 2 | * The NFC Controller Interface is the communication protocol between an |
3 | * NFC Controller (NFCC) and a Device Host (DH). | 3 | * NFC Controller (NFCC) and a Device Host (DH). |
4 | * | 4 | * |
5 | * Copyright (C) 2014 Marvell International Ltd. | ||
5 | * Copyright (C) 2011 Texas Instruments, Inc. | 6 | * Copyright (C) 2011 Texas Instruments, Inc. |
6 | * | 7 | * |
7 | * Written by Ilan Elias <ilane@ti.com> | 8 | * Written by Ilan Elias <ilane@ti.com> |
@@ -155,6 +156,17 @@ static __u8 *nci_extract_rf_params_nfcf_passive_poll(struct nci_dev *ndev, | |||
155 | return data; | 156 | return data; |
156 | } | 157 | } |
157 | 158 | ||
159 | static __u8 *nci_extract_rf_params_nfcv_passive_poll(struct nci_dev *ndev, | ||
160 | struct rf_tech_specific_params_nfcv_poll *nfcv_poll, | ||
161 | __u8 *data) | ||
162 | { | ||
163 | ++data; | ||
164 | nfcv_poll->dsfid = *data++; | ||
165 | memcpy(nfcv_poll->uid, data, NFC_ISO15693_UID_MAXSIZE); | ||
166 | data += NFC_ISO15693_UID_MAXSIZE; | ||
167 | return data; | ||
168 | } | ||
169 | |||
158 | static int nci_add_new_protocol(struct nci_dev *ndev, | 170 | static int nci_add_new_protocol(struct nci_dev *ndev, |
159 | struct nfc_target *target, | 171 | struct nfc_target *target, |
160 | __u8 rf_protocol, | 172 | __u8 rf_protocol, |
@@ -164,6 +176,7 @@ static int nci_add_new_protocol(struct nci_dev *ndev, | |||
164 | struct rf_tech_specific_params_nfca_poll *nfca_poll; | 176 | struct rf_tech_specific_params_nfca_poll *nfca_poll; |
165 | struct rf_tech_specific_params_nfcb_poll *nfcb_poll; | 177 | struct rf_tech_specific_params_nfcb_poll *nfcb_poll; |
166 | struct rf_tech_specific_params_nfcf_poll *nfcf_poll; | 178 | struct rf_tech_specific_params_nfcf_poll *nfcf_poll; |
179 | struct rf_tech_specific_params_nfcv_poll *nfcv_poll; | ||
167 | __u32 protocol; | 180 | __u32 protocol; |
168 | 181 | ||
169 | if (rf_protocol == NCI_RF_PROTOCOL_T1T) | 182 | if (rf_protocol == NCI_RF_PROTOCOL_T1T) |
@@ -179,6 +192,8 @@ static int nci_add_new_protocol(struct nci_dev *ndev, | |||
179 | protocol = NFC_PROTO_FELICA_MASK; | 192 | protocol = NFC_PROTO_FELICA_MASK; |
180 | else if (rf_protocol == NCI_RF_PROTOCOL_NFC_DEP) | 193 | else if (rf_protocol == NCI_RF_PROTOCOL_NFC_DEP) |
181 | protocol = NFC_PROTO_NFC_DEP_MASK; | 194 | protocol = NFC_PROTO_NFC_DEP_MASK; |
195 | else if (rf_protocol == NCI_RF_PROTOCOL_T5T) | ||
196 | protocol = NFC_PROTO_ISO15693_MASK; | ||
182 | else | 197 | else |
183 | protocol = 0; | 198 | protocol = 0; |
184 | 199 | ||
@@ -213,6 +228,12 @@ static int nci_add_new_protocol(struct nci_dev *ndev, | |||
213 | memcpy(target->sensf_res, nfcf_poll->sensf_res, | 228 | memcpy(target->sensf_res, nfcf_poll->sensf_res, |
214 | target->sensf_res_len); | 229 | target->sensf_res_len); |
215 | } | 230 | } |
231 | } else if (rf_tech_and_mode == NCI_NFC_V_PASSIVE_POLL_MODE) { | ||
232 | nfcv_poll = (struct rf_tech_specific_params_nfcv_poll *)params; | ||
233 | |||
234 | target->is_iso15693 = 1; | ||
235 | target->iso15693_dsfid = nfcv_poll->dsfid; | ||
236 | memcpy(target->iso15693_uid, nfcv_poll->uid, NFC_ISO15693_UID_MAXSIZE); | ||
216 | } else { | 237 | } else { |
217 | pr_err("unsupported rf_tech_and_mode 0x%x\n", rf_tech_and_mode); | 238 | pr_err("unsupported rf_tech_and_mode 0x%x\n", rf_tech_and_mode); |
218 | return -EPROTO; | 239 | return -EPROTO; |
@@ -305,6 +326,11 @@ static void nci_rf_discover_ntf_packet(struct nci_dev *ndev, | |||
305 | &(ntf.rf_tech_specific_params.nfcf_poll), data); | 326 | &(ntf.rf_tech_specific_params.nfcf_poll), data); |
306 | break; | 327 | break; |
307 | 328 | ||
329 | case NCI_NFC_V_PASSIVE_POLL_MODE: | ||
330 | data = nci_extract_rf_params_nfcv_passive_poll(ndev, | ||
331 | &(ntf.rf_tech_specific_params.nfcv_poll), data); | ||
332 | break; | ||
333 | |||
308 | default: | 334 | default: |
309 | pr_err("unsupported rf_tech_and_mode 0x%x\n", | 335 | pr_err("unsupported rf_tech_and_mode 0x%x\n", |
310 | ntf.rf_tech_and_mode); | 336 | ntf.rf_tech_and_mode); |
@@ -455,6 +481,11 @@ static void nci_rf_intf_activated_ntf_packet(struct nci_dev *ndev, | |||
455 | &(ntf.rf_tech_specific_params.nfcf_poll), data); | 481 | &(ntf.rf_tech_specific_params.nfcf_poll), data); |
456 | break; | 482 | break; |
457 | 483 | ||
484 | case NCI_NFC_V_PASSIVE_POLL_MODE: | ||
485 | data = nci_extract_rf_params_nfcv_passive_poll(ndev, | ||
486 | &(ntf.rf_tech_specific_params.nfcv_poll), data); | ||
487 | break; | ||
488 | |||
458 | default: | 489 | default: |
459 | pr_err("unsupported activation_rf_tech_and_mode 0x%x\n", | 490 | pr_err("unsupported activation_rf_tech_and_mode 0x%x\n", |
460 | ntf.activation_rf_tech_and_mode); | 491 | ntf.activation_rf_tech_and_mode); |